問題タブ [compiler-construction]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
5 に答える
329 参照

c# - コンパイラは、インターフェイスと例外の間でオーバーロードを選択できませんでした

XML解析の場所参照を提供できるexcpetionクラスを使用しようとすると、興味深い動作が見つかりました。コンパイラは、XmlReaderをパラメータとして渡そうとしたときに、インターフェイスを消費するオーバーロードとSystem.Exceptionを必要とするオーバーロードのどちらかを選択できませんでした。

詳細は次のとおりです。

そして、正しいオーバーロードを選択できなかったために失敗しますが、なぜですか?XmlReaderがインターフェースをサポートしており、System.Exceptionから継承されていないことがわかります。

0 投票する
2 に答える
229 参照

c# - Visual Studio/C# でコンパイル時に "this" と "base" の使用を強制する

クラスを拡張するとき、基本クラスのメソッドにアクセスするときにbase( VB では) キーワードを使用すると、非常にわかりやすいと思います。MyBaseまた、基本クラスを拡張するクラスの関数にアクセスするときのthis( VB の) キーワード。Meこれは、継承のない「フラット」構造にも当てはまります。

私はこれを読む方が簡単だと思います:

これより:

さて、私の質問は次のとおりです。コードでこれらのキーワードを使用しない場合、コンパイラがエラーまたは警告をスローするように、Visual Studio/C# でコンパイル時にthisandの使用を強制することは可能ですか?base

0 投票する
18 に答える
11772 参照

c++ - C / C++ コンパイラの警告: すべてのコードをクリーンアップして削除しますか、それとも残しますか?

私は多くのプロジェクトに取り組んできましたが、他の人からコードを更新してもらいました。多くの場合、それをコンパイルすると、約 1,000 以上のコンパイラ警告が表示されます。コンパイラの警告を見ると汚いと感じるので、最初のタスクはコードをクリーンアップしてすべて削除することです。通常、初期化されていない変数など、約12の問題を見つけます。

なぜ人々がそれらをそのままにして、警告なしで完全にクリーンなコンパイルを行わないのか理解できません。何か不足していますか?それらを残す正当な理由はありますか?共有するホラーストーリーはありますか?

0 投票する
18 に答える
14914 参照

compiler-construction - 興味深いコンパイラ プロジェクト

私は現在、今後 8 週間にわたって行われる大学院レベルのコンパイラ コースのプロジェクトを選択している最中です。最適化に関連することはあまりしたことがないのでやりたいと思っていますが、この分野のことならなんでも結構です。

これまでに行った中で最も興味深いコンパイラ関連のプロジェクトは何ですか? あなたは何から最も多くを学びましたか?


編集:素晴らしい提案をありがとうございました。この度は、長らく更新を滞らせてしまい申し訳ございませんでした。

私が最終的に行ったプロジェクトは、LLVM での単純な自動ベクトル化の最適化でした。LLVM にはベクトル型がありますが、フロントエンドのサポートなしではそれらを利用する方法がないように思われました。この最適化により、通常のスカラー コードがベクトル コードに変換されました。

自動ベクトル化は実装がかなり難しい最適化であるため、可能な限りスコープを制限しました。まず、コード内の命令レベルの並列性を明らかにするために、基準に一致する 1 ブロック ループを探し、それらを特定の回数展開して、簡単にベクトル化できるようにしました。次に、Larsen と Amarasinghe によるマルチメディア命令セットによるスーパーワード レベルの並列処理の活用で説明されているパッキング アルゴリズムを実装しました。

この最適化の単純化されたバージョンでさえ、かなり複雑です。多くの制約があります。たとえば、ループの外に存在する変数をベクトル化する必要はありません。これは、プログラムの残りの部分がスカラーであると想定しているためです。ここ数週間、私たちは多くの時間を費やしてきました。このプロジェクトはとても楽しかったですが、多くのことを学びました。

0 投票する
7 に答える
4129 参照

parsing - 動的 (?) パーサー

