要学会了解不同的方法和概念的重要语言是什么?[关闭]


172

当您只有一对断线钳和一瓶伏特加酒时,一切看起来都像沃尔夫·布利策(Wolf Blitzer)船屋门上的锁一样。(如果您不阅读xkcd,请用锤子和钉子代替)

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

什么语言采用不同的方法,并且对于选择实用工具或理论理解都将有用?

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

我发现自己很有趣的一件事是像Factor这样的基于单字符堆栈的语言。

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


3
我想单独为xkcd参考+1,但是这个问题也很有趣。

63
您似乎是一个成功的程序员,其余的都是增量的。不是想当鸡巴,而是...您的生活在财务上,人际关系,健康,娱乐,爱好方面如何?也许现在正是时候追求其中一些东西的时候了。我不认为您需要一次了解十多种语言。如果您有酬劳使用一个,请学习。如果您想写一本关于它的书,请学习。除此之外,您还具有良好的编程基础。为什么要学习一些东西(例如J-我的主观意见:)),而您不会在任何地方认真使用(请阅读make $)?不要在公墓里成为最酷的黑客。
Hamish Grubijan 2010年

6
是的,按照我自己的标准,我是一名成功的程序员。我目前挣的钱不多,但是,我19岁。我在所有这些方面都花了很多时间,但是我在编程中发现了乐趣和乐趣。我还想说,理解语言和掌握语言是有区别的。精通Python和Clojure对我来说就足够了。我确实想了解其他选项,因为它将改善我的代码,帮助我理解我的计算机,并帮助我定义自己的编程语言。
Pepijn 2010年

5
您看过Programmers.SE吗?这属于在那里最好提出的问题类型。

3
这本书可能很有趣:七个星期中的七种语言:实用语言学习编程语言,作者布鲁斯·泰特(Bruce A. Tate)
马丁·巴

Answers:


287

实用性是高度主观的,因此我只想简单地说,学习不同的语言范例只会使您成为一个更好的程序员。还有什么比这更实际的呢?

功能性,Haskell-我知道您说过您不想这样做,但您应该真正考虑一下。您已经使用Clojure甚至Python获得了一些功能方面的知识,但是如果没有Haskell,就不会充分体验它。如果您真的反对Haskell,则可以选择ML或OCaml作为妥协。

声明式,数据日志-许多人会在此位置推荐Prolog,但我认为Datalog是声明式语言的较干净的示例。

Array,J-我刚刚发现J,但是我发现它是一种令人赞叹的语言。它将使您的大脑变成椒盐脆饼。您将为此感谢J。

Stack,Factor / Forth -Factor非常强大,我打算尽快对其进行研究。Forth是Stack语言的祖父,此外,它很容易实现。关于通过实施进行学习,有话要说。

Oz数据流-我认为Oz的影响正在上升,并且只会在未来继续增长。

基于原型的JavaScript / Io /自我-自我是祖父,并且对每种基于原型的语言都具有很大的影响力。这与基于类的OOP不同,不应将其视为此类。许多人使用一种原型语言并创建了一个临时类系统,但是如果您的目标是扩大思维范围,那么我认为这是一个错误。充分利用语言。阅读无课程组织程序以获取想法。

CLIPS专家系统-我始终建议您这样做。如果您了解Prolog,那么您很有可能会上手,但是这是一种非常不同的语言。

Frink -Frink是一种通用语言,但以单位转换系统而闻名。我发现这种语言在不懈地追求最好的过程中非常令人鼓舞。另外...真的很有趣!

功能+可选类型,Qi-您说您曾经使用过某些类型系统,但是您是否有过“可滑动*类型系统”的经验?没有人……但是他们应该。类型系统会让您大吃一惊。

Actors + Fault-tolerance,Erlang -Erlang的过程模型引起了很多轰动,但其容错和热代码交换机制却改变了游戏规则。您不会像使用Clojure会学到的那样了解很多关于FP的知识,但是它的FT功能会让您想知道为什么更多的语言似乎无法正确解决这一问题。

