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

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

2
コンパイラはどのようにエラーと警告を報告すべきですか?
私は近い将来にコンパイラを書くつもりはありません。それでも、私はコンパイラ技術に非常に興味があり、このようなものをどのように改善することができますか。 コンパイルされた言語から、ほとんどのコンパイラには2つのエラーレベルがあります。最初はほとんどの場合、修正する必要のある致命的ではない警告とエラー、およびマシン(またはバイト)入力からのコード。 しかし、これはかなり弱い定義です。Javaのような一部の言語では、@SuppressWarningディレクティブを使用せずに特定の警告を取り除くことは不可能です。また、Javaは致命的ではない特定の問題をエラーとして扱います(たとえば、Javaの到達不能コードは、知りたい理由でエラーをトリガーします)。 C#には同じ問題はありませんが、いくつかあります。コンパイルは複数のパスで発生し、パスが失敗すると以降のパスは実行されないようです。そのため、ビルドが失敗したときに取得するエラーカウントは、しばしば大幅に過小評価されます。1回の実行で2つのエラーがあると表示される場合がありますが、修正すると26の新しいエラーが発生する可能性があります。 CとC ++を掘ると、JavaとC#のコンパイル診断の弱点の悪い組み合わせが示されるだけです(ただし、JavaとC#はそれぞれ半分の問題で進んだと言う方が正確かもしれません)。いくつかの警告は実際にはエラーである必要があり(たとえば、すべてのコードパスが値を返すわけではない場合)、それでも警告です。標準を書いた時点では、コンパイラテクノロジはこれらの種類の必須チェック。同じように、コンパイラは多くの場合、標準で規定されている以上のことをチェックしますが、追加の検出には「標準」の警告エラーレベルを使用します。また、多くの場合、コンパイラはすぐに検出できるすべてのエラーを報告しません。それらをすべて削除するには、数回のコンパイルが必要になる場合があります。C ++コンパイラーが吐き出すのを好む不可解なエラーは言うまでもありませんが、 コンパイラーが警告を発したときに失敗を報告するように多くのビルドシステムを構成できるようになったので、奇妙なミックスが得られます。すべての警告に値するわけではありませんが、警告の存在をさらに言及せずにいくつかの警告を明示的に抑制しています。また、すべての警告がエラーになる場合があります。 コンパイルされていない言語には、依然としてエラー報告があります。Pythonのタイプミスは、コードが実際に実行されるまで報告されません。また、スクリプトがエラーを検出すると実行が停止するため、一度に複数のエラーをキックすることはできません。 PHPには、多かれ少なかれ重要なエラーレベルと例外がたくさんあります。解析エラーは一度に1つずつ報告され、警告はスクリプトを中断するほどひどい場合があります(ただし、デフォルトではそうではありません)。 PHPの場合と同じように、本当に奇妙なことがあります(なぜ致命的ではない致命的なエラーのエラーレベルが必要なのでしょうか?E_RECOVERABLE_E_ERROR、私はあなたに話しています)。 私が考えることができるコンパイラエラーレポートのすべての実装が壊れているように思えます。すべての優秀なプログラマーが、エラーに適切に対処することの重要性を主張しているにもかかわらず、それを行うための独自のツールを入手できないため、これは本当に残念です。 コンパイラエラーを報告する正しい方法は何だと思いますか?

