《编程语言实现模式》章节试读

当前位置:首页 > 计算机网络 > 计算机理论 > 编程语言实现模式章节试读

出版社:华中科技大学出版社
出版日期:2012-3-20
ISBN:9787560977003
作者:Terence Parr
页数:388页

《编程语言实现模式》的笔记-第176页 - 类的符号表中为啥要设置方法返回值类型和变量类型的作用域?

P176
“在规则enterMethod 和varDeclaration中,采用了类似的操作,用以设置方法返回值类型和变量类型的作用域。”
对这里不是很理解。自己理解的意思是,比如一个方法fun()返回一个类A对象,那么A的作用域是需要设置的,这样如果main里有这么一句:A a = fun();时,就可以确定a的作用域了。
但为啥在将类的作用域之前的章节里,没有说到方法需要处理返回值的scope呢?难道是因为之前章节里面AST中没有scope这个变量的原因?

《编程语言实现模式》的笔记-第56页

Bryan Ford形式定义了ANTLR文法的记法,并扩展了语法谓词,称为解析表达式文法(PEG),在FP里,语法谓词也称解析组合,见[[Parserc]]

《编程语言实现模式》的笔记-第200页

源代码转换:添加显示的类型转换?TokenRewriteStream,记下插入的位置,需要时再执行

《编程语言实现模式》的笔记-第251页

2009年一月,我跟Dan Bornstein交流了一番,他设计了Dalvik虚拟机。

《编程语言实现模式》的笔记-第111页 - 5.4 将遍历与匹配解耦

注释中的Stratego/XT的网址有错误,应该为http://strategoxt.org。

《编程语言实现模式》的笔记-第76页 - 4.1为什么要构建树?

画图太麻烦了,大家要么自己看书,要么就靠想象吧=,=
今天上课看到了第四章了,其实本身也是对语法树那里比较感兴趣的,因为感觉对S表达式做词法和语法分析已经没啥问题了,所以还是语法树比较重要一点。作者讲了四种树,即解析树、同型AST、规范化异型AST和不规则异型AST。感想来自于看解析树的过程。
解析树简直就是把语言的BNF表示应用到具体的一段代码上,然后竖起来变成一颗树就可以了。其中保留了太多的信息,例如每一个子表达式的类型都存储了非叶子节点当中。然后作者就开始去掉多余的信息,构建抽象语法树了,也就是所谓的AST。这棵AST当中的内容就只有操作符和操作数了。例如x=0;这个语句,最后只有三个节点剩下:根结点=,左结点(即左子树根结点)x和右节点0。按照作者在``文本形式的树''中的记法,可以写成=(x, 0)或者(= x 0),而后者其实就是Lisp的S表达式。
使用运算符事实上已经足够判断整个表达式的类型了,所以S表达式实际上就是AST了。这样的AST可以根据car来判断表达式的类型——当然了,Lisp里面都是函数,剩下的,都是语义的范畴了。在Lisp的REPL中读取字符串解析为S表达式的过程中,cons(点对)类型事实上就是AST的表示方式,也就是作者提到的IR所使用的数据结构了。
刚刚实验了一下,在SBCL中,使用(read-from-string "(liutos")会抛出错误,并且接下来的(intern "LIUTOS")调用的返回值表明符号LIUTOS已经在当前的包中了,所以SBCL中应该是边读取字符串边解析边检验的。如果有事先的检查,那么字符串中括号不匹配应该是可以发现的。所以,我觉得在对S表达式的字符串形式构建AST的过程中,不需要额外的数据结构表示AST了,Lisp的点对,即cons类型就足够了。

《编程语言实现模式》的笔记-翻译太随意 - 翻译太随意

