問題タブ [compiler-theory]

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 投票する
6 に答える
1662 参照

c# - 命令型言語用のコンパイラーに対する関数型言語用コンパイラーの利点

この質問のフォローアップとして、C#に対するF#の組み込みの不変性の利点は何ですか?--F#コンパイラは、ほとんど不変のコードを処理していることを認識して、特定の最適化を行うことができると仮定して正しいですか?つまり、開発者が「Functional C#」と書いたとしても、コンパイラーは、開発者がコーディングしようとした不変性のすべてを知らないため、同じ最適化を行うことができませんでしたね。

一般に、関数型言語のコンパイラーは、命令型言語では不可能な最適化を行うことができますか?可能な限り不変性で記述された言語でさえも可能でしょうか?

0 投票する
1 に答える
551 参照

.net - System.Reflection.Emit を使用して .NET コンパイラを作成しようとしていますが、型解決を行うにはどうすればよいですか?

参照されている dll から型を解決するための戦略があります。コンパイル中のアセンブリで定義されている型を解決しようとして困っています。サードパーティのライブラリを使用せずに System.Reflection.Emit API を使用しています。

例えば:

B の A の参照を解決する最善の方法は何ですか?

これはどうですか:

クラスには互いのインスタンスが含まれています。

これを行うためのベストプラクティスの方法はありますか? 実装すべき設計パターンはありますか? System.Reflection.Emit ライブラリのみを使用することをお勧めしますが、これを行うためのより良い方法がある場合、またはそれらでこれを行うことができない場合は、他のライブラリを使用してもかまいません。

ありがとう

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

c - 「型とサイズの指定子」 - 用語

次のスニペットを見てください。

3行目の「char [6]」の正しい専門用語は? 私はそれを「型とサイズの指定子」と呼んでいますが、これは単にコンパイラが何のために使用するかを説明するものです。

3行目全体は、「関数の呼び出しスタック署名」または単に「関数署名」を呼び出すために使用します。「関数の実装」ではなく、「関数の宣言」または「関数のプロトタイプ」も正しいでしょう。

注: コール スタック、フレーム、呼び出し規約などについてすべてを説明する必要はありません。アル。私はそこで正しい用語を探しているだけです。3行目全体ではなく、「char [6]」のような単一の指定子を呼び出す方法のみ。

0 投票する
3 に答える
5787 参照

yacc - yacc:整数と浮動小数点数を区別する

2 + 2=4および2.2+2=4.2を実行するプログラムを作成することになっています。

すべてを浮動小数点として扱うようにすでに実行しましたが、それは「間違っています」。私はそれらを区別する必要があります。これが私がこれまでに持っているものです:

私が抱えている問題は、各式が持つことができるタイプは1つだけであるということです。現在、すべてが基本的にフロートであるため、操作は正しいものの、これは適切なソリューションではありません。

基本的にfactor_intとfactor_floatを使用して、より多くの式を定義し、その中のすべてを置き換えることを考えましたが、それは本当に間違っているようです。しかし、これをどのように行うかはわかりません。また、私が見たチュートリアルは実際には役に立ちませんでした。

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

compiler-theory - S属性およびL属性の文法とはどういう意味ですか?

コンパイラの本を読んでいるのですが、「S 属性の文法は L 属性の文法でもある」と書かれていて、ちょっと混乱しています。理解できませんでした。誰かがそれを明確にすることができますか (例は素晴らしいはずです)。ありがとう。

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

assembly - P6 アーキテクチャ - レジスタの名前変更はさておき、制限されたユーザー レジスタによって、スピル/ロードに費やされる操作が増えますか?

動的言語 VM 実装に関する JIT 設計を研究しています。私は 8086/8088 の頃からあまり組み立てを行っていません。ほんの少しだけです。

私が理解しているように、x86 (IA-32) アーキテクチャには、今日でも以前と同じ基本的な制限付きレジスタ セットがありますが、内部レジスタの数は大幅に増加していますが、これらの内部レジスタは一般的には利用できず、レジスタの名前変更で使用されます。他の方法では並列化できないコードの並列パイプライン化を実現します。私はこの最適化をかなりよく理解していますが、これらの最適化は全体的なスループットと並列アルゴリズムに役立ちますが、制限されたレジスターセットがまだ残っているため、x86 でレジスターが 2 倍または 4 倍になると、レジスターの流出オーバーヘッドが増加します。通常の命令ストリームでは、プッシュ/ポップ オペコードが大幅に少ない可能性があります。または、私が気付いていないこれを最適化する他のプロセッサの最適化がありますか? 基本的に私なら

研究、またはさらに良いことに、個人的な経験への言及はありますか?

編集:x86_64には16個のレジスタがあり、これはx86-32の2倍です。修正と情報に感謝します。

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

language-features - 言語とVM:最適化が難しい機能とその理由

研究プロジェクトの準備として、機能の調査を行っています。

最適化するのが難しい主流の言語または言語機能に名前を付け、その機能が支払った価格に見合う価値がある、または価値がない理由を挙げてください。あるいは、事例証拠を使って以下の私の理論を暴くだけです。誰かがこれを主観的なものとしてフラグを立てる前に、言語や機能の具体例、これらの機能の最適化のアイデア、または私が考慮していない重要な機能を求めています。また、私の理論が正しいか間違っているかを証明する実装への参照。

最適化が難しい機能と理論のリストのトップ(私の理論のいくつかはテストされておらず、思考実験に基づいています):

