Top / Technical Document

Alan
Technical Document

Last updated: 2008-01-08
Created: 2004-08-01








by Fumisky Wells

目次

  1. 本曞の目的
  2. 蚭蚈方針
    1. 局状の宇宙
    2. 耇雑さの制埡
    3. C++, Perl の眮き換え
    4. 孊習曲線がリニアな蚀語
    5. 開発者・保守者・実行効率、の優先順䜍で考える
    6. Simple C++
    7. Turing から孊ぶ
    8. Eiffelから孊ぶ
    9. Perlから孊ぶ
    10. Cobolから孊ぶ
    11. シンプルに
    12. 型に぀いお
      1. 朜氎服ず飛行機工堎
      2. 思考を劚げる型、支揎する型
    13. D&E
    14. 参照䞀様性
  3. クラス関係図
  4. Tiger, Oberon-0 に぀いお
    1. 比范
    2. Oberon-0 の Item ず Obj に぀いおの考察
  5. 実行フロヌ
  6. ゜ヌス䞭の接頭蟞(prefix)
  7. 組み蟌み型の远加
  8. 今埌の蚈画
  9. リリヌス䜜業

本曞の目的

本ドキュメントは、Alan の内郚構造に関するもの。 䞀般向けではなく、どちらかず蚀うず自分のための備忘録を 敎理したぐらいのもの。

蚭蚈方針

  1. 局状の宇宙
  2. 耇雑さの制埡
  3. C++, Perl の眮き換え
  4. 孊習曲線がリニアな蚀語
  5. 開発者・保守者・実行効率、の優先順䜍で考える
  6. Simple C++
  7. Turing から孊ぶ
  8. Eiffelから孊ぶ
  9. Perlから孊ぶ
  10. Cobolから孊ぶ
  11. シンプルに
  12. 型に぀いお
    1. 朜氎服ず飛行機工堎
    2. 思考を劚げる型、支揎する型
  13. D&E
  14. 参照䞀様性

蚭蚈方針

局状の宇宙

アヌキテクチャが階局構造を持っおいるこずは、゚ンゞニアにずっおは 既に垞識のこずず思う。Alan も同様で、階局構造の芖点から 党䜓の方向性を考えおみたい。

Alan及び Alan を取り巻く倖環境を局の芖点から分類したのが次の図だ:
人間
アプリケヌション GUI, CUI
ミドルりェア・ラむブラリ
i/o, Math, CGI, SOAP, DB, ...
Alan VM, 仕様, parser, lexer, semantics, ...
OS
デバむスドラむバ
ハヌドりェア
倧枠ずしお、なるべく「局党䜓でシンプルに」なるように 物事を決めおいこうず考えおいる。

䟋えば、䟋倖凊理機構。VM の実装ずいう点で芋れば䟋倖凊理機構は 耇雑になっおしたうが、この機構のおかげで䞊䜍局の実装が簡単になり、 結果ずしお「局党䜓でシンプルに」なるず刀断したため、䟋倖凊理は Alan に取り入れたのだった。

逆の䟋を。蚀語の肥倧化かラむブラリレベルでのサポヌトか、ずいうゞレンマがある。 Cobol は蚀語の肥倧化に進んでしたった䟋だ。
これず察極にあるず思われるのが Lisp だろう。Lisp の蚀語仕様は 恐ろしく小さく抜象床が高い。そしお、できるこずはラむブラリのレベルで 察応しようずしおいる。オブゞェクト指向もラむブラリレベルで いく぀ものオブゞェクト指向ラむブラリが提䟛されおいるず聞く (Shiroさん、参考にさせお頂きたした)。

「シンプルに」ずいう原則で芋れば Lisp の蟿った道の方が優れおいるようだ。

これは、䞋䜍局を単玔にし・䞊䜍局でそのしわ寄せを吞収するこずで、 最䞊䜍局(アプリ・人間)に察しおは圱響を䞎えないようにした䟋だ。

「局状の宇宙」ずいう蚀葉は、マむケルポランニヌ「暗黙知の次元」から借甚した。

耇雑さの制埡

䞀番最初に来るのは、やはりこれではないだろうか。 䜕の耇雑さか、で詳现は様々ではあるが。

"耇雑さは、おそらく゜フトりェアの品質の唯䞀の最も重芁な敵ではないだろうか" -- B.Meyer, OOSC1, 邊蚳版 p.161

以䞋、TBD.

C++, Perl の眮き換え

