C言語でオブジェクト指向
C言語でオブジェクト指向っぽくプログラミングする為の方法論とかライブラリとかは既にいろいろありますが、効率とか実装の綺麗さとかを無視してとことんやったらどこまでできるかとふと思い、書き始めました。型の解決などは当然実行時にします。
C++やRubyの実装を真剣に勉強する気力はないのでかなり我流で。
現在までの成果は多態。GCは未実装(というか考え中)なのでメモリリークしてます。
http://mad-projects.iobb.net/svn/cros/
#include "numeric.h" #include "string.h" #include "nil.h" int main() { P(nil); P(FixnumNew(100)); P(StringNew("Hello")); P(StringNew2("100 = %d", 100)); return 0; }
出力
nil 100 Hello 100 = 100
これからエラー処理とか型チェックとか例外処理とか継承とか実装していこうと思いますが、一番問題なのがガベージコレクション。
基本的にはBoehmみたいにすればいいのだと思うけれど、違うやり方は無いかと思い考え中。
スコープの切り替わりの瞬間を何とか補足する方法はないかと考えていますが、コンパイラに頼らずにやるのは難しそうな気がしてます。スタックポインタなどを定期的に読むとかではどうだろう...??
[追記] リストも実装してみた
#include "numeric.h" #include "string.h" #include "nil.h" #include "list.h" int main() { Object list = ListNew(); ListAppend(&list, FixnumNew(100)); ListAppend(&list, FixnumNew(500)); ListAppend(&list, StringNew("Hello")); ListAppend(&list, FixnumNew(1000)); Puts(list); return 0; }
出力
100500Hello1000
List.ToSの実装とかめちゃくちゃ非効率だけれど見た目はだいぶオブジェクト指向っぽくなってきた。そろそろGCをやってみよう。