作者回复: 很准确,很清晰!
作者回复: 因为目前是在讲前端,所以就先不引入IR。
同时也是在告诉同学们,哪怕我们只拿到了AST,也已经能做很多事情了。
IR在后端部分会讲。我会给出一个自己设计的IR的例子,用IR重新实现部分功能。然后再去采用LLVM的IR。
作者回复: 这是直接照搬的Java的语法。这是对数组的支持。目前playscript并没有支持数组,但语法也就先这么放着了。
作者回复: 是的,我注意到了。
严格的表述这样写可能比较好:如果只是像java和c那样声明变量,就没有块作用域:-)
作者回复: 讲后端部分的时候,主要是用cpp版本实现的。那部分的指导资料我整理一下,写一个README.md,尽快更新到Github和码云上。
先简单说一下:
1.如果仅仅用cpp版本的Antlr,这个比较简单,你做练习的时候可以试用一下。
2.把Antlr和LLVM一起用的时候,要配置的东西更多一些,好在有cmake。
作者回复: 后几讲涉及的都是语义功能,并涉及了一部分运行期技术(给后端技术部分提前做铺垫)。
语义上的差别是每种语言真正的差别,但底层有一些共通的机制。搞搞明白对我们学各种语言都有好处。
作者回复: 递归函数的调用。
int a;
int foo(){
a = a+1;
if (a<10){
return foo();
}
else{
return a;
}
}
在递归调用的时候,你在函数里仍然可以访问全局变量。这个全局变量不在上一级的函数栈桢里。而是在最底下那个全局变量的栈桢。
作者回复: 我往代码里加了注释,你可以更新一下看看!
我也把注释拷贝到这里。
里面有些特性,比如一等公民函数,是还没讲到的,10讲就会讲。
第一个if:
/*
如果新加入的栈桢,跟某个已有的栈桢的enclosingScope是一样的,那么这俩的parentFrame也一样。
因为它们原本就是同一级的嘛。
比如:
void foo(){};
void bar(foo());
或者:
void foo();
if (...){
foo();
}
*/
第二个if:
/*
如果新加入的栈桢,是某个已有的栈桢的下一级,那么就把把这个父子关系建立起来。比如:
void foo(){
if (...){ //把这个块往栈桢里加的时候,就符合这个条件。
}
}
再比如,下面的例子:
class MyClass{
void foo();
}
MyClass c = MyClass(); //先加Class的栈桢,里面有类的属性,包括父类的
c.foo(); //再加foo()的栈桢
*/
第3个if:
/*
这是针对函数可能是一等公民的情况。这个时候,函数运行时的作用域,与声明时的作用域会不一致。
我在这里设计了一个“receiver”的机制,意思是这个函数是被哪个变量接收了。要按照这个receiver的作用域来判断。
*/
作者回复: 实际上,在每一行代码,可以见到的“可用表达式”的集合都是不一样的。也就是说,在每一行,你可以反问的变量都是不同的。
比如,在int i = 3之后,你访问的i,和在它前面访问的i,是不一样的。
也就是说,块作用域,并不是在整个块里可见,而是在这个块里变量声明之后才可见。
在28讲,数据流分析中,专门有活跃性分析的一个算法,会教会你确定在每个位置的可用变量。
作者回复: 没有。
但是antlr支持在语法规则里嵌入一些代码,在语法分析的过程中完成一些语义分析工作。
作者回复: 这里的代码我还没整理整齐。在后端部分的课程放出时,我会整理好。先简单的说一下:
Antlr本身是Java写的,但它可以生成其他语言的编译工具。这些编译工具呢,要调用一些基础的功能,这些功能就是针对不同语言的运行时(runtime)。
用C++编程时,需要用到头文件,然后用到它的库。a文件和dylib就是库。
作者回复: 在第21讲,里面提了内存布局的设计问题,一般会分为代码区、静态数据区、栈区、堆区。
如果只是function和class的定义,应该放在代码区才对。
在运行某个函数的时候,运行期动态生成的临时数据,才会放入栈里。
但每种语言在这方面的设计有它自己很大的灵活性。比如静态编译的语言和解释型语言的机制就很不一致。
08讲的栈,还是比较概念化的,简单的模拟了一个栈。21、22、23三讲,有一个符合标准的调用约定的栈的实现,也就是说跟C语言的实现是一致的,甚至可以跟C语言生成的二进制目标文件链接到一起。
作者回复: 是用来支持数组的。我们并没有实现数组特性,但语法上留在那了。
作者回复: 1.是运行双引号内部的部分,不是连String script= 也带上。
2.是使用playscript-java这个工程吗?别用错了工程。
如果还有问题,继续给我提问!
希望不影响你继续动手实践的热情!
作者回复: 这个栈桢还是拿java模拟的,让大家有个概念。到学后端的时候,那里有更物理的栈桢实现。到时候你可以进一步加深一下认识:-D