gpt4 book ai didi

assembly - Homoiconic和 “unrestricted”自修改代码+ Lisp真的是自修改的吗?

转载 作者:行者123 更新时间:2023-12-02 14:56:08 25 4
gpt4 key购买 nike

我将承认我对Lisp的了解非常有限。但是,我对这种语言非常感兴趣,并计划在不久的将来开始认真学习它。我对这些问题的理解无疑是有缺陷的,因此,如果我直言不讳地说了什么,请发表评论并纠正我,而不是低估。

真正的同调和可自我修改的语言

我正在寻找同时支持同声性(代码与数据具有相同表示形式)和不受限制的自我修改(不受限制的意思是,您可以更改运行代码的每个方面,而不仅仅是发出新代码或更改功能)的编程语言示例指针/代理。)

到目前为止,我发现了三个符合此条件的示例:

  • 机器代码。谐音,因为一切都是数字。可以无限制地进行修改,因为它包括指针,可以使用该指针来操纵任何内存地址,而不管该地址是存储代码还是存储数据。
  • Malbolge。与机器代码的推理相同。每条指令在执行后都会自行修改
  • DNA。不是编程语言,但仍然很有趣。它不能像机器代码一样自我修改。实际的指令和数据已被修改的地方。但是,它是自我复制的,并且可以根据其先前的状态进行变异/进化(具有诸如辐射的副作用,时不时地将其拧紧)。无论如何,这仅仅是自我修改的一种间接方式。简而言之,DNA可以自我修饰,但是可以通过自身的完整性以及相关突变来自我修饰。 DNA的物理字符串是“不变的”。

  • 为什么Lisp不在此列表中

    Lisp不在该列表中,因为在我看来Lisp几乎是同质的,并且仅支持受限的自我修改。你可以做类似的事情
    (+ 1 2 3)

    会做与
    (eval '(+ 1 2 3))

    在第一个版本中, (+ 1 2 3)是原始代码,而在第二个版本中,它是数据。通过假设这个陈述的真实性,可以说Lisp甚至不是谐音的。在代码都是列表/树/ S表达式的意义上,代码具有与数据相同的表示形式。但是,您必须明确标记这些列表/树/ S表达式中的哪些是代码,哪些是我的数据,这一事实似乎表明Lisp毕竟不是同质的。表示形式极为相似,但是它们之间的细微差别有所不同,您实际上必须说是要处理代码还是要处理数据。这绝不是一件坏事(事实上,其他任何事情都是疯狂的),但它强调了Lisp和机器代码之间的区别。在机器代码中,您不必显式标记哪些数字是指令,哪些是指针以及哪些是数据。在实际需要解释之前,一切都只是一个数字,此时可能是其中任何一种。

    对于不受限制的自我修改,这是一个更有力的案例。当然,您可以获取代表某些代码的列表并进行操作。例如改变
    '(+ 1 2 3)


    '(+ 1 4 3)

    然后通过 eval运行它。但是,当您执行此操作时,您只是在编译一些代码并运行它。您无需修改​​现有代码,而只是发出并运行新代码。即使使用不太方便的格式,C#仍可以使用表达式树做同样的事情(这是由于C#代码与其AST的表示形式不同,而Lisp是它自己的AST)。您是否可以实际获取整个源文件并在运行时开始修改整个源文件,而对源文件所做的更改会对程序行为产生实时影响?

    除非有某种方法可以做到,否则Lisp既不是谐音的,也不是自我修改的。 (为在定义上争论不休,Lisp并非与机器代码相同的谐音或自我修改。)

    制作Lisp Homoiconic /无限制地自我修改的方式

    我可以看到三种使Lisp像机器代码一样谐音/可自我修改的潜在方法。
  • 非冯诺依曼体系结构。 如果有人可以发明某种惊人的假设机器,其中程序的最低层表示是可以直接执行的AST(无需进一步编译)。在这样的机器上,AST既代表可执行指令,也代表数据。不幸的是,该问题不会得到解决,因为AST仍然必须是代码或数据。评估函数的最新状态不会改变这一点。在机器代码中,您可以根据需要在代码和数据之间来回切换。有了eval和Lisp,一旦您从数据中“避开”了一些列表到代码并执行了它,就没有办法再次将该列表重新作为数据。实际上,该列表已永远消失,并已替换为它的值。我们会错过一些关键的东西,而这些恰好是指针。
  • 列出标签。 如果要求每个列表还必须有一个唯一的标签,则可以通过对具有给定标签的列表运行函数来进行间接自我修改。与延续相结合,这最终将允许以与机器代码相同的意义进行自我修改的代码。标签等同于机器代码的内存地址。例如,考虑一个Lisp程序,其中AST的顶部节点带有标签“main”。在main内部,您可以执行一个函数,该函数带有一个标签,一个Integer,一个Atom,然后将原子复制到List,该原子具有一个与提供给该函数的标签匹配的标签,位于Integer指定的索引处。然后只需在main上以当前延续调用即可。您可以自行修改代码。
  • Lisp宏。 我还没有花时间去理解Lisp宏,实际上它们可能完全按照我的想法去做。

  • 点1.与2.结合将产生完全自我修改的Lisp。前提是可以生产所述的神奇Lisp机器。 2.单独可以产生自我修改的Lisp,但是在冯·诺依曼体系结构上的实现可能效率极低。

    问题
  • 除了机器代码,dna和malbolge之外,是否还有其他语言可以完全自我修改并且属于同音符号?
  • (如果您在上面的文本中做了tl; dr,请不要打扰)。 Lisp真的是谐音+自我修饰的吗?如果您这样说,您能准确引述我误入歧途的地方吗?

  • 附录

    具有不受限制的自我修改但没有谐音的语言
  • Assembly 。该代码使用单词而不是数字,因此失去了谐音性,但仍然具有指针,该指针保留了对内存的总体控制权,并允许无限制的自我修改。
  • 使用原始指针的任何语言。例如C / C++ / ObjectiveC。与程序集
  • 相同的参数
  • 包含虚拟指针的JIT语言。例如,在不安全的上下文中运行的C#/。net。与 Assembly 相同的论点。

  • 其他可能相关/有趣的概念和语言:
    Lisp,Ruby,Snobol,Forth及其编译时元编程,Smalltalk及其反射(reflect),无类型的lambda演算,其属性是一切都是函数(这暗示着我们可以发明一台直接执行lambda演算的机器,即lambda演算在该机器上运行时将是谐音的,而冯·诺依曼机器代码将不会运行。[而且Godels定理将是可执行的。哈哈,令人恐惧的想法:P]

    最佳答案

    In the first version (+ 1 2 3) is raw code, whereas in the second version it is data. By assuming the truth of this statement it can be argued that Lisp isn't even homiconic. The code has the same representation as data in the sense that they are both lists/trees/S-expressions. But the fact that you have to explicitly mark which of these lists/trees/S-expressions are code and which are data to me seems to say that Lisp is not homiconic after all.



    这不是真的。在第一版本中,列表 (+ 1 2 3)是数据,它被馈送到要执行的解释器,即被解释为代码。您必须将s表达式标记为特定上下文中的代码或数据这一事实并不会使Lisp具有非同质性。

    相似之处在于所有程序都是数据,而不是所有数据都是程序,因此两者之间仍然存在差异。在Lisp中, (1 2 3)是有效列表,但不是有效程序,因为整数不是函数。

    [如果我们查看另一种伟大的谐音编程语言Prolog,则会看到相同的现象:我们可以构建数据结构 foo(X, 1, bar),但是如果没有 foo的定义,我们将无法执行它。另外,变量不能是谓词或事实的名称,因此 X.永远不是有效的程序。]

    Lisp在很大程度上可以自我修改。例如,以下是更改函数定义的方法:
    [1]> (defun foo (x) (+ x 1))
    FOO
    [2]> (defun bar (x) (+ x 2))
    BAR
    [3]> (setf (symbol-function 'foo) #'bar)
    #<FUNCTION BAR (X) (DECLARE (SYSTEM::IN-DEFUN BAR)) (BLOCK BAR (+ X 2))>
    [4]> (foo 3)
    5

    说明:在 [1]处,我们将函数 foo定义为add-1函数。在 [2]处,我们将 bar定义为add-2函数。在 [3],我们将 foo重置为add-2函数。在 [4]处,我们看到我们已经成功修改了 foo

    关于assembly - Homoiconic和 “unrestricted”自修改代码+ Lisp真的是自修改的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8490616/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com