首页 文章

Lisp语法的目的是建模AST

提问于
浏览
5

据我所知,Lisp语法代表AST,但是在高级格式中允许人们轻松读取和修改,同时也使机器也可以轻松处理源代码 .

出于这个原因,在Lisp中,据说代码是数据,数据是代码,因为代码(s-epxression)本质上只是AST . 我们可以将更多的AST(这是我们的数据,只是lisp代码)插入其他AST(lisp代码)或独立地扩展其功能并动态操作它(运行时),而无需重新编译整个操作系统以集成新的在其他语言中,我们必须重新编译,以便在将人类语言源代码编译成代码之前将其转换为有效的AST .

这是Lisp语法设计的原因(首先代表一个AST但是人类可读,以满足人类和机器)吗?为了实现更强(在运行中 - 运行时)以及人机之间更简单(无重新编译,更快)的通信?

我听说Lisp机器只有一个地址空间来保存所有数据 . 在像Linux这样的操作系统中,程序员只有虚拟地址空间,并假装它是真正的物理地址空间,可以随心所欲 . Linux中的数据和代码是分离的区域,因为有效地,数据是数据,数据是代码 . 在用C(或类似C语言)编写的普通操作系统中,如果我们只为整个系统操作一个地址空间并且将数据与代码混合会非常混乱,那将会非常混乱 .

在Lisp Machine中,由于代码是数据而数据是代码,这是否只有一个地址空间(没有虚拟层)的原因?既然我们有GC而没有指针,那么在没有破坏它的情况下操作物理内存是否安全(因为只有1个单独的空间要复杂得多)?

EDIT: 我问这个是因为据说Lisp的one of the advantage是单地址空间:

安全语言意味着可靠的环境,而无需将任务分离到各自独立的存储空间中 . Unix处理的“明显分离的过程”模型在处理可能不安全的软件时具有强大的优点,就像使用C或C编写的代码一样,无效的指针访问可以“取消系统 . ”在这个意义上,MS-DOS及其继承人是非常不可靠的,几乎任何程序错误都可能导致整个系统崩溃; “蓝屏死神”等喜欢 . 如果整个系统是用Lisp构造和编码的,那么系统就像Lisp环境一样可靠 . 通常这是非常安全的,因为一旦你进入符合标准的层,它们就非常可靠,并且不提供允许系统自毁的直接指针访问 .

Third Law of Sane Personal Computing

易失性存储设备(即RAM)应专门用作非易失性存储设备的读/写高速缓存 . 从除操作系统之外的所有软件的角度来看,机器必须提供单个地址空间,这可以被认为是非易失性的 . 没有任何计算机系统遵守这项法律,从电源中断中完全恢复其状态所需的时间要长于电灯 .

如上所述,单个地址空间将所有正在运行的进程保存在同一个内存空间中 . 我很好奇为什么人们坚持认为单个地址空间更好 . 我把它与Lisp的AST语法联系起来,试图解释它如何适合单个空间模型 .

1 回答

  • 6

    您的问题并不能非常准确地反映现实,特别是在Linux和其他操作系统中的代码/数据分离部分 . 实际上,这种分离不是在OS级别强制执行,而是由编译器/程序加载器强制执行 . 在OS级别,只有可以设置不同保护位的存储器页面(如可执行,只读等),并且在此级别之上存在不同的可执行格式(如Linux中的ELF),其指定对程序存储器的不同部分的限制 .

    回到Lisp,据我所知,历史上,Lisp创建者使用S表达式格式,因为他们希望专注于语言的语义,将语法搁置一段时间 . 有一个计划最终为Lisp创建一些语法(参见M表达式),并且有一些基于Lisp的语言有更多的语法,比如Dylan . 但总的来说,Lisp社区已经达成共识,S表达式的好处超过了他们的缺点,所以他们卡住了 .

    关于代码作为数据,这并不严格地绑定到S表达式,因为其他代码也可以被视为数据 . 整个方法称为元编程,并且由不同级别和不同机制支持多种语言 . 支持 eval (Perl,JavaScript,Python)的每种语言都允许将代码视为数据,只是表示几乎总是一个字符串,而在Lisp中它是一个树,它更方便,更方便高级内容,如宏 .

相关问题