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

コンパイラは、あるプログラミング言語で記述されたソースコードを別のコンピュータ言語に変換するコンピュータプログラムです。

5
基本言語の基本機能は?DSLの提案?
ようやくインタプリタとコンパイラを作成することの背後にある複雑さを理解し始めました。この時点に到達する前に、TinyBasic、1964(Dartmouth)Basicのいくつかのバージョンと、これらの言語での独自の拡張を構築しました。最新のプロジェクトは、私がオープンソースベーシックと呼んでいるプロジェクトです...人が興味を持つ言語の他の機能は考えられなかったからです。言語のソースを開き、複雑な処理がどのように行われるか(スキャン、解析、解釈、およびコンパイルがどのように行われるか)を理解できるようにするため Open Source Basicは、最初にスタックベースの言語に解釈されます。次に、そのスタックベースの言語が解釈されてすぐに実行されるか、CLR実行可能ファイルに変換されます。 私の質問はすべてこれに要約されます: Basicベースの言語の基本的な機能/構成は何ですか?私はこれらの基本的な構成をすでに持っています:割り当て、式、変数、いくつかの関数(ランダム、ToUpper、ToLower)、ループ(forおよびdo-while / until)、If(ブロックおよび単一行)Else決定、コンソールベースの入力(入力)、出力(Print)、およびサブルーチン(まだパラメーターなし)。 基本的な構成を自分の言語に追加する「完了」したら、どのように分岐する必要がありますか?どのドメインに?言い換えると、すべてのジェネリック構造を機能させたら、オープンソースの基本言語はどの方向に進むべきでしょうか? お時間をいただきありがとうございます ドミニク

4
XコンパイラをYのZに書き込むための一般的なルール
Xが入力言語、Zが出力言語、fが言語Yで記述されたコンパイラであるとします。 f = X -> Z fは単なるプログラムなので、Yはどの言語でもかまいません。したがって、それぞれがY1、Y2で記述されたコンパイラf1、f2を持つことができます。 f1 = f Y1 f2 = f Y2 g = Z -> M h = g . f # We get a compiler X -> M たとえば、cpythonコンパイラを例にとると、XはPython、ZはPython VMコード、YはCです。 cpython = Python -> PythonVMCode C interpreter = PythonVMCode -> Nothing interpreter2 = PythonVMCode -> …

2
言語設計では1つの数値タイプのみ
私は現在、コンパイラの構築と言語設計について学び、自分の言語でサポートしたいネイティブデータ型について考えています。現在、整数と実数を区別する多くの言語があります。しかし、私は彼が言ったダグラス・クロックフォードによる講演を見たのを覚えています。 システムに単一の数値タイプがあることは、間違った数値タイプを選択してバグを発生させることができないことを意味します 彼はまた、一般的に使用されているIEEE-754とは異なる数値表現をお勧めします(間違っている場合は修正してください)。したがって、私の質問:主に教育に重点を置いている汎用言語の場合、どの数値表現を使用する必要がありますか? 編集:教育的焦点を当てて、私は他の人を教育するためではなく、コンパイラについて学ぶ私の自身の進歩について話しています。

2
Cが同じ変数の複数のグローバル宣言を許可し、複数のローカル宣言を許可しないのはなぜですか?
グローバル変数を複数回宣言すると、コンパイラは警告を出力しません。 ただし、たとえば関数内でローカル変数を複数回宣言すると、gccコンパイラーはエラーを出力し、ファイルをコンパイルしません。(私はgccに関して質問しますが、これはより一般的な言語設計の質問であり、gccについての質問ではありません。他のコンパイラーが同様に動作する可能性があるためです)。 この動作の説明は何ですか?

3
変数は言語コンパイラまたはインタープリターにどのように格納されますか?
Pythonで変数を設定するとします。 five = 5 ブーム。これはどのように保存されていますか?コンパイラーまたはインタープリターはそれをそのような変数に入れますか? varname = ["five"] varval = [5] これがどのように行われる場合、それはどこに保存されますか?これは永遠に続くようです。

1
BDDを使用してコンパイラを単体テストする方法
私のチームは、IDEに統合されるドメイン固有言語(DSL)のコンパイラを作成しています。現在、私たちはコンパイラーの分析フェーズに集中しています。リアルタイムのパフォーマンスと非常に詳細なエラー/警告/メッセージ情報が必要なため、既存のパーサージェネレーター(ANTLRなど)は使用していません。我々は持っています 各クラスは、言語の具体的な構文ツリーのノードを表します。 各ノードの注釈として機能するクラス(つまり、エラーや追加情報)、および 具体的な構文ツリー(つまり、レクサー、パーサー、文字列のキャッシュ、構文ビジター)を構築および操作する内部クラス。 テストを整理するための全体的な戦略を決定しようとしています。当社は、行動主導型開発(BDD)とドメイン主導型設計(DDD)を推進しています。弊社のドメイン用にDSLを構築していますが、コンパイラのドメインはプログラミング言語です。 私たちはまだコンパイラーを構築中であり、すでにいくつかのテストを行っています。100%ステートメントカバレッジを目指しています。 現在、構文ツリービルダーにソースコードを入力し、結果の構文ツリーのすべてのノードの各プロパティで検証を実行して、期待される情報(行番号、関連するエラー、子/親トークン、トークンの幅、トークンのタイプなど)。ここで、各ノードは独自のクラスであり、ノードに添付された特定の注釈とエラーは個別のクラスであるため、このテストは多くのクラスを参照することになります。 現在、入力(文字列)と出力(トークンのリスト)を他のクラス(構文ツリーのノードのクラスなど)から分離できるレクサーなどの特定のクラスのテストがあります。これらのテストはより詳細です。 これで、すぐ上の段落のテストを、テスト中のクラス(レクサー、文字列キャッシュなど)に対応させることができます。ただし、上記の2番目の段落のテストは、コンパイラーの分析フェーズ全体を実際にテストします。つまり、入力ソースコードが与えられている場合、各テストは構文ツリーに対して300以上のアサーションを持つことができます。テストは、分析フェーズの動作のためのものです。 これは適切なテスト戦略ですか?そうでない場合、私たちは何を別の方法で行うべきですか?テストにはどのような組織戦略を使用する必要がありますか?

