Lisp方言及其与Java/C#的比较



现在我一般都在使用Java/C#(我喜欢这两种语言,不能真的说我专注于其中一种)
最近,我和一个朋友讨论F#和C#之间的区别,他让我惊讶地说:"所以…F#听起来很像口齿不清,但没有那么‘瑞士军刀’的感觉。"
现在,我对这样说有些羞愧,但我不知道口齿不清是什么
经过一番搜索,我发现lisp很有趣,但被多种方言和运行环境难住了。

以下是我所知道的:我知道三种方言:

  • 常用Lisp(我的书签里有实用的常用Lisp书
  • 方案(CL的更"理论"的版本)
  • Clojure。似乎是在JVM上运行的CL的一个版本

lisp的基本思想似乎是将代码用作数据。

我想知道的:

  • 不同方言的运行环境是什么?它们是如何工作/安装的(我的意思是,它是像Java虚拟机一样的运行时,还是它需要其他东西,或者它是否受到操作系统的普遍支持(如编译))。以及如何获得它们(如果要获得某些东西)
  • 什么是更好的方言(我希望方言不是一种"学习语言",而是一种你以后可以充分使用的语言,而不会后悔没有学习其他语言,例如,如果你知道我的意思,你应该在尝试Visual C++之前先学C++)
  • 一般来说,lisp的主要优势是什么(我看过很多关于它的页面,说它在开发和执行方面更快,但它们对细节都很模糊)
  • 它能被普遍用于一般用途吗,还是集中在人工智能上?(我的意思是,例如,如果一个人可以用它制作一个完整的控制台应用程序,然后同样容易地实现OpenGL并制作游戏。学习一种专门用于精确事物的语言是值得的,但目前对我来说不值得)

如果你们能给我更多的细节,我也会非常高兴!(链接也很感激!电子书等等。)

编辑: 这里的所有答案都非常有用。因此,我给了他们一个+1的代表,但选择了一个更具体的最好。谢谢大家。

在学习Lisp之前,我还深入学习了Java和C#,希望能分享一些有用的观点。

首先,所有的Lisp都很棒,你绝对应该考虑学习一个。埃里克·雷蒙德有句名言:

"Lisp值得你学习,因为你有深刻的启蒙经验当你最终得到它的时候;这种经历会让你成为更好的程序员,即使你从来没有实际上经常使用Lisp本身。"

Lisp特别有趣和强大的原因是:

  • 同源性-在Lisp中"代码就是数据"-语言本身是用Lisp数据结构编写的。这本身很有趣,但它真正强大的地方是当你开始将其用于代码生成和高级宏时。一些人认为,这些特性是Lisp可以帮助你比其他人更有效率的关键原因(Paul Graham的短文)
  • REPL的交互开发-其他一些语言也有这种功能,但它在Lisp文化中特别地道且根深蒂固。在改变实时运行程序的同时进行开发是非常高效和解放的。最近吸引我眼球的例子包括用泛音进行音乐破解和编辑现场游戏模拟
  • 动态类型-对于这是否是一种优势,意见分歧更大(我个人持中立态度),但许多人认为动态类型语言会给你带来生产力优势,至少在快速构建方面是这样。YMMV

我个人建议Lisp现在学习Clojure。Clojure有几个明显的优势使其脱颖而出:

  • 现代语言设计-Clojure通过多种方式"改进"了Lisp。例如,除了列表()之外,Clojure还为向量[]和哈希映射{}添加了一些新语法。纯粹主义者可能不同意,但我个人认为,这些创新的发现使语言更易于使用和阅读
  • 函数式语言是最重要的-所有的Lisp都是很好的函数式语言,但Clojure更进一步。所有的标准库都是用纯函数编写的。所有的数据结构都是不可变的。变异状态受到严格限制。支持惰性序列(包括无限序列)。在某些意义上,它感觉更像Haskell而不是其他Lisp
  • Concurrency-Clojure有一种独特的并发管理方法,由一个非常好的STM实现支持。值得一看这段精彩的视频来获得更深入的解释
  • 运行在JVM上-无论你怎么看待Java,JVM都是一个非常好的平台,具有非常好的GC、JIT编译、跨平台可移植性等。这可能会成为一些人进入的障碍,但任何习惯Java或C#的人都应该很快感到宾至如归
  • Library生态系统-由于Clojure运行在JVM上,因此可以非常容易地使用Java库。从Clojure调用Java API是琐碎的——它就像任何其他语法为(.methodName someObject arg1 arg2)的函数调用一样。随着巨大的Java库生态系统(大部分是开源的)的可用性,Clojure在实用性方面基本上超越了所有"小众"语言

在应用程序方面,Clojure被设计成一种完全通用的语言,因此可以在任何领域使用-当然不限于人工智能。我知道有人在初创公司使用它,将它用于大数据处理,甚至编写游戏。

最后,关于性能问题:使用更高级别的语言结构,基本上总是要付出轻微的性能代价。然而,根据我的经验,Clojure与Java或C#"足够接近",您不会注意到通用开发的区别。这有助于Clojure始终编译,并且您可以使用可选类型提示来获得静态类型的性能优势。

有缺陷的基准测试(截至2012年初)使Clojure的速度是Java、Scala和C#等静态类型语言的2-3倍,稍微落后于Common Lisp,稍微领先于Scheme(Racket)。

正如您所发现的,Lisp不是一种语言;这是一个具有某些共同特征的语言家族。

Lisp主要有两种方言:普通Lisp和Scheme。这两种方言中的每一种都有许多实现,每个实现都有自己的功能。然而,Common Lisp和Scheme都是标准化的,并且这些标准定义了一个特定的特性基线,您可以期望任何实现都具有该基线。

Scheme是一种具有非常小的标准库的极简主义语言。它主要由学生和理论家使用。Common Lisp具有更多的语言功能和更大的标准库,包括一个强大的对象系统,并已在大型生产系统中使用。

Clojure是另一种较新的次要方言。如果你想理解Lisp,最好先学习Common Lisp或Scheme。

我的建议是先学习Scheme;它更纯粹地表达了Lisp的思想,并将帮助您理解语言的本质。在许多方面,Lisp与Java和其他命令式语言完全不同;然而,你从中学到的东西会让你在这些语言中成为一名更好的程序员。了解Scheme后,您可以轻松学习Common Lisp。

简单地说,Lisp的优点是它比其他语言更强大。所有的Lisp代码都是Lisp数据,并且可以这样操作;这允许你用元编程做一些其他语言无法做的非常酷的事情,因为它们不能让你直接访问组成代码的数据结构。(Lisp之所以能做到这一点,而他们不能做到,与它奇怪的语法密切相关。每个编译器或解释器在阅读源代码后,都必须将其翻译成抽象的语法树。与其他语言不同,Lisp的语法是Lisp代码翻译成的AST的直接表示,所以你知道这些树是什么样子的,可以直接操作它们。)。)最常用的元编程功能是宏;Lisp宏可以将一点源代码翻译成任何可以编程的东西。比如说,使用C宏是无法做到这一点的。

