所以,我有一些问题要问我,我确实浏览了互联网,但没有太多可靠的答案.大多数博客帖子会相互取消,因为他们都赞扬了不同的东西,并有基准来"证明他们的观点"(在我的生活中,我从未见过如此多的矛盾基准).
无论如何,我的问题是:
一些"奖金"问题:
我为你发动的这场文字风暴道歉!♥
我知道在运行时检测Ruby 实现(例如,MRI,JRuby,Rubinius等)的方法是检查全局常量RUBY_ENGINE:
$ ruby -e 'puts RUBY_ENGINE'
ruby
Run Code Online (Sandbox Code Playgroud)
什么是已知的Ruby实现的相当全面的列表及其对应的RUBY_ENGINE值?
可能的重复:
如何用该语言编写语言的编译器?
在"本身"中实现编译器
我在看Rubinius,这是一个使用Ruby编写的编译器编译成字节码的Ruby实现.我无法理解这一点.你如何编写语言本身的语言编译器?似乎只是文本没有任何东西可以将它编译成可执行文件,然后可以编译用Ruby编写的未来代码.我只是输入那句话感到困惑.有人可以帮忙解释一下吗?
你能给我一些例子是值得它使用Rubinius的,就像在这个帖子: http://yehudakatz.com/2009/08/31/simplifying-rails-block-helpers-with-a-side-of-rubinius/
目前正在开发多种Ruby实现.您对此感到满意,为什么?您是否在生产中积极使用非MRI实施?
一些选项包括:
这引发了我在1.9.2 Ruby中的SystemStackError(但在Rubinius中工作):
class Fixnum
def +(other)
self + other * 2
end
end
Run Code Online (Sandbox Code Playgroud)
但没有super了+(基于其他错误).
我如何访问原始+功能?
我有这两个gcd函数的实现:
def gcd1(a,b)
if a==b
a
elsif a>b
if (a%b)==0
b
else
gcd1(a%b,b)
end
else
if (b%a)==0
a
else
gcd1(a,b%a)
end
end
end
def gcd2(a,b)
if(a==b)
return a
elsif b>a
min,max=a,b
else
min,max=b,a
end
while (max%min)!=0
min,max=max%min,min
end
min
end
Run Code Online (Sandbox Code Playgroud)
函数gcd1是尾递归的,而gcd2使用while循环.
我已经验证了rubinius通过对因子函数进行基准测试来进行TCO,只有基数函数,基准测试显示递归版本和迭代版本是"相同的"(我使用的是基准测试版).
但是对于上述情况,基准测试显示gcd1比gcd2快至少两倍(递归速度是迭代速度的两倍,甚至更快).
我用来进行基准测试的代码如下:
Benchmark.ips do |x|
x.report "gcd1 tail recursive" do
gcd1(12016,18016)
end
x.report "gcd2 while loop" do
gcd2(12016,18016)
end
x.compare!
end
Run Code Online (Sandbox Code Playgroud)
结果 :
Warming up --------------------------------------
gcd1 tail recursive 47.720k i/100ms
gcd2 while loop 23.118k i/100ms
Calculating ------------------------------------- …Run Code Online (Sandbox Code Playgroud) 我已经使用Ruby的标准MRI实现在Ruby中编程了一段时间,但我一直对我听到的其他实现很好奇.
前几天我正在阅读Rubinius,一个用Ruby编写的Ruby解释器.我尝试在不同的地方查找它,但我很难弄清楚这样的事情究竟是如何起作用的.我在编译器或语言编写方面从未有过多少经验,但我真的很想知道它.
一种语言究竟如何被自己解释?编译中是否有一个基本步骤,我不明白这有什么意义?有人可以向我解释一下这就像我是一个白痴(因为那不会离基地太远)
ruby compiler-construction language-design rubinius self-interpreter
虽然做了一些基准来回答这个约来连接阵列我感到惊讶的是,当我在使用JRuby也做了同样的基准测试是慢了很多的最快方法问题.
这是否意味着关于jRuby比MRI Ruby更快的旧的慢板已经消失了?或者这是关于如何在jRuby中处理数组?
这里的基准测试结果和MRI Ruby 2.3.0和jRuby 9.1.2.0两者都运行在64位Windows 7盒子上,所有4个处理器忙于50-60%,内存使用±5.5GB.必须使用参数启动jRuby -J-Xmx1500M以提供足够的堆空间.由于堆栈级别太深,我不得不使用push删除测试,并且还删除了最慢的方法,使测试时间不长.使用Jave运行时:1.7.0_21
require 'Benchmark'
N = 100
class Array
def concat_all
self.reduce([], :+)
end
end
# small arrays
a = (1..10).to_a
b = (11..20).to_a
c = (21..30).to_a
Benchmark.bm do |r|
r.report('plus ') { N.times { a + b + c }}
r.report('concat ') { N.times { [].concat(a).concat(b).concat(c) }}
r.report('splash ') { N.times {[*a, *b, *c]} }
r.report('concat_all ') { N.times { [a, b, c].concat_all }}
r.report('flat_map ') { N.times {[a, …Run Code Online (Sandbox Code Playgroud) 我有一个轨道项目,运行良好的MRI 1.9.3.当我尝试使用Rubinius运行时,我收到此错误app/views/layouts/application.html.haml:
从ASCII-8BIT转换为UTF-8时,"\ xC2"为UTF-8