分享 José Valim 教你更好的理解 Ruby 语法

willmouse · 2013年08月06日 · 最后由 xwf286 回复于 2013年08月10日 · 8919 次阅读
本帖已被管理员设置为精华贴

http://confreaks.com/videos/643-gogaruco2011-keynote-writing-your-own-programming-language-to-understand-ruby-better

(José Valim and Aaron Patterson)

@josevalim是我很崇拜的一位,自 2010 年加入 Rails Core 之后,到现在是 Rails 代码提交量的第二名(仅次于@dhh),Plataformatec 的 Co-Founder,@josevalim也是 Devise 和 SimpleForm 等 gem 的主要作者,最特别的是他还是一门编程语言的作者(Elixir)。

这个演讲来自于 2011 GoldenGateRubyConf,@josevalim通过在编写 Elixir 解释器是遇到的问题,向观众解释了 Ruby 语法的一些特别之处,大概包含如下内容:

  • Elixir
  • Ruby Lexer 和 Parser 是如何处理源代码的
  • 空格在 Ruby 中的重要作用
  • Elixir 有,但 Ruby 没有的语法

关于 Elixir:

Elixir 是一门运行在 Erlang VM 上的编译型的函数语言,拥有 Ruby 的语法,Haskell 的 Pattern,Clojure 的 Protocol,Erlang 的 Actor,Elixir 的代码最终编译为 Erlang VM 字节码,由 Erlang VM 执行,所以 Elixir 和 Erlang 的二进制代码可以不加修改的互相调用。

jose 从 2011 年初开始开发 Elixir,但到 2011 年底时 jose 发现 Elixir 的很多的地方偏离了 Erlang(当初 jose 想将 Elixir 设计成一门 OOP 语言),之后 jose 和@wycats重新起草了一份名叫 Lego 的语言规范 https://github.com/josevalim/lego-lang ,该语言规范最终成为现在 Elixir 语法的基石。

