Upgrade to Pro — share decks privately, control downloads, hide ads and more …

インタプリタ言語が 実行環境の差異を 吸収する仕組みを あさーく理解する

Avatar for えび えび
November 16, 2025
8

インタプリタ言語が 実行環境の差異を 吸収する仕組みを あさーく理解する

低レイヤーズさっぽろ #3 -秋- にて発表した資料です。

低レイヤーズさっぽろ #3 -秋-:https://low-layers-sapporo.connpass.com/event/371754/

Avatar for えび

えび

November 16, 2025
Tweet

Transcript

  1. 7

  2. Ruby - 書いたコード(.rb)を、その場で読み ながら実行 - Ruby VM という仮想的なCPUがバイ トコードを解釈 -

    実行前にバイナリを作らないから移 植しやすい - その代わり、実行速度はちょっと遅い 13
  3. Ruby(インタプリタ)は 逐次翻訳をする 1. .rb を その場で読む 2. 構文解析して AST(抽象構文木)を作る 3.

    中間表現(バイトコード) に変換 4. Ruby VM(仮想CPU)がバイトコードを1命令ずつ解釈して実行 - 実行前にバイナリを用意しない - その代わり、Ruby VMが逐次的にCPUの代わりに働く - CPUではなく「Ruby VMという仮想的なCPU」が命令を処理してる 16
  4. RubyがOS差異を吸収できる理由 - Rubyは 実行時に VM が処理を肩代わりしてくれるので、 OSごとにバイナリを作り 直す必要がない - VMやGemが持っている抽象化レイヤが厚く、

    ファイルパスの違い・ネットワークの 取り扱い・メモリ制約なども、 「Ruby側が吸収してくれる」仕組みになっている。 17
  5. Swift(コンパイル)は 先に翻訳する 1. .swift → コンパイルして LLVM中間コードにする 2. OSやCPU向けに最適化されたバイナリを作る(*.app や

    *.out) 3. 実行時はOSがバイナリをロードしてCPUに渡す 4. CPU命令を実行(Swift runtimeの補助) - バイナリを生成する分、時間はかかるけど実行は早い - OSごとにバイナリは別(だから移植性は劣る) - Swiftのコードは 事前にCPUが直接理解できる形(機械語)に変換される 18
  6. Ruby(インタプリタ)は 逐次翻訳をする 1. .rb を その場で読む 2. 構文解析して AST(抽象構文木)を作る 3.

    中間表現(YARVバイトコード) に変換 4. Ruby VM(仮想CPU)がそのバイトコードを1命令ずつ解釈して実行 - 実行前にバイナリを用意しない - その代わり、Ruby VMが逐次的にCPUの代わりに働く - CPUではなく「 Ruby VMという仮想的な CPU」が命令を処理してる 20
  7. サニタイザーと実行時エラーってどこまで違うねん - Rubyは実行時エラーは検出するけど、Swiftは実行時エラー + サニタイズのエラー も拾える - 実行時エラーは「言語ランタイムや標準ライブラリが用意している安全装置」によっ て検出される ->

    言語が責任を持って守る仕様の範囲に限られる - 深いバグ(例えばメモリの越境アクセス、マルチスレッドの競合)は、言語だけでは 保証できないので、サニタイザーの出番になる - そもそもRubyはメモリ空間やスレッド安全性、ポインタ演算には、言語としては踏み 込まない(C拡張を使う) -> そもそもサニタイザーが保証したい領域まで手を伸ばさない感じなのかな。 25