このページではJavaScriptを使用しています。

Java言語編

(ubuntu 22.04LTS版)

ubuntu 22.04版でもJava言語環境で日本語プログラムを実行してみようと思います。簡単なJava言語の紹介については、Windows版Java言語編をご覧ください。

ubuntu-OSもバージョンによって正式なサポート期間が決まっていて、現在ubuntu 22.04LTS版では2027年の4月までは確実にサポートされます。このOSバージョンでも以下の練習問題の動作確認を行っています。

ubuntu 20.04版はこちら

今回はopenjdk 18.0.2-eaというバージョンのJava言語処理系を利用しました。下記の画像はインストール直後にバージョンを表示させたものです。

日本語で書かれたJava言語ファイルの名前を仮にファイル1.jjavaとすると

$./jjava ファイル1

というシェルスクリプトによりファイル1.javaを生成し、さらに翻訳(javacによるコンパイル)を行い、Javaバイトコード(中間コード)であるファイル1.classを生成します。jjavaというスクリプトは、Windows版Java言語の場合のバッチファイルとほとんど同じ仕様です。この内容を以下に示します。 jjava_ruleは1パス目、jjava_rule2というのは2パス目の規則を日本語Javaプログラムに対して実行します。なお、現バージョンでは「-encoding UTF-8」というコンパイルオプションは、デフォルトで設定されているので、省略できるようになっています。

ubuntu版Java言語編でも、自分でよく使う予約語や演算子などの日本語定義部分をプログラムとは別に、外部である程度まとめて宣言できるようにしておきます。そして処理するときにバッチコマンドの機能を利用して、宣言ファイルと日本語Javaファイルを結合して、日本語定義部分を通常のJava言語に置き換えをするということにしました。

以下は、各プログラムとは別に定義した日本語Java宣言ファイル「std_include.jjava」の内容です。

(スマホ、タブレット等、閲覧環境によっては、このページ内のプログラムコードがすべて表示されないこともあります)


#日本語定義 整数型 	"int"
#日本語定義 文字型	"char"
#日本語定義 実数型	"float"
#日本語定義 論理型	"boolean"

#日本語定義 型なし 			"void"
#日本語定義 全域で使用可 		"public"
#日本語定義 仲間内で使用可		"private"
#日本語定義 派生の仲間まで使用可	"protected"
#日本語定義 一つの実体だけ		"static"
#日本語定義 引き継ぎ			"extends"
#日本語定義 実装			"implements"
#日本語定義 【定型】はじまり		"public static void main"

#日本語定義 もし	"if"
#日本語定義 それ以外	"else"
#日本語定義 戻る	"return"
#日本語定義 繰り返し 	"while"
#日本語定義 反復	"for"
#日本語定義 後判定反復	"do"
#日本語定義 実体作成	"new"
#日本語定義 振り分け	"switch"
#日本語定義 場合分け	"case"
#日本語定義 振り分け終了 "break"
#日本語定義 やってみる	"try"
#日本語定義 例外	"catch"

#日本語定義 真	"true"
#日本語定義 偽	"false"
#日本語定義 かつ	"&&"
#日本語定義 または	"||"

// クラス関係

#日本語定義 はじまり	 "main"
#日本語定義 仲間の集まり "class"
#日本語定義 文字列の仲間 "String"
#日本語定義 窓枠の仲間 	 "Frame"
#日本語定義 字体の仲間 	 "Font"
#日本語定義 図画の仲間 	 "Graphics"
#日本語定義 文書領域の仲間 	 "TextArea"
#日本語定義 メニュー欄の仲間 	 "MenuBar"
#日本語定義 メニュー中項目の仲間 "Menu"
#日本語定義 メニュー小項目の仲間 "MenuItem"
#日本語定義 二次元図画の仲間	"Graphics2D"

#日本語定義 窓処理の仲間を呼ぶ 		"import java.awt.*"
#日本語定義 出来事処理の仲間を呼ぶ 	"import java.awt.event.*"
#日本語定義 いろいろと使える仲間を呼ぶ	"import java.util.*"
#日本語定義 データ転送の仲間を呼ぶ	"import java.awt.datatransfer.*"
#日本語定義 図形描画の仲間を呼ぶ	"import java.awt.geom.*"


#日本語定義 窓枠を適応させる仲間 	"WindowAdapter"
#日本語定義 動作に対するご用聞き	"ActionListener"
#日本語定義 キー入力に対するご用聞き	"KeyListener"
#日本語定義 動作に伴うでき事の仲間	"ActionEvent"


#日本語定義 整数の仲間 	 "Integer"
#日本語定義 整数値 	 "intValue()"
#日本語定義 文字列を整数に変換 	 "Integer.valueOf"

#日本語定義 表示する	"System.out.println"
#日本語定義 終了する	"System.exit(0)"
#日本語定義 引数が数値ではない	"NumberFormatException ne"
#日本語定義 引数がない		"IndexOutOfBoundsException ob"

#日本語定義 窓枠ご用聞きの追加	  "addWindowListener"
#日本語定義 動作ご用聞きの追加 	  "addActionListener"
#日本語定義 項目ご用聞きの追加 	  "addItemListener"
#日本語定義 キー入力ご用聞きの追加 "addKeyListener"

#日本語定義 動作が実行されたとき   "actionPerformed"


#日本語定義 窓枠を閉じる 	   "windowClosing( WindowEvent win_evnt )"

これ以降の例題では、プログラム内に上記の日本語定義の部分はありません。

例題U22-1 うるう年かどうかを判定するプログラム
例題U22-2 曜日を求めるプログラム
例題U22-3 現在の刻(こく)を表示するプログラム
例題U22-4 簡単なメモ紙
例題U22-5 二次元の図形
例題U22-6 長いπの計算

例題U22-1 うるう年かどうかを判定するプログラム

はじめに、例U22-1として西暦年を入力し、その年がうるう年かどうかを判定するプログラムを示します。Windows版の同じプログラムで「剰余計算」に「%」として定義していたものをubuntu版では「%%」としています。 また、最近のjava処理系は変数名、関数名、クラス名などに日本語を直接使っても問題なく処理してくれますので、プログラム中に日本語カスタマイザーの自動変数定義は使っていません。また、入力した引数が数値でなかったり、引数がなかったりした場合には、javaシステムからのエラーメッセージを出さないで、何もせずに終了するようにします。さらに、"public static void main"は少し強引ですが、よく使われる一連の定義として「【定型】はじまり」という日本語を使っています。


// 西暦を入力し、その年がうるう年かどうかを判定する
#日本語定義 例題22-1	 "ex1"

#日本語定義 うるう年である	"1"
#日本語定義 うるう年ではない 	"0"
#日本語定義 がうるう年である 	"== 1"
#日本語定義 剰余計算 		"%%"
#日本語定義 が割り切れる 	"== 0"
#日本語定義 ならば		" "

