1.2 魔法の基本
「この魔法……どうなってるの……!? 魔法の作り方……教えて……!!」
「あー……えーと……なあ、エル。ステラにも教えて大丈夫なのか?」
ステラが目を輝かせて尋ねてきたが、あまりの勢いに、エルの方へ話を流した。元々、エルに魔法の作り方を教える代わりに、冒険者として面倒を見てもらえる話だった。
「ええ、平気よ。一緒に教えてあげて。その代わり、ステラにお願い事があるの」
「…………?」
「しばらく魔法学校を休んで、私たちと一緒に活動してくれないかしら? その方が、教わりやすいし」
「……いいよ……。一緒に活動って……お手伝いとか、するの……?」
……学校を休む?
「そんな、学校を休むなんて……色々、大丈夫なのか……?」
咄嗟に、二人の会話に口を挟んでしまった。しかし、不安そうな俺の思いとは裏腹に、エルもステラも何も気にしていなさそうに、こう言った。
「平気よ。ステラは天才だから。学校に行く必要、無いんだもの」
「魔法学校より、こっちの方が……有意義……」
学校に行く必要が無い……? 大学みたいな感じで、単位も卒業研究も十分で、行かなくてもよいといった意味なのだろうか。……それとも、不登校みたいな感じで、行く意味が感じられないといった意味なのだろうか。後者なら心配だが……
「そんなことより……早く、魔法の作り方……教えて……?」
そんなことより、って……学校をそんな扱いでいいのか……? でも、常識人っぽいエルも気にしていないようだし、やっぱりこの世界の学校は大学みたいな感じなのかもしれないな。
……別に、ステラが常識人っぽくないというわけではないけど……でも、なんとなく、この子は魔法中心に人生を考えているような、ちょっと危なっかしい感じがするんだよなぁ……
「まあいいか。じゃあこれから魔法の作り方を教えるけど……」
言っていて思った。やっぱり『魔法の作り方』って言うのは、とても違和感があるな。『プログラムを作る』って言っているようで、変な感じだ。『プログラムを組む』とか、『コードを書く』とは言うが……そっちから言い方を引っ張ると、『魔法の組み方』と言ったほうがいいな。
「魔法の作り方、って言うと、すごく仰々しいから……魔法の組み方、って言うぞ」
「別にいいけど……なんか違いでもあるの? 魔法の作り方って言ったほうが、かっこよくない?」
「そうかもしれないけど……魔法をイチから作るっていうより、積み木を組み立ててお城を作るとか、そんなイメージの方が近いからな」
そもそもJavaとかC++とかはプログラミング"言語"と言われているのだ。"言語"という言葉の定義は分野によって違ったりして難しいものだと思うが、俺は『音声や文字を文法にしたがって組み合わせ、意味の通じる文章をつくるもの』だと思っている。プログラミング言語も同じで、単語を文法どおりに組み合わせて、機械にとって意味の通じる文章を作るものだ。
「だから、"魔法を組み立てる"っていうイメージでいてくれ。……尊敬される凄いことをするイメージは、申し訳ないけど除けてくれ」
「えーと……本当に尊敬されるべき凄いことなんだけど……」
エルは露骨に嫌そうな顔を浮かべた。まあ、想定通りの反応だ。実際、この世界で魔法のコードが組めるというのは、凄いことらしいし。
だが、ステラはどこか納得したような表情をしていた。
「……尊敬してるだけじゃ、辿りつけないから、目標にしろ……みたいな感じ……?」
「……そういうものかしら……」
~~~~
「じゃあ、本題に入るぞ」
そう言って、先ほど表示したものをそのままもう一度表示した。
public class Test {
public static void main(String[] args) {
int a = 2980;
int b = 3560;
int c = 5120;
int d = 2480;
int total = a + b + c + d;
System.out.println(total);
}
}
これを見せながら、俺は説明を始めた。
「最初の『public class Test』とか、次の『public static void main(String[] args)』の文字は、全てに意味があるが、今は全部省略する。決まり文句だと思っておいてくれ。ずっと後になってから説明する。
とりあえず、今は『"Test"のところは魔法の名前になる』ってことと、『この{}の枠の中に書けば魔法を使える』ってことを覚えてほしい」
「あー……それくらいは分かっていたわね。……魔法の名前は、なんでもいいの?」
「名前は、魔法のルール的には何でもいいぞ。先頭に数字は使えないけどな」
先頭じゃなければ、ちょっと前にエルに見せてもらった『ファイアボールII』……クラス名は『FireBall2』と書かれていたが、あれで問題は無い。
面倒なのは、魔法のルールじゃない方で……
「……先頭は、大文字……?」
「ああ……えーと、魔法のルール的には、大文字でも小文字でもいいんだけど……魔法の名前って区別が付きやすいように、慣習的にそうするようになっている、って言えば伝わるか?」
「……慣習……魔法のルールじゃなくて、人間が決めたのルール……?」
「ああ、そうだ。あとは、すぐに読める長さで、分かりやすい名前にしたほうがいいだろうな」
この世界の魔法は、クラス名を呪文として唱えて発動するから、読みにくい魔法は無いはずだ。
……先ほどからなんとなく感じていたが、ステラはかなり物分かりが良い。天才というのは本当のようだ。
「じゃあ、次に中身の話に移るか。魔法はもうちょっと単純にするぞ」
そう言いながら、俺はコードを書き換えた。
public class Test {
public static void main(String[] args) {
int a = 2980;
System.out.println(a);
}
}
「この『a』っていうのが、『変数』だ」
「……変数って、何?」
案の定、エルから質問が飛び出した。そうだよな、変数って単語、この世界にあるとも限らないし、前の世界でも情報技術に強い人しか知らなかったな。
「変数っていうのは……例えるなら、本だな。こいつは、『int』というジャンルの、『a』というタイトルの本で、中には『2980』って内容が書かれている。ちなみにintっていうのは整数のことだ」
よく変数を『データを入れる箱』という表現を見かけるが、ここは書斎だし、ちょうど手元に本があったので、あえて本で例えてみた。intの情報量なら本にしては少なすぎるが。
「歴史 サンの成り立ち = 魔法暦16年に初代国王が~、みたいな感じかしら?」
「そうだ。……飲み込みが早くて助かる。最初に『int a = 2980;』って書いてジャンル名と本のタイトルを決めたら、この魔法の中なら名前だけ書けば本の中身を使える。ちなみに変数名は先頭に数字は使えないけど、分かりやすければどんな名前でもいいぞ」
「魔法の名前と同じね。でも、こっちは小文字で始めるのね」
今回のはお試しなので、『a』という意味の無い適当な変数名にしている。が、totalとかそういった意味のある単語をつけることも多い。
ただし、予約語……publicとかclassとか、既にJavaで使われている単語は、使うことができない。まあ紛らわしくて使おうと思わないし、もし使おうとしてもエラーですぐ指摘されるので、特に気をつけるほどでもないだろう。あえて説明しないが、もしエラーが出たらその時に教えればいいか。
「それで、名前を付けた後は、こうやって……」
public class Test {
public static void main(String[] args) {
int a = 2980;
a = 3980;
System.out.println(a);
}
}
「中身を書き換えることもできる」
一通り説明してから、「テスト」と唱えると、
[3980]
と表示された。aの中身が書き変わって、System.out.printlnでaが表示されるときに、3980が表示されるのだ。
「なるほど……こうやって、数字を記憶させるのね」
「記憶だけじゃなく、さっきやったみたいに、こんな風に計算もできる」
public class Test {
public static void main(String[] args) {
int a = 2980;
a = a + 3980;
System.out.println(a);
}
}
このように書き換えてから、再び「テスト」と唱えると、
[6960]
と表示された。aの中身が、a + 3980、つまり2980 + 3980……の答えの、6960に書き変わった。
「右と左、イコールじゃないのに……イコール……変な式……」
ステラがそう呟いた。……確かに、俺も最初に見たときはそう思ったな。『a = a + 3980』なんて、算数や数学なら等式として成り立たない。
「算数のイコールと、魔法で使う『=』は違うんだ。代入というか、aの値を書き換えてるだけだな」
「……なるほど…………わかった……」
ステラが、無理やり納得したような表情をした。
しばらくして、魔法を眺めていたエルが、こんなことを言った。
「intってジャンルがある、ってことは、変数には他のジャンルもあるのかしら?」
気付いたか。やっぱりエルも、ステラに負けず劣らず頭が良いな。
嬉しさに少し笑いながら、どんな風に説明をしようかと考えていた。
今回のJava部分のまとめ
・整数の変数の宣言
int 変数名;
で、変数の宣言(これからこの名前を変数として使いますよ、と機械に教えること)ができます。物語中では続けて、
int 変数名 = 整数;
と変数の代入をしていました。これを初期化といいます。
最初に変数の代入をせずに変数を使おうとするとエラーが出るため、初期化することが多いです。
変数名は物語中にある通り、先頭が数字でなく、予約語でなければ、なんでも使えます。
実は日本語も使えたりします。
ただし、慣習として、普通は全て英語で書き、小文字で始め、単語の切れ目は大文字を使用します。(例:totalPeople)
・変数の代入
変数名 = 値;
で値の代入をすることができます。物語中でやったように、同じ変数や他の変数を使うことも、計算式を入れることも可能です。
しかし、intだけだと整数しか扱うことができません。
次回は整数以外の変数について扱います。