問題タブ [interpreted-language]
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.
java - 実行時に現在のプログラム クラスを参照する Java コードをコンパイルする
ユーザーが「プラグイン」を作成できるようにするプログラムを作成しようとしています。Linux bash シェルがファイルをディレクトリに置くことでコマンドを追加できるように、ユーザーが自分のコードをディレクトリに置いてプログラムを実行できるようにしようとしています。
これを行うには、次のいくつかの方法を考えました。
- どうにかして独自のスクリプト言語を作成し、それを使用してユーザーにプラグインを作成してもらいます
- Java がサポートする既存のスクリプト言語を見つけ、それを使用してユーザーがプラグインを作成できるようにする
- ユーザーに Java でプラグインを作成してもらい、プログラムの実行時にコンパイルしてもらいます。
3 つのオプションはすべてかなり悪いように見えますが、これが私が考えることができるすべてであり、オプション 3 が 3 つの中で最良のように思えました。そのため、いくつかの調査を行ったところ、Java 1.6 以降がファイルのランタイム コンパイルをサポートしていることがわかりました。ただし、ユーザーが作成したコードが、基本プログラムにある特定のクラスを参照している場合、コンパイラが失敗するかどうかはわかりません。通常はそうなりますが、私のプログラムがそれをコンパイルしているので、コンパイラーが基本プログラムのクラスの使用を許可するかどうかはわかりません。
理想的には、これをユーザーにとってできるだけ簡単にしたいと思います。私の主な質問は、コンパイラーが私の基本プログラムでクラスを参照する際に問題が発生するかどうかです。すべてのクラスに .jar を含めて、ユーザーが開発中にそれをライブラリとして使用する必要はありません。私が言ったように、私はこれがユーザーにとって簡単であることを望んでおり、理想的には、可能な限り解釈された言語に近いものであるべきです. そのため、ユーザーがコンパイルに煩わされる必要がないように、プログラムの実行時にこれを行いたいと考えています。.java ファイルをディレクトリに配置してプログラムを実行するだけです。
コンパイラがクラスに問題を起こすかどうか、またはこれに対処するためのより良い方法を誰かが知っていれば、それは素晴らしいことです!
ありがとう!
interpreted-language - インタープリター言語を使用して、コンパイル済み言語を「オンザフライ」で調整できるようにするのはなぜですか?
Civilization ビデオ ゲーム シリーズなどの特定のプログラムについて読んだことがあります。インタープリター コンポーネント (この場合は Lua) を使用して、コンパイルされたコンポーネント (C++ だと思います) とインターフェイスして、mod などによるユーザーの拡張性を可能にします。独自のコンパイル済み言語拡張機能を作成してベイクするだけでよいと思うのに、なぜそのような方法で仮想マシンを呼び出すのでしょうか?
java - インタープリターはコードをどのように解釈しますか?
簡単にするために、このシナリオを想像してください。r1 と r2 と呼ばれる 2 ビット レジスタのペアがあり、即時アドレス指定でのみ動作する 2 ビット コンピュータがあります。
ビットシーケンス00が CPU への追加を意味するとしましょう。また、01はデータを r1 に移動することを意味し、 10はデータを r2 に移動することを意味します。
したがって、このコンピューター用のアセンブリ言語とアセンブラーがあり、サンプル コードは次のように記述されます。
簡単に言えば、このコードをネイティブ言語にアセンブルすると、ファイルは次のようになります。
上記の 12 ビットは、次のネイティブ コードです。
これがコンパイルされたコードの基本的な仕組みですよね?
誰かがこのアーキテクチャ用の JVM を実装するとしましょう。Java では、次のようなコードを記述します。
JVM はこのコードをどの程度正確に解釈しますか? つまり、最終的には同じビット パターンを CPU に渡さなければならないということですね。すべての CPU には、理解して実行できる多くの命令があり、それらは結局のところほんの一部です。コンパイルされた Java バイトコードが次のようになっているとします。
または何でも..解釈すると、実行時にこのコードが0101 1010 0001に変更されるということですか?もしそうなら、それはすでにネイティブ コードに含まれているのに、なぜ JIT は何度か実行された後にしか機能しないと言われているのでしょうか? 正確に 0101 1010 0001 に変換されない場合、どうなりますか? どのようにしてCPUに加算を行わせるのですか?
たぶん、私の仮定にはいくつかの間違いがあります。
解釈が遅く、コンパイルされたコードは高速ですが、移植性がなく、仮想マシンがコードを「解釈」することはわかっていますが、どのように? 「正確に/技術的に解釈する方法」が行われていることを探しています。回答の代わりに、任意のポインター (書籍や Web ページなど) も歓迎します。
ruby-on-rails - ルビ変数定義
変数定義に関するルビーの奇妙な動作に出くわしました(途中でドーナツの箱を失いました):
なぜa.nil?
投げていないのundefined local variable
ですか?たとえば、Python を見てみましょう (インタープリター言語と比較したかっただけです)。
コンパイルされた言語では、これはコンパイルさえしません。
- これは、そのコードを実行していなくても、Ruby がその変数への参照を保持しているということですか?
- もしそうなら、ifs/else は変数定義のためにどのくらい深く考えられますか?
これが Ruby で期待される動作だとは本当に信じられません。これは irb 固有のものではなく、ruby/rails コード ブロックで実行しても同じ結果が得られます。
python - ループ数が効率を左右する (解釈された言語とコンパイルされた言語?)
2 つまたは 3 つのループを使用して計算を実行する必要があるとします。直感的には、これを 1 つのループで行う方が効率的であると思うかもしれません。簡単なPythonの例を試しました:
このコードの実行:
したがって、実質的に 1 ループの方が効率がよいようです。ただし、配列内の値を使用する必要があるため、問題には少し異なるシナリオがあります (次の例では、range
簡略化のために関数を使用しています)。つまり、すべてを 1 つのループにまとめると、サイズが 2 ~ 10 要素の別の配列の値から拡張配列を作成する必要があります。
私のコンピューターでは、このコードは次の場所で実行されます。
b
で配列を作成するのに時間がかかるため、3つのネストされたループの方が効率的であるようcase1
です。したがって、この配列を最も効率的な方法で作成しているかどうかはわかりませんが、それはさておき、ループを単一のものに折りたたむことは本当に報われますか? ここでは Python を使用していますが、C++ などのコンパイル済み言語はどうでしょうか。この場合、コンパイラは単一のループを最適化するために何かをしますか? あるいは、ネストされたループが複数ある場合、コンパイラは何らかの最適化を行いますか?
compilation - コードのコンパイルは、コードの解釈よりも本当に速いですか?
まず、ここでベストアンサーをチェックしてほしい。
ご覧のとおり、コンパイルされた言語の方が高速です。ただし、当然のことながら、コンパイラはソース コード全体を取得し、それをマシン コードにコンパイルしてから実行します。インタープリターは、一度に 1 つのステートメントを受け取り、それをマシン コードまたは仮想マシン コードに変換してから、すぐに実行します。そのため、実行時にオンザフライで出力を取得します。
では、解釈された言語はコンパイルされた言語よりも高速ではありませんか?
bash - Bash はインタープリター言語ですか?
私がこれまでに読んだことから、bash はインタープリター言語の定義に適合しているようです。
- より低い形式にコンパイルされていません
- すべてのステートメントは、すでにマシンコードに変換されたサブルーチン/サブルーチンのセットを呼び出すことになります(つまり
echo foo
、プリコンパイルされた実行可能ファイルを呼び出します)。 - インタプリタ自体
bash
はすでにコンパイルされています
しかし、 Wikipedia の解釈された言語のページや、Google での広範な検索では、bash への参照を見つけることができませんでした。また、Programmers Stack Exchange で、bash がインタープリター型言語ではないことを暗示しているようなページを見つけました。そうでない場合、それは何ですか?