为什么编译语言不具备"eval"功能?

Sto*_*yte 1 c c++ eval compilation

昨天我和我的一个朋友开始讨论这个问题.他习惯于使用具有eval函数的解释语言(AS3,PHP)进行编码,并习惯使用编译语言(如C++).然后,我试图向他解释,在编译语言中使用eval功能是不可能的,因为本机代码对其源代码(变量,语法,反射(在C/C++的情况下)等)一无所知,并且这样,你就不能让任何函数在没有编译的情况下实时执行源代码(并且要编译它,你需要其余的源代码,所以这是不可能的).

你怎么看?这个论点足够坚固吗?您是否会提出任何其他论据来论证为什么编译语言不能具有eval功能?(请不要发布任何内容,也不要反对eval的想法).

Tho*_*mas 18

编译语言可以有eval,但二进制文件也需要包含或访问编译器.

如果evaled代码要与编译的代码交互,则二进制文件中的一些注释(例如变量名,类名,函数名,类型)是必需的.Java .class文件是一个很好的例子,其中仍然可以从编译的代码中收集大量信息.

  • 取决于你如何解释"解释".Java被编译为字节码,由虚拟机解释; 但实际的源代码根本不在运行时解释. (4认同)

Gab*_*abe 10

编译语言当然可以有一个eval函数(如LISP),但这意味着运行时必须包含编译器.

事实上,JavaScript可能是最好的例子.所有主要的实现(V8,Charkra,SpiderMonkey)现在都编译为本机代码,但它有一个eval函数.这是有效的,因为编译器是运行时系统的一部分.