2
Forthの柔軟性が文法を不適切にするのはなぜですか?
私は最近、スタックベースのプログラミング言語を書く仕事を引き受けました。しかし、自分の言語の設計を始める前に、既存のスタックベースの言語を読んで実験するのは良い考えだと思いました。 これにより、この投稿のトピックに移動します。私は、Postfixスタイルの式を使用するスタックベースの言語であるForthに関するWikipediaの記事を読んでいました。記事では、私は次の声明を見ました: Forthの柔軟性により、静的なBNF文法が不適切になり、モノリシックコンパイラーがありません。コンパイラを拡張するには、文法を変更して基礎となる実装を変更するのではなく、新しい単語を書くだけで済みます。 私の理解では、フォースの専門用語では、「単語」という用語は基本的に「サブルーチン」と同義のようです。これを考えると、上記のステートメントは奇妙に思えます。Forthで新しい関数を作成する機能がForthの正式な文法を不適切にするのはなぜですか?定義する新しいサブルーチンごとに文法を書き直す必要があるのはなぜですか?環境で新しい単語を書くことは、コンパイラの拡張をどのように構成しますか?上記のステートメントは、新しい関数を定義できるため、正式な文法はPythonには不適切であると言っているように見えます。 実際、私は以下のForthの単純なサブセットに対してBNFスタイルの文法を書くことを試みることにしました。 program ::= stmt+ stmt ::= func | expr func ::= ':' expr+ ';' expr ::= INTEGER | word word ::= ('+' | '-' | '*' | '/' ) 上記の文法は、Forthステートメントの有効なサブセットをカバーしているように思われ、Forth言語のすべての有効なステートメントをカバーするように拡張することはそれほど難しくないと思われます。さらに、コンパイラーのパーサーが上記の文法を実装している場合、コンパイラーがどのように拡張されるかはわかりません。コンパイラは、環境に新しい単語を追加するだけです。環境のみが変更されます。まるで、上記のWikipediaからの抜粋は、コンパイラー(変更されない)を構成する下線コードとコンパイラーの環境(変更される)を融合しているようです。 要約すると、なぜ新しい単語(サブルーチン)を定義するForthの能力が、書かれた文法には不適切なのでしょうか。

1
GCCがC ++とCのバイソンから再帰的降下パーサーに切り替えたのはなぜですか?
それを必要とする言語変更、またはバイソンがもはや適切または最適ではなくなったいくつかの実際的な理由はありましたか? 私は上を見ウィキペディア彼らが参照し、切り替えることGCC 3.4とGCC 4.1のリリースノート。 これらのリリースノートには次のように記載されています。 手書きの再帰降下C ++パーサーは、以前のGCCリリースからのYACC派生のC ++パーサーに取って代わりました。新しいパーサーには、C ++ソースコードのより適切な解析、拡張機能の処理、適切なセマンティクス分析と解析の間の(可能な場合は)明確な分離に必要な、大幅に改善されたインフラストラクチャが含まれています。新しいパーサーは、古いパーサーで見つかった多くのバグを修正します。 そして: 古いBisonベースのCおよびObjective-Cパーサーは、新しい、より高速な手書きの再帰下降パーサーに置き換えられました 私が知りたいのは、彼らが抱えていた実際の問題と、Bisonを使用して解決することが不可能/非実用的である理由です。
10 c++  c  parsing  compiler 

3
if()の遅延評価を実装する方法
私は現在、以下に基づいて式エバリュエーター(式のような単一行式)を実装しています。 入力された式は、リテラルブール、整数、小数、文字列、関数、識別子(変数)を分離するためにトークン化されます シャンティングヤードアルゴリズムを実装し(可変数の引数を持つ関数を処理するように少し変更)、括弧を取り除き、適切な優先順位で演算子を後置された順序で並べます 私のシャンティングヤードは、トークンの(シミュレートされた)キューを単に生成します(配列によって、Powerbuilder Classic言語はオブジェクトを定義できますが、ネイティブストレージとしてのみ動的配列を持ちます-真のリストではなく、ディクショナリーではありません)。シンプルなスタックマシン 私の評価者はうまく働いていますが、私はまだ足りないので、if()どうすればいいのか迷っています。 私のシャンティングヤードのポストフィックスおよびスタックベースの評価if()で、trueとfalseの部分を持つ別の関数として追加すると、1つif(true, msgbox("ok"), msgbox("not ok"))で両方のメッセージが表示され、1つだけ表示したいとします。これは、関数を評価する必要がある場合、その引数はすべて評価済みでスタックに配置されているためです。 if()怠惰な方法で実装する方法を教えてもらえますか? 私はこれらを一種のマクロとして処理することについて考えましたが、初期の段階ではまだ条件の評価ができていません。おそらく、キューとは別の種類の構造を使用して、条件とtrue / false式を別々に保持する必要があるのでしょうか?現時点では、式は評価前に解析されますが、将来の評価のために中間表現を一種のプリコンパイルされた式として保存することも計画しています。 編集:問題について少し後で、私は自分の式のツリー表現(線形トークンストリームの代わりにAST)を構築でき、そこから自分のの別のブランチを簡単に無視できると思いif()ます。

