Ruby Ruby 语言二十岁生日,如果你采访Matz,你会问什么?

lgn21st · 发布于 2013年2月19日 · 最后由 y_ding 回复于 2013年3月14日 · 6347 次阅读
3

今年是Ruby 20年(http://www.infoq.com/cn/articles/Thriving-Ruby-language-Family),我们想就此机会跟 infoQ 社区的朋友一起对 Matz 做一个采访,如果采访人是你,你最想问 Matz 的问题是什么?

共收到 59 条回复
3

我们这里不少朋友对 Ruby 底层实现或者其他语言有深入研究的,你们最关心的是什么呢? @skandhas @luikore @Saito @bhuztez

96

Ruby 3.0 有什么改进

172

他女儿的详细资料。。。

3

#2楼 @pongyo #3楼 @iBachue

我想收集一些跟大家真正相关的,大家会感兴趣的技术问题,认真做好一期采访。

1303

mruby的具体定位是怎样的

1342

在ruby2.0版本中有什么遗憾的事情么?比如说想加入的某个特性因为种种原因没能添加等。

96

#4楼 @lgn21st Ruby 3.0 这个很相关啊。就是问对ruby未来有什么打算。

4215

与python最大的不同点是?有信心超越python么?

96

看av吗?

5715

我想知道, 他和PHP 5.5 以及即将到来的PHP6相比较有什么优势和不足. php也有很多优秀的框架, 例如 YII,Laravel,Fuelphp,Zend Framework cake等等

他们有好多是借鉴了ROR的特性和快速开发的理念. 由于php本身的限制, 面向对象的方式有点不同.

刚刚接触ruby一天时间, 我也问不出什么好问题. 深入的问题.

就想知道, web开发, 只讲究快速快发, 不断改进. 用yii 还是 rails 比较合适.

(个人觉得语法什么的并不是重要的, 最重要的是开发速度, 组件, 开源项目, 开源社区的质量 )

目测, 驾驭ruby比php要难度大一点, 招人是不是不是很好招?

现在在广州我们很容易就可以找到一个php新手, 带一个月基本上就可以拿框架用了. ruby门槛貌似稍微高一点.

本人不是专业的技术队伍, 只是昨天研究了一下ruby, 结合了一下自学php的经历. 不要喷我 , 多谢.

3

#10楼 @D90 我连续四年请 Matz 先生到中国来布道,根据我对他的了解,我觉得他抱持着自己对编程语言的独特理解,才设计出 Ruby 这门语言。但是就跟其他语言的类比,我感觉他可能不见得会给你你想了解的答案。还有,Matz是专注语言底层实现的,对上层的 Web framework,甚至包括 Rails 方面的话题,他可能也难以回答,可能我这么跟你解释你会觉得失望,但是就 Ruby 语言本身,其实还是有很多很多东西可以挖掘的。

1153

@lgn21st 针对ruby运行速度慢的问题,他有没有一个长期的改进方案?

188

@lgn21st 啊,期待,什么时候进行采访呀?

  • 对于 Refinement 有什么新的想法和计划。
  • 对于 Python 的 decorator 有什么看法—— Ruby 今后会增加 decorator 吗?
  • GIL 是否最终会被去除?
  • 越来越多的应用走向多处理器高并发——很多公司和项目开始使用 nodejs。MRI 在这方面相比处弱势。对此有何想法和计划吗?

嗯,先就想到这些。:)

3

#13楼 @fredwu 我本周收集问题并联系Matz,估计最快下周就能完成了。

5715

#11楼 @lgn21st

知道了. 多谢你的关照. 感觉这个社区挺活跃的. 老大很照顾新人.

96

Javascript这门语言有很多问题,所以有一本书叫做《Javascript语言精粹》,Ruby是否有同样的情形?因为做一件事情,Ruby往往有很多种方式,有没有一个让大众认可的ruby best practice?

1205

