编译动态语言

时间:2009-11-03 21:05:33

标签: reflection programming-languages lisp compiled self-modifying

我搜索编译器存在的编程语言,并支持自修改代码。我听说Lisp支持这些功能,但我想知道是否有更多具有这些功能的C / C ++ / D-Like语言。

澄清我的意思:

我希望能够以某种方式在运行时访问程序代码并对其应用任何类型的更改,即删除命令,添加命令,更改它们。 好像我有我的程序的AstTree。当然,我不能用编译语言拥有那棵树,所以它必须做得与众不同。编译需要将自修改命令转换为二进制等效修改,以便它们在运行时与编译代码一起工作。

我不想依赖VM,这就是我对编译的意思:)。

7 个答案:

答案 0 :(得分:10)

可能Lisp有这样的原因吗? Lisp旨在编写其他语言,并使用符号表示代码和数据进行计算。代码和数据之间的界限不再存在。这会影响编程语言的设计和实现。

Lisp的语法功能是生成新代码,翻译代码并执行它。因此,预解析的代码也使用与其他程序相同的数据结构(符号,列表,数字,字符......)。

Lisp在运行时知道它的数据 - 你可以查询它的类型或类的所有内容。类是对象本身,函数也是。因此编程语言和程序的这些元素也是一流的对象,它们可以这样操作。 动态语言与“动态类型”无关。

'动态语言'意味着编程语言的元素(例如通过元类和元对象协议)和程序(它的类,函数,方法,槽,继承......)可以查看运行时,可以在运行时修改。

您添加到语言中的这些功能可能越多,它看起来就越像Lisp。因为Lisp几乎是一种简单,动态,可编程编程语言的局部最大值。如果您想要其中一些功能,那么您可能想要考虑您必须放弃或愿意放弃的其他程序语言的哪些功能。例如,对于简单的代码为数据的语言,整个C语法模型可能不实用。

所以类似C和'动态语言'可能不太合适 - 语法是整个画面的一部分。但即使是C语法模型也限制了我们使用动态语言的难易程度。

答案 1 :(得分:2)

C#始终允许自修改代码。

  • C#1允许您实时创建和编译代码。
  • C#3添加了“表达式树”,它提供了一种使用对象模型和抽象语法树动态生成代码的有限方法。
  • C#4以此为基础,结合了对“动态语言运行时”的支持。这可能与您在.NET平台上以编译语言获得类似LISP的功能一样接近。

答案 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的动态语言,在运行时编译。它应该能够执行自己的代码。

http://groovy.codehaus.org/

否则,你总是得到Perl,PHP等......但是,正如你所建议的那样,那些不是C / C ++ / D类语言。

答案 5 :(得分:0)

JavaScirpt + V8 (Chrome JavaScript编译器)

JavaScript

  • 动态
  • 自我修改(自我评估)(好吧,有点,取决于你的定义)
  • 具有类似C语法的语法(再一次,这是动态的最佳选择)

现在您可以使用V8编译它:http://code.google.com/p/v8/

答案 6 :(得分:0)

  

我不想依赖VM,这就是我对编译的意思:)。

如果这就是你要找的东西,我会推荐Python或Ruby。它们都可以在自己的虚拟机和JVM以及.Net CLR上运行。因此,您可以选择所需的任何运行时。在这两者中,Ruby似乎有更多的元编程工具,但Python似乎在其他平台上有更成熟的实现。