0

C++ のモジュールについては、常にいくつかの話題がありました。しかし、昨日(昨日だけだったのは残念です)、C++モジュールの提案へのリンクでこのスレッドに出会いました。

それは「ボーイ・オー・ボーイ!最後に、実現やデザイン、そしていくつかの興味深いアイデアについて何かがあるだろう...」のようなものでした.

その瞬間、私はさらなる怒りを許してくれるように頼まなければなりません...

私はそれを二度読んだ。

著者が言うように、次の利点があります。

• 大規模なプロジェクトのビルド時間を大幅に改善します (Olalal i でもあります!それは素晴らしいことです...)

• インターフェイスと実装をより適切に分離できるようにする

• 既存のライブラリに実行可能な移行パスを提供する

• マクロ干渉からの保護

• プライベート メンバーからのシールド

• 初期化順序の保証の改善

• 未診断の ODR 問題の回避

• グローバル最適化プロパティ (例外、副作用、エイリアス リークなど)

そして他の何人かは、テキストのアルゴンに言及しました。

(また怒りっぽい口調ですみません)

うーん...正直に言うと、インポート/エクスポートでの彼のトリックがどのように見えるかはあまり気にしません(混乱するかどうかは問題ではありません)、可視性、非表示などは気にしません。 Java などに存在する static init ブロック。

しかし、主な目標、モジュールのコアはコンパイル速度であるべきです。

• 大規模プロジェクトのビルド時間を大幅に改善

コンパイル速度が向上しないこれらの動きはすべて役に立ちません。そのドライブル。

私が言ったように、私はそれを2回読みました。

そして、高速化を達成するためにモジュールを実装するホットについては、絶対に何も役に立ちません。私はただ「何?冗談ですか?」でした。

引用: モジュールは、テキスト インクルージョン メカニズム (処理時間は含まれるコードの量に比例する) をプリコンパイル済みモジュール アタッチメント メカニズム (インポートされた宣言の数に比例する処理時間) に置き換えることで、この問題に対処します。プライベート モジュールの定義が変更されたときに、クライアントの翻訳単位を再コンパイルする必要がないというプロパティを保持できます。

私たちは目標を知っています。しかし、「そうあるべき」以外に何かあるでしょうか。

提案の目標は、「彼はそのアイデアについてどう思いますか?」と言うだけです。しかし、私はRFCのようなものがあるだろうと思っています. 私が間違っていたようです。

そのような状況の場合、私はコミュニティに非常に基本的な質問をいくつかしたかっただけです。なぜなら、言語の大部分と、今日のすべてのコンパイルおよびリンクメカニズムを最初から書き直さないとモジュールを実装する方法を本当に理解していないからです。本当に私は理解していません:(そして、そのような膨大な努力はそれだけの価値がありますか?これは完全に異なる言語になるでしょう...「進化したC ++」と言っている理由は何ですか?

言うまでもなく、モジュールを実現するには、それらのモジュールが記述されたある種のデータ形式、何らかのメタデータが必要です。Ok。プレーンテキストでもいいですよね?それは目的を果たしますが、NOC NO! そうすれば、コンパイル時に解析する必要がある別の import->import->ipmport プレーン テキスト チェーンが存在します。だから、バイナリデータがあるはずです:)わかりました。それは言語固有であり、クロスプラットフォームまたはプラットフォーム固有であるべきですか?

では、コード内のすべての #ifdef ブロックについてはどうでしょうか? ある種のプリコンパイルされたバイナリ データが存在する場合、それはプラットフォームに依存するか (そして世界中のすべての ifdef ブランチを含む超すべて)、または毎回再コンパイルする必要がある奇妙なモジュールになります。それは本当ではないようです。その点はどうですか?または、C ++ のモジュールと言って、プラットフォームに依存しないメタデータについてはまったく話していません。同じプロジェクトの再コンパイル段階でのみ役立つある種のプリコンパイル済みデータについて話しているだけですか? 実行時にいくつかのブランチを除外するための Java のようなマシンはありませんか?

一体どのようにしてそれを作成できたのでしょうか?レで主なアイデア:)

そして、そのすべてのライブラリの実装についてはどうですか? .dll、.a、.so? たとえば、今日ではソース+ヘッダー(+ヘッダー+ヘッダー+ヘッダー) -> obj -> バイナリがあります。そのチェーンの c++ モジュールの場所はどこですか? それはどのように見えるべきですか?ソース->obj+modules-> バイナリ? またはソース-> モジュール + モジュール-> objs-> バイナリ ?

何らかの方法でモジュールを実装すると、現在使用しているすべてのコンパイル プロセスに影響するようです。

要約すると、私は基本的な概念に興味がありますが、「ああ、コンパイル時間を短縮する必要があります」よりも建設的なものです-それは深刻ではありません! そして、それをどのように実現できるかについて、誰かが知識や概念を共有してくれることを願っています (または正しい方法を指摘してくれます)。

事前に Tnx! 禁止されないことを願っています :(

4

1 に答える 1

2

まず、N2073はかなり古いことに注意してください!私が知っている最新のモジュール提案はN3347です。もちろん、これは言語レベルの構造についてのみ述べています。同じことが、このトピックに関する他のすべての論文 (またはその他のトピック) にも当てはまります。言語標準は、言語の実装方法をまったく指定していません。C++ 標準で指定されているのは、言語のセマンティクスです。それがどのように実装されるかは、コンパイラの作成者次第であり、ソフトウェア開発プラットフォームを定義する人々にもある程度まで委ねられています。特定のプラットフォームに対して、異なるコンパイラがどのように相互運用するかの仕様が存在する場合があります。モジュールが言語標準に含まれる場合、ここでファイル形式などが定義されます。

とはいえ、言語レベルでモジュールを表現する方法に関するセマンティクスを指定すると、コンパイラーは効率的な表現を作成するために必要な力を得ることに注意してください (もちろん、正しく行われていることが前提です)。現時点では、奇妙な#define多くの宣言を回避し、特定のヘッダー内の宣言がどのように見えるかを完全に予測できなくする可能性があります。もちろん、まともなライブラリはユーザーができることを制限しますが、これらの制限はすべて言語仕様の範囲外です。安定した定義があるとすぐに、コンパイラーは、何らかの方法で以前に作成されたモジュールの適切な表現に基づいて、内部データ構造をロードすることができます。コンパイラ ベンダーは、特定のコンパイラ プロセス モジュールを作成する方法についても、ガイダンスをまったく必要としません。彼らは、他の誰よりも内部データ構造をよく知っています! ...そして、固定されたレシピは、とにかく一部のコンパイラベンダーでは機能しません。

モジュールのコンテンツの表現に関する注意: モジュール内の宣言の表現がテキストであるかバイナリであるかは、実際にはあまり重要ではありません: どちらの場合も、表現されるデータは同じであり、簡単に含めることができます。名前解決を行い、解析の癖を避けます。

モジュールは、標準の将来の改訂の議題の 1 つです。モジュールのステータスに関する情報はあまり見たことがありませんが、これは複数のコンパイラ ベンダーが関心を持っているトピックです。

于 2012-10-11T19:45:30.443 に答える