30

我已经掌握了几种语言(按专业知识的粗略顺序排列):Python、C、C++、PHP、Javascript、Haskell、Java、MIPS、x86 汇编程序。但是自从我学会了一个新的已经快 2 年了,我开始感到痒了。我有几个标准:

  1. 必须(重复:必须)有一个免费的 Linux 实现
  2. 应该不同于我已经知道的语言。换句话说,它应该具有让我思考以新方式解决问题的功能。
  3. 应该有一定的实用潜力。它不需要成为下一个 Java,但这排除了 Brainf* 和莎士比亚 :) 我真的不在乎它有多少职位发布,但现实世界的应用程序和库是一个加分项。
  4. 至少应该有足够的免费学习材料让我开始学习。

我在想 Lisp(CL?别的东西?)或 OCaml。我已经有一些使用 Haskell 的函数式语言的经验(是的,我知道 Lisp/OCaml 是多范式)。我不是专家——例如来自 Real World Haskell 的部分代码仍然会扭曲我的大脑,但我了解基本概念和一些高级概念(函子、单子)。

选择哪一个?我忽略了任何其他语言?另外,能否请您包括一些有用的链接到好书/教程等。

4

16 回答 16

31

Lisp 和 OCaml 都与你已经知道的相距甚远。这里有四个建议,部分是出于内在兴趣,部分是为了扩展您的视野。

  • 一种逻辑编程语言,可能是 Prolog。我没有在网上找到好的材料,但是 Sterling 和 Shapiro 的书The Art of Prolog非常棒。Clocksin 和 Mellish编写的更基础的教科书也不错。主要兴趣点是使用关系而不是函数进行编程

  • 一种纯面向对象的语言,无论是 Smalltalk还是Self。如果您只使用过混合的面向对象语言,您会惊讶于纯面向对象的美妙之处。我已经链接到 Smalltalk 的Squeak实现。我个人建议在处理 Self 之前先学习 Smalltalk;有一个非常庞大且活跃的社区,并且软件开发得很好。Self 站在 Smalltalk 的肩膀上,是一个更鼓舞人心的设计,但社区要小得多。对于那些可以访问 ACM 数字图书馆的人,我推荐Dave Ungar 在 HOPL-III 上的精彩演讲;纸也不错。

  • Icon 编程语言有两个优点:一个强大且不寻常的评估模型,具有隐式回溯,以及一个用户可扩展的字符串处理模型,它击败了所有空洞的正则表达式。很遗憾,Icon 从来没有跟上时代的步伐,在我所有的建议中,它是最不实用的。事实上,我担心语言已经奄奄一息。但它几乎会像 Haskell 一样扩展你的思维,而且会朝着截然不同的方向发展。Icon 对于中等大小的字符串处理任务仍然非常有用。

    您可以在Computer Journal的 Ralph Griswold 的文章中阅读有关图标字符串处理的信息。

  • Lua 编程语言是我最后也是最不激进的建议。它的兴趣不在于新颖的语言特性或范式,而是在于语言的精湛工程及其实现。Lua 占据了许多领域,包括脚本、游戏、字符串处理和轻量级函数式编程。但它的主要兴趣点是它与 C 的无缝集成,为了获得全部好处,您应该将 C 库绑定到 Lua。

    HOPL-III网站还包含一篇关于 Lua的精彩演讲和论文。

于 2009-07-02T00:44:36.997 回答
26

Common Lisp 和 Ocaml 都值得学习。如果您已经了解 Haskell,那么 CL 可能是更不同的体验。

SBCLClozure CL都是 Linux 上 Common Lisp 的非常有用的实现。(关于各种实现的概述:Common Lisp 调查。)

作为起点,我建议使用 Peter Seibel 的优秀书籍Practical Common Lisp,该书可在线获取,也可印刷。

社区指针在这里:CLIKI

于 2009-06-28T23:16:25.540 回答
9

Prolog 可能是您正在寻找的。

编辑

第一个评论者是对的,我的回答很短而且不是很有用,所以:

我首选的实现是 SWI-Prolog。我个人是从 Prolog Programming for AI 中学习的。它的风格非常清晰,并且包含许多示例,但我没有任何其他关于逻辑编程的书(真的很遗憾:)所以我没有比较的基础。

于 2009-06-28T23:25:23.290 回答
8

Erlang的学习非常有趣,因为它具有超高效的并发模型,并且可以轻松编写分布式系统(例如,CouchDB是用 Erlang 编写的)。它是一种动态类型的函数式语言,但您也可以以过程方式编写代码。我学习它的教程叫做“Erlang 入门”,它几乎涵盖了该语言的每个部分。

