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