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

What are important languages to learn to understand different approaches and concepts?

当你只有一对断线钳和一瓶伏特加时,一切看起来就像沃尔夫·布利泽船坞门上的锁。(如果你不读xkcd,用锤子和钉子代替它)

我目前对Culjule、Python、Java和PHP进行编程,所以我熟悉C和LISP语法以及空白空间的东西。我知道命令、功能、不变、OOP和一些类型的系统以及其他东西。现在我想要更多!

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

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

有一件很有趣的事我发现自己是基于单一标志的堆栈语言,比如factor。

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


实用性的问题是非常主观的,所以我简单地说,学习不同的语言范例只会使你成为一个更好的程序员。还有什么比这更实际的呢?

功能性,哈斯克尔-我知道你说过你不想,但你真的应该重新考虑。在Clojure甚至是Python中,您已经获得了一些功能性的曝光,但是没有Haskell,您还没有充分体验过它。如果你真的反对哈斯凯尔,那么好的折衷方案是毫升或奥卡毫升。

声明性的,数据日志——很多人都会建议在这个槽中使用prolog,但我认为数据日志是声明性语言的一个更清晰的例子。

数组,j-我刚刚发现j,但我发现它是一种令人惊叹的语言。它会把你的思想变成椒盐卷饼。你会为此感谢J的。

Stack,factor/forth-factor非常强大,我计划尽快深入研究它。第四个是栈语言的鼻祖,作为一个额外的奖励,实现自己很简单。关于通过实施来学习,有一些话要说。

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

基于原型,javascript/io/self-self是祖宗,对每种基于原型的语言都有很大的影响。这与基于类的OOP不同,不应该这样对待。许多人使用原型语言并创建一个特别的类系统,但是如果你的目标是扩展你的思想,那么我认为这是一个错误。充分使用该语言。阅读组织没有课程的课程以获取想法。

专家系统,剪辑-我总是推荐这个。如果你知道prolog,那么你很可能在提高速度方面占上风,但是它是一种非常不同的语言。

frink-frink是一种通用语言,但它以单位转换系统而闻名。我发现这门语言在其不懈的努力中是非常鼓舞人心的,它在做什么方面都是最好的。加上…真的很有趣!

功能+可选类型,qi-你说你有一些类型系统的经验,但是你有"可剥皮"类型系统的经验吗?没有人…但他们应该。气在很多方面都像口齿不清,但它的类型系统会让你心烦意乱。

actors+fault-tolerance,erlang-erlang的过程模型得到了广泛关注,但其容错和热代码交换机制正在改变游戏规则。你不会学到很多你不会用clojure学的关于fp的知识,但是它的ft特性会让你想知道为什么更多的语言似乎不能正确地理解这一点。

享受!


I currently program Clojure, Python, Java and PHP [...] What are languages that take a different approach and would be useful for either practical tool choosing or theoretical understanding?

C

到处都是C代码——这绝对是实用的。如果你也学习C++,那么会有更多的代码出现(并且一旦你知道C和Java,跳就很短)。

它还使您(或迫使您)对一些理论问题有了很好的理解;例如,在某种意义上,每个正在运行的程序都生活在一个4GB字节数组中。C中的指针实际上只是这个数组的索引——它们只是一种不同的整数。在Java、Python、PHP中没有什么不同,除了隐藏在一个表层之下。

另外,您可以用C语言编写面向对象的代码,您只需要对vtables等有一点了解。Simon Tatham的便携式拼图集是一个相当容易访问的面向对象C代码的很好的例子;它的设计也相当好,值得初学者/中级C程序员阅读。这也是haskell中发生的事情——类型类在某种意义上是"另一个vtable"。

关于C的另一件伟大的事情是:与熟练的C程序员一起参与Q&A将得到许多答案,这些答案可以用较低层次的结构来解释C,从而使您更接近铁杆知识库。

我可能错过了Op的观点——我想我是,从其他答案来判断——但我认为这可能是对其他有类似问题并阅读这篇文章的人有用的答案。


