バリケンのRuby日記 RSSフィード

2007-11-15

[][]「Rubyソースコード完全解説」を読む(4) 「Rubyソースコード完全解説」を読む(4) - バリケンのRuby日記 を含むブックマーク はてなブックマーク - 「Rubyソースコード完全解説」を読む(4) - バリケンのRuby日記 「Rubyソースコード完全解説」を読む(4) - バリケンのRuby日記 のブックマークコメント

今日も「Rubyソースコード完全解説」を読んでいくよ。今日は「序章 導入」の「ビルド」の節を読んだよ。

じゃあ、この節に書かれているとおりにRubyをコンパイルしてみよう!この節ではUNIX系OSWindowsでのビルドについて書かれているけど、Windowsでのビルドは大変そうだったから、ぼくはラクしてDebian GNU/Linux Etch(UNIX系OS)でやってみることにするよ。

まずはwgetコマンドでファイルを入手して、tarコマンドで展開して展開ディレクトリに移動するよ。

$ wget http://i.loveruby.net/ja/rhg/ar/ruby-rhg.tar.gz
$ tar xzf ruby-rhg.tar.gz
$ cd ruby-rhg

あとはconfigure、makemake installすればいいみたいだけど、すでにこのマシンにはRubyをインストールしちゃっているから、makeまでにしてみようと思うよ。

$ ./configure
checking build system type... i686-pc-linux
checking host system type... i686-pc-linux
checking target system type... i686-pc-linux
checking for gcc... gcc
checking for C compiler default output... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking how to run the C preprocessor... gcc -E
checking whether gcc needs -traditional... no
checking for bison... no
checking for byacc... no
checking for ranlib... ranlib
checking for ar... ar
(中略)
checking whether char is unsigned... no
checking for inline... inline
checking whether right shift preserve sign bit... yes
checking read count field in FILE structures... not found(OK if using GNU libc)
checking read buffer ptr field in FILE structures... _IO_read_ptr
checking read buffer end field in FILE structures... _IO_read_end
checking whether ELF binaries are produced... yes
checking whether OS depend dynamic link works... yes
creating config.h
configure: creating ./config.status
config.status: creating Makefile
$

Makefileができたから、makeしてみるよ。

% make
gcc -g -O2 -I. -I. -c array.c
gcc -g -O2 -I. -I. -c bignum.c
gcc -g -O2 -I. -I. -c class.c
gcc -g -O2 -I. -I. -c compar.c
gcc -g -O2 -I. -I. -c dir.c
dir.c: In function ‘fnmatch’:
dir.c:204: warning: passing argument 1 of ‘range’ discards qualifiers from pointer target type
gcc -g -O2 -I. -I. -c dln.c
dln.c: In function ‘dln_load’:
dln.c:1300: warning: passing argument 2 of ‘init_funcname_len’ discards qualifiers from pointer target type
gcc -g -O2 -I. -I. -c enum.c
gcc -g -O2 -I. -I. -c error.c
gcc -g -O2 -I. -I. -c eval.c
gcc -g -O2 -I. -I. -c file.c
gcc -g -O2 -I. -I. -c gc.c
gcc -g -O2 -I. -I. -c hash.c
hash.c: In function ‘ruby_setenv’:
hash.c:1121: warning: passing argument 1 of ‘envix’ discards qualifiers from pointer target type
gcc -g -O2 -I. -I. -c inits.c
gcc -g -O2 -I. -I. -c io.c
gcc -g -O2 -I. -I. -c marshal.c
gcc -g -O2 -I. -I. -c math.c
gcc -g -O2 -I. -I. -c numeric.c
gcc -g -O2 -I. -I. -c object.c
gcc -g -O2 -I. -I. -c pack.c
yacc parse.y
make: yacc: コマンドが見つかりませんでした
make: *** [parse.c] エラー 127
%

あれー?yaccコマンドがない、って言われちゃった。色々と調べてみたら、yaccコマンドはbisonかbyaccのどちらかをインストールすればいいみたい。というわけで、bisonをインストールしてみたよ。

# aptitude install bison
Reading package lists... Done
Building dependency tree... Done
Reading extended state information
Initializing package states... Done
Writing extended state information... Done
Building tag database... Done
The following NEW packages will be automatically installed:
  m4
The following NEW packages will be installed:
  bison m4