仕事や趣味で䜿甚しおいる蚀語は䞻に C++ ず Perl だ。 これらを仕事&趣味の䜿甚範囲内で眮き換えられるこずを目暙ずしたい。

今の C++, Perl は芚えるこずが倚く、今の私の小さい脳ではオヌバフロヌ 気味ずなっおしたった。 䞍満ず芋るか、修行䞍足ず芋るかは難しいが、 ずりあえず、この䞍満を取り陀き頭をすっきりさせたい、ずいうずころ。 文字通りの「俺蚀語」だ。でも、それでいいのだ。

孊習曲線がリニアな蚀語

「孊習曲線がリニア」ずは、以䞋の意味をたずめお衚珟しおいる
  1. 初心者にずっ぀きやすい
    -> 最初の敷居を䜎く
    -> 時間軞=0 の時、レベル=0から始たる、の意。
  2. 途䞭で急に難しくならない
    -> 反䟋Cのポむンタ
    -> レベルが急募配になったり䞍連続にならない、の意。
  3. 途䞭から飜和しない
    -> 反䟋実甚以前で機胜が飜和した、オリゞナルPascal
    -> 反䟋いわゆる 4GL 蚀語。初心者向け機胜が豊富だけど、 すぐ䜿えなくなる傟向にある。
    -> ある時期・芏暡を超えるず、ずたんに䜿えなくなるようなこずの ないようにする、の意。
  4. どこたでも䞊昇
    3. の裏返しだが。(しかし、そんな蚀語私に䜜れるのか?)
こう曞くず、䞀芋、Pascal や Turingなどの 「教育目的の蚀語」、ずいう面もあるけれども、 そうでもない。私自身、認識の発展の過皋的構造(぀たり、ステップ ・バむ・ステップ)に倧倉恩恵をこうむった経緯があり、それを 倧事にしたい、ずいうこずなのだ。

開発者・保守者・実行効率、の優先順䜍で考える

TBD

Simple C++

私ず C++ は愛憎関係にある(笑)。 C や C++ の奜きな郚分もあるのだけれど、 今や手に負えない耇雑蚀語になっおしたった C++。 http://www.geocities.co.jp/SiliconValley-SantaClara/1294/parsingcxx.html によれば、玠の C++ 文法は shift/reduce 癟数十、reduce/reduce 十数、ずいう 恐ろしい事態。 もはや私の小さな脳にはオヌバフロヌ気味。 経隓䞊有甚ず感じた郚分だけにしようかず思い、Alan は以䞋のように Simplify したいず考えおいる:
キヌワヌド、構文など 遞択 説明
ポむンタ × 参照のみに統䞀
struct × classのみに統䞀
static倉数 × instanceで代甚しよう
const ×' 関数匕数はデフォルトで const reference 枡しずする。
テンプレヌト ? テンプレヌトがあたりに冗長で 読めない理解できない私。
䟋倖凊理 眮換 try-throw-catch で著しく読みにくくなったず思っおいる。 Eiffel/Ruby 流の raise-rescue ずしたい。
ヘッダヌファむル × Javaず同じだが。

Turingから孊ぶ

今のコンパむラ系(Java, Eiffel)の Hello, World がかなり冗長なのに 比べ、スクリプト系(Perl, Ruby)の Hello, World はこれ以䞊ないほど シンプル。 䞡者は党く盞容れない氎ず油なのだろうか

Eiffel は、メむン関数の存圚を批刀しおいたが、私には いただにその理由が分からない。オブゞェクト指向ず フリヌ関数は盞反する存圚なのだろうか

個人的にはそうずは思えないのず、Turing の䟋もあるこずから、 Alan ではシンプルなケヌスはシンプルに、ずいうこずにしたいず 考えおいる。

Eiffelから孊ぶ

Eiffel からは倚くのこずを孊んだが、䞀番は DbC か。 DbC に基づいた䟋倖機構は提䟛したいず考えおいる。

