問題タブ [compiler-development]
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.
c++ - 独自の C++ コンパイラに、テンプレート、ネストされたクラスなどを理解させるにはどうすればよいですか? C++ の強力な機能は?
私のグループでは、C ライクな言語のコンパイラを作成するのが大学の課題です。もちろん、愛する C++ の小さな部分を実装するつもりです。
正確なタスクは絶対にばかげており、講師はそれが自己コンパイル可能である必要がある(それ自体をコンパイルできる必要がある)と私たちに言いました-それで、彼はBoostやSTLなどのライブラリを使用しないつもりでした.
彼はまた、実装が難しいため、テンプレートを使用することを望んでいません。
問題は、テンプレートだけでなく、ネストされたクラス、名前空間、構文解析のレベルでの仮想関数テーブル?
PS私はC ++の初心者ではありません
compiler-construction - ループ分裂はシングルコアで機能しますか?
シングル コア プロセッサ用にコンパイルしている場合、いつループ分割/分散を使用する意味がありますか?
compiler-construction - Aノーマルフォームとは?
さまざまな中間形式について読んでいましたが、wiki のようなエントリ以外に A-normal 形式に関する情報を取得できません。ここの誰かがこれについて知っているか、それについて良いリソースを持っていますか?
parsing - コンパイラで前方参照を実装するにはどうすればよいですか?
Lex と YACC (実際には Flex と Bison) でコンパイラを作成しています。この言語では、任意のシンボル (C# など) への無制限の前方参照が可能です。問題は、識別子が何であるかを知らずに言語を解析できないことです。
私が知っている唯一の解決策は、ソース全体を lex してから「幅優先」解析を行うことです。これにより、クラス宣言や関数宣言などのより高いレベルのものは、それらを使用する関数の前に解析されます。ただし、これは大きなファイルの場合に大量のメモリを必要とし、YACC で処理するのは困難です (宣言/本文の種類ごとに個別の文法を作成する必要があります)。また、レクサーを手書きする必要があります (これはそれほど問題ではありません)。
効率についてはあまり気にしません (それでも重要ですが)。これは、完了したらコンパイラ自体を書き直すためですが、そのバージョンを高速にしたいと考えています (高速な一般的なLex/YACC では実行できないが、手動で実行できる手法については、それらも提案してください)。したがって、現時点では、開発の容易さが最も重要な要素です。
この問題に対する良い解決策はありますか? これは通常、C# や Java などの言語のコンパイラでどのように行われますか?
language-agnostic - さまざまな言語を認識し、それらを対応するコンパイラに送信するコンパイラ。可能?
asp.net、php、javaを橋渡しして一つのページにすることはできないかと考えていました。
実際、今のところそのようなものは必要ありません。いくつかの言語のいくつかの機能は優れていて、いくつかの機能や他の言語は優れているので、これらすべての機能を1つにまとめたらどうなるかを考えていました。
つまり、asp.net php と java の 3 つの言語すべてのコードを含むページを作成しています。
また
またはそのようなコンパイラは、コードのさまざまなセグメントを認識し、それらをコンパイラで実行するように送信して実行します。また、出力は XML の他の言語で認識および使用できます。
すべての言語が相互に作用するとは言っていません。ただし、XML を介して相互に対話できます。ただし、ファイルは、それぞれのコンパイラに送信されて実行され、最終的に親コンパイラに戻る、さまざまなプログラミング言語コードを持つ単一のエンティティとしてコンパイルされると言いたいだけです。
MSILなどの.netフレームワークで行われるように、さまざまな言語コードを認識してコンパイラに送信できるコンパイラを考えています。
lexical-analysis - オブジェクト指向スキャナー(字句解析)とは何ですか?
最近、「オブジェクト指向スキャナー」と呼ばれる字句解析の概念に出くわしましたが、通常のスキャン手法と区別することができませんでした。オブジェクト指向スキャナーで余分なことは何でしょうか。この概念を理解するのを手伝ってください...字句解析の観点からオブジェクト指向とは何でしょうか。
optimization - 一時変数の数を減らす
コンパイラのようなものを書いています。問題は次のとおりです。一連の割り当てで構成されるコードがあります。
「t」変数のほとんどは一時的なものです。一時変数の数を減らし、可能な限り再利用したいと考えています。したがって、コードを再配置し、式をグループ化し、変数の割り当てにできるだけ近い変数を持たせる必要があるため、これらの式を計算した後、変数を再利用できます。もちろん、この手順ではコード ロジックを保持したいと考えています。これを行うのに最適なアルゴリズムはどれですか?
compiler-construction - コンパイラプロジェクトを開始する前にREADME
基本的に、それは最初の夢です...私はいつか自分のプログラミング言語を持っているかもしれません!、しかし、コンパイラの構築方法を探した直後に、すぐに悪夢に変わりますか?。
皆さんのほとんどのように、私はドラゴンの本に加えて他の多くの記事、リソース、フォーラム、およびQ&Aを読むのにあまりにも多くの時間を費やしています。私が最終的に思いついたのは、すべての主要な解析手法やコンパイラの最適化など、不要なことをたくさん知っていたのですが、コンパイラプロジェクトで最終的に何をする必要があるのかまだ明確に理解していません。
問題は、すべてを一度にそして最初に理解する(そして習得する)必要があるすべての本と他のリソースにあります!パーサーを理解して実装する必要がありますが、次に何をすべきかはまだわかりません。ちなみに、あなたはこのトピックの真の初心者だと思いますが、そうではなかった方もいらっしゃると思います。
いつか私はそれらの資料を読むのをやめます。私はすべての詳細について学ぶのに十分だと言いました、私は何か現実的なことをしたいです。それで、私はこのような質問をし始めます:コンパイラの目標は何ですか?さて、私の答えは、プロセッサ用の理解可能なバイナリコードを生成することでした。それで、私はそれがどうあるべきかを言いましたか?さて、このようなものstatement1; statement2;
に0xAABBCCDD
、そしてそれがすべてです。
次に、すべてを最初から始めます。私は最も単純な構文と機械語から始めます。私が一日の終わりに持っていたのは、Intel用の純粋なバイナリコードを生成することができた動作中のコンパイラでした。ほんの少しの命令しか理解できませんが、それは実際に機能するコンパイラでしたが、非常に単純なものでした。
その後、パーサーなどを改良し、それ以来ずっと幸せに感じました。現在、必要なときにこれらすべての資料を使用しています。私の問題は、これらの本や記事をすべて読まないと、単純なコンパイラーでも作成できないと思ったため(ほとんどの場合、他の人が言った)、すべてを理解して習得しようと懸命に努力していたことでした。
ここでは、コンパイラプロジェクトを開始する前に知っておく必要があると思われるアイデアや概念をリストアップしていただきたいと思います。初心者が読んで理解し、プロジェクト全体をよりよく描写し、実際のコードの記述に移り、実際のコンパイラーがどのように機能するかを感じるのに十分シンプルであるとあなたが信じていること。
例として、ここで私の答えを参照してください!
PSちなみに、質問に反対票を投じる前に、これらの資料が良くないと言っているのではないことをもう一度はっきりさせておきます。主題が信じられないほど曖昧だと言っているだけです。間違ったアプローチは、すべてを一度に実行することです。よりスマートなソリューションは、HelloWorldから始めます。たとえば、GCCなどと同じ機能を持つプロジェクトの代わりに。
compiler-construction - LLVM での部分適用
単一の引数に適用でき、続いて別の引数に適用できる関数「add」を作成しようとしています。単一の値で関数を呼び出し、その値をメモリのどこかに保存し、その値に適用される別の関数を返す方法がわからないため、LLVM IR でこれを表す方法がわかりません。LLVM にはある種の閉鎖メカニズムが必要です。
C での実装を検索して、出力された LLVM を clang で表示できるようにしましたが、見つかった解決策は非常に複雑だったので、LLVM を直接調査するだけでよいと考えました。
これはカリー化されていないバージョンになります
そして、どういうわけか、型add(1)
を返したいと思います。i8 (i8)
どうにかして機能を分割する必要があると思います。
ps。私は小さな関数型言語のコンパイラに取り組んでいるので、これを調べています。そのため、一般的なコンパイラ設計における部分的なアプリケーション/カリー化の実装に関するアドバイスを探しています。
更新: 次のコードが機能するようになりましたが、非常に複雑で、自動的に生成するのは簡単ではないと思います