为什么用Lisp学习Lisp口译员如此重要?


30

我已经看到了许多针对新程序员的CS课程和学习建议,呼吁有抱负的程序员学习专门用Lisp编写的Lisp解释器。所有这些站点都表示类似以下内容:“具有智力上的启示”,“这是每个认真的程序员应有的启发经验”或“它向您展示了硬件/软件的关系”以及其他含糊的陈述,尤其是本文摘自这个著名的方法

我的问题的普遍看法是,lisp如何实现上述目标,为什么选择lisp?为什么不使用其他语言?

我之所以这样问是因为我刚刚完成了使用scheme编写的方案解释器(摘自SICP http://mitpress.mit.edu/sicp/),现在我正在使用scheme编写python解释器,而我正努力地拥有这个传奇的顿悟那应该专门来自前者。我正在寻找两种语言之间的具体技术细节,我可以在他们的方案解释器中利用它们来了解程序的工作方式。

进一步来说:

为什么对以其所解释的语言编写的解释器进行研究如此强调-是将原始语言和所构建的语言保持直觉仅仅是一项伟大的心理锻炼,还是存在只能根据其本质找到解决方案的特定问题?原始语言?

Lisp口译员如何为未来的软件设计展示良好的体系结构概念?

如果我使用其他语言(如C ++或Java)进行此练习,会错过什么?

什么是最常用的,从这个练习外卖或“心理工具”?**

**我选择我做,因为我的答案已经注意到,我已经从这个练习更多的技巧获得了在我的脑海设计解析工具,比其他任何一个工具,我想找到解析,可能对计划更好的工作,不同的方法解释器比python解释器。



4
@gnat并非完全是职业建议,更多的是“关于Lisp有什么好处”的问题。
罗伯特·哈维2014年

1
@RobertHarvey这个联系不仅是为了职业,也是为了教育建议,我的意思是。但是,很好,Lisp太好了也很合适
gna

1
您似乎在问您将从特定的练习中学到什么。沉默寡言是懒惰的标志,这是任何优秀程序员的关键,但无论找出要从练习中学到什么的唯一方法,就是去做并看看。没有人能告诉你从中学到的东西,你只需要做。
Jimmy Hoffa '04

2
虽然这个问题与整个教育有关,但我不会将其归类为“我应该学习哪种语言?”的“教育建议”。是。也就是说,它并不特定于某种课程或工作。实际上,如果您减少了一些教育术语,那么这将是一个关于整体编程语言的问题,其答案将讨论语言功能。它实际上也不是专门针对Lisp,而是可以应用于xslt等其他谐音语言。所以我不会说这是一个完美的问题,只是它不是简单的 “职业咨询”。
TheRubberDuck

Answers:


17

冒着给出“我也是”答案的风险,如果尝试尝试,您会看到...

如果您学习计算机语言,则可能会感到它至少是解析的一半。如果您学习Lisp,您将意识到解析表面语法无非是给不喜欢很多令人讨厌的单括号的人(像我们大多数人)那样方便。

然后,您可以意识到为此付出了高昂的代价。在Lisp中,一个程序构建另一个程序并执行它很简单。在其他语言中,这是一种高级技术,例如在罗马数字中进行乘法。

当然,几乎每个人都会问“谁需要这样做?” 好吧,您很可能会看到它打开了您甚至从未意识到自己以前做不到的事情的全部视野。您可以使用其他语言来完成此操作,但并非那么容易。

插入以回答Izkata评论:

  • SHRDLU自然语言理解程序通过将英语陈述或问题翻译成Lisp方言中称为MICRO-PLANNER的程序并执行该程序来工作。
  • 操作程序(例如简化程序或证明程序正确)的程序自然是用Lisp编写的。
  • 我在程序中使用程序生成来理解视觉场景,该场景必须处理3维对象中所有的对称性,而无需增加代码。
  • 与逻辑和定理证明有关的任何事情都在操纵逻辑表达式,这是程序的一种形式。
  • 符号数学,例如符号积分或微积分,涉及操纵数学表达式,就像微型程序一样。
  • 在Lisp中,任何涉及代码生成的问题,或更高级的术语“部分评估”,都是很自然的。很久以前,我是针对数据库桥接程序执行此操作的。我是用C语言完成的,这不像Lisp那样容易,但是我从Lisp那里得到了这个主意。那被认为是当时几乎没有人能做的技术(特别是COBOL头)。我希望现在也许更多。

...只是几个...

然后,您会意识到今天被认为是“现代”的某些东西在Lisp中已经使用了40多年了。就像函数式编程一样。就像垃圾收集一样。像闭包。

这并不是说现代语言没有新的好主意,例如OOP等。但是,如果您学习Lisp,它将扩大您的视野。


You can do it in other languages, but not nearly so easily.- 喜欢?(对我来说,问题似乎是因为经常发表这样的声明,但几乎从来没有变得更加具体)
Izkata 2014年

当我意识到javascript可以打印它自己的源代码并且可以遍历对象以获得可以证明为对象常量的字符串常量时,我​​首先以为世界发生了革命。然后我意识到Perl与$ Data :: Dumper :: Deparse一起拥有了这一切,然后我意识到lisp永远拥有了这一切。理解口译员可以释放始终存在的构建生活模块的能力,并且在Lisp中,这比任何其他语言都更容易获得。
德米特里

有趣的是,Lisp程序员意识到Lisps的内部结构始终可以使自己的Lisp前端成为从javascript到bash或perl或python的任何动态语言;lisp很好地从可用环境引导。
德米特里

19

您问题的简单答案是尝试Lisp,最好与SICP结合使用。然后,您将得到启发。

那个...

代码就是数据
大多数语言在代码和数据之间做出了鲜明的区分。Lisp没有。例如,这使得可以用Lisp轻松编写Lisp解析器,并在Lisp中操纵Lisp代码。我发现的对这种启示的最好描述是Lisp的本性

之所以如此,部分是因为该语言的语法非常简单。它使Lisp可能的事情(例如元编程)在其他语言中是不切实际的,因为语法妨碍了它。

深入阅读
超越平均水平


3
第二段没有意义:谐音!=简单语法; 简单的语法使使用任何语言编写Lisp解析器变得容易(请参阅参考资料)。第三段含糊,需要示例。

@MattFenwick确实可以通过复杂的语法实现同音,但这将是极其困难的。可以公平地假设,如果您要处理的是谐音语法,那么它就会变得很简单,只要其所要求的一致性除了其他原因之外,它就比非谐音语法更加无效率地易于遵循。尽管您的第二点很不错,但是LISP易于解析,因为它的语法很简单,而不是因为谐音(即使谐音是造成这种简单的原因)
Jimmy Hoffa 2014年

1
无论如何,获取数据值并将其解释为程序几乎没有开销。这是一件好事。当您要做的就是为配置数据编写解释器时,通过配置进行编程就很简单。高级数学转换(在有状态语言中很难实现)通常被“简化”为Lisp的纯片段的单纯语法转换。
nomen 2014年

1
@MattFenwick:我从回答中删除了“同音”一词。
罗伯特·哈维

1
我希望我能给《 The Lisp of Lisp》带来+1以上的收益;我从未见过如此出色的解释。
2014年

9

为什么对以口译语言编写的口译研究如此强调?

通常,学习口译员可以使您深入了解其语言和功能。通常,以编程语言学习代码就像通过听和读来练习口语:它使您熟悉该语言可以做什么,如何使用它以及常见的“成语”。更具体地说,Lisp是一种谐音语言,这意味着它的表达式语法与数据的语法相同。用Lisp编写代码看起来非常像您要编写列表,反之亦然。因此,用Lisp代码解释Lisp代码就像使用car和遍历列表一样简单cdr

我应该如何利用此练习从概念上充分利用它?

想一想解释器将如何解释自己-在许多元循环解释器实现中(其中谐音语言会自我解释)可以“通过”该函数。例如,要实现car,只需采用car参数的。这将重点从数据存储机制转移到功能上。

Lisp口译员如何为未来的软件设计展示良好的体系结构概念?

口译员可能非常复杂,这会鼓励他们设计优秀的体系结构。考虑到这一点,这一点更多地取决于个人口译员。

如果我使用其他语言(如C ++或Java)进行此练习,会错过什么?

这些语言不是谐音的,因此它们不会从元循环Lisp解释器的优雅和简单中受益。这使练习变得更加困难,甚至可能变得不那么普遍了,但是我不会说这样做实际上没有什么好处。

此练习中最常用的外卖或“心理工具”是什么?

我不确定这个答案是否正确;很简单,这有助于了解解释程序的工作原理,也许更重要的是,可以对其进行修补,以了解如何轻松实现对语言的微小更改。


5

LISP本身的结构使其解析起来非常容易。如果您尝试编写一个编译器,您会注意到,如果语言中的所有内容都是一种表达方式并且含糊不清,那么它会容易得多。LISP会在所有位置强制使用括号以消除歧义,并且没有语句,只有表达式。

LISP易于解析这一事实鼓励用户解析自己的源代码并对其进行魔术。数据和代码之间的界线变得模糊,您可以轻松地执行通常需要付出很多努力的事情,例如反射,动态代码重写,插件和序列化。

这就是要旨。该练习可能旨在让您深入了解当代码很容易从其自身进行解析时可能发生的情况。


并不是Lisp易于解析。S表达式易于解析。除此之外,您还需要解析Lisp。
Rainer Joswig 2014年

@Rainer:那不是挑剔吗?在我的世界中,解析意味着从文本到AST,这对于解释命令一无所获。
2014年

在C ++中,解析器将检测语法错误的函数声明。在Lisp中没有。读者对Lisp编程语言一无所知。C ++解析器了解完整的C ++语法。Lisp阅读器只知道s表达式。
Rainer Joswig 2014年

啊,那我明白你的意思了。是的,尽管我仍然认为,简单的Lisp评估器比简单的c ++评估器更容易构造。那就是他们在SICP中所做的,不是吗(自从我读了一段时间以来)?
2014年

SICP中使用的语言非常简单,甚至没有完整的Scheme。像C这样的小型语言的解释器也应该很简单。C ++很大。它的一些困难来自相对大量的内置语法。在典型的Lisp系统中,许多语法都是使用宏构建的-解释器之外。宏为源转换实现语法和扩展机制。这使核心更小。但是宏可能很大。例如,LOOP构造的实现具有2000行以上的复杂宏代码。
2014年

4

我不确定这对每个人是否真的重要。您可以在不了解Lisp解释器如何工作的情况下成为成功的开发人员。在学习计算机科学时,应该学习Lisp的基本思想。

Lisp解释器对于Lisp程序员很重要。他们需要了解解释器([和编译器] 1)的工作原理,以充分了解如何使用该语言。

Lisp解释器通常用作计算机科学的工具来教给学生一些知识:

作为一种教学设备,Lisp口译员很有帮助,因为可以在短时间内学会和理解它。由于很少有学生了解Lisp,因此在学习上述概念时,他们处于一个平等的领域。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.