Elixir 在语言之外有些特别之处:

  1. 年轻作者实现的一门年轻的语言,但却有不小的影响(Erlang 作者 Joe Armstrong 对 Elixir 的评价 (http://joearms.github.io/2013/05/31/a-week-with-elixir.html)
  2. Dave Thomas 是 Ruby 界有不小影响力的人物,如果不是 Dave Thomas 在 2001 年写了第一版的“镐头书”将 Ruby 从日本带向了世界,很有可能就没有 Rails 和 Ruby 现在的风光了。Dave Thomas 在 Elixir 开发的两年后就为 Elixir 写了一本书 (http://pragprog.com/titles/elixirDave),Thomas 说 Elixir 是继 Ruby 之后唯一让他眼晴一亮的语言。

具体的语言细节可以参见官方网站以及 Github:

http://elixir-lang.org/ https://github.com/elixir-lang/elixir

Elixir 现在已经是一门可以实际使用的语言,不过由于开发过于迅速,API 变化的十分频繁,据 jose 本人所说,今年年会有一个 Stable 版本发布(那时候 Dave Thomas 的书也会正式发售),大家到时候可以去尝试一下。

为啥楼主的分享,质量都这么高?

#1 楼 @lgn21st 可能是因为有爱?我也不知道

Thomas 说 Elixir 是继 Ruby 之后唯一让他眼晴一亮的语言。

我的眼睛快被亮瞎了,这语言实在是太牛了

这语言和 erlang 这相当于 coffee 和 js 的关系吗?Scala 和 java?还是什么别的?

#4 楼 @blacktulip Scala 与 Java,Elixir 运行在 Erlang VM(Beam?) 上,Scala 运行在 JVM 上。

#4 楼 @blacktulip 第一句的回答是 No,第二句应该是 Yes,因为我不是很了解 Scala。

Coffee 是 Java Script 的语法糖,他没有对语言本身进行扩展,Coffe Script 和 Java Script 本质上是同样的东西,你不能在 Coffee Script 上做 Java script 不能做的事。Coffee Script 被编译为 Java Script,但是 Elixir 并不会被编译为 Erlang,如果把 Coffee Script 看做 Java script 的超集,那么 Elixir 和 Erlang 是算是交集,因为 Erlang 和 Erlang VM 本身也是两个东西。

#3 楼 @camel

Dave was excited about Elixir, in the introduction to his new book he says:

I came across Ruby in 1998 because I was an avid reader of comp.lang.misc (ask your parents). I downloaded it, compiled it, and fell in love. As with any time you fall in love, it’s difficult to explain why. It just worked the way I work, and it had enough depth to keep me interested.

Fast forward 15 years. All that time I’d been looking for something new that gave me the same feeling.

I came across Elixir a while back, but for some reason never got stuck in. But a few months ago I was chatting with Corey Haines. I was bemoaning the fact that I wanted to find a way to show people functional programming concepts without the kind of academic trappings those books seem to attract. He told me to look again at Elixir. I did, and I felt the same way I felt when I first saw Ruby.

额...

#5 楼 @fenprace 是的,Elixir 和 Erlang 生成的目标代码一样,都是.beam

rubyrogues 最近也有个 elixir 的 episode 诶 http://rubyrogues.com/114-rr-elixir-with-jose-valim/

peepcode 上也有教程了https://peepcode.com/products/elixir 社区里 1 年前就有人关注http://ruby-china.org/topics/796 几年过去了,Elixir 有杀手级应用吗?

很喜欢这门语言,年初不小心在 Peepcode 上给它买了(真心点错,当时心疼了好一阵子),但是越看越觉得有味道,挺合我的胃口的。

Elixir 要有点 Erlang 基础吧 #11 楼 @nightire

Erlang 驻本论坛大使怎么还没有现身...

#10 楼 @camel 应该说还没有,Elixir 现在的开发重点都在语言本身上,Dynamo 可以用,但是和语言一样一样是 unstable 的状态。相比当时的 0.4,现在的版本号为 0.10.1,有了许许多多的提升 http://elixir-lang.org/blog/categories.html#releases

jose 大神,很不错。曾经在 github 里私信问他一些问题,还给回复的很详细,一点架子没有。

感觉 jose 的口音有点重

大赞 Ruby 的语法 Erlang 的性能。。。

有英文字母或者中文字幕

#18 楼 @iBachue

Erlang 跑分直逼 PHP,不比 Ruby 更差,但也好不了多少。 感觉语法搞成那样还要编译成 beam,性能搞不好有不小损失。 目测不出来语法和 Erlang 有啥区别,就多了几个控制流语句。

http://benchmarksgame.alioth.debian.org/u64q/benchmark.php?test=all&lang=erlang&lang2=yarv&data=u64q

现在就觉得 erlang 在打包部署上比较麻烦 (那个 rebar 总是有各种小问题),我只需要把这个问题简化一下就行了 (比如用 rake)。elixir 也很好,可是我不觉得有特别的价值

#21 楼 @fsword 也许是这语言现在还太年轻,还不知道他们想闹哪样

#10 楼 @camel 把 Erlang 代码编译成 Elixir,你就有杀手级应用了...

#20 楼 @bhuztez 和 erlang 会有差么,如果做并发测试的话应该和 ruby 差不止一点点吧

#6 楼 @willmouse Elixir 也只是语法糖吧,语义上和 Erlang 目测不出有区别啊。

#25 楼 @bhuztez 可以看看这个 http://elixir-lang.org/crash-course.html

不一样的地方还是有的,比如 Macros http://elixir-lang.org/getting_started/5.html

#22 楼 @bhuztez jose 自己说希望 Elixir 用于 Web,像 Ruby 和 Python 一样,而不是 Erlang 大量的用于交换机,电话网络这方面。希望可以把 Erlang 在 Web 上的优势发挥出来,还有就是 jose 认为 Erlang VM 很好,但是 Erlang 语言的语法设计的很烂,具体可以参见 9 楼的 podcast。

#24 楼 @jonny 语言本身都不是问题,还是方法和思想的问题,Ruby 也有 Actor 的库,基于 Fiber 实现的 https://github.com/celluloid/celluloid Sidekiq 就是基于 Celluloid 比较成功的项目。

#20 楼 @bhuztez 感觉略 sucks,尤其调用方法要.()

#26 楼 @willmouse

Erlang 也不是不可以,只是原生提供的方式比较 tricky 而已。而且,直接生成 beam 也不是不可以么。

http://www.erlang.org/doc/man/erl_id_trans.html

Erlang 语法的设计是相当好的,比很多语言都要好的多,要把 Erlang 的语法设计的很烂是一件非常难的事,Erlang 可是从 Prolog 演变过来的。说 Erlang 语法很烂的说明还没理解 Erlang。

#29 楼 @bhuztez 关于 Erlang 我也不是非常懂,你应该是这里 Erlang 懂得最多的了,所以我也没法很好解释这个问题,我找了篇关于 Elixir 的 blog,写的和你问的问题差不多,你有兴趣的话可以看看。

http://blog.alexrp.com/2013/02/14/elixir-isnt-hipster/

#28 楼 @jjym atom 全要:开头,声明个函数非得要 def 开头,好无力啊

在看,作者其实还是很折腾的 但是确实是个好的学习方法 既加深对 Ruby 的理解 又可以编写一门新的语言

果然,一流的人是在写编译器!

从 github 上的头像来看,这伙怎么年轻啊,是 crafting rails 那本书的作者,老外为啥都这么牛啊?

需要 登录 后方可回复, 如果你还没有账号请 注册新账号