it-swarm.cn

为什么LISP没有更普遍?

我开始通过SICP视频学习Scheme,接下来我想转到Common LISP。

这种语言似乎非常有趣,并且大多数使用该语言编写书籍的人都主张它具有无与伦比的表达能力。 CL似乎有一个不错的标准库。

为什么LISP不会普及?如果确实如此强大,人们应该在各处使用它,但是,几乎找不到诸如LISP的招聘广告。

我希望这不仅是括号,因为一段时间后它们不是一个大问题。

50
Andrea

表达能力并不总是积极的语言特质在公司环境中。 Java之所以非常受欢迎,部分原因是它易于学习,易于编写和易于阅读。平庸的程序员即使在代码冗长且笨拙的Java中仍然可以非常高效地工作。

此外,很容易滥用表达语言。专家Java程序员可以快速地重构写得不好的代码。语言越富表现力,就越难理解和重构可怕的代码。)LISP宏就是一个很好的例子。宏是正确的强大工具。如果使用不当,可能会导致混乱和难以调试的代码。

LISP是一个冒险的选择对于高级管理层。如果出现问题,没有人会指责管理人员选择由甲骨文或微软等大型公司支持的流行的面向对象语言。雇用具有流行,易学的语言经验的程序员要容易得多。

即使是愿意使用功能更强大的语言的进步型公司通常也不会选择LISP。这是因为许多较新的语言都试图通过借鉴LISP的强大功能来妥协,而同时保持易于大众学习。 Scala和Ruby遵循此模型。不良的程序员可以迅速将它们拿起,并继续编写与Java中相同的普通代码。好的程序员可以利用这一优势。的高级功能来编写漂亮的代码。

无问题,不是问题。 Haskell是一种功能强大且表现力强的语言,其语法类似于Python或Ruby出于与LISP相同的许多原因而未被广泛采用。

尽管如此,我希望...

Clojure有机会变得流行。它在JVM上运行,与Java互操作性强,并发编程更加简单。这些对许多公司来说都是重要的事情。

*这是我作为专业JVM程序员的观点,具有Java,Clojure,JRuby和Scala的经验。

70
dbyrne

为什么LISP没有更普遍?如果确实如此强大,人们应该遍地使用它,

如果您认为选择语言是因为其技术优势,那么您将感到非常失望。

此类决策是基于 汽提器和牛排 做出的。微软可以负担得起。甲骨文可以。 Sun花了很多钱大肆宣传Java他们破产了。两次。分散的,异质的志愿者社区无法与之抗衡。

但实际上,几乎找不到LISP招聘广告。

