ObectSquare

[技術講座]


Powered by SmartDoc

おれはJython第1回

Tue Jan 15 16:29:01 JST 2002
YojiKanno
https://www.ogis-ri.co.jp/otc/hiroba/index.html

目次

※ Netscape4.Xをご利用の方は、こちら からご覧ください。

Jythonを始めよう

Jythonとは

今回紹介するJythonは、JVM上で動作するスクリプト言語です。Jythonは、Pythonというスクリプト言語の処理系の一つです。Jythonの処理系はJavaで記述されています。Jythonを使うとこんなメリットがあります。

Javaと違ってコンパイルする必要がない
「ちょっと書いて実行」というRAD開発に有利。
「擬似コードを使って設計するのに近い感覚」で実装できる
シンプルなオブジェクト指向スクリプト言語なので、同じ処理内容を記述するときに、Javaより楽に直感的に記述できる。
JythonからJava、JavaからJythonを利用できる
JavaのクラスのテストをJythonで記述できる。アプリケーションのカスタマイズ部分をJyhtonで記述できる。

例えば、システム内の安定した部分にはJavaを使い、ホットスポット(1)と呼ばれる部分を、Jythonスクリプトを使って記述することができます。スクリプト言語は変更するためのコストが低いので、このような使い分けは効率がよいはずです。言語の特性に応じた、適材適所な使い方ができれば、システム全体の設計がよりシンプルになり、開発効率が上がると思われます。

またJythonはJavaと同じオブジェクト指向言語です。そのためシステム内のJava部分の設計と、スクリプト部分の設計のインピーダンスのミスマッチ(2)が少なく、より設計しやすくなるという利点があります。

  1. システムやフレームワークの中で、要求が変更されたり追加されたりすることが、あらかじめ予想される部分。ホットスポット部分は変更に対して柔軟に対処できるように、最初から意識して設計する。
  2. オブジェクト指向の分野では、「オジェクト指向で設計された部分」と「それ以外の方法で設計された部分」の整合性が、うまく保たれない場合に使う場合が多い。例えばRDBのモデルとオブジェクト指向モデル間のインピーダンスのミスマッチがよく話題になる。

Jythonの読み方

Jythonの読み方は「ジェイソン」でしょうか「ジーソン」でしょうか?筆者は「ジャイソン」だと思っていたので、「ジャイソン」→「ジャイアン」と連想しこんなタイトルになってます。

そもそもPythonとは

PythonはGuido van Rossum氏によって開発されたオブジェクト指向スクリプト言語です。Pythonの名前の由来はここに記載されています。

オブジェクト指向スクリプト言語としてのPythonの特徴は、

といったところです。

オブジェクト指向スクリプト言語というジャンルでは、日本ではRubyのほうが優勢ですが、欧米ではPythonがかなりポピュラーです。最初に学ぶべき言語の一つとして、かのEric S. Raymondもすすめているくらいです。

Pythonは商用、非商用を含めて様々な分野で実用的に使われています。Pythonスクリプトをアプリケーションの組み込みスクリプト言語やマクロ言語にしたり、もしくは単体のアプリケーションとして使う場合があります。実用的なPythonアプリケーションとして1番有名なのは、アプリケーションサーバのZopeです。

Pythonの実行系には二種類あり、一つはC言語で実装されたふつうのPython (CPython)、もう一つはJava言語で実装されたJythonです。Pythonは、実行時にソースコードを独自のバイトコードに変換した後、処理を行います。それに対してJythonはJavaバイトコードに変換するという違いがあります。Jythonの機能はPython互換を目指して開発されています。

また以前はJythonはJPythonと呼ばれていました。最近はJythonという名前に変更されています。古い文献を読むときは注意を。

JavaVM上で動くJava以外の言語

JavaVMはJavaをコンパイルして生成されたバイトコードを解釈して動作を行っています。

ここでよく考えると、バイトコードさえきちんと生成できれば、元の言語は何でもいいんじゃないか、というアイディアが浮かびます。マイクロソフトの.NETも基本的には同じ考え方です。.NETでは、いろいろな言語が使えることを強調していますが、結局バイトコードにコンパイルして実行する点は、Javaと大体一緒です。Javaは最初からそういう仕組みですが、あんまり強調されることは少ないようですね。

JVM上で動くJava以外の言語に興味を持った人は、下のページを見てください。Java処理系で動く、さまざまな言語がコレクションされています。

またガチンコPnuts道場でも、Java上で動くスクリプト言語Pnutsの紹介をしています。こちらもよろしく。

 

はじめの一歩

ダウンロード

まずはJythonのWebサイトにいって、最新版のJython実行環境をゲットしましょう。

インストール

今回は皆さんの環境にJava(JREやJava2SDK)環境がインストールされていて、Javaコマンドが既に使える状態であることを想定しています。またWindows環境を想定してインストール手順やその他の説明をしています。しかし、ほかのOSでも基本は一緒です。

STEP1 インストーラの起動

まずコマンドプロンプトなどで、ダウンロードしてきたJythonのファイル(多分jython-21.classといった名前なはずです)があるディレクトリに移動します。

