学习哪些重要的语言来理解不同的方法和概念?

如果你只有一把断线钳和一瓶伏特加所有东西看起来都像沃尔夫 · 布利策船坞门上的锁。(如果不读 xkcd,请用锤子和钉子代替)

我目前编写 Clojure、 Python、 Java 和 PHP 程序,所以我熟悉 C 语法和 LISP 语法以及空格的东西。我知道命令式、函数式、不可变式、面向对象程序设计(OOP)以及一些类型系统和其他东西。现在我想要更多!

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

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

我发现一件非常有趣的事情,那就是像 Factor 这样的基于堆栈的单一标志性语言。

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

31457 次浏览

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

不是一种语言,但 元对象协议的艺术是令人费解的东西

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

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

功能,Haskell -我知道你说过你不想,但是你真的应该重新考虑一下。您已经了解了一些 Clojure 甚至 Python 的功能,但是如果没有 Haskell,您还无法充分体验它。如果你真的反对 Haskell,那么最好的折衷方案要么是 ML,要么是 OCaml。

声明性的,Datalog -许多人会推荐 Prolog 在这个位置,但我认为 Datalog 是声明性语言的一个更清晰的例子。

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

Stack,Factor/Forth -Factor 非常强大,我打算尽快深入研究一下。Forth 是 Stack 语言的鼻祖,作为额外的奖励,它是 很容易实现。关于通过实施来学习,有一些东西值得一提。

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

基于原型的,JavaScript/IO/Self -Self 是所有基于原型的语言的鼻祖,并且对它们有很大的影响。这与基于类的面向对象程序设计不同,不应该这样对待。许多人来到一个原型语言并创建一个特别的类系统,但是如果你的目标是扩展你的思维,那么我认为这是一个错误。充分利用这门语言。阅读 组织没有类的程序获取想法。

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

Frink 是一种通用语言,但它以单位转换系统而闻名。我发现这种语言是非常鼓舞人心的,因为它坚持不懈地努力做到最好。而且,真的很好玩!

你说你有一些类型系统的经验,但是你有“可皮肤类型系统”的经验吗?没人见过,但他们应该见过。Qi 在很多方面都像 Lisp,但是它的类型系统会让你大吃一惊。

Actors + 错误容忍 Erlang 的过程模型得到了很多关注,但是它的错误容忍和热代码交换机制改变了游戏规则。你不会学到很多关于 FP 的知识,但是它的 FT 特性会让你想知道为什么更多的语言似乎不能做到这一点。

好好享受吧!

也许你想尝试一下 LabView 的可视化编程,尽管它是出于工程目的。

尽管如此,你似乎对外面的一切都很感兴趣,所以才有了这个建议

另外,你可以试试 android AppInventor,它可以在视觉上构建一些东西

我支持 Haskell。不要认为“我懂 Lisp,所以我懂函数式编程”。听说过打字课吗?代数数据类型?单子?“现代”(或多或少——至少不是50年前的;)函数式语言,特别是 Haskell,已经探索了大量非常有用的新概念。类型类添加了 ad-hoc 多态性,但是类型推断(您已经知道的语言中还有一个没有的东西)非常有效。代数数据类型简直棒极了,特别是对于建模树——比如数据结构,但是对于枚举或简单记录也可以很好地工作。而 monads... 好吧,我们只能说人们使用它们来创建异常、 I/O、解析器、列表理解等等——以纯函数的方式!

此外,整个话题的深度足以让一个人忙上好几年;)

就像福格斯在他的列表中建议你的那样,我也建议你看看 OzML/Mozart 的语言 许多范例,主要针对并发/多代理编程。

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

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

来自彼得 · 诺维格的网站:

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

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

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

Coq 是嵌入到函数式编程语言中的证明助手。

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

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

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

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

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

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

数据流编程,也就是基于流编程是一个很好的开端。一些流行语: 并行处理、快速成型、可视化编程(不像先听声音那么糟糕)。

维基百科的文章不错:

在计算机科学中,基于流的 编程(FBP)是一种编程 将应用程序定义为 “黑盒”进程的网络, 在预定义之间交换数据 通过消息传递连接,其中 指定了连接 外部的过程。这些 可以重新连接黑盒进程 形成不同的结构 申请表格 内部改变。 FBP 是如此 自然地面向组件。

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

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

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

我的第一个数据库系统是 dBaseIII,我花了大约一个月的时间来编写小示例(dBase/FoxPro/Clipper 是一个基于表的带索引的 db)。然后,在我的第一个工作场所,我遇到 MUMPS,我得到了头痛。我当时年轻,头脑清醒,但是花了两周的时间才理解 MUMPS 数据库模型。有那么一瞬间,就像漫画里一样: 两周后,一个按钮被打开了,灯泡在我脑海里亮了起来。MUMPS 是自然的,低水平的,而且非常非常快。(它是一个没有类型的非平衡、非正式的 btree。)今天的趋势显示了回到它的道路: NoSQL,键值 db,多维 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 中,局部变量,短: 局部变量是内存变量,全局变量,短: 全局变量是“ db 变量”,设置一个全局变量立即进入磁盘) : Http://gradvs1.mgateway.com/download/extreme1.PDF (PDF)

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

