K-R*_*RAN 1 c ruby python compiler-construction binding
假设我有一个C程序,它有这一行:
int a = 12;
Run Code Online (Sandbox Code Playgroud)
在编译期间,12的值是否绑定到'a'?或者当程序的范围达到'a'时,值是否在运行时被放入内存中?
那些像Python和Ruby这样的编程语言呢?
是否存在将值静态绑定到变量的语言/实例?我已经考虑了一段时间了,老实说,我无法想到将值静态绑定到基本类型的逻辑原因.
cdl*_*ary 10
编译器和虚拟机有效地"实现"编程语言.为了正确,它们只需要执行语言语义指定和给定程序可观察的内容.
当您int a = 12;在C程序中编写定义语句时,您将通知编译器有一个名为a其初始值设置为常量文字十二的变量.
如果你从未观察过a,编译器可以完全摆脱它,因为你不能在程序执行期间根据语言规范来区分它们.(例如,如果你要暂停程序并在那时扫描堆栈,那么值12根本就不存在.它在机器堆栈上的必要性不是语言规范的一部分.)
如果您观察到a但发现您的程序不可能改变其值,则编译器推断它实际上static const并且可以执行称为"常量传播"的优化以将硬编码的12推送到依赖指令中.
如果你参考ala int *aptr = &a;,那么语言规范说a 必须在内存中有一个位置(IIRC).这意味着,根据规范,在内存中(在堆栈中,在任何合理的实现中)将有一个有效的,int大小的插槽,它将包含12.
在其他语言中显然有其他规格.从技术上讲,在动态语言中,编译器可以执行类似的优化.如果你有一个Python函数:
def do_nothing():
a = 12
Run Code Online (Sandbox Code Playgroud)
您可以想象,将语言文本转换为字节码的Python编译器可能会选择完全省略该函数的主体(对于pedants:除了隐式return None).传统上,Python实现没有这样的优化,因为它的语言哲学要求可调试性,VM实现简单性和程序员理解高于优化.
在动态语言中也存在一些棘手的结构,这使得推理变得更加困难.例如,Python允许大量的代码对象检查,这些检查可以跨实现工作.获取/检查堆栈跟踪和激活帧的本地参数至少需要慢速路径回退机制,这显着增加了优化复杂性.我们正在使用ECMAScript修订版5放弃对JavaScript中某些语言级运行时堆栈检查的支持.
支持调试器很难,让我们去优化吧!