理解不同方法和概念需要学习哪些重要的编程语言?

172

当你只有一副螺栓切割器和一瓶伏特加时,所有的东西都看起来像Wolf Blitzer船屋门上的锁。(如果你不读xkcd,请用一把锤子和一枚钉子代替)

我目前编程使用Clojure、Python、Java和PHP,所以我熟悉C和LISP语法以及空白符号。我了解命令式、函数式、不可变、面向对象编程(OOP)和一些类型系统等知识。现在我想学习更多!

哪些编程语言采用不同的方法,在实际工具选择或理论理解方面都很有用?

我不太想学习另一种函数式语言(Haskell)或另一种命令式OOP语言(Ruby),也不想练习无用的有趣语言,比如Brainfuck。

我自己发现的一个非常有趣的东西是基于单调栈的语言,比如Factor。

只有当我感觉自己理解了大部分概念并对所有问题都有答案时,我才想开始考虑我的个人偏好的玩具语言。


3
我会为xkcd的提及点赞,但问题本身也很有趣。 - user395760
63
你似乎是一名成功的程序员,其他都是递增的。不想太冲,但是……你的生活财务状况如何?你的人际关系、健康状况、娱乐爱好怎样?也许现在是追求一些事情的时候了。我认为你不需要一次学习十几种语言。如果你可以得到报酬,那就学它。如果你想写一本书,那就学它。除此之外,你已经有了良好的编程基础。为什么要学习一些你不会认真(读作:赚钱)用到的东西(比如J - 这是我的主观意见 :))?不要成为墓地里最酷的黑客。 - Hamish Grubijan
6
根据我的标准,我是一名成功的程序员。虽然我现在赚的钱不多,但嘿,我才19岁。我投入时间和精力来学习各种技术并享受编程带来的乐趣。我想说,理解一门语言和精通它是有区别的。掌握Python和Clojure对我来说已经足够了。我也想了解其他选项,因为这会改进我的编程代码、帮助我了解计算机并帮助我定义自己的编程语言。 - Pepijn
5
你有没有看过Programmers.SE?这类问题更适合在那里提问。 - Roger Pate
3
这本书可能很有意思:《七周七语言:学习编程语言的实用指南》(Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages),作者是Bruce A. Tate。 - Martin Ba
显示剩余6条评论
24个回答

287
实用性是高度主观的,所以我只会说学习不同的语言范例只会让你成为更好的程序员。还有什么比这更实用呢?
函数式编程,Haskell - 我知道你说过你不想学,但你真的应该重新考虑一下。你已经接触过 Clojure 和 Python 的函数式编程,但没有像 Haskell 这样充分体验过。如果你真的反对 Haskell,那么 ML 或 OCaml 是很好的选择。
声明式编程,Datalog - 许多人会推荐 Prolog,但我认为 Datalog 是一个更清晰的声明式语言示例。
数组操作,J - 我刚刚发现 J,但我发现它是一种令人惊叹的语言。它会扭曲你的思维。你会感谢 J 给你带来的体验。
栈操作,Factor/Forth - Factor 非常强大,我计划尽快深入研究它。Forth 是栈语言的鼻祖,而且作为额外的奖励,自己实现它很简单。通过实现学习是有价值的。
数据流编程,Oz - 我认为 Oz 的影响正在上升,并将在未来继续增长。 < p > 基于原型的,JavaScript/Io/Self - Self 是祖先级别的语言,并在每种基于原型的语言中具有很高的影响力。这与基于类的 OOP 不同,不应该被视为相同。许多人来到一个原型语言并创建一个特定的类系统,但如果您的目标是扩展您的思维,那么我认为这是一个错误。充分利用语言。阅读没有类的组织程序以获取想法。

专家系统,CLIPS - 我总是推荐这个。如果您知道 Prolog,那么您可能会优势更高速,但它是一种非常不同的语言。

Frink - Frink 是一种通用语言,但它以其单位转换系统而闻名。我发现这种语言非常鼓舞人心,因为它不断努力成为最好的自己。另外......真的很有趣!

函数+可选类型,Qi - 您说您有一些类型系统的经验,但您是否具有“可削皮*类型系统的经验?没有人有......但他们应该。 Qi 在许多方面都类似于 Lisp,但其类型系统将使您大开眼界。

演员+容错性,Erlang - Erlang 的进程模型得到了很多关注,但其容错和热代码交换机制是改变游戏规则的。您将不会学到太多有关 FP 的东西,您在 Clojure 中不会学到,但其 FT 功能将使您想知道为什么更多的语言似乎无法做到这一点。

享受!


8
+1 - 一个很棒的答案。 - duffymo
2
谢谢你指引我学习这么多编程语言。 - user395760
2
我会加入Erlang用于基于Actor的编程,以及Fortress用于并行编程。 - nickik
2
+1 是对 Erlang 的热代码替换和容错能力的认可。 - Mic
14
没有汇编?了解处理器的工作方式有助于学习它们喜欢哪种代码。 - Nick T
显示剩余18条评论

33

Prolog(用于统一/回溯等操作),Smalltalk(“所有事物都是消息”),Forth(逆波兰表示法,线程解释器等),Scheme(延续)如何?

虽然不是语言,但元对象协议艺术令人惊叹。


请纠正我,但我认为Python已经有了一些延续的功能。从我所读到的内容来看,我宁愿学习Factor和Objective-C,而不是Forth和Smalltalk,但我可能会走捷径。 - Pepijn
1
@pepijn,Python并不支持一级continuations(尽管我正在进行一个字节码黑客来模拟它)。 - aaronasterling
1
Objective-C 借鉴了 Smalltalk 的思想,但我认为真正值得借鉴的是 ST 环境本身的动态性。 - John Cromartie

