コンテンツにスキップ

宿題:Java言語1#

Java言語#宿題1

Homework 約30分 答え

次のSJava言語のプログラムをバイトコード列に変換(コンパイル)せよ.必ず演算子の優先度を考慮すること.

i = 50 + -x * 10;

ヒント:演算子の優先度を考慮する際は,逆ポーランド記法をイメージすると良い.詳細はC言語#SCマシンを参照せよ.

以下の書式をコピーして回答せよ.変数xiの相対位置はそれぞれ1と2とせよ.

bipush 50
???

回答フォーム

Answer

bipush 50
iload_1
ineg
bipush 10
imul
iadd
istore_2

逆ポーランド記法では次の通り.50 x - 10 * +

Q&A#

:口頭での解説はスキップ

誤字#

  • inegで全ビット値の正負を反転する.

プログラミング習得に必要な概念が多くて困る#

わかる.

情報処理関係は物理的な実態がないからこそ,物事を抽象的に捉える能力が強く求められます.その点は数学と似ているかも.

あらゆる知的生産において抽象化は欠かせません.例えば良いレポートや論文を書く際には,トピックを整理し文章全体の流れや構造を作る必要があります.この構造化はまさに抽象化です.

プログラミングを抽象化能力を鍛える場だと考えても良いです.例えば関数名を考える行為は抽象化作業です.

javapを試したところ前半部分にUtf8が出てくるので文字列コードを参照して変換しているのかなと思いました#

Yes

定数プールと呼ばれる領域(ヒープの一種)に各種定数が記録されています.大きな数値定数50000や長い文字列"hello world"などもこの領域に記録されます.クラスの名前java/lang/String(完全限定名)もここに記録されているようです.

iload_[0-3]等を用意している理由は,データ量削減のための妥協だと理解した.メモリを多く使える現代に開発された言語にも同様の妥協による仕様はあるのでしょうか.#

バイトコード量の削減という点は正しいですが,妥協ではないです.変数の数は3個程度で収まる関数も多いので,それ専用の小さな命令を用意している,という見方が正しいです.専用なので一般性が失われますが,バイトコード削減にそこそこ寄与します.

メモリが潤沢になってきたのは事実ですが,この種のリソース削減(最適化や縮退化)は常に必要とされます.潤沢であっても無駄がない方がよいですね.

Cと比べてJavaはスタックの操作が多い気がした.その分パフォーマンスにも影響あるのか.#

Javaの方が遅いのは事実ですが,スタック操作の量はあまり関係ありません.むしろJVM自体のオーバーヘッドが大きいです.

  • 機械語:直接PCに指示する
  • バイトコード:JVMを経由してPCに指示する

JVM自体には多くの速度改善の工夫が取り込まれているとはいえ,やはりCと比べると遅いです.Pythonも同じ理由で遅いです.Rustは機械語を生成するのでC並に早いです.

バイトコードは改ざんが容易では?#

バイトコード中にはメソッド名も含まれており,元ソースコードとの対応も取りやすい.なぜバイトコードにはメソッド名が含まれているのか?

なぜバイトコードにメソッド名が含まれているのかは分からない.

Javaバイトコードの改ざんが容易なことは有名です.バイトコードからソースコードの復元(デコンパイル)も簡単なので,バイナリが手に入ればやりたい放題ではある.

難読化(obfuscation)のようなバイトコードを復元しにくくする技術・研究もあります.

最近よく耳にするコーディングなしでプログラミングができるのはどういう原理で動いているのでしょうか?#

AIってまだ我々の意図を事細かに書かないと完全なコードを生成できないはずなのにアプリなどの高度なものが曖昧な指示で生成できてる?のが不思議です。

LLMの話だと解釈して話を進めます.詳細はTransformerアルゴリズムを勉強してください.

直感的には次にくる単語を予測する,という問題を解いています."I have a ???"という文字があった場合に,catやpen,bookは正しいでしょう.逆にwaterやplay,programmingなどは正しくなさそうです.さらに,この文章の前に動物や猫に関する話題があるならcatである可能性が高まります.Web等から集めた大量の文章データに基づいて,上記の学習を繰り返すことで,単語の持つ意味や文章の構造を理解したモデルを作り上げます.

そのうえで,利用者のプロンプト「~を教えて下さい」の次にくる単語を予測します.「~を教えて下さい.???」の???の部分を予測させます.これがまさにLLMの応答に該当します.

上記のTransformerの学習方針はソースコードでも適用できます.int sum = ???ときたら0の可能性が高いでしょう.

ソースコードと文章の両方を同時に学習することもできるので,利用者が与えた曖昧な文章指示から,ある程度その意図を反映したソースコードを生み出します.当然生成したソースコードには多くの誤りがあるので,開発者の指示とチェックを繰り返しながら正しいプログラムを作っていきます.

大学院に進学することのメリットとデメリットについて先生なりの意見をお聞きしたいです#

口頭で.