咖啡日语论坛

 找回密码
 注~册
搜索
查看: 3196|回复: 0

人に聞けないJavaの常識

[复制链接]
发表于 2007-5-28 11:03:19 | 显示全部楼层 |阅读模式
Q.1 そもそもJavaって何ですか? Javaは「開発言語」だとよく言われます。しかし,単なる開発言語ととらえると誤解を生みかねません。現在では,実行環境,開発環境,ときには開発者コミュニティや独特の文化を含めてJavaと呼ぶことがあるからです。
 Javaはもともと,デジタル家電を制御するための言語として生まれました。米Sun Microsystemsが1991年に極秘で立ち上げたGreen Projectが生み出したOakというプログラミング言語がそれです*1。このOakが後にJavaと名前を変えました。Oak自体は家電制御用の技術として花開くことはありませんでした。ただ,開発が容易なアーキテクチャ,ネットワークへの対応,プラットフォームに依存しないといった特徴は,当時爆発的な活況を見せ始めていたWebの世界に適したものでした。
 Javaが注目を集めるようになったきっかけは,当時メジャーなWebブラウザだったNetscapeNavigatorが1995年にJavaの組み込みを発表したことでした。「アプレット」と呼ぶJavaのプログラムをブラウザ上で動作させることにより,動きのあるWebページを表示できるようになったのです。
 現在では,パソコンやサーバーのほか,ICカード,携帯電話など,多くのプラットフォームでJavaのアプリケーションが動作しています。Javaアプリケーションの開発者は,全世界で400万人を超えると言われており,世界で最も人気のある開発技術の一つと言っていいでしょう。
 一企業であるSunのプロジェクトで誕生したJavaですが,現在の開発や仕様策定には,多くの企業,コミュニティ,個人がかかわっています。Javaにかかわる開発者はオープン技術やベンダー非依存への指向が強いと言われており,独自の文化を形成しています。Javaとは,これらを含む開発技術の総称ととらえるのが無難な解釈でしょう。(石原)

Q.2 Javaの名前の由来は? Q.1にあるように,JavaはもともとOakという名前で呼ばれていました。しかし,Oakという名称は当時すでに商標登録されていたため,正式リリースのために別の名前が必要になりました。そこで1995年初頭,米SunMicrosystemsのOakチームのメンバー全員が集まり,新しい名前を考え出すことになったのです。
 様々な候補が挙がった中で,商標登録されていない名称はSilk,DNA,Javaの三つでした。Javaという名前は必ずしも一番人気ではありませんでした。しかし最終的にチーム内の投票でJavaが選ばれました。当時のSunのマーケティング部門はWebにちなんだ名前を望んでいたようですが,JamesGosling氏などの旧Oakチームのメンバーは,ソースコードを即座に書き換え,Javaという名称で既成事実を作ってしまったようです。
 もっとも,誰が最初にJavaという名前を言い出したかは,定かではありません。開発メンバーのChris Warth氏がいつもPeet'sコーヒー*2のカップを持ち歩いていて,その日も会議に持ち込んでいたのがきっかけだという説が有力とされています*3。いずれにせよ,コーヒー豆のJavaから名付けられたことは間違いないでしょう。(石原)

Q.3 Javaのプログラムはどうやって動かすのですか?
図1●Javaのプログラムを実行させる手順
 Javaのソースコードは,「.java」という拡張子が付いたファイルに保存します。このファイルを通常,Javaファイルと呼びます。このJavaファイルをJavaコンパイラでコンパイルすることで,中間言語(バイトコード)で記述された,拡張子が「.class」のファイルができます。これをクラス・ファイルと呼びます。Javaの実行環境は,このクラス・ファイルを解釈して実行します(図1[拡大表示])。
 これらの作業をコマンドライン環境で行うときには,まずテキスト・エディタなどを使ってソースコードを記述します。これを例えば,HelloWorldApp.javaといった名前のJavaファイルとして保存します。コンパイルするには
javac HelloWorldApp.javaと入力します。その結果,クラス・ファイル(HelloWorldApp.class)ができます。これを実行するには,
java HelloWorldAppと入力します。(石原)

