Rubyの御先祖
 CLUのお話

clu2c動態保存整備士
     東平洋史
内容

• プログラミング言語CLUの特徴
• 東京工業大学情報科学科木村泉研究室とCLU
プログラミング言語CLUの特徴(1)
• MITのBarbara Liskov考案(1974)
• 強い型付
  • コンパイル時に全てのオブジェクトの型が決まる
  • でも、任意の場所で変数宣言可能
• 抽象型(クラスタ)を定義可能
  • 具体表現は外から隠蔽
  • 継承はできない
• 複数の戻り値が可能
  a:int, b: real := type$procedure(c, d)
• 変数の値は全てヒープ上のオブジェクト
  • Garbage Collection
プログラミング言語CLUの特徴(2)
• イテレータ
• 例外処理
• 伸縮自在な配列
• 書き換え可能なオブジェクト
• 書き換え不能なオブジェクト
• パラメータ機能
イテレータ
• for文から呼び出す                          • まつもとゆきひろ著「Rubyist
 for i:int in int$from_to(1,100) do     のための他言語探訪 【第 2
   ...                                  回】 CLU」より
 end                                    – イテレータの定義の仕方は驚く
                                          ほど Ruby に似ています。真似
                                          したんだから当然です。元々
• ユーザ定義可能                                 Ruby のブロックは CLU のイテ
 from_to=iter(first:int, last:int)        レータに似たものを実現するた
 yields(int)                              めにデザインされたからです。
   n:int := first
   while n <= last
    yield(n)
    n := n + 1
   end
  end from_to
例外処理
• signal文で例外発生          • まつもとゆきひろ著「
                          Rubyist のための他言語
 signal 例外名[(値, …)]       探訪 【第 2 回】 CLU」よ
                          り
• except文で例外捕捉            – Ruby が例外処理を持つ
                            のは CLU の影響だと思
 例外を発生する文                   います。
  except when 例外1: 文…
    when 例外2:文…
    …
    others: 文…
  end
Syntax Sugar(構文糖)

任意の型(クラスタでも)で次の表現を使用可能
↓構文糖の一部
•type$add(a, b) ⇔ a:type + b:type
•type$sub(a, b) ⇔ a:type - b:type
•type$mul(a, b) ⇔ a:type * b:type
•type$div(a, b) ⇔ a:type / b:type
•type$get_name(a) ⇔ a.name
•type$set_name(a, 式) ⇔ a.name := 式
伸縮自在な配列array型

      B C    D E ← F   後ろに追加
         ↓
  A → B C    D E F     先頭に追加
         ↓
    A B C    D E F → F 後ろから削除
         ↓
A ← A B C    D E       先頭から削除
         ↓
      B C    D E
書き換え可能な型と書き換え不能な型

• 例:配列
 – array
    • 要素の書き換え、参照が可能。
    • 要素の追加と削除も可能。
    • 動的に値が変わる変数に使用
 – sequence
    • 要素の書き換えは不能。参照のみ可能。
    • 要素の追加と要素の削除を行なう場合はオブジェクトを
      作りなおす。
    • 値が変わらない静的な変数に使用
クラスタの例(int型のスタック)
intstack=cluster is              pop=proc(r: cvt)
             new, push, pop                 returns(int)
   rep=array[int]                           signals (empty)
   new=proc() returns(cvt)           return(rep$remh(r))
      return(rep$new())                 except when
   end new                                  bounds:
   push=proc(r: cvt, x: int)                  signal empty
      rep$addh(r, x)                    end
   end push                      end pop
                               end intstack
パラメータ機能の例
stack=cluster[t: type] is        pop=proc(r: cvt)
              new, push, pop                returns(t)
   rep=array[t]                             signals (empty)
   new=proc() returns(cvt)           return(rep$remh(r))
      return(rep$new())                 except when
   end new                                  bounds:
   push=proc(r: cvt, x: t)                   signal empty
      rep$addh(r, x)                    end
   end push                      end pop
                               end stack
CLUのプログラム例
start_up = proc()
   stdout:stream:= stream$primary_output()
   stream$putl(stdout, “Hello World!”)
end start_up
東京工業大学木村泉研究室と
      プログラミング言語CLU
• MITのBarbara Liskov考案(1974)
• 東京工業大学理学部情報科学科木村泉研究室で使用開始
  (1979以前)
• CLU処理系をFACOM230-45S、HITACMシリーズヘ移植
  (1979以前)
