summaryrefslogtreecommitdiff
path: root/doc/extension.ja.rdoc
diff options
context:
space:
mode:
authorkazu <kazu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-02-20 12:20:22 +0000
committerkazu <kazu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-02-20 12:20:22 +0000
commit7010dc6f68e6c1f090cd7f1f5de83f3aa1d07657 (patch)
tree603efbdb80b8ac7fdee48863f5c3ff5f0214b9a3 /doc/extension.ja.rdoc
parent11eba07b836d369c7c2bee2ca9142ee4134c207e (diff)
extension.rdoc: add document title
* doc/extension.rdoc, doc/extension.ja.rdoc: [DOC] add title and adapt subheading levels. * doc/extension.rdoc: [DOC] fix subheading level of section about "Ruby Constants That Can Be Accessed From C". * doc/extension.ja.rdoc: [DOC] add missing subheading. [ruby-core:79590] [Bug #13229] Author: Marcus Stollsteimer <sto.mar@web.de> git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@57665 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'doc/extension.ja.rdoc')
-rw-r--r--doc/extension.ja.rdoc130
1 files changed, 67 insertions, 63 deletions
diff --git a/doc/extension.ja.rdoc b/doc/extension.ja.rdoc
index 5323bce36b..5ae96a96ae 100644
--- a/doc/extension.ja.rdoc
+++ b/doc/extension.ja.rdoc
@@ -1,8 +1,10 @@
# extension.ja.rdoc - -*- RDoc -*- created at: Mon Aug 7 16:45:54 JST 1995
+= Rubyの拡張ライブラリの作り方
+
Rubyの拡張ライブラリの作り方を説明します.
-= 基礎知識
+== 基礎知識
Cの変数には型があり,データには型がありません.ですから,た
とえばポインタをintの変数に代入すると,その値は整数として取
@@ -23,7 +25,7 @@ VALUEからCにとって意味のあるデータを取り出すためには
の両方が必要です.(1)を忘れると間違ったデータの変換が行われ
て,最悪プログラムがcore dumpします.
-== データタイプ
+=== データタイプ
Rubyにはユーザが使う可能性のある以下のタイプがあります.
@@ -57,7 +59,7 @@ T_SYMBOL :: シンボル
ほとんどのタイプはCの構造体で実装されています.
-== VALUEのデータタイプをチェックする
+=== VALUEのデータタイプをチェックする
ruby.hではTYPE()というマクロが定義されていて,VALUEのデータ
タイプを知ることが出来ます.TYPE()マクロは上で紹介したT_XXXX
@@ -94,7 +96,7 @@ FIXNUMとNILに関してはより高速な判別マクロが用意されてい
FIXNUM_P(obj)
NIL_P(obj)
-== VALUEをCのデータに変換する
+=== VALUEをCのデータに変換する
データタイプがT_NIL,T_FALSE,T_TRUEである時,データはそれぞ
れnil,false,trueです.このデータタイプのオブジェクトはひと
@@ -155,7 +157,7 @@ Rubyの構造体を直接アクセスする時に気をつけなければなら
ないことです.直接変更した場合,オブジェクトの内容の整合性が
とれなくなって,思わぬバグの原因になります.
-== CのデータをVALUEに変換する
+=== CのデータをVALUEに変換する
VALUEの実際の構造は
@@ -188,7 +190,7 @@ INT2NUM() :: 任意の整数からVALUEへ
INT2NUM()は整数がFIXNUMの範囲に収まらない場合,Bignumに変換
してくれます(が,少し遅い).
-== Rubyのデータを操作する
+=== Rubyのデータを操作する
先程も述べた通り,Rubyの構造体をアクセスする時に内容の更新を
行うことは勧められません.で,Rubyのデータを操作する時には
@@ -197,7 +199,7 @@ Rubyが用意している関数を用いてください.
ここではもっとも使われるであろう文字列と配列の生成/操作を行
う関数をあげます(全部ではないです).
-=== 文字列に対する関数
+==== 文字列に対する関数
rb_str_new(const char *ptr, long len) ::
@@ -295,7 +297,7 @@ rb_str_set_len(VALUE str, long len) ::
lenバイトまでの内容は保存される.lenはstrの容量を越えてい
てはならない.
-=== 配列に対する関数
+==== 配列に対する関数
rb_ary_new() ::
@@ -353,14 +355,14 @@ rb_ary_cat(VALUE ary, const VALUE *ptr, long len) ::
配列aryにptrからlen個のオブジェクトを追加する.
-= Rubyの機能を使う
+== Rubyの機能を使う
原理的にRubyで書けることはCでも書けます.RubyそのものがCで記
述されているんですから,当然といえば当然なんですけど.ここで
はRubyの拡張に使うことが多いだろうと予測される機能を中心に紹
介します.
-== Rubyに機能を追加する
+=== Rubyに機能を追加する
Rubyで提供されている関数を使えばRubyインタプリタに新しい機能
を追加することができます.Rubyでは以下の機能を追加する関数が
@@ -372,7 +374,7 @@ Rubyで提供されている関数を使えばRubyインタプリタに新しい
では順に紹介します.
-=== クラス/モジュール定義
+==== クラス/モジュール定義
クラスやモジュールを定義するためには,以下の関数を使います.
@@ -389,7 +391,7 @@ Rubyで提供されている関数を使えばRubyインタプリタに新しい
VALUE rb_define_class_under(VALUE outer, const char *name, VALUE super)
VALUE rb_define_module_under(VALUE outer, const char *name)
-=== メソッド/特異メソッド定義
+==== メソッド/特異メソッド定義
メソッドや特異メソッドを定義するには以下の関数を使います.
@@ -483,7 +485,7 @@ funcはクラスを引数として受け取って,新しく割り当てられ
VALUE rb_current_receiver(void)
-=== 定数定義
+==== 定数定義
拡張ライブラリが必要な定数はあらかじめ定義しておいた方が良い
でしょう.定数を定義する関数は二つあります.
@@ -494,7 +496,7 @@ funcはクラスを引数として受け取って,新しく割り当てられ
前者は特定のクラス/モジュールに属する定数を定義するもの,後
者はグローバルな定数を定義するものです.
-== Rubyの機能をCから呼び出す
+=== Rubyの機能をCから呼び出す
既に『1.5 Rubyのデータを操作する』で一部紹介したような関数を
使えば,Rubyの機能を実現している関数を直接呼び出すことが出来
@@ -505,7 +507,7 @@ funcはクラスを引数として受け取って,新しく割り当てられ
それ以外にもRubyの機能を呼び出す方法はいくつかあります.
-=== Rubyのプログラムをevalする
+==== Rubyのプログラムをevalする
CからRubyの機能を呼び出すもっとも簡単な方法として,文字列で
与えられたRubyのプログラムを評価する以下の関数があります.
@@ -523,7 +525,7 @@ CからRubyの機能を呼び出すもっとも簡単な方法として,文字
この関数はエラーが発生するとnilを返します.そして,成功時には
*stateはゼロに,さもなくば非ゼロになります.
-=== IDまたはシンボル
+==== IDまたはシンボル
Cから文字列を経由せずにRubyのメソッドを呼び出すこともできま
す.その前に,Rubyインタプリタ内でメソッドや変数名を指定する
@@ -566,7 +568,7 @@ Rubyから引数として与えられたシンボル(または文字列)をシ
これらの関数は,IDの代わりにシンボルを返すことを除けば上記の
関数と同じです.
-=== CからRubyのメソッドを呼び出す
+==== CからRubyのメソッドを呼び出す
Cから文字列を経由せずにRubyのメソッドを呼び出すためには以下
の関数を使います.
@@ -582,7 +584,7 @@ Cから文字列を経由せずにRubyのメソッドを呼び出すためには
applyには引数としてRubyの配列を与えます.
-=== 変数/定数を参照/更新する
+==== 変数/定数を参照/更新する
Cから関数を使って参照・更新できるのは,定数,インスタンス変
数です.大域変数は一部のものはCの大域変数としてアクセスでき
@@ -603,11 +605,11 @@ idはrb_intern()で得られるものを使ってください.
定数を新しく定義するためには『2.1.3 定数定義』で紹介さ
れている関数を使ってください.
-= RubyとCとの情報共有
+== RubyとCとの情報共有
C言語とRubyの間で情報を共有する方法について解説します.
-== Cから参照できるRubyの定数
+=== Cから参照できるRubyの定数
以下のRubyの定数はCのレベルから参照できます.
@@ -620,7 +622,7 @@ Qnil ::
C言語から見た「nil」.
-== CとRubyで共有される大域変数
+=== CとRubyで共有される大域変数
CとRubyで大域変数を使って情報を共有できます.共有できる大域
変数にはいくつかの種類があります.そのなかでもっとも良く使わ
@@ -672,7 +674,7 @@ getterとsetterの仕様は以下の通りです.
(*getter)(ID id);
(*setter)(VALUE val, ID id);
-== CのデータをRubyオブジェクトにする
+=== CのデータをRubyオブジェクトにする
Cの世界で定義されたデータ(構造体)をRubyのオブジェクトとして
取り扱いたい場合がありえます.このような場合はTypedData_XXX
@@ -685,7 +687,7 @@ Cの世界で定義されたデータ(構造体)をRubyのオブジェクトと
があります.
++
-=== 構造体からオブジェクトへ
+==== 構造体からオブジェクトへ
構造体へのポインタsvalをRubyオブジェクトに変換するには次のマ
クロを使います。
@@ -793,7 +795,7 @@ klass, data_typeはData_Wrap_Structと同じ働きをします.type
は割り当てるC構造体の型です.割り当てられた構造体は変数sval
に代入されます.この変数の型は (type*) である必要があります.
-=== オブジェクトから構造体へ
+==== オブジェクトから構造体へ
TypedData_Wrap_StructやTypedData_Make_Structで生成したオブジェ
クトから構造体へのポインタを復元するには以下のマクロを用いま
@@ -806,7 +808,9 @@ Cの構造体へのポインタは変数svalに代入されます.
これらのマクロの使い方はちょっと分かりにくいので,後で説明す
る例題を参照してください.
-== ディレクトリを作る
+== 例: dbmの拡張ライブラリの作成
+
+=== ディレクトリを作る
% mkdir ext/dbm
@@ -816,14 +820,14 @@ Ruby 1.1からは任意のディレクトリでダイナミックライブラリ
ライブラリ用のディレクトリを作る必要があります.名前は適当に
選んで構いません.
-== 設計する
+=== 設計する
まあ,当然なんですけど,どういう機能を実現するかどうかまず設
計する必要があります.どんなクラスをつくるか,そのクラスには
どんなメソッドがあるか,クラスが提供する定数などについて設計
します.
-== Cコードを書く
+=== Cコードを書く
拡張ライブラリ本体となるC言語のソースを書きます.C言語のソー
スがひとつの時には「ライブラリ名.c」を選ぶと良いでしょう.C
@@ -960,7 +964,7 @@ Cの大域変数は以下の関数を使ってRubyインタプリタに変数の
void rb_global_variable(VALUE *var)
-== extconf.rbを用意する
+=== extconf.rbを用意する
Makefileを作る場合の雛型になるextconf.rbというファイルを作り
ます.extconf.rbはライブラリのコンパイルに必要な条件のチェッ
@@ -991,7 +995,7 @@ Makefileを作る場合の雛型になるextconf.rbというファイルを作
パイルしない時にはcreate_makefileを呼ばなければMakefileは生
成されず,コンパイルも行われません.
-== dependを用意する
+=== dependを用意する
もし,ディレクトリにdependというファイルが存在すれば,
Makefileが依存関係をチェックしてくれます.
@@ -1000,7 +1004,7 @@ Makefileが依存関係をチェックしてくれます.
などで作ることが出来ます.あって損は無いでしょう.
-== Makefileを生成する
+=== Makefileを生成する
Makefileを実際に生成するためには
@@ -1022,7 +1026,7 @@ vendor_ruby ディレクトリにインストールする場合には
ディレクトリをext以下に用意した場合にはRuby全体のmakeの時に
自動的にMakefileが生成されますので,このステップは不要です.
-== makeする
+=== makeする
動的リンクライブラリを生成する場合にはその場でmakeしてくださ
い.必要であれば make install でインストールされます.
@@ -1040,26 +1044,26 @@ extconf.rbを書き換えるなどしてMakefileの再生成が必要な時は
を作り,そこに 拡張子 .rb のファイルを置いておけば同時にイン
ストールされます.
-== デバッグ
+=== デバッグ
まあ,デバッグしないと動かないでしょうね.ext/Setupにディレ
クトリ名を書くと静的にリンクするのでデバッガが使えるようにな
ります.その分コンパイルが遅くなりますけど.
-== できあがり
+=== できあがり
後はこっそり使うなり,広く公開するなり,売るなり,ご自由にお
使いください.Rubyの作者は拡張ライブラリに関して一切の権利を
主張しません.
-= Appendix A. Rubyのソースコードの分類
+== Appendix A. Rubyのソースコードの分類
Rubyのソースはいくつかに分類することが出来ます.このうちクラ
スライブラリの部分は基本的に拡張ライブラリと同じ作り方になっ
ています.これらのソースは今までの説明でほとんど理解できると
思います.
-== Ruby言語のコア
+=== Ruby言語のコア
class.c :: クラスとモジュール
error.c :: 例外クラスと例外機構
@@ -1068,14 +1072,14 @@ load.c :: ライブラリのロード
object.c :: オブジェクト
variable.c :: 変数と定数
-== Rubyの構文解析器
+=== Rubyの構文解析器
parse.y :: 字句解析器と構文定義
parse.c :: 自動生成
defs/keywords :: 予約語
lex.c :: 自動生成
-== Rubyの評価器 (通称YARV)
+=== Rubyの評価器 (通称YARV)
compile.c
eval.c
@@ -1101,7 +1105,7 @@ lex.c :: 自動生成
-> opt*.inc : 自動生成
-> vm.inc : 自動生成
-== 正規表現エンジン (鬼車)
+=== 正規表現エンジン (鬼車)
regex.c
regcomp.c
@@ -1111,7 +1115,7 @@ lex.c :: 自動生成
regparse.c
regsyntax.c
-== ユーティリティ関数
+=== ユーティリティ関数
debug.c :: Cデバッガ用のデバッグシンボル
dln.c :: 動的ローディング
@@ -1119,7 +1123,7 @@ st.c :: 汎用ハッシュ表
strftime.c :: 時刻整形
util.c :: その他のユーティリティ
-== Rubyコマンドの実装
+=== Rubyコマンドの実装
dmyext.c
dmydln.c
@@ -1133,7 +1137,7 @@ util.c :: その他のユーティリティ
gem_prelude.rb
prelude.rb
-== クラスライブラリ
+=== クラスライブラリ
array.c :: Array
bignum.c :: Bignum
@@ -1165,24 +1169,24 @@ time.c :: Time
defs/known_errors.def :: 例外クラス Errno::*
-> known_errors.inc :: 自動生成
-== 多言語化
+=== 多言語化
encoding.c :: Encoding
transcode.c :: Encoding::Converter
enc/*.c :: エンコーディングクラス群
enc/trans/* :: コードポイント対応表
-== gorubyコマンドの実装
+=== gorubyコマンドの実装
goruby.c
golf_prelude.rb : goruby固有のライブラリ
-> golf_prelude.c : 自動生成
-= Appendix B. 拡張用関数リファレンス
+== Appendix B. 拡張用関数リファレンス
C言語からRubyの機能を利用するAPIは以下の通りである.
-== 型
+=== 型
VALUE ::
@@ -1191,7 +1195,7 @@ VALUE ::
体である.VALUE型をこれらにキャストするためにRで始まる構造体
名を全て大文字にした名前のマクロが用意されている.
-== 変数・定数
+=== 変数・定数
Qnil ::
@@ -1205,7 +1209,7 @@ Qfalse ::
定数: falseオブジェクト
-== Cデータのカプセル化
+=== Cデータのカプセル化
Data_Wrap_Struct(VALUE klass, void (*mark)(), void (*free)(), void *sval) ::
@@ -1224,7 +1228,7 @@ Data_Get_Struct(data, type, sval) ::
dataからtype型のポインタを取り出し変数svalに代入するマクロ.
-== 型チェック
+=== 型チェック
RB_TYPE_P(value, type)
TYPE(value)
@@ -1235,7 +1239,7 @@ Data_Get_Struct(data, type, sval) ::
void Check_Type(VALUE value, int type)
SafeStringValue(value)
-== 型変換
+=== 型変換
FIX2INT(value), INT2FIX(i)
FIX2LONG(value), LONG2FIX(l)
@@ -1258,7 +1262,7 @@ Data_Get_Struct(data, type, sval) ::
StringValueCStr(value)
rb_str_new2(s)
-== クラス/モジュール定義
+=== クラス/モジュール定義
VALUE rb_define_class(const char *name, VALUE super) ::
@@ -1286,7 +1290,7 @@ void rb_extend_object(VALUE object, VALUE module) ::
オブジェクトをモジュール(で定義されているメソッド)で拡張する.
-== 大域変数定義
+=== 大域変数定義
void rb_define_variable(const char *name, VALUE *var) ::
@@ -1318,7 +1322,7 @@ void rb_global_variable(VALUE *var) ::
GCのため,Rubyプログラムからはアクセスされないが, Rubyオブ
ジェクトを含む大域変数をマークする.
-== 定数
+=== 定数
void rb_define_const(VALUE klass, const char *name, VALUE val) ::
@@ -1332,7 +1336,7 @@ void rb_define_global_const(const char *name, VALUE val) ::
と同じ意味.
-== メソッド定義
+=== メソッド定義
rb_define_method(VALUE klass, const char *name, VALUE (*func)(ANYARGS), int argc) ::
@@ -1421,7 +1425,7 @@ VALUE rb_extract_keywords(VALUE *original_hash) ::
先には,元のHashがSymbol以外のキーを含んでいた場合はそれらが
コピーされた別の新しいHash,そうでなければ0が保存されます.
-== Rubyメソッド呼び出し
+=== Rubyメソッド呼び出し
VALUE rb_funcall(VALUE recv, ID mid, int narg, ...) ::
@@ -1461,7 +1465,7 @@ int rb_respond_to(VALUE obj, ID id) ::
objがidで示されるメソッドを持つかどうかを返す.
-== インスタンス変数
+=== インスタンス変数
VALUE rb_iv_get(VALUE obj, const char *name) ::
@@ -1474,7 +1478,7 @@ VALUE rb_iv_set(VALUE obj, const char *name, VALUE val) ::
objのインスタンス変数をvalにセットする.
-== 制御構造
+=== 制御構造
VALUE rb_block_call(VALUE obj, ID mid, int argc, VALUE * argv, VALUE (*func) (ANYARGS), VALUE data2) ::
@@ -1536,7 +1540,7 @@ void rb_iter_break_value(VALUE value) ::
現在の最も内側のブロックをvalueで終了する.ブロックは引数で
与えられたvalueを返す.この関数は直接の呼び出し元に戻らない.
-== 例外・エラー
+=== 例外・エラー
void rb_warning(const char *fmt, ...) ::
@@ -1568,7 +1572,7 @@ void rb_bug(const char *fmt, ...) ::
きはObject#inspect)を使ったVALUEの出力に利用できる.これは
"%i"と衝突するため,整数には"%d"を使用すること.
-== Rubyの初期化・実行
+=== Rubyの初期化・実行
Rubyをアプリケーションに埋め込む場合には以下のインタフェース
を使う.通常の拡張ライブラリには必要ない.
@@ -1592,7 +1596,7 @@ void ruby_script(char *name) ::
Rubyのスクリプト名($0)を設定する.
-== インタプリタのイベントのフック
+=== インタプリタのイベントのフック
void rb_add_event_hook(rb_event_hook_func_t func, rb_event_flag_t events, VALUE data) ::
@@ -1622,7 +1626,7 @@ int rb_remove_event_hook(rb_event_hook_func_t func) ::
指定されたフック関数を削除します.
-== メモリ使用量
+=== メモリ使用量
void rb_gc_adjust_memory_usage(ssize_t diff) ::
@@ -1634,7 +1638,7 @@ void rb_gc_adjust_memory_usage(ssize_t diff) ::
す.メモリブロックが解放されたり,メモリブロックがより小さいサイズで再
確保されたりした場合などです.この関数はGCを引き起こすかもしれません.
-== 互換性のためのマクロ
+=== 互換性のためのマクロ
APIの互換性をチェックするために以下のマクロがデフォルトで定義されています.
@@ -1676,7 +1680,7 @@ RB_EVENT_HOOKS_HAVE_CALLBACK_DATA ::
rb_add_event_hook() がフック関数に渡す data を第3引数として
受け取ることを意味する.
-= Appendix C. extconf.rbで使える関数たち
+== Appendix C. extconf.rbで使える関数たち
extconf.rbの中では利用可能なコンパイル条件チェックの関数は以
下の通りである.
@@ -1802,7 +1806,7 @@ pkg_config(pkg, option=nil) ::
optionが指定された場合は,上記の配列の代わりにそのオプションを
指定して得られた出力をstripしたものを返す.
-= Appendix D. 世代別GC
+== Appendix D. 世代別GC
Ruby 2.1から世代別GCに対応しました.我々はこれをRGenGCと呼んでいます.
RGenGCは,過去の拡張ライブラリに(ほぼ)互換性を保つように開発されている