7
コンパイラの入門コースをたどるには、どのコンピュータサイエンスの科目が必要ですか?[閉まっている]
閉まっている。この質問はトピックから外れています。現在、回答を受け付けていません。 この質問を改善してみませんか? 質問を更新して、ソフトウェアエンジニアリングスタック交換のトピックになるようにします。 4年前休業。 私はコンピュータサイエンス以外の学部生で、ウェブ開発者(java、python、AS3など)としてプロとして働いています。私は地元の大学で学期ごとに1つのコースを取ります。私は人工知能(ロジック、文脈自由文法、CYK構文解析、入門NLP、マルコフ連鎖、HMMなど)を前学期に受講しました。 次のシラバスをカバーする次のセムスターでコンパイラの入門コースをとることを計画しています。 字句解析、構文解析、意味解析、ランタイム環境、中間表現、コード生成、レジスター割り当て、命令の選択とスケジューリング、ローカルおよびグローバルコード最適化入門、データフロー分析 私の質問は、このコースを受講する前に知っておくべきコンピュータサイエンスの科目はありますか?はいの場合、それらのコースをリストしていただければ幸いです。

6
コンパイラの構造について学び、理解することの利点は何ですか?
私はソフトウェアエンジニアリングの学位を取得して3年目の学部生です。今年から、私の大学は「コンパイラー構築」と呼ばれる新しいコースを導入しました。これは、コンパイラーを構築する理論の基礎を教えます。 ソフトウェアエンジニアがコンパイラの構築について学ぶ上で、実際にどのような利点がありますか?
10 tools  compiler 

5
コンパイラー作成者は実際にマシンコードを「理解」する必要がありますか?[閉まっている]
休業。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善してみませんか?この投稿を編集して、事実と引用で回答できるように質問を更新してください。 6年前休業。 ちょっと変わった質問かもしれません。 C ++コンパイラ(またはVM以外の言語)を書く人:生の機械語を読み書きできる必要がありますか?それはどのように機能しますか? 編集:私は特に、他のプログラミング言語ではなく、マシンコードにコンパイルするコンパイラについて言及しています。

