問題タブ [jasmin]
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 - Jasmin アセンブラー:「l2d」命令で「java.lang.VerifyError: ... Attempt to split long or double on the stack」が発生する
Jasmin アセンブラを使用して、Java のサブセットを Java バイトコードにコンパイルするコンパイラを作成しています。
「l2d」命令 (および関連する命令) に問題がありますが、これが機能しない理由を理解すれば、すべて機能すると思います)。
命令参照:
http://cs.au.dk/~mis/dOvs/jvmspec/ref-_l2d.html
私がコンパイルしているコードは次のとおりです。
したがって、基本的には、javac がプリミティブな数値型間で暗黙的な型変換を行う方法をミラーリングしようとしています。
出力 Jasmin アセンブリ コードは次のとおりです。
前の3つの重要な行.end method
。
「;」の後のテキスト コメントです。
コンパイルされたコードを実行しようとしたときに発生する正確なエラーは次のとおりです。
long と double がスタック上の 2 つのスロットと 2 つのローカル変数 (ここで説明) を占有するという事実と関係があるに違いないと思いますが、それでも私は困惑します。
java - Java バイトコード サブルーチン - リターン アドレスを読み込めません
Java バイトコードを書き、Jasmin を使用してアセンブルしようとしています。
サブルーチンについて理解しようとしていますが、プログラムの実行時に次のエラー メッセージが表示される理由がわかりません。
test.j のバイトコードは次のとおりです。
単一のサブルーチンへのジャンプには問題はありませんでしたが、サブルーチン内からサブルーチンにジャンプするときに何か問題が発生しているようです。
なぜこれが失敗するのかについての洞察は大歓迎です!
java - JavaバイトコードでのTry/Catch例外の処理?(「スタックの高さが一貫していません」)
Javaバイトコードでエラー処理を行おうとしています。私は最初に、いくつかのキャッチのようなサブルーチンを実装しようとしました。そこでは、エラー状態をチェックし、適切なサブルーチンにジャンプします。
上記の問題は、このサブルーチンにジャンプする複数の命令がある場合、バイトコードの実行時にスタックの高さが一貫していないというエラーメッセージが表示されることです。
おそらく、例外を使用することがこれを回避するための最良の方法ですか?
いくつかのグーグルから、Exceptionクラスのインスタンスを作成し、次のようなもので初期化できることがわかりました。
私はまた、あなたがそれらを一緒に投げることができることを発見しました、athrow
そしてこれは大丈夫のようです。
しかし、私を混乱させているのは、例外がどのようにキャッチされるかということです。例外のスローとキャッチを結合する魔法の「例外テーブル」があるようですが、バイトコードを最初から作成する(およびJasminを使用して組み立てる)ときにこれらの1つを定義する方法がわかりません。誰かが例外テーブルを作成する秘訣を教えてもらえますか?そして、おそらくジャスミンでアセンブルされる例外処理の例を教えてください。
compiler-construction - Java to Java Bytecode Compiler: Java クラス ライブラリ情報を取得するにはどうすればよいですか?
私はJasminコードにコンパイルし、それをアセンブルして、Java から Java バイトコードへのコンパイラを作成しています。ソースコードファイルがJavaライブラリクラスを参照して使用できるようにすることを意図して作成しています(文字列、印刷などにはほとんど必要です)。私の問題は、これをどのように行うかです。
ここまでは、Java インストール フォルダー内のテキスト ファイルに保持されているすべてのライブラリ クラスのリストへの参照を使用してきました (パッケージと名前がリストされているだけです)。パーサー/タイプ チェッカーのコーディングに使用しましたが、ライブラリ クラスが使用されたときにタイプ チェッカーがタイプ チェックを実行できなかったため、これは理想的とは言えませんでした。
ライブラリ クラスのメソッドを呼び出したい場合は、完全なメソッド シグネチャ (私がアクセスできないもの) を指定する必要があるため、コード生成に取り組んでいるので、これは本当に問題です。
どのように進歩するかについて人々のアドバイスが何であるかをさまよっていました。1 つの方法は、すべてのクラスを調べて、すべてのパラメーターと戻り値の型のデータベース/リストを作成することです。これは明らかに非常に時間がかかり、おそらくあまりにも非現実的です。他のよりエレガントなアプローチが可能ですか?
ありがとう、ウィル
PS私はこれをコーディングするためにPythonを使用しています。ソリューションで Java コードを使用する必要がある場合は、それをサブプロセスとして実行できると思います。
java - JVMのLookupSwitchとTableSwitchの違いは?
JavaバイトコードでLookUpSwitchとTableSwitchを理解するのが難しいです。
私がよく理解している場合、LookUpSwitchとTableSwitchの両方switch
がJavaソースのステートメントに対応していますか?1つのJAVAステートメントが2つの異なるバイトコードを生成するのはなぜですか?
それぞれのJasminドキュメント:
java - ジャスミンでキーワードとして名前が付けられたフィールドを処理する方法
私はJavaのサブセット用のコンパイラを書いていますが、ほぼ完成しています。私が問題を抱えていることの 1 つは、jasmin-keywords のような名前のクラス、フィールド、およびメソッドの処理です。
例えば:
次のようにjasminにコンパイルされます:
問題は .class および .field ディレクティブです。名前がキーワードの場合、コンパイル エラーが発生します。それらを一重引用符と二重引用符の両方で囲んでみました。一重引用符を使用して jasmin がクラス ファイルにアセンブルしますが、検証エラーが発生します (実際には名前に引用符が含まれているようで、最適ではありません)。二重引用符を使用すると、まったくコンパイルされません。
これに対する解決策はまったくありますか、それともジャスミンでこれを行うことは不可能ですか?
jvm - ジャスミンロングフィールドを強制的にロング定数にする方法は?
このテストケースで問題を切り分けることができました:
これを実行しようとすると、次のようになります。
いくつかの調査(を使用javap
)により、次のことが明らかになりました。
つまり、long 定数の値はクラス ファイルに整数として格納されます。Jasmin に定数をプールに long として保存させる方法はありますか? 試してみまし1L
たが、うまくいきません。の値を( などの)foo1
より大きい数値に設定するとエラーは修正されますが、定数値を変更する必要のない解決策を望んでいました。INT_MAX
2147483648
Jasmin はこれを行う方法を提供していますか、それとも jasmin のソース コードを変更する必要がありますか?
java - Jasmin でクラスをインスタンス化する
次のようにJasminでクラスをインスタンス化しようとしています:
これはコンパイルされますが、クラス vierifier は不平を言います:
「VerifyError: 間違った初期化メソッドを呼び出します。」
クラスをインスタンス化する正しい方法は何ですか?
java - Jasmin を Ant と Eclipse に統合する
私は、JVMアセンブリであるJasminで作成する非常に具体的なテストコードが必要なJavaプロジェクトに取り組んでいます。このプロジェクトは Ant で構築されており、ディレクトリ構造は次のようになっています。
カスタマイズされた Jasmin ソース ファイルは、JUnit Java ファイルと一緒に src/tests ディレクトリにあります。これらはすべて Ant でビルドされ (単純な「java」Ant タスクを使用して、ソース ファイルで Jasmin コンパイラを実行します)、/build フォルダー内のそれぞれのディレクトリに配置され、Ant が JUnit タスクを実行します。これはすべて正常に動作します...
Jasmin によって生成された単一のクラスを紹介するまで、Eclipse はこのプロジェクトで完全に機能していました。問題は、Eclipse が新しい .class ファイルを認識しないことです。ビルド パスには、ソース フォルダーとして src/classes および src/tests が含まれ、出力フォルダーとして /build が含まれます。それでも、Jasmin によって生成されたクラスを見つけることができないようです。そのため、何百もの「ClassX 未解決」の問題があり、開発が非常に苦痛になります。
Eclipseにこのクラスを強制的に表示させる方法を知っている人はいますか?
java - Jasmin HelloWorld で aload_0 を使用する理由
公式の Jasmin HelloWorld の例の開始があります。
なぜaload_0
指導があるのですか?local var 0 は何を構成していますか?