5
コンパイラのソースコードを読むのは良い考えですか?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。回答は事実、参考文献、専門知識によって裏付けられると期待していますが、この質問は、討論、議論、投票、または拡張ディスカッションを求める可能性があります。この質問を改善でき、再開できると思われる場合は、ヘルプセンターにアクセスしてください。 6年前休業。 私はコンピュータサイエンスを専攻している大学のジュニアです。たくさんのコードを書くだけでなく、他の人が書いたソースコードを読み始めて、コーディングスキルを向上させ、さまざまな方法でより良い方法や異なる方法を学びたいと思っています。C ++コンパイラのコードの重要な部分のいくつかを読み始めるべきだと思っていました。これは私が2つのことをするのに役立つと思います: コンパイラは難しいので、コードはこの難しい問題の解決策を表すので、エレガントなコーディングプラクティスを学びます。 これは、最もよく使用されている言語のコンパイル方法、詳細、各エラーの生成方法、コードの解析方法についても理解し、言語の仕様を理解するのに役立ちます。 これは良いアイデアだと思いますか?
8 c++  compiler 

4
インタープリターをコンパイラーに変換しますか?
まず、これが私の前に他の多くのプログラマーから寄せられた質問であることを私は知っています。しかし、私を助けることができる使用可能なリソースを見つけることができませんでした。 まあ、私は「ライト」と呼ばれるプログラミング言語を作成しています。構文はpythonに匹敵しますが、厳密なオブジェクト指向のコンセプトがあります。 私はまだこの言語用のインタープリター(C ++で)を作成しましたが、私の問題はこれを実行可能ファイルに変換する方法です。(または単に:どのようにコンパイラーを作るのですか?) ご清聴ありがとうございました PS:私は非常に古いチュートリアルへのリンクをいくつか見つけましたが、それはパスカルです... 編集:まあ、まあ。今、私はC ++に適したチュートリアルを見つけました。プロジェクトについて:いくつかの変更がありました。現在、この言語は「Q」と呼ばれています。(kju Dot)。
8 c++  compiler 

4
VM言語が一度だけコンパイルされないのはなぜですか?
(最初に、コンパイラと仮想マシン(別名)は私にとってまったく未知のフィールドであることを明確にする必要があります) 私が理解しているように、Java / C#/ ...アプリケーションが実行されるたびにVMが呼び出され、中間コード(バイトコード、CILなど)を機械語命令に変換します。 しかし、なぜこの操作を一度だけしか実行できないのですか?

9
なぜ仮想マシンが必要なのですか?
それぞれのOS(ターゲットとなっているOS)のソースコードをコンパイルする代わりに、一度コンパイルしてどこでも実行できます。 この質問のために、私はそれをVMと呼びます(たとえば、Javaと.NETの両方)。したがって、プログラムの実行は次のようになります ------------ ---- ---- | Executable | -> | VM | -> | OS | ------------ ---- ---- それは完全に理にかなっています、コンパイラはそれぞれのVMのために汎用のままです。ただし、VMの実装は、インストールするマシンによって異なります(* nix、windows、mac)x(32ビット、64ビット)。 私の質問は、それぞれのマシン用にVMを作成する代わりに、なぜその特定のマシン用にコンパイラーが作成されないのですか?これにより、それぞれのVMをダウンロードする代わりに、それぞれのコンパイラをダウンロードすると、そのコンパイラがその特定のマシンのmachine-code + OSを処理します。最終的には、あらゆるマシンのネイティブコードの実行。確かに、各ソースコードはその特定のマシン用にコンパイルする必要がありますが、今日では、自動化されたシステムであるscmビルドがこの作業に役立ちます。 混乱している私の理由は正しいですか、またはここでいくつかの専門知識が不足していますか? 編集: ポータビリティ: はい、それは1つの理由ですが、今日の自動化システムでは移植性が大きな問題ですか?他のマシン用にコンパイルする必要がないという事実をどれくらいの頻度で心配する必要がありますか?ネイティブマシン用にコンパイルされたコードを使用すると、パフォーマンスが大幅に向上します。Javaを例にとると、Windowsで低レベルのプログラミングを行うことはできず、JNIを選択する必要があります。 TeamCity / Jenkinsなどの自動化システムを利用してください。バージョン管理を介して送信されたコードが実行可能ファイルになるような自動化されたシステムセットアップを使用できます。

2
Dragon Bookのアプローチに従う並列化コンパイラーを知っている人はいますか?[閉まっている]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 4年前休業。 コンパイラ:原理、技術、用具、アホら平行(第2版第11章)のために最適化するためのアプローチを記載します。そのアプローチに従う既存のコンパイラを知っている人はいますか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.