3
コンパイラの作成コンパイラ-使用方法と機能に関する洞察
これは、言語設計で使用される概念をフレームワークの形で抽象化することを目的とした抽象化プロジェクトへの姉妹プロジェクトに焦点を当てた一連の質問の一部です。姉妹プロジェクトはOILexerと呼ばれ、一致時にコードインジェクションを使用せずに、文法ファイルからパーサーを構築することを目的としています。 構造タイピングに関連するこれらの質問に関連する他のいくつかのページは、ここに表示され、使いやすさはここにあります。フレームワークに関する問い合わせに関連するメタトピックと投稿する適切な場所は、こちらにあります。 特定の文法から解析ツリーの抽出を開始するところまで来ています。その後、DFAを使用して順方向パスを識別する再帰的降下パーサーが続きます(ANTLR 4のLL(*)と同様)。私はそれを開いて洞察を得るだろうと考えました。 パーサーコンパイラでは、どのような機能が理想的ですか? これまでのところ、実装されているものの簡単な概要です: テンプレート 特定の時点で何が有効であるかを把握しながら、予測を先読みします。 ルール内のリテラルを取得し、それらがどのトークンからのものであるかを解決するルール「非文字化」。 非決定的オートマトン 確定的オートマトン トークン認識のためのシンプルな字句状態マシン トークンの自動化方法: スキャン-コメントに役立ちます:Comment:= "/ *" Scan( "* /"); 減算-識別子に便利です:識別子:= Subtract(IdentifierBody、Keywords); 識別子がキーワードを受け入れないようにします。 エンコード-ベースN遷移のシリーズXカウントとしてオートメーションをエンコードします。 UnicodeEscape:= "\\ u" BaseEncode(IdentifierCharNoEscape、16、4); 16進数の4遷移を使用して、Unicodeを16進数でエスケープします。これとの違い:[0-9A-Fa-f] {4}は、Encodeを使用した結果の自動化で、許可される16進値のセットをIdentifierCharNoEscapeのスコープに制限します。したがって、\ u005cを指定すると、エンコードバージョンは値を受け入れません。このようなことには重大な注意事項があります。控えめに使用してください。結果として生じる自動化は非常に複雑になる可能性があります。 実装されていないのはCST生成です。これを機能させるには、適切なコンテキストを引き継ぐように決定論的自動化を調整する必要があります。 興味のある方のために、T *y♯プロジェクトの元のフォームをかなり印刷したものをアップロードしました。各ファイルは他のすべてのファイルにリンクする必要があります。それらに従うために個別のルールでリンクを開始しましたが、時間がかかりすぎました(自動化の方が簡単だったでしょう)。 さらにコンテキストが必要な場合は、それに応じて投稿してください。 編集5-14-2013:特定の言語でステートマシンのGraphVizグラフを作成するコードを書きました。 これがAssemblyPartのGraphVizダイグラフです。言語の説明でリンクされているメンバーは、そのルールのダイグラフを含む相対フォルダーにrulename.txtを持っている必要があります。例を投稿してから一部の言語の説明が変更されました。これは、文法に関することを簡略化するためです。これが興味深いgraphviz画像です。

3
コンパイラは通常、インストールされているプラ​​ットフォームの実行可能ファイルのみを生成するのはなぜですか?
私はC ++開発者であり、クロスプラットフォーム開発をよりよく理解するために、コンパイラーの実装の詳細と、コンパイラーがOS固有のバイナリーを正確に作成する方法をよりよく理解しようとしています。私の調査の最中に、少なくともしばらくの間、特定のプラットフォーム用にダウンロードしたほとんどのコンパイラーは、そのプラットフォーム用のバイナリーのみをコンパイルすることに気付きました。したがって、Windows用のコンパイラexeが付属しているIDEをダウンロードした場合、そのコンパイラはx86-x64 Windowsアプリケーション用のプログラムのみをコンパイルでき、LinuxまたはMacアプリケーションはコンパイルできません。 現在、プラットフォームごとに異なるバイナリ形式が必要であることを理解していますが、WindowsのビジュアルC ++コンパイラーがLinuxバイナリ実行可能ファイルを生成するのが難しいのはなぜですか?実行中のCPUのアセンブリ命令とOS固有のライブラリがある限り、任意のマシンの任意のプラットフォーム用の実行可能ファイルをコンパイルできませんか?

2
GCCはC ++自体で記述されているため、鶏と卵の問題はありませんか?
4.8リリース以降、C ++コンパイラGCC(そのG ++部分)は、CではなくC ++自体で記述されています。これについて架空の質問があります。 まだC ++コンパイラがない新しいプラットフォームでGCCのC ++コードをコンパイルする方法を知りたいです。もちろん、他のマシンでコンパイルされたビルド済みのバイナリを使用することもできます。または、Cで書かれた古いバージョンのGCCを使用して、現在のバージョンをコンパイルすることもできます。 しかし、ビルド済みのバイナリがなく、最新バージョンがないと、行き詰まっていましたよね?そうでない場合、GCCプロジェクトのCからC ++への切り替えによって引き起こされるこの状況に他の影響がありますか?
10 c++  compiler  gcc 