実行時に AST/parse ツリーを生成するパーサーはありますか? EBNF文法の文字列または類似のものを受け入れてデータ構造を吐き出すライブラリのようなものですか?

  • 私はantlr、jlex、およびそれらの同類を認識しています。彼らはこれを行うことができるソース コードを生成します。(コンパイルステップをスキップしたい)
  • 私はBoost::Spiritを知っています.C++構文でいくつかの黒魔術を使用して、実行時にそのようなものを生成します(間違いなく私が望むものにはるかに近いですが、C++に関しては私は困っています.そして、それはまだいくらかです.文法がハードコードされているため、制限されます)
  • PythonやRubyについては何も知りませんが、コンパイラコンパイラはそのような言語で非常に効果的かもしれません...

今、私はパーサーコンビネーターを認識しています。(ありがとう、ジョナス) そしていくつかのライブラリ (ありがとう、エリベン)

ついでに、 Parsing Expression Grammarsにも最近気付きました。誰かがそれを実装するとクールに聞こえます (彼らは Perl 6 にはそれがあると言っていますが、Perl は私の理解を回避しています)。

0 投票する
2 に答える
13488 参照

.net - .NET のクラス ローダーに相当するもの

.NET で「Java カスタム クラス ローダー」に相当するものを定義できるかどうかは誰にもわかりませんか?

少し背景を説明するには:

「Liberty」と呼ばれる、CLR を対象とする新しいプログラミング言語を開発中です。この言語の機能の 1 つは、「型コンストラクター」を定義する機能です。これは、コンパイル時にコンパイラーによって実行され、出力として型を生成するメソッドです。それらはジェネリックの一種の一般化であり (言語には通常のジェネリックが含まれています)、次のようなコードを ("Liberty" 構文で) 記述できます。

「タプル」は次のように定義されています。

この特定の例では、型コンストラクターtupleは、VB および C# の匿名型に似たものを提供します。

ただし、匿名型とは異なり、「タプル」には名前があり、パブリック メソッド シグネチャ内で使用できます。

これは、最終的にコンパイラによって出力される型を複数のアセンブリ間で共有できるようにする方法が必要であることを意味します。たとえば、私はしたいです

tuple<x as int>tuple<x as int>アセンブリ A で定義され、最終的にアセンブリ B で定義されたものと同じ型になります。

もちろん、これの問題は、アセンブリ A とアセンブリ B が異なる時間にコンパイルされることです。つまり、どちらも、タプル型の互換性のない独自のバージョンを発行することになります。

これを行うためにある種の「型消去」を使用することを検討したため、次のような型の束を持つ共有ライブラリが作成されます (これは「Liberty」構文です)。

次に、i、j、および k タプル フィールドからのアクセスを 、 、および にリダイレクトField1Field2ますField3

ただし、それは実際には実行可能なオプションではありません。これは、コンパイル時tuple<x as int>tuple<y as int>は と が異なる型になることを意味しますが、実行時には同じ型として扱われます。これは、等価性や型の同一性などに多くの問題を引き起こします。それは私の好みにはあまりにも抽象的すぎます。

他の可能なオプションは、「ステート バッグ オブジェクト」を使用することです。ただし、状態バッグを使用すると、言語で「型コンストラクター」をサポートするという目的全体が無効になります。「カスタム言語拡張機能」を有効にして、コンパイラが静的な型チェックを実行できるコンパイル時に新しい型を生成できるようにするという考え方があります。

Java では、カスタム クラス ローダーを使用してこれを行うことができます。基本的に、タプル型を使用するコードは、実際にディスク上で型を定義しなくても発行できます。次に、実行時にタプル型を動的に生成するカスタム「クラス ローダー」を定義できます。これにより、コンパイラ内で静的な型チェックが可能になり、コンパイルの境界を越えてタプル型が統一されます。

ただし、残念ながら、CLR はカスタム クラスの読み込みをサポートしていません。CLR でのすべての読み込みは、アセンブリ レベルで行われます。「構築された型」ごとに個別のアセンブリを定義することは可能ですが、それはすぐにパフォーマンスの問題につながります (型が 1 つしかないアセンブリが多数あると、リソースが多すぎます)。

だから、私が知りたいのは:

.NET で Java クラス ローダーのようなものをシミュレートして、存在しない型への参照を発行し、それを使用する必要があるコードを実行する前に、実行時にその型への参照を動的に生成することはできますか?

ノート:

*実際には、質問への回答は既に知っています。以下に回答として提供します。ただし、解決策を見つけるために、約 3 日間の調査と、かなりの IL ハッキングが必要でした。他の誰かが同じ問題に遭遇した場合に備えて、ここに文書化することをお勧めします. *

