主要Ruby VM有哪些优点/缺点(比如功能,兼容性,性能和怪癖?)我知道还有一些额外的功能,比如能够通过JRuby使用Java接口.这些也有助于注意.在这一点上,任何VM都有明显的优势吗?在什么情况下?
在Rubinius源代码中,负责包含模块的代码是什么?(具体来说,将模块放置为对象类的超类.)
我正在写一个宝石,我的目标是Ruby,JRuby和Rubinius.我正在使用Travis CI来构建我的库.当我定位Ruby和JRuby时,我的gem正确构建,但是当针对Rubinius时,它不起作用.这是错误:
Run Code Online (Sandbox Code Playgroud)Using worker: worker-linux-2-2.bb.travis-ci.org:travis-linux-13 git.1 $ git clone --depth=50 --branch=master git://github.com/maxgale/actor.git maxgale/actor Cloning into 'maxgale/actor'... remote: Counting objects: 74, done. remote: Compressing objects: 100% (48/48), done. remote: Total 74 (delta 29), reused 64 (delta 22) Receiving objects: 100% (74/74), 12.06 KiB | 0 bytes/s, done. Resolving deltas: 100% (29/29), done. Checking connectivity... done. $ cd maxgale/actor git.3 $ git checkout -qf f83f26d85f69e9c2965a4faa2065dd37ac789c36 $ rvm use rbx --install --binary --fuzzy rbx is not installed - installing. Searching for binary rubies, …
我决定看看迭代一系列哈希需要多长时间.以下是代码:
pairs = [{name: "firstname", value: "string"},{name: "lastname", value: "string"},{name: "country", value: "string"},{name: "city", value: "string"},{name: "state", value: "string"},{name: "company", value: "string"},{name: "year", value: "string"},{name: "political_affiliation", value: "string"},{name: "social_security_number", value: "string"}] * 1000
blank = {}
start = Time.now
pairs.each do |pair|
blank[pair[:name]] = pair[:value]
end
p Time.now - start
Run Code Online (Sandbox Code Playgroud)
通过从循环之前的当前时间减去循环之后的当前时间来计算时间.
根据代码中的数学计算,这是YARV 2.1.1中计算所花费的时间:
0.001962017
Run Code Online (Sandbox Code Playgroud)
这是Rubinius 2.2.6花了多长时间:
0.022598
Run Code Online (Sandbox Code Playgroud)
和jRuby 1.7.12
0.022317
Run Code Online (Sandbox Code Playgroud)
据说Rubinius和jRuby比YARV具有性能优势.为什么他们花费的时间几乎是执行相同基本操作的12倍?这是正常的还是我有不正确的配置?
我看过这个帖子,但我的问题可能更基本:
鉴于该线程 [1] 中接受的答案的响应是给我的,"/Users/username/.rvm/rubies/ruby-2.3.0/bin/ruby"我怎么知道那是 MRI、JRuby 等?如果是其他主要口译员,会是什么样子?
[1] 为了节省几秒钟, RbConfig.ruby
我试图(为了娱乐和利润)添加检查ruby中的对象并发现其源代码的能力.不是生成的字节码,也不是内部表示的某些反编译版本,而是解析为创建该对象的实际源.
我很快就学习了Rubinius,虽然我还没有充分了解它,但我认为我已经取得了一些进展.
不过,我无法弄清楚如何做到这一点.我的第一种方法是简单地向AST结构添加另一个实例属性(例如,一个ClosedScope对象).然后,当在运行时解释字节码时,以某种方式再次拉出该属性.
这看起来像一个合理的方法吗?