P.S. 这是写给想设计语言的人看的,如果你只是一个用户,不用看了,Syntax的确很重要。
假设你想写一门编程语言。
你想了一会语言大体有什么特性,然后写下一些展示这些特性的示例程序,并且注明它们的输出是啥。
错!绝大部分时候你不应该这样做!你的切入点应该是parser输出的中间结构(多为AST)入手,围绕这东西写各种evaluator/type checker/compiler等,以后再去搞Parser。
0.首先,无论如何,你最初设计的语法都会被你反复修改:注释能不能嵌套?用// /**/ 还是(**)还是#还是;还是;;?tab space有没有意义?def还是define? = 还是 := 还是 :- 还是 <-?这些东西都是互相不兼容的,你就这么多个符号,你选了=做赋值,=?做等价测试,过几天你觉得=?丑想用=做等价测试你就要选另一个东西给赋值。但是如果你是做语言其他方面,就没这么destructive(尽管feature有时候还是会冲突):你今天写下Type Checking明天写个Compiler后天写GC过几天再写FFI,尽管你写一个东西的时候很可能要去改其他的,但是你是在不停的加东西,而不是单纯的换下一个改上另一个。
难。诚然,你可以手写LL Parser,折腾Parser Combinator,Parser Generator,几十行,大不了100行代码就够了。但是对比一个Simple Evaluator,比如SICP上的eval呢?一个要去折腾各种API,写至少几十行parser,然后再写几十行(很多时候还不到,比如UTLC with HOAS 10行足矣,untyped实现5行就够)Eval,另一个直接从Eval出发,rapid prototyping上讲高下立判。
不必要。除非你的语法真的真的很有特点,(图形化编程界面,APL,这里的标准是一个陌生人看到会不会说一句WTF),不然没有人会仅因你语法漂亮去用你语言。先把大部分精力花在更有意义的东西上,好好折腾有看点的特性,再去考虑语法。
更准确的说,我不是说Syntax不重要-有两种Syntax,Concrete Syntax,Abstract Syntax,Concrete Syntax是你看得见的东西,Abstract Syntax是Evaluator等东西接受的数据结构,举例来说,一个Parser接收Concrete Syntax(绝大部分时候为string)返回Abstract Syntax,然后由Evaluator执行(有的时候Parser直接Eval Concrete Syntax,在这说的不是这种)。Abstract Syntax是很重要的,(比如说Graph/Tree,Binding怎么表达,怎么搞得extensible,支不支持generic programming(见A Generic Abstract Syntax Model for Embedded Languages),是不是homoiconic的,有没有richly typed),搞得不好,自己用着不爽,性能不好,还甚至macro功能打折扣(homoiconicity)
好,你语言折腾得差不多了,其他人有兴趣,想用,(或者你自己开始在里面写很多程序),这时候你可以怎么搞?有一点:别以漂亮的名头把Syntax(含Abstract Syntax)搞的很复杂。或许你自己觉得反正自己只需要写一次,如果其他人用起来爽,就值得了。然而不是这么简单:还有人要去搞Syntax highlighting/Debugger/IDE support/Autocomplete/Static Analyzer这些乱七八糟的东西,搞得太麻烦的话你用户一想起你那麻烦的Syntax就打退堂鼓了(对,复杂如C艹一样这些东西应有尽有,但是C艹是在TIOBE上派前几的语言啊,开发团队,开发出来的受益人群,狂热粉(这些人才可能很抖M地单枪匹马写完整的Parser然后写奇怪的工具)数量都不是你一个没人知道的language能比的)
你也可以机智点,把parser暴露出来,这样写Analyzer/Optimizer的人就不需要自己再写一次了,如果要解放写Editor/Highlighting的人的生产力parser给AST加上奇怪的Annotation估计也可以
还有一个方法:直接不在语言中钦定任何最终用户Concrete Syntax,只钦定一个AST的Format(binary可以XML可以随便搞个Concrete Syntax也恶意)用于保存/交流,然后由各种用户的Editor等去渲染成代码。最好这些工具是可自定义的(或者,由于会有很多工具(比如git上看是一码事,emacs上看是一码事,xxx上看是一码事),这个自定义的东西本身也有一个配置文件标准),这样就从根本上断绝各种Syntax之争:如果你觉得XX更漂亮自己自定义下那些工具就是了,你折腾你的我折腾我的,井水不犯河水。并且这还能玩各种奇奇怪怪的东西:比如说Concrete Syntax没要求是String,这样可以搞Structural Editor/Graphical Editor给喜欢Structural Editing的人/初学者用。
注:456可以一起上
另:其实6在50多年前就提出了。。。历史里面真是有很多有意思的东西。