程序语言也属于一种语言,但出于以执行/阅读为目的,语言学中的语音学之类在程序语言中就毫无意义。但程序语言仍需考虑语言学问题,尤其对语言的设计者来说。一门语言的语法,语义。《C陷阱与缺陷》中前几章就分别介绍了C语言的词法陷阱、语法陷阱、语义陷阱。
比较经典的操作语义及指称语义
Lexical scoping和Dynamic scoping
程序语言的各种feature组合
类型系统,垃圾回收,dispatch(vtables,pattern matching,generics),代码复制(macros,templates,generics)
lambda, macro, continuation三件套组装各种语言feature
goto和指针是非常强大的工具,但是滥用他们也会造成严重的后果

之所以需要做这种从字符串到数据结构的转换,是因为编译器是无法直接操作“1+2”这样的字符串的。实际上,代码的本质根本就不是字符串,它本 来就是一个具有复杂拓扑的数据结构,就像电路一样。“1+2”这个字符串只是对这种数据结构的一种“编码”,就像 ZIP 或者 JPEG 只是对它们压缩的数据的编码一样。

这种编码可以方便你把代码存到磁盘上,方便你用文本编辑器来修改它们,然而你必须知道,文本并不是代码本身。所以从磁盘读取了文本之后,你必须先“解码”,才能方便地操作代码的数据结构。比如,如果上面的 Java 代码生成的 AST 节点叫node,你就可以用node.operator来访问ADD,用node.left来访问1,node.right来访问2。这是很方便的。

对于程序语言,这种解码的动作就叫做 parsing,用于解码的那段代码就叫做 parser。