Bet*_*moo 34 programming-languages dynamic-languages self-modifying
您能否建议一种支持在运行时修改代码的强大语言或功能?
这就是我在运行时修改代码的意思:
Start:
a=10,b=20,c=0;
label1: c=a+b;
....
label1= c=a*b;
goto label1;
Run Code Online (Sandbox Code Playgroud)
并且可能正在建立一份说明清单:
code1.add(c=a+b);
code1.add(c=c*(c-1));
code1. execute();
Run Code Online (Sandbox Code Playgroud)
Pau*_*han 23
我强烈推荐Lisp.Lisp数据可以作为代码读取和执行.Lisp代码可以写成数据.
它被认为是规范的可自我修改的语言之一.
示例列表(数据):
'(+ 1 2 3)
Run Code Online (Sandbox Code Playgroud)
或者,将数据作为代码调用
(eval '(+ 1 2 3))
Run Code Online (Sandbox Code Playgroud)
运行+函数.
您还可以即时进入并编辑列表成员.
编辑:
我编写了一个程序来动态生成程序并在运行中对其进行评估,然后向我报告它与基线相比如何(div为0是通常的报告,ha).
Blu*_*eft 15
到目前为止,每个答案都是关于反射/运行时编译,但在你提到的评论中,你对实际的自修改代码感兴趣- 代码在内存中修改自身.
在C#,Java甚至(可移植)中无法在C中执行此操作 - 也就是说,您无法使用这些语言修改加载的内存中二进制文件.
一般来说,唯一的方法是使用汇编,它依赖于处理器.事实上,它也依赖于高度操作系统:为了防止多态病毒,大多数现代操作系统(包括Windows XP +,Linux和BSD)强制执行W ^ X,这意味着你必须经历一些麻烦来编写多态可执行文件那些操作系统,对于那些允许它的操作系统.
在某些解释语言中,程序可能会在程序运行时修改自己的源代码.Perl,Python (参见这里),以及我知道的Javascript的每个实现都不允许这样做.
Rei*_*ien 10
就个人而言,我发现很难找到比C#更易于处理的程序集.我觉得你觉得装配不是那么强大就更奇怪了:你不能比原始机器语言更强大.无论如何,对他/她自己.
C#有很好的反射服务,但是如果你对此有厌恶.如果你对C或C++非常熟悉,你总是可以编写一个编写C/C++并将其发布给编译器的程序.如果您的解决方案不需要快速的自我重写周转时间(大约几十秒或更长时间),这将是可行的.
Javascript和Python都支持反射.如果您正在考虑学习一种新的,有趣的编程语言,这种语言功能强大但技术要求不高,我建议使用Python.
愿我建议Python的,它有丰富的自省包括(并通过例如使用一个很好的非常高级的动态语言compile,eval或exec允许的自我修改代码的形式).一个基于您的问题的简单示例:
def label1(a,b,c):
c=a+b
return c
a,b,c=10,20,0
print label1(a,b,c) # prints 30
newdef= \
"""
def label1(a,b,c):
c=a*b
return c
"""
exec(newdef,globals(),globals())
print label1(a,b,c) # prints 200
Run Code Online (Sandbox Code Playgroud)
请注意,上面的代码示例c仅在函数范围中进行了更改.
Common Lisp的设计考虑到了这一点.您也可以尝试使用 Smalltalk,其中使用反射来修改运行代码并不是未知的.
在这两种语言中,您可能会替换整个函数或整个方法,而不是单行代码.Smalltalk方法往往比Lisp函数更精细,因此这可能是一个好的开始.