Pep*_*ijn 172 language-agnostic programming-languages
当你拥有的是一对断线钳和一瓶伏特加酒时,一切看起来就像是Wolf Blitzer船库门上的锁.(如果你不读xkcd,用锤子和钉子代替)
我目前正在编写Clojure,Python,Java和PHP,所以我熟悉C和LISP语法以及空白事物.我知道命令式,功能性,不可变性,OOP和几种类型的系统和其他东西.现在我想要更多!
什么是采用不同方法的语言,对实际工具选择或理论理解有用?
我不想学习另一种函数式语言(Haskell)或其他命令式OOP语言(Ruby),也不想练习像Brainfuck这样不切实际的有趣语言.
我发现自己的一个非常有趣的事情是基于单声道堆栈的语言,如Factor.
只有当我觉得我理解了大多数概念并对我的所有问题都有答案时,我才想开始考虑我自己的玩具语言,以包含我所有的个人喜好.
fog*_*gus 287
实用性问题非常主观,所以我只想说学习不同的语言范式只会让你成为一个更好的程序员.还有什么比这更实际的?
功能性,Haskell - 我知道你说过你不想这样做,但你真的应该重新考虑.你已经通过Clojure甚至是Python获得了一些功能,但是如果没有Haskell,你就没有充分体验过它.如果你真的反对Haskell,那么好的妥协就是ML或OCaml.
声明式,数据记录 - 很多人会在这个插槽中推荐Prolog,但我认为Datalog是一个更清晰的声明性语言示例.
数组,J - 我刚刚发现了J,但我发现它是一种令人惊叹的语言.它会把你的思绪扭曲成椒盐卷饼.你会感谢J的.
Stack,Factor/Forth - 因子非常强大,我打算尽快深入研究它.Forth是Stack语言的祖父,作为一个额外的奖励,它很容易实现自己.通过实施学习有一些东西可以说.
Dataflow,Oz - 我认为Oz的影响力正在上升,并且将来只会继续增长.
基于原型的JavaScript/Io/Self -Self是对每一种基于原型的语言都具有重要影响力的大爸爸.这与基于类的OOP不同,不应该这样对待.许多人来到原型语言并创建一个特殊的类系统,但如果你的目标是扩展你的思想,那么我认为这是一个错误.完全使用该语言.阅读没有类的组织程序以获取想法.
专家系统,CLIPS - 我总是推荐这个.如果你知道Prolog那么你可能会在速度上占上风,但这是一种非常不同的语言.
Frink - Frink是一种通用语言,但它以单位转换系统而闻名.我发现这种语言在其不懈的努力中是非常鼓舞人心的,因为它能做到最好.另外......真的很有趣!
功能+可选类型,齐 - 你说你有一些类型系统的经验,但你有"skinnable*类型系统的经验吗?没有人......但是他们应该."Qi在很多方面都像Lisp,但它的类型系统会让你大吃一惊.
演员+容错,Erlang - Erlang的流程模型引起了很多关注,但它的容错和热代码交换机制正在改变游戏规则.你不会学到很多关于你不会用Clojure学习的FP,但它的FT功能会让你想知道为什么更多的语言似乎无法做到这一点.
请享用!
小智 33
我是第二个Haskell.不要以为"我知道一个Lisp,所以我知道函数式编程".有没有听过类型课?代数数据类型?单子?"现代"(或多或少 - 至少不到50岁;))函数式语言,尤其是Haskell,已经探索了许多非常强大有用的新概念.类型类添加了ad-hoc多态,但类型推断(你已经知道的另一种语言没有)就像魅力一样.代数数据类型非常棒,特别是对于树状数据结构的建模,但对于枚举或简单记录也可以正常工作.而且monad ......好吧,我们只是说人们使用它们来制作异常,I/O,解析器,列表推导等等 - 以纯粹的功能方式!
此外,整个主题足够深,可以让一个人忙碌多年;)
Jon*_*ker 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的观点---我认为我是,从其他答案来判断---但我认为这对其他有类似问题并阅读此帖的人来说可能是一个有用的答案.
Gal*_*tus 27
来自Peter Norvig的网站:
"学习至少六种编程语言.包括一种支持类抽象的语言(如Java或C++),一种支持函数抽象(如Lisp或ML),一种支持语法抽象(如Lisp),一种支持声明规范(如Prolog或C++模板),支持协同程序(如Icon或Scheme),以及支持并行(如Sisal)的规范."
http://norvig.com/21-days.html
GCl*_*unt 10
在定理类型/高级类型系统中:Coq(我认为Agda也属于这一类).
Coq是嵌入到功能编程语言中的证明助手.
您可以编写数学证明,Coq有助于构建解决方案.您可以编写函数并证明它的属性.
它有依赖类型,这让我大吃一惊.一个简单的例子:
concatenate: forall (A:Set)(n m:nat), (array A m)->(array A n)->(array A (n+m))
Run Code Online (Sandbox Code Playgroud)
是一个函数的签名,它连接两个大小为n和m的元素的数组,并返回一个大小为(n + m)的数组.如果函数没有返回它,它将无法编译!
是基于归纳结构的微积分,它背后有一个坚实的理论.我不够聪明,无法理解这一切,但我认为值得一看,特别是如果你倾向于类型理论.
编辑:我需要提一下:你在Coq中编写一个函数然后你可以证明它对于任何输入都是正确的,这太棒了!
就像fogus在他的列表中向你提出的一样,我也建议你看看语言OzML/Mozart 很多范例,主要针对并发/多代理编程.
关于并发性和分布式微积分,相当于Lambda演算(在函数编程背后)被称为Pi微积分.
我刚开始开始研究Pi演算的一些实现.但他们已经扩大了我的计算概念.
数据流编程,也就是基于流程的编程,是前进的良好步骤.一些流行语:并行处理,快速原型设计,可视化编程(不像声音那么糟糕).
维基百科的文章很好:
在计算机科学中,基于流的编程(FBP)是一种编程范例,它将应用程序定义为"黑匣子"进程的网络,这些进程通过消息传递在预定义的连接之间交换数据,其中连接在进程外部指定.这些黑盒子进程可以无限重新连接以形成不同的应用程序,而无需在内部进行更改.因此FBP自然是面向组件的.
阅读JPM的书:http://jpaulmorrison.com/fbp/
(我们在C++中编写了一个用于家庭自动化目的的简单实现,我们对此非常满意.文档正在构建中.)