我是第二个哈斯克尔。不要认为"我知道Lisp,所以我知道函数编程"。听说过打字课吗?代数数据类型?单子?"现代(或多或少,至少50岁以上)功能语言,特别是haskell,已经探索了大量非常有用的新概念。类型类添加了特殊的多态性,但是类型推断(还有一件你已经知道的语言没有的事情)工作起来很有魅力。代数数据类型非常棒,特别是对于像数据结构这样的树建模,但是对于枚举或简单记录也很好。和单子…好吧,让我们假设人们用它们来做异常、I/O、解析器、列表理解等等——纯粹是以功能性的方式!

而且,整个主题的深度足以让一个人忙上几年;)


prolog(用于统一/回溯等)、smalltalk(用于"一切都是消息")、forth(逆向波兰、线程解释程序等)、scheme(continuations)怎么样?

不是一种语言,但是元对象协议的艺术是弯曲思维的东西。


从彼得·诺维格的网站:

"至少学习六种编程语言。包括支持类抽象的一种语言(如Java或C++),支持功能抽象(如Lisp或ML),支持句法抽象(如LISP),支持声明性规范(如Prolog或C++模板),支持协同程序(如图标或方案)和支持并行性的一种语言。(像剑麻一样)。"

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


我很惊讶,经过6个月数百次投票,没有人提到过SQL…


在作为定理/高级类型系统的类型中:coq(我认为agda也属于这一类)。

COQ是一种嵌入到函数编程语言中的证明助手。

你可以写数学证明和coq帮助建立一个解决方案。您可以编写函数并证明它的属性。

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

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

是一个函数的签名,该函数连接a元素的两个大小为n和m的数组,并返回一个大小为(n+m)的数组。如果函数不返回,它就不会编译!

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

编辑:我需要说明的是:你用coq编写了一个函数,然后你就可以证明它对于任何输入都是正确的,这太神奇了!


我感兴趣的一种语言有一个非常不同的观点(包括定义语言元素的新词汇和根本的不同语法),J.Haskell对我来说是显而易见的选择,尽管它是一种功能性语言,因为它的类型系统和其他独特的功能打开了你的思维,让你重新思考你以前的语言。美国在(功能)编程方面的知识。


数据流编程,又名基于流的编程,是在道路上向前迈出的一大步。一些流行语:并行处理、快速原型制作、可视化编程(没有声音那么糟糕)。

维基百科的文章很好:

In computer science, flow-based
programming (FBP) is a programming
paradigm that defines applications as
networks of"black box" processes,
which exchange data across predefined
connections by message passing, where
the connections are specified
externally to the processes. These
black box processes can be reconnected
endlessly to form different
applications without having to be
changed internally. FBP is thus
naturally component-oriented.

  • http://en.wikipedia.org/wiki/flow-based_编程
  • http://en.wikipedia.org/wiki/dataflow_编程
  • http://en.wikipedia.org/wiki/actor_模型

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

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


正如福格斯在他的名单中向你建议的那样,我建议你也去看看OzML/Mozart的语言。许多范例,主要针对并发/多代理编程。

关于并发性和分布式微积分,lambda微积分(在函数编程之后)的等价物被称为pi微积分。

我刚开始研究π微积分的一些实现。但他们已经扩大了我的计算概念。

  • 皮克特
  • 游牧罪犯
  • 福楼特(这是最近的一个,是在印度研究院构思的)

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


也许您可能想尝试LabVIEW,因为它是一种可视化编程,尽管它是为了工程目的。

不过,你似乎对外面的一切都很感兴趣,因此建议

此外,您还可以尝试使用Android AppInventor进行可视化构建。


布鲁斯·A·泰特,从语用程序员那里拿了一页纸,写了一本关于以下内容的书:七周七种语言:学习编程语言的实用指南

在这本书中,他涵盖了clojure、haskell、io、prolog、scala、erlang和ruby。


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

它是一个类型化的prolog,具有唯一性类型和模式(即指定谓词append(X,Y,Z),即附加到y的x是z,在给定x和y的情况下生成一个z,但在给定z的情况下可以生成多个x/y)。另外,没有剪切或其他额外的逻辑谓词。

如果你愿意的话,那就要像哈斯凯尔口齿不清那样先说句话。


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

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

Mathematica也是基于重写的,虽然很难弄清楚到底发生了什么,因为它是封闭的。


