0
Rubinius: Ruby, написанный на Ruby Самсонов Иван
Летом 2006 года, где-то в США А не написать ли мне свой Ruby с блекджеком и шлюхами?
Что такое Rubinius? Ruby LLVM JIT Engine Yard Evan Phoenix VM Melbourne Bytecode
Программа, которая транслирует код программы на Ruby, например: puts  123 в эффективный машинный код с последующим его исп...
Имплементация языка программирования Ruby Rubinius это:
Нормально ли, что Rubinius написан на Ruby? <ul><li>Да! Ведь, например: </li></ul><ul><li>изрядная часть языка Java написа...
Нормально ли, что Rubinius написан на Ruby? static  VALUE  rb_ary_collect (ary)‏ VALUE ary; { long  i; VALUE collect; if  ...
Нормально ли, что Rubinius написан на Ruby? module  Enumerable def   collect if   block_given? ary  =  [] each { |o| ary  ...
Почему Rubinius?
Почему Ruby?
Потому, что Ruby: <ul><li>Динамичный; </li></ul><ul><li>Человечный; </li></ul><ul><li>Удобный. </li></ul>
...но при этом Ruby  медленный
Одна из целей проекта Rubinius - сделать Ruby  быстрым
История Rubinius Старт проекта Engine Yard нанимает  Эвана Команда расширяется Запуск Rails VM на C++ stackfull бренч мерж...
Преимущества Rubinius <ul><li>Компактное быстрое ядро VM; </li></ul><ul><li>сборщик мусора, основанный на поколениях ; </l...
Сборщик мусора <ul><li>Перемещающая стратегия; </li></ul><ul><li>Immix mark-region сборщик; </li></ul>
Стадии компилятора байткода .rb файл Node дерево sexps AST bytecode
Результат компилятора байткода def foo(a,b)‏ a + b end 0000:  push_local                 0    # a 0002:  push_local       ...
Стадии JIT bytecode LLVM IR машинный код
Входящий Ruby-код для JIT class  Flower def   bloom ( * a)‏ a end end
JIT – результат преобразования 0x2280010 sub $0xc, %esp 0x2280013 mov 0x1c(%esp), %eax 0x2280017 mov %eax, 0x4(%esp)‏ 0x22...
Дальнейшая оптимизация: Method Inlining
Примитивы <ul><li>class  Fixnum : public Integer { </li></ul><ul><li>public: </li></ul><ul><li>// Ruby.primitive! :fixnum_...
Backtrace <ul><li>puts  &quot;123&quot;   +  1 </li></ul>bin/rbx z.rb   Coercion error: 1.to_str => String failed (TypeErr...
Плагины компилятора # -*- array_zen -*- q  =   + [ x ** 2 , x.in([1,2,3])] p q  # => [1, 4, 9]
Тестирование языка программирования <ul><li>Mspec </li></ul><ul><li>RubySpec </li></ul>describe  &quot;Array#shift&quot;  ...
Проблемы с Rubinius: <ul><li>Отсутствие поддержки Windows; </li></ul><ul><li>Небольшое сообщество; </li></ul><ul><li>Непри...
Пример «багов»: <ul><li>x  =  0 </li></ul><ul><li>loop   do </li></ul><ul><li>puts x > -123 # => true   </li></ul><ul><li>...
Планы по развитию: <ul><li>JIT </li></ul><ul><li>Debugger </li></ul><ul><li>1.9 </li></ul><ul><li>Windows </li></ul>
Бенчмарки rubinius 1.0.0 (1.8.7 e6c32afd 2010-05-14 JI)‏ ruby 1.9.2dev (2010-04-14 trunk 27342)‏ ruby 1.8.7 (2010-01-10 pa...
Рекурсия def   fib (n)‏ if  (n  <  2)‏ n else fib(n - 1)  +  fib(n - 2)‏ end end
Рекурсия
Хеш функция def   foo hash  =  {} 100.times {|i| hash[i]  =  0} end
Хеш функция
Простое Rails приложение <ul><li>Rails 2.3.5 </li></ul><ul><li>WEBrick </li></ul><ul><li>ab -c 5 -n 1000   http://127.0.0....
Простое Rails приложение
А ты стал контрибутором Rubinius?
Upcoming SlideShare
Loading in...5
×

Rubinius: Ruby написанный на Ruby

1,866

Published on

Rubinius: Ruby written on Ruby.
Devcon '10. Moscow, Russia, 17, May

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,866
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
7
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "Rubinius: Ruby написанный на Ruby"

  1. 1. Rubinius: Ruby, написанный на Ruby Самсонов Иван
  2. 2. Летом 2006 года, где-то в США А не написать ли мне свой Ruby с блекджеком и шлюхами?
  3. 3. Что такое Rubinius? Ruby LLVM JIT Engine Yard Evan Phoenix VM Melbourne Bytecode
  4. 4. Программа, которая транслирует код программы на Ruby, например: puts 123 в эффективный машинный код с последующим его исполнением: push %rbp; mov %rsp, %rbp; push %rbx; subq $0x98, %rsp; cmp $0x0, 0x10(%rcx); call 0xffffffffff472010; jmp 0x9c; Rubinius это:
  5. 5. Имплементация языка программирования Ruby Rubinius это:
  6. 6. Нормально ли, что Rubinius написан на Ruby? <ul><li>Да! Ведь, например: </li></ul><ul><li>изрядная часть языка Java написана на нём самом; </li></ul><ul><li>Где не получается использовать Ruby, используется C++; </li></ul>
  7. 7. Нормально ли, что Rubinius написан на Ruby? static VALUE rb_ary_collect (ary)‏ VALUE ary; { long i; VALUE collect; if (!rb_block_given_p()) { return rb_ary_new4(RARRAY(ary)->len, RARRAY(ary)->ptr); } collect = rb_ary_new2(RARRAY(ary)->len); for (i = 0; i < RARRAY(ary)->len; i++) { rb_ary_push(collect, rb_yield(RARRAY(ary)->ptr[i])); } return collect; }
  8. 8. Нормально ли, что Rubinius написан на Ruby? module Enumerable def collect if block_given? ary = [] each { |o| ary << yield (o) } ary else to_a end end alias_method :map, :collect end
  9. 9. Почему Rubinius?
  10. 10. Почему Ruby?
  11. 11. Потому, что Ruby: <ul><li>Динамичный; </li></ul><ul><li>Человечный; </li></ul><ul><li>Удобный. </li></ul>
  12. 12. ...но при этом Ruby медленный
  13. 13. Одна из целей проекта Rubinius - сделать Ruby быстрым
  14. 14. История Rubinius Старт проекта Engine Yard нанимает Эвана Команда расширяется Запуск Rails VM на C++ stackfull бренч мержится в master JIT Повторный запуск Rails
  15. 15. Преимущества Rubinius <ul><li>Компактное быстрое ядро VM; </li></ul><ul><li>сборщик мусора, основанный на поколениях ; </li></ul><ul><li>поддержка расширений языка C; </li></ul><ul><li>большая часть кода реализована на Ruby; </li></ul><ul><li>JIT; </li></ul><ul><li>RubySpec; </li></ul>
  16. 16. Сборщик мусора <ul><li>Перемещающая стратегия; </li></ul><ul><li>Immix mark-region сборщик; </li></ul>
  17. 17. Стадии компилятора байткода .rb файл Node дерево sexps AST bytecode
  18. 18. Результат компилятора байткода def foo(a,b)‏ a + b end 0000:  push_local                 0    # a 0002:  push_local                 1    # b 0004:  meta_send_op_plus          :+ 0006:  ret
  19. 19. Стадии JIT bytecode LLVM IR машинный код
  20. 20. Входящий Ruby-код для JIT class Flower def bloom ( * a)‏ a end end
  21. 21. JIT – результат преобразования 0x2280010 sub $0xc, %esp 0x2280013 mov 0x1c(%esp), %eax 0x2280017 mov %eax, 0x4(%esp)‏ 0x228001b mov 0x10(%esp), %eax 0x228001f mov %eax, (%esp)‏ 0x2280022 mov $0x0, 0x8(%esp)‏ 0x228002a call 0xfffffffffde9d640 ; 0x11d650 rbx_construct_splat 0x228002f add $0xc, %esp 0x2280032 ret
  22. 22. Дальнейшая оптимизация: Method Inlining
  23. 23. Примитивы <ul><li>class Fixnum : public Integer { </li></ul><ul><li>public: </li></ul><ul><li>// Ruby.primitive! :fixnum_or </li></ul><ul><li>Integer* bit_or(STATE, Fixnum* other); </li></ul><ul><li>}; </li></ul><ul><li>class Fixnum < Integer </li></ul><ul><li>def | (o)‏ </li></ul><ul><li>Ruby .primitive :fixnum_or </li></ul><ul><li>end </li></ul><ul><li>end </li></ul>
  24. 24. Backtrace <ul><li>puts &quot;123&quot; + 1 </li></ul>bin/rbx z.rb Coercion error: 1.to_str => String failed (TypeError)‏ Backtrace: Type.coerce_to at kernel/common/type.rb:22 Kernel(String)#StringValue at kernel/common/kernel.rb:112 String#+ at kernel/common/string.rb:78 main.__script__ at z.rb:1 Rubinius::CodeLoader#load_script at kernel/delta/codeloader.rb:65 Rubinius::CodeLoader.load_script at kernel/delta/codeloader.rb:88 Rubinius::Loader#script at kernel/loader.rb:435 Rubinius::Loader#main at kernel/loader.rb:526 Rubinius::Loader.main at kernel/loader.rb:552 Object#__script__ at kernel/loader.rb:564 ruby z.rb z.rb:1:in `+': can't convert Fixnum into String (TypeError)‏ from z.rb:1
  25. 25. Плагины компилятора # -*- array_zen -*- q = + [ x ** 2 , x.in([1,2,3])] p q # => [1, 4, 9]
  26. 26. Тестирование языка программирования <ul><li>Mspec </li></ul><ul><li>RubySpec </li></ul>describe &quot;Array#shift&quot; do it &quot;removes and returns the first element&quot; do a = [5, 1, 1, 5, 4] a.shift.should == 5 end it &quot;returns nil when the array is empty&quot; do [].shift.should == nil end end
  27. 27. Проблемы с Rubinius: <ul><li>Отсутствие поддержки Windows; </li></ul><ul><li>Небольшое сообщество; </li></ul><ul><li>Непригоден для продакшена; </li></ul><ul><li>Несовместимость с некоторыми гемами (C, Ruby)‏; </li></ul><ul><li>Отсутствие актуальной документации; </li></ul>
  28. 28. Пример «багов»: <ul><li>x = 0 </li></ul><ul><li>loop do </li></ul><ul><li>puts x > -123 # => true </li></ul><ul><li>end </li></ul>
  29. 29. Планы по развитию: <ul><li>JIT </li></ul><ul><li>Debugger </li></ul><ul><li>1.9 </li></ul><ul><li>Windows </li></ul>
  30. 30. Бенчмарки rubinius 1.0.0 (1.8.7 e6c32afd 2010-05-14 JI)‏ ruby 1.9.2dev (2010-04-14 trunk 27342)‏ ruby 1.8.7 (2010-01-10 patchlevel 249)‏ jruby 1.6.0.dev (ruby 1.8.7 patchlevel 249) (2010-04-14 7cb1298)‏ MacRuby version 0.6 (ruby 1.9.0)‏
  31. 31. Рекурсия def fib (n)‏ if (n < 2)‏ n else fib(n - 1) + fib(n - 2)‏ end end
  32. 32. Рекурсия
  33. 33. Хеш функция def foo hash = {} 100.times {|i| hash[i] = 0} end
  34. 34. Хеш функция
  35. 35. Простое Rails приложение <ul><li>Rails 2.3.5 </li></ul><ul><li>WEBrick </li></ul><ul><li>ab -c 5 -n 1000 http://127.0.0.1:3000/ </li></ul><ul><li>authlogick example </li></ul>
  36. 36. Простое Rails приложение
  37. 37. А ты стал контрибутором Rubinius?
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×