0 投票する
5 に答える
593 参照

delphi - バージョンを入力パラメーターとして受け取るDelphi用のFOSSバッチコンパイルソリューションはありますか?

バージョンを入力パラメーターとして受け取るDelphi用のFOSSバッチコンパイルソリューションはありますか?

私はDelphi7を使用していますが、これは依然として最も面倒な操作です。これを簡単にするための他の解決策、回避策はありますか?

0 投票する
11 に答える
20191 参照

windows - GCC-Windows が cygwin に依存するのはなぜですか?

私は C++ 開発者ではありませんが、常にコンパイラに興味があり、GCC の一部 (特に LLVM) をいじることに興味があります。

Windows では、GCC を正しく実行するには POSIX エミュレーション レイヤー (cygwin または MinGW) が必要です。

何故ですか?

私は、C++ で記述され、さまざまなプラットフォーム (Subversion、Firefox、Apache、MySQL) 用にクロスコンパイルされた他の多くのソフトウェアを使用していますが、いずれも cygwin や MinGW を必要としません。

C++ のベスト プラクティス プログラミングに関する私の理解では、プラットフォームに中立なコードを適度に記述し、コンパイル プロセス中にすべての違いに対処できるということです。

では、GCC との契約はどうなるでしょうか。Windows でネイティブに実行できないのはなぜですか?


編集:

さて、これまでの2つの回答は、基本的に「GCCはposixヘッダーを使用するため、posixレイヤーを使用します」と言っています。

しかし、それは実際には質問に答えません。

お気に入りの標準ライブラリ用の一連のヘッダーが既にあるとしましょう。なぜまだ posix ヘッダーが必要なのですか?

GCC は、実際にRUNするために cygwin/mingw を必要としますか?

それとも、ヘッダーとライブラリのエミュレーション レイヤーだけが必要ですか? もしそうなら、必要なリソースを含む「lib」ディレクトリを与えることができないのはなぜですか?


もう一度編集:

わかりました、私は質問を明確にするためにもう一度試みます...

また、D プログラミング言語でコードを書きます。公式のコンパイラは「dmd」という名前で、Windows と Linux の両方に公式のコンパイラ バイナリがあります。

Windows バージョンでは、POSIX エミュレーションは一切必要ありません。また、Linux バージョンでは、Win32 エミュレーションは一切必要ありません。コンパイラがその環境に関する仮定を持っている場合、コンパイラはそれらの仮定をかなりうまく隠します。

もちろん、標準ライブラリの場所と、静的または動的にリンクするライブラリの場所をコンパイラに指示する必要があります。

対照的に、GCC は posix 環境で動作しているふりをすることを主張し、エミュレーション レイヤーをセットアップすることによって、これらの仮定をユーモアを交えて表現するように ME に要求します。

しかし、正確には、GCC 内でその層に依存しているものは何でしょうか? stdlib ヘッダーを探しているだけで、「/usr/lib」内にそれらのヘッダーが見つかると想定していますか?

その場合、「C:/gcc/lib」を調べてそれらのヘッダー ファイルを見つけるように指示することはできませんか?

それとも、GCC 自体が POSIX ライブラリに依存してファイル システムにアクセスする (およびその他の低レベルの操作を行う) のでしょうか。そうであれば、お気に入りの Windows POSIX ライブラリに静的にリンクしないのはなぜだろうか。ユーザーが依存関係をアプリケーションに直接組み込むことができるのに、なぜユーザーが依存関係をセットアップする必要があるのでしょうか?

0 投票する
9 に答える
46969 参照

c++ - 再帰関数をインライン化できますか?

これを読んでいると、コンパイラによって正しく処理されない場合、上記のコードが「無限コンパイル」につながることがわかりました。

コンパイラは関数をインライン化するかどうかをどのように決定しますか?

0 投票する
14 に答える
41878 参照

compiler-construction - 独自の言語でコンパイラを作成する

直観的には、言語のコンパイラFoo自体は Foo で記述できないように思われます。より具体的には、languageの最初のFooコンパイラは Foo で記述できませんが、後続のコンパイラはFoo.

しかし、これは実際に本当ですか?最初のコンパイラが「それ自体」で書かれた言語について読んだ、非常に漠然とした記憶があります。これは可能ですか?