0 packages upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 599kB of archives. After unpacking 1872kB will be used.
Do you want to continue? [Y/n/?]
Writing extended state information... Done
Get:1 http://www.t.ring.gr.jp etch/main m4 1.4.8-2 [178kB]
Get:2 http://www.t.ring.gr.jp etch/main bison 1:2.3.dfsg-4 [421kB]
Fetched 599kB in 2s (215kB/s)
Selecting previously deselected package m4.
(Reading database ... 25252 files and directories currently installed.)
Unpacking m4 (from .../archives/m4_1.4.8-2_i386.deb) ...
Selecting previously deselected package bison.
Unpacking bison (from .../bison_1%3a2.3.dfsg-4_i386.deb) ...
Setting up m4 (1.4.8-2) ...

Setting up bison (2.3.dfsg-4) ...

#

今度は大丈夫かな?

$ make
(中略)
gcc -g -O2 -rdynamic   main.o  libruby.a -ldl -lcrypt -lm   -o ruby
libruby.a(error.o): In function `set_syserr':
/home/your_home/ruby-rhg/error.c:550: warning: `sys_nerr' is deprecated; use `strerror' or `strerror_r' instead
make[1]: ディレクトリ `/home/your_home/ruby-rhg' から出ます
$

今度はうまく行ったよ!試しにruby -vでバージョンを見てみよう!

% ./ruby -v
ruby 1.7.3 (2002-09-11) [i686-linux]
%

きちんとコンパイルできたみたい。でも、日付が「同時多発テロのちょうど一年後」なのが、意味深だねえ。

トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20071115

2007-11-12

[][]「Rubyソースコード完全解説」を読む(3) 「Rubyソースコード完全解説」を読む(3) - バリケンのRuby日記 を含むブックマーク はてなブックマーク - 「Rubyソースコード完全解説」を読む(3) - バリケンのRuby日記 「Rubyソースコード完全解説」を読む(3) - バリケンのRuby日記 のブックマークコメント

今日も「Rubyソースコード完全解説」を読んでいくよ。今日は「序章 導入」の「ソースコードを読む技術」の節を読んだよ。また今日も気になったところをメモするよ。

目的を明確にする

「どうやってソースコードを読むのか」の前に、「なぜソースコードを読むのか?」を明らかにしたほうがいいみたいだよ。でも「それが僕には楽しかったから」とか「そこに山があるから」みたいな目的でも、ぼくはいいと思うけど、どうかな?

解析の手法

ソースコードを解析する方法としては、おもに「動的な解析(動かしながら読む)」と、「静的な解析(ひたすら読む)」があるよ。

動的に解析する

  • まずはとにかく動かしてみる(使ってみる)
  • print文を入れてみたり、一部を書き換えてどう挙動が変わるかを確認する
  • ツールを使って動作を追いかけてみる(デバッガを使う、トレーサを使う)

静的に解析する

  • ファイル名・関数名・変数名・型名・メンバ名などの「名前」を読む
  • 付属のドキュメントを読む
  • ディレクトリ構造を眺める
  • ファイル内の関数構成を読む
  • 略語を調べておく
  • リスト構造やスタック、構造体などの、ソースコード内で使われているデータ構造を調べる
  • 関数同士の呼び出し関係を把握する
  • 関数の中身を読む
  • 読みやすいように自分なりに書き換えてみる
  • 上記をサポートするツールを使う(ファイルに含まれる関数名をリストアップする、関数名や変数名からソースコード中の位置を探す、関数がどこから呼び出されているかを調べる)
    • おすすめはglobalというツール

歴史を知る

トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20071112

2007-11-11

[][]「Rubyソースコード完全解説」を読む(2) 「Rubyソースコード完全解説」を読む(2) - バリケンのRuby日記 を含むブックマーク はてなブックマーク - 「Rubyソースコード完全解説」を読む(2) - バリケンのRuby日記 「Rubyソースコード完全解説」を読む(2) - バリケンのRuby日記 のブックマークコメント

今日も「Rubyソースコード完全解説」を読んでいくよ。今日は「序章 導入」の最初から、「ソースコードを読む技術」の節の手前まで読んだよ。今日もまた気になったところをメモとしてまとめてみたよ。

Rubyruby

  • Rubyは、まつもとゆきひろさんが個人で作っているプログラミング言語だよ。
  • ruby(注:小文字で「ruby」と書くと、「C言語のRuby実装」のことを指すよ)のソースコードは、(ライセンスを守れば)自由に再配布したり、改変したり、改変したソースコードを再配布したりできるよ。
  • Rubyには仕様がないよ。
    • しいて言えば、「まつもとゆきひろさんがC言語で実装したRubyのソースコード(つまり小文字のruby)」が仕様、かな?