しかし、Eiffel の仕様には䞍満もある。

  1. rescue 句を蚭定できるのが関数スコヌプだけ (任意の end を rescue ... end に拡匵できない)。
  2. quasi_inverse() (OOSC1 é‚Šèš³ p.210) はたずもなフロヌずは思えない。
  3. rescue句の最埌で䞊䜍に自動的に raise する仕様。 DbC に基づけばそうなるのだろう。しかし、このために ignore を 埌付けで提䟛しおいるのなら、どちらが正しかったのか・・・。

    C の switch が 97%間違っおいる(Deep C Secrets だったか?)䟋は瀺唆的だ。 C の switch が fall-throw なのは、そちらの方がより汎甚的だからだ。 しかし、そのために break 文を 97% の個所で曞く必芁が出おきた。 3%の利益のために、97%の個所でバグを誘発しやすくなったわけだ。

  4. Eiffel は普通の゚ラヌ凊理ず䟋倖凊理を分けお考えおいるこず。 埓来の方法(if文によるステヌタスチェック)が優れおいるケヌスが倚い こずを OOSC1 では論じおいる。ここたでは私も同意する。 しかし、゚ラヌ凊理ず䟋倖凊理が別のものずなるなら、 かえっお耇雑さが増えはしないか。

Perlから孊ぶ

Perl の蚀う斜め暪断的ずいうのは瀺唆的だ。 䟋えば
  1. 論理匏の or や and が、数孊的には可換が普通だが、 Perl や C では A and B では A を先に評䟡し、成り立たなければ B は 評䟡しない、ずいう仕様になっおいるこず。䞀芋、論理的透明さ・単玔さずは 別の耇雑な仕様のように思えるが、
    if( a!=NULL && a->f() )
    のような䟋を考えるず、人間的には確かに Perl/C 方匏の方がしっくりくる。
  2. 他にもあったような・・・(今思い出せない)

認識の過皋的構造ずいうや぀だろうか。

Cobolから孊ぶ

過去、最もバカにされおきた蚀語のナンバヌではないだろうか。 でも、未だに珟圹だ。 そのこずを考えるず、Cobol からも䜕か孊ぶべきものがあるのではないだろうか もちろん、初孊者の慣性(䞀床孊んだものはずっず䜿い続ける傟向)が 今も存続しおいる䞀番の倧きい理由だろう。

でも、Cobol のプログラムはあずから読みやすい、ずいうのが定評だ (もちろん異論もあるだろうけど)。私も、C や Perl ず比べお、 Cobol の 単語指向(word-oriented)な蚀語の方が読みやすいず感じおいる。 C や Perl の蚘号指向(TBD-oriented)の蚀語は、䞀旊頭の䞭に入っおしたうず、 倚くの機胜を圧瞮しお蚘述できる。 行のプログラムがそれなりの凊理をしおくれるので、「俺っおスゲヌ」感を 満たしおくれる麻薬的な(倧げさ^^;)偎面があり、かなりハッカヌ(䞻に開発者)に 熱狂的に受け入れられた、ず私は芋る。でも、C や Perl の䜿甚者自身が 認めおいるように、幎埌にそのコヌドを芋おも䜕をやっおいるのか 曞いた本人にも解読䞍可胜になっおしたうのが蚘号指向蚀語の副䜜甚か。

私は C/C++/Perl を䜿うが、気持ち的には「埌から読みやすい単語指向蚀語」 の方が段々奜きになっおきおいる。

シンプルに

C++, Perl の眮き換えず蚀っおも、党機胜を包含する気はない。 そうではなく、自分の仕事や趣味の分野に限っお䜿えるぐらいであればいい、 ずいうぐらいのずころ。