仲間の集まり 例題22-1{

	【定型】はじまり( 文字列の仲間 引数[] ) 
	{
	
		整数の仲間  年のデータ = 1;
		
		やってみる {
		(定型)はじまり	年のデータ = 文字列を整数に変換( 引数[0] ) ;
		} 例外 ( 引数がない  ) {
			強制終了;
		} 例外 ( 引数が数値ではない ) {
			強制終了;
		}
		
		文字列の仲間 結果表示[] = {"うるう年ではない","うるう年である"};
		表示する( "西暦" + 年のデータ.整数値 + "年は" + 結果表示[うるう年の判定( 年のデータ.整数値 )] );
	}

	一つの実体だけ 整数型 うるう年の判定(整数型 その年)
	{
		もし		( ( その年 剰余計算 400)が割り切れる ) ならば { 戻る うるう年である;}
		それ以外 もし	( ( その年 剰余計算 100)が割り切れる ) ならば { 戻る うるう年ではない;}
		それ以外 もし	( ( その年 剰余計算   4)が割り切れる ) ならば { 戻る うるう年である;}
		戻る うるう年ではない;
	} 

}

例U22-1

Java言語では豊富なクラスライブラリーが提供されておりますので、それをどういうふうに使いこなしていくのかが、使う人の力量ということになるのではないでしょうか。 これは次のようなJava言語のコードに展開されます。(注:実際にはstd_include.jjava中の「// クラス関係」という注釈文字列が残りますが、この部分は割愛しています)


// 西暦を入力し、その年がうるう年かどうかを判定する

class ex1{

	public static void main( String 引数[] ) 
	{
	
		Integer  年のデータ = 1;
		
		try {
			年のデータ = Integer.valueOf( 引数[0] ) ;
		} catch ( IndexOutOfBoundsException ob  ) {
			System.exit(0);
		} catch ( NumberFormatException ne ) {
			System.exit(0);
		}
		
		String 結果表示[] = {"うるう年ではない","うるう年である"};
		System.out.println( "西暦" + 年のデータ.intValue() + "年は" + 結果表示[うるう年の判定( 年のデータ.intValue() )] );
	}

	static int うるう年の判定(int その年)
	{
		if	( ( その年 % 400)== 0 )   { return 1;}
		else if	( ( その年 % 100)== 0 )   { return 0;}
		else if	( ( その年 %   4)== 0 )   { return 1;}
		return 0;
	} 

}

例U22-1を展開したもの

次は例U22-1のプログラムを実行させ、西暦を2000年、2019年、2024年としたときの結果です。 うるう年の判定が、正しくできることを確認しました。

例U22-1では、ちょっと複雑なプログラムになっていますが、Java用日本語カスタマイザーの性能を試す目的もあります。補足ですが、Javaシステムが提供しているGregorianCalendarクラスを使えば、すっきり書くことができます。以下にその日本語プログラムを参考として提示します。実行動作については上記と全く同じように使用できますが、GregorianCalendarクラスは紀元前にまで適用できるようです。


// 西暦を入力し、その年がうるう年かどうかを判定するうる(GregorianCalendar版)

#日本語定義 例題22-1補足	 "ex1h"
#日本語定義 暦の仲間を呼ぶ	"import java.util.Calendar"
#日本語定義 西暦の仲間を呼ぶ	"import java.util.GregorianCalendar"
#日本語定義 西暦の仲間		"GregorianCalendar"
#日本語定義 はうるう年である	".isLeapYear"

暦の仲間を呼ぶ;
西暦の仲間を呼ぶ;
 
仲間の集まり 例題22-1補足{
 
	【定型】はじまり( 文字列の仲間 引数[] ) {
 
  		整数の仲間  年のデータ = 1;

		やってみる {
			年のデータ = 文字列を整数に変換( 引数[0] ) ;
		} 例外 ( 引数がない   ) {
			終了する;
		} 例外 ( 引数が数値ではない ) {
			終了する;
		}

        	西暦の仲間 暦くん = 実体作成 西暦の仲間();
 
	 	もし ( 暦くんはうるう年である(年のデータ) ) {
	        	表示する(年のデータ + "年は「うるう年」です。");
	 	} それ以外 {
	        	表示する(年のデータ + "年は「うるう年」ではありません。");
	 	}
	}
 
}

例題U22-2 曜日を求めるプログラム

次の例は、平成1年(西暦1989年)の1月1日が日曜日であったことを利用して、指定した日の曜日を求めるプログラムです。西暦と年月日を入力すると、曜日と元号を表示するプログラムです。 ただし、1989年は平成元年ではありますが昭和の最後の週の年でもありますので、元号は「昭和64年/平成元年」としています。また、2019年の元号は「平成31年/令和元年」としています。 なお、1989年より小さい西暦年や2099年より大きい西暦年を入力するとプログラムは終了するようにもしています。

この例題ではパッケージ宣言というものを使用して、いくつかの独立したクラスファイルを同じディレクトリ内にまとめるようにします。パッケージ名は、「ex2」としました。まず「ex2」というディレクトリを作成して、その中に以下の日本語Javaプログラムである「ex2.jjava」を書き込みます。


//1989年(平成元年)1月1日が日曜日であったことを利用して、指定した日の曜日を求める
#日本語定義 例題22-2	 	"ex2"

#日本語定義 年のデータ	"y_val"
#日本語定義 月のデータ	"m_val"
#日本語定義 日のデータ	"d_val"

#日本語定義 ならば		" "
#日本語定義 の個数が正常 	".length == 3"
#日本語定義 年月日が正常範囲である
#日本語定義 曜日の表示データ

#日本語定義 例題22-2のファイルをまとめる	"package ex2"
例題22-2のファイルをまとめる;

仲間の集まり 例題22-2{

	【定型】はじまり( 文字列の仲間[] 引数 ) {

		整数の仲間 年のデータ = 1, 月のデータ = 1, 日のデータ = 1;


		もし ( 引数の個数が正常 )
		ならば {
			やってみる {
				年のデータ = 文字列を整数に変換( 引数[0] ) ;
				月のデータ = 文字列を整数に変換( 引数[1] ) ;
				日のデータ = 文字列を整数に変換( 引数[2] ) ;
			} 例外 ( 引数が数値ではない ) {	
				終了する ;
			}

			うるう年計算の仲間 うるうの介 = 実体作成 うるう年計算の仲間();
		
			もし ( うるうの介.年月日が正常範囲である( 年のデータ.整数値, 月のデータ.整数値, 日のデータ.整数値 ) ) 
			ならば {
				表示する( "西暦" +年のデータ.整数値 + "年" +  月のデータ.整数値 + "月" + 日のデータ.整数値 + "日は" );

				日数計算の仲間 日数太郎 = 実体作成 日数計算の仲間();
				整数型 合計補正日数 = 
					日数太郎.補正日数を求める( 年のデータ.整数値, 月のデータ.整数値,日のデータ.整数値 );

				曜日の仲間 曜日の丸= 実体作成 曜日の仲間();
				表示する( 曜日の丸.曜日の表示データ(合計補正日数 剰余計算 7 ) + "曜日です" );
				もし ( 平成元年である ) ならば {
					表示する(  "また" + 年のデータ.整数値 + "年は" + "昭和64年/平成元年です");
				}
				それ以外 もし ( 平成である ) ならば { 
					表示する(  "また" + 年のデータ.整数値 + "年は" + "平成" + (年のデータ-= 1988) + "年です");
				}
				それ以外 もし ( 令和元年である ) ならば {
					表示する(  "また" + 年のデータ.整数値 + "年は" + "平成31年/令和元年です");
				}
				それ以外 ならば { 
					表示する(  "また" + 年のデータ.整数値 + "年は" + "令和" + (年のデータ-= 2018) + "年です");					
				}
			}
		}

	}
}

#日本語定義 うるう年計算の仲間	"ex2$urutoshi"

#日本語定義 うるう年である	"true"
#日本語定義 うるう年ではない 	"false"
#日本語定義 がうるう年である 	"== true"
#日本語定義 剰余計算 		"%%"
#日本語定義 が割り切れる 	"== 0"
#日本語定義 が割り切れない 	"!= 0"

#日本語定義 年が正常範囲 	"((1989 <= y_val)&&(y_val <= 2099))"
#日本語定義 月が正常範囲 	"((1 <= m_val)&&(m_val <= 12))"
#日本語定義 年月の正常範囲	"(1989 <= y_val)&&((1 <= m_val)&&(m_val <= 12))"
#日本語定義 平成元年である	"(y_val == 1989)"
#日本語定義 平成である		"((1989 < y_val)&&(y_val < 2019))"
#日本語定義 令和元年である	"(y_val == 2019)"

仲間の集まり うるう年計算の仲間 {
仲間内で使用可
	整数型 補正日数 = 0;
	整数型 月の最大日数[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

全域で使用可
	論理型 うるう年の判定(整数型 その年) {
		もし (  ( (その年 剰余計算   4)が割り切れる  ) かつ 
			( (その年 剰余計算 100)が割り切れない) または 
			( (その年 剰余計算 400)が割り切れる  ) ) 
		ならば { 戻る うるう年である; }
		それ以外 ならば 戻る うるう年ではない;
	}
	整数型 うるう年の補正( 整数型 年のデータ, 整数型 月のデータ ) {

		整数型 補正日数= 0;

		もし ( ( うるう年の判定( 年のデータ ) がうるう年である ) かつ ( 月のデータ <= 2 ) ) 
		ならば 補正日数 = -1;

		反復 ( 整数型 その年 = 1989; その年 <= ( 年のデータ ); ++その年 ) {
			もし ( うるう年の判定( その年 ) がうるう年である ) ならば ++補正日数;
		}
		戻る(補正日数);
	}
	論理型 年月日が正常範囲である( 整数型 年のデータ, 整数型 月のデータ, 整数型 日のデータ ) {
		もし ( 年が正常範囲 かつ 月が正常範囲 かつ ( 1 <= 日のデータ ) )
		ならば  {

			もし ( ( 日のデータ <= 29 ) かつ ( 月のデータ == 2 ) かつ うるう年の判定( 年のデータ ) )
			ならば { 戻る 真; }

			それ以外 もし ( 日のデータ <= 月の最大日数[月のデータ-1] ) 
			ならば { 戻る 真; }
		}

		戻る 偽;
	}

}

#日本語定義 曜日の仲間	"ex2$youbi"

仲間の集まり 曜日の仲間 {
仲間内で使用可
	文字列の仲間 七つの曜日[] = {"日","月","火","水","木","金","土",};
全域で使用可
	文字列の仲間 曜日の表示データ(整数型 その日) {
		戻る 七つの曜日[その日]; 
	}
 
}

#日本語定義 日数計算の仲間 "ex2$7_youbi"

仲間の集まり 日数計算の仲間 {
仲間内で使用可
	整数型 月の補正日数[] = { 0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5 };

	整数型 合計補正日数;
全域で使用可
	整数型 補正日数を求める( 整数型 その年, 整数型 その月, 整数型 その日 ) {
		うるう年計算の仲間 うるうの介 = 実体作成 うるう年計算の仲間();
		合計補正日数 = (その年 - 1989) + 月の補正日数[その月-1]
			 + その日 - 1 + うるうの介.うるう年の補正(その年,その月);
		戻る 合計補正日数;
	}
}

例U22-2

コンパイルは以下のように

$./jjava ex2/ex2

と入力すると自動的にclassファイルを作成できます。

例U22-2では、少し入力のチェックにもこだわってみました。引数の数が違ったり、年、月、日が範囲外のものを入力しても計算は行われません。また、数字以外のものを入力すると、システムからエラーメッセージを出さずに終了するようにもしています。これは次のようなJava言語のコードに展開されます。


//1989年(平成元年)1月1日が日曜日であったことを利用して、指定した日の曜日を求める

package ex2;

class ex2{

	public static void main( String[] 引数 ) {

		Integer y_val =1, m_val = 1, d_val = 1;


		if ( 引数.length == 3 )
		  {
			try {
				y_val = Integer.valueOf( 引数[0] ) ;
				m_val = Integer.valueOf( 引数[1] ) ;
				d_val = Integer.valueOf( 引数[2] ) ;
			} catch ( NumberFormatException ne ) {	
				System.exit(0) ;
			}

			ex2$urutoshi うるうの介 = new ex2$urutoshi();
		
			if ( うるうの介.jp_str_0( y_val.intValue(), m_val.intValue(), d_val.intValue() ) ) 
			  {
				System.out.println( "西暦" +y_val.intValue() + "年" +  m_val.intValue() + "月" + d_val.intValue() + "日は" );

				ex2$7_youbi 日数太郎 = new ex2$7_youbi();
				int 合計補正日数 = 
					日数太郎.補正日数を求める( y_val.intValue(), m_val.intValue(),d_val.intValue() );

				ex2$youbi 曜日の丸= new ex2$youbi();
				System.out.println( 曜日の丸.jp_str_1(合計補正日数 % 7 ) + "曜日です" );
				if ( (y_val == 1989) )   {
					System.out.println(  "また" + y_val.intValue() + "年は" + "昭和64年/平成元年です");
				}
				else if ( ((1989 < y_val)&&(y_val < 2019)) )   { 
					System.out.println(  "また" + y_val.intValue() + "年は" + "平成" + (y_val-= 1988) + "年です");
				}
				else if ( (y_val == 2019) )   {
					System.out.println(  "また" + y_val.intValue() + "年は" + "平成31年/令和元年です");
				}
				else   { 
					System.out.println(  "また" + y_val.intValue() + "年は" + "令和" + (y_val-= 2018) + "年です");					
				}
			}
		}

	}
}

class ex2$urutoshi {
private
	int 補正日数 = 0;
	int 月の最大日数[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

public
	boolean うるう年の判定(int その年) {
		if (  ( (その年 %   4)== 0  ) && 
			( (その年 % 100)!= 0) || 
			( (その年 % 400)== 0  ) ) 
		  { return true; }
		else   return false;
	}
	int うるう年の補正( int y_val, int m_val ) {

		int 補正日数= 0;

		if ( ( うるう年の判定( y_val ) == true ) && ( m_val <= 2 ) ) 
		  補正日数 = -1;

		for ( int その年 = 1989; その年 <= ( y_val ); ++その年 ) {
			if ( うるう年の判定( その年 ) == true )   ++補正日数;
		}
		return(補正日数);
	}
	boolean jp_str_0( int y_val, int m_val, int d_val ) {
		if ( ((1989 <= y_val)&&(y_val <= 2099)) && ((1 <= m_val)&&(m_val <= 12)) && ( 1 <= d_val ) )
		   {

			if ( ( d_val <= 29 ) && ( m_val == 2 ) && うるう年の判定( y_val ) )
			  { return true; }

			else if ( d_val <= 月の最大日数[m_val-1] ) 
			  { return true; }
		}

		return false;
	}

}

class ex2$youbi {
private
	String 七つの曜日[] = {"日","月","火","水","木","金","土",};
public
	String jp_str_1(int その日) {
		return 七つの曜日[その日]; 
	}
 
}


class ex2$7_youbi {
private
	int 月の補正日数[] = { 0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5 };

	int 合計補正日数;
public
	int 補正日数を求める( int その年, int その月, int その日 ) {
		ex2$urutoshi うるうの介 = new ex2$urutoshi();
		合計補正日数 = (その年 - 1989) + 月の補正日数[その月-1]
			 + その日 - 1 + うるうの介.うるう年の補正(その年,その月);
		return 合計補正日数;
	}
}

例U22-2を展開したもの

例22-2のプログラムで平成1年1月8日、平成12年(西暦2000年)2月29日、平成18年(西暦2006年)2月3日、さらに平成最後の日となる平成31年(西暦2019年)4月30日、令和9年(西暦2027年)6月15日としたときの実行結果です。

パッケージ内にまとめられたプログラムの実行は、以下のように「パッケージ名.プログラム名」で実行できます。

補足ですが、指定した年月日に対する曜日を求める方法として、java.util.Calendarで使用できるget(Calendar.DAY_OF_WEEK)メソッドを使うと簡単に曜日が求められます。しかし、今回は日本語カスタマイザーの性能を試すということもあり、ちょっと複雑にしています。

例題U22-3 現在の刻(こく)を表示するプログラム

次に例U22-3として、現在の時間を読み出して、それを江戸時代の時間の読み方である「刻」として表示するプログラムを示します。今回は日本語カスタマイザーの自動変数定義も混在させています。 今回のubuntu20.04のJava版からは、「new」の置き換えとして「対象作成」ではなく「実体作成」という用語を使用しています


// 現在の刻を表示する
窓処理の仲間を呼ぶ;
出来事処理の仲間を呼ぶ;
いろいろと使える仲間を呼ぶ;

#日本語定義 例題22ー3	 "ex3"
//#日本語定義 引数

#日本語定義 題名を設定する 	"setTitle"
#日本語定義 大きさを設定する 	"setSize"
#日本語定義 可視かどうかを設定する 	"setVisible"
#日本語定義 背景色を設定する 	"setBackground"
#日本語定義 黄色 		"Color.yellow"
//#日本語定義 窓際族
//#日本語定義 派遣くん

全域で使用可 仲間の集まり 例題22ー3 引き継ぎ 窓枠の仲間 {

	【定型】はじまり( 文字列の仲間 引数[] ) {

		窓枠の仲間 窓際族 = 実体作成 例題22ー3();
		窓際族.題名を設定する("今の刻を表示する");
		窓際族.大きさを設定する(600,200);
		窓際族.背景色を設定する(黄色);
		窓際族.可視かどうかを設定する( 真 );

	}
	例題22ー3(){ 窓枠ご用聞きの追加( 実体作成 派遣くん()); }
	仲間の集まり 派遣くん 引き継ぎ 窓枠を適応させる仲間 {

		全域で使用可 型なし 窓枠を閉じる { 終了する; }

	}

//#日本語定義 絵なりくん
//#日本語定義 文字蔵さん

#日本語定義 領域に描画する "paint"
#日本語定義 傾斜太文字	   "Font.ITALIC|Font.BOLD"
#日本語定義 青色	   "Color.blue"
#日本語定義 文字を描く 	   "drawString"
#日本語定義 字体を設定する "setFont"
#日本語定義 色を設定する   "setColor"

	全域で使用可 型なし 領域に描画する( 図画の仲間 絵なりくん ) {

		文字列の仲間 文字列零   = "今の刻は";
		文字列の仲間 文字列一   = "子刻(ねのこく)です。";
		文字列の仲間 文字列二   = "丑刻(うしのこく)です。";
		文字列の仲間 文字列三   = "寅刻(とらのこく)です。";
		文字列の仲間 文字列四   = "卯刻(うのこく)です。";
		文字列の仲間 文字列五   = "辰刻(たつのこく)です。";
		文字列の仲間 文字列六   = "巳刻(みのこく)です。";
		文字列の仲間 文字列七   = "午刻(うまのこく)です。";
		文字列の仲間 文字列八   = "未刻(ひつじのこく)です。";
		文字列の仲間 文字列九   = "申刻(さるのこく)です。";
		文字列の仲間 文字列十   = "酉刻(とりのこく)です。";
		文字列の仲間 文字列十一 = "戌刻(いぬのこく)です。";
		文字列の仲間 文字列十二 = "亥刻(いのこく)です。¥n";

		字体の仲間 文字蔵さん = 実体作成 字体の仲間( "Serif", 傾斜太文字, 30 );

		絵なりくん.字体を設定する( 文字蔵さん );
		絵なりくん.色を設定する( 青色 );
		絵なりくん.文字を描く( 文字列零, 220, 100 );

		現在の時刻を取り出す;

		振り分け( 現在時刻 / 2 ) {
			場合分け 子刻: { 絵なりくん.文字を描く(文字列一,  120,150); }; 振り分け終了;
			場合分け 丑刻: { 絵なりくん.文字を描く(文字列二,  120,150); }; 振り分け終了;
			場合分け 寅刻: { 絵なりくん.文字を描く(文字列三,  120,150); }; 振り分け終了;
			場合分け 卯刻: { 絵なりくん.文字を描く(文字列四,  120,150); }; 振り分け終了;
			場合分け 辰刻: { 絵なりくん.文字を描く(文字列五,  120,150); }; 振り分け終了;
			場合分け 巳刻: { 絵なりくん.文字を描く(文字列六,  120,150); }; 振り分け終了;
			場合分け 午刻: { 絵なりくん.文字を描く(文字列七,  120,150); }; 振り分け終了;
			場合分け 未刻: { 絵なりくん.文字を描く(文字列八,  120,150); }; 振り分け終了;
			場合分け 申刻: { 絵なりくん.文字を描く(文字列九,  120,150); }; 振り分け終了;
			場合分け 酉刻: { 絵なりくん.文字を描く(文字列十,  120,150); }; 振り分け終了;
			場合分け 戌刻: { 絵なりくん.文字を描く(文字列十一,120,150); }; 振り分け終了;
			場合分け 亥刻: { 絵なりくん.文字を描く(文字列十二,120,150); }; 振り分け終了;
		}

	}

}

#日本語定義 現在の時刻を取り出す "Calendar rightNow = Calendar.getInstance()"
#日本語定義 現在時刻 		 "rightNow.get(rightNow.HOUR_OF_DAY)"

#日本語定義  子刻	"0"
#日本語定義  丑刻	"1"
#日本語定義  寅刻	"2"
#日本語定義  卯刻	"3"
#日本語定義  辰刻	"4"
#日本語定義  巳刻	"5"
#日本語定義  午刻	"6"
#日本語定義  未刻	"7"
#日本語定義  申刻	"8"
#日本語定義  酉刻	"9"
#日本語定義  戌刻	"10"
#日本語定義  亥刻	"11"

#日本語定義 文字列零
#日本語定義 文字列一
#日本語定義 文字列二
#日本語定義 文字列三
#日本語定義 文字列四
#日本語定義 文字列五
#日本語定義 文字列六
#日本語定義 文字列七
#日本語定義 文字列八
#日本語定義 文字列九
#日本語定義 文字列十
#日本語定義 文字列十一
#日本語定義 文字列十二

例U22ー3

細かい文法的なところはJava言語関係の資料を見ていただければ分かると思いますが、Javaではおびただしい量のクラスライブラリーがメーカーから供給されています。これがすべて英語表記であり、それぞれのクラスで使用されている単語を見ても、とてもよく似た語句を使ってあるものがいくつも見受けられます。ここでうまく日本語定義を用いることで、混乱しやすい部分をプログラマーが後から見るとき、すぐに思い出すことができるようにする効果もあるのではないかと考えています。これは次のようなJava言語のコードに展開されます。


// 現在の刻を表示する
import java.awt.*;
import java.awt.event.*;
import java.util.*;

//#日本語定義 引数

//#日本語定義 窓際族
//#日本語定義 派遣くん

public class ex3 extends Frame {

	public static void main( String 引数[] ) {

		Frame 窓際族 = new ex3();
		窓際族.setTitle("今の刻を表示する");
		窓際族.setSize(600,200);
		窓際族.setBackground(Color.yellow);
		窓際族.setVisible( true );

	}
	ex3(){ addWindowListener( new 派遣くん()); }
	class 派遣くん extends WindowAdapter {

		public void windowClosing( WindowEvent win_evnt ) { System.exit(0); }

	}

//#日本語定義 絵なりくん
//#日本語定義 文字蔵さん


	public void paint( Graphics 絵なりくん ) {

		String jp_str_0   = "今の刻は";
		String jp_str_1   = "子刻(ねのこく)です。";
		String jp_str_2   = "丑刻(うしのこく)です。";
		String jp_str_3   = "寅刻(とらのこく)です。";
		String jp_str_4   = "卯刻(うのこく)です。";
		String jp_str_5   = "辰刻(たつのこく)です。";
		String jp_str_6   = "巳刻(みのこく)です。";
		String jp_str_7   = "午刻(うまのこく)です。";
		String jp_str_8   = "未刻(ひつじのこく)です。";
		String jp_str_9   = "申刻(さるのこく)です。";
		String jp_str_10   = "酉刻(とりのこく)です。";
		String jp_str_11 = "戌刻(いぬのこく)です。";
		String jp_str_12 = "亥刻(いのこく)です。¥n";

		Font 文字蔵さん = new Font( "Serif", Font.ITALIC|Font.BOLD, 30 );

		絵なりくん.setFont( 文字蔵さん );
		絵なりくん.setColor( Color.blue );
		絵なりくん.drawString( jp_str_0, 220, 100 );

		Calendar rightNow = Calendar.getInstance();

		switch( rightNow.get(rightNow.HOUR_OF_DAY) / 2 ) {
			case 0: { 絵なりくん.drawString(jp_str_1,  120,150); }; break;
			case 1: { 絵なりくん.drawString(jp_str_2,  120,150); }; break;
			case 2: { 絵なりくん.drawString(jp_str_3,  120,150); }; break;
			case 3: { 絵なりくん.drawString(jp_str_4,  120,150); }; break;
			case 4: { 絵なりくん.drawString(jp_str_5,  120,150); }; break;
			case 5: { 絵なりくん.drawString(jp_str_6,  120,150); }; break;
			case 6: { 絵なりくん.drawString(jp_str_7,  120,150); }; break;
			case 7: { 絵なりくん.drawString(jp_str_8,  120,150); }; break;
			case 8: { 絵なりくん.drawString(jp_str_9,  120,150); }; break;
			case 9: { 絵なりくん.drawString(jp_str_10,  120,150); }; break;
			case 10: { 絵なりくん.drawString(jp_str_11,120,150); }; break;
			case 11: { 絵なりくん.drawString(jp_str_12,120,150); }; break;
		}

	}

}

例U22-3を展開したもの

例U22-3のプログラムを実行させたときの結果です。(これは午前3時過ぎごろに実行しました)


例題U22-4 簡単なメモ紙

次の例題は、簡単なメモ紙を作ってみました。これはファイルを読み込むことも、保存することもできません。ただデスクトップに表示しておくだけのものですが、範囲選択、コピー、貼り付けでほかのワープロやインターネットブラウザーなどから文書をコピーしてこのメモ紙に貼り付けることもできます。

ただし、ubuntu版ではフォントの字体をOSのバージョンにより定義されているTrueTypeフォントと、Javaのバージョンにより定義されているフォントのコンフィグファイル内で定義されている字体名が合っていないと、正しく日本語を表示させることができません。今回は「serif」というTrueTypeフォントを使用しています。

また、古いWindows版Java言語ではメソッド「show」を使っていましたが、その後のJavaバージョンではメソッド「setVisible(true)」が推奨されていますので、これに変更しています。これ以降の例題で「show」を使用している箇所は、すべて「setVisible(true)」が使われています。


// 簡単なテキスト編集ができるメモ紙を作る
窓処理の仲間を呼ぶ;
出来事処理の仲間を呼ぶ;
データ転送の仲間を呼ぶ;

#日本語定義 例題22-4	 	"ex4"

全域で使用可 仲間の集まり 例題22-4 引き継ぎ 窓枠の仲間
実装 動作に対するご用聞き
{
	文書領域の仲間 文書小僧 = 実体作成 文書領域の仲間();

	【定型】はじまり( 文字列の仲間 引数[] ) 
	{
		窓枠の仲間 窓際族 = 実体作成 例題22ー4();
		窓際族.題名を設定する( "簡単なメモ紙" );
		窓際族.大きさを設定する( 600, 400 );
		窓際族.窓枠を表示する;
	}

	例題22-4(){ 

		字体を設定する( 実体作成 字体の仲間( 字体名, 字体の種類, 字体の大きさ1 ) );	
		メニュー欄の仲間 欄丸 = 実体作成 メニュー欄の仲間();
			メニュー中項目の仲間 中太 = 実体作成 メニュー中項目の仲間("ファイル");
				メニュー小項目の仲間 小太 = 実体作成 メニュー小項目の仲間( "終 了" );
					小太.動作ご用聞きの追加( ここ ); 
				中太.項目を追加する( 小太 );
			欄丸.項目を追加する(中太);
		メニュー欄を作成する( 欄丸 );

		文書小僧.字体を設定する( 実体作成 字体の仲間( 字体名, 字体の種類, 字体の大きさ2 ) );

      		窓枠に追加する( 文書小僧 );

		窓枠ご用聞きの追加( 実体作成 派遣くん() );
	}

	仲間の集まり 派遣くん 引き継ぎ 窓枠を適応させる仲間 {
		全域で使用可 型なし 窓枠を閉じる { 終了する; }
	}

  	全域で使用可 型なし 動作が実行されたとき( 動作に伴うでき事の仲間 起こった蔵 ){
		もし ( 起こった蔵.実行された命令を取り出す() == "終 了" ) 終了する;
  	}

}

#日本語定義 題名を設定する 	"setTitle"
#日本語定義 大きさを設定する 	"setSize"
#日本語定義 窓枠を表示する 	"setVisible(true)"
#日本語定義 窓枠に追加する 	"add"
#日本語定義 字体を設定する 	"setFont"
#日本語定義 項目を追加する 	"add"
#日本語定義 ここ 		"this"
#日本語定義 が等しい 		".equals"
#日本語定義 ならば 		" "

#日本語定義 メニュー欄を作成する 	"setMenuBar"
#日本語定義 実行された命令を取り出す 	"getActionCommand"

#日本語定義 字体名 		"\"serif\""
#日本語定義 字体の大きさ1 	"12"
#日本語定義 字体の大きさ2 	"18"
#日本語定義 字体の種類 		"Font.PLAIN"

例U22-4

これも文法的な細かいところは関係資料を見ていただければ分かると思いますが、コードの量としては、非常に少なく書くことができました。しかし、字数によって自動的にスクロールもできるようになりますので、かなり本格的な機能は持っているようです。デスクトップ上にちょっとしたメモ紙として置いておくこともできると思います。これは次のようなJava言語のコードに展開されます。


// 簡単なテキスト編集ができるメモ紙を作る
import java.awt.*;
import java.awt.event.*;
import java.awt.datatransfer.*;

public class ex4 extends Frame
implements ActionListener
{
	TextArea 文書小僧 = new TextArea();

	public static void main( String 引数[] ) 
	{
		Frame 窓際族 = new ex4();
		窓際族.setTitle( "簡単なメモ紙" );
		窓際族.setSize( 600, 400 );
		窓際族.setVisible(true);
	}

	ex4(){ 

		setFont( new Font( "serif", Font.PLAIN, 12 ) );	
		MenuBar 欄丸 = new MenuBar();
			Menu 中太 = new Menu("ファイル");
				MenuItem 小太 = new MenuItem( "終 了" );
					小太.addActionListener( this ); 
				中太.add( 小太 );
			欄丸.add(中太);
		setMenuBar( 欄丸 );

		文書小僧.setFont( new Font( "serif", Font.PLAIN, 18 ) );

      		add( 文書小僧 );

		addWindowListener( new 派遣くん() );
	}

	class 派遣くん extends WindowAdapter {
		public void windowClosing( WindowEvent win_evnt ) { System.exit(0); }
	}

  	public void actionPerformed( ActionEvent 起こった蔵 ){
		if ( 起こった蔵.getActionCommand() == "終 了" ) System.exit(0);
  	}

}

例U22-4を展開したもの

例U22-4のプログラムを実行させたときの結果です。

ウィンドウの右上隅にある終了ボタンをクリックしても終了できますが、メニューバーの「ファイル」をマウスでクリックすると「終了」という項目が表示されますので、これを選択して終了することもできます。

例題U22-5 二次元の図形

次の例題は二次元の図形を描画するプログラムです。今回は縁起をかついで三段飾りもちを描いてみます。 これもWindows版Java言語編の例題から日本語プログラムをほぼそのまま持ってきました。


// 三段飾り餅を描く
窓処理の仲間を呼ぶ;
出来事処理の仲間を呼ぶ;
図形描画の仲間を呼ぶ;
#日本語定義 例題22-5	 	"ex5"

//#日本語定義 窓際族
//#日本語定義 派遣くん
//#日本語定義 引数

#日本語定義 題名を設定する 	"setTitle"
#日本語定義 大きさを設定する 	"setSize"
#日本語定義 背景色を設定する 	"setBackground"
#日本語定義 窓枠を表示する 	"setVisible(true)"

#日本語定義 領域に描画する   		"paint"
#日本語定義 楕円形を描画する 		"Ellipse2D.Float"
#日本語定義 矩形を描画する   		"Rectangle2D.Float"
#日本語定義 属性を設定する   		"setPaint"
#日本語定義 塗りつぶす 	     		"fill"

全域で使用可 仲間の集まり 例題22-5 引き継ぎ 窓枠の仲間{

	【定型】はじまり( 文字列の仲間 引数[] ) {

		窓枠の仲間 窓際族 = 実体作成 例題22-5();
		窓際族.題名を設定する("三段飾りもち");
		窓際族.大きさを設定する(500,350);
		窓際族.背景色を設定する(みず色);
		窓際族.窓枠を表示する;

	}
	例題22ー5(){ 窓枠ご用聞きの追加( 実体作成 派遣くん()); }
	仲間の集まり 派遣くん 引き継ぎ 窓枠を適応させる仲間 {
		全域で使用可 型なし 窓枠を閉じる { 終了する; }
	}

//#日本語定義 絵なりくん
//#日本語定義 絵美ちゃん

	全域で使用可 型なし 領域に描画する( 図画の仲間 絵なりくん ) {

		二次元図画の仲間 絵美ちゃん = ( 二次元図画の仲間 ) 絵なりくん;

		絵美ちゃん.属性を設定する(紅色);
		絵美ちゃん.塗りつぶす(実体作成 楕円形を描画する(150,160,200,50));

		絵美ちゃん.属性を設定する(灰白色);
		絵美ちゃん.塗りつぶす(実体作成 楕円形を描画する(175,110,150,50));

		絵美ちゃん.属性を設定する(草色);
		絵美ちゃん.塗りつぶす(実体作成 楕円形を描画する(200,60,100,50));

		絵美ちゃん.属性を設定する(茶色);
		絵美ちゃん.塗りつぶす(実体作成 矩形を描画する(150,200,200,20));
		絵美ちゃん.塗りつぶす(実体作成 矩形を描画する(200,220,100,100));

		絵美ちゃん.属性を設定する(みず色);
		絵美ちゃん.塗りつぶす(実体作成 楕円形を描画する(225,225,50,50));

	}
}
//#日本語定義 肌色	"new Color(210,202,68)"
#日本語定義 みず色	"new Color(20,150,150)"
#日本語定義 茶色	"new Color(186,100,50)"
#日本語定義 紅色	"new Color(55,94,55)"
#日本語定義 灰白色	"new Color(184,213,184)"
#日本語定義 草色	"new Color(237,85,160)"

例U22-5

複雑な色はRGB3色を0~255までの数値で指定します。これは次のようなJava言語のコードに展開されます。


// 三段飾り餅を描く
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;

public class ex5 extends Frame{

	public static void main( String 引数[] ) {

		Frame 窓際族 = new ex5();
		窓際族.setTitle("三段飾りもち");
		窓際族.setSize(500,350);
		窓際族.setBackground(new Color(20,150,150));
		窓際族.setVisible(true);

	}
	ex5(){ addWindowListener( new 派遣くん()); }
	class 派遣くん extends WindowAdapter {
		public void windowClosing( WindowEvent win_evnt ) { System.exit(0); }
	}

	public void paint( Graphics 絵なりくん ) {

		Graphics2D 絵美ちゃん = ( Graphics2D ) 絵なりくん;

		絵美ちゃん.setPaint(new Color(55,94,55));
		絵美ちゃん.fill(new Ellipse2D.Float(150,160,200,50));

		絵美ちゃん.setPaint(new Color(184,213,184));
		絵美ちゃん.fill(new Ellipse2D.Float(175,110,150,50));

		絵美ちゃん.setPaint(new Color(237,85,160));
		絵美ちゃん.fill(new Ellipse2D.Float(200,60,100,50));

		絵美ちゃん.setPaint(new Color(186,100,50));
		絵美ちゃん.fill(new Rectangle2D.Float(150,200,200,20));
		絵美ちゃん.fill(new Rectangle2D.Float(200,220,100,100));

		絵美ちゃん.setPaint(new Color(20,150,150));
		絵美ちゃん.fill(new Ellipse2D.Float(225,225,50,50));

	}
}

例U22-5を展開したもの

例U22-5のプログラムを実行させたときの結果です。

例題U22-6 長いπの計算

次の例題は 任意の桁数、円周率πを求めるプログラムをJava版として移植してみました。これもWindows版Java言語編の例題から日本語プログラムをほぼそのまま持ってきました。

プログラムは二つに分かれており、メインの部分はこの例題U22-6です。また、もう一つのクラスファイルは 実際に長い円周率πを求めるための詳細な計算部分です。それぞれ別々のクラスファイルとして翻訳(コンパイル)しておきます。

今回も詳細な長い円周率πを計算をする他のクラスファイルについては掲載は差し控えておりますが、興味のある方はC言語編の参考資料として掲げております書籍を見ていただければ分かると思います。また、結果の表示については例題U22-4の簡単なメモ紙に表示するようにしました。


// マチンの公式を使用して、任意の桁数πの値を計算するプログラム
窓処理の仲間を呼ぶ;
出来事処理の仲間を呼ぶ;
データ転送の仲間を呼ぶ;

#日本語定義 例題22ー6 	"ex6"


全域で使用可 仲間の集まり 例題22ー6 引き継ぎ 窓枠の仲間 
実装 動作に対するご用聞き
{
	文書領域の仲間 文書小僧 = 実体作成 文書領域の仲間();

	全域で使用可 一つの実体だけ 型なし はじまり( 文字列の仲間 引数[] ) 
	{
		窓枠の仲間 窓際族 = 実体作成 例題22ー6();
		窓際族.題名を設定する( "円周率を10万桁求める" );
		窓際族.大きさを設定する( 600, 400 );
		窓際族.窓枠を表示する;
	}

	例題22ー6(){

		字体を設定する( 実体作成 字体の仲間( 字体名, 字体の種類, 字体の大きさ ) );	 
		メニュー欄の仲間 欄丸 = 実体作成 メニュー欄の仲間();
			メニュー中項目の仲間 中太 = 実体作成 メニュー中項目の仲間("ファイル");
				メニュー小項目の仲間 小太 = 実体作成 メニュー小項目の仲間( "終 了" );
				小太.動作ご用聞きの追加( ここ ); 
				中太.項目を追加する( 小太 );
			欄丸.項目を追加する(中太);
		メニュー欄を作成する( 欄丸 );

		文書小僧.字体を設定する( 実体作成 字体の仲間( 字体名, 字体の種類, 字体の大きさ ) );

      		窓枠に追加する( 文書小僧 );

		窓枠ご用聞きの追加( 実体作成 派遣くん() );

		整数型[] 作業用配列一 = 実体作成 整数型[配列の最大値+1];
		整数型[] 作業用配列二 = 実体作成 整数型[配列の最大値+1];
		整数型[] πの結果 = 実体作成 整数型[配列の最大値+1];

		長いπを求める仲間 長いπ = 実体作成 長いπを求める仲間();

		長いπ.マチンの逆正接演算( 作業用配列一, 16,   5 );
		長いπ.マチンの逆正接演算( 作業用配列二,  4, 239 );

		長いπ.長い配列の減算( πの結果, 作業用配列一, 作業用配列二 );

		文字列の仲間 表示用文字 = 実体作成 文字列の仲間();

		文書小僧.文字を追加する( 表示用文字.値を変換する(πの結果[0]) );
		文書小僧.文字を追加する(".\n");

		反復 ( 整数型 回数 = 1; 回数 <= 求める桁数; 回数++ ) {

			文書小僧.文字を追加する( 表示用文字.値を変換する(πの結果[回数]) );
	
			もし ( 回数 剰余計算 10 == 0 ) 文書小僧.文字を追加する(" ");
			もし ( 回数 剰余計算 50 == 0 ) 文書小僧.文字を追加する("\n");
		}

	}

	仲間の集まり 派遣くん 引き継ぎ 窓枠を適応させる仲間 {
		全域で使用可 型なし 窓枠を閉じる { 終了する; }
	}

  	全域で使用可 型なし 動作が実行されたとき( 動作に伴うでき事の仲間 起こった蔵 ){
		もし ( 起こった蔵.実行された命令を取り出す() == "終 了" ) 終了する;
  	}


}

#日本語定義 長いπを求める仲間	"lng_pi"
#日本語定義 マチンの逆正接演算	"machins_arctan"
#日本語定義 長い配列の減算	"lng_dim_sub"

#日本語定義 配列の最大値	"100010"
#日本語定義 求める桁数	"100000"

#日本語定義 剰余計算		"%%"

#日本語定義 題名を設定する 	"setTitle"
#日本語定義 大きさを設定する 	"setSize"
#日本語定義 窓枠を表示する 	"setVisible(true)"
#日本語定義 窓枠に追加する 	"add"
#日本語定義 字体を設定する 	"setFont"
#日本語定義 項目を追加する 	"add"
#日本語定義 文字を追加する 	"append"
#日本語定義 値を変換する 	"valueOf"
#日本語定義 ここ 		"this"
#日本語定義 が等しい 		".equals"
#日本語定義 ならば 		" "

#日本語定義 メニュー欄を作成する 	"setMenuBar"
#日本語定義 実行された命令を取り出す 	"getActionCommand"

#日本語定義 字体名 		"\"serif\""
#日本語定義 字体の大きさ 	"14"
#日本語定義 字体の種類 		"Font.PLAIN"

例U22-6

これを展開すると、次のようなJava言語のコードになります。


// マチンの公式を使用して、任意の桁数πの値を計算するプログラム
import java.awt.*;
import java.awt.event.*;
import java.awt.datatransfer.*;

public class ex6 extends Frame 
implements ActionListener
{
	TextArea 文書小僧 = new TextArea();

	public static void main( String 引数[] ) 
	{
		Frame 窓際族 = new ex6();
		窓際族.setTitle( "円周率を10万桁求める" );
		窓際族.setSize( 600, 400 );
		窓際族.setVisible(true);
	}

	ex6(){

		setFont( new Font( "serif", Font.PLAIN, 14 ) );	 
		MenuBar 欄丸 = new MenuBar();
			Menu 中太 = new Menu("ファイル");
				MenuItem 小太 = new MenuItem( "終 了" );
				小太.addActionListener( this ); 
				中太.add( 小太 );
			欄丸.add(中太);
		setMenuBar( 欄丸 );

		文書小僧.setFont( new Font( "serif", Font.PLAIN, 14 ) );

      		add( 文書小僧 );

		addWindowListener( new 派遣くん() );

		int[] 作業用配列一 = new int[100010+1];
		int[] 作業用配列二 = new int[100010+1];
		int[] πの結果 = new int[100010+1];

		lng_pi 長いπ = new lng_pi();

		長いπ.machins_arctan( 作業用配列一, 16,   5 );
		長いπ.machins_arctan( 作業用配列二,  4, 239 );

		長いπ.lng_dim_sub( πの結果, 作業用配列一, 作業用配列二 );

		String 表示用文字 = new String();

		文書小僧.append( 表示用文字.valueOf(πの結果[0]) );
		文書小僧.append(".\n");

		for ( int 回数 = 1; 回数 <= 100000; 回数++ ) {

			文書小僧.append( 表示用文字.valueOf(πの結果[回数]) );
	
			if ( 回数 % 10 == 0 ) 文書小僧.append(" ");
			if ( 回数 % 50 == 0 ) 文書小僧.append("\n");
		}

	}

	class 派遣くん extends WindowAdapter {
		public void windowClosing( WindowEvent win_evnt ) { System.exit(0); }
	}

  	public void actionPerformed( ActionEvent 起こった蔵 ){
		if ( 起こった蔵.getActionCommand() == "終 了" ) System.exit(0);
  	}


}

例U22-6を展開したもの

円周率を小数点以下10万桁として、例22-6のプログラムを実行させたときの最初の部分と最後の部分です。

今回のJava処理系(コンパイラ)のバージョンでは変数名、関数名、クラス名などにそのまま日本語を使うことができました。 これ以降、プログラム言語の開発環境で日本語の利用が拡大していけば幸いですが、万が一将来的にバージョンが変わったら日本語が全く使えないという状況になった場合には、いざというときのために日本語カスタマイザーの自動変数定義はあってしかるべきだと考えています。

Java言語に限ったことはないのですが、日本語プログラムの例題中、オブジェクトの名前に「○○ちゃん」、「○○君」などという擬人化した名前を付けていることに対して、不快感を持つ人もあるかとは思いますが、決してふざけているというわけではありません。オブジェクトの設計図ともいうべきクラスに対して、記憶領域としての実体を持っているオブジェクトにメッセージを送るという考え方が、今日ではプログラミング言語として広く認知されてきているのではないかと思います。一方、20年以上も前からオブェジェクトの次のパラダイムとして、エージェントという考え方がプログラミングの世界でも提唱されてきました。

つまり、現在のオブジェクトが「オブジェクト名.メソッド名」というような形式で、いわゆる以前の関数のような格好であらかじめ用意された機能を実行しているわけですが、将来的には「エージェント名.簡単な命令語」というように、より人間に近い働きをする「エージェント」というものに対して、簡単な命令語を与えてやるだけで、複雑なことをやってくれるようにという願いを込めて、擬人化した親しみやすい名前にしています。

将来的には、例えば「ネット検索君」というエージェントにサイトを検索させるときには「ネット検索君.サイト検索(検索語)」や「ネット検索君.画像検索(画像ファイル)」など、たとえ詳しい技術的なことは知らなくても、ワープロ感覚でプログラミングができるようになればいいなと考えています。

参考資料
James Gosling: on the Java Road ジェームズ・ゴースリン博士が公開しているブログページ
JDK Version 1.6.0_24 インターネットで公開されているドキュメントページ オラクル社
Java2 中山茂著 技報堂出版 1999
方丈記 鴨長明/簗瀬一雄訳注 角川文庫 1967