33
我赞同Haskell。不要认为“我懂Lisp,所以我懂函数式编程”。你听说过类型类吗?代数数据类型?单子?“现代”(或多或少 - 至少不是50年前的 ;))函数式语言,特别是Haskell,已经探索了大量非常强大有用的新概念。类型类添加了临时多态性,但类型推断(你已经知道的语言中另一件事情)也像魔法一样工作。代数数据类型非常棒,特别是用于建模树状数据结构,但对于枚举或简单记录也很好用。而单子...嗯,让我们只说人们使用它们来制作异常、I/O、解析器、列表理解等等 - 以纯函数式的方式!

此外,整个主题足够深入,可以让人忙碌数年 ;)


此外,整个主题足够深入,可以让人忙碌数年;)我想知道,为什么这是一件好事呢?毕竟,我们的生命是有限的。 - vegai
1
@vegai:为什么这会是一件坏事呢?比起其他浪费时间的方式,学习是更好的选择。而且没有人说你必须花几年时间才能正确使用这门语言 - 只是这个话题不会在短时间内被耗尽。 (还要注意笑脸 - 这部分并非完全认真。) - user395760

32
我目前使用Clojure,Python,Java和PHP编程[...]有哪些采用不同方法并且对于实际工具选择或理论理解都有用的语言? C 有很多C代码可供使用,这绝对是实用的。如果您也学习了C ++,那么周围还有更多的代码(一旦您了解了C和Java,跨度就很短)。
它也让您(或者强制您)在某些理论问题上有很好的理解;例如,每个运行的程序都存在于一个4 GB字节数组中,在某种意义上。 C中的指针实际上只是进入此数组的索引 - 它们只是另一种不同的整数。在Java,Python,PHP中没有任何不同,只是隐藏在表面层下。
此外,您可以在C中编写面向对象的代码,您只需要手动处理vtable等内容。 Simon Tatham的Portable Puzzle Collection是相当易于访问的面向对象C代码的绝佳示例;对于初学者/中级C程序员来说,它也设计得相当好,值得一读。这也是Haskell中发生的事情-类型类在某种意义上是“只是另一个vtable”。
关于C的另一个重要优点:与熟练的C程序员进行问答将为您提供许多答案,这些答案将用较低级别的构造解释C,从而构建您更紧密接近铁的知识库。
我可能会错过OP的观点-根据其他答案的判断,我认为我是这样做的-但我认为对于其他有类似问题并阅读此线程的人来说,这可能是一个有用的答案。

1
这需要更多的赞同。当你需要或想要深入了解机器的工作原理时,C语言是第一选择,无论是从底层编程语言还是高级编程语言方面。此外,它也是非常通用的,几乎存在适用于每个CPU架构的C编译器。 - dietr

27

来自Peter Norvig的网站:

“学习至少半打编程语言。包括一种支持类抽象(如Java或C++),一种支持函数抽象(如Lisp或ML),一种支持语法抽象(如Lisp),一种支持声明式规范(如Prolog或C++模板),一种支持协程(如Icon或Scheme)和一种支持并行性(如Sisal)的语言。”

http://norvig.com/21-days.html


13

我很惊讶,在经过六个月和数百次投票之后,竟然没有人提到SQL……


10

在类型作为定理/高级类型系统方面:Coq(我认为Agda也属于这个类别)。

Coq是一个嵌入到函数式编程语言中的证明辅助工具。

你可以编写数学证明并使用Coq帮助构建解决方案。 你可以编写函数并证明其属性。

它具有依赖类型,仅此就让我感到惊奇。一个简单的例子:

concatenate: forall (A:Set)(n m:nat), (array A m)->(array A n)->(array A (n+m))

这个函数的签名是将两个大小为n和m的A元素数组连接起来并返回一个大小为(n+m)的数组。如果函数没有返回指定的类型,它将无法编译通过!

Coq基于归纳构造的微积分理论,并且有坚实的理论支持。我不够聪明,无法完全理解,但我认为值得一看,特别是如果你对类型理论感兴趣。

编辑:需要强调的是,您可以在Coq中编写一个函数,然后可以证明该函数对于任何输入都是正确的,这真是太神奇了!


我也支持Coq。在学习大多数编程语言时,您仍然可以使用旧技术,但是Coq强制您编写总是有效的完整程序。 - Bruno Martinez
我去年夏天尝试学习Coq,但因为发现很难找到好的学习和使用文档而放弃了。有什么建议吗? - user21037
我从大学的一门课程中学到了这个,然后阅读了《Coq'Art: The Calculus of Inductive Constructions》。这还不足以真正掌握它,但足以欣赏它。 - Bruno Martinez

6

我对一种具有非常不同观点的语言(包括定义语言元素的新词汇和根本性的语法差异)感兴趣,这种语言是J。虽然Haskell是一种函数式语言,但它的类型系统和其他独特的特性可以开阔你的思路,使你重新思考(函数式)编程中以前的知识。


5

你已经学习了很多编程语言。现在是时候专注于一种语言,并将其掌握。


5

就像 Fogus 在他的列表中建议过一样,我也建议您看看 OzML/Mozart 这种语言。它支持多种编程范式,主要针对并发/多代理编程。

关于并发和分布式计算,与 Lambda 演算(函数式编程背后的演算)相当的是 Pi Calculus。

我只开始研究 Pi Calculus 的一些实现。但它们已经扩大了我的计算概念。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接