用于自修改代码的编程语言?

Bet*_*moo 34 programming-languages dynamic-languages self-modifying

  • 我最近在考虑编写自我修改程序,我认为它可能是强大而有趣的.所以我目前正在寻找一种允许轻松修改程序自己的代码的语言.
  • 我读到了C#(作为一种解决方法)以及在运行时编译和执行代码的能力,但这太伤人了.
  • 我也在考虑装配.更改运行代码更容易,但它不是很强大(非常原始).

您能否建议一种支持在运行时修改代码的强大语言或功能?

这就是我在运行时修改代码的意思:

  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)

Dav*_*vid 46

Malbolge将是一个很好的起点.每条指令都是自我修改的,玩起来很有趣(*).

(*)免责声明:实际上可能不是很有趣.

  • 编程语言花了几年的时间让一个人写下你好世界...哦等等,你好世界的程序是由计算机生成的.享受乐趣lulz. (23认同)

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.

  • 我觉得这里没什么奇怪的.汇编就像你能得到的一样简单,而C#是庞大而复杂的 - 我说这是一个已经写了几年C#的人!至于权力,我认为在编程中它通常意味着"表达能力"或"抽象构建能力"(显然"权力"的字面含义在这里毫无用处!),汇编语言在这方面非常差. (6认同)
  • 我同意C#是庞大而复杂的.话虽这么说,比较在C#和汇编中打开文件所需的代码行数.对于现代编程任务,组装根本不是一种选择.对于需要大量优化的子子任务,也许.至于权力,我基本上是指你被允许直接操纵的事物的数量.然而,这并不总是有用的; 这就像被给予一堆碳并被告知要养一只狗.程序集可能会非常棘手地进行动态修改 - 您基本上必须充当编译器.你需要做所有的寻址. (3认同)
  • @Ken @Reinderien @Paul:汇编比C#更难.**期**.和_effective_ C#一样难吗?也许不吧.**尽管如此,有效**组装**肯定比有效的C#更难.您必须掌握您的架构,考虑增加的圈复杂度,缓存,流水线,中断,并在需求发生变化时完全重新设计整个算法,以使其尽可能高效(保存寄存器,对齐某些数据,修复一些ILP等),如果在硬件级别:控制CPU(MSR,TLB,页表,I/O,控制寄存器等). (3认同)

Chr*_*heD 9

愿我建议Python的,它有丰富的自省包括(并通过例如使用一个很好的非常高级的动态语言compile,evalexec允许的自我修改代码的形式).一个基于您的问题的简单示例:

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仅在函数范围中进行了更改.


Nor*_*sey 7

Common Lisp的设计考虑到了这一点.您也可以尝试使用 Smalltalk,其中使用反射来修改运行代码并不是未知的.

在这两种语言中,您可能会替换整个函数或整个方法,而不是单行代码.Smalltalk方法往往比Lisp函数更精细,因此这可能是一个好的开始.


Kev*_*nko 6

许多语言允许您在运行时评估代码.

  • 口齿不清
  • Perl的
  • 蟒蛇
  • PHP
  • 红宝石
  • Groovy(通过GroovyShell)