推荐几个有趣的编程语言

最近通读了 Common Lisp 和 Scheme 的语言标准,然后发现学了 Lisp 以后没动力学其他语言了。

这时候我看到了一篇很有趣的文章:

Real Programmers Don’t Use PASCAL

其中主要推荐了 Fortran:

  • Real Programmers do List Processing in FORTRAN.
  • Real Programmers do String Manipulation in FORTRAN.
  • Real Programmers do Accounting (if they do it at all) in FORTRAN.
  • Real Programmers do Artificial Intelligence programs in FORTRAN.

If you can’t do it in FORTRAN, do it in assembly language. If you can’t do it in assembly language, it isn’t worth doing.

说的很有道理。

作为第一门标准化的编程语言,许多人都认为 Fortran 很反人类,只有那种实验室的祖传代码才会用 Fortran 等等。甚至连 Fortran 语言标准里面关于为什么要用它也只敢写:因为很多祖传代码都用 Fortran。

其实不然,它只是和 Common Lisp 乃至 Emacs 一样被一帮 Quiche Eater 妖魔化了。实际上根据我这几天对 Fortran 的学习中,能总结出如下学习 Fortran 的理由:

  1. 容易上手,选比 C/C++ 好学,独立于操作系统的概念使其减少了复杂性,内置的语言功能也很丰富。
  2. 比 C 更加低阶,使得其性能很可观,又很适合了解计算机基本原理。
  3. 以数组计算最为高效,锻炼 APL 编程思想。

实际上光是第三点就足以成为 Fortran 最大的魅力。APL 是一种以数组为基础数据结构的精炼语言,与 Lisp 类似,是从数字语言到编程语言。APL 用数组让代码更加简洁,而 Fortran 用数组让代码更加高效。

APL 取 1 到 10 的平均数:(其实这是 J 语言, APL 的变种)

