首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在动态语言中,语义分析器的工作是什么?

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

Stack Overflow用户
提问于 2011-08-25 04:40:55
回答 1查看 510关注 0票数 3

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

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

  1. 确保作业不像1=a或5=5那样糟糕。

但是,我不确定动态语言编译器的语义分析阶段还有哪些其他工作。在动态语言中,它的工作量似乎很小,因为大多数都是在运行时完成的。语义分析器还为动态语言处理了哪些其他公共任务?我觉得我错过了语义分析的大部分内容。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-25 06:44:50

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

  • 观察范围。变量的类型甚至存在是动态的,这是正确的,但至少对于Lua和Python来说,在编译时可以(如果您不想使实现复杂化的话)范围的某些部分:非全局变量的范围。
代码语言:javascript
复制
- What has to be analyzed? That part is easy in Lua as there is an explicit `local` keyword - but it still requires the compiler to be aware of it! - and requires relatively extensive analysis in Python, with assignments implicitly making variables locals and two (in 3.x, one in 2.x) keywords to change that behaviour.
- Why does it matter? In Python, acessing a local variable that hasn't been initialized yet is as much of an error as accessing a non-existing global in Python, but a different error. In Lua, both lead to `nil` and `local` doesn't change the scope of previous assignments, but the semantics of subsequent reads/writes still change. Also, the bytecode instructions for are very different in both cases.

  • 优化。显然,在某些情况下,您只能获得关于哪些变量/“常量”包含的有限信息(如果有的话)。尽管如此,至少CPython有各种各样的常量折叠和字节码优化传递(参见peephole.c),甚至连快速的一遍编译器Lua也会根据算术指令进行一些常量折叠。PyPy解释器(独立于JIT)引入了一个CALL_LIKELY_BUILTIN操作码,用于调用可能是内置函数的全局函数。很明显,这需要一些范围分析。
  • 正如您自己说的,抱怨编译时禁止的少数构造。但是,这也可以在解析中计算(其中许多规则实际上是在语法中编码的)。另一个示例(在语法中不易编码)是重复的函数参数名称。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7185225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档