Pull to refresh

Comments 7

UFO just landed and posted this here
В MRI в обозримом будущем не появится. А зачем? Парсинг кода и компиляция AST занимает очень малое количество времени; а вот выполнение кода, определяющего методы, существенно более затратно.

Поясню: в коде
class Klass
  def meth
    puts "hello"
  end
end

на самом деле в контексте класса Klass выполняется метод «core#define_method» (да, именно так, с символом «#» — это системный метод, он еще и вызывается на виртуальном объекте), который собственно и добавляет метод в класс. В том же Rails количество подобных вызовов огромно, и кеширование байткода ничего здесь не ускорит.
У меня нет возможности поставить MacRuby, но судя по вот этому тикету, файлы .rbo представляют из себя не кешированный байткод, как в питоне, а нативный код, который выдает Ahead-of-Time компилятор и который даже можно линковать с другим нативным кодом.

Кроме того, вот здесь (со ссылкой на книгу Гвидо) пишут, что .pyo отличается от .pyc только отсутствием assert-ов. Это, конечно, очень ценная оптимизация.
Хорошее начало.
Но мне кажется так лучше изучать код:

> puts RubyVM::InstructionSequence.compile(%{puts "Hello, YARV!"}).disasm
== disasm: <RubyVM::InstructionSequence:@>==========
0000 trace 1 ( 1)
0002 putnil
0003 putstring "Hello, YARV!"
0005 send :puts, 1, nil, 8, <ic:0>
0011 leave
О дизассемблере я, конечно, расскажу в следующей части, но изначально задумывалось писать не в том порядке, в каком я это исследовал, а последовательно с точки зрения практического применения.

Да и, честно говоря, этот листинг принципиально мало чем отличается от массива с кодом в конце моей статьи.
Sign up to leave a comment.

Articles