Programming languages “这是什么意思?”;Lisp可以自己编写吗;

Programming languages “这是什么意思?”;Lisp可以自己编写吗;,programming-languages,lisp,Programming Languages,Lisp,保罗·格雷厄姆(Paul Graham)写道,但这对我来说似乎一点也不不同寻常或确定 ISTM认为一种编程语言是由两件事定义的:它的编译器或解释器,通过fiat定义该语言的语法和语义;它的标准库,在很大程度上定义了熟练用户在用该语言编写代码时将使用的习惯用法和技术 除了一些特殊的例外,(例如,.NET家族的非C#成员),大多数语言的标准库都是用这种语言编写的,这有两个很好的理由:因为它将共享相同的语法定义、函数调用约定和语言的一般“外观”,因为可能为编程语言编写标准库的人是它的用户,尤其是它的设

保罗·格雷厄姆(Paul Graham)写道,但这对我来说似乎一点也不不同寻常或确定

ISTM认为一种编程语言是由两件事定义的:它的编译器或解释器,通过fiat定义该语言的语法和语义;它的标准库,在很大程度上定义了熟练用户在用该语言编写代码时将使用的习惯用法和技术

除了一些特殊的例外,(例如,.NET家族的非C#成员),大多数语言的标准库都是用这种语言编写的,这有两个很好的理由:因为它将共享相同的语法定义、函数调用约定和语言的一般“外观”,因为可能为编程语言编写标准库的人是它的用户,尤其是它的设计者。因此,这里没有什么独特之处;这很标准

再说一次,语言的编译器本身并没有什么独特或不寻常的地方。C编译器是用C编写的。Pascal编译器是用Pascal编写的。Mono的C#编译器是用C#编写的。见鬼,甚至有“自己编写”的实现


那么,Lisp本身编写的不寻常意味着什么呢?

Paul的意思可能是,Lisp语法作为Lisp值的表示是标准化和普遍的。也就是说,Lisp程序只是一种特殊的S表达式,编写操纵Lisp代码的Lisp代码非常容易。用Lisp编写一个Lisp解释器是一个特例,它不如对代码和数据具有统一表示的一般能力那么令人兴奋。

好吧,您提供的链接确实说明,如果您继续阅读,他将详细回答您的问题

Lisp的不寻常之处——在 事实上,Lisp的定义质量-- 就是它可以自己写。 去理解麦卡锡的意思 这个,我们要追溯他的路线 步骤,用他的数学符号 转换为运行公共Lisp 代码


我刚刚删除了一个很长的回复,这可能在这里是不合适的

但请考虑:

  • LISP没有“语法”(1),如果你的意思是它对 像C/Java/Pascal这样的语言。。。有一个(初始但可自定义) 通用LISP读取器的语法,但这是另一回事(LISP 格雷厄姆所说的不是常见的口齿不清,而读者是 不是LISP语言,只是一个过程)。 类似于“(lambda(x)(*x2))的代码是而不是LISP代码, 但是,例如CL标准读取器可以转换为LISP代码的文本

  • LISP不仅可以用LISP编写(如果你指的是“引导”能力) 但是它实际上是这样产生的。第一次实施 20世纪50年代末,eval的版本是用LISP语言写在纸上的,然后转换为 手动转换为机器语言(2):LISP最初只是一个纯理论的想法,而不是 打算实施的。我不知道其他的计算机语言 那条路。例如,C++被认为是C编译器的预处理器。 并且是用C编写的,它不是C++程序,后来转换成C要 能够运行它

  • LISP在许多其他方面都有很大的不同,我认为掌握它的最好方法是实际实现一个玩具LISP解释器(这项工作比想象的要小,特别是如果你的“机器语言”是像Python这样的高级动态类型语言的话)

    (1) 实际上,LISP中有两个预定义的语法级别;第一个是读取器的语法,即定义源字符如何转换为s表达式的规则,第二个定义编译器在生成实际机器代码时如何理解s表达式的规则。但是如果LISP中有两个语法级别,那么为什么说LISP没有语法是正确的呢?原因是它们都不是固定的。例如,第一级由标准的公共lisp读取器使用“读取表”进行处理,可以自定义“读取表”,以便在源代码中找到某个字符时执行代码。第二级可以使用宏、符号宏和编译器宏进行自定义,这允许定义新的语法结构。换句话说,LISP没有固定的语法,可以编写一个以标准LISP开头的LISP程序,过一段时间,它就与Python完全相同了(我不是在编这个,有(was)作为混合源代码模式,cl-python实现完全支持这一点:任何以开括号开头的内容都可以使用LISP语法,其他字符可以使用python语法)


    (2) 在这本书中,你可以看到麦卡锡如何描述
    eval[e,a]
    首先作为一个有趣的理论结果(比通用图灵机更简洁的“通用函数”实现)出现在纸上,而当时该小组正在构建的Lisp语言只有数据结构和基本的本机函数。这个手写函数是由S.R.Russell在机器代码中手工实现的,并开始作为第一个Lisp解释器为他们服务。

    他并不是说Lisp可以用来编写Lisp编译器。他说这种语言是由它自己的数据结构组成的。因此,虽然不能用C数据结构构建C函数,但可以用Lisp实现。一个程序是由计算机执行的列表组成的,这些列表的作用是创建其他列表,然后执行这些列表,这些列表的作用是创建更多要执行的列表。C没有这个属性。例如,C代码不能处理自己的代码。

    主要思想是Lisp语言有一个非常小的内核,包含少量函数和