于 2009-06-29T03:18:42.307 回答
6

如果你想利用你的 Java 和函数式编程知识,并且想学习 Lisp,那么试试Clojure

该实现是免费且跨平台的,包括 Linux,因为它在 JVM 上运行。作为一个 Lisp,它与大多数其他语言(以有用和美妙的方式)不同,足以让事情变得有趣。与您列出的语言相比,不可变数据结构、多方法、元数据支持、关注安全并发等一些特性相当新颖。Clojure 主要致力于成为一种实用且有用的语言,而不是一种学术语言。它是一种函数式语言,但不是“纯粹的”,这可以说是一件好事。您还可以轻松地使用 Clojure 中的任何 Java 库。

Clojure 是一门新语言,所以目前为止唯一出的一本书是Programming Clojure,但它是一本相当不错的书。还有一个wiki可能不是完全最新的,因为该语言仍在快速发展。邮件列表和 IRC 频道是非常友好、欢迎提问的地方。当然,官方网站也是一个很好的资源。

于 2009-06-29T02:05:22.440 回答
5

我支持 Rainer 的 Common Lisp 建议。

CL 拥有您正在寻找的所有东西,并将提供真正新颖的体验,这也将使您在其他语言中的编码工作和方法变得更好。

但是带上耐心和毅力,你将不得不掌握很多起初看起来很陌生的概念。

于 2009-06-30T19:38:16.833 回答
5

看看 Smalltalk !Cincom VWST 或 Smalltalk/X - 不要打扰 Squeak,因为界面很糟糕)。VAST 也很好,但实际上只是以 Windows 为中心。并且不要理会那些对 Smalltalk 嗤之以鼻的怀疑论者——他们没有使用它,而是陷入了编辑-运行-调试循环语言和多个 dispirt 链接库的泥潭。:-)

为什么使用这些 Smalltalks - 好吧,它们配备了出色的 IDE、内置的 GUI 工具、您将看到的最好的调试器、在线帮助,并且完全独立于底层操作系统。例如,可以将在 Linux 下运行的 ST/X 程序(源代码)传输到 Windows ST/X 并执行。

ST/X 是免费的,只有非常小的许可限制,Cincom 提供不受限制的免费 NC(非商业)版本。我使用 ST/X 因为我更喜欢它提供的默认外观。它们的 IDE 接口非常相似。

没有 IDE 和 GUI 工具的语言只是在浪费你的时间,因为世界实际上是 GUI,无论底层语言多么出色。例如,Ruby 很棒,但是没有 IDE 或简单的 GUI 工具,这真的很令人沮丧。

Smalltalk 不容易上手,也不完美,(什么语言?)但学习和使用非常令人满意。而现在硬件和操作系统终于赶上了 Smalltalks 的需求。非常有效。

于 2009-06-29T01:17:55.217 回答
5

我将推荐一些我还没有尝试过但计划尝试的东西,所以你必须自己判断这个。有一种语言,称为IO,它的特殊之处在于它基于原型,如 JavaScript,但也借鉴了许多其他语言的概念。它的就业市场可能不存在,但我想我提到了这种语言。

否则,来自 Lisp 家族的语言可能与您已经知道的完全不同。在这方面,我推荐Scheme,在我看来,它比 Common Lisp 更优雅。您可能会在 Scheme 中发现有趣的新概念是continuations

如果您选择 Scheme 路径,请花点时间观看1986 年的这些视频。它们太棒了。

于 2009-06-28T23:36:37.700 回答
3

你可以试试 Tcl。它的不同之处足以在我的大脑中引起不良反应,所以我真的不能告诉你我是如何发现它不同的,但是里面写了很多好东西(现在可能比以前少了)。

于 2009-07-02T17:42:11.230 回答
2

C# 在Mono项目下的 Linux 中有一个免费的实现, 除非你完全反对微软,否则它可以说是一个非常有市场的技能。

我最喜欢的 C# 书籍是Pro C# 2008 and the .NET 3.5 Platform, Fourth Edition。

如果您真的想要异国情调,F# 是一种在 .NET 平台和单声道上运行的 OCaml 风格的语言,并且最近受到了很多关注。

http://msdn.microsoft.com/en-us/fsharp/default.aspx

F# 书籍:
http ://www.amazon.com/s/ref=nb_ss_gw?url=search-alias%3Daps&field-keywords=f%23

于 2009-06-28T23:11:56.937 回答
1

Try FORTRAN, then? I hear it's still actively used by the scientific and mathemematical communities, plus it should be dissimilar enough to be a learning challenge.

Compilers:
http://gcc.gnu.org/wiki/GFortranBinaries
http://www.g95.org/
http://www.fortran.com/compilers.html
http://www.thefreecountry.com/compilers/fortran.shtml