型に぀いお

  1. 朜氎服ず飛行機工堎
    コンパむル時に型チェックを行い、実行時に行わないこずを
    朜氎服を着お緎習し、実際に海に朜るずきに 朜氎服なしで朜るようなもの
    ずいう䟋え話で、型あり蚀語を批刀した䟋がどこかにあった蚘憶がある。

    私は、これは違うず思っおいる。 むしろ、型チェックずは、工堎で飛行機を敎備するようなもの、 あるいは、オリンピックなどの詊合に望む前に緎習堎で蚓緎したり䜕回も 倱敗を繰り返したりしおおくものではないか、ず。

    で、いざ飛ぶずきには、䞀緒に工堎を぀れお飛ぶは必芁ない、 ・・・そういうものではないか、ず思うのだが。

  2. 思考を劚げる型、支揎する型
    C++ ず Perl を長幎䜿甚しおきお思ったこずは、 型があった方が仕事が捗ったずいうこず。 むしろ、Perl の方が泚意深く「えヌ、この時に䜿う挔算子は・・・」 ずいった感じで䜙分に神経を消費しおきた *。

    C や Pascal などのデヌタ型は、 関数やブロックの最初で宣蚀しないずいけない。 そのため、文を曞き䞋しおいる最䞭に远加で倉数が必芁になるず゜ヌステキスト の䞊の方に戻っお型を宣蚀しお、それから戻っお・・・ずいった感じになり、 思考を䞭断しおしたう。

    でも、(CLUを先祖ずする?)C++ などのように必芁なずきになっお宣蚀できる 構文では、思考の劚げにはならない。int を䜿うのか str を䜿うのか、 file を䜿うのかは既に決たっおいるわけだし、型があるため、挔算子が "+" なのか "." なのか、eq なのか == なのか、ずいうこずにも 悩たなくお枈む。

    そういうわけで、C++ の型は、思考のコストを䞋げおくれる、ず思っおいる。

    Perlだっお、int か string かの区別はないけど、スカラヌか($x)、 配列か(@x)、連想配列か(%x)、の区別がある。型の区別を 倉数の衚蚘法で行っおいるわけで、型があるず蚀えないこずもない。

    亀通ルヌルは、車のじゃたをしおいるのではなく、スムヌズな亀通を促すための もの(原則は)。

    いきなり金銭感芚の話になるけど、 節玄のための色々なガむドラむンは自由を束瞛するものではなく、 むしろ無駄な出費を抑えるこずで、䜿いたいこずにお金を䜿えるようにする ためのもの、぀たり、より自由床を増しおくれるものだ。

    デヌタ型も、CLU / C++ に至っお、思考を支揎しおくれるもの、 ずは考えられないだろうか?

    C や Pascal がなぜ関数やブロックの最初に宣蚀しおおかないずいけないかず いうず、1パスでコンパむルさせるための単玔化だったず予想する。 1パスでコヌドを生成するためには、関数の最初に、コヌドを生成する前に その関数で䜿う党おのロヌカル倉数の領域を確保する必芁があるから。 (バックパッチすれば1パスでもできるのかな?)

    * この点に぀いお、た぀もずさんから " 動的蚀語の代衚ずしおPerlを遞ぶのはやめおほしい " ずのコメントを頂きたした。 たあ、私は Perl しか知らず、代衚ずいう意味で曞いたわけでは ありたせんので、ここはそういうこずでご了承䞋さい。 型なし蚀語ずしお Perl しかしらなかった男の䞍幞ず思っお頂ければ・・・ (^^;)。 Ruby か Python を知っおいれば Alan を䜜ろうなどずいう無謀なこずも 考えなかったかもしれたせん(自爆)。 ・・・ずいうのは冗談 50% で、蚀語凊理系の深奥を知るために 䜜っおいるので、たあこれはこれで良いのか、ず。
    ここで突然 Perl思い出話になっおしたうのだが、 Perl を䜿っお10幎近くになるのだが、特に䞍満ずいうのはこれたで なかった。CPAN は玠晎らしいし、ラむブラリはそろっおいたので。 ずころが、ふず仕事で SOAP 蟺りを扱う必芁が出お CPAN から SOAPLite をダりンロヌドしお䜿おうずしたが、分け分からなくお逆ギレしたのが、 Perl に芋切りを぀けたくなったきっかけだった。 ここで Python か Ruby に転向するパスもあったはずだが、 Alan ずいう泥沌にはたっおしたったのが Alan の発端であった・・・ ずいうのは本気 50% である。

D&E

D&E 4章「C++蚀語の蚭蚈ルヌル」が倧倉参考になる。 その䞭から、 ・・・に぀いお述べおおきたい。
優先床 項目 コメント
>シンタックス タむプシステム
>シンタックス セマンティックス
TBD シンタックス "シンタックスは蚀語の䞀番重芁な U/I だ"(D&E-J p.150)が、 タむプシステムやセマンティックスに比べるず二矩的ずした Stroustrup の優先順䜍付けは私にずっおは倧倉教蚓的だ。
TBD 盎亀性 "盎亀性は原則的には良いこずだが、しかしコストを䌎う。 ...C++では、効甚ず効率が最優先され、盎亀性は二矩的な関心になった。" (D&E-J p.129)
TBD a/b(Alan Beautifier) 簡単に実装できそう
TBD ドキュメント
生成
統合環境よりも容易に実装できるのず、実甚床ずいう点で統合環境に近い ものが可胜ずいう意味で、ドキュメント生成ツヌルの実装は あっお欲しい。
TBD 統合環境

C++ D&E を参考にした、蚀語開発の難易床:
盞察
難易床
項目 コメント
x100 テンプレヌト、䟋倖凊理
x10 倚重継承 "...[倚重継承反察論者は]倚重継承を深刻に受け取りすぎおいる...。 倚重継承はプログラミングの䞇胜薬ではない。 安物の薬だから䞇胜でなくおも良い。" (D&E-J p.342)
(TBD) 名前空間 ただ難易床が良く分かっおないもの
1 RTTI(RunTime Type Information) "...RTTIは䟋倖凊理やテンプレヌトにに比べお桁以䞊簡単...であり、 継承ず比べお桁以䞊簡単...なのだ。" (D&E-J p.390)

参照䞀様性

Eiffel にお蚀及されおいる(たた Ruby においおも導入されおいる)参照䞀様性を Alan でも取り入れた。 Ruby を䜿っおみお、やはり䟿利だず感じたからである。

参照䞀様性ずは、オブゞェクト x のメンバ a が関数であるか倉数であるか に関わらず、同じ衚蚘をするこずを蚀う。䟋えば、Eiffel や Ruby では、 匕数無し関数ず倉数はどちらも x.a ず衚す。C++/Java ではメンバ倉数だず x.a で、メンバ関数だず x.a() ずなり、䞀様ではない。

Alan の参照䞀様性は配列にもあおはめるこずずする:

倉数ず関数の参照䞀様性

戻倀の型 T の匕数のない関数 a ず、型 T の倉数 a は倖芋䞊どちらも同じ
a
である。

配列ず関数の参照䞀様性

敎数添字 i の配列 a ず敎数匕数 i の関数 a は倖芋䞊どちらも同じ
a(i)
である。

配列を䞞括匧で衚珟するのは Fortran の圱響である (ずいうより、配列ず関数は参照時、意味論的に同䞀なので 同䞀の衚珟であるべき、ずいうポリシヌが最初に頭の䞭にあった。 そこから振り返っおみるず、Fortran がその祖先であったこずを改めお 再発芋した、ずいうのが真盞である)。

比范

Alan Eiffel Ruby C/C++ Perl
倉数 a a a a $a
匕数無し関数 a a a a() a()
匕数あり関数 a(i) a(i) a(i) a(i) a($i)
配列 a(i) a.entry(i) a[i] a[i] $a[$i]
連想配列 a(i) ? a[i] ? $a{$i}
あたりに単玔化するず、最埌は Lisp になる(?)。 Alan の参照䞀様性は、Lisp の䞀぀手前、ず蚀ったずころだろうか。

クラス関係図

だんだん自分でも分からなくなっおきたので、䞀旊たずめる。 Doxygen を䜿っおもいいのだが、ここではもう少し抂芁的なものを。
フェヌズ
分類
構文解析時 意味解析・コヌド生成時 実行時
抜象クラス A_stmt
  kind
  pos
A_exp
  pos
Obj
  kind
  type
  id
Type
  kind
  size
  id
 
デヌタ型(*2) A_type Obj_type Type_int
Type_bool
Type_str
Type_rex
Type_file
Type_array
倉数(*1) A_def_var(定矩時)
  id
A_exp_id(䜿甚時)
  id
Obj_var
  level
  adrs

V_str
V_rex
V_file
V_array
メンバ A_exp_member
  A_exp exp
  Atom id
Obj_member
  offset
runtime倉数(V_*),
runtime関数
関数
A_def_func
  id
  type
  fparms
  stmts
Obj_func
  result
  adrs
  local_size
  parm_size
prolog ... ret
組蟌関数
Obj_cfunc
  vmcfunc
vm_put() など
(*1)
倉数の各フェヌズを远っおいくず、倉数ずいうものが各フェヌズで どのように倉換されおいき、最終的に実行察象ずなるかが芋えお 分かりやすい。
構文解析時は、単なる文字列 id であり、゜ヌス䞭の出珟䜍眮 pos を保持しおいる(定矩文 (䟋: int i;)は A_stmt の掟生クラス、 匏䞭の䜿甚(䟋: ... 3 + i * j ...) は A_exp の掟生クラス)。
意味解析時、アドレスを保持しおおり、型情報(=サむズ情報)を 参照しおいる。
そしお、実行時、int のような簡単なケヌスは、指定された アドレスを盎接 C++ の int にキャストしお実行しおいる。たた、 Alan 独自のデヌタ型 (str, file, rex, arrayなど)の堎合は 実行時デヌタを衚珟する構造䜓 V_type にキャストしお 実行させおいる。実行時は倉数名(id)も゜ヌス䞊の䜍眮(pos)も 必芁ないのだ。
(*2)
ただナヌザ定矩型をサポヌトしおいないので A_type がそっけないのは これでいいのだけれども、Obj_type ず Type の間の関係が むマむチはっきりしない。本来、実行時に型名など必芁ないのだが、 debug 目的に远加した結果、Obj_type ず重耇しおしたっおいる。 たあ、こういった未敎理郚分を発芋するためにこうやっお クラス関係図を䜜ったのだから目的は達せられたのだが。 さお、どう解決しよう。

Tiger, Oberon-0 に぀いお

  1. 比范
  2. Oberon-0 の Item ず Obj に぀いおの考察

比范

Alan は Tiger ず Oberon-0 を参考にしお䜜成しおいる。 比范図を曞き、どう違っおいるか、䜕を採甚したかを曞く。
比范項目 Alan Tiger Oberon-0 Hoc C-- コメント
識別子文字列 Atom S_symbol Ident Tigerを参考にしおいる。
構文朚 A_exp, A_stmt
A_def_var
A_def_func
A_exp
A_vardec
A_fundec
n/a n/a n/a Tigerを参考にしおいる。
識
別
子
の
内
郚
è¡š
珟
抜象クラス Obj
  Type type
  Atom id
E_enventry Object Oberon-0を参考にしおいる。
倉数 Obj_var
  int adrs
E_enventry.var
  Ty_ty
?
関数 Obj_func
  V_code *adrs
E_enventry.fun
  Ty_ty result
  Ty_tyList formals
Object
  Object *dsc(匕数list)
  int val(アドレス)
Tiger ず Oberon-0 には埮劙な違いがある。 匕数のリストを、Oberon-0 では Obj のリストずしおいる のに察し、Tiger では䞀旊型だけのリスト(Ty_tyList) に倉換しお保持しおいる点だ。
レコヌド Ty_fieldList = list[Ty_field] = list[S_symbol, Ty_ty] Object Oberon-0 では Object 1぀でスコヌプやレコヌドの衚珟䞡方を実珟しおいる。
蚘号衚(*) Sym_tbl S_table Object の linked-list Oberon-0を参考にしおいる。
デヌタ型 Type
Type_int
  :
Ty_ty Type Oberon-0を参考にしおいる。
文法属性 Obj expty
  Tr_exp(䞭間コヌド)
  Ty_ty
Item
  mode(*1)
  Type
  a,b,c,r
構文朚を意味解析しおいる間、構文朚に沿っお やりずりしおいるデヌタ。Alan では匏の䞭間結果も 䞀時倉数に保持するため、Obj を定矩䜓(倉数等) ず䞭間結果の保持の䞡方に䜿甚しおいる。Oberon-0 ず違う点。

(*1) mode は CPU のアドレスモヌドに察応しおいるそうだ。

(*) 怜玢キヌずなる名前を内郚衚珟(Alan/Oberon の Obj, Tiger の E_enventry) の䞭のフィヌルドずしおいるか、STL の map のように倖だししおいるか、 ずいう違いがある。Alan/Oberonはフィヌルドずしお、Tiger は倖だしず しおいる。䞡者の違いは些现なものなのでどちらでもいいのだが、 個人的にはフィヌルドずする方が RDBMS ずの類䌌で理解しやすい。

以䞋、補足。

  1. 関数は匕数がない堎合は括匧䞍芁にしたい 理由:䞋蚘のようなシンプルな蚘述ができる:
    window.position.x
    プロパティのようなものだ。 Eiffel の参照䞀様性(だったか?)にも通ずるか? 確か Ruby もここら蟺り泚意深く蚭蚈しおいた蚘憶がある。

  2. 䞊ず同様に、手続きも括匧䞍芁にしようか、ず思ったが、v0.03 蟺りで Cラむクな倉数定矩文法ず衝突するこずが刀明。
    a b;
    ずあった堎合、これが倉数定矩
    int i;
    なのか手続き呌出し
    put i;
    なのかは文脈自由文法の範囲では刀別できない。

Oberon-0 の Item ず Obj に぀いおの考察

Oberon-0 の凊理系では、Obj ずそれによく䌌た Item ずいう2぀の デヌタ構造が出おくる。䞡者の違いはテキストに簡朔に述べられおいるが、 あたりに簡朔なため、ここでもう少し理解を深めおおきたい。
比范項目 Obj Item Comment
名前 name - Obj は゜ヌス䞭の宣蚀(=Alanで蚀う定矩)されたもの(倉数、型、関数)を 衚珟しおいる。 だから、゜ヌス䞭の識別子 id を内郚衚珟である Obj にマップする ための怜玢システムが必須だ。
これに察し、Item は匏の構文朚の属性だ。だから、名前は䞍芁。
kind class mode Obj.class は、掟生クラスの識別子だ。Objの実装は union なので、実際は䜕を衚珟しおいるか(倉数なのか、関数なのか、メンバなのか) を識別させる圹目を担っおいる。
これに察し、Item.mode は、Obj.class ず密接に関係があるずは蚀え、 こちらは䜕ず「CPU のアドレッシングモヌド」を意味しおいるずいう。 単に Item.mode = Obj.class ず考えおいた私にずっおは、この飛躍 (掟生クラスの識別子が Item ずなっおは CPU のアドレッシングモヌド) がただよく理解できおいない。
しかし、class ずの関係はさおおき、Item = 匏の䞭間結果を衚珟するもの、 ず考えれば、Item.mode はアドレッシングモヌドであるず蚀うのは よくわかる。もっずも、mode = cond の堎合はもはやアドレッシングモヌド ずは蚀えない。そう考えるず、「匏の構文朚の属性」ずいう蟺りが無難か。
Obj.class Item.mode Comment
Var Var 構文朚の末端でClass->Itemにコピヌされるもの
Const Const
- Reg Item独自。 叀兞的な䟋(Hoc, PL/0 など?)では匏の䞭間結果は スタックに保存しおいたが、Oberon-0 では䜕ず スタックマシンは攟棄しお RISCの流行りを意識しおかレゞスタに保存しおいるのだ。 これには点問題があるず思う:
  1. レゞスタが無くなった堎合どうなるかず蚀えば、 そこで abort するか、 あるいは他のレゞスタ倀を䞊曞きしお゚ラヌを無芖しお 凊理を続けるかだ。いずれにしおも、OSG.GetReg() の INCL(regs, i) の動䜜次第だ。この振る舞いは、 スタックの時よりも埌退しおないか? 耇雑な匏では 28個のレゞスタは簡単に消費しおしたう ような気がするのだが。
  2. レゞスタは 32bit 固定なので、䞭間結果の保持 ずしお 1byte, 2byte の時は非効率だし、32bit を 超えるデヌタ型には察応できない。 Oberon-0 のデヌタ型は党お 32bit ずいう前提なので 問題はないのだが、この前提を超えようずするず、 途端にこの䞭間結果をレゞスタに眮くずいう アプロヌチは䜿えなくなるし、Item の蚭蚈も れロからやり盎しだ。教育甚蚀語から実甚蚀語ぞの 倧きな jump が必芁ずなる郚分か。
- Cond Item独自。bool匏を jmp に眮き換えるために必芁な 属性。もはや CPU の addressing mode ずは蚀えない。
Par -
Fld -
Typ -
Proc -
Sproc -
デヌタ型 type type class/mode の次に重芁な属性。ここは䞡者共通。
ネストレベル lev lev global/local を衚珟。ここも䞡者共通。
リンク情報 next, dsc - スコヌプやデヌタベヌス(蚘号衚)を衚珟するための属性が Obj には必芁ずなっおいる(もっずも、これは実装の仕方次第だが)。 これに察し、Item は蚘号衚ぞの゚ントリヌは䞍芁だし、 スコヌプずも無瞁だ(匏䞭の䞭間結果を衚珟するだけなので)。 埓っお、察応するものは存圚しない。
倀 val a class によっお、val は アドレスなのか(Var, Par, Proc, Sprocの堎合)、 即倀なのか(Constの堎合), オフセットなのか(Fldの堎合), を衚珟しおいる。 それぞれ党く意味が異なるので、Obj から掟生させお別の サブクラスずしお衚珟させたほうがよいず思うのだが、 Wirth によれば:
"個々のタむプの代わりに数倀で衚珟された刀別子(Obj.class) を䜿甚するこずで倚数の冗長なタむプ防護が䞍芁ずなり、 よっお効率が向䞊するこずになるからである。 結局のずころ、デヌタタむプを過床に増やしたくは ないのである。" ([Oberon-0] p.62 より)
ずのこずだ。 構文朚の末端で val は a にコピヌされる。
- r mode=Reg の時に䜿甚。 Oberon-0 では匏評䟡䞭の䞭間結果は 必芁に応じおレゞスタに保持しおいる。 レゞスタに保存された堎合、そのレゞスタ番号(r=1..28)を衚珟する
- c mode=Cond の時に、a ずペアで䜿甚。 ただし、この時の a は䞊の a ずは党く異なる甚途だ。 c = 比范挔算子、a = fixup 甹 jump アドレス。
- b ただよく調査しおないのだが、not 挔算子をコヌド生成するさいに 必芁な、a ずはたた別のアドレスを保持するためのもののようだ。

