6

Java クラスにコンパイルする必要がある bigloo スキーム関数型言語で書かれたパーサーがあります。パーサー全体が 1 つの関数として記述されます。残念ながら、これにより、JVM コンパイラが「メソッドが大きすぎます」という警告をスローし、後で「localvar のラベルが遠い」というエラーが発生します。このエラーを回避できる方法はありますか? DontCompileHugeMethods オプションについてどこかで読みましたが、機能しますか? 関数を分割することは、私にとって実行可能なオプションではないようです:( !!

4

4 に答える 4

3

このエラーを回避できる方法はありますか?

さて、このコンパイラ エラーの根本的な原因は、バイトコード ファイルの形式にハード リミットがあることです。この場合の問題は、1 つのメソッドが最大 65536 バイトのバイトコードで構成できることです。( JVM 仕様を参照してください)。

唯一の回避策は、メソッドを分割することです。

于 2010-07-07T08:10:28.390 に答える
0

さて、ここではケースが少し異なります。メソッドは単一の関数呼び出しのみで構成されています。現在、この関数には膨大なパラメーターリストがあります(実際にはパーサー全体です!!)。だから、これを分割する方法がわかりません!!

そのような獣を分割する方法は次のようになります:

  • パラメータのデータホルダーオブジェクトを定義します(データモデルのオントロジーに従ってオブジェクトにパラメータのセットを配置します)、
  • それらのデータホルダーオブジェクトを独自のコンテキストで構築する
  • パラメータオブジェクトを関数に渡します
于 2010-07-07T08:30:39.717 に答える
0

関連する操作でメソッドを分割するか、ユーティリティを個別に分割します。

于 2010-07-07T08:18:30.800 に答える
0

クイック アンド ダーティー: 関数の先頭ですべてのパラメーターを同じ名前のクラス変数に割り当て (パラメーターの名前を変更する必要があります)、関数を細かく切り刻み、それらの部分を関数に入れます。これにより、関数が基本的に同じセマンティクスで動作することが保証されます。

しかし、これではきれいなコードにはなりません!

于 2010-07-07T09:14:50.450 に答える