#16楼 @keating ruby有很多种方式,但是往往会有一种大家最认可的方式,我觉得ruby从来没有声称要做到每一件事要用最好的方式去解决,但是结果却往往会有一种最好的方式出现

1205

#8楼 @chenge 在服务端ruby从来就没输给python过,不知道你是不是想问在客户端也是这样

4215

#18楼 @mjf429 目前python的用户数要大于ruby,指的是这个。

1205

#19楼 @chenge ruby和python都属于A类语言,用户数的这点差距意义并不大,本来两种语言的出发点并不太一样,只要能解决好自己想解决的主要问题就是一种成功的语言,像C用户数第一,但是也不可能拿C来做web吧

96

#18楼 @mjf429 服务端,ruby有没有赢过都是问题吧...

虽然Python和Ruby都挫爆了

96

#1楼 @lgn21st 我是Erlang脑残粉...

显然你不用猜也知道,我要问那也是问,Ruby啥时候能实现抢占式调度,就像Erlang或者Stackless那样,对执行的VM指令计数,超过某个值就切换...

反正模式匹配是不用指望了,要是在语言层面实现,那Ruby就不是Ruby了...

5173

#3楼 @iBachue 好邪恶啊,哈哈

1205

#21楼 @bhuztez python和ruby我都做,python自己造轮子的情况比较多,我个人感觉ruby在服务端的场景要舒服得多,大部分库直接就可以找到现成的,最多进行小的定制就能用起来,性能问题其实堆机器就能解决,何况经过各种优化后ruby也未必见得要慢多少,感觉生产力才是关键,哪个重复劳动少我就会选哪个

5210

第一句会问他,能说中文吗?嘿嘿

3191

如果请 Matz 先生 20 年后的今天开始设计一门新的语言,根据他对未来计算发展趋势的看法,他会作出哪些与20年前不同的决定?

122

让他学一门新语言,他会学什么?

172

问问他对Ruby有什么失望的地方或是一直想改进却至今都没有成功的地方吗?

1665
  • 在20年的Ruby发展历史中,对Ruby语言的影响大还有那些人,能说说他们的事迹么?比如说说YARV的故事,以及如何最终成为1.9版ruby的基础的?
  • 啥时候能把Ruby代码仓库移到Github上?
1665

#10楼 @D90 Matz先生之前被问过类似问题,他说过他不做Web开发的,不熟的……

3

#29楼 @ericguo Ruby代码仓库?你是说这个? https://github.com/ruby/ruby

1665

#31楼 @lgn21st 这个只是镜像,貌似还是以SVN为主仓库的

8

#29楼 @ericguo 2008-2012的可以看这里:http://rubyheroes.com/

146

@lgn21st

关于 CRuby

  1. Ruby 2.0 曾计划支持直接生成和运行字节码文件,现在应该没有了吧,以后还会支持这个功能吗?
  2. Ruby 2.0 的VM 在性能方面较 Ruby 1.9 有比较多的改进,是否可以大略的谈一下?另外后续还有对 VM 的改进计划吗?

关于 MRuby

  1. mruby 有支持 coroutine 或 fiber 的计划吗?
  2. 对类似 mruby jit 的项目怎么看?
  3. mruby 后续的开发计划是什么?

上面的一些问题在网络上都可以搜索到一些资料,之所以列出来,是想让 Matz 亲自谈一谈啦。

1342

#25楼 @badboy matz还是会说中文的“谢谢”来着的(rubyconfchina2012上找matz san签字的时候,从他手上拿过签好的东西对他用日语说了句:谢谢,没想到他用中文回我:谢谢

5610

我想问 大师对于Ruby不同版本的语法变化比较大(甚至不兼容)这方面在后期有什么样的计划~,后期会不会稳定下来,例如ruby1.8和1.9 python2.7和3.0 。刚开始接触ruby,别的谈不上来~但是感觉ruby和python就在版本兼容性上真的很令人抓狂~

2511