インストーラを起動する
E:\kanno\java\jython>java jython-21

STEP2 ディレクトリの指定

インストーラの指示にしたがい、好きなディレクトリを指定してインストールします。

STEP3 最初の起動

インストールしたディレクトリにjython.batというファイルが出来ているはずです。

jython.batをダブルクリックするだけで、対話型のインタプリタが立ち上がります。

最初の起動時の画面
*sys-package-mgr*: processing new jar, 'E:\kanno\java\jython\jython.jar'
*sys-package-mgr*: processing new jar, 'D:\Java\jdk1.3\jre\lib\rt.jar'
*sys-package-mgr*: processing new jar, 'C:\Program Files\JavaSoft\JRE\1.3.0_02\lib\rt.jar'
*sys-package-mgr*: processing new jar, 'C:\Program Files\JavaSoft\JRE\1.3.0_02\lib\i18n.jar'
*sys-package-mgr*: processing new jar, 'C:\Program Files\JavaSoft\JRE\1.3.0_02\lib\sunrsasign.jar'
Jython 2.1 on java1.3.0_02 (JIT: null)
Type "copyright", "credits" or "license" for more information.
>>>

最初の起動時だけは、クラスパス上にあるjarファイルを処理して、インデックスを作っているようです。したがって少し待たされますが、2回目以降はキャッシュが効いて起動が早くなります。

STEP4 定番

それでは挨拶がわりに定番をやりましょう。

インストーラを起動する
>>> print("こんちわ。今日のゲストはJythonさん")
こんちわ。今日のゲストはJythonさん
>>>

おっけい。これでインストール終了です。余裕がある人は、環境変数PATHにJythonのインストールディレクトリに追加するなりして、いつでも起動できるようにしましょう。jython.batをパスが通ってるディレクトリに放り込むのも可です。

UNIX系の環境の人は

Unix系の環境の人もコマンドは一緒です。さらにGUI画面を使ったインストールができない人のために、サイレント?インストールのオプションも用意されてります。

サイレントインストール
$java jython-21 -o /home/kanno/local/jython

Jython入門

それでは実際にJython言語を使ってみましょう。このセクションではWindows環境での実行を前提としています。

準備

ファイルに保存したプログラムの実行をする場合はjython.batに実行したファイル名を渡してあげればOKです。

HelloWorld.pyに記述
print ("Hello・ザ・ワールド")
Jythonの起動
E:\kanno\oed\jython1>jython HelloWorld.py
Hello・ザ・ワールド
E:\kanno\oed\jython1>     

実行が終わるとコンソールに戻ります。-iオプションをつけた場合はそのままインタプリタに移行します。

Jython(Python)の特徴

Jython(Python)の特徴はブロックをインデントで表現するという点です。例えば関数を定義するときはこうなります。

関数の定義
#関数の定義
def hello(name):
  print(name)
  print("Hello!!")

hello("abc")  #呼び出しをかけている

インデントが始まる兆候は:があるときです。インデントはタブでもスペースでもよいですが、当然ブロック内のインデントの幅(スペースの数とか)や種類は統一していないとエラーがでます。

条件分岐
def iftest():
  foo = [1, 2, 3]   #リストの定義
  if(len(foo) > 5): 
    return 1
  elif(len(foo) > 4):
    return 2
  else:
    return 3

print iftest()
#答えは    ==> 3

上の条件分岐の例に出てくるfoo=[1,2,3]ではリストと呼ばれるデータ構造を定義しています。これはJavaの配列やListと似たようなデータ型です。len(foo)というのはリストの長さを求めるための組み込み関数です。ちょっとオブジェクト指向ぽくないけど、ここらへん割り切っていきましょう。

繰り返し
def fortest1():
  foo=[0,1,2]  
  for i in foo:
    print i

def fortest2():
  for i in range(3):
    print i

def whileTest():
  while(1): 
   pass
   #無限ループ passは*なにもしないぜ*という意味の予約語

fortest1()
fortest2()


"""以下のように出力される
0
1
2
0
1
2
"""

上の例では、for文がインデックスを必要としない抽象的な書き方になっているのが分かります。for文にリストのようなデータ型を与えてあげると自動的に繰り返してくれます。単純に何回繰り返したいという場合は、range関数を使ってその範囲内の数値が入ったリストを生成してあげる必要があります。range(3)は[0,1,2]というリストを作成しています。

注目はwhile(1)というところ。Pythonはtrue、falseという予約語はなく、数値(0がfalse)とかObjectのあるなしで真偽値を表します。

Jythonによるオブジェクト指向

それではどうやってクラスを定義するか?というところに触れたいところですが、次回以降(があれば)の楽しみに取っておきましょう。Javaのクラスを継承したPythonのクラスを定義したり、面白いことがいろいろできそうです。

もう少し実用的に..

catプログラム

それではもう少し実用的な例を紹介しましょう。ここでは簡単なcatプログラムを書きます。引数で指定したファイルの中身を標準出力に出します。

