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! 禁止されないことを願っています :(