Today アクセスカウンター Yesterday アクセスカウンター

ホワット・ア・ワンダフル・ワールド

私は知識に何ものかを付け加え,また他の人々がより多くのものを付け加える手助けをした --- G.H.ハーディ

全記事一覧 << 2008/07 12345678910111213141516171819202122232425262728293031 2008/09 >>

プロフィール

あろは (alohakun)

  • Author:あろは (alohakun)
  • 若槻俊宏 (WAKATSUKI toshihiro)

    連絡先 : alohakun ___at___ gmail.com
    mixi : http://mixi.jp/show_friend.pl?id=182927
    twitter : http://twitter.com/alohakun

    abstract

    プログラミングという人間の知的行為を体系化し,単なる職人芸ではなく,サイエンスにするための研究をしています.

    具体的には,等価変換計算モデルに基づいた,仕様記述からのプログラム合成の研究をしています.

    もっと噛み砕くと,プログラムの正しさをどのように定式化し,どのような枠組みで,どのように変換を進めていけば,正しさを保証したまま,効率的なプログラムを手に入れることができるのか,ということについて研究しています.

    キーワード : equivalent transformation, computation model, programming paradigm, formal specification, program synthesis













    あわせて読みたい


    この日記のはてなブックマーク数


    スカウター : ホワット・ア・ワンダフル・ワールド


    Map









    FC2 BLOG RANKING

FC2カウンター

ブロとも申請フォーム

この人とブロともになる

ホーム

C++ は勝手にポインタの値が変わる素敵言語です

2008/01/27(日) 02:05:07

2008-01-24 ■[C/C++]もしかしてCの奴らは代入やキャストでポインタのアドレスが変わらないとか思っているのか?

正直日記 2008/01/26 _ もしかしなくても、そう思ってる俺です

へー。多分vtblの絡みなんだろうけど、しかし何故 b だけ違うアドレスになる
んだろう。むしろ、 a と c のポインタが同一であることに注目するのかしら。


まんまここの説明ですね (たまたまネット彷徨ってたら前橋さんのブログに書いてあったのでメモ.これがシンクロニシティってやつですかね)

プログラミング言語を作る日記 2008-01-21 ■[Diksam]Diksamのポリモルフィズム

ただし、この方法は単一継承であればこそうまくいくのであって、多重継承ではメソッドの添字が一意に決まらないためうまくいきません。そこで、C++では、アップキャストの際にこっそりポインタの値を変えるという豪快な解決法を取っています。たとえばAとBを継承したクラスCがあるとき、AとCは「メインの継承関係」として単一継承の際と同じ方法が取れますが、CがBにアップキャストされた際には、ポインタ自体を、Bのvtableがあるアドレスに変換します。
C++/Boost template neta programmingTB:0CM:2 このエントリーを含むはてなブックマーク | livedoorクリップ livedoorクリップ BuzzurlにブックマークBuzzurlにブックマーク newsing it!

boost/wave は素晴らしいような気がした

2007/08/04(土) 19:31:45

C/C++ 関係のツールを自作する際,cpp が頭痛の種になるケースはけっこう多いと思います.

http://d.hatena.ne.jp/shinichiro_h/20070521#1179728233