请享用!


8
+1-一个很好的答案。
duffymo 2010年

2
感谢您指出我要学习的多种语言。

2
我将为基于演员的编程添加Erlang,为并行编程添加Fortress。
nickik 2010年

2
+1为Erlang的热插拔和容错识别
麦克风2010年

14
没有组装吗?了解处理器如何工作以了解他们喜欢哪种代码是一件好事。
尼克T

33

关于Prolog(用于统一/回溯等),Smalltalk(用于“所有信息”),Forth(反向抛光,线程解释器等),Scheme(继续)呢?

不是语言,而是元对象协议艺术是令人费解的


如果我错了,请纠正我,但是我认为Python sortof已经可以继续了。从我所读的内容中,我宁愿学习Factor和Objective-C,也不愿学习Forth和Smalltalk,但是我可能在这里偷工减料。
Pepijn

1
@ pepijn,python没有一流的延续(尽管我正在研究字节码黑客来伪造它)
aaronasterling 2010年

1
Objective-C源自Smalltalk,但我认为ST的真正收获在于环境本身的活力。
约翰·克罗马蒂

33

我第二个Haskell。不要以为“我知道Lisp,所以我知道函数式编程”。听说过类型课吗?代数数据类型?单子?“现代”(或多或少-至少没有50年的历史;))功能语言,尤其是Haskell,已经探索了许多非常有用的有用新概念。类型类增加了即席的多态性,但是类型推断(又是您已经知道的语言所不具备的另一种东西)的作用却很吸引人。代数数据类型简直棒极了,特别是对于树状数据结构建模,但对于枚举或简单记录也很有效。和monads ...好吧,我们只能说人们使用它们来以纯功能的方式来产生异常,I / O,解析器,列表推导等等。

另外,整个主题足够深入,足以使一个人忙几年了;)


“而且,整个主题足够深入,足以让一个人忙几年了;)”-我想知道,为什么这会是一件好事?毕竟,我们的生活是有限的。
vegai

1
@vegai:为什么这会是一件坏事?花一生比学习更糟糕的方法。而且没有人说您必须学习多年才能正确使用该语言-只是在很短的时间之后这个主题就没有穷尽。(还要注意笑脸-该部分并不完全严重。)

32

我目前正在编写Clojure,Python,Java和PHP [...]哪些语言采用不同的方法,它们对于实用工具的选择或理论理解都是有用的?

C

周围有很多C代码-绝对是实用的。如果您也学习C ++,那么周围会有更多的代码(一旦您了解C和Java,飞跃就会很短)。

它还使您(或迫使您拥有)对一些理论问题的深刻理解;例如,从某种意义上讲,每个正在运行的程序都位于4 GB字节数组中。C中的指针实际上只是该数组的索引-它们只是另一种整数。除了隐藏在表面层之下之外,Java,Python和PHP都没有什么不同。

另外,您可以用C编写面向对象的代码,而您只需要对vtables之类的手册有所了解。西蒙·塔瑟姆(Simon Tatham)的Portable Puzzle Collection是一个相当容易访问的面向对象C代码的很好的例子。它的设计也相当好,值得初学者/中级C程序员阅读。这在Haskell中也发生了-在某种意义上,类型类“只是另一个vtable”。

关于C的另一件好事:与熟练的C程序员进行问答,将为您提供许多答案,这些答案从较低层次的结构方面解释了C,从而建立了您最基础的知识库。

我可能会遗漏OP的要点-我想我是根据其他答案来判断--但我认为这可能对其他有类似问题并阅读此主题的人来说是有用的答案。


1
这需要更多的投票。当您需要或想要深入了解裸机并从头开始了解机器的工作原理时,C是第一语言。而且,它也是一种非常通用的C编译器,几乎可以用于所有已设计的CPU架构。
Dietr 2011年

27

在Peter Norvig的网站上:

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

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



10

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

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

您可以编写数学证明,Coq可以帮助您建立解决方案。您可以编写函数并证明其属性。