移动上ruby会有啥作为么,mruby离实用还有点距离

96

何时开发官方的 jit 引擎

1303

#10楼 @D90 “有人模仿我的脸,有人模仿我的面,模仿得再像也不是统一老坛” 没有Ruby这么灵活的语言做支撑,PHP框架弄得再像也枉然

2622

标准库的文档什么时候能完善下。。

1031

#11楼 @lgn21st

有关 Ruby, 事实上咱社区挖掘的真的很少...

1031

#13楼 @fredwu 粗略的感觉, Ruby 这么 happy 的语言, 如果非要在多核方面挖掘, 就不是 Ruby 了. Ruby 作为辅助语言其实不错. #16楼 @keating 我觉得不大可能出这样一本书, 首先这和 Ruby 的风格不一致, 其次, Ruby 不像 JavaScript, 自身很优秀, 很一致, 没有 JS 那么多包袱, 自然也不会有那么多陷阱可以去讲. 相反, Rails 不再支持 1.8X之后, 倒是应该有这样一本书, 相比较 Ruby 而言, 太多的陷阱, 太乱了... #22楼 @bhuztez

要是在语言层面实现,那Ruby就不是Ruby了...

我也这么觉得.

1031

我的问题:

  1. `Ruby 编程语言' 什么时候打算出新版? (个人希望讲解更深入, 更全面一些, 底层介绍, 以及设计理念, 可以讲解的更多一些)

给两个建议:

  1. 请一定坚持 Ruby 现有的风格以及特色, 多多保持自己的特色, 少一些妥协... (就像 Apple). 我想每个人多会使用多个计算机语言, 但是 Ruby 绝对是用起来最 Happy 的语言, 这就够了.
  2. 文档很重要, 个人觉得 Ruby 在文档方面, 还是太单薄了, 这阻碍了很多人使用 Ruby.
96

没rails的话ruby永无出头之日

96

会不会引进其它并发方案

96

如果让Ruby添加一种新特性会是什么?如果要去掉一个特性会是什么?

Matz除了Ruby以外还喜欢什么语言,推荐大家去了解什么语言?

68

如果有人愿意开价100亿美元的话,是否愿意卖掉Ruby?

2880

#1楼 @lgn21st

  • 考虑 % 的自定义语义不? 例如让用户可以自己定义 %sql{ select * from users; } 之类的...
2880

#34楼 @skandhas

jit 编译就是用空间换时间... 解释器的优势是操作的抽象度高, 可执行代码可以挤到很小的内存中去, mruby 用 jit 的话也就只能适用于很小的一部分移动设备...

另外解释器也能到达很高的速度的, luajit2 的解释模式就比 luajit1 的 jit 模式快. 1.8 时代有个 AOT (ahead of time) 编译器 ruby2cext, 把 ruby 翻译成 C, 然后让 C 编译器用最大优化度去编译, 可以提升不少速度, 但是这个方法对 1.9 已经没有改进的效果了... 一个 jit 的优化能力一般是比不上 C 编译器的...

完成日常任务如 rake 或者爬虫的话, 解释模式执行基本都是比 jit 快, 因为很多代码都是只跑一遍, 先编译成机器码再跑反而慢了. jit 对多次调用的一些 "热" 方法效果明显, 但是 ruby 中比较 "热" 的很多方法已经是 C 实现的了. 如果采用 jit, 可能需要把很多实现改回 ruby 才能保证速度(就像 rubinius 里把很多很多核心方法都用 ruby 重新实现了一遍...). 有些代码多而且"热度均匀"的 java 应用为了尽可能多的 jit, 把 permanent generation 调得非常大 (好几G之类的), 提升效果也不明显, 因为可执行机器码多了 page miss 的情况也会很严重...

内存也是考虑因素之一. jit 后消耗内存明显增多, 现在 ruby 的字节码是按照平台长度对齐的, 其实是 "qword code", 吃内存已经不小了... 如果采用 jit, 可能要重新设计字节码, 使用更节省内存的表示方式? 但是节省内存的字节码表示方式往往不能对齐, 不能对齐就会影响解释执行的速度, 并且使一些技巧如 inline method caching 更难实现...

大量运用了元编程和反射的代码, 运行的时候 jit 也要多次重新编译...

有了 jit 之后还需要做很多工作去优化, 例如 java 的 jit 就能扫描一些短的方法并且把它 inline 过来, 减少 method call 的时间损耗. 但是一些优化手段随着 CPU 的发展没有效果甚至是反效果了, 像分支预测能力比较强的 CPU, 一些方法调用的损耗几乎可以忽略, inline 进来反而增加了代码的大小, 没达到提速的效果... 所以现在的最新的编译器 gcc 和 vc 都是用 profile based 的手段去检测一些指令或者代码的代价, 然后按照代价选择生成最佳的机器代码. 但是一个 jit 要做到这种程度代价也很高的...

http://nominolo.blogspot.jp/2012/07/implementing-fast-interpreters.html

虽然实现一个有效果的 jit 很困难, 但 ruby 和 mruby 的 x86 jit 也是有人在做的

再另外, 速度优化不是一个 jit 能搞定的事情, gc, method dispatch 都还有优化的空间, 而且现在解释器也还没有达到最优化: ruby 2.0 stack caching 的优化开关还没打开(有些测试还跑不过去, 而且没有完全的速度提升), context threading, super instruction, manual branch prediction 之类的优化技巧也还没应用上. 我觉得 ruby 离 jit 还是挺远的路要走的, 或者解释器上有进一步突破, 干脆就不需要 jit 了, 又或者发展出一个混合解释和 jit 执行的模式(inline instruction)也说不定...

146

#49楼 @luikore 好文,收藏之。受教了! 👍

96

#49楼 @luikore

是的,JIT无法回避的问题就是生成代码需要时间,生成出来的代码还要占空间导致更多cache miss,很容易就得不偿失的。而且总觉得又多了个安全隐患...

一个 jit 的优化能力一般是比不上 C 编译器的

不是那么绝对的,JIT能知道运行期信息,有时候是能生成非常紧凑的代码,当然代价是要插入很多guard,检查是否符合你之前编译的时候假设的情况。不符合就fallback到解释模式。假如fallback到method JIT的话,那就更耗内存了,引起cache miss就啥都没有了... Mozilla好像在搞的那个是能共用部分tracing JIT和method JIT的生成代码的???

如果采用 jit, 可能要重新设计字节码, 使用更节省内存的表示方式?

为啥?一般解释型语言的字节码都是很贴近语言本身的,也就是说很紧凑的。你可以把编译/JIT过程看作内联解释器再把常量代入,消除冗余代码,显然很容易生成比解释器字节码长得多的代码。解释器字节码那里省下来的其实也不多

大量运用了元编程和反射的代码, 运行的时候 jit 也要多次重新编译...

没看出来能比别的情况多 ...

分支预测能力比较强的 CPU

我一直没搞明白(当然也没尝试去搞明白)分支预测的命中率是怎么能达到90%以上的。

发展出一个混合解释和 jit 执行的模式(inline instruction)也说不定...

tracing JIT被你赤裸裸地无视了

2880

#51楼 @bhuztez offline 编译器不用考虑编译时间, 可以做复杂很高的代价比较, 找到最佳的生成结果. vm 对 offline 编译器的唯一优势是按照运行情况去动态修改代码, 但现在的 C 编译器各种黑魔法, 已经具备一些运行时修改代码的能力了... 例如用 C++ 实现 singleton, getInstance() 这么写的话:

class Klass {
  static Klass* instance = NULL;
  public:
  static Klass* getInstance() {
    if (!instance) {
      instance = new Klass();
    }
    return instance;
  }
  ...
}

其中的 if 条件判断在多次运行之后可以被省略掉, 不判断就直接返回 instance 了.


ruby vm 已经有常量代入的能力了, 和 jit 无关, 叫做 inline const cache. 实现方法是第一次调用这个常量的时候就在 byte code 中嵌入常量的值. 如果发生了常量重新定义, vm 里维持的一个版本字段会更新, 然后所有的 const cache 都会失效.


把 bytecode 指令的实现作为模板写出来的 jit 几乎没有速度改进的... 这样的 jit 比 direct threading 只少了 goto *ip++; 产生的几条指令, 但是用了 operand predecode 手段的话, 可以利用 CPU 的乱序执行能力在很少的时钟周期内完成执行完很多指令. 真正有效果的 jit 要么需要手写很多汇编代码, 要么重新做寄存器分配, 没有 super instruction 那么好实现, 而且 super instruction 可以利用 offline 编译器的优化能力, 可移植性也更好...


分支预测有很多种, 最简单的是预测 goto label. 某些 CPU 可以还能根据段寄存器或者指令寄存器 RIP 指向的地址去扫描代码找跳转, 所以有 context threading 的优化方法: 某些情况下把 vm 里虚拟的 instruction pointer 放到指令寄存器中去. 至于 "90%的分支预测命中率" 之类的看不到上下文没什么意义吧...


做 jit 有很多方法... rubinius 是基于 llvm bytecode 做 jit 的, 但由于多了一个 llvm 字节码中间层, 编译的消耗也多大, ytljit 是基于 yarv bytecode 的 jit. 我觉得 tracing jit 更适合 v8 那种一开始就放弃 bytecode 的 vm ...

96

#52楼 @luikore

已经具备一些运行时修改代码的能力了

不是的。你在运行期改不了代码段里的东西的,那个内存页是可执行且只读的...你改了就执行不了了。假如你要写到新的内存页里面,那就和JIT一样变安全隐患了

ruby vm 已经有常量代入的能力了

我说的不是这个...我说的是最普通的情形,就比如x+y,解释器就只能这么运行了。而编译器或者JIT,知道xy的值,就可以直接把xy当作常量代入,于是这个表达式就被优化掉了。

把 bytecode 指令的实现作为模板写出来的 jit 几乎没有速度改进的

这还导致了更多cache miss呢...只是需要有效果,像PyPy那样也可以了。在运行期编译解释器代码就可以了...但是Python实在不是一门适合用来写编译器的语言...

http://tratt.net/laurie/tech_articles/articles/fast_enough_vms_in_fast_enough_time

我觉得 tracing jit 更适合 v8 那种一开始就放弃 bytecode 的 vm ...

V8倒是一开始是method JIT后来才tracing JIT的,而Mozilla家的各种monkey倒是一上来就是tracing JIT...

2880

#53楼 @bhuztez C++ 可以预先生成两个函数, 然后按情况在虚函数表中替代掉, 不用写内存页的...

| 而编译器或者JIT,知道x和y的值,就可以直接把x和y当作常量代入,于是这个表达式就被优化掉了

你说的这个是常量折叠而不是常量内联... 在 ruby 里 1 + 2 的结果可以不是 3 的... 到头来还要做退优化

tracing jit 被吹得太过头了... 我只是觉得在正则引擎 onigmo 里做 jit 更实在点...

96

#54楼 @luikore 我觉得JIT本身就是不太靠谱的东西...

681

谢谢Matz的付出

1031

#52楼 @luikore #55楼 @bhuztez

有长见识了!!

虽然看得似懂非懂...

96

#13楼 @fredwu

对于 Python 的 decorator 有什么看法—— Ruby 今后会增加 decorator 吗?

突然想起来,特来挖坟

从语法上讲实现这个功能毫无压力。但是从语义上讲,Ruby有函数这个概念吗,有吗?没有吗?反正怎么说都说不清楚,哈哈哈哈哈哈哈......

96

你会对中国开发者说些什么。。。。讨厌这样的问题。

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