Table of Contents

Jak ruby uruchamia mój kod?

Dzielenie kodu na tokeny

1.9.3-p392 :003 > pp Ripper.tokenize("a = 1 + 2")
["a", " ", "=", " ", "1", " ", "+", " ", "2"]

Przekształcenie tokenów na coś, co będzie zrozumiałe dla interpretera

 > pp Ripper.lex("a = 1 + 2")
[[[1, 0], :on_ident, "a"],
 [[1, 1], :on_sp, " "],
 [[1, 2], :on_op, "="],
 [[1, 3], :on_sp, " "],
 [[1, 4], :on_int, "1"],
 [[1, 5], :on_sp, " "],
 [[1, 6], :on_op, "+"],
 [[1, 7], :on_sp, " "],
 [[1, 8], :on_int, "2"]]

Przekształcenie kodu na drzewko AST (abstract syntax tree)

1.9.3-p392 :009 > pp Ripper.sexp "a = 1 + 2"
[:program,
 [[:assign,
   [:var_field, [:@ident, "a", [1, 0]]],
   [:binary, [:@int, "1", [1, 4]], :+, [:@int, "2", [1, 8]]]]]]
 => [:program, [[:assign, [:var_field, [:@ident, "a", [1, 0]]], [:binary, [:@int, "1", [1, 4]], :+, [:@int, "2", [1, 8]]]]]]

Kompilacja drzewka AST w kod bajtowy

Maszyna wirtualna

Przeprowadza dwie operacje: kompilację i interpretację. Podczas kompilacji, maszyna ewaluuje AST i przekształca go w kod bajtowy. Nastęþnie, kod bajtowy jest uruchamiany przez interpreter. Maszyna również obsługuje wielowątkowość i rozszerzenia.

1.9.3-p392 :014 > puts RubyVM::InstructionSequence.compile("a = 1 + 2").disasm
== disasm: <RubyVM::InstructionSequence:<compiled>@<compiled>>==========
local table (size: 2, argc: 0 [opts: 0, rest: -1, post: 0, block: -1] s1)
[ 2] a          
0000 trace            1                                               (   1)
0002 putobject        1
0004 putobject        2
0006 opt_plus         <ic:1>
0008 dup              
0009 setlocal         a
0011 leave 
1.9.3-p392 :016 > pp RubyVM::InstructionSequence.compile("a = 1 + 2").to_a
["YARVInstructionSequence/SimpleDataFormat",
 1,
 2,
 1,
 {:arg_size=>0, :local_size=>2, :stack_max=>2},
 "<compiled>",
 "<compiled>",
 nil,
 1,
 :top,
 [:a],
 0,
 [],
 [1,
  [:trace, 1],
  [:putobject, 1],
  [:putobject, 2],
  [:opt_plus, 1],
  [:dup],
  [:setlocal, 2],
  [:leave]]]

INFO

Wielowątkowość

Wielowątkowość to uruchamianie kodu w kilku procesach.

Sekwencyjne uruchamianie:

Wątek:

Wielowątkowe uruchamianie: