[OSASK 5237] GO計画(Re: gcc移植計画).

  こんにちは、川合です。

  まず最初にこの移植計画の名称についてです。

  今は単に「gcc移植計画」となっていますが、今後はこの見方を改め
て、「GO計画」の足がかりとしてgccを移植している、という風に進め
たいと思っています。それにともない、名称も変えようと思います。

  名称については、最初、「MinGO」(みんご)にしようと思っていま
した。つまり、MinGWのような方向性でOSASK版gccを作ろうと思ってい
たわけです。しかし、いろいろ考えていると、「gccを動かせるような
環境をどうにかして構築する」というよりも、「OSASKで動くgcc(Cと
C++)をどうにかして用意する」という感じになってきました。MinGW
は、gccにはほとんど手を加えずにうまくやっているようですが、僕が
やろうとしているのはその方向性ではないわけです。gccをOSASK向き
に改造してしまいたいわけです。

  そうなると、もうMinimalistを名乗る意味が希薄になると思います
し、それに方向性が違うのにMinGWと似たような名前にしたら、混乱
するだけでしょう。ということで、「GO」(じーおー)と名前を変え
ます。これから開発していくプログラムもGO-CとかGO-C++と呼んでく
ださい。

---

  さてそれでは具体的な開発の方向性を書きます。

  まずライセンスについてです。改変部分については川合堂ラインセ
ンス-01を適用します。一言で言ってしまえば、これに尽きます。

  もちろんGPLのコードが部分的に混ざっている以上、GOのバイナリ全
体としてはGPLです。しかしそのGPLの規定によって公開されるソース
は、GPL部分と川合堂ライセンス-01部分に分解します。もしこの分解
解釈がGPLの規定によって許されないなら、以下のようにします。

  1.書き加えた部分だけのソースをパッチとして(diffなどで分離さ
せる)、川合堂ライセンス-01で、しかも別の名前(たとえばGOKLとか
)でまずリリースする。

  2.そしてGOそのものは、GOKLとgccをマージしたものと解釈し、そ
れゆえにGOはgccとGOKLの派生物になります。そして川合堂ライセンス-
01とGPLによりGOのライセンスはGPLになります。

  3.これでGOKLだけをベースに開発する人にとっては、制限の強いGP
Lからは無関係でいられます。

  そして将来的には、GO全体が川合堂ライセンス-01だけで書けるかも
しれません。僕はもちろんそこまではできません。みなさんがどれだけ
GO計画に賛同するかで決まるでしょう。

---

  gccやMinGWは、たとえばg++.exeという実際のコンパイラ本体を作る
ことを主眼にしています。GOでは、そういう考え方をしません。GOが作
成するのは、以下の3つの関数です。

    void cpp0(struct STR_CPP0_INTERFACE *interface);
    void cc1(struct STR_CC1_INTERFACE *interface);
    void cc1plus(struct STR_CC1PLUS_INTERFACE *interface);

また、この3つの関数群の記述には条件が付きます。それは、

    「入出力方法は、メモリアクセスか、もしくは"GO_lib.h"で規定さ
      れる10個程度の関数しか使わない」

というものです。

  もちろん、いきなりこの状態に持っていくのはあまりに大変です。で
すから最初は、メモリと"GO_lib.h"しか使わない<stdio.h>や<stdlib.h
>などを用意します。これをかぶせれば、まあとりあえずソースをそれ
ほど大規模にいじらないで済むでしょう。

  予定では、たとえば<string.h>については、Gakuさんが以前作ってく
ださったものをそのまま使うつもりです。あれはメモリアクセスだけで
完結していて、外部の関数を使っていませんから。それにすでに川合堂
ライセンス-01になっているので、ライセンス上も問題無しです(あり
がたいことです)。

  "GO_lib.h"は主にファイルアクセス方法を提供します。ファイルアク
セスとは言っても、fread()などのバッファアクセス群ではなく、メモ
リマップトか、もしくはフルロード型のアクセスです。具体的に言うと
、

  unsigned char *GO_mmap(GO_FILE *gfp);

で定義される関数を呼び出すと、gfpで指定されたファイルがどこかの
アドレスに展開されて(とりあえず全部読み込まれたと思ってください
)、そのアドレスが返されます。ファイルサイズについては、gfp->siz
eで分かります。

  なお、"GO_lib.h"ではライトアクセスはサポートされません。生成し
たプリプロセス済みソースや、アセンブラソースなどはinterface->out
buf0で示されるアドレスへバイトデータとして書き並べるだけです。そ
してinterface->outbuf1で示されるアドレスを超えて書き込んではいけ
ないので、その場合はinterface->errcodeにGO_ERR_BUFOVERをセットし
てリターンします。エラー出力に関しても、interface->errbuf0とinte
rface->errbuf1を使います。

  また入力ファイルについても原則としてinterface->inbuf0に展開さ
れていますので、このGO_mmap()関数は、もっぱらインクルードファイ
ルを読み込むときだけ使います。

  こんな感じでGOが提供するcpp0()、cc1()、cc1plus()の3つの関数は
とにかく実行に際して必要になる環境依存がとても小さいです。後は、
コマンドライン部を解釈してこれらの3関数を呼び出すプログラムを作
って、さらに"GO_lib.h"に規定された10個程度の関数を実装すれば、O
SASKだろうと、win32だろうと、POSIXだろうと、実に簡単に移植でき
ることになります。newlib仕様などという豪華なライブラリは不要で
す。

  もう気づいた人もいるかもしれませんが、これはNASKの開発方法と
全く同じです。

---

  gccのソースは、いろいろなC言語環境でコンパイルできるように、非
常にたくさんの条件コンパイル部分を持っていますが、GOではそれをあ
えてなくしてしまってもかまわないとします。GOはGOでコンパイルでき
ればいいです。古いプロトタイプ宣言しかできないような処理系に対応
しなきゃいけないとか、そういうことは一切ありません。

  条件コンパイルの中でも、たとえばconstなデータを.textに置くかそ
れとも.dataに置くかなどの自由度はそのまま残しておきたいと思って
います。

  またcpp0()などの3つの関数を記述するに当たっては、取り扱う全て
のファイルサイズはunsigned intで表現可能であると想定することにし
ます。unsigned intで表現できないようなファイルサイズは全部を読み
込めないことになり、そもそもGOで扱う範疇を超えているためです。

  いまのところでは、こんな感じです。"GO_lib.h"の詳細については、
今日の夜か、明日の夜くらいには明確にしたいと思っています。

  それでは。

--
    川合 秀実(KAWAI Hidemi)
OSASK計画代表 / システム設計開発担当
E-mail:kawai !Atmark! imasy.org
Homepage http://www.imasy.org/~kawai/


ML番号でジャンプ
ML単語検索