Dynamic Class Loading in the JavaTM Virtual Machine

入社してからしばらく所属していた部署では基本的にJavaを理解している人,それなりに経験している人たち*のみ*という環境だったので,OO的な考え方、Java的なアーキテクチャが関係してくるような話をするときのコミュニケーション上の問題というのはほとんどなかった.

でも今の部署はと言うと,上司はCとUNIXバリバリ基盤系開発者あがりの人で最近やっとOOを理解しはじめたばかりだし(ラーメン屋でOSの仕組みとかを講釈してしまうような人),先輩とかもOOやJavaをちゃんとやったことがない人というのが多い.MySQLの話をしている場合にはそれで全然問題ないのだけど,JBossの話になると,とたんにコミュニケーションが難しくなる.

ひとことでいうと,JVMによって分離されている上の階層の世界と下の階層の世界が,その人の頭のなかでごちゃごちゃになってしまうという感じ.話をしていて「ああ通じてるかな」と思っていても,その後途中で「プロセスが〜」とか「共有メモリは〜」とか「リンクは〜」とか,ノイズがどうしても入ってしまう.

特にJBossの内部を真面目に説明しようとすると,JMXというJavaの中でも最もJavaっぽいというか,抽象度の高い分野になってしまうので,それを理解しようとするんだけどどこかで足を踏み外してJVMの下の世界の階層との概念的なマッピングとかを始めてしまう.

優秀な技術者であればそこスキルコンバートも大変,という話もあるけれど,厳しいことを言えば優秀な技術者であればその時その時の技術をちゃんと噛み砕いて抽象的に理解して,新しい技術への移行の際のスキルコンバートも普通の人より容易なはず.では優秀なのにそれが上手く行かない人がいるとしたら,何がたりないのかというと,一貫性/連続性/全体感のある体系的な理解だと思う.

一貫性だの体系的だのなんのこっちゃと思われると思うのだけど,そのようなことを気づかせるようなある資料に実は最近であった,ということなのです.

話が遠回りになったけど,それがこのタイトルに示してある「Dynamic Class Loading in the JavaTM Virtual Machine」という論文.

これはJavaの動的クラスローディング機能を全体感を持って説明している数少ない資料で,Javaをいまひとつ理解し切れないC言語系技術者の方や,基盤系のJava技術者の方にぜひ一度は目を通していただきたい資料です.

(この論文名そのままGoogleに検索にかけるとダウンロード可能なページがでてきます)

J2EEサーバにおける「デプロイ」という行為(上述の上司はデプロイという概念を理解するのに相当苦労していた)は,J2EE系の開発ではアプリケーション開発者によって日常的に行われている基本的かつ重要な行為なわけだけど,そもそもこのデプロイという手法が存在し得るのも,Javaに動的クラスローディング機能が実装されているから.

4つの特徴を持つものとして説明されています.

1.クラスが必要になった時点でオンデマンドにロード可能である
2.タイプセーフである.動的ローディングによる型(タイプ)の破壊といったことは起きない.
3.ユーザ定義による動的ローディングの拡張ができる
4.複数の名前空間(同じ名前空間のクラスが複数ロードされても個別に扱うことができる)

J2EE側から下に降りて来た人からすると「なんじゃこれは」という感じ(私)のものだったりするのですが,こういった説明というのは,C言語系から上がって来た人にすると「クラスをnewしてインスタンスを・・」という話よりだいぶ分かりやすい話ではないでしょうか.

そもそも,相変わらずJVMの中身が謎な状態が続いていると言うのが一番のギャップの根源なわけですが,こういった話というのをちゃんと把握できているかどうかというのが,CPUからはじまるハードウェアの制御,オペレーティングシステムディバイスドライバ,システムコールときて,JVM(C言語アプリケーション),J2SEライブラリ,J2EEサーバ,POJO的な高レベルな世界,UML等々と上から下まで貫通するような形で理解できるかどうかという上で大切なことだと思います.