プログラミング言語組 1時間目

1
プログラミング言語クラス
2-7 言語処理系のソースコー
ド
稲葉 一浩
この時間にやること
2

言語処理系のファイル構成の紹介
 主に
Ruby を中心に
Copyright (c) 2009-2011 SASADA Koichi <ko1 at atdot.net>
Ruby処理系のファイル構成
3

最初に付いてくるもの
 バージョン管理システム(VCS)で管理

自動的に生成するもの
 自動的に生成するものは原則、VCS
で管理しない
関連
 パーサ関連
 VM関連
 configure
Copyright (c) 2009-2011 SASADA Koichi <ko1 at atdot.net>
Ruby処理系の作り方
4


configure; make all test install test-all TESTS=-v
ソースコード生成ツールを利用
 パーサ関連:
yacc(bison)、gperf
 VM関連:rubyを利用
Copyright (c) 2009-2011 SASADA Koichi <ko1 at atdot.net>
ディレクトリ構成
5

./



include/



自動生成で利用する定義ファイル、テンプレート
bcc32, cygwin, …


文字列エンコーディング(文字コード)関連
defs/, template/


一緒にインストールされるファイルが置いてある
1.9 から、インストールする *.h が制限 なぜか?
enc/


*.c, *.h: ソースコード本体(C言語)
*.def: VM の命令定義(オリジナル言語(C+α))
アーキテクチャ依存ファイル
missing/

OSなど環境によってあったりなかったりする関数の定義
Copyright (c) 2009-2011 SASADA Koichi <ko1 at atdot.net>
ディレクトリ構成
6

bin/, man/, lib/


ext/


インストールされる実行ファイル、man、ライブラリ
インストールされる標準添付ライブラリ(C)
sample/, doc/
サンプルスクリプトとドキュメント
 sample/test.rb: まつもとさん用の伝統的なテスト


test/, booststraptest/, benchmark/


テスト、基礎的なテスト(何が違うか?)、ベンチ
マーク
tool/

ビルドなどで利用するスクリプトなど
Copyright (c) 2009-2011 SASADA Koichi <ko1 at atdot.net>
ファイル構成
7

コア部分







組込クラス、メソッド部分





parse.y: 構文解析
YARV と言われてい
compile.c, iseq.c: コンパイラ
る
vm*.c: VM
部分はごく一部
gc.c: メモリ、オブジェクト管理(GC)
object.c: オブジェクト管理
…
string.c
array.c
time.c
…
ソースコード的には
この部分が一番多い
prelude.rb

実行時に読み込まれる初期化スクリプト(なぜ必要か?)
Copyright (c) 2009-2011 SASADA Koichi <ko1 at atdot.net>
おさらい:言語処理系の構成
8

字句解析

構文解析

意味解析

コンパイル

実行
最適化
Copyright (c) 2009-2011 SASADA Koichi <ko1 at atdot.net>
Rubyのコア部分
9
defs/keywords
parse.y
gperf
bison
lex.c (予約語判定)
parse.c
(字句&構文&構文解析)
node.h node.c (構文木)
compile.c (コンパイラ, 最適化
)
insns.def
defs/opt_operand.def
…
iseq.h iseq.c (YARV命令列)
vm_*.c (実行)
ruby
#include “vm.inc” …
Copyright (c) 2009-2011 SASADA Koichi <ko1 at atdot.net>
自動生成されるファイル
10

*.inc
insns.def などから Rubyスクリプトで生成したC言語
ソース
 VM関連定義ファイル
 どこかから #include して利用
 VM関連の操作は機械的に可能なものが多いため
 自動的に最適化するため


parse.c


parse.y から生成(bison)
prelude.c

prelude.rb から生成
Copyright (c) 2009-2011 SASADA Koichi <ko1 at atdot.net>