学习理解不同方法和概念的重要语言是什么?

时间:2010-10-18 11:27:09

标签: language-agnostic programming-languages

当你拥有的是一对断线钳和一瓶伏特加酒时,一切看起来就像是Wolf Blitzer船库门上的锁。 (如果你不读xkcd,用锤子和钉子代替)

我目前正在编写Clojure,Python,Java和PHP,所以我熟悉C和LISP语法以及空白事物。我知道命令式,功能性,不可变性,OOP和几种类型的系统和其他东西。现在我想要更多!

哪种语言采用不同的方法,对实际工具选择或理论理解有用?

我不想学习另一种功能语言(Haskell)或其他命令式OOP语言(Ruby),也不想练习像Brainfuck这样不切实际的有趣语言。

我发现自己的一个非常有趣的事情是基于单声道堆栈的语言,如因素。

只有当我觉得我理解了大多数概念并且对我的所有问题都有答案时,我才想开始考虑我自己的玩具语言以包含我个人的所有偏好。

24 个答案:

答案 0 :(得分:288)

实用性问题非常主观,所以我只想说学习不同的语言范式只会让你成为更好的程序员。什么比这更实际?

功能性,Haskell - 我知道你说过你不想这样做,但你真的应该重新考虑。你已经通过Clojure甚至是Python获得了一些功能,但是如果没有Haskell,你就没有充分体验过它。如果你真的反对Haskell,那么好的妥协就是ML或OCaml。

声明,数据记录 - 很多人会在这个插槽中推荐Prolog,但我认为Datalog是一个更清晰的声明性语言示例。

Array,J - 我刚刚发现了J,但我发现它是一种令人惊叹的语言。它会把你的思绪扭曲成椒盐卷饼。你会感谢J的。

Stack,Factor / Forth - 因子非常强大,我打算尽快深入研究它。 Forth是Stack语言的祖父,并且作为额外的奖励它自己是simple to implement。通过实施学习可以说些什么。

Dataflow,Oz - 我认为Oz的影响力正在上升,并且将来只会继续增长。

基于原型,JavaScript / Io / Self - Self是大爸爸,对每种基于原型的语言都具有很高的影响力。这与基于类的OOP不同,不应该这样对待。许多人来到原型语言并创建一个特殊的类系统,但如果你的目标是扩展你的思想,那么我认为这是一个错误。完全使用该语言。请阅读Organizing Programs without Classes了解相关信息。

专家系统,CLIPS - 我总是推荐这个。如果你知道Prolog那么你可能会在速度上占上风,但这是一种非常不同的语言。

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

功能+可选类型,Qi - 您说您对某些类型系统有过经验,但您是否有过“skinnable *类型系统”的经验?没有人......但他们应该这样做。 Qi在很多方面都像Lisp,但它的类型系统会让你大吃一惊。

演员+容错,Erlang - Erlang的流程模型引起了很多轰动,但其容错和热代码交换机制正在改变游戏规则。你不会在Clojure上学到很多关于FP的知识,但是它的FT功能会让你想知道为什么更多的语言似乎无法做到这一点。

享受!

答案 1 :(得分:33)

  

我目前正在编写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程序员一起参与Q&amp; A会得到很多答案,可以用较低级别的结构来解释C,从而建立你更接近铁的知识库。 / p>

我可能会错过OP的观点---我认为我是,从其他答案判断---但我认为这对其他有类似问题并阅读此帖的人来说可能是一个有用的答案。

答案 2 :(得分:33)

我是第二个Haskell。不要以为“我知道一个Lisp,所以我知道函数式编程”。有没有听过类型课?代数数据类型?单子? “现代”(或多或少 - 至少不到50岁;))函数式语言,尤其是Haskell,已经探索了许多非常强大有用的新概念。类型类添加了ad-hoc多态,但类型推断(你已经知道的另一种语言没有)就像魅力一样。代数数据类型非常棒,特别是对于树状数据结构的建模,但对于枚举或简单记录也可以正常工作。和monad ......好吧,我们只是说人们使用它们来制作异常,I / O,解析器,列表推导等等 - 以纯粹的功能方式!

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

答案 3 :(得分:33)

Prolog(用于统一/回溯等),Smalltalk(用于“一切都是消息”),Forth(反向抛光,线程解释等),Scheme(延续)?

不是语言,但Art of the Metaobject Protocol是令人费解的东西

答案 4 :(得分:27)

来自Peter Norvig的网站:

