Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Compiler construction 在动态语言中,语义分析器的工作是什么?_Compiler Construction_Dynamic Languages_Semantic Analysis - Fatal编程技术网

Compiler construction 在动态语言中,语义分析器的工作是什么?

Compiler construction 在动态语言中,语义分析器的工作是什么?,compiler-construction,dynamic-languages,semantic-analysis,Compiler Construction,Dynamic Languages,Semantic Analysis,请原谅我的英语。我最近试图理解编译器的不同部分,并用游戏语言实现它们。我想知道语义分析器的工作是什么,因为我读到支持语义分析器的许多事情实际上并不适用于动态语言,例如类型检查、范围检查等,因为这些事情是在运行时检查的 因此,我认为动态语言(如LUA、PYTHON或RUBY)的语义分析器的一些工作是 确保作业不是像1=a或5=5那样糟糕 但是,我不确定动态语言编译器的语义分析阶段还有哪些工作。在动态语言中,它似乎有一个非常小的任务要做,因为大多数是在运行时完成的。语义分析器还负责动态语言的哪些其他

请原谅我的英语。我最近试图理解编译器的不同部分,并用游戏语言实现它们。我想知道语义分析器的工作是什么,因为我读到支持语义分析器的许多事情实际上并不适用于动态语言,例如类型检查、范围检查等,因为这些事情是在运行时检查的

因此,我认为动态语言(如LUA、PYTHON或RUBY)的语义分析器的一些工作是

  • 确保作业不是像1=a或5=5那样糟糕

  • 但是,我不确定动态语言编译器的语义分析阶段还有哪些工作。在动态语言中,它似乎有一个非常小的任务要做,因为大多数是在运行时完成的。语义分析器还负责动态语言的哪些其他常见工作?我觉得我错过了语义分析的大部分内容。谢谢。

    没错,动态语言编译器中不存在许多分析任务(这就是为什么它们相对容易实现的原因)。但是,我还可以想到一些其他任务:

    • 范围界定。变量的类型,有时甚至是否存在都是动态确定的,这是正确的,但至少对于Lua和Python来说,在编译时可以(而且如果您不想不必要地使实现复杂化的话,应该)完成一些作用域:非全局变量的作用域

      • 需要分析什么?这一部分在Lua中很容易,因为有一个显式的
        local
        关键字-但它仍然需要编译器知道它并且需要在Python中进行相对广泛的分析,赋值隐式地使变量成为局部变量和两个(在3.x中,一个在2.x中)关键字来改变这种行为

      • 为什么这很重要?在Python中,访问尚未初始化的局部变量与访问Python中不存在的全局变量一样是一个错误,但这是一个不同的错误。在Lua中,两者都导致
        nil
        local
        不会改变先前赋值的范围,但后续读/写的语义仍然会改变。此外,的字节码指令在这两种情况下都非常不同

    • 优化。显然,关于变量/“常量”所包含的信息是有限的(如果有的话)。尽管如此,至少CPython有各种各样的常量折叠和字节码优化过程(请参阅),甚至Lua及其速度惊人的单过程编译器也会对算术指令进行一些常量折叠。PyPy解释器(独立于它的JIT)引入了一个操作码,它是为调用globals而发出的,globals的名字可能是内置函数。显然,这需要一些范围分析

    • 正如您自己所说,抱怨编译时禁止的少数构造。但是,这也可以在解析下计算(这些规则中的许多实际上是在语法中编码的)。另一个例子(语法中不容易编码)是重复的函数参数名


    非常感谢您的详尽回答,这对我帮助很大。