C

这里有一段 很多的 C 代码-绝对实用。如果你也学习 C + + ,就会有更多的 很多代码(一旦你了解了 C 和 Java,这个飞跃就很短了)。

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

而且,你可以用 C 语言编写面向对象的代码,你只需要对 vtables 之类的东西稍微手工一点就可以了。Simon Tatham 的可移植拼图集是一个相当容易访问的面向对象 C 代码的很好的例子; 它的设计也相当好,对于初级/中级 C 程序员来说非常值得一读。这也是哈斯克尔发生的情况——类型班在某种意义上“只是另一个 vtable”。

关于 C 的另一个好处是: 与有经验的 C 程序员进行问答,可以得到许多答案,这些答案可以用较低层次的结构来解释 C,从而建立更接近铁的知识库。

我可能忽略了 OP 的观点——-我想是的,根据其他答案判断——-但我认为它可能对其他有类似问题并读过这个帖子的人是一个有用的答案。

你已经学了很多语言,现在是时候专注于一门语言,并且掌握它。

说你想写一首情诗。

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

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

虽然在学术水平上学习新语言是一个有趣的爱好,恕我直言,你不可能真正学会使用一门语言,除非你试图把它应用到现实世界的问题。因此,与其寻找一种新的语言来学习,我宁愿在你的位置首先寻找一种新的东西来构建,只有这样我才会为那个特定的项目寻找合适的语言来使用。首先选择问题,然后是工具,而不是反过来。.

布鲁斯 · A · 塔特(Bruce A. Tate)借鉴了 务实的程序员的做法,写了一本关于以下问题的书: 七周七种语言: 学习编程语言的实用指南

在书中,他介绍了 Clojure、 Haskell、 IO、 Prolog、 Scala、 Erlang 和 Ruby。

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

同样,我会选择 HP-41C 系列计算器(或者模拟器,尽管没有什么比得上真正的硬件)。虽然很难理解,但是很值得。一架 TI-57就够了,但会是完全不同的体验。如果你设法在 TI-55上解决二次方程,你将被认为是一个大师(它没有条件,没有分支,除了一个 RST,跳过程序回到步骤0)。

最后,我选 FORTH (之前提到过)。它有一个很好的“构建你的语言”Lisp 的东西,但是更多的是赤裸裸的金属。它会告诉你为什么 Rails 是有趣的,当 DSL 有意义的时候,你会有一个草图,你的非 RPN 计算器是怎么想的,而你打字。

PostScript.它是一种非常有趣的语言,因为它是基于堆栈的,一旦你想把事情写在纸上,并且你想要完成它或者解决它为什么没有完成的问题,它是非常实用的。

二郎。内在的平行性给了它一种非同寻常的感觉,你可以再次从中学到有用的东西。我对实用性不是很确定,但它可以用于一些快速原型化任务和高度冗余的系统。

尝试编写 GPU-CUDA 或 OpenCL。它只是 C/C + + 的扩展,但是架构的思维模型又完全不同于经典的方法,而且一旦你需要完成一些实际的数字处理,它肯定会变得实用。

Erlang,Forth 和一些汇编语言的嵌入式工作。真的; 购买一个 Arduino 工具包或类似的东西,并在组装中发出复调哔哔声。你真的会学到东西的。

还有 恐慌:

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

来自其网站:

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

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

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

APL,Forth 和 Assembly。

找点乐子。拿起乐高头脑风暴机器人工具包和卡内基梅隆大学的 RobotC,写一些机器人代码。当你编写的代码必须“变得肮脏”并且与现实世界交互时,你不可能通过其他任何方式来学习,这种情况就会发生。是的,同样的语言,但是观点完全不同。

虽然不符合您的要求“不同”-我敢打赌,影迷是一种语言,一个专业的程序员应该看看。《幻影》的作者们自己也承认,这是一种无聊的语言。它只是借鉴了 Ruby 和类似的新语言的闭包语法,支持了 Java 和 C # 最常用的用例。

然而,它设法拥有自己的引导编译器,提供了一个没有外部依赖的安装下降的平台,获得正确的软件包——并且可以在 Java、 C # 和现在的 Web (通过 js)上工作。

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

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

水星 : < a href = “ http://www.Mercury.csse.unimelb.edu.au/”rel = “ nofollow”> http://www.Mercury.csse.unimelb.edu.au/

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

如果你愿意的话,它对于 Prolog 就像 Haskell 对于 Lisp 一样。

从其他答案中我看到了一个缺失的东西: 基于术语重写的语言。

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

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