Q.4 Java実行環境の「仮想マシン」ってどんなものですか? C/C++言語のソースコード・ファイルをコンパイルして作成した実行用ファイルは,ターゲットのOS上で直接動作させられます。これに対してJavaは,ソースコードをコンパイルして作成したクラス・ファイルをOS上で直接実行させることができません。Javaのクラス・ファイルを実行させるための環境を提供するのが,Java仮想マシン(Java Virtual Machine,以下JVM)というソフトウエアです。
 JVMは,Windows用,Linux用といったようにコンピュータのOSごとに用意されています。JVMがOSごとの違いを吸収してくれるため,同じクラス・ファイルがどのOSでも動作します。Javaのこうした特徴を「Write Once,RunAnywhere(1度書けば,どこでも動く)」と呼びます。
 パソコンやサーバー以外にもJVMは用意されています。小さなところでは,スマート・カードと呼ばれるICカード上のチップ,携帯電話,携帯情報端末(PDA),カーナビゲーション・システム,業務用コピー機,大きなところでは,発電所の監視システム,メインフレームなどで,それぞれのプラットフォーム向けのJVMがあります。(石原)

Q.5 J2SEやJ2EEって何ですか? 現在,Java技術は,大きく分けて3種類のプラットフォーム向けに区別されています。小型端末向けの「Java 2Platform,Micro Edition(J2ME)」,主にパソコンがターゲットの「Java 2 Platform,StandardEdition(J2SE)」,企業システムなどのサーバー向けの「Java 2 Platform,EnterpriseEdition(J2EE)」です。ただし,これらは2005年6月に名称が変わりました。それぞれ,「Java MicroEdition(Java ME)」「Java Standard Edition(Java SE)」「Java EnterpriseEdition(Java EE)」が今後は正式名称になります。
 三つの中で,標準的な仕様がJava SEです。Java EEは実行環境としてJava SEを必要とします。JavaMEの中にはJava SEと同じJVMを使う「Connected Device Configuration(CDC)」と,JavaSEよりも機能を制限したJVMを使う「Connected Limited Device Configuration(CLDC)」があります。
 Java EEとJava SEはバージョン番号が統一されています。Java EE 5に必要な環境はJava SE 5といったように,基本的に同じバージョン同士で動作します。(石原)
Q.6 本当に同じコードがどこでも動くのですか?
      
Q.6 本当に同じコードがどこでも動くのですか? Javaではプラットフォームの違いをJava仮想マシン(JVM)が吸収するため,基本的に同じクラス・ファイルが異なるプラットフォームで動作します。このため,Javaの移植性の高さを表す標語として「Write Once,RunAnywhere」という言葉が生まれました。「一度書けば,どこでも動く」という特徴をJavaのウリにしようとしたのです。
 しかし現実には,各種JVMの間の互換性やJVMの上に搭載されているフレームワークの種類の違いといった問題により,プラットフォームに応じてソースコードを修正しなければ動かないことが多々あります。これを皮肉った「Write Once,TestAnywhere(1度書いて,どこでもテストする)」という言葉もあるほどです。ただ,「テストして修正すれば動く」というのは,ほかの言語と比較するとはるかに高い移植性であることに間違いはありません。(米持)

Q.7 Javaでは開発者がメモリーを管理しなくていいと聞きましたが?
図2●世代別GCの基本的な考え方。メモリー空間を二つに分けて,それぞれの領域に対してGCを行う。何回かGCを実行しても回収されなかったオブジェクトは短命オブジェクト領域から長寿オブジェクト領域に移す
 Javaの実行環境であるJava仮想マシンは,「ガーベジ・コレクション(GarbageCollection,以下GC)」と呼ぶメモリー管理機能を備えています。ガーベジとはゴミのことで,不要になったメモリー空間,すなわち「ゴミ」を,プログラム実行中に回収(collection)して,再び利用できるようにするための仕組みです。
 GCには様々な方法があります。どのオブジェクトからも参照されていない“アクセス不能”なオブジェクトをゴミと判断して,そのオブジェクトが占めているメモリー領域を自動的に解放し,ほかの用途に使えるようにするというのがGCの基本的な考え方です。
 GCが不要になったメモリー空間を解放してくれるJavaに対して,C/C++言語では開発者がメモリー空間の取得,解放をプログラム中に明示的に指示してやる必要があります。そのため,JavaではC/C++に比べてメモリー管理周りのバグが発生しにくいとされています。Java以前にもSmalltalkやLispなどGCを備えたプログラミング言語がありました。しかしGCを備えて商業的に成功した言語はJavaが最初と言っていいでしょう。
 Javaが登場した当初は,GCを行う際にアプリケーションの実行をいったんすべて中断する「Stop TheWorld」方式を採用していたため,GCが処理速度の低下を招いていました。近年では,「並行GC」「同時進行GC」「世代別GC」といった機構を取り入れることにより,アプリケーションをほとんど停止させることなく,不要なメモリー空間を高速に解放できるようになりました(図2[拡大表示])。(石原)

