Lisp方言与Java/C#的比较

11 lisp scheme clojure common-lisp

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

这就是我所知道的:我知道3种方言:

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

我想知道的:

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

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

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

mik*_*era 14

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

首先,所有Lisps都很棒,你应该考虑学习一个.Eric Raymond有一句名言:

"Lisp值得学习,当你最终得到它时,你将获得深刻的启蒙经验;即使你从未真正使用Lisp本身,这种经验会让你成为更好的程序员."

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

  • Homoiconicity - 在Lisp中"代码就是数据" - 语言本身是用Lisp数据结构编写的.这本身很有意思,但是当它开始使用它来生成代码和高级宏时,它变得非常强大.有些人认为这个功能是Lisp可以帮助你提高效率的关键原因(简短的Paul Graham论文)
  • REPL的交互式开发 - 其他一些语言也有这个,但它在Lisp文化中特别具有惯用性和根深蒂固.在改变实时运行程序的同时进行开发非常有效率和解放.引起我注意的最近的例子包括音乐黑客泛音编辑实时游戏模拟.
  • 动态打字 - 意见更多地取决于这是否是一种优势(我个人是中立的),但很多人动态打造语言可以为您提供生产力优势,至少在快速构建方面.因人而异.

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

  • 现代语言设计 - Clojure以多种方式"精炼"Lisp.例如,除了列表之外,Clojure还为向量[]和哈希映射添加了一些新语法.纯粹主义者可能不赞成,但我个人认为这些创新的发现使语言的使用和阅读更加美好.{}()
  • 功能首先 - 所有Lisps都是功能语言,但是Clojure更进一步.所有标准库都是用纯函数编写的.所有数据结构都是不可变的.可变状态受到严格限制.支持延迟序列(包括无限序列).在某种意义上,它比其他Lisps感觉更像Haskell.
  • 并发 - Clojure有一种独特的管理并发方法,由一个非常好的STM实现支持.值得观看这个优秀的视频,以获得更深入的解释.
  • 在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 始终编​​译,并且您可以使用可选类型提示来获得静态类型的性能优势.

有缺陷的基准(如2012年初的)放的Clojure的像Java,Scala和C#,后面Common Lisp的一点点,未来计划(球拍)的一点点静态类型语言的速度的2-3倍之内.


Tay*_*mon 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的优势在于它比其他语言更强大.所有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,带有一个开放式读取评估打印循环.尽管最初是作为一种教学语言开发的,但它带有一个非常大的标准库,它比Common Lis更具有Common Lisp的特性.因此,它在真实的生产环境中得到了应用.