它具有依赖类型,仅此而已令我震惊。一个简单的例子:

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

是将A的元素的大小为n和m的两个数组连接起来并返回大小为(n + m)的数组的函数的签名。如果函数不返回则不会编译!

基于归纳结构的演算,其背后有扎实的理论。我不够聪明,无法理解所有内容,但是我认为值得一看,特别是如果您趋向于类型理论。

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


我第二次。在学习大多数语言时,您仍然可以使用旧的技术,但是coq会迫使您编写总能正常工作的程序。
布鲁诺·马丁内斯

去年夏天,我尝试学习Coq,但由于我很难找到学习和使用Coq的文档而放弃了。有什么建议么?

我从大学的一门课程中学到了东西,然后读了“ Coq'Art:归纳结构的微积分”,要真正掌握它还不够,但要欣赏它就足够了。
布鲁诺·马丁内斯

6

其中一个我有兴趣为具有非常不同的角度(包括一个新的词汇来定义语言元素和自由基DIFF语法)的语言是Ĵ。Haskell对我来说是显而易见的选择,尽管它是功能性lang,它的类型系统和其他独特功能使您大开眼界,并使您重新思考(功能)编程方面的先前知识。


5

就像fogus在他的清单中向您建议的一样,我也建议您也看看OzML / Mozart语言的 许多范式,主要针对并发/多代理编程。

关于并发和分布式演算,Lambda演算的等效项(在函数式编程之后)称为Pi演算。

我才刚刚开始研究Pi演算的某些实现。但是他们已经扩大了我对计算的概念。


5

数据流编程(又名基于流的编程)是前进的重要一步。一些流行语:paralell处理,快速原型设计,可视化编程(不像听起来那么糟糕)。

维基百科的文章很好:

在计算机科学中,基于流的编程(FBP)是一种编程范例,将应用程序定义为“黑匣子”进程的网络,该进程通过消息传递在预定义的连接之间交换数据,其中连接是在进程外部指定的。这些黑匣子进程可以无限地重新连接以形成不同的应用程序,而无需在内部进行更改。因此,FBP自然是面向组件的。

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

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


+1,我相信数据流和基于流的编程(可能还会是功能响应式编程)将成为我们多核未来的重要组成部分。

5

您已经学到很多语言。现在是专注于一种语言并掌握它的时候了。


3

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

不过,您似乎对那里的一切都非常感兴趣,因此建议

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


LabView有一个有趣的“语法”,但是单击并拖动所有代码确实很痛苦。我不会推荐给程序员。
伊什塔尔2010年

那就是Lego NXT附带的东西,对吗?完全不适合我。(还是)感谢你的建议。
Pepijn

来自美国国家仪器 LabVIEW是一种图形化开发环境,可提高科学家和工程师的工作效率
Belun

2

布鲁斯·泰特(Bruce A. Tate)在《实用程序员》的专页上写了一本书,内容确切地是:《 七周内的七种语言:学习编程语言的实用指南》

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


2
请注意,这本书充满了对电影的引用,这些电影显然已经成为美国流行文化的一部分。如果您还没有看过电影,那您将不知塔特(Tate)到底在干什么。如果您看过电影,可能仍会因编程语言的不断拟人化或根本不喜欢有问题的人物而感到沮丧(我不喜欢Mary Poppins;碰巧的是我也不喜欢Ruby,所以比喻可能在某事上)。
艾伦·梅

2

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

这是一种类型化的Prolog,具有唯一性类型和模式(即,指定谓词append(X,Y,Z)含义X附加到Y上的Z为Z,给定X和Y时产生一个Z,但对于给定Z可以产生多个X / Y)。同样,也没有剪切或其他逻辑外的谓词。

如果您愿意的话,就像Haskell对Lisp一样,这是Prolog。


1
  1. 编程不涵盖程序员的任务。
  2. 新事物总是很有趣,但也有一些很酷的旧事物。

