clu2cは64ビットosでも使えます (osc 2012 hiroshima lt用資料)
TRANSCRIPT
clu2cは64ビットOSでも使えます
CLU動態保存整備士 東平洋史
CLU関連の私の略歴を
1988年4月 東京工業大学第1類に入学
1989年4月 東京工業大学理学部情報科学科に配属
1990年4月 情報科学実験第二(木村泉先生担当)受講 →CLU、ncluと出会う
1991年4月 木村泉研究室に入る →clu2cの開発始まる
1991年9月末 卒業論文のテーマ決まる
1994年3月 東京工業大学大学院博士課程前期修了 →CLUから離れる
2009年11月頃 京都御所へ行くついでにKOFへ行くことにし、そういえばclu2cもオープンソースだよなあ、と思い出す。→これが活動開始のきっかけ。
CLU(くるう)とは何ですか?
プログラミング言語 • MITのBarbara Liskov考案(1974) ← 結構、古い • 強い型付
• コンパイル時に全てのオブジェクトの型が決まる • でも、任意の場所で変数宣言可能
• 抽象型(cluster)を定義可能 • 継承はできない
• 複数の戻り値が可能 → Rubyもパクった取り入れた a:int, b: real := type$procedure(c, d)
• 変数の値は全てヒープ上のオブジェクト • Garbage Collection
• イテレータ → Rubyのブロックになった
• 例外処理 → Rubyもパクった取り入れた
いわばRubyの先祖です
CLUのプログラム例
start_up = proc()
stdout:stream:= stream$primary_output()
stream$putl(stdout, “Hello World!”)
end start_up
• 変数は使い始める場所で宣言
– 変数名: 型名
– 変数名: 型名 := 初期設定値
• 型$手続き名 という形で手続きを呼び出し
clu2c(くるーつーしー)とは何ですか?
プログラミング言語CLUの処理系
• プログラミング言語CLUで書かれたプログラムをCで書かれたプログラムに変換(CLU to C)
• Cで書かれたプログラムを実行形式(a.out)にコンパイル
CLUの プログラム
Cの プログラム
clu2c
ライブラリ
clulink 実行形式
a.out
稼働確認済みの環境
• Cygwin
• Ubuntu 12.04.1
– i386
– amd64
• OpenSUSE 12.2
– 32bit
– 64bit
• OpenIndiana 151a5
– i386
• Solaris 11/11
• CentOS 6.3
– i386
• Fedora 17
– i386
• FreeBSD 9.0
– i386
• NetBSD 5.1.2
– i386
• Vine61
– i686
デモ
• Cygwin
• Ubuntu 12.04.1
– i386
– amd64
• OpenSUSE 12.2
– 32bit
– 64bit
• OpenIndiana 151a5
– i386
• Solaris 11/11
• CentOS 6.3
– i386
• Fedora 17
– i386
次のどれかで動かしますよ
clu2cの実行例
CLUで書いたプログラム
赤字は2バイト文字使用部分
start_up = proc()
標準出力:stream:= stream$primary_output()
for i:int in int$from_to(1, 5) do
標準出力!putl(”No. ” ||
i!unparse() ||
” Hello World!”)
end
end start_up
Cのプログラム(一部) int AFstart__up() {
if (OFstream_Dprimary__output()
== SIG) {
goto except0;
}
LV_X49383d603d504e4f =
retval_area[0];
for (t1 = 1; t1 <= 5; t1++) {
OFint_Dunparse(t1);
(略)
}
}
方針
32ビット環境でも 64ビット環境でも 吐くコードは同じ
どう やる?
整数型とビット数
データモデル
システム
char short int long long long
ポインタ
ILP32 Win32 8 16 32 32 64 32
LLP64 Win64 8 16 32 32 64 64
LP64 64bit Linux
8 16 32 64 64 64
ILP64 8 16 64 64 64 64
ILP32…ポインタは32bit → long
LLP64、LP64、ILP64…ポインタは64bit → long long
なので
ヘッダファイルを修正
プリプロセッサで判定
• 64ビット環境 ポインタ(object型)をlong longで宣言(64bit)
• 32ビット環境 ポインタ(object型)をlongで宣言(32bit)
#if defined(__LP64__) || defined(__LLP64__) || defined(__ILP64__)
typedef long long object;
#else
typedef long object;
#endif
ほぼこれだけで済みました
clu2c現在の状態
開発自体は終了
• 木村泉先生退官により木村泉研究室消滅
• 東工大 理学部 情報科学科での公開は終了 →フランスのFTPサーバからソースを回収
• 現在は「動態保存」
• こちらでソースを公開中
– http://touhei.sakura.ne.jp/clu2c/
– http://sourceforge.jp/projects/clu2c/
clu2cに残る課題
いずれもプロジェクト終了後に発生したもの
• UTF対応
– ISO-2022-JP、Shift_JIS、EUC-JPには対応済み
• ドキュメントの日本語化
clu2cプロジェクト参加者
• 江原善(初代リーダー) • 木原誠司(コンパイラ実装) • 地引昌弘(デバッガなど) • 孫音(ライブラリ実装) • 牛嶋哲(二代目リーダー)
– 日本語文字使用部分実装
• 富沢伸行(ライブラリ実装) • 浦野幹夫(ライブラリ実装) • 野澤義雄(ライブラリ実装) • 林智子(ライブラリ実装) • 森村健司
– Human68k、MS-DOSへの移植
• 森玲人(デバッガ担当) • 東平洋史(最適化など) など
プロジェクト終了後 • 前田修吾さん
– Linuxへの移植およびPorts化
• 東平洋史 – 前田さんの改造をCLU使用部分に反映
– Cygwin、Ubuntu 9.04への移植 – 64bit環境への対応
参考文献
• CLU Reference Manual – Liskov, B., Atkinson, R.R., Bloom, T., Moss, E.B., Schaffert, R.
and Snyder, A. 著
– http://publications.csail.mit.edu/lcs/specpub.php?id=793
• CLUとその仲間たち – 久野靖 著
– 共立出版 bit 1989年5月号~12月号
– http://www.oreilly.co.jp/books/9784873113630/#files
• 開発効率と移植性を重視したCLU言語処理系の作成 – 江原善 著
– 東京工業大学理工学研究科情報科学専攻 修士論文
– http://touhei.sakura.ne.jp/clu2c/clu2c-thesis.tar.gz