有趣的是,LISP公司的说法恰恰相反:他们不断有工作空缺,但找不到足够的人来填补这些空缺。 (这同样适用于Haskell,ML,O'Caml,Forth,Smalltalk等)

17
Jörg W Mittag

我没有在一家真正的公司工作的经验,但是我知道为什么LISP一直难以使用。

首先,这使我想起了这篇博客文章: http://steve-yegge.blogspot.com/2006/04/LISP-is-not-acceptable-LISP.html

我对LISP的主要问题是“哪个LISP”问题。我通常在Linux上作为我的主要平台,但是我所做的事情需要与Windows兼容。这意味着当我评估要使用的技术时,在两个截然不同的操作系统上工作时,必须使我的生活变得轻松。我不喜欢此要求,但可以在实际的项目中使用它。现在,对于我自己的个人项目,我将使用Windows上没有很好支持的语言,但是由于我没有机会在其中编写大型软件项目,因此我没有必要的经验。

现在,当我尝试学习一种功能语言时,我真的很想学习Common LISP。这似乎是正确的做法。因为我真的不了解内置功能,并且需要在LISP中工作的项目,所以我开始阅读《实用通用LISP》作为起点。 S表达式既美观又轻松。所有这些括号对我来说都是令人难以置信的美丽,因为当天很清楚代码中到底发生了什么。

因此,我尝试在本书之外用LISP编写我的第一个程序。我想要一个命令行工具,可以对代码行进行计数,并从代码计数中删除琐碎的行。不是最有用的工具,但很有趣。它涉及文件访问,一些解析和计数。我大约一周前在Python中实现了相同的工具。

我需要访问命令行参数。然后,我了解没有获取命令行参数的标准方法。它们都是非标准功能。它根本不是跨平台的。由于该语言没有内置很多库,因此从那里开始大多变得更糟。我最终改用Haskell,并且对Common LISP的了解并不多(因此我的投诉甚至可能无效)。

过去,这种非标准的事情一直令我痛苦。 C++也有同样的问题,但是使用Boost等库可以解决这些弱点。

除S表达式之外的所有其他内容的LISP语法也有点难看,这也无济于事。

9
jsternberg

IMO,这主要是由于:

  • 库支持差。当然,现在有了Quicklisp,可以很容易地安装库,但是并不能弥补仍然很少的库,而且很多库的文档记录不当或维护得不好。与Python相比,编写非平凡的LISP应用程序(无论使用哪种方言)很有可能仍会涉及至少重新发明一两个轮子的一部分。
  • 缺乏对开发工具所采用的模型的了解。我认识的大多数人都对必须使用SLIME和Emacs感到非常恐惧,这对于习惯Eclipse和Visual Studio的人们是可以理解的。我认为有两个Eclipse插件,几年前我只尝试了其中的一个,这相当麻烦。整个LISP生态系统看起来像是处于成熟的LISP运行系统的一部分和另一种语言的现代标准之间的一半。学习LISP不仅限于学习新语言-您还需要学习一种完全不同的工作和思维方式,虽然这是一种业余爱好,这是可以的,但值得一提的是,这值得怀疑。商业。

不过,情况似乎开始好转,尤其是随着Clojure的到来。

8
donkey_lz

我十亿年前在大学里学习过LISP。

LISP和FORTH一样,对于逻辑也很重要。但是大多数编程不是关于逻辑,而是关于以无聊的机械方式操纵数据。例如,当时没有办法右对齐数字输出。

LISP是关于嵌套功能的,人们只是不这么认为。他们从DO A,B,C,D,然后从E的角度考虑。不做A,这涉及到B和C,然后是D和E。这涉及一种令人困惑的并发。除了诸如“提交所得税申报表”之类的预定义任务外,人们不会同时考虑,而是顺序考虑。这就是为什么程序语言在当今占主导地位。

结果,程序代码liks Java并且C可以轻松地翻译成英语。LISP代码不能;没有以这种方式构造人类语言。

因此,这对于解决问题非常有用,但是解决问题在编程中不是很重要。数据输入,验证,输出格式,所有这些LISP都非常薄弱。

5
Andy Canfield

我认为LISP尚未提及的一个问题是,对于一个普通的或新手程序员(像我一样,我自由地承认),我很难看到如何将LISP代码变成一个大型程序。它很容易编写,但很难构造。我认为任何概念都不是特别困难,但是DIY的心态是如此之强,以至于我什至感到迷茫。

使用OOPJava或C#)这样的语言,您可以使用类型系统将自己推向工作模型,并以此为基础建立模型。使用LISP(或Lua,或者说Javascript)是一种想法,您可以按照自己的方式去做,如果想要OOP,只需创建自己的OOP系统!在获得可用的程序之前,OOP或学习别人的语言是语言之上的新障碍。另外,我总是觉得OOP在LISP或Lua中并不存在,就像我一样)如果我真的想要的话可​​以忽略它,那有什么意义呢?

简而言之,我认为LISP中的编程需要大量的纪律,这很难做到。强类型语言和OOP)语言都提供一种内置的学科,因此程序员可以将有限的精力集中在完成项目上,而不必调整语言。

编辑:打个比方,这让我很震惊,就像您需要做一些木工,两个人为您提供工具箱。一个人的工具有点笨拙,但是基本上可以通过一点努力就可以完成工作。另一个人有很多零件,但希望您可以将这些零件组合在一起,以制造出您将要使用的最佳工具,以最适合您的握柄并达到最佳质量。您只需要先构建它们。

5
CodexArcanum

我一直想知道相同的地方,甚至去参加LISP会议,试图了解什么使LISP的“阴暗面”使所有人无法采用。

我没有找到完整的像样的答案。

无知可能是缺少受欢迎程度的原因,但令我更加困扰的是,即使是那些肯定知道LISP的人(例如Google-Peter Norvig为他们工作)也没有使用它。

