タグ付けされた質問 「compiler-construction」

タグcompiler-constructionは、コンパイラーのプログラミングに関する質問、またはコンパイラーの詳細な内部動作に関する質問に適用する必要があります。特定のコンパイラの*使用*またはコンパイルエラーに関する質問には使用しないでください。

6
別のプログラミング言語への変換を容易にするために、コードにどのようなパターンを適用できますか?[閉まっている]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 5年前に閉鎖。 この質問を改善する 私は、あるプログラミング言語から別のプログラミング言語にコードを変換することを目標とするサイドプロジェクトを行うことを目指しています。私が使用している言語はPHPとPythonです(PythonからPHPを使用する方が簡単です)が、理想的には(比較的)簡単に他の言語を追加できます。計画は次のとおりです。 これはWeb開発を対象としています。元のコードとターゲットコードはフレームワークの上に配置されます(これも私が作成する必要があります)。これらのフレームワークはMVC設計パターンを採用し、厳密なコーディング規則に従います。これにより、翻訳が多少容易になります。 また、IOCと依存関係の注入についても検討しています。これにより、変換プロセスが容易になり、エラーが発生しにくくなる可能性があります。 抽象構文ツリーをいじるPythonのパーサーモジュールを利用します。どうやら私がPHPを使用して取得できる最も近いものはtoken_get_all()です。 それからは、AST、シンボルテーブル、制御フローを構築できます。 その後、コードの出力を開始できると思います。完全な翻訳は必要ありません。生成されたコードを確認して問題を修正する必要があります。理想的には、翻訳者は問題のある翻訳にフラグを付ける必要があります。 「これは一体何のことなんだ?」と尋ねる前に 答えは...興味深い学習体験になるでしょう。この困難さを軽減する方法について何か洞察があれば、私に知らせてください。 編集: 変換の方法よりもコードを変換しやすくするためにコードに適用できるパターンの種類(IoC、SOAなど)を理解することに、より関心があります。

4
コンパイルとトランスパイル
違いを探しているときに、私はこれらの定義に出くわしました: コンパイルとは、ある言語で書かれたソースコードを別の言語に変換するための一般的な用語です。 トランスパイルとは、ある言語で記述されたソースコードを取得し、同様の抽象化レベルを持つ別の言語に変換するための特定の用語です。 抽象化とは何かを理解しています。 しかし、上記の定義で「同様のレベルの抽象化」とはどういう意味ですか?そして、どのようにして言語の抽象化レベルを見つけるのでしょうか?

11
Javaクラスファイルの作成は確定的ですか?
同じJDK(つまり、同じjavac実行可能ファイル)を使用する場合、生成されたクラスファイルは常に同じですか?オペレーティングシステムやハードウェアによって違いはありますか?JDKのバージョンを除いて、違いが生じるその他の要因はありますか?違いを避けるためのコンパイラオプションはありますか?違いは理論的にのみ可能ですか、それともOracleはjavac実際には同じ入力とコンパイラオプションに対して異なるクラスファイルを生成しますか? Update 1 生成、つまりコンパイラの出力に興味があります。クラスファイルをさまざまなプラットフォームで実行できるかどうかではありません。 Update 2「同じJDK」とは、同じjavac実行可能ファイルを意味します。 Update 3 Oracleのコンパイラにおける理論上の違いと実際的な違いの違い。 [編集、言い換え質問を追加] 「同じjavac実行可能ファイルを別のプラットフォームで実行すると、異なるバイトコードが生成される状況は何ですか?」

8
JVMプログラミング言語を作成する
ループ、関数内の関数宣言、再帰呼び出しなどをサポートする動的型付きプログラミング言語用に、Cでコンパイラー(lex&bisonを使用)を作成しました。コンパイラーによって作成された中間コードを実行する仮想マシンも作成しました。 私は自分の中間コードにコンパイルする代わりに、Javaバイトコードにコンパイルすることを考えていました。 JVM言語の作成についての質問がすでに尋ねられているのを見ましたが、その答えはあまり有益ではありません。 だからここに私の質問があります: JVMの言語を作成するには、JVM仕様書を読む必要があります。他にどのような本を提案できますか(もちろんDragon Bookを除く)?私は主に、コンパイラー全般ではなく、JVM言語の作成方法に関する本やチュートリアルに関心があります。 jclasslib、bcel、gnuバイトコードなどの.classファイルの読み取り、書き込み、変更を行うJavaライブラリはたくさんあります。どれを提案しますか?また、同じ働きをするCライブラリを知っていますか? Clojure、Jython、JRubyなど、JVMをターゲットとする別の言語を検討することを考えていました。しかし、これらの言語はすべて非常に高レベルで複雑です(それらのコンパイラを作成するため)。私は、JVMを対象とし、そのコンパイラーがオープンソースである、より単純な(不明であっても未使用であっても構わない)プログラミング言語を探していました。何か案は?