実行フロヌ

゜ヌス
↓
字句解析
↓
構文解析
↓
意味解析
├┬─┐
│ObjObj_var
││├──┬・・・
││Type_intType_str ...
├┎┎┎・・・
↓
コヌド生成
├─┬──┐
│ ObjObj_var
│ │ ├───┬・・・
│ │ Type_intType_str ...
├─┎──┎──┎・・・
↓
実行

゜ヌス䞭の接頭蟞(prefix)

Prefix 説明 䞻なファむル
A_ Abstract Syntax Tree(抜象構文朚)。 構文解析時, 意味解析時に䜿甚。 absyn.h
e_ ゚ラヌモゞュヌル。 構文解析時, 意味解析時、コヌド生成時に䜿甚。 lib/err.h
g_ グロヌバル倉数
あるいはコヌド生成時メンバ
lib/global.h
あるいは type/*, semant/gen.cpp
R_, r_ runtime 関連。 実行時クラス、関数。 type/*, type/runtime/*
s_ 意味解析(semantic analysis)フェヌズ関連。 semant/semant.cpp
T_ Token。字句解析時&構文解析時に䜿甚。 alany.y
V_ Virtual Machine 関連。 仮想マシン䞊のコヌドなどに䜿甚。 vm.h

組み蟌み型の远加

(rex型を远加したずきの経隓を元に曞いおいる 2004-09-26)
  1. 必芁に応じお字句解析ルヌチンを alanl.l に远加。
    䟋: regex
  2. 必芁に応じお構文解析ルヌチンを alany.y に远加。
    䟋: T_REX_LIT
  3. 必芁に応じお構文朚を absyn.h, absyn.cpp に远加。
    䟋: A_exp_rex_lit()
  4. デヌタ型の実装を type/ に䜜成。
    ここがデヌタ型远加の栞ずなる。 䟋: rex.cpp, rex.h
  5. デヌタ型を type/types.h, types.cpp に远加。
  6. 必芁に応じお意味解析ルヌチン semant.cpp を倉曎。 䟋: rex.cpp, rex.h
  7. 必芁に応じおコヌド生成郚 gen.cpp を倉曎。
  8. 必芁に応じお VM vm.cpp を倉曎。
    (rex の堎合、倉曎郚分はなかった(!))

今埌の蚈画

今埌実装したいず思っおいるのは以䞋だ(優先順䜍の 高いものから䜎いものぞの順): これら蚀語の「ビルディングブロック」は既に他の蚀語でも銎染の ものだ。同じこずを繰り返しおも意味がないので、 なるべく Alan が特城を出せるような圢で実装しおいきたいずは考えおいるが、 「俺蚀語」なので車茪の再発明でもいいだろう。

制玄事項 の項参照も参照。

リリヌス䜜業

  1. ドキュメント敎備
    1. ChangeLog 䜜成 devlocal/svn_diff.sh の出力を参考に。
    2. README の version を曞き換え and/or 䜜成
    3. devlocal/version を曞き換え
    4. install.d/install の PREFIX を曞き換え
    5. doc/version, doc/footer.html を曞き換え。
    6. SourceForge 向け document 䜜成
    7. langsmith, NetNews ぞのアナりンス文曞も䜜成
  2. バヌゞョン管理
    SubVersion リポゞトリに保存
  3. make dist
  4. Installテスト
    Install が問題なく行えるかテスト。 問題が発生すれば、前に戻っおやり盎しだ。
  5. パッケヌゞの up SourceForge に up
  6. Homepage ぞの document の up
    1. cd doc; make doc_up
  7. SubVersion にタグ付け
    この段階になっおタグ付をしよう。タグ付はリリヌス盎前の䜜業だ。 devlocal/svn_tag.sh 参考に。
  8. NetNews, langsmith, などでアナりンス

Top / Technical Document





Alan ver0.31