問題タブ [compiler-theory]

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.

0 投票する
3 に答える
1161 参照

assembly - PIC18 ISA で除算がどのように処理されるか

Converting to ASCII in Cの拡張のようなもので、PIC18X で除算がどのように処理されるのか正確に知りたいと思っていました。

DIV 操作を実行すると、コンパイラはそれをいくつの命令として解釈しますか? 操作が完了するまでに何クロック サイクルかかりますか? クロック サイクル数は被除数、除数、またはその両方に依存しますか?

あまり重要でない副次的な質問として、専用の分割ハードウェアを搭載した最初の CPU は何ですか?

0 投票する
6 に答える
717 参照

design-patterns - 非常に高速なコンパイラを作成するための重要な設計上の選択は何ですか?

非常に高速にコンパイルするコンパイラを設計する方法を知りたいです。

最初に、私の質問に対する明らかな誤解を解消させてください。

  1. コンパイラによって生成されるコードの速度について話しているのではありません。生成されたコードを最適化する方法を学習するために利用できるリソースは、すでにたくさんあります。私が見つけるのに苦労しているのは、コンパイラを高速にするための情報です。

  2. また、C++ コンパイラが一般に Java コンパイラよりも遅い理由 (たとえば) についての議論にも興味がありません。特定の言語のコンパイラを高速化するために使用できる手法に興味があります。

  3. また、Microsoft の Incredibuild や Unix の distcc のような分散コンパイル システムについても聞きたくありません。これらのシステムは、より高速なコンパイラを提供するのではなく、より多くのコンパイラを提供するだけです。これは確かに便利ですが、それは私が求めている質問ではありません。単一の CPU 用の高速なコンパイラを設計する方法を知りたいです。

  4. ccache も私が探している答えではありません。これは、コンパイラの使用をまったく回避できるシステムですが、コンパイラが高速になるわけではありません。繰り返しますが、これは便利です。繰り返しますが、それは私が尋ねている質問ではありません。

私の質問が明確になったことを願っています。しかし、おそらくいくつかの歴史がそれをさらに明確にするでしょう。

C コンパイラは非常に低速でした。その後、1986 年に THINK Technologies が Macintosh 用の Lightspeed C を導入し、ほぼ瞬時にプログラムをコンパイルしました。Lightspeed C は、他のすべての C コンパイラよりはるかに高速で、ほとんど比較できませんでした。(おそらく、Lightspeed C は新世代の超高速コンパイラの最初のものではありませんでしたが、私の経験では最初のものでした。Turbo Pascal は [1983 年] より早く登場しましたが、私はそれを使用した経験がなかったので、方法がわかりません。速度的に比較しました。)

それ以来、多くの高速コンパイラが利用できるようになりました。1980 年代にコンパイラ技術にある種の飛躍があったようで、特にそれを理解しようとしています。ブレークスルーは何でしたか?

答えは簡単かもしれません。Lightspeed や Turbo のような IDE では、統合エディタはすでに RAM にソース コードを持っています。コンパイラがそのデータを使用して動作する場合、コンパイラの中で最も遅い部分であるディスク I/O がなくなります。ソース コードのサイズがメモリ サイズに比べて小さい場合、これはおそらく速度の向上に非常に重要な貢献をします。(当時、RAM のサイズははるかに小さかったが、典型的なプログラムのサイズも同様だった。)

あれですか?それとも、他の重要な革新が関係していましたか? それ以来、コンパイラの速度に重要な改善がありましたか?

0 投票する
7 に答える
576 参照

syntax-highlighting - 入力時にコンパイラがコードをコンパイルできないのはなぜですか?

入力時にコンパイラがコードをコンパイルできないのはなぜですか?

ユーザーの観点からは、今日の構文の色付けと同じくらいスムーズに機能する可能性があります。十分な時間(おそらく数秒)入力を停止すると、コンパイル(リンクではない)が終了し、構文の色付けなどを使用してコードエラーが識別されます。

私の3GHzクアッドコアモンスターコンピュータが何か他のことをするのに本当に忙しかったわけではありません。いつもコンパイルさせてみませんか?

0 投票する
1 に答える
5738 参照

compiler-construction - 先読みセットの正確な定義は何ですか?

私はコンパイラーを書いて、構文解析の背後にある理論について学んでいます。認識アルゴリズムを理解するための重要な概念ですが、ネット上の情報はかなり貧弱であることがわかりました。StackOverflowは、この問題を解決するための独自の立場にあるようです。