Q.8 Javaってアプリケーション開発が簡単なんですか? Javaは,誕生当初は,既存の言語(CやC++)に比べてアプリケーション開発が容易だと強調されていました。ただ最近では,企業システム向けのJava EEは難しいという声をよく聞きます。
 この状況に対応するため,Javaコミュニティは2003年ごろから「Ease ofDevelopment(EoD,開発を容易に)」というスローガンを強調しています。EoDの掛け声の下,言語仕様の簡素化,フレームワークの標準化,初級者向け開発ツールのリリースなどが行われています。難しいとの批判が多かったJava EEのEnterpriseJavaBeans(EJB)も,次期バージョン3.0で批判意見を大胆に取り入れ,EoD路線への転換を図っています。(石原)

Q.9 Javaにはポインタはないですよね? 「JavaにはC/C++で言うところのポインタという概念がありません」と書いてある解説書をたまに見かけますが,それは正確には間違っています。Javaからポインタに直接アクセスできないだけで,内部ではきちんとポインタを使っています。
 例えば,オブジェクトを生成するnew演算子を実行すると,戻り値として「参照値」と呼ばれるデータが返ってきて,参照変数に代入されます。参照値はnewで生成したオブジェクトそのものではなく,生成したオブジェクトの在り処を示す値ですから,実質上ポインタと同じ役割を果たしています。
 しかし,Javaの「参照値」に対してプログラム上で処理を行うことはできません。例えば参照値に対して,C/C++のポインタのように「10を足す」計算をしたり,0を代入するなど値を直接セットするといった操作はできないようになっています。
 Javaはポインタを「参照値」という概念で隠ぺいし,直接アクセスできないようにすることで安全性を高めているわけです。参照やガーベジ・コレクションといったJavaの機能は,バッファ・オーバーランなどによるデータ領域破壊やメモリー・リークなどのメモリー管理にまつわるトラブルを防止するのに役立っています。(米持)

Q.10 クラスライブラリって何のことですか? Javaのソースコードをコンパイルすると,クラスという単位でファイルに分かれてバイトコードに変換されます。このとき生成されるファイルがクラス・ファイルです。Java仮想マシンは,アプリケーションを実行するときに,必要なクラス・ファイルを組み合わせていきます。クラス・ファイルはいわばWindowsにおけるダイナミック・リンク・ライブラリ(DLL)のようなものです。
 クラスライブラリは基本的に,クラス・ファイルを集めたものです。ただし,クラス・ファイルを適当に寄せ集めたものはクラスライブラリとは呼びません。ある用途に適した,再利用性の高いクラス・ファイルを集めたものでなければなりません。例えば,アプリケーションを作るときに使うAPIを集めたものなどがクラスライブラリです。
 Javaではプログラムを配布するときに,関連があるクラス・ファイルをJAR(JavaARchive)という名前のZIPファイルにまとめることになっています(拡張子は「.jar」)。Javaのクラスライブラリは通常,Jarファイルとして提供されています。(米持)

