我搜索编译器存在的编程语言,并支持自修改代码。我听说Lisp支持这些功能,但我想知道是否有更多具有这些功能的C / C ++ / D-Like语言。
澄清我的意思:
我希望能够以某种方式在运行时访问程序代码并对其应用任何类型的更改,即删除命令,添加命令,更改它们。 好像我有我的程序的AstTree。当然,我不能用编译语言拥有那棵树,所以它必须做得与众不同。编译需要将自修改命令转换为二进制等效修改,以便它们在运行时与编译代码一起工作。
我不想依赖VM,这就是我对编译的意思:)。
答案 0 :(得分:10)
可能Lisp有这样的原因吗? Lisp旨在编写其他语言,并使用符号表示代码和数据进行计算。代码和数据之间的界限不再存在。这会影响编程语言的设计和实现。
Lisp的语法功能是生成新代码,翻译代码并执行它。因此,预解析的代码也使用与其他程序相同的数据结构(符号,列表,数字,字符......)。
Lisp在运行时知道它的数据 - 你可以查询它的类型或类的所有内容。类是对象本身,函数也是。因此编程语言和程序的这些元素也是一流的对象,它们可以这样操作。 动态语言与“动态类型”无关。
'动态语言'意味着编程语言的元素(例如通过元类和元对象协议)和程序(它的类,函数,方法,槽,继承......)可以查看运行时,可以在运行时修改。
您添加到语言中的这些功能可能越多,它看起来就越像Lisp。因为Lisp几乎是一种简单,动态,可编程编程语言的局部最大值。如果您想要其中一些功能,那么您可能想要考虑您必须放弃或愿意放弃的其他程序语言的哪些功能。例如,对于简单的代码为数据的语言,整个C语法模型可能不实用。
所以类似C和'动态语言'可能不太合适 - 语法是整个画面的一部分。但即使是C语法模型也限制了我们使用动态语言的难易程度。
答案 1 :(得分:2)
C#始终允许自修改代码。
答案 2 :(得分:1)
您可能需要考虑将C ++与LLVM一起用于(主要)可移植代码生成。您甚至可以使用clang来处理C解析树(请注意,clang目前对C ++的支持不完全,但是用C ++本身编写)
例如,您可以在C ++中编写自修改核心以与clang和LLVM进行交互,并在C语言中编写其余程序。将主程序的解析树与自修改代码一起存储,然后对其进行操作在运行时与clang。 Clang将允许您以任何方式直接操作AST树,然后将其一直编译为机器代码。
请记住,在编译语言中操作AST总是意味着在程序中包含编译器(或解释器)。 LLVM只是一个简单的选择。
答案 3 :(得分:0)
“动态语言”是一个涵盖各种概念的广义术语。 C#4.0支持动态类型,它是一种编译语言。 Objective-C还支持动态语言的一些功能。但是,在支持自修改代码方面,它们都没有接近Lisp。
为了支持这种程度的动态和自修改代码,你应该有一个功能齐全的编译器在运行时调用;这几乎就是翻译的真实含义。
答案 4 :(得分:0)
尝试groovy。它是一种基于Java-JVM的动态语言,在运行时编译。它应该能够执行自己的代码。
否则,你总是得到Perl,PHP等......但是,正如你所建议的那样,那些不是C / C ++ / D类语言。
答案 5 :(得分:0)
JavaScirpt + V8 (Chrome JavaScript编译器)
JavaScript
现在您可以使用V8编译它:http://code.google.com/p/v8/
答案 6 :(得分:0)
我不想依赖VM,这就是我对编译的意思:)。
如果这就是你要找的东西,我会推荐Python或Ruby。它们都可以在自己的虚拟机和JVM以及.Net CLR上运行。因此,您可以选择所需的任何运行时。在这两者中,Ruby似乎有更多的元编程工具,但Python似乎在其他平台上有更成熟的实现。