过去5年编程语言的演化(下)

2011-11-16 03:46

过去5年编程语言的演化(下)

by yuanyi

at 2011-11-15 19:46:35

original http://item.feedsky.com/~feedsky/heikezhi/~8608072/603800683/6713895/1/item.html

这是Fogus的“过去5年编程语言的演化”一文的下半部分,你可以点击这里阅读上篇

---------------

Potion

发布日期: 2009, 作者: _why the Lucky Stiff

曾经有个叫_why的家伙在ruby圈子里引起了一场不小的风波,作为一个神秘人,他对Ruby和编程的一些见解为他在ruby以及ruby之外的世界赢得了很高的声誉,_why就是这样一个神奇的开源贡献者,在他的众多开源项目中,有一个叫做Potion的项目,这个项目的目标是创造一个小巧且强大的新编程语言,Potion继承了很多Io,Lua,OCaml以及Ruby的想法,并将它们汇集于一身:

Person = class: /name, /age, /sex.
Policeman = Person class (rank): /rank = rank.
Policeman print = ():
  ("My name is ", /name, " and I'm a ", /rank, ".")
  join print.

Policeman ("Constable") print
# My name is nil and I'm a Constable.

不过让我最感兴趣的就是,Potion分离了数据和表达式的符号系统,当然我必须得承认这个语言并不是很富有创造性,这是因为作者将大部分精力都投入到了实现上,它的实现非常简洁,只有大约6000行代码,也就是说一般公司的年轻程序员(或者是像我这样的老家伙)都可以在几周之内完全理解整个语言的实现,阅读代码是个很好的学习方式,尤其是阅读这样出色的的代码。

继续了解

* 官方网站
* 源代码

Mirah

发布日期: 2008, 作者: Charles Nutter

JRuby算是一个非常不错的在JVM之上构建的语言了,但是就像其它许多的Java.next语言一样,它也受到运行时问题的困扰,作为一个共生语言,要想提供一个强大且高效的开发和运行时体验,共生语言需要提供一个可以在任何java运行时上部署的核心库。如果我们将这个运行时限定在只支持一个轻量级的运行环境,那么这在实践中就不是什么大问题。让我们来看看Mirah,Mirah的目标(这是个很靠谱的目标)就是创造一个新的基于JVM的语言(语法主要借鉴Ruby),让你可以得到动态语言的体验,但又不需要增加任何额外的运行时库。

def reverse(s:string)
    StringBuilder.new(s).reverse
end

puts reverse('reversed')

初看起来,Mirah就是一个增加了类型声明支持的JRuby,如果我不是这样喜欢JRuby,或许我会希望Charles Nutter把他所有的时间都花在Mirah上。

继续了解

* 官方网站
* 初始声明
* 源码

Scratch

发布日期: 2007, 作者: Mitchel Resnick

当我看到我5岁的儿子毫不费力的完成了对这些乐高机器人的编程时,我就在想着,或许应该有一种提供图形化IDE的通用语言,当我发现Scratch时,我大吃了一惊,这个图形化的语言居然和我想的如此接近,并且它和上面讲的乐高机器人都是由MIT的一个小组开发的。

下面是Scratch版的“Hello,World”:

Scratch算是Smalltalk的一个近亲,但是它的目标是以“玩乐式的体验”帮助孩子学习必要的数学和编程技能——我非常赞同这个目标,Scratch虽然看起来和微软的Kodu有点像,但是基于我玩乐高的体验,我更喜欢Scratch一些。

更多资源

* 官方网站
* 源码

ClojureScript

发布日期: 2011, 作者: Rich Hickey

ClojureScript是一个基于JavaScript之上的语言,它采用了大部分Clojure的语法,然后被编译成Javascript,因为我本人就是ClojureScript的开发者,我对它的看法难免会有偏见,所以还是让Brenton Ashworth来告诉你ClojureScript到底有多酷吧:

ClojureScript browser-connected REPL from Brenton Ashworth

这是个连我都被震住了的视频。

继续了解

* ClojureScript声明
* 介绍ClojureScript
* 源码

Clojure

发布日期: 2007, 作者: Rich Hickey

同上面一样,我对Clojure的喜爱也不可避免的带有偏见,所以我尽量少说一些,下面就是我对它的简短评价:
不变性(Immutability)将会成为游戏规则的颠覆者

另外,下面是一个由Christophe Grand实现的生命游戏的Clojure版本:

(defn neighbours [[x y]]
  (for [dx [-1 0 1] dy (if (zero? dx) [-1 1] [-1 0 1])]
    [(+ dx x) (+ dy y)]))

(defn step [cells]
  (set (for [[loc n] (frequencies (mapcat neighbours cells))
             :when (or (= n 3) (and (= n 2) (cells loc)))]
         loc)))

