Lisp显然是AI方面的优势,但是对我而言,Lisp的速度似乎不比Java,C#甚至C都快。我不是Lisp的高手,但我发现很难理解它的优势人们会用Lisp编写商业软件。
但是,它被认为是黑客的语言。
保罗·格雷厄姆(Paul Graham)为什么提倡Lisp?为什么ITA Software选择Lisp而不是其他高级语言?这些语言有什么价值?
Lisp显然是AI方面的优势,但是对我而言,Lisp的速度似乎不比Java,C#甚至C都快。我不是Lisp的高手,但我发现很难理解它的优势人们会用Lisp编写商业软件。
但是,它被认为是黑客的语言。
保罗·格雷厄姆(Paul Graham)为什么提倡Lisp?为什么ITA Software选择Lisp而不是其他高级语言?这些语言有什么价值?
Answers:
我要努力胜任Common Lisp的原因有几个。
可以说,选择Common Lisp的唯一真正原因是标准库已过时。
我会大胆地说,在一般情况下,语法对于专业软件工作者来说应该不成问题。
我喜欢Lisp,因为它
编程与复杂性作斗争。抽象是克服日益增加的复杂性(具有非常有限且恒定的头骨尺寸)的唯一有效工具。使用Lisp管理抽象就像拥有一个n + 1个愿望的精灵。
(+ 1 n)
理想,还是更好的实用性(incf n)
?
我相信正确的Lisp答案更符合基因组学。诸如:“如果必须要问,您还没有准备好。”
然后,如果有人进一步提出疑问,则正确答案是“是”(如果是一个/或一个问题)或“您尚未准备好”。
我认为所有人都提到的Lisp在人工智能(AI)领域的优势有点历史性的意外... Lisp最初是在AI中使用的,但它是一种通用语言。
我相信执行速度不是语言的唯一重要方面(不过我曾经做过一次)。但是,我喜欢Lisp的方面之一是对我来说,它将Python和C结合在一起。我可以立即开始编写没有声明的代码,并立即快速原型化(运行时和REPL对于此非常重要)。运行完某些内容后,我会逐渐添加类型声明并“优化”我的代码。按下SLIME中的键并查看为我感兴趣的功能生成的机器语言真是一个奇迹。在Python中,没有类型声明,因此无法获得更快的速度,但是在C中,快速完成所有操作是更加痛苦。Lisp在这种情况下非常有用。
话虽如此,我之所以喜欢Lisp,主要是因为宏。当您最终了解了宏可以实现的功能后,我认为您很容易忍受括号。此外,像Emacs这样的编辑器自己管理括号,因此您不必这样做。但是,我承认,起初我并没有发现所有的括号都不好,而且我知道有些人无法忍受。但是由于宏的全部目的是在编译时生成代码,因此Lisp中的代码使用标准的数据结构,并且括号只是将代码表示为列表,这对于使宏易于编写是必需的。
我不知道可以使用Lisp轻松编写其他一些小语言来更好地描述您的问题的其他语言。这就是保罗·格雷厄姆(Paul Graham)在击败平均水平中谈到的优势。这是极端的模块化和简洁性。在Java中,我必须写很多原始文本来表达一个想法。在Lisp中,我可以编写一些自动生成该代码的宏,然后再使用这些宏。无论如何,您必须了解一些示例,然后自己判断。当我“看到”它时,我被震撼了,仅出于这个原因,我仍然认为Lisp是最出色的语言。我一直在寻找主流语言中的宏,以查看它们是否与Lisp宏的功能相匹配,但是到目前为止,我还没有找到任何宏。第四位紧随其后。
最后,我将对商业软件提出一些批评:
商业软件需要库,也需要好的库,而Lisp在这方面并不擅长。我通常不需要它们,但是当我这样做时,我必须从少数人使用的一些不完整软件中进行选择。我应该解决这个问题,我想...
商业软件通常是由大批人构建的,我认为宏可能会阻碍通信,因为宏会改变语言。即使程序文本更长且更具重复性,许多程序员也更愿意检测代码中的某些模式。我想在ITA他们有一些有关宏的规则,或者它们有一个庞大的宏库使协作变得容易(或更简单地说,所有程序员都是Lisp专家)。
我不喜欢Lisp。
(我确实喜欢它使用的许多概念,如何使本机可用的强大技术等等。
但是我从来没有说过要真正使用它((即使有几个人已经尝试过),因为该语言的好处可以通过其他编程语言(一些直接或间接)实现,所以没有足够的好处让我花时间学习它并忍受可怕的语法。)))
但是,是的,出于某些人喜欢的原因,请检查以下堆栈溢出问题:
与此相关的问题中可能还有更多。
我将把“ Lisp”解释为“ Common Lisp ”;我毫不怀疑其他答案会说“ 计划 ”。(提示:Lisp是一门语言。)
“更快”是什么意思?就运行基准测试所花费的时间而言,不,它不比C快(但可以)。
“快速”方面的问题是,Joe Random Hacker花了多长时间编写一个正常运行的程序或修复了大型软件系统中的错误?几乎可以确定。
对于这个黑客,我之所以使用它是因为我想编写代码,而不是样板。我想只写一次,而不要不断重复自己。而且我想在编写程序时与程序进行交互。
M-x eval-region
(或eval-buffer
),仅此而已。
C-j
(在道德上等同于enter),它将立即生效。
问题是力量。功率=工作(程序功能)/时间
“我们并没有赢得Lisp程序员的青睐;我们追求的是C ++程序员。我们设法将其中许多人拖到Lisp的中间。”
-Java规范合著者Guy Steele
在C ++和Java之间绘制某种曲线。继续前进,沿路线的某个点您会发现Lisp。
保罗•格雷厄姆(Paul Graham)自己在“使Lisp与众不同的原因”中回答了这个问题。
请记住,他是在1990年代中期将其用于创业的,因此Python和Ruby在那时还没有真正成熟(甚至可能还没有诞生)。
Lisp基本上具有动态语言的所有优点,并且我认为对于当今的大多数Web应用程序,Python和Ruby都很棒,它们具有框架和文档以及活跃的社区的优点。
杀手级功能可能是整个程序都是由表达式组成的。这意味着您可以将一些代码块传递给函数(或宏...),因为代码块不过是一个表达式。
Python并不完全具有此功能。您必须定义函数并传递它们。Ruby似乎有块,与Lisp可以做的相比,也许有些局限(我不确定)。
过去,我对Scheme有过分的反应,但现在我可以试一试 Lisp(实际上是Clojure)。
您会看到,多年来,我学习了Java,C#,C ++,Python之类的语言,这些东西不再具有挑战性。
Clojure具有许多前景,看起来非常干净,并且可以解决许多实际问题。像Clojure这样的简洁语言的一个有力例证是多核计算机的出现。
是的LISP!
编辑:ITA软件是由MIT毕业生创建的,而Scheme / Lisp是许多MIT毕业生学习的唯一语言。公平地说,可以在正在运行的生产系统上热交换Lisp算法,这是一个巨大的优势。
INTERCAL
。挑战不是唯一标准。它也必须能够快速解决实际问题。至少Haskell被许多人使用和喜爱。
PLEASE
?
我喜欢Lisp的地方在于它超越了范式。有人会说Lisp是功能性的,其他人会说它是声明性的,其他人会说它是多范式的。我认为所有这些都错了。当您使用Lisp时,范式不再是约束。
想要对象吗?您可以拥有它们。需要函数式编程吗?你可以拥有它。是否需要Prolog风格的逻辑编程?写一些宏。是否需要SQL风格的声明式编程?去吧。是否要使用尚未发明的范例?我相信可以在Lisp中完成。
除了类似Forth的语言之外,我还没有看到另一种语言提供这种级别的灵活性。
衡量“更快”并非一件容易的事,它实际上取决于您基准测试的哪个方面。根据任务和Lisp的实现,速度可以接近C。查看“最佳基准大战”以深入了解细节。Lisp的SBCL实现与Java 6 Server相当,并且比Ruby或Python快得多。
但是,纯粹的速度并不是选择编程语言的主要原因-如果是这样,我们仍然会使用汇编语言进行编程,对吗?对我来说,Lisp的日常乐趣在于代码已被编译,但我不必关闭应用程序,重新编译所有内容,然后从头开始运行。相反,我可以更改一个函数,并且该更改将在所有地方生效,并且可以立即在应用程序中看到该效果。此外,这种非常快速的“编写,测试,编写更多,测试更多”方法使编写代码时立即进行前端测试变得更加容易(然后您可以稍后将这些交互式探针转换为单元测试)。
想象一下在每行之后写电子邮件的地方,您必须单击一个按钮将电子邮件输出编译到屏幕上,然后再继续思考。这就是用Java或其他类似语言编写的内容。有时候,这样做是有原因的,我喜欢Java,但Lisp的响应速度更快,并且更容易完成工作。
我学习Lisp(newLisp)的原因有两个。
原因一:Lisp使我有不同的想法,这使我成为更好的Ruby编码器。
用Lisp进行某些处理似乎很尴尬,例如嵌套迭代要遍历多个列表。因此,它迫使我使用其他东西,例如map
。我最喜欢的语言Ruby具有相同的映射方法,但我并不总是使用它,因为它并不熟悉:我学会了使用一种较差的技术来做事,并且当该语言支持该技术时,我会继续使用它。
原因之二:Lisp实用且拥有良好的现代图书馆。
有用于newLisp称为一个非常漂亮的,轻量级的Web框架蜻蜓。这使我可以使用newLisp代码而不是PHP来完成某些任务。我不太喜欢PHP,对于这个特定任务,newLisp比Ruby更有趣。
原因三:Lisp在语法和概念上是一致的。
对我来说,这是Ruby和Python之间的最大区别,即一致性。
一个吸引人的地方就是社区。自从该语言发明以来,Lisp就吸引了最有雄心和最聪明的开发人员。在研究人员试图解决尚未解决的问题的任何地方,您都可能会发现Lisp,例如人工智能(AI)研究,计算机视觉,计划,知识表示和复杂的启发式优化。该语言适合同时解决自下而上和自上而下的问题,这似乎有助于应对最艰巨的挑战。
通过宏的可扩展语法意味着几乎不需要扩展语言定义。Lisp只是一个宏而已,它需要以更受限的语言进行语言扩展的许多功能。因此,Lisp程序员可以自由使用新发明的语言概念,而无需使用新的语言标准,也不必真正提高速度。从根本上讲,通过少量扩展就无需大量样板代码。控制流中的全新思想,例如Prolog风格统一,可以有效,紧凑地实现为扩展。
就灵活性而言,OOP系统CLOS具有其自己的一类。领会到基本的C ++ / Java / C#OOP是非常困难的。GoF 5设计模式变得不必要,因为它们可以简单直接地表达。
该语言没有单一的公司所有者,也没有单一的最终实现,尽管它确实具有ANSI标准以及许多一致的实现。每十年就会出现重大的新实现,而旧的仍然很活跃。专家可以计划在很长一段时间内使用他们的专业知识。这的确引起了一些无政府主义的摩擦和社区的分裂,但是这也意味着,由于公司或项目的政治原因,地毯无法被拉开,语言也不会消亡。总是有多种商业和开放源代码实现正在研究中。更加注重性能的代码定期以最快,资金雄厚的命令式语言实现的2倍作为基准。
Lisp早期商业化的致命弱点是内存占用,以适应语言的类型安全功能和它们所包含的高级软件开发环境,并具有令人难以置信的功能,例如完整的在线文档(包括图形)。与8 MB Sun工作站相比,64 MB Symbolics Lisp计算机在成本上不可行。如今,RAM价格暴跌,并且Lisp语言引起了极大的兴趣,特别是考虑到当今主流的Java,C#和PHP语言在30年前的发展仅很小。
现在有与Lisp竞争的现代语言,可以与智能开发人员进行思想共享:Python,Lua,Erlang,Haskell和OCaml。但是,它们都没有提供相同的成熟度,适应性,多种符合标准的实现和速度的组合。