"开发和执行速度更快"可能是指大多数Lisp实现提供的一个特定功能:read-eval-print循环。您可以在提示符中键入一个表达式,解释器将对其求值并打印结果。这对于学习语言以及调试或以其他方式研究代码来说都是非常棒的。

Lisp是动态类型的(尽管存在静态类型的风格)。Lisp的大多数实现都在自己的虚拟机上运行;然而,许多也可以编译成机器代码。Clojure是专门针对JVM编写的;它还可以针对.NET和JavaScript。

尽管Lisp最初是为人工智能研究而创建的,但它并不是专门为人工智能而创建的。它在主流生产环境中不那么受欢迎的主要原因(除了Java和C#的自我统治之外)是库支持。Common Lisp有很多好的库(Scheme没有那么好),但与Java或Python的大量库支持相比,它相形见绌。

如果你想开始,我建议你下载Racket,这是Scheme的一个非常流行的实现。它拥有您所需要的一切,包括一个简单但功能强大的IDE,它具有read-eval-print循环,开箱即用。尽管它最初是作为一种教学语言开发的,但它拥有一个非常大的标准库,这比Scheme更具Common Lisp的特点。因此,它在实际生产环境中得到了应用。

运行时环境

公共Lisp和Scheme通常有自己独特的运行时环境。Scheme有一些变体(Chicken和Gambit),可以翻译成C,然后与它们的环境链接,以便能够作为独立的可执行程序进行部署。Clojure在JVM中运行,还有一个CLR端口,但我不清楚CLR端口是否是JVM的当前端口。Clojure还有一个Clojudescript,它的目标是Javascript运行时。

先学习哪个更好

我认为这个问题没有一个好的答案。这取决于你。尽管如果您有JVM方面的经验,Clojure一开始可能会更流畅一些。

Lisp 的优点

这是一个容易引发激烈战争的问题。我没有太多口齿不清的经验。几个月前,我开始认真学习Clojure,这些年来,我断断续续地研究了Common Lisp和Scheme。

我喜欢的是它们充满活力的天性。程序运行时,是否需要在运行时更改函数?没问题!像任何电动工具一样,你在使用时都必须小心,不要把你的钻头切掉。

这种力量和表现力也让人上瘾。我能够毫不费力地完成一些我知道在Java中无法实现的事情,或者我知道需要做更多的工作。具体来说,我能够将数据结构的描述组合在一起——通过使用宏,将部分数据的评估延迟到合适的时间。如果我在Java中这样做,我就不能像以前那样嵌套声明,因为它们的求值顺序会错误。疼痛会随之而来。

我也喜欢Clojure对函数式编程的看法,尽管我不得不说它需要调整。

Lisp是通用吗

是的。

--

Mark Volkman有一篇关于Clojure的非常好的文章。有许多基础知识。我一开始做的一件事是,当我需要通过编程来解决问题时,只需启动一个repl并进行实验。例如探索API或进行一些计算。经过一段短暂的时间后,我开始进行更多的构建工作,我现在正在进行一个涉及Clojure的项目。

关于Clojure的书写得不错。斯图尔特·塞拉的书正在更新;奥雷利的书马上就要出版了,所以你可能想等一等。《克洛尤尔的快乐》很好,但我认为它不是一本好的入门书。

对于常见的Lisp,我强烈推荐Lisp之地。

对于Scheme,有几部经典作品,包括《小骗子》和《SICP》。

哦,还有这个:http://www.infoq.com/presentations/Are-We-There-Yet-Rich-Hickey(也许是你看过的最重要的演讲之一)http://www.infoq.com/presentations/hickey-clojure(IIRC,非常好的Clojure介绍)。

公共lisp

  • 公共Lisp是编译和解释的。部署(在Windows中)可以通过带有DLL的exe来完成。或者通过预编译的字节码。或者通过在目标设备上安装Lisp系统并对其执行源代码

  • Common Lisp是一种完全可用的工业语言,有一个活跃的社区和用于许多不同任务的库。

  • Lisp的开发速度通常更快,而且由于其抽象功能,它更善于开发更高级别的概念。这很难解释。Ruby与C就是这样一个例子。所有Lisp都具有此容量IMO.

  • 公共Lisp是一种通用语言。我不知道现代的Common Lisp实现是否直接支持执行程序集,所以可能很难编写驱动程序或使用编译器不支持的CPU指令。

我喜欢Common Lisp,但Clojure和Racket也不容小觑。在我看来,Clojure尤其代表了一条非常有趣的赛道。

对于电子书,你可以获得Graham的On Lisp和符号计算的温和介绍。可能还有其他人,但这些都是我能回忆起来的。

最新更新