用意しておくサンプルファイル sample.txt
test
test
catプログラムの例
E:\kanno\oed\jython1>jython cat1.py sample.txt
test
test
catプログラム1
import sys

def cat(f):
  input = open(f)
  lines = input.readlines()
  for line in lines:     
    print(line) ,
  input.close()

if __name__ == '__main__': 
  cat(sys.argv[1])

open()でファイルをオープンした後に、readlinesですべての行を読み込んでリストに格納しています。あとはfor文で一行ずつ処理しているだけです。

先頭にあるimport sysは、sysモジュールというファイルに定義されているPythonの関数やクラスを使えるようにするための、おまじないです。このインポートを行うことによってsys.argv[1]という関数を呼び出すことができます。この関数によってJythonインタプリタに与えられた、2番目の引数を取得することができます。(argv[0]にはcat1.pyという文字列が入ってます。)

もうすこし丁寧に書きたい場合は、from sys import argvと書くことができます。これは、sysモジュールに定義されているargvという関数をインポートする、という意味になります。この場合はsys.argv[n]ではなくargv[n]という形式で呼び出すことができます。一瞬戸惑いますが、慣れれば一貫性があるインポート規則に思えてきます。

日本語が含まれているファイルの処理

実はこのプログラムは、Windows環境で読み込む対象テキストの中に、日本語文字列が含まれているとうまくいきません。

日本語の含まれたファイル sample2.txt
日本語
日本語
catプログラムの例 日本語で失敗
E:\kanno\oed\jython1>jython cat1.py sample2.txt
???{??E:\kanno\oed\jython1>

これでは実用になりません。

catプログラムの改良 Javaのクラスは俺のもの

WindowsでShiftJISのファイルを取り扱う際の問題は、CPythonを使っている場合は、ここあたりから、パッチとかを拾ってきたりして解消できるかもしれません。

しかし、Javaを基盤としているJythonの場合は、ちょっと違った解決策をとることができます。Javaのクラスを利用してしまうのです。

catプログラム2
import sys
from java.io import *
from java.lang  import *

def cat(f):
  input = BufferedReader(InputStreamReader(FileInputStream(f)))
  data = input.readLine()
  while(data):
    System.out.println(data)
    data=input.readLine()
  input.close()

if __name__ == '__main__': 
  cat(sys.argv[1])
実行結果
E:\kanno\oed\jython1>jython cat2.py sample2.txt
日本語
日本語

JythonからJavaを使うときのステップは、1.クラスのインポート、2.インスタンスの生成、3.インスタンスへのアクセス、です。

クラスのインポート

Javaのimport文に相当するものをJythonで記述したい場合は、fromのところでパッケージ名のパスを書き、importのところでクラス名を指定します。パッケージ内の複数のクラスをimportしたい場合は*を使います。自作クラスを使いたい場合も同様です。

from java.io import *
from java.lang  import * 

また、トップレベルのパッケージにクラスを配置している場合は、import [クラス名]と書きます。

インタンスの生成

Javaクラスのインスタンスを生成したい場合は、[クラス名]()とクラスの名前をもった関数を呼び出すようなスタイルで書きます。

Jyhtonでのインスタンスの生成
BufferedReader(InputStreamReader(FileInputStream(f)))

Javaで書くと

Javaでのインスタンスの生成
new BufferedReader(new InputStreamReader(new FileInputStream(f)))

こうなります

インタンスへのアクセス

メソッドの呼び出しや属性へのアクセスは、Javaと大体一緒です。

data=input.readLine() 
System.out.println()

補足

while文のところは本当はwhile(data=input.readLine())と書きたいところですが、残念ながらエラーがでしまい、こういう書き方になっています。ちょっとさえないかもしれませんが。

まとめ

今回は筆者自身がPythonに馴染んでないこともあり、どちらかというと紹介記事になりました。個人的な感想としてはPython(Jython)は、文法をシンプルにしようとするところ、妥協してちょっとオブジェクト指向的じゃない部分を含んでいたりするところ、言語仕様よりもライブラリを充実させることによって実用的にしようといるところ、そういう点がJavaに似ている気がします。(もちろん文法は全然違いますが)

他のオブジェクト指向言語を知っていれば、Pythonの大体の言語仕様を覚えるのは、1日もあれば十分でしょう。しかし初心者がPythonライブラリを使いこなすのは大変です。JavaプログラマがJythonを使う場合は、Javaのライブラリを使うことができるので、Javaプログラマにとってはとっつきやすいでしょう。ただしJavaのライブラリを使った場合は、CPython上で動かせないスクリプトになってしまいます。

そのかわりJythonには、スクリプトをコンパイルした後に、実行環境込みで配布用jarを作成する、非常に便利な機能があります。この場合はJava実行環境だけがあれば完成したスクリプトを動かすことができます。

それでは今回はこのくらいにしておきましょう。次回以降をお楽しみに(次回以降があればPythonによるオブジェクト指向やJavaとの連携について触れてみる予定です)

リファレンス

Jythonに興味を持ったという方向けのリファレンスです。


© 2001 OGIS-RI Co., Ltd.
Index Next
Index Next.