2007-10-01から1ヶ月間の記事一覧

初心者向けの

先日、プログラミング未習熟な人に「初心者向けのプログラミング言語って何か良いのありますか?」と聞かれた。「とりあえずjavaで」と答えておいたが、実際のところどうだろう。java,ruby,python,javascriptで考えてみた(perl,phpはパス)。 入門者(とりあえ…

排他

循環検出中にポインタを上げ下げしたいのだが、循環検出中にポインタを上げ下げするのを防ぎたい。これを両立するのは無理なので折衷案を考えてみた。 循環検出を開始する。 ポインタを上げ下げしようとする。 上げ下げイベントを待機キューに送る。 循環検…

ロック

ポインタaの参照上げ下げと循環検出は排他する? の項。循環検出の際にポインタ先のオブジェクトを削除する必要がある。その際の参照下げで引っかかってしまった。 しかし、循環参照の中から呼ばれている場合と外から呼ばれている場合とを区別するのは難しい…

マルチスレッド

超スマートポインタをマルチスレッド対応にしようと思い立った。あまりマルチスレッドの経験はないのだけど、オブジェクトの所有権が曖昧になるというのは特にマルチスレッドに多いことなので必要だろうということだ。 マルチスレッド対応とはつまり、クリテ…

継承

常々思うのだが、継承はなくても構わないような気がする。もちろん、ここで言う継承は実装の継承のことだ。インターフェースのような仕様の継承は静的型宣言OOPLでは必須だろう。 何故、継承が不要か。単純に言えば委譲の方がもっと肌理細かく実装を分割出来…

autotools

普段使いには手書きのMakefileも良いのだが、配布するのにはちょっと良くない。BSDやSolarisの場合を考慮して、と言ってもそんな環境を持っていないし。 で、autotoolsに頼ることにした。幾つかの設定ファイルを書いておけば環境に合わせてMakefileを作って…

超スマートポインタ

超ス(略が完成した。現在はコードの整理を行っているところ。publicなメンバ関数を選別して減らしたり、DEBUG用の出力を消したり、……、それから簡単なものでもドキュメントを用意しないとならないな。

自殺

C++ではオブジェクトの自殺が認められている。具体的には class Class { public: static Class* create() { return new Class(); } private: Class() { } ~Class() { } Class(const Class& other) { } Class& operator=(const Class& other) { return *this;…

型について考え直す。単純に型と言っても色々奥が深い。実装に依存した部分もあるし、概念のみの部分もあるし。とりあえず、型と言って思い付くだけでも 変数の型 型無し 宣言有り 宣言無し(型推論) データの型 型無し 宣言有り (宣言無し(は今のところ無さ…

クラスと型

ついでに思ったがjavaで既に実装された抽象クラスに対してインターフェースだけ借りたいときがある。一つの抽象クラスからインターフェースを借りるには(実装が汚いのを我慢しつつ)継承すれば良いが、二つの抽象クラスからインターフェースを借りるのは無理…

template

超スマートポインタのタグを[言語]にしたのは失敗だったかな。実装レベルの話まで[言語]タグにするのは変だもの。とりあえず、超スマートポインタの話は[言語]のまま進めて、派生した実装の話は[C++]タグにすることにした。 で、templateの話だ。 template<typename T> c</typename>…

超(略

一つ設計のアイディアが沸いた。 明示的に参照カウントを上げ下げする偽ポインタを作る。 偽ポインタの操作を自動化するスマートポインタを作る。 という二段構えではどうか。 スマートポインタのサイズが1ワードで済むのも利点。ステップが多いので速度が心…

で。

言語について。極論すればプログラムはデータとそれに対する操作の集まりである。機械語がそうなっているのだからそうなのだ。ただし、操作の手順もデータとして記録されている。 最初は機械がデータを実行するだけだった。 プログラム上のデータや操作に可…

比較

そういえば特に断っていなかったが、この日記で「言語」と言えば「プログラミング言語」のことだ。日本語や英語は「自然言語」と呼ぶ。さて。言語の比較というと論点は速度と書きやすさに集約されがちだ。 速度は言語仕様によって制限されているものの、実装…

あとで読む

http://www.is.s.u-tokyo.ac.jp/vu/jugyo/processor/process/soft/compilerresume/index.html

超スマートポインタの概要

言語はC++ kilrey::smart_ptrという名前を付けた。 参照カウント+循環検出。ゆえにweak_ptrが不要。 今のところ、delete順は不定。 今のところ、循環検出は明示的に起動。標準ではroot_setが溜ったら循環検出するようにする予定。 今のところ、速度は測って…

boost::shared_ptrのdelete

昨日、boost::shared_ptrの実装を調べてみた。何に注目していたのかというと、boost::shared_ptrではデストラクタを自動的に選んでくれる点。boost::shared_ptrであっても中に入れたクラスのdeleteを呼んでくれるというのが不思議だった。 答え:初期化時に…

Lightweight Language AHP

やってみた。 http://dame.dyndns.org/misc/llahp/?q=COnkfMGjc5sYn_S&n=kilrey pythonの圧勝だった。rubyは二位。 確かにpythonは好きですしよく使っているけど、むしろrubyの方がさらによく使っている。書き捨てのスクリプトだと速く書けるrubyを使うのだ…

超スマートポインタ

超スマートポインタの仮実装が完成した。 とは言ってもhttp://www.research.ibm.com/people/d/dfb/papers/Bacon01Concurrent.pdfにある循環検出をべたに実装して、普通のスマートポインタと組み合わせただけなのだけれど。 今のところroot_setにあるかどうか…

超スマートポインタ

メンバの型とオフセットを記録する方式はあまり効率が良くないかもしれない。特にコンパイル時にデストラクタが確定しにくいような。グレイリスト登録と復帰は超スマートポインタをメンバに持つクラスがそれぞれ実装するというのはどうだろう。 class Base {…

超スマートポインタ

http://d.hatena.ne.jp/kilrey/20071010#p2の続き。 自動的にメンバとして含まれる超スマートポインタを検出するのは難しい。それならば手動で登録してしまえば良いのではないか。要するにboost::serializationの様に手軽に登録できれば良いのだ。 まずmap>>…

Boehm GC c++

Boehm GCをc++から使っていて気付いたことがある。globalなnewとdeleteの位置が違うのだ(gc-7.0.tar.gz)。 gc_cpp.ccでは void* operator new( size_t size ) { return GC_MALLOC_UNCOLLECTABLE( size );} void operator delete( void* obj ) { GC_FREE( obj…

shared_ptr

で、boostのshared_ptrなのだが。循環参照を解決できる超スマートなポインタは作れないのだろうか。まあ、簡単に作れたらboostに入っているだろうけども。 RTTIを駆使する場合を考える。例えば、 #include <iostream> class Base { public: virtual ~Base() {} } class</iostream>…

Boehm GC

今だに読み方が判らない。ぼえーむ?ささださんによると「べーむ」らしい。 私も使っているGarbage Collectionのライブラリ。様々なアーキテクチャに移植されているので汎用性が高く、GCJやGaucheなどの言語実装に採用されている。基本的にはCで書かれていて…

アルゴリズムとデータ構造

世の中のアルゴリズムにはそれに適したデータ構造がある。ものによってはデータ構造を構成すること自体がそのアルゴリズムの主要素だったりもする。そう考えるとデータ構造とその操作を一体化するのは自然だ。クラスというものはそのような経緯で生まれたの…