(def board #{[2 1] [2 2] [2 3]})

(defn print-board [board w h]
  (doseq [x (range (inc w)) y (range (inc h))]
    (if (= y 0) (print "\n"))
    (print (if (board [x y]) "[X]" " . "))))

(defn display-grids [grids w h]
  (doseq [board grids]
    (print-board board w h)
    (print "\n")))

再就是,我写过一本关于Clojure的书

更多资源

* 官方网站
* 源码

OMeta

发布日期: 2009 (?), 作者: Alessandro Warth

最近几年关于DSL的讨论越来越多,大家的很大一部分注意力都被转移到了这个话题上,尽管如此,如果有人曾经参与过DSL的设计或者实现,那么他应该会发现,现在的情况远不能让人满意,问题就是你很难用一个通用语言实现一个既强大又健壮的DSL,造成这个问题的原因有很多,但最主要的问题就是,即使是使用那些具有很大的语法灵活性的语言,你也仍然很难保证你实现出来的DSL不会太过丑陋,当然,你可以做到,但是如果你想要实现一个理想的DSL,你会发现,你真的需要一套简单的工具来帮你构建一个完整的语言解析器和运行时,关于这个,我都可以花上一天再写个新帖了,但我还是先省省吧,让我们回到主题,真的,DSL的世界需要这样一种语言,它只是为你提供一套工具,让你可以编写独立的DSL解析器,或是嵌入式的变体,没错,那就是OMeta。

Github上的OMeta示例代码

就像JetBrain的元编程系统提供的那种非常容易理解且强大的工具集一样,OMeta最大的优势就在于它非常简单,OMeta是基于语法表达式解析器(PEG)构建的,你可以轻松对它进行扩展来支持通用的数据结构。

更多资源

* 官方网站
* JavaScript源码

Fortress

Fortress有点超出了这个贴的时间限制,因为在它公开发布之前,它已经在Sun内部被使用了多年,Fortress之所以引起我的关注,只是因为Guy Steele参与了这个项目,除了这一点,Fortress引人注目之处还在于它将精力放在了并行计算上,它的语法看起来更像是数学符号,并且支持对象-函数范式,comprehensions,traits, contracts以及静态计量单位解析和分布式数据结构。

for i←seq(1:m) do
  for j←seq(1:n) do
    print a[i,j]
  end
end

上面的这个简单的嵌套循环展示了Fortress的一个非常有趣的特性,那就是循环中的语句是并行执行的,Fortress对于并行采用了一个很坚决的做法,它没有将并行作为语言的一个可选项,而是将它和语言本身紧密的结合在了一起,当然,除了这种隐式的并行,Fortress也支持显式的并行计算。

更多资源

* 项目主页
* 源码

接下来?

最近又涌现了许多新的编程语言,但是我对这些语言的了解仅限于一条Tweet的长度:

* Dart

  • 第一定理(译者注:这里指作者前面说的一句话:当牛逼的人创造了某个东西,你应该学习之)
  • 看起来为适配更多的运行时做了均衡

* Rust

  • 看起来像是D语言的继承者
  • 第一定理

* Ceylon,不确定对于一个坚持追随Java约定的团队,这个语言为他们提供了什么
* Kotlin,基于IDE打造
* Newspeak,smalltalk+: FloatD的简化版
* Perl6,鉴于我不是Perl程序员,所以我可以等
* Magpie

  • 或许是最好的关于编程语言开发的“Blog"了
  • 很不幸没时间去看它的源代码
  • 由Dart团队的一员开发
  • 感谢Tracy Harms提醒

更少人知道的

下面这些语言是其他人推荐给我的,我对它们基本上一无所知:

* Felix 属于ML系
* Wheeler 看起来真的很独特,我会花点时间探索下
* Opa 下一代的Web语言
* Frege 又一个Java.next语言,Haskell系
* Cobra 带给我合同
* Clay 另一个系统级编程语言,在我看来很干净

写完这篇文章,一个让我惊奇的发现是,过去5年间我们对于数组编程【6】几乎没有取得什么进展,尽管如此,我怀疑可能还有有一些私有的项目没被我发现,随着时间的推移,我的感受就是,编程语言正在朝着衍生和进化的方向发展,而不是再从头重新发明一种革命性的新语言,这并不一定就是件坏事情,因为计算机史上还有很多隐藏的很深的好点子等着我们去发掘。

我有错过什么吗?

---------------

本文是“Programming language development: the past 5 years”一文的下半部分(上篇在这里),作者:Fogus,翻译:yuanyiz

想和我们一道传播黑客精神?快来加入吧!

无觅猜您也喜欢:

提高编程技能的10种方法

最快的编程语言是?

过去5年编程语言的演化(上)

10个编程首选字体
无觅