言語仕様の読み方


言語仕様書

Javaの言語仕様は, The Java Language Specificationに書かれている.言語の仕様の全容を知るには, これを読む必要がある.言語仕様書の読み方の解説をする.目次のページを見 てみる.
  1. Introduction
  2. Grammers
  3. Lexical Structure
  4. Types, Values, and Variables
  5. Conversions and Promotions
  6. Names
  7. Packages
  8. Classes
  9. Interfaces
  10. Arrays
  11. Exceptions
  12. Execution
  13. Binary Compatibility
  14. Blocks and Statements
  15. Expressions
  16. Definite Assignment
  17. THreads and Locks
  18. Documentation Comments
  19. LALR(1) Grammer
  20. The Package java.lang
  21. The Package java.util
  22. The Package java.io
たとえば,どのような文(statement)があるかは 14. Blocks and Statementsを見ると分かる.読み方のポイントとして,たとえば while文の文法(Syntaxは) 14.11 The while Statementを見ると,
WhileStatement:
while ( Expression ) Statement WhileStatementNoShortIf:
while ( Expression ) StatementNoShortIf
のようになる.これは,BNF(Backus Naur Form)という形式で書かれている. 意味は「:」の左側の構文要素は右側の構文要素からなるということである. 斜体(イタリック)で書かれたのは非終端記号(Non Terminal Symbol),立体で 書かれたのが終端記号(Terminal Symbol)で,それぞれ変数,文字列定数のよ うなものだと思ってよい.斜体で表された非終端記号は仕様書の別の部分で定 義されている.たとえば,Statement 14.5 Statementsで,以下のように定義されている.
Statement:
StatementWithoutTrailingSubstatement
LabeledStatement
IfThenStatement
IfThenElseStatement
WhileStatement
ForStatement
このように,構文要素に非終端記号として名前をつけていって,最終的には終 端記号に至るという形で,言語の文法(syntax)が定義される.言語の意味 (semantics)の定義では,BNFのような標準的な方法はない.操作的意味論,表 示的意味論などいくつかの数学的な定式化があるが,どれも容易ではないので, 論文の中以外ではあまり見掛けることはない.このJavaの言語仕様のように自 然言語(英語,日本語)で表現するのが一般的である.

パッケージと標準API

オブジェクト指向言語の特徴として,一度書いたコードを再利用できる点が あるが,いろいろな人が作ったライブラリを利用しようとすると同じ名前のク ラスを作ってしまうという心配がある.これを防ぐための仕組みがパッケージ である.ソースの最初に
 package jp.ac.u_tokyo.ecc.ktanaka;
のように定義しておくと,その中で
public class Soko{
}
のように定義したクラスの正式名は,jp.ac.u_tokyo.ecc.ktanaka.Soko となる.
 package jp.ac.u_tokyo.ecc.tt97170;
として定義した Sokoクラス jp.ac.u_tokyo.ecc.tt97170.Soko と区別するこ とができる.Java言語の基本的なライブラリ(標準 API)を除くと,このように クラスの作者のメールアドレスと関連づけたパッケージ名を使うことが推奨さ れている.ただし, このように書くと CLASSPATHで指定したディレクトリから 相対パス で jp/ac/u_tokyo/ecc/tt97170 となるディレクトリに置かれること を意味するので, 小さいプログラムではパッケージなどは作らなくても良い.

Java言語で標準的に使うことのできるクラスは標準API(Application Interface)と呼ばれる.言語の標準が,JDK1.0, 1.1, 1.2, 1.3 と変化するに つれて,標準APIも拡大してきている.

Java SDK 1.4の標準APIは, Java2 Platform, Standard Edition, 1.4.0 API仕様 で 見ることができる.各クラスは,用途に応じて様々なパッケージに入っている. たとえば Stringは java.lang という名前のパッケージ,BufferedReaderは java.ioという名前のパッケージに属している.標準API中のBufferedReader は特になにもしなくても, java.io.BufferedReader という名前で用いることが できるが,ソースファイルの最初に

import java.io.*;
のように書いておくことによって,BufferedReaderという短い名前で使うこ とができる.なお,java.langというパッケージについてだけは明示的に
import java.lang.*;
としなくても短い名前を使うことができる.
オブジェクト指向の概念として,重要なものとして情報の隠蔽がある.ある クラスを使う(インスタンスを作る,サブクラスを作る)プログラマ(元のクラ スを作ったプログラマと別人である可能性が高い)に,想定しない使われ方を されないように,データフィールドやメソッドの一部をクラス外からは使えな くするというものである.この制限を外すための宣言が,データフィールドや メソッドの前につけた public である.

Java言語は教育用言語として開発された Pascalとは違って,大規模なプログ ラムを作るプロ向けに開発された言語なので,このような細かい機能が用意さ れているが,プログラミング入門のレベルでは,すべてのデータフィールドと メソッドに public をつけるという方針でも良い.しかし,プロを目指す人は 必要な所以外では(それを理解するのは大変だが) public はつけないよう,心 掛けたい.


課題問題