“学习至少六种编程语言。包括一种支持类抽象的语言(如Java或C ++),一种支持功能抽象(如Lisp或ML),一种支持语法抽象(如Lisp),一种支持声明性规范(如Prolog或C ++模板),支持协同程序(如Icon或Scheme),支持并行性(如Sisal)。“

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

答案 5 :(得分:13)

令我惊讶的是,经过6个月和数百票,没有人提到 SQL ...

答案 6 :(得分:11)

在定理类型/高级类型系统中:Coq(我认为Agda也属于这一类)。

Coq是嵌入功能编程语言的证明助手。

您可以编写数学证明,Coq有助于构建解决方案。 您可以编写函数并证明它的属性。

它有依赖类型,这让我大吃一惊。一个简单的例子:

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

是一个函数的签名,它连接两个大小为n和m的元素的数组,并返回一个大小为(n + m)的数组。如果函数没有返回它,它将无法编译!

基于归纳结构的微积分,它背后有一个坚实的理论。 我不够聪明,无法理解这一切,但我认为值得一看,特别是如果你倾向于类型理论。

编辑:我需要提一下:你在Coq中编写一个函数然后你可以证明它对任何输入都是正确的,这太棒了!

答案 7 :(得分:6)

我感兴趣的其中一种语言有一个非常不同的观点(包括用于定义语言元素和激进差异语法的新词汇)是J。 Haskell对我来说是显而易见的选择,虽然它是一个功能性的lang,因为它的类型系统和其他独特的功能打开了你的思想,让你重新思考你以前的(功能)编程知识。

答案 8 :(得分:6)

数据流编程,也就是基于流程的编程,是前进的好方法。一些流行语:并行处理,快速原型设计,可视化编程(不像声音那么糟糕)。

维基百科的文章很好:

  

在计算机科学中,基于流动   编程(FBP)是一种编程   将应用程序定义为的范例   “黑匣子”流程网络,   它跨预定义交换数据   通过消息传递的连接,在哪里   指定了连接   在流程外部。这些   黑盒子进程可以重新连接   无休止地形成不同   应用程序,而不必是   内部改变了。因此FBP就是这样   自然是以组件为导向的。

阅读JPM的书:http://jpaulmorrison.com/fbp/

(我们在C ++中编写了一个用于家庭自动化目的的简单实现,我们对此非常满意。文档正在构建中。)

答案 9 :(得分:5)

就像雾已经在他的名单中向你提出的那样,我也建议你看一下语言OzML/Mozart 许多范例,主要针对并发/多代理编程。

关于并发性和分布式微积分,相当于Lambda演算(在函数编程背后)被称为Pi微积分。

我刚开始开始研究Pi演算的一些实现。但他们已经扩大了我对计算的看法。

答案 10 :(得分:5)

你学到了很多语言。现在是时候关注一种语言并掌握它。

答案 11 :(得分:4)

也许您可能想尝试使用LabView进行可视化编程,尽管它是出于工程目的。

尽管如此,你似乎对那里所有的东西都非常感兴趣,因此提出了建议

另外,你可以尝试使用android appinventor来直观地构建东西

答案 12 :(得分:2)

水星http://www.mercury.csse.unimelb.edu.au/

它是一个类型化的Prolog,具有唯一性类型和模式(即指定谓词append(X,Y,Z)意味着X附加到Y是Z,得到一个给定X和Y的Z,但是对于给定可以产生多个X / Y Z)。此外,没有剪切或其他超逻辑谓词。

如果你愿意,那就是Prolog,因为Haskell是Lisp。

答案 13 :(得分:2)

来自The Pragmatic Programmer的页面的Bruce A. Tate写了一本关于这一点的书: Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages

在书中,他涵盖了Clojure,Haskell,Io,Prolog,Scala,Erlang和Ruby。

答案 14 :(得分:1)

我从其他答案中看到的一件事是:基于术语重写的语言。

你可以看看Pure - http://code.google.com/p/pure-lang/

Mathematica也是基于重写的,虽然要弄清楚发生了什么并不容易,因为它相当封闭。

答案 15 :(得分:1)

虽然不符合您对“不同”的要求 - 但我敢打赌Fantom是一种专业程序员应该关注的语言。作为他们自己的承认,fantom的作者称之为无聊的语言。它只是支持Java和C#的最常见用例,其中一些借用了ruby和类似的新语言的闭包语法。

然而它设法拥有自己的自举编译器,提供一个安装时没有外部依赖关系的平台,得到正确的包 - 并且适用于Java,C#和现在的Web(通过js)。