IDEs:
http://www.eclipse.org/photran/
http://force.lepsch.com/ (FORTRAN 77 only)

Tutorials:
Introduction to Modern FORTRAN: http://www-uxsup.csx.cam.ac.uk/courses/Fortran/
FORTRAN 90 Tutorial: http://www.cs.mtu.edu/~shene/COURSES/cs201/NOTES/fortran.html

You could also learn Visual Basic.NET, in case you ever get forced to maintain that. Evidently mono has a working Linux implementation of it: http://www.mono-project.com/Visual_Basic

于 2009-07-02T06:17:09.393 回答
1

到目前为止,我看到的建议中,我喜欢 Lisp(参见 Secko)和 Smalltalk(参见 brett),因为它们都可以让您对语言有另一种看法。Prolog 更是如此。

另一种不同的语言是 Erlang——我还没有机会学习它,但它以不同的方式处理并发。我能给你的最好的链接是主网站

在推荐方面,Lisp 很好,因为它目前正在使用,而且因为它很旧。其他的你将不得不查看来源,看看哪一个最吸引人。

于 2009-06-29T02:34:53.347 回答
1

因素与您所说的您知道的所有内容以及列出的所有其他内容都完全不同。它和 Forth 一样是基于堆栈的,但具有相当全面的库和许多有趣的特性。

Ada 非常实用——有一个基于 gcc 的编译器——但也与您所知道的其他命令式语言完全不同。我发现类型系统有点令人窒息,但值得学习一些东西。

于 2009-07-22T01:29:02.520 回答
0

和你一样,我掌握了十多种语言。在购买用于编写交叉编译器的东西时,我遇到了 ML 和家人。那里有很多非常好的想法,他们教我写代码是一种截然不同的方式;例如,我的 JavaScript 现在具有明显的功能倾向。

在 Windows 下玩弄 OCaml 一段时间后(并对稳定性问题感到沮丧),我遇到了 F#,它是 OCaml 的后代。两者非常相似(可以交叉编译大量代码),但 OCaml 显然有一个非常好的宏系统(P4)和类型类(支持针对泛型类型编写“强类型”运算符),而 F# 有对异步和并行操作、monad、数字类型的度量单位以及更简洁的 OO 语法和出色的 IDE 集成(VS2008 和将与 VS2010 一起发布)的出色支持。这些天我更喜欢 F#,因为我可以访问整个 .NET 运行时和大量 3rd 方库。事实上,我现在大部分的一次性实用程序代码都是用 F# 编写的。对我来说,它通常比 C++、JavaScript、C#、PowerShell 或其他任何东西都更有效率。

F# 在 Linux 上的 Mono 下运行得相当好,并且在那里有很好的追随者。编译器和运行时将在稳定后开源(随 VS2010 发布),开发人员认为 Mono 支持足够优先,因此可以认真考虑非 Microsoft 使用。

于 2009-06-29T15:01:34.593 回答
0

Scala 非常适合让我以全新的眼光看待编程。我还没有将它用于任何类似的工作,但它仍然影响了我用其他语言编写代码的方式——不仅仅是 Java,还有 PHP。我最近为 WordPress 插件编写了一个简单的解析器,尽管 PHP 缺乏强制执行,但代码比六个月前更加实用和不可变,而且对它更好。

唯一对我的工作方式产生如此巨大影响的另一种语言是 Perl,它几乎是十年前的事了。Perl 对我的伪代码方式做出了很大贡献,即使我从未接触过语言本身。

许多人将 Scala 的功能方面与 Haskell 进行比较。您甚至可以想象,了解 Haskell 意味着您已经了解 Scala 可以教给您的所有内容,但我不相信。Scala 结合 OO 和函数的方式有一种让它看起来实际上是它们两者最真实的形式的方式。

于 2009-06-29T02:52:14.967 回答
0

Lisp 是一个很棒的 HLL,它拥有其他语言所缺乏的一切。在我看来,这是一种非常好的语言,可以“满足”任何程序员的需求。

Perl 也是像 Lisp 一样的 HLL,它既有趣又有趣。它源自 C,因此您可以随时拿起它。有时可能很难,有些人在学习时往往会迷失方向,但值得了解。

这两种语言都是免费使用的,并且随 Linux 一起提供。

链接

Lisp: 如果 Lisp 这么棒, Common Lisp 的介绍和教程

Perl: PERL -- 实用的提取和报告语言

图书

On Lisp - Paul Graham 关于 Lisp 语言的好书。它是免费的,您可以在这里下载。

于 2009-06-28T23:54:22.233 回答