A generic VecMathNode node embeds a walking method called print( )---p129
另一个基类VecMathNode内嵌套了遍历方法print() ---p114
书中的意译太多了,这只是一个不起眼的小细节。
-------------------
def f(x):
x = 1
y = 2
---p236
def f(x):
x = 1
y = 2
---p223
不知道是排版问题还是译者没用过Python
-------------------
The main program calls f( ), which calls g( ). ---p262
主函数既会调用f(),又会调用g()。 ---p249
这个错误太明显了。
-------------------
Syntactically, register code is a minor superset of stack code because of its register operands. ---p257
从语法上看,寄存器代码是栈代码的超集,因为可以使用寄存器操作数。 ---p244
按照上下文来理解,原意应该是指栈代码实现的解释器因为其操作数操作比寄存器代码实现的解释器简单。
-------------------
原书p291中用faire un canard举例应当理解为不可"直译",而这本书p280用“睡觉(sleep)”这个典故显得有些莫名其妙;似乎底下的注释和这里的意译的例子正好反了。
-------------------
...translating scalar and matrix multiplication. ---p303
...翻译标量到矩阵的乘法运算。 ---p292
明显的错误。

《编程语言实现模式》的笔记-第94页

同型AST:{ Token token; List<AST> children; } //引用原始的词法单元;

《编程语言实现模式》的笔记-第77页

出人意料的是,记录规则的内部节点实际上没什么用,4.2节将介绍只含词法单元的树(?)

《编程语言实现模式》的笔记-编译器最复杂的地方 - 编译器最复杂的地方


注:
IR
指令寄存器
AST
AST:abstract syntax tree
  语法树。编译器前端(frontend)主要负责解析(parse)输入的源代码,由语法分析器和语义分析器协同工作。语法分析器负责把源代码中的‘单词’(Token)找出来,语义分析器把这些分散的单词按预先定义好的语法组装成有意义的表达式,语句 ,函数等等。 例如“a = b + c;”前端语法分析器看到的是“a, =, b , +, c;”,语义分析器按定义的语法,先把他们组装成表达式“b + c”,再组装成“a = b + c”的语句。 前端还负责语义(semantic checking)的检查,例如检测参与运算的变量是否是同一类型的,简单的错误处理。最终的结果常常是一个抽象的语法树(abstract syntax tree,或 AST),这样后端可以在此基础上进一步优化,处理。

《编程语言实现模式》的笔记-第89页

AST构建操作符 ^(VEC expr+) 能构建表示向量的子树,也是一种树模式。实际上,这里采用的就是文法到树文法的改写规则。
树文法???

《编程语言实现模式》的笔记-程序员与编译模式 - 程序员与编译模式

程序员们常做的两种事情:一个是实现某个DSL,二是处理或翻译GPPL。换句话说,程序员可能得实现某种制图语言或者数学语言,但很少需要编写大型程序语言的编译器或解释器。通常所遇到的任务不外乎编写一些重构、格式调度、度量软件、错误查找、插桩或者翻译语言的工具。
编译器所用到的模式,往往也是实现DSL甚至GPPL所需要的关键模式。比如符号表管理模式,几乎所有语言应用都以之为基础。就好像解析器是语法分析的必要工具一样,符号表对于分析输入内容的语义也占有至关重要的地位。一句话,语法告诉我们该做什么,语义告诉我们这样做是为了什么。
注:
GPPL(通用目的编程语言),与DSL相对应。DSL即领域编程语言,它是用于解决特定领域问题的语言。

《编程语言实现模式》的笔记-第73页

语法导向的特征就是只用一次扫描,就可以把输入都翻译完

《编程语言实现模式》的笔记-第316页

ST(stringtemplae-3.2)中没有foreach循环,而是直接应用到多值属性上(jXLS似乎也支持这么做)

《编程语言实现模式》的笔记-第127页

topdown只能化简(* 4 (* 5 0))的最里层,而bottomup则能进一步归约化简

《编程语言实现模式》的笔记-第55页

gg

《编程语言实现模式》的笔记-第108页

树文法转换为访问者操作序列:^('+' expr expr) ==> '+' DOWN expr expr UP

《编程语言实现模式》的笔记-第92页

开发环境可借助解析树实行语法高亮和错误检查

《编程语言实现模式》的笔记-第37页 - 第2章 基本解析模式

“向前看”原文是"lookahead",按习惯还是翻译成“预测”更好。

《编程语言实现模式》的笔记-第45页 - 第2章 基本解析模式

