Lisp方言与Java / C#的比较

时间:2012-03-06 04:37:41

标签: clojure lisp scheme common-lisp

现在我一般都在Java / C#中(爱他们两个,真的不能说我专注于一个)。
我最近和朋友一起讨论了F#和C#之间的差异,当他惊讶地说:“所以...... F#听起来很像lisp,但是对瑞士军刀的感觉却少了。”登记/> 现在,我有点惭愧地说这个,但我不知道什么是口齿不清 经过一番搜索,我发现lisp非常有趣,但被多种方言和运行环境所困扰。

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

  • Common Lisp(我的书签中有Practical Common Lisp本书。
  • Scheme(CL的更“理论”版本)
  • Clojure。似乎是在JVM上运行的CL版本。

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

我想知道的事情:

  • 不同方言的运行环境是什么?它们是如何工作/安装的(我的意思是它是像Java虚拟机那样的运行时,或者它是否需要其他东西,或者它是否通常由OS支持(如在编译中))。以及如何获得它们(如果要获得某些东西)
  • 什么是更好的方言学习(我希望方言不是一种“学习语言”,但你可以完全使用,而不会后悔没有学习其他方言,例如在尝试Visual之前应先学习C ++ C ++,如果你知道我的意思)
  • 一般来说,lisp的主要优点是什么(我已经看过许多关于它的说法,说它在开发和执行方面更快,但它们对细节都非常模糊)。
  • 它通常可以用于一般用途,还是专注于人工智能? (我的意思是,例如,如果一个人可以用它制作一个完整的控制台应用程序,然后轻松实现OpenGL并制作一个游戏。学习一门精确的东西是值得的,但目前不适合我)

我也很高兴你们可以给我任何额外的细节! (链接也很受欢迎!电子书和诸如此类的东西。)

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

4 个答案:

答案 0 :(得分:14)

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

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

  

“Lisp值得你学习深刻的启蒙经验   当你最终得到它时会有;那段经历会让你成为一名   即使你从未如此,你的余下时间也会有更好的程序员   实际上经常使用Lisp本身。“

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

  • Homoiconicity - 在Lisp中“代码就是数据” - 语言本身是用Lisp数据结构编写的。这本身很有意思,但是当它开始使用它来生成代码和高级宏时,它变得非常强大。有些人认为这个功能是Lisp可以帮助你的一个关键原因more productive than anyone else(简短的保罗格雷厄姆论文)
  • REPL上的Interactice开发 - 其他一些语言也有这个,但它在Lisp文化中特别具有惯用性和根深蒂固。在改变实时运行程序的同时进行开发非常有效率和解放。最近引起我注意的例子包括music hacking with overtoneediting a live game simulation
  • 动态类型 - 意见更多地取决于这是否是一种优势(我个人是中立的)但很多人动态输入语言可以为您带来生产力优势,至少在术语上如此迅速建设事物。 YMMV。

我个人对Lisp现在学习的建议是Clojure。 Clojure有一些明显的优势使它脱颖而出:

  • 现代语言设计 - Clojure以多种方式“精炼”Lisp。例如,除了列表[]之外,Clojure还为向量{}和哈希映射()添加了一些新语法。纯粹主义者可能不赞成,但我个人认为这些创新发现使得语言的使用和阅读更加出色。
  • 功能首先 - 所有Lisps都是功能语言,但Clojure更进一步。所有标准库都是用纯函数编写的。所有数据结构都是不可变的。可变状态受到严格限制。支持延迟序列(包括无限序列)。在某种意义上,它比其他Lisps感觉更像Haskell。
  • 并发 - Clojure有一种独特的方法来管理并发,由一个非常好的STM实现支持。值得关注excellent video以获得更深入的解释。
  • 在JVM上运行 - 无论您如何看待Java,JVM都是一个出色的平台,具有极佳的GC,JIT编译,跨平台可移植性等。这对于某些人来说可能是一个障碍,但任何习惯于Java或C#的人都应该很快就会有宾至如归的感觉。
  • 图书馆生态系统 - 由于Clojure在JVM上运行,因此可以非常轻松地使用Java库。从Clojure调用Java API是微不足道的 - 它就像任何其他函数调用一样,语法为(.methodName someObject arg1 arg2)。随着巨大的Java库生态系统(主要是开源)的可用性,Clojure在实用性方面基本上超越了所有“利基”语言

在应用方面,Clojure旨在成为一个完全通用的语言,因此可以在任何领域使用 - 当然不限于AI。我知道人们在创业公司中使用它,将其用于大数据处理,甚至编写游戏。

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

flawed benchmarks(截至2012年初)将Clojure置于Java,Scala和C#等静态类型语言速度的2-3倍之内,略微落后于Common Lisp并略微领先于Scheme(球拍)。

答案 1 :(得分:11)

Lisp,正如你所发现的,不是一种语言;它是一系列具有某些共同特征的语言。

Lisp有两种主要方言:Common Lisp和Scheme。这两种方言中的每一种都有许多实现,每种都有自己的特性。但是,Common Lisp和Scheme都是标准化的,标准定义了一些特定的功能基线,您可以期待任何实现。

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

Clojure是另一种次要的,更近期的方言。如果你想了解Lisp,最好先学习Common Lisp或Scheme。

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

简而言之,Lisp的优势在于它比其他语言more powerful。所有Lisp代码都是Lisp数据,可以这样操作;这使得您可以使用元编程实现非常酷的功能,这些功能根本无法在其他语言中完成,因为它们无法直接访问构成代码的数据结构。 (Lisp可以做到这一点而且它们不能与其奇怪的语法密切相关。每个编译器或解释器在阅读源代码后,必须将其转换为abstract syntax trees。与其他语言不同,Lisp的语法是直接表示转换为Lisp代码的AST,因此您可以知道这些树的外观并可以直接操作它们。)最常用的元编程功能是宏; Lisp宏可以直接将一些源代码翻译成你可以编程的任何东西。你不能用C宏来做到这一点。

“开发和执行速度更快”的事情可能是对大多数Lisp实现提供的一个特定功能的引用:read-eval-print循环。您可以在提示中键入表达式,解释器将对其进行评估并打印结果。这对学习语言,调试或调查代码都很有用。

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

虽然最初是为人工智能研究而创建的,但Lisp绝不仅仅适用于AI。它在主流生产环境中不受欢迎的主要原因(除了Java和C#的自我延续优势)是图书馆支持。 Common Lisp有很多好的库(Scheme不那么好),但与Java或Python提供的大量库支持相比,它显得苍白无力。

如果你想开始使用,我建议你下载Racket,一个非常流行的Scheme实现。它拥有您需要的一切,包括一个简单但非常强大的IDE,带有一个开放式读取评估打印循环。尽管最初是作为一种教学语言开发的,但它带有一个非常大的标准库,它比Common Lis更具有Common Lisp的特性。因此,它在真实的生产环境中得到了应用。

答案 2 :(得分:4)

运行时环境

Common Lisp和Scheme通常有自己独特的运行时环境。 Scheme(Chicken和Gambit)的一些变体可以转换为C,然后与它们的环境链接,以便能够作为独立的可执行程序进行部署。 Clojure在JVM中运行,并且还有一个CLR端口,但我不清楚CLR端口是否与JVM保持同步。 Clojure还有Clojurescript,它以Javascript运行时为目标。

哪个最好先学习

我不认为这个问题有一个好的答案。由你决定。虽然如果您有使用JVM的经验,那么Clojure可能会更加顺畅。

Lisp的优点是什么

这是一个可能引发火焰战争的问题。我没有太多经验丰富的经验。我几个月前认真学习Clojure,多年来一直关注Common Lisp和Scheme。

我喜欢的是他们的动态性质。您需要在程序运行时在运行时更改函数吗?没问题!像任何电动工具一样,使用它时必须小心不要切掉你的位。

力量和表现力也令人上瘾。我能用很少的努力做一些我知道用Java无法实现的东西,或者我知道需要做更多的工作。具体来说,我能够汇总一个数据结构的描述 - 虽然使用宏,但延迟评估部分数据直到正确的时间。如果我在Java中完成了这个,我就不能像我那样嵌套声明,因为它们会以错误的顺序进行评估。随之而来的是痛苦。

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

Lisp是否通用

是。

-

Mark Volkman在Clojure上有一个非常好的article。有很多基础知识。我在开始时做的一件事就是在我需要以编程方式解决问题时启动一个repl和实验。例如探索API或进行一些计算。经过一段时间后,我开始努力提高工作水平,我现在正在开展一个涉及Clojure的项目。

关于Clojure的书已经写好了。 Stuart Sierra的书正在更新;而Oreilly的书很快就会出来,所以你可能想等一下。 Clojure的喜悦很好,但我认为它不是一本好的入门书。

对于Common Lisp,我强烈推荐Lisp的土地。

对于Scheme,有几个经典作品,包括The Little Schemer和SICP​​。

哦,这个:http://www.infoq.com/presentations/Are-We-There-Yet-Rich-Hickey(也许是你将要观看的最重要的演讲之一),以及http://www.infoq.com/presentations/hickey-clojure(IIRC,非常适合Clojure的演讲)。

答案 3 :(得分:3)

常见的lisp

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

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

  • Lisps通常可以更快地进行开发,并且由于具有抽象功能,因此可以更好地开发更高级别的概念。很难解释。 Ruby vs. C就是这种事情的一个例子。所有Lisps都具备IMO的能力。

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

我喜欢Common Lisp,但Clojure和Racket也不会打喷嚏。在我看来,Clojure特别代表了一条非常有趣的轨道。

对于电子书,你可以通过Graham和Gentle Introduction to Symbolic Computation获得On Lisp。可能是其他人,但那些是我能记得的。