虽然在学术水平上学习新语言是一种有趣的爱好,但我知道,除非你尝试把它应用到现实世界的问题上,否则你不能真正学会使用一种语言。所以,我不是在寻找一种新的语言来学习,而是在你的位置上,首先寻找一种新的东西来构建,然后我才能为那个特定的项目寻找合适的语言来使用。首先选择问题,然后选择工具,而不是相反的方法。


  • 编程不包括程序员的任务。
  • 新事物总是有趣的,但也有一些很酷的老东西。
  • 对于我来说,第一个数据库系统是dbaseii,我花了大约一个月的时间编写一些小示例(dbase/foxpro/clipper是一个基于表的带有索引的数据库)。然后,在我的第一个工作场所,我遇到了腮腺炎,我头疼。我当时很年轻,头脑也很清醒,但我花了2周时间才理解腮腺炎数据库模型。有一段时间,就像在漫画中一样:两个星期后,一个按钮被打开了,灯泡在我的脑海里刚刚亮了起来。腮腺炎是天然的,低水平,而且非常快。(这是一个不平衡的,没有类型的未恶意btree。)今天的趋势显示了它的回归:nosql,key-value-db,多维db-所以只剩下一些步骤,我们就达到了流行性腮腺炎。

    以下是关于流行性腮腺炎优势的演示:http://www.slideshare.net/george.james/mumps-the-internet-scale-database-presentation

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

    介绍流行性腮腺炎全局变量(在流行性腮腺炎中,局部变量,简称:局部变量是内存变量,全局变量,简称:全局变量是"db变量",设置全局变量将立即转到磁盘):http://gradvs1.mgateway.com/download/extreme1.pdf(pdf)


    对于80年代中期就不在这里的人,我建议你学习8位基本语言。它是非常低级的,非常原始的,它是一个有趣的练习,围绕它的洞进行编程。

    在同一行中,我会选择一个HP-41C系列计算器(或模拟器,尽管没有什么能比得上真正的硬件)。很难把你的大脑包起来,但很值得。一个TI-57可以,但将是一个完全不同的体验。如果你能在TI-55上解二阶方程,你将被认为是一个主控方程(它没有条件,也没有分支,除了一个RST,它把程序跳回到步骤0)。

    最后,我会挑出来(之前提到过)。它有一个很好的"建立你的语言"的口齿不清的东西,但更是赤裸裸的金属。它将教你为什么Rails很有趣,当DSL有意义的时候,你会对你输入时非RPN计算器在想什么有点闪烁其词。


    附言。它是一种非常有趣的语言,因为它是基于堆栈的,一旦你想把事情写在纸上,你要么想完成它,要么想解决它为什么不能完成的问题,它就非常实用。

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

    尝试编程GPU-CUDA或OpenCL。它只是C/C++扩展,但是架构的心智模型又和经典的方法完全不同,一旦你需要做一些真正的数字处理,它就一定会变得实用。


    二郎,福斯和一些嵌入的汇编语言工作。真的;买一个Arduino工具包或类似的东西,在组装时发出一声合成音嘟嘟声。你会学到很多东西的。


    还有Anic:

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

    从它的网站:

    Faster than C, Safer than Java, Simpler than *sh

    anic is the reference implementation compiler for the experimental, high-performance, implicitly parallel, deadlock-free general-purpose dataflow programming language ANI.

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


    虽然不能满足您对"不同"的要求,但我敢打赌,Fantom是一种专业程序员应该关注的语言。据他们自己承认,fantom的作者称之为一种无聊的语言。它只不过是Java和C语言最常见的用例,还有Ruby和类似的新语言的一些借用闭包语法。

    然而,它管理着自己的自举编译器,提供了一个安装在没有外部依赖关系的平台上,获得了正确的软件包,并在Java、C语言和现在的Web(通过JS)上工作。

    它可能不会在新的编程方法方面拓宽您的视野,但它肯定会向您展示更好的编程方法。


    说你想写一首情诗…

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

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


    APL,FORTH和ASSEMBLY。

    玩得开心点。拿起乐高Mindstorm机器人套件和CMU的Robotc,写一些机器人代码。当你写的代码必须"变脏"并与现实世界进行交互时,事情就会发生,你不可能以任何其他方式去学习。是的,同一种语言,但观点完全不同。