アカウント名:
パスワード:
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
一つのことを行い、またそれをうまくやるプログラムを書け -- Malcolm Douglas McIlroy
懐かしい! (スコア:1)
便利なグラフィックライブラリとMS-Cよりも早いコードを吐くので良く使ってましたが、その後お客さんから
「MS-Cで開発してくれ」
という注文が多くなり次第に使わなくなってしまいましたが、個人的には好きでしたね。
Re:懐かしい! (スコア:2, 参考になる)
多少の無理を承知で、1Pass時に一気にコード生成をしてしまうため、
コンパイルが驚速だったので「Turbo」という名前だったような。
普通は最初の1Pass目で飛び先を調べて、次の2Pass時にコード生成なんですが、
これを一発で終わらせてしまうのが早さの秘密だったのですよね。
正直、名前だけのTurboだったらイヤだな。
Re:懐かしい! (スコア:0)
>コンパイルが驚速だったので「Turbo」という名前だったような。
PASCAL はそうでしたね。C は違いますが。
Re:懐かしい! (スコア:4, 参考になる)
・Pascal
前方参照が許されない→1pass で構文解析を完了できる
・C言語
前方参照が許されるため、1passでは構文解析を終わらせられるとは限らない
という違いはありますね。
で、うろ覚えなのですが 初期の Turbo C は1passでコード生成までやってたはず。
不明なとこは、後でコード生成されるのを前提にラベルふってまる投げしてたんだっけ。
pascal に比べればコンパイルは遅かったですが、それでも
MS C など UNIX からの伝統通り、
Preprocessor → parser → code generator → assembler
というステップを踏むコンパイラに比べると、
格段にコンパイル速度が速かったです。
Re:懐かしい! (スコア:0)
1)より短いアドレス間の分岐を前提とした相対アドレス分岐
2)セグメント範囲内で有効な絶対アドレス分岐
3)セグメントを超えてまたがる遠距離分岐
以上のような種類があり、それらによって命令バイト数が異なるのが特徴です。
まだメモリが高価だった当時は、如何にしてコードサイズを縮小できるかが課題であり、
それには1)の相対アドレス分岐が採択されることが望ましいわけです。
しかし前方参照や他のオブジェクトファイルへの参照では、相対アドレスで表現可能な
範囲に収まっているかどうかの判断が付きかねます。
そこでとりあえず、2)の絶対アドレス分岐命令でもって仮コンパイルを済ませて、
分岐元と先の距離を求め、相対アドレスの範囲内であると判断できれば、
再度コンパイルパスを繰り返し、1)の相対アドレス分岐命令に置き換えようとします。
それで更にまた距離が縮まって、相対アドレスに置換可能な分岐命令が増えるかもしれません。
こうして全ての分岐が解決するまで繰り返せばいいのですが、当然それはパスを何回か
繰り返すことであり、それだけ時間がかかります。
確かTurboでは、ラージモデル未満のメモリモデルにおいて、2)の絶対アドレス分岐に
固定してしまうことで、命令のバイト長を解決する手間を省き、1パスコンパイルという
高速化を実現していたはずだったと思います。