この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 14293|答える: 2

[C] C言語は非常に強力ですが、どの言語で書かれているのでしょうか?

[リンクをコピー]
掲載地 2019/09/28 16:51:21 | | |
「C自体は何言語で書かれているのですか?」

別の視点から見ると、C言語が動作する前にコンパイルされなければならず、ではC言語コンパイラはどこから来るのでしょうか? どの言語で書かれているのですか? もしC語で書かれているなら、先に卵があるのか、それとも鶏が先にあるのか?

1

世界にコンパイラが存在しないと仮定し、まず機械語から始めて、その方法を見てみましょう。

機械語はコンパイラを必要とせず、CPUが直接実行できます。

次にアセンブリ言語がありますが、アセンブリ言語は機械語の記憶法に過ぎませんが、実行するために機械語にコンパイルされる必要があるため、この最初のコンパイラを書くには機械語を使うしかありません(将来的には使われません)。

アセンブリ言語の問題は解決され、大きな前進となりました。現在、アセンブリ言語を使ってC言語コンパイラを書くことが可能となり、これはCコンパイラの祖先と言えます。

この祖先なら、どんなC言語のプログラムもコンパイルできるので、C言語自体でコンパイラを書くことはできますか? 祖先と合わせてまとめればいいのです。

さて、そんな層を重ねた後、ついにCで書かれたコンパイラができましたが、これは本当に厄介です。

この時点で、前のパッケージで書かれたCコンパイラは放棄できます。

もちろん、もしC以前の高水準言語、例えばパスカルが存在すれば、パスカルを使ってCコンパイラを書くことも可能です。

最初のパスカルのコンパイラはFortranで書かれたと言われています。 最初の高水準言語として、Fortranのコンパイラはアセンブリ言語で書かれるべきです。

2

ここにコンパイラに関する興味深い伝説があります:

伝説によれば、Unixの発明者の一人であるケン・トンプソンは、ベル研究所のどのUnixマシンにも自信を持って行き、自分のユーザー名とパスワードを入力し、ルート方式でログインできたそうです!

ベル研究所は才能に溢れており、他の大手企業もこの脆弱性を見つけることを誓い、UnixのCソースコードを読み解き、ついにログインバックドアを見つけました。バックドアをクリーンアップした後、Unixをコンパイルして実行しましたが、トンプソンはログインできました。

一部の人はコンパイラに問題があり、Unixのコンパイル中にバックドアが埋め込まれたため、Cでコンパイラを書き直し、新しいコンパイラでUnixを再コンパイルしたのではないかと考えています。

それでもうまくいきません。トンプソンはrootでログインできて、本当に大変です!

後にトンプソン自身が秘密を解き明かしました。これは最初に問題を抱えたCコンパイラであり、このコンパイラはUnixのソースコードをコンパイルする際にバックドアに埋め込まれます。それだけでは不十分です。さらに良いのは、もし新しいコンパイラをC言語で書くなら、必ずバイナリコードにコンパイルする必要があります。何をコンパイルするかは、トンプソンが最初に書いたコンパイラだけを使ってコンパイルします。つまり、あなたが書いたコンパイラは汚染されてしまい、コンパイラは再びUnixをコンパイルします。 バックドアも埋め込みます :-)

ちなみに、数年前のXcodeGhost事件を思い出します。これは単に非公式チャネルからダウンロードされたトロイの木馬がXcodeに埋め込まれ、XCodeがコンパイルしたiOSアプリが汚染され、ハッカーが違法な行為に利用したことを意味します。

このXCodeGhostはThompsonのものとはかけ離れていますが、ソフトウェアをダウンロードする際は正式な手続きを使い、公式サイトからダウンロードし、HTTPS標準を確認し、チェックサムを確認することを思い出させてくれます。

3

「私はHuiを使ってHello Worldの段落を書くのに、誰かが複雑なコンパイラを書けるのか?」と疑問に思うかもしれません。 これは可能でしょうか?

もちろん、Unixの第1世代が開発された当時はC言語がなく、ケン・トンプソンとデニス・リッチーが組立ラインを使ってUnixをタイプしました。   WPSの最初のバージョンは回族の邱伯君によって書かれ、ターボパスカルのコンパイラも回族のアンダースによって書かれ、神々の能力は一般の人には想像もつかない。

コンパイラの場合、「スノーボール」的な方法で開発することも可能です:

C言語を例に挙げると、最初のバージョンでは基本的なデータ型、プロセス制御文、関数呼び出しのみをサポートするC言語のサブセットを選択できます...... この部分集合をC0と呼びます。

次にアセンブリ言語でコンパイラを書き、その言語の部分集合C0だけを用意すれば、書きやすくなります。

C0言語は動作し、このサブセットを構造体、ポインタ、......を追加し、新しい言語C1を呼び出します。

C1言語のコンパイラは誰が書いているのですか?   当然ながら、それはC0です。

C1が動作したら、再び言語機能を拡張し、C1でコンパイラを書き、C2を取得します。

次にC3、C4があります......  最後に、完全なC言語が手に入ります。

このプロセスはブートストラップと呼ばれ、中国語ではブートストラップと呼ばれます。





先の:新しい.NET Core機能は単一ファイルの実行ファイルをリリースします
次に:なぜプログラマーは終わりのない残業をするのでしょうか?
掲載地 2019/09/29 9:27:54 |
C自体はどの言語で書かれているのでしょうか?
掲載地 2019/10/01 23:54:34 |
C自体はどの言語で書かれているのでしょうか?
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com