koguro koguro 『> 実行時に GCC 呼んだり Scheme でパースしたりするのはこうなんかイクないと思ったとか思わなかったとか
ひー、すみません、すみません、2度とこんなことやりません!! (>_<) (って、直すつもりはないですけど)。まあ、個人的にはlibcppもなんかお近づきになりたくないライブラリという感じなので、mcpp (http://sourceforge.net/projects/mcpp/)を使うのがきれいかなと思ったりしています(さすがにプリプロセッサは作れないので)。』

koguro koguro 『”/usr/lib/gcc/.../include”のディレクトリは、gcc -print-search-dirs の結果を使えば得られるかと思います。あと、最近Ubuntuの新しいのを入れて気付いたのですが int16_t みたいな型は__attribute__を使って定義されているので、__atribute__は無視しないでがんばって解釈した方がよいかも(でも、c -wrapperでは手抜きしてあらかじめ int*_t 系の型は定義してしまうようにしてしまいました)。』

shinichiro_h shinichiro_h 『
libcpp なんか近付きたくない、は同意するところです。 mcpp はそういえば昔えらい標準準拠率高いんだと雑誌に書いてあるのを見た覚えがあります。プリプロセッサは頑張ればできないこともなさそうなやっぱり難しそうな、と微妙なところですね。 TCC 見るとできそうな気がしてくるのですがいざはじめると手が止まります。

-print-search-dirs の方はありがとうございます。あと、 __attribute__ の方はいざとなれば GCC 関係のマクロをオフにすると標準ヘッダに関しては拡張使わなくなるのかな、という理解だったのですが、なんか最近はそうでもないんですかね。ちょっと手元に環境無いのでしばらく確認が難しげです。』

Boost C++ labyrinth プログラミング 第2版を読んでいたら,wave なんていうライブラリがあることを知りました.

# しっかし,この本,面白そうなライブラリに限って 2 〜 3 ページしか解説が無かったりするんだよな… boost/python とか.signals とかも素敵過ぎる気がするんだけど.むう,この本を書いたのは誰だ ! 女将を呼べ ! (嘘です k.inaba さんごめんなさい)

これを使うと,C/C++ の文字列をプリプロセス (前処理) できるそうです.GCC とかの独自拡張にも対応しているらしい.とりあえず,インストール

# apt-get install libboost-wave-dev
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
以下の特別パッケージがインストールされます:
libboost-filesystem-dev
以下のパッケージが新たにインストールされます:
libboost-filesystem-dev libboost-wave-dev

k.inaba さんとこのサンプルコードを,うちの環境に合わせたもの.とりあえず C のヘッダだけ include できるように.


#include <iostream>
#include <fstream>
#include <string>
#include <boost/wave.hpp>
#include <boost/wave/cpplexer/cpp_lex_token.hpp>
#include <boost/wave/cpplexer/cpp_lex_iterator.hpp>
using namespace std;
using namespace boost::wave;

int main(int argc, const char* argv[]) {
try {
// ファイル argv[1] の内容を全部 text に読み込む
ifstream fin(argv[1]);
string text(istreambuf_iterator<char>(fin.rdbuf()),
istreambuf_iterator<char>());

// プリプロセッサを用意
typedef context<
string::iterator,
cpplexer::lex_iterator<
cpplexer::lex_token<>
>
> context_t;
context_t ctx(text.begin(), text.end(), argv[1]);

// オプションやマクロを設定
ctx.set_language(language_support(support_cpp | support_c99));
ctx.add_sysinclude_path("/usr/include");
ctx.add_sysinclude_path("/usr/lib/gcc/i486-linux-gnu/4.1.2/include");
// イテレータを取得して
context_t::iterator_type it = ctx.begin();
context_t::iterator_type end = ctx.end();

// トークンを順番に表示
for(; it!=end; ++it)
cout << it->get_position() << " :: " << it->get_value() << endl;
}

catch(cpp_exception& e) {
cerr << e.file_name() << "(" << e.line_no() << "):"
<< e.description() << endl;
}
}


コンパイル & 実行 (stdio.h をプリプロセス)

$ g++ wave.cpp -o wave -lboost_wave -lboost_filesystem
$ ./wave /usr/include/stdio.h
/usr/include/sys/cdefs.h(29) :: #line
/usr/include/sys/cdefs.h(29) ::
/usr/include/sys/cdefs.h(29) :: 30
/usr/include/sys/cdefs.h(29) ::
/usr/include/sys/cdefs.h(29) :: "/usr/include/stdio.h"
/usr/include/sys/cdefs.h(29) ::

/usr/include/sys/cdefs.h(89) :: extern
/usr/include/sys/cdefs.h(89) ::
/usr/include/sys/cdefs.h(89) :: "C"
/usr/include/sys/cdefs.h(89) ::
/usr/include/sys/cdefs.h(89) :: {
/usr/include/stdio.h(30) ::

/usr/lib/gcc/i486-linux-gnu/4.1.2/include/stddef.h(213) :: #line
/usr/lib/gcc/i486-linux-gnu/4.1.2/include/stddef.h(213) ::
/usr/lib/gcc/i486-linux-gnu/4.1.2/include/stddef.h(213) :: 214
/usr/lib/gcc/i486-linux-gnu/4.1.2/include/stddef.h(213) ::
/usr/lib/gcc/i486-linux-gnu/4.1.2/include/stddef.h(213) :: "/usr/lib/gcc/i486-linux-gnu/4.1.2/include/stddef.h"
/usr/lib/gcc/i486-linux-gnu/4.1.2/include/stddef.h(213) ::

/usr/lib/gcc/i486-linux-gnu/4.1.2/include/stddef.h(214) :: typedef
/usr/lib/gcc/i486-linux-gnu/4.1.2/include/stddef.h(214) ::
/usr/lib/gcc/i486-linux-gnu/4.1.2/include/stddef.h(211) :: long
/usr/lib/gcc/i486-linux-gnu/4.1.2/include/stddef.h(211) ::
/usr/lib/gcc/i486-linux-gnu/4.1.2/include/stddef.h(211) :: unsigned
/usr/lib/gcc/i486-linux-gnu/4.1.2/include/stddef.h(211) ::
/usr/lib/gcc/i486-linux-gnu/4.1.2/include/stddef.h(211) :: int
/usr/lib/gcc/i486-linux-gnu/4.1.2/include/stddef.h(214) ::
/usr/lib/gcc/i486-linux-gnu/4.1.2/include/stddef.h(214) :: size_t
/usr/lib/gcc/i486-linux-gnu/4.1.2/include/stddef.h(214) :: ;
/usr/lib/gcc/i486-linux-gnu/4.1.2/include/stddef.h(214) ::

/usr/include/bits/types.h(33) :: #line
/usr/include/bits/types.h(33) ::
/usr/include/bits/types.h(33) :: 34
/usr/include/bits/types.h(33) ::
/usr/include/bits/types.h(33) :: "/usr/include/bits/types.h"
/usr/include/bits/types.h(33) ::

...

せっかく boost/spirit でフルスクラッチされているのに,なんでテンプレートライブラリじゃないんだよー と最初は思ったのですが,上のサンプルコードを一回コンパイルしてみればすぐわかります.ライブラリ化されているにもかかわらず,かなりコンパイル時間が長い…

う〜ん,boost は,ドキュメント読んでる間は面白いんだけどねぇ.実際に使おうとすると,このコンパイル時間の長さは致命的なような.まぁ,速い PC 買えって話なんでしょうが.
C++/Boost template neta programmingTB:0CM:0 このエントリーを含むはてなブックマーク | livedoorクリップ livedoorクリップ BuzzurlにブックマークBuzzurlにブックマーク newsing it!

最近のコメント

リンク

このブログをリンクに追加する

最近のトラックバック

人生の残り日数

日本人男性の平均寿命は 28700日.

RSSフィード

カテゴリー