Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
LISP 1.5 LISP如何像一种机器语言?_Lisp_Racket_S Expression_Machine Language_Computer Science Theory - Fatal编程技术网

LISP 1.5 LISP如何像一种机器语言?

LISP 1.5 LISP如何像一种机器语言?,lisp,racket,s-expression,machine-language,computer-science-theory,Lisp,Racket,S Expression,Machine Language,Computer Science Theory,我希望它还活着,但是 发件人: LISP可以解释和执行以S形式编写的程序- 表达。因此,与机器语言一样,与大多数其他高级语言不同 级别的语言,它可用于生成程序以供进一步使用 执行 我需要更多关于机器语言如何生成程序以及Lisp如何生成程序的说明。所有的意思是机器代码可以直接将机器指令写入内存并跳转到这些指令来执行它们;事实上,这是许多攻击向量侵入软件的基础 关键是,当您编写机器代码时,很容易生成机器代码。但是,当您使用C这样的编译语言编写代码时,您不能只在运行时生成C代码然后执行它,除非您的程序

我希望它还活着,但是

发件人:

LISP可以解释和执行以S形式编写的程序- 表达。因此,与机器语言一样,与大多数其他高级语言不同 级别的语言,它可用于生成程序以供进一步使用 执行


我需要更多关于机器语言如何生成程序以及Lisp如何生成程序的说明。

所有的意思是机器代码可以直接将机器指令写入内存并跳转到这些指令来执行它们;事实上,这是许多攻击向量侵入软件的基础

关键是,当您编写机器代码时,很容易生成机器代码。但是,当您使用C这样的编译语言编写代码时,您不能只在运行时生成C代码然后执行它,除非您的程序包含C编译器


Lisp——现在还有许多其他语言,特别是Perl、Python、Ruby、Tcl、Javascript和命令shell等“脚本语言”——都能够执行运行时生成的代码。在Lisp中,由于代码和数据具有相同的结构,因此这通常比其他语言中的工作要少,因为要计算的代码通常是一个必须解析的字符串。(尽管Perl能够
计算
一个块而不是一个字符串,这使得编译器能够提前对文本代码进行解析。)

机器语言可以在运行时改变自身。我做的最后一个汇编程序是针对MS DOS和常驻程序的,我在测试其他程序之前经常运行这些程序。当我的程序出现错误时,击键切换到常驻程序,可以窥视正在运行的程序并在恢复之前直接修改它。它非常方便,因为我没有调试器

LISP从一开始就有这个功能,因为它最初是被解释的。您可以在运行时更改函数的定义,整个语言在运行时始终可用,甚至
eval
define
。当它开始编译时,它不像Algol那样编译,而是部分地允许解释代码和编译代码同时混合。它的代码结构是列表结构,而符号是一种数据类型,这一事实促成了这一点

有人问他对现代编程语言(不是LISP家族,而是据说受LISP影响的Algol家族语言Ruby)的看法,在回答之前,他问他们是否可以将代码表示为数据(如列表结构)。在他看来,Ruby仍然落后于60年代的LISP


Algol家族中出现了许多新的编程语言,其中一些最有前途的语言,如和,正在接近LISP在60年代的功能。

机器语言程序可以用任意字节填充内存区域。然后他们就可以跳到这样一个区域的开始,这样就可以立即执行

Lisp语言程序可以使用
cons
在内存中轻松创建任意S表达式。然后,他们可以调用这些S表达式的
eval
,对它们进行求值(解释)

高级语言程序可以很容易地用表示语言语法中新代码的字符填充内存区域。但他们不能运行这样的代码