Q.11 JREやJDKはJava仮想マシンとどんな関係があるのですか?図3●Java仮想マシン(JVM),JRE,JDKの関係
 Javaプログラムが動作するには,実行環境であるJava仮想マシン(JVM)だけでなく,標準的なクラスライブラリ(APIとその実装)が必要です。こうしたプログラム実行に必要なソフトをパッケージ化したものが,Java RuntimeEnvironment(JRE)です。すでにあるアプレットやJavaアプリケーションを動かしたいだけならJREで十分です。JREにコンパイラなど開発環境として必要なソフトを追加したパッケージがJava Development Kit(JDK)です(図3)。
 Windows,Linux,Solarisなど一般的なOS用のJREやJDKは,米Sun Microsystemsが無償で提供しています(http://java.sun.com/j2se/)。ほかに,米IBMなどのベンダーも,自社製プラットフォーム向けなどにJREやJDKを提供しています。(石原)
Q.12 どんな開発ツールがありますか? Javaは,発表された当時から米Sun MicrosystemsがJava DevelopmentKit(JDK)という無償のパッケージを標準の開発ツールとして提供しています。JDKには,コンパイラをはじめとするJavaプログラミングのための必要最低限の機能が含まれており,開発者はJDKを入手すればとりあえず開発を始められます。
 JDKは,コマンドライン環境で使うjavacというコンパイラを中心にした環境です。このため従来は,普通のテキスト・エディタでソースコードを記述し,コマンドラインでコンパイルするのが一般的でした。企業でのJavaアプリケーションの開発では,米BorlandSoftwareのJBuilderなどのGUI環境で動作するIDE(統合開発環境)が使われることもありました。
 最近では,無償で利用できるJava用IDEが一般的になってきています。例えば,米IBMの開発ツールを起源に持つオープンソースのIDEであるEclipseは,Javaの開発ツールのデファクト・スタンダードとして広く使われるようになってきました。SunMicrosystemsは,オープンソースのIDEであるNetBeansをJDKにオプションで同梱して提供しています。(米持)

Q.13 java.netやJava.comって何ですか? 簡単に言うと,Java開発者のためのサイトがjava.net,JavaユーザーのためのサイトがJava.comです。
 java.netには,Java開発者のために様々なツールが用意されています。申請さえすれば,Webページ,メーリング・リスト,Wiki,Blog,CVSレポジトリなどをすべて無料で利用できます。次期Java StandardEditionの「Mustang」や3Dデスクトップの「Project Looking Glass」もこのjava.net上で開発されています。
 java.netは主にオープンソース・コミュニティなどの開発プロジェクトを念頭において作られていますが,ユーザー・グループや情報交換のためのコミュニティも参加しています。今後,Java技術の多くのAPIは,java.net上で開発されていくと思われます。java.netを観察することで,将来のJava技術の様子をうかがうことができるでしょう。
 Java.comは,ユーザー向けのサイトなので,Java実行環境のダウンロード,Duke(Javaのマスコット)コーナー,Javaゲームやアプリケーションの紹介が行われています。開発者が,一般ユーザー向けのアプリケーションを開発した場合,Java.comに登録することで多くのユーザーに使用してもらえるようになります。なお,Dukeコーナーにある3DのDukeが動くアプレットは,日本のエイタロウソフトという会社が開発したものです。(石原)

Q.14 Javaの新しい仕様は誰が決めているのですか? Javaの仕様は,もともとの開発元である米SunMicrosystemsがすべて決めていると思っている人はいませんか。確かに発表当初はそうでしたが,現在ではJavaの仕様はJavaCommunityProcess(JCP)という団体が策定しています。業界全体で新しい仕様を定めているのが,現在のJavaの大きな特徴です。JCPが設立されたのは1998年で,バージョン1.4以降のJavaの仕様は,基本的にJCPが決めています。
 JCPには,法人,非営利団体,個人のいずれの資格でも参加が可能です。JCPのメンバーになれば,新しいJava技術の仕様を提案できます。その提案がJCPのExecutive Committeeという委員会に認められれば,Java SpecificationRequest(JSR)として通し番号が割り振られます。例えば,EJB 2.0はJSR番号19,J2SE 1.4はJSR番号59です。
 JSR番号が振られた後は,代表者であるSpec Lead(仕様策定者)が定められ,その分野の専門家が集まって,ExpertGroupが構成されます。このExpertGroup内での議論の中で仕様が固まっていきますが,適宜,ドラフトの形で仕様案が公開され,ほかのJCPメンバーや一般の開発者,ユーザーからのフィードバックを受け付けます。
 最終的に仕様が策定されると,仕様に基づいて作られた実装(参照実装)が公開されます。第三者が実装を作った場合,仕様と互換性があるかどうかをチェックするためのテスト・ツール(Technology Compatibility Kit)も同時に公開されます。(石原)

Q.15 Javaはオープンソースではないのですか? Q.14にあるように,Javaの仕様策定のプロセスは基本的にオープンです。米SunMicrosystemsが無償で提供しているJDKの中には,Javaで記述されているAPI(クラスライブラリ)のソースコードが添付されていますし,現在のライセンスではJava以外の言語で記述された部分のソースコードの閲覧や修正も可能です*4。さらに,WebコンテナのTomcatやフレームワークのStrutsなどJava関連のソフトウエアにはオープンソースのものがたくさんありますから,Javaもオープンソースだと考えている人もいるかもしれません。
 しかし,基盤のJava実行環境自体はまだオープンソース・ソフトウエアではありません。Javaの実行環境を開発しても,厳密な認定テストをパスしないと提供できないようになっていて,この点は,既存のオープンソースのライセンスではカバーされないからです。オープンソース化によって様々な実行環境が乱立すると,「Write Once,RunAnywhere」というJavaの大きな原則が崩れ去る恐れがあります。そうなれば,開発者もユーザーも不利益を被るでしょう。現在は,オープンソースに近い緩やかなライセンス形態を徐々に採用しながら,現実的な解を模索している状況です。(石原)

Q.16 最新版のJava(JDK5.0)で何が変わったか教えてください 2004年9月に発表されたJ2SEの最新版である5.0(開発コード名は「Tiger」)では,8000以上のバグフィックスが行われたほか,様々な変更がありました。
 言語仕様は「Ease ofDevelopment(EoD)」のコンセプトに基づいて,大きく変更され,「アノテーション(annotation)」「ジェネリックス(generics)」「ボクシング(boxing)」「拡張ループ文」などが導入されました。中でも重要なのが「アノテーション」という機能です。アノテーションを利用すると,ソースコードに短い決まり文句を埋め込むだけで,特定の機能をプログラムに追加できるようになります。これにより,開発者は煩雑なコードや設定を書くわずらわしさから解放されます。初心者向けの開発ツールやフレームワークにとって特に効果が大きい技術だと言えるでしょう。
 型の汎用化機能であるジェネリックスや,それに伴う型の自動変換機能のボクシングも,導入が待たれていたものです。ジェネリックスは,具体的な型ではなく「型仮引数」を用いて,クラスを定義する際の型を指定する機能です。インスタンス生成時に,型宣言によって具体的な型に置き換えられます。クラスライブラリなどの開発に有効でしょう。一方のボクシングは,数値のような基本データ型をクラスの参照型に変換してくれる機能です。(石原)

Q.17 JavaScriptとの関係は? JavaとJavaScriptは名前や文法が似ていますが,全く違う言語です。JavaScriptはもともと米NetscapeがWebブラウザのNetscapeNavigatorに搭載するために開発したスクリプト言語です。開発当初はLiveScriptと呼ばれていましたが,注目度の高いJavaにあやかってJavaScriptと改名したのです。
 JavaScriptも一応はオブジェクト指向の機能を持っています。けれどJavaとは異なり継承やアクセス範囲の制限といった機能は持っていません。JavaScriptは主にWebブラウザ上で動作するプログラムを記述するのに使われるので,それほど大規模なプログラムを作ることは想定していないのです。また,Javaではソースコードをコンパイルしてバイトコードに変換してから実行するのに対し,JavaScriptはソースコードを逐次読み込んで実行するインタプリタ方式を採用しています。
 ちなみに,最近,GroovyというJavaをベースにしたスクリプト言語が注目されています。「JSR 241」としてJavaCommunityProcess(JCP)により標準化が進められており,将来のJDKに採用される可能性もあります。Groovyこそが真の“Javaスクリプト”と言えるようになるのかもしれません。(米持)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注~册

本版积分规则

小黑屋|手机版|咖啡日语

GMT+8, 2025-1-11 19:49

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表