我开始通过SICP视频学习Scheme,接下来我想转到Common Lisp。
这种语言似乎非常有趣,并且大多数人为此写书都主张它具有无与伦比的表达能力。CL似乎有一个不错的标准库。
为什么Lisp不会更普遍?如果确实如此强大,人们应该到处使用它,但要找到Lisp招聘广告几乎是不可能的。
我希望这不仅是括号,因为一段时间后它们不是一个大问题。
我开始通过SICP视频学习Scheme,接下来我想转到Common Lisp。
这种语言似乎非常有趣,并且大多数人为此写书都主张它具有无与伦比的表达能力。CL似乎有一个不错的标准库。
为什么Lisp不会更普遍?如果确实如此强大,人们应该到处使用它,但要找到Lisp招聘广告几乎是不可能的。
我希望这不仅是括号,因为一段时间后它们不是一个大问题。
Answers:
在公司环境中,表达能力并不总是积极的语言特质。Java之所以非常流行,部分原因是它易于学习,易于编写和易于阅读。平庸的程序员在Java中仍然可以非常高效地工作,即使他们的代码冗长而乏味。
此外,很容易滥用表达语言。熟练的Java程序员可以快速重构不良代码。语言越富表现力,就越难理解和重构可怕的代码。LISP宏就是一个很好的例子。宏是正确的工具。如果使用不当,可能会导致混乱和难以调试的代码。
LISP是高级管理人员的冒险选择。如果出现问题,没有人会指责管理人员选择由甲骨文或微软等大型公司支持的流行的面向对象语言。雇用具有流行,易学的语言经验的程序员要容易得多。
即使是愿意使用功能更强大的语言的进步型公司通常也不会选择LISP。这是因为许多较新的语言都试图通过借鉴LISP的强大功能而妥协,而同时又易于大众学习。Scala和Ruby遵循此模型。糟糕的程序员可以迅速将它们拿起,并继续编写与Java中相同的普通代码。好的程序员可以利用更高级的功能来编写漂亮的代码。
括号不是问题。 Haskell是一种功能强大且具有表现力的语言,其语法类似于Python或Ruby,并且由于与LISP相同的许多原因而未被广泛采用。
尽管如此,我希望...
Clojure有机会变得流行。 它运行在JVM上,与Java互操作性强,并发编程更加简单。这些对许多公司来说都是重要的事情。
*这是我作为专业JVM程序员的观点,具有Java,Clojure,JRuby和Scala的经验。
为什么Lisp不会更普遍?如果确实如此强大,人们应该遍地使用它,
如果您认为选择语言是因为它们的技术优点,那么您将感到失望。
这些决定是基于脱衣舞娘和牛排。微软可以负担得起。甲骨文可以。Sun花了很多钱来炒作Java,以至于他们破产了。两次。分散的,异构的志愿者社区无法与之竞争。
但是相反,几乎找不到Lisp招聘广告。
有趣的是,Lisp公司的说法恰恰相反:他们不断有工作空缺,但找不到足够的人来填补他们。(这同样适用于Haskell,ML,O'Caml,Forth,Smalltalk等)
我没有在一家真正的公司工作的经验,但是我知道为什么LISP一直难以使用。
首先,这使我想起了这篇博客文章:http : //steve-yegge.blogspot.com/2006/04/lisp-is-not-acceptable-lisp.html
我对Lisp的主要问题是“哪个Lisp”问题。我通常在Linux上作为我的主要平台,但是我所做的事情需要与Windows兼容。这意味着,当我评估要使用的技术时,在两个截然不同的操作系统上工作时,必须使我的生活变得轻松。我不喜欢此要求,但可以在实际的项目中使用它。现在,对于我自己的个人项目,我将使用Windows上没有很好支持的语言,但是由于我没有机会在其中编写大型软件项目,因此我没有必要的经验。
现在,当我尝试学习一种功能语言时,我真的很想学习Common Lisp。这似乎是正确的做法。因为我真的不了解内置函数,并且需要一个在Lisp中进行工作的项目,所以我开始阅读《实用Common Lisp》作为起点。S表达式既美观又轻松。所有这些括号对我来说都是令人难以置信的美丽,因为当天很清楚代码中到底发生了什么。
因此,我尝试在本书之外用Lisp编写我的第一个程序。我想要一个命令行工具,可以对代码行进行计数,并从代码计数中删除琐碎的行。不是最有用的工具,但很有趣。它涉及文件访问,一些解析和计数。大约一周前,我已经在Python中实现了相同的工具。
我需要访问命令行参数。然后,我了解没有获取命令行参数的标准方法。它们都是非标准功能。它根本不是跨平台的。由于该语言没有内置很多库,因此从那里开始大多变得更糟。我最终转到了Haskell,并且对Common Lisp的了解并不多(因此我的投诉甚至可能无效)。
过去,这种非标准的事情一直令我痛苦。C ++也有同样的问题,但是使用Boost等库可以解决这些弱点。
Lisp语法除S表达式外的所有内容也很难看,这也无济于事。
IMO,这主要是由于:
不过,情况似乎开始好一些,尤其是随着Clojure的到来。
我十亿年前在大学里学习过LISP。
LISP和FORTH一样,对于逻辑也很重要。但是大多数编程不是关于逻辑,而是关于以无聊的机械方式操纵数据。例如,当时没有办法右对齐数字输出。
LISP是关于嵌套功能的,人们只是不这么认为。他们从DO A,B,C,D,然后从E的角度考虑。不做A,这涉及到B和C,然后是D和E。这涉及一种令人困惑的并发。除了诸如“提交所得税申报表”之类的预定义任务外,人们不会同时考虑,而是顺序考虑。这就是为什么程序语言在当今占主导地位。
结果,像Java和C这样的程序性代码可以轻松地翻译成英文。LISP代码不能;没有人类的语言以这种方式构成。
因此,这对于解决问题非常有用,但是解决问题在编程中不是很重要。数据输入,验证,输出格式,所有这些LISP都非常薄弱。
我认为Lisp尚未提到的一个问题是,对于一个中等或新手程序员(像我一样,我很自由地承认),我很难理解如何将Lisp代码变成一个大型程序。它很容易编写,但很难构造。我认为任何概念都不是特别困难,但是DIY的心态是如此之强,以至于我什至感到迷茫。
使用Java或C#之类的OOP语言,您可以使用类型系统将自己提升为工作模型,并以此为基础。使用Lisp(或Lua或Javascript)时,您会想到可以随心所欲地进行操作。如果要使用OOP,只需创建自己的OOP系统!在获得可用的程序之前,除了编写自己的OOP或学习别人的OOP之外,这是该语言之上的新障碍。另外,我总是觉得Lisp或Lua中的OOP并不真正存在,就像我真的想要的时候可以忽略它一样,那又有什么意义呢?
简而言之,我认为使用Lisp进行编程需要大量的纪律,这很难做到。强类型语言和OOP语言都提供了一种内置的学科,因此程序员可以将有限的精力集中在完成项目上,而无需调整语言。
编辑:打个比方,这让我很震惊,就像您需要做一些木工,两个人为您提供工具箱。一个人的工具有点笨拙,但是基本上可以通过一点努力就可以完成工作。另一个人有很多零件,但希望您可以将这些零件组合在一起,以制造出您将要使用的最佳工具,以最适合您的握柄并达到最佳质量。您只需要先构建它们。
我一直想知道相同的地方,甚至去Lisp会议尝试了解什么是Lisp的“黑暗面”,使每个人都无法采用它。
我没有找到完整的答案。
无知可能是缺少受欢迎程度的原因,但令我更加困扰的是,即使是那些肯定了解Lisp的人(例如Google-Peter Norvig为他们工作)也没有使用它。
我想出的唯一的部分解释是,大多数Lisp伟大的思想现在已经司空见惯,唯一真正重要的缺失思想(一个非常重要的IMO)是元编程的简便性。
不幸的是,我认为没有一种简单的方法可以将这个概念吸收到其他语言中,因为要使元编程更好就需要一种谐音和规则的语言(我说的是通用元编程,而不是笨拙的仅模板版本)。换句话说,它基本上需要使用Lisp语法:代码是数据,数据是代码。用操纵AST的语法丰富的语言编写代码更加困难,因为您需要了解两种语言:如何编写代码和如何编写AST。如果您的AST是固定的,并且由于许多不同的节点类型而又复杂又不规则,则这尤其困难。Lisp具有相当合理的常规(且可扩展!)AST,并且您通常已经可以通过直接编写AST进行编码。
元编程从本质上讲也更加困难(元元编程甚至更多),并且大多数程序员和管理人员显然只喜欢“没人需要”答案。
我感到特别可悲的是,“新”语言(如go
最终在需要时使用基于文本的元编程(编写文本文件的外部代码生成器)和“魔术”(即,编译器可以做程序员不能做的)最终结束了。
我认为解决复杂性问题的方法是强大的工具和教育。显然,这种趋势是钝器,不存在这个问题。
看来,即使CL也没有很好的库支持。至少根据从Lisp切换到Python的人的说法:
http://www.redmountainsw.com/wordpress/archives/reddit-switches-from-lisp-to-python
就我个人而言,我了解一些Scheme并很喜欢使用它,但是无法想象使用该语言进行不平凡的项目。
强大不一定意味着广泛使用。您是否听说过“针对常见情况进行优化”一词?不幸的是,正如许多人在平庸之前所说的那样,如果人们始终如一地得到保证,那要比在两者之间有很多失败的大热门要好得多。
Lisp不仅如此,而且许多技术也是如此。与Unix文本处理工具awk,sed,perl的良好结合可以节省您的编程时间。不幸的是,我已经看到人们花几天时间在其他工具中执行此类任务非常糟糕,而在几分钟之内使用这些工具可以更有效地完成这些任务。但是,如果一生都在日食中度过,他将永远不会欣赏这些东西的价值。您可能编写了一个具有可读性和可维护性的大型程序,但是编写这样一个程序而不编写它的全部目的很容易就能完成工作。
如今,在设计工具时的另一个方面是,直接使用工具来解决问题对他们来说是非常有用的。您不能构建太通用的东西,然后说您将通过库和框架对所有这些东西进行套期保值。用这种方法很难解决问题。好的工具可以很好地解决环境和周围的问题。这就是为什么php,perl和awk之类的工具尽管无休止的拖拉和猛击,但仍然保持着相关性的原因,因为它们太有用了,无法丢弃它们,并且它们通常比带有许多库和框架的通用语言还要做很多工作。
同样,您会看到Java / Python之类的语言非常出色,我将对某些任务说得最好。尤其是Python非常好,易于学习和编写。如果您的数据端点是标准的,那么这些语言也确实非常有用。某种数据库或此类XML或数据。基本的结构化数据。
Lisp将会存在很长时间,但不一定广泛存在。正如您将看到的,每种工具都有自己的细分市场。他们可以很好地解决某些问题。我认为并且我确信lisp在其计划可以很好解决的领域和问题上做得很好。