0 投票する
3 に答える
19244 参照

scala - 理解のための Scala "<-"

私は、Scala が常に何に対しても「自然な説明」を持っていることを発見しました。常に「ああ、でもそれは、これとそのパラメーターを使用して、このオブジェクトとそのオブジェクトで呼び出されている関数にすぎません」のようなものです。ある意味で、他の言語からわかるように、実際にコンパイラー・マジックと呼ばれるものはありません。

私の質問は、次のコードで使用されている<-演算子です。

この例では、次のように書き換えられていることがわかります。

しかし、これはiが foreach 関数内の匿名関数にどのように運ばれたかを説明していません。iを書いた時点では、それはオブジェクトではなく、宣言された変数でもありません。では、それは何であり、どのように foreach の内部に引き継がれているのでしょうか?

私の推測では、実際にはコンパイラの魔法である何かをついに発見したということです

御時間ありがとうございます。

明確にするために、私の質問は次のとおりです。 <- 演算子は、コードの1行目でどのように機能しますか? i は、関数として呼び出すことができるオブジェクトではないためです。

0 投票する
1 に答える
89 参照

linux - .o.aおよび実行可能ファイルに配置されたヘッダーブロックgccコンパイラの読み取り方法

すべての.o.aおよび実行可能ファイルの先頭にあるヘッダーブロックgccを読みたいのですが。当時、Solarisには、この目的のためのユーティリティがありました。Linuxでは、同様のユーティリティを利用できますか?

0 投票する
5 に答える
1575 参照

c - Cで静的変数を逆参照すると、正確にはどうなりますか?

だから私はこのコードを持っているとしましょう

明らかに、関数にmy_static_intへのポインターを渡しました。しかし、コードがコンパイルされるとどうなりますか?私が検討したアベニュー:

1)非ポインター変数を宣言すると、Cは自動的にそのポインターを作成し、typedefs my_static_intのような内部的な処理を*(internal_reference)にします。

とにかく、私の質問が十分に説明的であることを願っています

0 投票する
1 に答える
2642 参照

compiler-construction - 興味深いコンパイラプロジェクト

私は、卒業生の論文にも発展する可能性のあるコンパイラの学期の長いプロジェクトを見ています。私はこの分野での経験があまりありません(学部の仕事の一環としてPascalの小さな「翻訳者」を書きました)---私は機械学習とAIにもっと興味があります。アイデアは、これを挑戦として取り上げ、その過程で何かを学ぶことです。

私は見てみました:興味深いコンパイラプロジェクトですが、ほとんどのアイデアは時代遅れのようです。

同じことがLLVMOpenProjectsページにも当てはまります--- http://llvm.org/OpenProjects.html

学期がありますので、少し意味のあることを目指しています。最適化、つまり並列化に幅広く取り組みたいと思います。取り組むべき興味深いことは何でしょうか?

0 投票する
1 に答える
2473 参照

compiler-construction - トップダウン パーサーは、「コード」に適切なケース例の左再帰が必要です

こんにちはスタック オーバー フロー メンバーです。

私はコンパイラクラスのために勉強しています。トップダウン パーサーは左再帰を避け、右再帰に変換する必要があることを理解しました。

質問は、

a) トップダウン パーサーが LL に等しく、ボトムアップ パーサーが LR に等しいことを理解していますか?

b) 左再帰は自分自身を呼び出すルールであることがわかりました ex) Expr :== Expr '+' Term | Expr を見つける無限ループを引き起こす項。とにかく、C または Java での入力を考慮するサンプル コードはありますか? ( パーサーやスキャナーのコードはいらない ) 必要なのは、左再帰による無限ループが発生するセンテンシャル形式のコード例です。

c) トップダウン パーサーで右再帰を使用する方法で実際に何が違いますか?

ANS c) バックトラックの必要性をなくす。しかし、他の何か?

ANS b)x - 2 * yだけでなく、他の何か? これはバックトラックの解析方法で動作するためです。

非左再帰と左再帰の両方を発見した事例。

左再帰文法

非左再帰文法

どちらも無限ループに陥っています。

専門家の皆様、ありがとうございました。

0 投票する
5 に答える
6591 参照

c# - C#で名前による呼び出しを実装するにはどうすればよいですか?

誰かがC#で名前による呼び出しを実装する方法を教えてもらえますか?