• CLUを授業に使用
• CLUマシン作成(1985夏~1992)
  • Lispマシンと似たコンセプト
• CLU処理系nclu作成(1985以前)
  • 2バイト文字使用可能
  • !記法
• CLU処理系clu2c作成(1991~1998頃)
  • CLUをCのプログラムに変換
CLUマシン
• CLUで実装
 – 一部、アセンブラを使用
• CLUの特徴(特にデータ抽象型)を活かした実装
• 単一言語系
 – 走らせるプログラムはCLUで記述したもののみ
• ダイナミックリンカ使用
• 文字は16ビットに統一
 – 英字も日本語文字なども使用可能
CLUマシンプロジェクト参加者
•   久野靖(指導者)      • 関啓一
•   暦本純一(オブザーバ)   • 吉屋英二
•   鈴木友峰          • 藤崎智宏
•   荒井俊史          • 伊藤義行
•   中村秀男          • 木原誠司
•   佐藤直樹          • 江原善
•   二瓶勝敏          • 地引昌弘
•   明石修           • 富沢信行
•   根岸康           • 牛嶋哲
                  など
nclu
 処理系CLUの拡張(new CLU? 日本語CLU?)
•MIT製処理系cluを改造   •!記法
•2バイト文字使用可能       – 暦本純一氏考案の構文
 – 木村泉先生の要望         糖
                    a!proc(b) ⇔ type$proc(a, b)
 – 識別子に多バイト文字使
   用              – .はすでに使われていた
                    a.name := b ⇔
 – 演算子にも多バイト文字
                           type$set_name(a, b)
   使用
                    a.name ⇔ type$get_name(a)
                  – 久野靖氏「CLUは立派な
                    オブジェクト指向言語に
                    昇格」←少し言い過ぎ
                    (^^;
ncluを使ったプログラムの例
赤字は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
CLU処理系clu2c
• CLUをCに変換する処理       • 以下のプログラムで構成
  系                   – clu2c
• CLUとCで実装               • CLUをCに変換するプログ
                           ラム
• GCは Boehm GC を使用       • MIT製処理系cluを改造
                                – 主にコード生成部を作成
                      – plink
                         • パラメータ機能の分析
                         • ユーザは直接呼び出さな
                           い。clulinkが呼びだす。
                      – clulink
                         • 基本ライブラリ、GCライブラ
                           リとリンクし、実行形式を生
                           成
clu2cプロジェクト参加者
•   江原善(初代リーダー)     • 森村健司
•   木原誠司(コンパイラ実装)    – Human68k、MS-DOSへの移植
•   地引昌弘(デバッガなど)    • 森玲人(デバッガ担当)
•   孫音(ライブラリ実装)     • 東平洋史(最適化など)
•   牛嶋哲(二代目リーダー)    など
    – 日本語文字使用部分実装   プロジェクト終了後
•   富沢伸行(ライブラリ実装)   • 前田修吾さん
•   浦野幹夫(ライブラリ実装)    – Linuxへの移植およびPorts化
•   野澤義雄(ライブラリ実装)   • 東平洋史
                     – 前田さんの改造をCLU使用部
•   林智子(ライブラリ実装)
                       分に反映
                     – Cygwin、Ubuntu 9.04への移植
clu2c現在の状態
開発自体は終了
• 木村泉先生退官により木村泉研究室消滅
• 東工大 理学部 情報科学科での公開は終了
• 現在は「動態保存」
 – 実用されなくなった機械類を、操作や運用が可能な
   状態で保存しておくこと。「デジタル大辞泉」より
• こちらでソースを公開中
 – http://touhei.sakura.ne.jp/clu2c/
 – http://sourceforge.jp/projects/clu2c/
clu2cに残る課題
いずれもプロジェクト終了後に発生したもの
• UTF対応
 – ISO-2022-JP、Shift_JIS、EUC-JPには対応済み
• 64ビットOSへの対応
 – 32ビットアプリケーションとしてなら動作する
 – 64ビットアプリケーションとして動作するかは未検証
   • Boehm GCは64ビットアプリケーションに対応済み
   • ポインタ関連の改修が必要か?
まとめ
• プログラミング言語CLU   • 東京工業大学木村泉研
  の特徴              究室とCLU
 – 強い型付け          – CLU処理系の移植
 – 抽象型            – CLUマシン
 – 複数の戻り値            • CLU言語を命令セットとす
                       るOS
 – イテレータ
                  – nclu
 – 例外処理
                     • 2バイト文字使用
 – パラメータ処理           • !記法
 などなど             – clu2c
                     • CLU→C→実行形式
                  – CLUを授業に使用
参考文献
• 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

Rubyの御先祖CLUのお話(原本)

  • 1.
  • 2.
  • 3.
    プログラミング言語CLUの特徴(1) • MITのBarbara Liskov考案(1974) •強い型付 • コンパイル時に全てのオブジェクトの型が決まる • でも、任意の場所で変数宣言可能 • 抽象型(クラスタ)を定義可能 • 具体表現は外から隠蔽 • 継承はできない • 複数の戻り値が可能 a:int, b: real := type$procedure(c, d) • 変数の値は全てヒープ上のオブジェクト • Garbage Collection
  • 4.
    プログラミング言語CLUの特徴(2) • イテレータ • 例外処理 •伸縮自在な配列 • 書き換え可能なオブジェクト • 書き換え不能なオブジェクト • パラメータ機能
  • 5.
    イテレータ • for文から呼び出す • まつもとゆきひろ著「Rubyist for i:int in int$from_to(1,100) do のための他言語探訪 【第 2 ... 回】 CLU」より end – イテレータの定義の仕方は驚く ほど Ruby に似ています。真似 したんだから当然です。元々 • ユーザ定義可能 Ruby のブロックは CLU のイテ from_to=iter(first:int, last:int) レータに似たものを実現するた yields(int) めにデザインされたからです。 n:int := first while n <= last yield(n) n := n + 1 end end from_to
  • 6.
    例外処理 • signal文で例外発生 • まつもとゆきひろ著「 Rubyist のための他言語 signal 例外名[(値, …)] 探訪 【第 2 回】 CLU」よ り • except文で例外捕捉 – Ruby が例外処理を持つ のは CLU の影響だと思 例外を発生する文 います。 except when 例外1: 文… when 例外2:文… … others: 文… end
  • 7.
    Syntax Sugar(構文糖) 任意の型(クラスタでも)で次の表現を使用可能 ↓構文糖の一部 •type$add(a, b)⇔ a:type + b:type •type$sub(a, b) ⇔ a:type - b:type •type$mul(a, b) ⇔ a:type * b:type •type$div(a, b) ⇔ a:type / b:type •type$get_name(a) ⇔ a.name •type$set_name(a, 式) ⇔ a.name := 式
  • 8.
    伸縮自在な配列array型 B C D E ← F 後ろに追加 ↓ A → B C D E F 先頭に追加 ↓ A B C D E F → F 後ろから削除 ↓ A ← A B C D E 先頭から削除 ↓ B C D E
  • 9.
    書き換え可能な型と書き換え不能な型 • 例:配列 –array • 要素の書き換え、参照が可能。 • 要素の追加と削除も可能。 • 動的に値が変わる変数に使用 – sequence • 要素の書き換えは不能。参照のみ可能。 • 要素の追加と要素の削除を行なう場合はオブジェクトを 作りなおす。 • 値が変わらない静的な変数に使用
  • 10.
    クラスタの例(int型のスタック) intstack=cluster is pop=proc(r: cvt) new, push, pop returns(int) rep=array[int] signals (empty) new=proc() returns(cvt) return(rep$remh(r)) return(rep$new()) except when end new bounds: push=proc(r: cvt, x: int) signal empty rep$addh(r, x) end end push end pop end intstack
  • 11.
    パラメータ機能の例 stack=cluster[t: type] is pop=proc(r: cvt) new, push, pop returns(t) rep=array[t] signals (empty) new=proc() returns(cvt) return(rep$remh(r)) return(rep$new()) except when end new bounds: push=proc(r: cvt, x: t) signal empty rep$addh(r, x) end end push end pop end stack
  • 12.
    CLUのプログラム例 start_up = proc() stdout:stream:= stream$primary_output() stream$putl(stdout, “Hello World!”) end start_up
  • 13.
    東京工業大学木村泉研究室と プログラミング言語CLU • MITのBarbara Liskov考案(1974) • 東京工業大学理学部情報科学科木村泉研究室で使用開始 (1979以前) • CLU処理系をFACOM230-45S、HITACMシリーズヘ移植 (1979以前) • CLUを授業に使用 • CLUマシン作成(1985夏~1992) • Lispマシンと似たコンセプト • CLU処理系nclu作成(1985以前) • 2バイト文字使用可能 • !記法 • CLU処理系clu2c作成(1991~1998頃) • CLUをCのプログラムに変換
  • 14.
    CLUマシン • CLUで実装 –一部、アセンブラを使用 • CLUの特徴(特にデータ抽象型)を活かした実装 • 単一言語系 – 走らせるプログラムはCLUで記述したもののみ • ダイナミックリンカ使用 • 文字は16ビットに統一 – 英字も日本語文字なども使用可能
  • 15.
    CLUマシンプロジェクト参加者 • 久野靖(指導者) • 関啓一 • 暦本純一(オブザーバ) • 吉屋英二 • 鈴木友峰 • 藤崎智宏 • 荒井俊史 • 伊藤義行 • 中村秀男 • 木原誠司 • 佐藤直樹 • 江原善 • 二瓶勝敏 • 地引昌弘 • 明石修 • 富沢信行 • 根岸康 • 牛嶋哲 など
  • 16.
    nclu 処理系CLUの拡張(new CLU?日本語CLU?) •MIT製処理系cluを改造 •!記法 •2バイト文字使用可能 – 暦本純一氏考案の構文 – 木村泉先生の要望 糖 a!proc(b) ⇔ type$proc(a, b) – 識別子に多バイト文字使 用 – .はすでに使われていた a.name := b ⇔ – 演算子にも多バイト文字 type$set_name(a, b) 使用 a.name ⇔ type$get_name(a) – 久野靖氏「CLUは立派な オブジェクト指向言語に 昇格」←少し言い過ぎ (^^;
  • 17.
    ncluを使ったプログラムの例 赤字は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
  • 18.
    CLU処理系clu2c • CLUをCに変換する処理 • 以下のプログラムで構成 系 – clu2c • CLUとCで実装 • CLUをCに変換するプログ ラム • GCは Boehm GC を使用 • MIT製処理系cluを改造 – 主にコード生成部を作成 – plink • パラメータ機能の分析 • ユーザは直接呼び出さな い。clulinkが呼びだす。 – clulink • 基本ライブラリ、GCライブラ リとリンクし、実行形式を生 成
  • 19.
    clu2cプロジェクト参加者 • 江原善(初代リーダー) • 森村健司 • 木原誠司(コンパイラ実装) – Human68k、MS-DOSへの移植 • 地引昌弘(デバッガなど) • 森玲人(デバッガ担当) • 孫音(ライブラリ実装) • 東平洋史(最適化など) • 牛嶋哲(二代目リーダー) など – 日本語文字使用部分実装 プロジェクト終了後 • 富沢伸行(ライブラリ実装) • 前田修吾さん • 浦野幹夫(ライブラリ実装) – Linuxへの移植およびPorts化 • 野澤義雄(ライブラリ実装) • 東平洋史 – 前田さんの改造をCLU使用部 • 林智子(ライブラリ実装) 分に反映 – Cygwin、Ubuntu 9.04への移植
  • 20.
    clu2c現在の状態 開発自体は終了 • 木村泉先生退官により木村泉研究室消滅 • 東工大理学部 情報科学科での公開は終了 • 現在は「動態保存」 – 実用されなくなった機械類を、操作や運用が可能な 状態で保存しておくこと。「デジタル大辞泉」より • こちらでソースを公開中 – http://touhei.sakura.ne.jp/clu2c/ – http://sourceforge.jp/projects/clu2c/
  • 21.
    clu2cに残る課題 いずれもプロジェクト終了後に発生したもの • UTF対応 –ISO-2022-JP、Shift_JIS、EUC-JPには対応済み • 64ビットOSへの対応 – 32ビットアプリケーションとしてなら動作する – 64ビットアプリケーションとして動作するかは未検証 • Boehm GCは64ビットアプリケーションに対応済み • ポインタ関連の改修が必要か?
  • 22.
    まとめ • プログラミング言語CLU • 東京工業大学木村泉研 の特徴 究室とCLU – 強い型付け – CLU処理系の移植 – 抽象型 – CLUマシン – 複数の戻り値 • CLU言語を命令セットとす るOS – イテレータ – nclu – 例外処理 • 2バイト文字使用 – パラメータ処理 • !記法 などなど – clu2c • CLU→C→実行形式 – CLUを授業に使用
  • 23.
    参考文献 • CLU ReferenceManual – 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