对我来说,第一个数据库系统是dBaseIII,我花了大约一个月的时间编写了一些小示例(dBase / FoxPro / Clipper是基于表的具有索引的数据库)。然后,在我的第一个工作场所,我遇到了MUMPS,并且感到头痛。我还很年轻,头脑清醒,但是花了2周的时间才了解MUMPS数据库模型。有一段时间,就像在漫画中一样:两周后,打开了一个按钮,灯泡就在我的脑海中点亮了。MUMPS是自然的,低级别的,而且非常快。(这是一个没有类型的不平衡,不形式化的btree。)今天的趋势表明了回到它的方式:NoSQL,键值db,多维db-所以只剩下一些步骤了,我们达到了Mumps。

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

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

MUMPS全局变量简介(在MUMPS中,局部变量,简称:局部变量是内存变量,而全局变量,简称:全局变量是“ db变量”,设置全局变量立即进入磁盘): http:// gradvs1.mgateway.com/download/extreme1.pdf(PDF


1

假设您想写一首爱情诗...

不要仅仅因为手里已经有锤子而使用锤子,而要学习完成任务的适当工具:学会说法语。

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


4
当然,这将是一首垃圾诗,因为您需要讲的语言水平要高于普通母语才能写诗。而且您的女友需要学习法语才能阅读。除非她已经是法国人,否则在这种情况下她可能会感到尴尬。
约翰·劳伦斯·阿斯普登

讽刺的是,约翰,约翰,我喜欢(我是法国人,顺便说一句)
Vinzz

1

虽然在学术层面上学习新语言是一个有趣的爱好,但是恕我直言,除非您尝试将其应用于现实世界中的问题,否则您无法真正学会使用一种语言。因此,我不是在寻找一种新的语言,而是在您的地方寻找一种新的东西来构建,然后才寻找适合该特定项目的正确语言。首先选择问题,然后选择工具,而不是相反。


1

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

在同一行上,我选择了HP-41C系列计算器(或仿真器,尽管没有什么比真正的硬件更好)。很难将大脑包裹住,但是值得。TI-57可以,但是将是完全不同的体验。如果您设法在TI-55上求解二阶方程,那么您将被视为大师(除了RST外,它没有条件,也没有分支,它使程序跳回到了步骤0)。

最后,我选择FORTH(之前提到过)。它有一个不错的“建立语言”的Lisp风格的东西,但是更裸露。它会教您为什么Rails会很有趣,以及什么时候可以使用DSL,并且您在打字时也会对非RPN计算器的想法有所了解。


1

后记。它是一种非常有趣的语言,因为它是基于堆栈的,并且一旦您想将其放在纸上并且想要完成它或解决为什么未完成的问题时就非常实用。

二郎 内在的并行性给人一种非常不寻常的感觉,您可以再次从中学习有用的东西。我不太确定实用性,但是它对某些快速原型设计任务和高度冗余的系统很有用。

尝试对GPU进行编程-CUDA或OpenCL。它只是C / C ++扩展,但是架构的思维模型再次与经典方法完全不同,一旦您需要完成一些实际的数字运算,它肯定会变得实用。


1

Erlang,Forth和一些嵌入式语言都可以使用汇编语言。真; 购买Arduino套件或类似的东西,然后在组装中创建和弦蜂鸣声。您将真正学到一些东西。


1

还有anic

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

从其站点:

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

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

它似乎不再处于活跃的开发中,但是似乎有一些有趣的概念(毕竟,这正是您所追求的)。


1

在不满足您对“不同”的要求的同时,我敢保证Fantom是专业程序员应该看的一种语言。自己承认,fantom的作者称其为无聊的语言。它只是支持了Java和C#的最常见用例,并从ruby和类似的较新语言中借来了一些关闭语法。

但它设法拥有自己的自举编译器,提供一个无需外部依赖即可安装的平台,可以正确安装软件包,并且可以在Java,C#和现在的Web上运行(通过js)。

它可能不会在新的编程方法方面开阔您的视野,但是它一定会向您显示更好的编程方法。



0

APL,Forth和Assembly。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.