AVRG=. (+/%#) 1+i.10
AVRG

APL 语言从右到左执行,i.10 建立 [0 1 2 ... 9] 这样一个数组,1+ 对数组中每一个值 +1,返回 [1 2 3 ... 10](+/ % #) 表示 +/ [1 2 ... 10] 除以 # [1 2 ... 10],即数组的和除以数组成员的个数。最后把结果赋值给 AVRG。输入 AVRG 返回结果 5。

5 个赞

我还是推荐 Rust :roll_eyes:

pros:

  1. 强悍的性能,正常情况下,性能和 c/c++不相上下,在使用数据并行库的情况下,可以充分利用多核特性,性能更优
  2. 自带教你做人的编译器,把大部分的bug 都在编译期处理, 注重数据安全,可以在编译时发现 data race 等问题
  3. lifetime 和 ownership 的特性,使得Rust 可以不需要gc 来实现自动内存管理
  4. 表达能力强,借鉴了诸多的函数式语言,也有堪比Lisp 的宏定义
  5. young, but not naive

cons:

  1. 学习曲线陡,因为引入了很多独有的特性,比如上面说到的 lifetime ownership 等等,所以其他语言的学习经历很难借鉴
  2. 教我做人的编译器,因为很多问题都能在编译时, 而不是运行时发现,所以代码写得不合编译器"心意",就编译不过.
  3. 尚不成熟的社区和第三方库,以及IDE

所以,我觉得Rust 是下一个十年的编程语言,值得学

5 个赞

Pro 前三条 Fortran 都占了。

Cons 三条 Fortran 都没。

Rust 还是以所谓的开发效率为目的。语言本身不够有趣。


对于高性能,高效率,高并发,系统底层开发,早有一门更疯狂的语言,名为 FORTH,用的是著名的逆波兰表达式,即堆栈计算模型。和 Lisp 一样,它的所有关键字都可重定义。它的作者在 10 年推出了 144 核的 CPU,每秒 1000 亿次操作,直接使用 FORTH 的一个方言作为指令集。据说开发也是比 C 高效,一直用于在特殊设备上编程。


如果我有一台计算机,它的指令集和编译器会是 FORTH,它的操作系统和程序用 Lisp 写成,文本交互界面和脚本用 APL,图形界面会是 Smalltalk 和 Rebol。

3 个赞

完全用 Forth 写成的简易类 Emacs 编辑器。

1 个赞

用Rust 重写的 Emacs, 重写Emacs 里面的C,WIP

然而到现在 REmacs 的 Rust 含量还是在不可见级别。

所以叫 WIP 嘛:rofl:

希望rust的增量编译特性能更好点,而且如果有人给开发个repl开发体验应该会很棒吧:wink:

今天在 《 Introduction to Programming with Fortran》看到的语言,SNOBOL (StriNg Oriented and symBolic Language),用于处理文本。在正则流行后被 awk 取代,但支持递归搜索等正则做不到的功能。

同感觉rust前景光明。对一些编程里长久以来的痛点都有自己的解决方案,很多决定很大胆,社区也活跃(重点)。

当然现在还是太年轻,需要时间积累。

我就不信Fortran也能搞出Dependent Types。 另外Fortran没有memory leak?

有 Memory Leak 啊。不過重點在 Array processing 的思想上。Fortran 所有值的類型都是檢查的。

所以Fortran第2、3点比不上Rust吧。

所以己经很安全了。Rust 也沒把Dependent Types做全。

這其實是个笑话。看看 Forth 这種 Pointer-Free 就知道了,不用手动管理内存,但要维护一套別的東西。

我要问 Rust 能搞并行嗎,定然是不行的。

类型检查Basic什么的都有,但trait、sum types、pattern match这些Fortran也有么? Rust不能并行是什么梗?Fortran能检查Data race?关键是即使borrow checker之类很麻烦,但能让编译器检查有没有忘了deallocate啊

内建多维数组。大规模并行运算的必要條件。Fortran 的长项。即 Array Processing。除此之外,Array Processing 也是一種简化问題的算法。

对我來說,有趣和用得方便是两回事。开始的文章就是说明这个推薦的性質的。语言特性,換个语言就沒用了,在我看來思想性的東西更有价值。

沒能推薦实用向的语言还真是抱歉。

这跟内建多维数组有什么关系? Rust做这个不是很简单的么? https://github.com/rayon-rs/rayon

這樣说吧,虽然我在吹,因為我永遠不會用到這个,但現在谈的是运行效率。Fortran 的优化已经鬼畜到了能用顕卡加速计算的地步了。

为何大年三十这一天大家好像都活过来了?

说道语言,我认为是否带有gc是一个分水岭,作为面向应用的编程语言,带有gc是提高开发效率和可靠性的一个重要手段. 作为面向底层或系统开发的语言,如果不能精确控制内存,那还有什么意义.

这点我一直觉得rust哪里有点不对劲.rust只是瞄过几眼,没有真正动手深入,还不能做什么有价值的判断.

其实我提醒大家的是,几乎所有讨论编程语言的讨论,都忽略了库的问题.其实语言层面,只要是完备的,用熟了之后,差不了太多, 真正影响一个语言的生命力的,应该是这种语言所配备的"标准库",就像同样是java语言,如果没有安卓这个非常优秀的库,应该差不多快被淘汰了.

标准库的好坏对一个开发者来说是决定性的,毕竟从一个裸体的语言开始构建自己的应用几乎是不可能的事情. 所以很多关于语言的讨论,如果不把标准库一起来考虑,是没有太大的实际意义的.

编程语言那么多,大家都有生存的空间,在明确分类的前提下讨论才更有意义.

我的意见是:编程语言大致上可以分成三类:

  1. 面向系统的编程语言
  2. 面向应用的编程语言
  3. 面向特定领域的编程语言
2 个赞

所以第2、3点显然是不能跟Rust比了。至于效率不过是迟早的事情,C++也能用OpenMP、CUDA。 Fortran没有指针别名问题是个优势,array默认column major order这个设定估计能包装一下吹一吹

1 个赞