学习理解不同方法和概念的重要语言是什么?
当你所有的是一把螺栓刀和一瓶伏特加酒时,一切看起来就像是Wolf Blitzer船屋门上的锁。 (如果你不读xkcd,请用锤子和钉子代替)
我目前编程Clojure,Python,Java和PHP,所以我熟悉C和LISP语法以及空白的东西。 我知道命令式的,function性的,不可变的,面向对象和一些types的系统和其他东西。 现在我想要更多!
什么是采取不同方法的语言,对于实际的工具select还是理论上的理解都是有用的。
我不想学习另一个函数式语言(Haskell)或另一种命令性的OOP语言(Ruby),也不想练习像Brainfuck这样不切实际的有趣语言。
我发现自己的一个非常有趣的东西是像单因素堆叠的基于语言的语言。
只有当我觉得我理解了大多数的概念,并且能够回答所有的问题时,我才会开始思考我自己的玩具语言来包含我个人的喜好。
实用性问题是非常主观的,所以我只是说学习不同的语言范式只会使你成为一个更好的程序员。 什么比这更实际?
function,哈斯克尔 – 我知道你说过你不想,但你真的应该真的重新考虑。 你已经用Clojure甚至Python进行了一些function性的曝光,但是如果没有Haskell,你还没有经历过。 如果你真的反对Haskell,那么好的妥协是ML或OCaml。
声明式,数据logging – 许多人会在这个插槽中推荐Prolog,但是我认为Datalog是一个声明式语言的更清晰的例子。
Array,J – 我只是刚刚发现了J,但是我觉得它是一个很棒的语言。 它会把你的头脑变成椒盐脆饼。 你会感谢J的。
Stack,Factor / Forth – Factor是非常强大的,我打算尽快进行研究。 Forth是Stack语言的老大,作为一个额外的好处,它很容易实现自己。 通过实施来学习是有一定道理的。
数据stream,奥兹 – 我认为奥兹的影响是在上升,将来只会继续增长。
基于原型的JavaScript / Io / Self -Self是每个基于原型的语言的最大的影响力。 这与基于类的面向对象不一样,不应该这样对待。 很多人都会用原型语言来创build一个专门的课堂系统,但如果你的目标是扩大你的想法,那么我认为这是一个错误。 使用该语言的全部能力。 阅读组织程序没有类的想法。
专家系统,CLIPS – 我总是推荐这个。 如果你了解Prolog,那么你可能会在速度上占据上风,但这是一种非常不同的语言。
Frink – Frink是一种通用语言,但它以单位转换系统而闻名。 我觉得这种语言是非常鼓舞人心的,坚持不懈地努力做到最好。 另外…这真的很有趣!
function+可选types,齐 – 你说你有一些types系统的经验,但是你有“可换肤*types系统的经验吗?没有人有……但他们应该。”在很多方面,型系统会打击你的思想。
参与者+容错,Erlang – Erlang的过程模型获得了许多嗡嗡声,但其容错和热代码交换机制是改变游戏规则的。 你不会学到很多关于FP的东西,你不会用Clojure学习,但是它的FT特性会让你想知道为什么更多的语言似乎无法做到这一点。
请享用!
关于Prolog(统一/回溯等),Smalltalk(对于“所有的信息”),Forth(反向波兰语,线程化的解释器等),Scheme(continuation)呢?
不是一种语言,但“ 元数据对象协议”的艺术是令人挠头的东西
我目前正在编程Clojure,Python,Java和PHP […]什么是采取不同方法的语言,对于实际的工具select还是理论上的理解都是有用的?
C
有很多 C代码躺在这里 – 这是绝对实用的。 如果你也学习C ++,还有很多更多的代码(而且一旦你了解C和Java,这个飞跃就会缩短)。
它也让你(或者迫使你)对一些理论问题有一个很好的理解; 例如,每个正在运行的程序在某种意义上存在于一个4 GB的字节数组中。 C中的指针实际上只是这个数组的索引—它们只是一个不同的整数。 Java,Python,PHP没有什么不同,隐藏在表层之下。
另外,你可以在C中编写面向对象的代码,你只需要对vtables等进行一些手工操作。 Simon Tatham的Portable Puzzle Collection是一个相当容易访问的面向对象的C代码的好例子; 这也是相当不错的devise,非常值得初学者/中级C程序员阅读。 这也是Haskell发生的事情 – types类在某种意义上是“另一个vtable”。
关于C的另一件好事:与熟练的C程序员一起参与问答会给你很多解答C的底层构造方面的答案,这就构成了你更接近于铁的知识库。
我可能会错过OP的观点 – 我认为我是从其他答案来判断—但是我认为这可能是对其他有类似问题的人有用的答案,并阅读了这个主题。
我是第二个Haskell。 不要以为“我知道一个Lisp,所以我知道函数式编程”。 曾听说过typesclass? 代数数据types? 单子? “现代”(或多或less – 至less不超过50岁))function语言,尤其是Haskell已经探索了大量非常有用的新概念。 types类添加专门的多态性,但是types推理(另一种你已经知道的语言是没有的)就像一个魅力。 代数数据types简直太棒了,尤其是对树状数据结构进行build模,但对于枚举或简单logging也可以。 还有monad …好吧,让我们只是说人们用纯粹的function方式来使用它们来制造exception,I / O,parsing器,列表parsing等等。
而且,整个话题都足以让人们忙碌多年;)
来自Peter Norvig的网站:
“学习至less6种编程语言,包括一种支持类抽象(如Java或C ++)的语言,一种支持function抽象(如Lisp或ML)的语言,一种支持语法抽象(如Lisp)的语言,一种支持声明规范(如Prolog或C ++模板),支持协同程序(如Icon或Scheme)的规范,以及支持并行规范(如Sisal)的规范。
我很惊讶,经过6个月和数百票,没有人提到SQL …
在定理/高级types系统的types中:Coq(我认为Agda也属于这一类)。
Coq是embedded到function性编程语言中的certificate助手。
你可以写mathcertificate,Coq有助于build立一个解决scheme。 你可以编写函数并且certificate它的性质。
它有独立的types,只有这一点让我心碎。 一个简单的例子:
concatenate: forall (A:Set)(nm:nat), (array A m)->(array A n)->(array A (n+m))
是函数的签名,它连接两个大小为n和m的元素的数组,并返回大小为(n + m)的数组。 如果函数不返回,它将不会编译!
基于归纳结构的演算,它有一个坚实的理论背后。 我没有足够的智慧来理解这一切,但我认为值得一看,特别是如果你趋向于types理论。
编辑:我需要提到:你在coq写一个函数,然后你可以certificate它是正确的任何input,这是惊人的!
我感兴趣的语言之一有一个非常不同的观点(包括一个新的词汇来定义语言元素和激进的差异语法)是J。 Haskell对我来说是显而易见的select,虽然它是一个function性的语言,因此它的types系统和其他独特的function可以打开你的想法,并使你重新思考以前在(function)编程方面的知识。
数据stream编程,也就是基于stream程的编程是前进的一个很好的步骤。 一些stream行语:并行处理,快速原型,可视化编程(不像声音一样糟糕)。
维基百科的文章很好:
在计算机科学中,基于stream程的编程(FBP)是一种编程模式,将应用程序定义为“黑盒子”进程的networking,通过消息传递在预定义连接之间交换数据,其中连接在进程外部指定。 这些黑匣subprocess可以无限重新连接,形成不同的应用程序,而不必在内部进行更改。 FBP因此自然是面向组件的。
- http://en.wikipedia.org/wiki/Flow-based_programming
- http://en.wikipedia.org/wiki/Dataflow_programming
- http://en.wikipedia.org/wiki/Actor_model
阅读JPM的书: http : //jpaulmorrison.com/fbp/
(我们用C ++编写了一个简单的实现用于家庭自动化的目的,我们对此非常满意,文档正在build设中。)
就像fogus在他的列表中向你build议的那样,我也build议你看OzML / Mozart的语言。许多范例,主要针对并发/多代理编程。
关于并发性和分布式微积分,相当于Lambda演算(在函数式编程之后)被称为Pi演算。
我只是开始开始研究Pi演算的一些实现。 但是他们已经扩大了我的计算概念。
- 皮克特
- 游牧的象形文字
- FunLoft 。 (这是最近的,在INRIA构想)
你学过很多语言。 现在是时候专注于一种语言,掌握它。
也许你可能想尝试LabView的可视化编程,虽然它是为了工程目的。
不过,你似乎对所有这些都非常感兴趣,因此build议
此外,你可以尝试android appinventor可视化build设的东西
布鲁斯·A·泰特(Bruce A. Tate)从“语用程序员”那里读了一个书,他写了一本书:“ 七周中的七种语言:编程语言学习的实用指南”
在书中,他涵盖了Clojure,Haskell,Io,Prolog,Scala,Erlang和Ruby。
水星 : http : //www.mercury.csse.unimelb.edu.au/
它是一个types化的Prolog,它具有唯一性types和模式(即指定谓词append(X,Y,Z)
意味着附加到Y的X是Z,给出一个给定X和Y的Z,但是可以给出给定的多个X / Y Z)。 另外,不要削减或其他额外的逻辑谓词。
如果你愿意的话,那就是Prolog,Haskell就是Lisp。
- 编程不包括程序员的任务。
- 新的东西总是很有趣,但有一些非常酷的旧东西。
我的第一个数据库系统是dBaseIII,我花了大约一个月写小例子(dBase / FoxPro / Clipper是一个基于表的数据库与索引)。 然后,在我的第一个工作场所,我遇到了妈妈,我头痛。 我年轻,新鲜,但花了2周的时间才明白MUMPS数据库模型。 有一段时间,就像漫画一样:两周后,一个button已经打开,灯泡在我脑海中闪烁。 MUMPS是自然的,低水平的,而且非常快。 (这是一个没有types的不平衡的,非forms化的btree)今天的趋势显示了它的方式:NoSQL,键值分贝,多维分贝 – 所以只剩下一些步骤,我们到达腮腺炎。
以下是关于MUMPS优势的介绍: http ://www.slideshare.net/george.james/mumps-the-internet-scale-database-presentation
关于分层数据库的简短文档: http : //www.cs.pitt.edu/~chang/156/14hier.html
MUMPS全局variables简介(在MUMPS中,局部variables,简写为:locals是内存variables,全局variables是shortvariables,globals是“dbvariables”,设置一个全局variables立即到达磁盘): http:// gradvs1.mgateway.com/download/extreme1.pdf(PDF )
假设你想写一首爱情诗
学习恰当的工具来学习说法语,而不是仅仅因为手中已经有一把锤子而使用锤子。
一旦你达到了近乎本土的语言水平,你就可以开始你的诗歌了。
虽然在学术水平上学习新的语言是一个有趣的爱好,恕我直言,你不能真正学会使用一个,直到你尝试应用于一个现实世界的问题。 所以,我不是在寻找一种新的语言来学习,而是首先寻找一些新的东西来build立,然后才会寻找适合这个特定项目的正确的语言。 首先挑选问题,然后是工具,而不是相反。
对于从80年代中期以来一直没有的人,我build议学习8位BASIC。 这是非常低级的,非常原始的,这是一个有趣的练习围绕它的漏洞编程。
在同一行上,我会select一台HP-41C系列计算器(或者仿真器,虽然没有什么比真正的硬件好)。 很难把你的大脑包裹起来,但是非常值得。 一个TI-57会做,但会是一个完全不同的体验。 如果你设法在TI-55上求解二次方程,你将被认为是一个主(它没有条件,除RST之外没有分支,将程序跳回到第0步)。
最后,我selectFORTH(之前提到过)。 它有一个很好的“build立你的语言”Lisp的东西,但是更多的裸机。 它会教你为什么Rails是有趣的,当DSLs是有意义的,你会在你的非RPN计算器在键入时想的是什么。
后记。 这是一个相当有趣的语言,因为它是基于堆栈的,而且一旦你想把东西写在纸上,而且你想要完成它或者排除故障,为什么它没有完成,这是相当实用的。
二郎。 内在的平行性给它一个相当不寻常的感觉,你可以再次从中学习有用的东西。 我不太确定实用性,但对于一些快速原型制作任务和高度冗余的系统可能会有用。
尝试编程GPU(CUDA或OpenCL)。 这只是C / C ++扩展,但是架构的心智模型与经典的方法完全不同,而且一旦你需要得到一些真正的数字处理,它肯定会变得实用。
Erlang,Forth和一些使用汇编语言的embedded式工作。 真; 购买一个Arduino套件或类似的东西,并在组装中创build一个和弦蜂鸣声。 你真的会学到一些东西
还有anic :
https://code.google.com/p/anic/
来自其网站:
比C更快,比Java更安全,比* sh更简单
anic是实验性,高性能,隐式并行,无死锁的通用数据stream编程语言ANI的参考实现编译器。
它似乎没有得到积极的发展,但似乎有一些有趣的概念(毕竟,这似乎是你以后)。
虽然不符合你的“不同”的要求 – 我敢打赌, Fantom是一个专业程序员应该看的语言。 fantom的作者自己承认,这是一种无聊的语言。 它只是支持Java和C#最常见的用例,还有一些借用ruby和类似的新语言的闭包语法。
然而,它pipe理着自己的引导编译器,提供了一个平台,在没有外部依赖的情况下进行安装,得到正确的包 – 并且在Java,C#和现在的Web上(通过js)工作。
从新的编程方式来看,它可能不会拓宽你的视野,但它肯定会向你展示更好的编程方式。
有一件事我从其他答案中看不到:基于术语重写的语言。
你可以看看Pure – http://code.google.com/p/pure-lang/ 。
Mathematica也是基于重写的,虽然不太容易弄清楚发生了什么,因为它是封闭的。
APL,Forth和大会。
玩得开心点 拿起Lego Mindstorm机器人套件和CMU的RobotC,写一些机器人代码。 当你编写的代码必须“变脏”,并与真实的世界进行交互时,事情就会发生。 是的,同一种语言,但是截然不同。