我想出的唯一的部分解释是,大多数LISP好主意现在已经司空见惯,唯一真正重要的缺失点(即一个非常重要的IMO)是元编程的简易性。

不幸的是,我认为没有一种简单的方法可以将这个概念吸收到其他语言中,因为要使Nice的元编程需要一种谐音和规则的语言(我说的是通用元编程,而不是仅精简模板的版本)。换句话说,它基本上需要LISP语法:代码是数据,数据是代码。用操作AST)的语法丰富的语言编写代码更加困难,因为您需要了解两种语言:如何编写代码和如何编写AST。 AST是固定的,并且复杂且不规则,具有许多不同的节点类型。LISP具有相当合理的规则(且可扩展!)AST通过直接编写AST代码。

元编程从本质上讲也更加困难(元元编程甚至更多),并且大多数程序员和管理人员显然只喜欢“没人需要”答案。

我感到特别难过的是,诸如go之类的“新”语言最终在需要时使用基于文本的元编程(编写文本文件的外部代码生成器)和“魔术”(即,编译器可以做程序员不能做的事情) 。

我认为解决复杂性问题的方法是强大的工具和培训。趋势显然是工具变钝,并且不存在该问题。

2
6502

看来,即使CL也没有很好的库支持。至少根据从LISP切换到Python的人的说法:

http://www.redmountainsw.com/wordpress/archives/reddit-switches-from-LISP-to-python

就我个人而言,我了解一些Scheme并乐于使用它,但是无法想象使用该语言进行一项非平凡的项目。

1
Nemanja Trifunovic

强大不一定意味着广泛使用。您是否听说过“针对常见情况进行优化”一词?不幸的是,正如许多人在平庸之前所说的那样,如果人们能始终如一地得到保证,那要比在两者之间存在很多失败的重大事件要好得多。

LISP不仅如此,而且许多技术也是如此。与Unix文本处理工具awk,sed和Perl的良好结合可以节省您的编程时间。不幸的是,我已经看到人们花几天时间在其他工具中执行此类任务非常糟糕,而在几分钟之内使用这些工具可以更有效地完成这些任务。但是,如果一生都在Eclipse中度过,他将永远不会欣赏这些东西的价值。您可能会编写一个具有可读性和可维护性的大型程序,但是编写这样一个程序而不是编写它的全部目的很容易就能完成工作。

如今,在设计工具时的另一方面是,直接使用它们来解决问题对他们来说非常有用。您不能构建太通用的东西,然后说您将通过库和框架对所有这些东西进行套期保值。用这种方法很难解决问题。好的工具可以很好地解决环境和周围的问题。这就是为什么php,Perl和awk之类的工具尽管无休止地拖拖拉拉,但仍然保持着相关性的原因,因为它们太有用了以至于无法丢弃它们,而且它们通常比带有许多库和框架的通用语言还要做很多工作。

同样,您会看到Java/Python之类的语言非常出色,我将对某些任务说得最好。 Python特别好,而且易于学习和编写。如果您的数据端点是标准的,那么这些语言的确非常好。某种数据库或XML或此类数据。基本上结构化数据。

LISP将存在很长时间,但不一定广泛存在。正如您将看到的,每种工具都有自己的细分市场。他们可以很好地解决某些问题。我认为并且可以肯定LISP在其计划可以很好解决的领域和问题上表现良好。

1
kamaal

对于使用LISP方言的Web开发,可能会遇到一些“鸡与蛋”的问题-因为很少有人使用LISP,主机要么不允许使用LISP,要么使它变得不容易,并且因为它不容易,所以很少有人用它。但是,实际上,在主机上运行LISP可能比您想象的要容易,即使它需要比现成的PHP服务需要更多的工作。 guile 方案应用程序可以工作 这里 只需一点努力。

1
gcbenison

IMO,这主要是时机不佳的问题:LISP很久以前(并且就其定义而言,几乎不再令人兴奋)早在它对大多数人或用途变得实用之前就已经存在。 Clojure(例如)的机会要大得多。它的成功将更多地依赖于被视为新的,时尚的和酷的,而不是与Java(以及在JVM上运行的所有其他程序))互操作那样实用的东西。

0
Jerry Coffin