1)ランタイムメソッドのオーバーロード(別名マルチメソッドディスパッチまたは署名ベースのディスパッチ)。ランタイムの再コンパイルやメソッドの追加を可能にする機能と組み合わせると、最適化するのは難しいですか。それとも、とにかく難しいですか?コールサイトのキャッシュは、多くのランタイムシステムで一般的な最適化ですが、マルチメソッドを使用すると複雑さが増すだけでなく、インラインメソッドの実用性が低下します。

2)タイプモーフィング/バリアント(変数ベースではなく値ベースのタイピング)基本ブロックで何かのタイプが変更できるかどうかわからない場合、従来の最適化は単純に適用できません。マルチメソッドと組み合わせると、インライン化は慎重に行う必要があります。おそらく、呼び出し先のサイズの特定のしきい値に対してのみ行う必要があります。すなわち。単純なプロパティフェッチ(ゲッター/セッター)のインライン化を検討するのは簡単ですが、複雑なメソッドのインライン化はコードの膨張を引き起こす可能性があります。もう1つの問題は、型情報を持ち歩く必要があるため、またはすべての変数に1ではなく2つのレジスタが必要なため、レジスタにバリアントを割り当ててネイティブ命令にJITすることができないことです。IA-32では、これは不便です。 x64の追加レジスタで改善されました。これは、プログラマーの観点から非常に多くのことを単純化するので、おそらく動的言語の私のお気に入りの機能です。

3)ファーストクラスの継続-それらを実装する方法は複数ありますが、私は最も一般的なアプローチの両方でこれを行いました。1つはスタックコピーであり、もう1つは継続渡しスタイル、サボテンスタック、コピーオンライトスタックフレームを使用するランタイムを実装する方法です。とガベージコレクション。ファーストクラスの継続には、リソース管理の問題があります。継続が再開された場合に備えて、すべてを保存する必要があります。「意図」を持って継続を残すことをサポートしている言語があるかどうかはわかりません(つまり、「私はここに戻ってこないので、この世界のコピーを破棄してもかまいません」 )。スレッドモデルと継続モデルでプログラムしたので、どちらも同じことを達成できることはわかっていますが、継続は エレガンスはランタイムにかなりの複雑さを課し、キャッシュの効率にも影響を与える可能性があります(継続とコルーチンを使用すると、スタックの局所性がさらに変化します)。もう1つの問題は、ハードウェアにマップされないことです。継続を最適化することは、あまり一般的でないケースを最適化することであり、私たちが知っているように、一般的なケースは高速であり、あまり一般的でないケースは正しいはずです。

4)ポインタ演算とポインタをマスクする機能(整数での格納など)これを投入する必要がありましたが、実際にはこれがなくても簡単に生活できました。

私の気持ちは、特に動的言語の高レベルの機能の多くは、ハードウェアにマッピングされていないということです。。マイクロプロセッサの実装には、チップ上の最適化の背後にある数十億ドルの研究がありますが、言語機能の選択により、これらの機能の多くが無視される可能性があります(キャッシング、レジスタへのスタックのトップのエイリアシング、命令並列処理、リターンアドレスバッファ、ループなどの機能)バッファと分岐予測)。マイクロ機能のマクロアプリケーションは、一部の開発者が考えるように必ずしもパンアウトするわけではなく、VMに多くの言語を実装すると、ネイティブopsが関数呼び出しにマッピングされることになります(つまり、言語が動的であるほど、ルックアップする必要があります/実行時にキャッシュするため、何も想定できないため、命令の組み合わせは、従来よりも高い割合の非ローカル分岐で構成されています。静的にコンパイルされたコード)そして私たちが本当にうまくJITできる唯一のことは、非動的型の式評価と定数型または即時型の操作です。このため、バイトコード仮想マシンとJITコアが特定の言語に対して常に正当化されるとは限らないというのが私の直感です。

私はあなたの答えを歓迎します。

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

compiler-construction - 最新のコンパイラと古いコンパイラは何で書かれていますか?

インタープリター以外のコンパイラーは、入力を変換するだけで実行する必要はありません。それ自体のパフォーマンスは、インタープリターの場合ほど問題になることはありません。したがって、インタープリターを作成することはありません。たとえば、Ruby や PHP では遅すぎるためです。

しかし、コンパイラはどうですか?

スクリプト言語でコンパイラを作成する場合、おそらく迅速な開発を特徴とするものでさえ、ソース コードと初期開発時間を半分に削減できる可能性があります。少なくとも私はそう思います。

確かに: スクリプト言語とは、通常、少なくともプログラマーにとって、プログラミングをより速く、より簡単に、より楽しくする典型的な機能を備えたインタープリター言語を意味します。例: PHP、Ruby、Python、JavaScript の可能性もありますが、コンパイラの選択としては奇妙かもしれません。

  • コンパイラは通常何で書かれていますか? C、C++、またはアセンブラーのような低レベルのもので応答すると思いますが、なぜですか?

  • スクリプト言語で書かれたコンパイラはありますか?

  • コンパイラの記述に低レベルまたは高レベルのプログラミング言語を使用することの (欠点) 利点は何ですか?

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

compiler-construction - 二項演算のIRツリー表現

私は次のような簡単な操作をします:

それのIRツリー表現は何でしょうか?
これまでのところ私は思いついた:

しかし、NAMEにMEMが必要かどうかはわかりません。どんな助けでも歓迎します。

私たちが使用する表記法は、このpdfとまったく同じです:http: //www.computing.dcu.ie/~hamilton/teaching/CA449/notes/translate.pdf

これは、Javaブックの最新のコンパイラ実装からのものです。