就我所知,Lisp语法代表AST,但是在高级格式中允许人们轻松读取和修改,同时也使机器也能轻松处理源代码。
出于这个原因,在Lisp中,据说代码是数据,数据是代码,因为代码(s-epxression)本质上只是AST。我们可以将更多的AST(这是我们的数据,只是lisp代码)插入其他AST(lisp代码)或独立地扩展其功能并动态操作它(运行时),而无需重新编译整个操作系统以集成新的在其他语言中,我们必须重新编译,以便在将人类语言源代码编译成代码之前将其转换为有效的AST。
这就是Lisp语法设计的原因(首先代表一个AST但是人类可读,以满足人类和机器)?在人机之间实现更强(动态 - 运行时)以及更简单(无重新编译,更快)的通信?
我听说Lisp机器只有一个地址空间来保存所有数据。在像Linux这样的操作系统中,程序员只有虚拟地址空间,并假装它是真正的物理地址空间,可以随心所欲。 Linux中的数据和代码是分离的区域,因为有效地,数据是数据,数据是代码。在用C(或类似C语言)编写的普通操作系统中,如果我们只为整个系统操作一个地址空间并且将数据与代码混合会非常混乱,那将会非常混乱。
在Lisp Machine中,由于代码是数据而数据是代码,这是否只有一个地址空间(没有虚拟层)的原因?既然我们有GC而没有指针,那么在没有破坏它的情况下操作物理内存是否安全(因为只有一个单独的空间要复杂得多)?
编辑:我问这个是因为据说Lisp的one of the advantage是单地址空间:
安全语言意味着无需可靠的环境 将任务分离到各自独立的存储空间中。
Unix的“明显分离的过程”模型特征 处理可能不可靠的软件时有很大的优点 不安全的地方,就像用C或C编写的代码一样 C ++,无效指针访问可以“取消系统”。 MS-DOS及其继承人在这个意义上是非常不可靠的 任何程序错误都可能导致整个系统崩溃; “蓝屏 死亡“和喜欢。
如果整个系统是用Lisp构造和编码的,那么系统就像 作为Lisp环境可靠。通常,这是非常安全的 一旦你达到符合标准的层,它们就完全可以了 可靠,并且不提供允许的直接指针访问 系统自毁。
Third Law of Sane Personal Computing
易失性存储设备(即RAM)应专门用作 非易失性存储设备的读/写缓存。来自 除操作系统外,所有软件的透视图 机器必须提供可以考虑的单个地址空间 非易失性。没有任何计算机系统遵守这项需要更长时间的法律 完全从其电源中断恢复其状态 电灯会。
如上所述,单个地址空间将所有正在运行的进程保存在同一个内存空间中。我很好奇为什么人们坚持认为单个地址空间更好。我把它与Lisp的AST语法联系起来,试图解释它如何适合单个空间模型。
答案 0 :(得分:6)
您的问题并未准确反映现实,特别是在Linux和其他操作系统中的代码/数据分离部分。实际上,这种分离不是在OS级别强制执行,而是由编译器/程序加载器强制执行。在OS级别,只有可以设置不同保护位的存储器页面(如可执行,只读等),并且在此级别之上存在不同的可执行格式(如Linux中的ELF),其指定对程序存储器的不同部分的限制。
据我所知,回到Lisp,历史上,Lisp创建者使用S表达式格式,因为他们希望专注于语言的语义,将语法搁置一段时间。有一个计划最终为Lisp创建一些语法(参见M表达式),并且有一些基于Lisp的语言有更多的语法,比如Dylan。但总的来说,Lisp社区达成了共识,S表达式的好处超过了他们的缺点,所以他们已经陷入困境。
关于代码作为数据,这并不严格地绑定到S表达式,因为其他代码也可以被视为数据。整个方法称为元编程,并且由不同级别和不同机制支持多种语言。支持eval
(Perl,JavaScript,Python)的每种语言都允许将代码视为数据,只是表示几乎总是一个字符串,而在Lisp中它是一个树,它更方便,更方便高级东西,比如宏。