它可能不会在新的编程方式上扩大你的视野,但它肯定会向你展示更好的编程方式。

答案 16 :(得分:1)

还有 anic

https://code.google.com/p/anic/

从其网站:

  

比C快,比Java更安全,比* sh更简单

     

anic是实验性,高性能,隐式并行,无死锁的通用数据流编程语言ANI的参考实现编译器。

它似乎不再处于积极的发展状态,但它似乎有一些有趣的概念(毕竟,这就是你似乎追求的目标)。

答案 17 :(得分:1)

Erlang,Forth和一些使用汇编语言的嵌入式工作。真;购买Arduino套件或类似的东西,并在组装中创建一个复音哔哔声。你真的会学到一些东西。

答案 18 :(得分:1)

的PostScript。它是一种相当有趣的语言,因为它是基于堆栈的,一旦你想把东西写在纸上并且你想要完成它或者解决它为什么不能完成它,它是非常实用的。

的Erlang。内在的并行性赋予它一种相当不寻常的感觉,你可以再次从中学到有用的东西。我不太确定实用性,但它对于一些快速原型设计任务和高度冗余的系统非常有用。

尝试编程GPU - CUDA或OpenCL。它只是C / C ++扩展,但是体系结构的心智模型与经典方法完全不同,一旦你需要完成一些真正的数字运算,它肯定会变得实用。

答案 19 :(得分:1)

对于自80年代中期以来没有出现过的人,我建议学习8位BASIC。它非常低级,非常原始,并且围绕它的洞进行编程是一个有趣的练习。

在同一条线上,我会选择一台HP-41C系列计算器(或仿真器,虽然没有什么比真正的硬件更好)。很难将你的大脑包裹起来,但非常值得。 TI-57可以做到,但将是一次完全不同的体验。如果您设法在TI-55上解决二次方程,您将被视为主控(它没有条件,除RST之外没有分支,将程序跳回到步骤0)。

最后,我选择了FORTH(之前提到过)。它有一个很好的“建立你的语言”Lisp-ish的东西,但更多的是裸机。它会告诉你为什么Rails很有意思,当DSL有意义的时候你会在你输入的时候对你的非RPN计算器的想法有所了解。

答案 20 :(得分:1)

虽然在大学水平上学习新语言是一个有趣的爱好,但恕我直言,在尝试将其应用于现实世界的问题之前,你无法学会使用它。所以,不是寻找一种新的语言来学习,而是在你的位置首先寻找一个新的东西来构建,然后我才会寻找适合该特定项目的正确语言。首先选择问题,然后选择工具,而不是相反..

答案 21 :(得分:1)

说你想写一首爱情诗......

不要仅仅因为已经掌握了一把锤子,而是学习适合该任务的工具:学会讲法语。

一旦你达到接近母语的水平,你就可以开始写你的诗了。

答案 22 :(得分:1)

  1. 编程不包括程序员的任务。
  2. 新事物总是很有趣,但有一些很酷的旧东西。
  3. 第一个数据库系统对我来说是dBaseIII,我花了大约一个月的时间来编写小例子(dBase / FoxPro / Clipper是一个带索引的基于表的数据库)。然后,在我的第一个工作场所,我遇到了MUMPS,我头疼。我年轻而且脑子很干,但花了两周的时间来理解MUMPS数据库模型。有一个时刻,就像在漫画中一样:两个星期后,一个按钮已经打开,灯泡在我的脑海里只是减轻了。 MUMPS是自然的,低水平的,非常快的。 (这是一个没有类型的不平衡,无格式的btree。)今天的趋势显示了回归的方式:NoSQL,键值db,多维数据库 - 所以只剩下一些步骤,我们到达了腮腺炎。

    以下是关于MUMPS优势的演示文稿:http://www.slideshare.net/george.james/mumps-the-internet-scale-database-presentation

    关于分层数据库的简短文档:http://www.cs.pitt.edu/~chang/156/14hier.html

    MUMPS全局变量的介绍(在MUMPS中,局部变量,short:locals是内存变量,全局变量,short:globals是“db变量”,设置一个全局变量立即转到磁盘上): http://gradvs1.mgateway.com/download/extreme1.pdf(PDF)

答案 23 :(得分:0)

APL,Forth和Assembly。

玩得开心。拿起Lego Mindstorm机器人套件和CMU的RobotC并编写一些机器人代码。当您编写必须“变脏”并与现实世界交互的代码时,就会发生一些事情,而您无法以其他任何方式学习这些代码。是的,相同的语言,但是视角非常不同。