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

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

6
基本型(intなど)をクラスとして実装する場合の注意点は何ですか?
オブジェクト指向プログラミング言語を設計し、implentingすると、いくつかの点で1が基本型(のような実装の選択をする必要がありint、float、doubleクラスまたは何か他のものとして、または同等の)。明らかに、Cファミリーの言語はそれらをクラスとして定義しない傾向があります(Javaには特別なプリミティブ型があり、C#はそれらを不変の構造体として実装します)。 基本型が(統一された階層を持つ型システムで)クラスとして実装される場合、非常に重要な利点を考えることができます。これらの型は、ルート型の適切なLiskovサブタイプになります。したがって、ボクシング/アンボクシング(明示的または暗黙的)、ラッパータイプ、特別な分散ルール、特別な動作などで言語を複雑にすることは避けます。 もちろん、言語デザイナーがその方法を決定する理由を部分的に理解することができます:クラスインスタンスは、空間のオーバーヘッドを持っている傾向がある(インスタンスのメモリレイアウトにvtableまたはその他のメタデータが含まれている可能性があるため) have(言語がそれらの継承を許可しない場合) 基本型がクラスではないことが多いのは、空間効率(および特に大きな配列での空間的局所性の向上)だけですか? 私は一般的に答えがイエスであると仮定しましたが、コンパイラにはエスケープ分析アルゴリズムがあり、インスタンス(基本タイプだけでなく任意のインスタンス)が厳密に証明されたときに空間的オーバーヘッドを(選択的に)省略できるかどうかを推測できます地元。 上記は間違っていますか、それとも私が見逃しているものがありますか?

2
ASM.jsとは何ですか?また、それはすべての人にとって何を意味しますか?
ASM.jsと呼ばれるこのプロジェクトについて不平を聞き始めています。現在、彼らのウェブサイトはひどく混乱しています。以下は、Webでの調査でわかったことです。 これは、高度に最適化できるJavaScriptのサブセットです。言語のより動的な部分を避けるためだと思います。 ASM.jsにコンパイルされたコードのパフォーマンスは、Cの約半分の速度で実行されます(光ではありません)。 その意図は、コンパイラーがターゲット言語ASM.jsを作成することです。 FirefoxはASM.js最適化が組み込まれた状態で出荷されます。 MozillaとUnrealのチームが移植されたウェブにアンリアル・エンジンをそれにしてのビルドでランニングのFirefox、ネイティブに近いスピードで。 これが実際に何であるか、または有用性または究極の目的に関する具体的な情報はウェブ上にないようです。それ以外の場合はサーバー側のコードベースをコンパイルし、ブラウザにネイティブに近い速度で実行させることができますか?開発者にとっての影響は何ですか?

5
C ++テンプレートは単なるマクロの一種ですか?
このようなC ++テンプレートとC#/ Javaジェネリックのさまざまな比較から、 https://stackoverflow.com/questions/31693/what-are-the-differences-between-generics-in-c-and-java-and-templates-in-c/31929#31929 C ++テンプレートは、コンパイルではなく、何らかの種類の前処理(解析前のプレーンテキスト置換)によって実装されているという認識を得ました。C ++テンプレートの型チェックはCマクロに似ているためです。エラーがある場合、それらはテンプレート自体からではなく、テンプレートコードブロックを処理した後に生成されたコードからのエラーです。言い換えれば、それらはCのマクロの一種の上位バージョンにすぎません。 次に、これをサポートする他のいくつかの事実を見つけました- C ++テンプレートが前処理によって実装される場合、動的リンク(.dllを使用)に問題があると思いました。そして、クイックグーグルがこれをサポートしました。 もう1つのポイントは、整数定数を引数としてテンプレートに渡すことができるということです。また、何らかの再帰をサポートします。ただし、この再帰は、コンパイルされたアセンブリ/マシンコードにはありません。再帰的なことは、すべての再帰呼び出しに対して関数を生成することにより、コンパイル時に管理されます。したがって、より大きく、より高速な実行可能バイナリを持ちます。 Cマクロとは異なりますが、いくつかの優れた機能があります。しかし、C ++テンプレートは何らかの前処理で実装されていませんか?これは異なるC ++コンパイラでどのように実装されていますか?
27 c++  c  compiler  templates  macros 


2
Python(および他の動的言語)のどのセマンティック機能がその速度低下に寄与していますか?
私はPythonをよく知りません。動的言語(Python、Lua、Scheme、Perl、Rubyなど)の正確な機能が実装を強制的に遅らせていることを、より正確に理解しようとしています。 その一例として、Lua 5.3 メタテーブル機構は直感的にLuaを非常に遅くしますが、実際にはLuaは非常に高速(およびPythonよりも高速)であると噂されています。 また、私は現在のプロセッサ上のため、メモリがはるかに遅い生の計算よりであることを直感(おそらく間違ったものを)持っているラà、動的な型チェック((キャッシュミスでメモリアクセスが算術演算の何百ものと同じ時間が必要)if (value->type != INTEGER_TAG) return;でCの用語)は非常に高速に実行できます。 もちろん、プログラム全体の分析(スターリンスキームの実装のように)は、翻訳者が高速で実行されるため、動的言語の実装を行うことができますが、最初はプログラムアナライザー全体を設計する時間がないふりをしましょう。 (私はMELTモニターで動的言語を設計するようなもので、その一部はCに翻訳されます)

3
ネイティブマシンコードへのpythonコンパイラがないのはなぜですか?
私が理解しているように、コンパイルされた言語とpythonの速度の違いの原因は、最初のコードがネイティブマシンのコードまですべてコンパイルされるのに対し、pythonはPVMによって解釈されるpythonバイトコードにコンパイルされることです。この方法でPythonコードを複数のオペレーティングシステムで使用できることがわかります(少なくともほとんどの場合)が、理解できない、なぜ従来のコンパイラと同じ方法でコンパイルするPython用の追加の(オプションの)コンパイラがないのかわかりません。これはプログラマーに選択を任せることになり、それは彼らにとってより重要です。ネイティブマシンでのマルチプラットフォームの実行可能性またはパフォーマンス。一般に; コンパイルされたものと解釈されたものの両方として振る舞うことができる言語がないのはなぜですか?

6
なぜレクサーを2Dアレイと巨大なスイッチとして実装するのですか?
私は学位を取得するためにゆっくりと取り組んでおり、この学期はCompilers 101です。DragonBookを使用しています。まもなくコースに入り、語彙分析と、決定論的有限オートマトン(以下、DFA)を介してそれを実装する方法について説明します。さまざまなレクサーの状態を設定し、それらの間の遷移を定義します。 しかし、教授と本は両方とも、巨大な2D配列(1つの次元としてのさまざまな非終端状態、および他の可能性のある入力シンボル)に相当する遷移テーブルと、すべての端子を処理するswitchステートメントを介して実装することを提案していますまた、非終端状態の場合は遷移テーブルにディスパッチします。 理論はすべて良好で優れていますが、実際にコードを何十年も書いた人として、実装は下手です。それはテスト可能ではなく、保守可能でもなく、読み取り可能でもなく、デバッグするのに苦労します。さらに悪いことに、その言語がUTFに対応していれば、どのように実用的であるかわかりません。非終端状態ごとに100万程度の遷移テーブルエントリがあると、急いで扱いにくくなります。 それで、取引は何ですか?主題に関する決定的な本が、このようにそれをするように言っているのはなぜですか? 関数呼び出しのオーバーヘッドは本当にそれほどですか?これはうまく機能するものですか、文法が事前にわからない場合に必要ですか(正規表現)?または、より具体的なソリューションがより具体的な文法でうまく機能する場合でも、すべてのケースを処理する何かでしょうか? (注:可能性のある重複「なぜ巨大なswitchステートメントの代わりにオブジェクト指向アプローチを使用するのか?」は近いですが、オブジェクト指向については気にしません。機能的アプローチ、またはスタンドアロン関数での賢明な命令型アプローチでも問題ありません。) また、例のために、識別子のみを持つ言語を考えてみましょう[a-zA-Z]+。これらの識別子はです。DFA実装では、次のようなものが得られます。 private enum State { Error = -1, Start = 0, IdentifierInProgress = 1, IdentifierDone = 2 } private static State[][] transition = new State[][]{ ///* Start */ new State[]{ State.Error, State.Error (repeat until 'A'), State.IdentifierInProgress, ... ///* IdentifierInProgress */ new State[]{ State.IdentifierDone, …

3
どのプロセスで構文エラーが発生しますか?(トークン化または解析)
私はコンパイルと解釈を理解しようと、段階的に全体像を把握しようとしています。だから、この記事を読んでいる間に質問に思いついた。http://www.cs.man.ac.uk/~pjj/farrell/comp3.htmlこの記事 それは言います: コンパイラの次の段階は、パーサーと呼ばれます。コンパイラのこの部分は、言語の文法を理解しています。構文エラーを特定し、エラーのないプログラムを別の言語で解釈または書き出すことができる内部データ構造に変換する責任があります。 しかし、トークナイザーが構文エラーのある特定のストリームを適切にトークン化する方法を理解できませんでした。 そこにとどまるか、パーサーに間違った情報を提供する必要があります。トークン化は一種の翻訳者でもないのですか? したがって、トークン化中にコードの字句破損行をどのように単に克服するか。 トークナイザーの見出しの上のリンク内にトークンの例があります。 私が理解しているように、トークンの形式は次のように思えます。コードに何か問題があると、トークンも破損します。 私の誤解を明確にしていただけますか?

5
Cコンパイラの歴史は何ですか?
この質問は、Software Engineering Stack Exchangeで回答できるため、Stack Overflowから移行されました。 8年前に移行され ました。 「デニスリッチーがC言語を開発した」と言うとき、C言語で記述されたソースコードをコンパイルできるコンパイラーを(「既に」開発された他の言語を使用して)作成したということですか?はいの場合、彼が最初のCコンパイラを書くのに使用した言語は何ですか?コンパイラはプログラムであり、現在利用可能なCコンパイラを使用してC言語用の別のコンパイラを作成できることを理解しています。あれは正しいですか?
23 c  compiler 

6
コンパイラが「複雑な」式を静的に型チェックするときに使用される一般的な手順は何ですか?
注:タイトルで「複雑」を使用したとき、式には多くの演算子とオペランドがあることを意味します。式自体が複雑なわけではありません。 私は最近、x86-64アセンブリの単純なコンパイラに取り組んでいます。コンパイラのメインフロントエンド(レクサーとパーサー)を終了し、プログラムの抽象構文ツリー表現を生成できるようになりました。そして、私の言語は静的に型付けされるので、次のフェーズ、つまりソースコードの型チェックを実行しています。しかし、私は問題に遭遇し、自分で合理的に解決することができませんでした。 次の例を考えてみましょう。 私のコンパイラのパーサーは、次のコード行を読み取りました。 int a = 1 + 2 - 3 * 4 - 5 そして、それを次のASTに変換しました: = / \ a(int) \ - / \ - 5 / \ + * / \ / \ 1 2 3 4 次に、ASTを入力する必要があります。最初に=演算子をチェックするタイプから始まります。まず、オペレーターの左側をチェックします。変数aが整数として宣言されていることがわかります。そのため、右側の式が整数に評価されることを確認する必要があります。 式が1or などの単一の値である場合、これがどのように行われるかを理解しています'a'。しかし、複数の値とオペランドを持つ式 -上記のような複雑な式 -では、これはどのように行われますか?式の値を正しく判断するには、型チェッカーが実際に式自体を実行し、結果を記録する必要があるようです。しかし、これは明らかにコンパイル段階と実行段階を分離する目的を無効にしているようです。 私がこれを行うことができると思う他の唯一の方法は、ASTの各部分式のリーフを再帰的にチェックし、リーフのすべてのタイプが期待される演算子タイプと一致することを確認することです。そのため、=演算子から始めて、型チェッカーは左側のすべてのASTをスキャンし、リーフがすべて整数であることを確認します。次に、部分式の各演算子に対してこれを繰り返します。 「The Dragon Book」のコピーでトピックを調査しようとしましたが、あまり詳細に説明されていないようで、すでに知っていることを繰り返します。 コンパイラが多くの演算子とオペランドを含む式を型チェックするときに使用される通常の方法は何ですか?上記の方法のいずれかが使用されていますか?そうでない場合、メソッドは何であり、どのように正確に機能しますか?

1
一部の言語のドキュメントで「ある」ではなく「と同等」と表示されるのはなぜですか?
一部の言語のドキュメントで「ある」ではなく「と同等」と表示されるのはなぜですか? たとえば、Python Docsは言う itertools.chain(*iterables) ... 以下と同等: def chain(*iterables): # chain('ABC', 'DEF') --> A B C D E F for it in iterables: for element in it: yield element あるいは、このC ++の参照にfind_if: この関数テンプレートの動作は次と同等です: template<class InputIterator, class UnaryPredicate> InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred) { while (first!=last) { if (pred(*first)) return …

2
元のインタープリターから独立した「ブートストラップされた」インタープリターを作成することは可能ですか?
ウィキペディアによると、コンパイラを記述するという文脈での「ブートストラップ」という用語はこれを意味します。 コンピューターサイエンスでは、ブートストラップは、コンパイルするソースプログラミング言語でコンパイラー(またはアセンブラー)を記述するプロセスです。この手法を適用すると、セルフホスティングコンパイラが実現します。 そして、それがどのように機能するかを理解できます。しかし、話は通訳者にとっては少し違うようです。もちろん、セルフホスティングのインタープリターを作成することもできます。それは私が求めていることではありません。私が実際に求めていることである:それは、元の、最初のインタプリタの自己ホスト型インタプリタから独立させることが可能です。私の言いたいことを説明するために、この例を考えてみましょう。 最初のインタープリターバージョンを言語Xで記述し、インタープリターはYと呼ばれる作成中の新しい言語用です。最初に言語Xのコンパイラを使用して実行可能ファイルを作成します。これで、言語Xで作成されたインタープリターを使用して、新しい言語Yで作成されたファイルを解釈できます。 私が理解している限りでは、言語Xで作成したインタープリターを「ブートストラップ」できるようにするには、言語Yでインタープリターを書き換える必要があります。ただし、ここで問題があります。言語Yでインタープリター全体を書き換えたとしても、言語Xで作成した元のインタープリターが必要になります。インタープリターを言語Yで実行するには、ソースファイルを解釈する必要があります。しかし、ソースファイルを正確に解釈するにはどうすればよいでしょうか?もちろん、何もありえないので、最初のインタープリターを使用する必要があります。 言語Yで作成する新しいインタープリターの数に関係なく、Xで記述された最初のインタープリターを使用して後続のインタープリターを常に解釈する必要があります。これは単に通訳者の性質のために問題のようです。 ただし、逆に、通訳に関するこのウィキペディアの記事では、実際に自己ホスト型通訳について説明しています。関連する小さな抜粋を次に示します。 自己通訳とは、自身を解釈できるプログラミング言語で書かれたプログラミング言語インタープリターです。例は、BASICで書かれたBASICインタプリタです。セルフインタープリターは、セルフホスティングコンパイラに関連しています。 解釈対象の言語用のコンパイラーが存在しない場合、セルフインタープリターを作成するには、ホスト言語(別のプログラミング言語またはアセンブラー)で言語を実装する必要があります。このような最初のインタープリターを持つことにより、システムはブートストラップされ、言語自体でインタープリターの新しいバージョンを開発できます しかし、これがどのように行われるかは、まだはっきりしていません。何であれ、ホスト言語で書かれたインタープリターの最初のバージョンを常に使用せざるを得ないようです。 さて、上記の記事は、ウィキペディアがセルフホスティングインタプリタと思われるいくつかの例を提供している別の記事にリンクしています。しかし、よく調べてみると、これらのセルフホスティングインタープリターの多くの主な「解釈」部分(特にPyPyやRubiniusなどのより一般的なもの)は、実際にはC ++やCなどの他の言語で書かれているようです。 それで、私が上で説明したことは可能ですか?自己ホスト型インタープリターは元のホストから独立できますか?もしそうなら、これはどのように正確に行われますか?

4
GCC vs clang / LLVM —それぞれの長所と短所[非公開]
現在のところ、この質問はQ&A形式には適していません。回答は、事実、参考文献、または専門知識によってサポートされると予想されますが、この質問は、議論、議論、世論調査、または広範な議論を求める可能性があります。この質問を改善し、場合によっては再開できると思われる場合は、ヘルプセンターをご覧ください。 6年前に閉鎖されました。 GCC対clang / LLVMの長所と短所は何ですか?
20 compiler  clang  gcc  llvm 

6
C ++コンパイラの支払い時期[終了]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 5年前に閉鎖されました。 最近、私は開発者がいつコンパイラーにお金を払うべきか疑問に思い始めました。コンパイラは、ほとんどのプラットフォームで無料で提供されていますが、簡単に入手できる無料版もあります。 例: OS X-GCCおよびClang / LLVMには開発者ツールが付属しています。ここで、どのようにして何を実現できるかについての制限はありません。 Linux-GCCと私はもっと確信しています。Linuxコンパイラの現在の状態を知りません。ここで、どのようにして何を実現できるかについての制限はありません。 Windows-MinGWとMicrosoftは無料版のVisual Studioを提供しています。MinGWには制限はありませんが、無料のVisual Studioには重大な制限があると思います。 ただし、例として、IntelはC / C ++コンパイラを製造しています。彼らは価格が高いです。教育的には、OS Xバージョンは49ドルで、Windows / Linuxはそれぞれ129ドルで入手できると思います。その後、完全な「スタジオ」製品も提供します。明らかに教育価格を使用すると、制限が課せられます。 しかし、私が不思議に思っているのは、いつコンパイラーへの支払いを本当に検討すべきかということです。私が考えることができる1つの例は、ビデオゲームです。主要なプラットフォームで動作するコンパイラを使用している場合、プラットフォーム用の切り替えツールはもうありません。ツールが同じであれば、プラットフォーム間での切り替えが容易になると思われます。 Intelコンパイラーなどのコンパイラーと、それらを使用することで得られる真のクロスプラットフォームのメリットにお金を払うことについて、誰かが光を当てることができますか?プラットフォーム固有の手法を使用しないように非常に一生懸命に努力しても、コードの移植性は低下しますか?
19 c++  compiler 


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