Cプリプロセッサの起源は何ですか?


30

CプリプロセッサはCに接続されていますが、メイン言語とはまったく異なる構文を持っています。

  • 構文的に重要な空白(行の終わりはステートメントを終了し、マクロが置換リストの開始を決定した後のギャップ)

  • キーワードベースの代わりにブレースブロックのブロック、elif代わりにelse if

  • 宣言-反映-使用の代わりにキーワード主導の定義=、値の定義は不可

  • 代替文字列構文のヒント(#include <>vs #include ""

  • 怠evaluationな評価(Cのことは明らかですが、6.10.3.1は、重要ないくつかの場所で、マクロ展開の特定の順序を暗示していると読むこともできます)

まったくCのようには見えません!技術的に独自の言語ですが、常にCのほぼ統合された部分として使用されており、構文的に統合されないことは非常に奇妙に思えます。

ウィキペディアはその歴史について語っていません。Portland Pattern Repository にはパスの言及があります、Cの歴史を持つ他の人々によって設計されたという事実を超えて詳細に説明することはありません。より長く利用可能。

マクロエンジンとして、それは明らかに説明するだろうランタイム言語から非常に異なる意味があるいくつかの違いがではなく、視覚的なデザインの側面を(それがもともとあるものとして意図されていたかどうかも現代の目には不明だが可能な種類楽しみのこと置換システムでは、強力なオプティマイザーが登場する前に関数をインライン化するための「単なる」適切な方法であったか、またはそうであったかを確認できます。Cのようなセマンティクスが実際に出発点だった場合、最終的にC ++テンプレートになったものに近いものがマクロに向かってより論理的な進化を遂げたように感じますが、構文に関するよりも具体的な証拠はありません。

なぜこのように設計されたのか、クリエイターの影響がどのようなものだったのかについての記録はありますか?



@Mike omgありがとうございます。アーカイブに閲覧可能なエントリがないため、サイトのコンテンツは永遠に失われたと本当に思いました。
ルーシェンコ

回答:


17

http://www.jslint.com/chistory.html(デニスM.リッチーによる「C言語の開発」)。

他の多くの変更が1972-3年頃に発生しましたが、最も重要なのはプリプロセッサの導入であり、一部はAlan Snyder [Snyder 74]の促しでした、BCPLおよびPL / Iで利用可能なファイル包含メカニズムの有用性も認識しています。元のバージョンは非常にシンプルで、インクルードファイルと単純な文字列置換のみを提供していました。#includeおよび#define of parameterless macros。その後まもなく、主にマイク・レスク、そしてジョン・ライザーによって拡張され、引数付きマクロと条件付きコンパイルが組み込まれました。プリプロセッサは元々、言語自体のオプションの補助機能と考えられていました。確かに、ソースプログラムの最初に特別な信号が含まれていない限り、数年間は呼び出されませんでした。この姿勢は持続し、プリプロセッサの構文と他の言語の不完全な統合と、初期のリファレンスマニュアルの記述の不正確さの両方を説明しています。

上記の引用にリンクされている[Snyder 74]リファレンスのセクション4のアカウントから、Alan Snyderはポータブル(今日では「リターゲッタブル」と呼ばれる)Cコンパイラに取り組んでいたようです。おそらくこれがプリプロセッサを求める動機だったのでしょう。

しかし、言語としてのCプリプロセッサ自体の設計に関する追加の詳細は見つかりませんでした。


1
SnyderはMITからBell Labsに来ました。MIDASアセンブラには、DEFINE、IFDEF、およびIFNDEFのステートメントがあります。一致?
ラースブリンクホフ

0

アセンブリ言語では、CPPに非常によく似たマクロアセンブラプリプロセッサが非常に一般的だったことを付け加えます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.