“环形”原文是"circular",翻译成“循环”更好。

《编程语言实现模式》的笔记-第21页 - 第2章 基本解析模式

自从2001年开始迷上编译原理,这么多年以来一直断断续续地学习,却一直处于半懂不懂且缺乏实践的尴尬境地,以至于都要引以为平生一憾了。
昨晚看过本书前两章,感觉有作者两点做的好:一是首先建立大局观,不一上来就陷入细枝末节,这样比较容易入门;二是追求实用性,举的例子都是实际的语言应用,这样比较容易建立直观的联系。这其实也是学习比较复杂的理论时特别要注意的两点,所以最好是先找一本类似本书的入门书,有了大局观和一定的理论和实践基础后再看龙书这样的专业教科书,这样循序渐进,可以少走不少弯路。
2012-11-13 08:27

《编程语言实现模式》的笔记-第124页

这里描述子树结构的代码让我想到了《The Little Schemer》里的一页说明:顺序很重要!!否则可能死循环

《编程语言实现模式》的笔记-开发人员如何选取编译模式 - 开发人员如何选取编译模式

把各种模式分门别类有助于选择所需的模式。基本上,将其分为(1)读取输入的;(2)分析输入的;(3)解释执行的和(4)生成输出的。
因此,如果只需把数据读入内存,就选用第一部分的模式。编写解释器时,除了读取输入的模式(第一部分),还可能需要第三部分中执行命令的模式。编写翻译器同样要读取输入,但还要使用第四部分的模式来产生输出。除非所处理的语言十分简单,否则还会用到第2部分的模式为这两个过程构建中间的数据结构,以辅助分析输入内容。

《编程语言实现模式》的笔记-第120页

熟悉树文法后,就会发现它生成遍历器要比手工编写访问者更方便 ...

《编程语言实现模式》的笔记-第63页

带有记忆(memoize)机制的递归下降解析器又称packrat parser.(ps: 其实这种避免重复解析的做法类似于LR分析技术。。。)

《编程语言实现模式》的笔记-第111页

项推导:ASF+SDF?Stratego/XT??

《编程语言实现模式》的笔记-第248页

常量池(下标索引访问?)
JIT引擎生成的代码一般使用PC相对寻址加载大常数,如果是索引访问常量池的话,是否能提高字节码运行性能?如何做?

《编程语言实现模式》的笔记-语义分析和语言应用 - 语义分析和语言应用

通俗的讲,语义分析就是搞清楚输入的具体含义(以语法为基础的都是语义)。如果语言应用类型不同,则其(编译)流水线中各个阶段的实现方式也不同,而相互间的连接方式也不同。语言应用分四大类。
注:编译流水线:输入文件 -> 翻译器( -> 解释器 -> 语义分析器 ) ->生成器 -> 输出
1,文件读取器:其主要工作是根据输入流建立数据结构。输入流可以是普通字符、文本,也可以是二进制数据。常见的文件读取器有配置文件读取器、方法调用分析工具之类的程序分析工具,以及JAVA的class文件载入器。
2,生成器:它会收集内部数据结构中的信息,然后产生输出。常见的有对象-关系型数据库(ORM,ORD)映射工具、序列化工具、源代码生成器及网页生成器。
3,翻译器(或称改写器):翻译器读入字符文本或二进制数据,生成同种或不同种语言的输出,实际上就是文件读取器和生成器的组合。常见的有,把过时的语言翻译成现代语言的翻译器、wiki到HTML的翻译器、 重构工具、代码插桩工具、日志报告输出器、格式调整器及宏的预处理器,等等。有些翻译器十分常用,比如汇编器和编译器,已经自成一类了。
4,解释器:通常要读入文件、解码,然后执行指令。从简简单单的计算器,到POP协议的服务器,再到编程语言Java、Ruby和Python的具体实现,都是解释器的具体应用。


 编程语言实现模式下载 更多精彩书评


 

外国儿童文学,篆刻,百科,生物科学,科普,初中通用,育儿亲子,美容护肤PDF图书下载,。 零度图书网 

零度图书网 @ 2024