5
型推論の実装
ここでは、静的型付けと動的型付けについて興味深い議論がいくつかあります。コンパイル型チェック、ドキュメント化されたコードなどにより、私は一般に静的型付けを好みます。しかし、たとえばJavaのようにコードを整理すると、コードが乱雑になることに同意します。 だから私は自分の関数型言語を作り始めようとしています。型推論は実装したいことの1つです。私はそれが大きな主題であることを理解しています、そして私は以前に行われていない何かを作成しようとしているのではなく、基本的な推論だけをしています... これで私を助けるであろう何を読むべきかについてのポインタ?より理論的なカテゴリー理論/タイプ理論のテキストとは対照的に、より実用的/実用的なものが好ましい。データ構造/アルゴリズムを使用した実装に関するディスカッションテキストがある場合、それはすばらしいことです。


6
GCCとClangパーサーは本当に手書きですか?
GCCとLLVM-Clangは、手書きの再帰下降パーサーを使用しており、マシンで生成されたBison-Flexベースのボトムアップ解析ではないようです。 ここの誰かがこれが事実であることを確認できますか?もしそうなら、なぜ主流のコンパイラフレームワークは手書きのパーサーを使用するのですか? 更新:このトピックに関する興味深いブログはこちら

6
コンパイラーは、他のタイプのループと比較して、do-whileループに対してより優れたコードを生成しますか?
zlib圧縮ライブラリ(特にChromiumプロジェクトで使用されています)には、Cのdo-whileループがほとんどのコンパイラで「より良い」コードを生成することを示すコメントがあります。これが表示されるコードのスニペットです。 do { } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && scan < strend); /* The funny "do {}" generates better code on most compilers */ https://code.google.com/p/chromium/codesearch#chromium/src/third_party/zlib/deflate.c&l=1225 ほとんどの(または任意の)コンパイラがより優れた(たとえば、より効率的な)コードを生成するという証拠はありますか? 更新: 元の著者の1人であるMark Adlerがコメントに少しコンテキストを与えました。

7
Linuxカーネルはどのようにしてそれ自体をコンパイルできますか?
自分のマシンにLinuxシステムをインストールしたときのLinuxカーネルのコンパイルプロセスがよくわかりません。 ここに私を混乱させたいくつかのものがあります: カーネルはCで書かれていますが、コンパイラをインストールせずにカーネルをコンパイルするにはどうすればよいですか? カーネルをコンパイルする前にCコンパイラをマシンにインストールした場合、コンパイラをインストールせずにコンパイラ自体をコンパイルするにはどうすればよいですか? 返事をありがとう、私は数日間とても混乱しました。

7
コンパイラを関数型言語で書く方が簡単なのはなぜですか?[閉まっている]
休業。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善してみませんか?この投稿を編集して、事実と引用で回答できるように質問を更新してください。 2年前休業。 この質問を改善する 私はこの質問について長い間考えていましたが、Googleでの答えもStackoverflowでの同様の質問も実際には見つかりませんでした。重複している場合は、ごめんなさい。 多くの人は、OCamlやHaskellなどの関数型言語でコンパイラやその他の言語ツールを書く方が、命令型言語で書くよりもはるかに効率的で簡単だと言っているようです。 これは本当ですか?そして、もしそうなら、なぜCのような命令型言語ではなく関数型言語で書くのが、なぜそんなに効率的で簡単なのでしょうか?また、関数型言語の言語ツールは、Cのような低水準言語よりも遅くありませんか?



13
トークンと語彙素の違いは何ですか?
Aho UllmanとSethiによるコンパイラの構築では、ソースプログラムの文字の入力文字列は、論理的な意味を持つ文字のシーケンスに分割され、トークンと呼ばれ、語彙素はトークンを構成するシーケンスであるとされています。基本的な違いは何ですか?

2
レクサーの作成の基本はどこで学ぶことができますか?
レクサーの書き方を学びたいです。私の大学のコースには、パーサー(およびそれに合わせてレクサー)を作成する必要があるという課題がありましたが、これは(マークを超えて)指示やフィードバックなしで私たちに与えられたので、私はそれからあまり学びませんでした。 このトピックを検索した後、私は自分がいる場所よりも数歩進んでいると感じる分野に焦点を当てたかなり高度な記事しか見つけることができません。より複雑な言語のトークン化を調査するための基礎として使用できる、非常に単純な言語の字句解析プログラムの作成の基本について説明したいと思います。 この段階では、ベストプラクティスや最適化手法にはあまり興味がありませんが、代わりに基本事項に焦点を当てることを好みます。私を始めるための良いリソースは何ですか?

2
2つのGCCコンパイル済み.oオブジェクトファイルを3番目の.oファイルに結合します
2つのGCCコンパイル済み.oオブジェクトファイルを3番目の.oファイルに結合するにはどうすればよいですか? $ gcc -c a.c -o a.o $ gcc -c b.c -o b.o $ ??? a.o b.o -o c.o $ gcc c.o other.o -o executable ソースファイルにアクセスできる場合、-combineGCCフラグはコンパイル前にソースファイルをマージします。 $ gcc -c -combine a.c b.c -o c.o ただし、これはソースファイルに対してのみ機能し、GCCは.oこのコマンドの入力としてファイルを受け入れません。 通常、.oリンカの出力を入力として使用できないため、ファイルのリンクは正しく機能しません。結果は共有ライブラリであり、結果の実行可能ファイルに静的にリンクされません。 $ gcc -shared a.o b.o -o c.o $ gcc c.o other.o -o executable $ …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.