3
Clang / LLVMはプライムタイムの準備ができていますか?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。回答は事実、参考文献、専門知識によって裏付けられると期待していますが、この質問は、議論、議論、投票、または拡張ディスカッションを求める可能性があります。この質問を改善でき、再開できると思われる場合は、ヘルプセンターにアクセスしてください。 6年前休業。 Clangはgccの代わりに使用できますか?その上であなたの経験は何ですか?まだどのような欠点がありますか? コンパイルのパフォーマンスはgccよりも非常に優れていますが、実行時に生成されるコードのパフォーマンスについてはどうでしょうか。 LinuxまたはWindowsで実行するためのフロントエンド(IDE)として優れたツールはありますか? 編集:私はCコンパイラを意味します。C ++はまだあまり良くありません。

5
戻り値型のオーバーロードが許可されないのはなぜですか?(少なくとも通常使用される言語)
すべてのプログラミング言語について知っているわけではありませんが、通常、戻り値の型(引数の数と型が同じであると想定)を考慮してメソッドをオーバーロードする可能性がサポートされていないことは明らかです。 私はこのようなものを意味します: int method1 (int num) { } long method1 (int num) { } プログラミングにとって大きな問題ではありませんが、場合によっては歓迎することもありました。 明らかに、どのメソッドが呼び出されているかを区別する方法なしにそれらの言語がそれをサポートする方法はありませんが、その構文は[int] method1(num)または[long] method1(num)のような単純なものにすることができますこれにより、コンパイラーは、どちらが呼び出されるかを認識します。 コンパイラがどのように機能するかはわかりませんが、それほど難しくはないように思われるので、なぜそのようなものが通常は実装されないのでしょうか。 そのようなものがサポートされない理由はどれですか?

3
なぜPythonにはコンパイラとインタープリタの両方が必要なのですか?
Javaにはコンパイラーとインタープリターの両方が必要であるという事実を理解できます。ソースコードをバイトコードにコンパイルしてから、仮想マシン(Windows、Linux、Androidなど)がそのバイトコードを現在のアーキテクチャのマシンコードに変換します。 しかし、なぜPythonにはコンパイラとインタープリタの両方が必要なのでしょうか。Pythonはプラットフォームに依存しないため、解釈を使用しないのはなぜですか?私の知る限り、Pythonプログラム(バイトコードにコンパイルされたもの)を変更せずにWindowsまたはLinuxマシンで実行することはできません。それとも私は間違っていますか?

8
Cがコンパイル/解釈/ JITされるのを妨げる原因は何ですか?
Javaは、その驚くべき移植性でしばしば賞賛されています。これは、JVMが原因だと思います。私の質問は、Cがコンパイル/解釈/ JITされるのを阻止するものです。もしそうなら、Cは1度だけ記述して、あなたが持っているどのデバイスでも動作させることができます。しかし、これはCプログラムを処理するための一般的なメカニズムではありません。 もちろん、このようにCを処理することの欠点は何ですか?もちろん移植性以外に、このようにJavaを処理してマシンコードにコンパイルしないことの利点は何ですか?

3
動的に型付けされた言語のコンパイラーを作成する際の型付けに関連する課題は何ですか?
で、この話、グイド・ヴァンロッサムは言ってそれにコメント、Pythonコードのコンパイラを書くための試みについて(27:30)に話しています。 すべての素晴らしい動的型付けプロパティを維持し、プログラムのセマンティックな正確性を維持するコンパイラーを書くのはそれほど簡単ではないことがわかりましたより速く Pythonのような動的に型付けされた言語のコンパイラを書く際の型付けに関連する(可能な)課題は何ですか?

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