Rubyは保守的

  • Rubyは、他のいろんな言語で実績がある機能ばかりを選んで実装しているから、「他の言語にない新しい機能」はあんまりないみたい
  • 「(当時は多かった)C言語やPerlをすでに知っている人」が移行しやすいように、C言語やPerlにあるような関数はRubyでもたいてい同じ名前で使えるようになっているよ
  • スピードと移植性のトレードオフがあるようなときは、移植性のほうを重視しているみたいだよ

Rubyは「オブジェクト指向スクリプト言語」

  • Rubyはオブジェクト指向言語だよ
  • Rubyはスクリプト言語だよ
    • と言っても「何がスクリプト言語か」っていう定義はないみたいだよ
  • ruby(C言語のRuby実装)はRubyインタプリタとして動くよ
    • つまりRubyのプログラムを書いたら、rubyですぐに実行できる(コンパイルしなくていい)みたいだよ。

移植性が高い

  • さっきも出てきたけど、ruby(C言語のRuby実装)は移植性が高いから、いろんな環境で動くみたいだよ。

自動メモリ管理機能

  • ガーベージコレクション(GC)という「自動メモリ管理機能」があるよ

変数に型がない

  • Rubyの変数には型がないよ。
  • だから、宣言なしにどんなオブジェクトも代入できるよ。

ほとんどの文法要素が「式」

  • ほとんどの文法要素が「式」だから、戻り値があるよ
    • 余談だけど、戻り値がない文は「式」と区別して「文」と言うんだって

ブロック

  • Rubyには「ブロック」というものがあるよ。
    • 昔は「ブロック」のことを「イテレータ」と呼んでいたけど、繰り返し以外の用途にも使えるから最近では「ブロック」と呼ぶみたい
    • 「ブロック」の他の呼び方としては「イテレータ」以外にも「クロージャ」とか「無名関数」とか言ったりもするから、混乱しないようにね

C言語で書かれている

  • rubyはC言語で書かれているよ
    • 余談だけど、最近では「ruby以外のRubyの実装」がいくつか出てきているみたいだよ
    • たとえばJRubyはJavaで実装されているんだって
  • 標準規格の「ANSI C」ではなくて、「K&Rスタイル」という昔のC言語の書き方で書かれているみたいだよ
  • ruby本体だけじゃなくて、拡張ライブラリもC言語で書くことができるよ。
    • C言語で拡張ライブラリを書けば、Rubyで書いた拡張ライブラリよりも高速に動作するよ
    • 書き方は似ているから、Rubyで書かれたライブラリの高速で動作させたい部分だけをC言語で書き直したりとかもできるよ

スレッド

  • Rubyには、スレッドがあるよ
  • ruby(C言語のRuby実装)では、「独自のユーザレベルスレッド」としてスレッドを実現しているよ。
    • 「独自のユーザレベルスレッド」は移植性は高いけど、速度はとても遅いみたい
トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20071111

2007-11-09

[][]「Rubyソースコード完全解説」を読む(1) 「Rubyソースコード完全解説」を読む(1) - バリケンのRuby日記 を含むブックマーク はてなブックマーク - 「Rubyソースコード完全解説」を読む(1) - バリケンのRuby日記 「Rubyソースコード完全解説」を読む(1) - バリケンのRuby日記 のブックマークコメント

ようやくC言語も読めるようになってきたから、いよいよ「Rubyソースコード完全解説」を読んでみようと思うよ。

とりあえず「はじめに」を読んでみたよ。以下、簡単なメモだよ。

Rubyソースコード完全解説」を読むメリット

  • rubyの構造がわかるよ(注:小文字で「ruby」と書くと、「C言語のRuby実装」のことを指すよ)
  • 「言語処理系一般についての知識」が身に付くよ
  • 「ソースコードを読む技術」が身に付くよ

この本の内容は

  • 難しいよ
  • でもきっと面白いよ

読む上での前提

  • C言語についてのそれなりの知識が必要だよ
  • なんらかのオブジェクト指向言語の利用経験(Rubyに限らない、もちろんRubyでもOK)が必要だよ

おおまかな構成

  • 第1部は、オブジェクトについての説明だよ
  • 第2部は、構文解析についての説明だよ
  • 第3部は、評価についての説明だよ
  • 第4部は、評価器の周辺についての説明だよ

対象とするソースコード

  • ruby 1.7.3 2002-09-12版を対象とするよ
    • こちらからダウンロードできるみたいだよ。
トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20071109