読者です 読者をやめる 読者になる 読者になる

倭算数理研究所

科学・数学・学習関連の記事を、「倭マン日記」とは別に書いていくのだ!

2.4 True BASIC のプログラム product

計算物理学入門 Groovy

このシリーズでは『計算物理学入門』に載っているシミュレーションを Groops で書いていこう!ってのが目的でしたが、Groops で前提としているプログラミング言語の Groovy ってどの程度知られているのか分からないので、『計算物理学入門』で True BASIC について書かれている程度に Groovy について説明していきま〜す。 でも、Java に関してはそれなりに知ってるものとしてま〜す。

True BASIC

まずは変数を定義して、掛け算して、結果を出力するプログラム。

PROGRAM product
LET m = 2            ! 質量、単位は kg
LET a = 4             ! 加速度、MKS 単位
LET force = m*a   ! 力、単位は N (ニュートン)
PRINT force
END

True BASIC って、文法知らなくてもだいたい何やってるか理解できるので、擬似コードとして使うのいいですね(実際に動かせるんで擬似コードって言わないだろうけど)。 コードの題材はニュートン運動方程式だけど、やってるのは単なる掛け算ですダ。

Groovy

では、True BASIC のコードを Groovy で書いてみましょう。

素直に書き換え
上記の True BASIC のプログラムを素直に Groovy で書くと以下のようになります:

def m = 2    // 質量、単位は kg
def a = 4    // 加速度、MKS 単位
def force = m*a    // 力、単位は N (ニュートン)
println force    // 「8」と出力される
  • 変数の宣言は def キーワードで行います*1
  • 行末までのコメントは、Java と同じく連続するスラッシュ (//) です。 複数行の Java コメント(/* と */ で挟まれたコメント)も使用できます。
  • 標準出力への書き出しは println() メソッド で行います。 上記のコードではメソッドの括弧を省略しています。

上記のコードを「product.groovy」というファイルに保存したとして、プログラムを実行するには*2このファイルが置かれているフォルダ上で

groovy product.groovy

もしくは

groovy product

を実行します*3

浮動小数点数を使う
プログラムの世界ではどんな型の数値を使って計算を行っているかということを意識するのは大切です。 上記のコードでは整数 (java.lang.Integer) を使った計算をしていました*4。 というのは、Groovy では「2」や「4」は整数の数値(整数リテラル)として認識されるからです。

次は、これとは違って浮動小数点数(小数)を使いたいとしましょう。 Groovy では浮動小数点数リテラルは少し注意が必要です(特に Java を使ってた人には)。 単純に「2.0」と書くと、これは java.math.BigDecimal オブジェクトとして扱われます。 通常、シミュレーションでは Java の double (java.lang.Double) の精度で充分なので、数値リテラルの末尾に「d」または「D」を付けて、double の精度の数値であることを指定する必要があります:

def m = 2.0d    // Double 値を使いたい場合は接尾辞「d」or「D」を付ける
def a = 4d    // 小数点は必ずしも必要なし
def force = m*a
println force    // 「8.0」と出力される

もう一つ Java と Groovy の覚えておくべき違いは「整数同士の割り算」です。 Java では「1 / 2」は 0 になりますが、Groovy では「1 / 2」は0.5になります。 Groovy で Java の整数同士の割り算を行うには「1.intdiv(2)」とします。

プリミティブ型
Groovy では「すべてがオブジェクトとして扱われる」ので、一見 Java のプリミティブ型のように書かれていても実際にはそのラッパークラスとして扱われますが、Groovy 1.8 からプリミティブ型に対する最適化が行われていているので(1.8.0 では int 型だけですが)、計算をガリガリ行う変数はプリミティブ型として宣言しておく方がいいでしょう*5

double m = 2d
double a = 4d
def force = m*a
println force    // 「8.0」と出力される

この場合、数値リテラルの末尾の「d」はなくてもいい構いません。

プログラミングGROOVY

プログラミングGROOVY

計算物理学入門

計算物理学入門

  • 作者: ハーベイゴールド,ジャントボチニク,Harvey Gould,Jan Tobochnik,鈴木増雄,石川正勝,溜渕継博,宮島佐介
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2000/12
  • メディア: 単行本
  • 購入: 1人 クリック: 28回
  • この商品を含むブログ (45件) を見る

*1:スクリプト内では省略できます。

*2:事前に J2SE と Groovy のインストールが必要。

*3:ファイルの拡張子が「.groovy」の場合だけ、ファイルの拡張子を省略できます。

*4:基本的には Groovy では全てがオブジェクトなので、Java でのプリミティブ型はそのラッパークラスで置き換えられます。

*5:1.8.0 以降のリリースがいくつかあるので int 型以外の最適化がされているのか確認してませんが、1.9-beta-3 で char, byte, short がされたところのようなので、double はまだかも。