Shiki’s Weblog
日本語プログラミング言語と簡約日本語 (5)
2019/02/19
前回は、いまつかっているOrotiの文法を紹介しました。今回は、算数の問題をOrotiをつかって、といてみようとおもいます。
はじめに
『プログラミングの考えかた (コンピュータ入門 1)』という本があります。1987年に出版された本です。アルゴリズムをかんがえながら、日本語でプログラムをかきくだしていく内容になっています。字さげ(インデント)をつかって、くりかえしや条件文の本体をかくかきかたは、いまのPythonやOrotiとおなじです。
この本が出版されたときは、本のなかの日本語でかかれたプログラムをそのままうごかすことはできませんでした。そのかわり続編の第2巻、第3巻で、BASICやCにかきなおす方法をまなんでいくような構成になっています。
日本語プログラミング言語Orotiであれば、『プログラミングの考えかた』の表記方法とはすこしちがいますが、日本語のまま例題のプログラムをうごかすことができそうです。今回は、この本のなかの例題を3つ、じっさいにOrotiにかきなおして、うごかしてみます。
小数の表示
さいしょは、本の1章の1を正の整数でわった値を小数で表示する、という問題です。じっさいに実行してみるとつぎのようになります。
$ ./oroti programming_no_kangaekata/1.oro 4
0.25
$ ./oroti programming_no_kangaekata/1.oro 6
0.16666666666666666666666666666666666666666666666666
1/6のような無限小数は小数点以下を50けたうったらおわり。そういうルールにしています。
Orotiでかいたプログラムはつぎのようになります。
1.oro
ライブラリ: プログラム
はじめに:
-----
int(プログラムの引数[1])をdにいれます。
# アルゴリズム 1.7 小数表示
1をrにいれます。
「0.」をうちだします。
1をiにいれます。
i <= 50でしたら、そして、r != 0でしたら、くりかえします。
r * 10をrにいれます。
r // dをqにいれます。
qをうちだします。
r % dをrにいれます。
i + 1をiにいれます。
おくりだします。
このプログラムでは、正の整数dをコマンドライン引数からうけとるようにしています。コマンドライン引数はライブラリの「プログラム」をつかうとよむことができます。
プログラムの引数[1]は、programming_no_kangaekata/1.oroじゃないか?という声があるでしょうか。Orotiはトランスパイラーなので、じっさいにはPythonに翻訳された1.pyがつぎのようにうごいています。
$ 1.py 4
ですので、正の整数の部分はプログラムの引数[1]ということになっています。
『プログラミングの考えかた』との表記法のちがい
- Orotiでは変数はひとつひとつ宣言しなくてもつかえます。
- int()は、文字列を整数にキャスト(変換)するPythonの関数です。
- ≦は<=、≠は!=とかくのがPythonの約束です。Orotiでもそのようにかいています。≦や≠は入力するのがめんどうなので。
- //は、わり算で商とあまりを計算するときの商を計算するオペレーターです。本ではdivというオペレーターをつかっています。
- %は、わり算で商とあまりを計算するときのあまりを計算するオペレーターです。本ではmodというオペレーターをつかっています。
最大公約数と最小公倍数
つぎは、本の2章から、ふたつの正の整数の最大公約数と最小公倍数を表示する、という問題をみていきます。本ではふたつの正の整数のくみをよみつづけていくことにしています。ここでは、ひとくみだけをコマンドライン引数に指定するということにしておきます。
じっさいに実行してみるとつぎのようになります。
$ ./oroti programming_no_kangaekata/2.oro 576 84
576 84 12 4032
576と84の最大公約数は12で、最小公倍数は4,032というぐあいです。アルゴリズムのみちびきかたは、本のなかで紹介されているので、ここではいきなりOrotiのプログラムをしめします。
2.oro
ライブラリ: プログラム
はじめに:
-----
int(プログラムの引数[1])をxにいれます。
int(プログラムの引数[2])をyにいれます。
# アルゴリズム 2.11 最大公約数と最小公倍数
0 < xでしたら、そして、0 < yでしたら、
xをbにいれます。
yをsにいれます。
s != 0でしたら、くりかえします。
b % sをrにいれます。
sをbにいれます。
rをsにいれます。
bを最大公約数にいれます。
x * y // 最大公約数を最小公倍数にいれます。
x、「 」、y、「 」、最大公約数、「 」、最小公倍数をおくりだします。
ユークリッドの互除法をつかうプログラムになっています。本のなかでは、最大公約数をgcd、最小公倍数をlcm、という変数名にしています。それぞれ、greatest common divisor、least common multipleのアクロニム(頭字語)ですね。Orotiでは変数名は漢字のままでもかまいません。プログラムそのものは、1.oroがよめれば、2.oroもよめるのではないでしょうか。
分数の計算
つぎは、本の3章から、分数の計算して表示する、という例題です。(x1)/(y1)+(x2)/(y2)あるいは、(x1)/(y1)-(x2)/(y2)というかたちの文字列から、分数の計算をします。こたえは約分して既約分数のかたちで表示します。なかなか、むずかしそうです。
じっさいに実行してみるとつぎのようになります。
$ ./oroti programming_no_kangaekata/3.oro 7/18+5/14
47/63
Orotiでかいたプログラムもだいぶながくなって、つぎのようになります。
3.oro
ライブラリ: プログラム
主体: メイン
------
# アルゴリズム 3.10
メインで(x)と(y)の 最大公約数をもとめます、とは。
0 < xでしたら、そして、0 <= yでしたら、
xをbにいれます。
yをsにいれます。
s != 0でしたら、くりかえします。
b % sをrにいれます。
sをbにいれます。
rをsにいれます。
bをかえします。
# アルゴリズム 3.11
メインで(x)と(y)の 最小公倍数をもとめます、とは。
0 < xでしたら、そして、0 <= yでしたら、
xをbにいれます。
yをsにいれます。
s != 0でしたら、くりかえします。
b % sをrにいれます。
sをbにいれます。
rをsにいれます。
x * (y // b)をかえします。
メインで つぎの文字をとりだします、とは。
メインの分数式[0]をchにいれます。
メインの分数式[1:]をメインの分数式にいれます。
chをかえします。
# アルゴリズム 3.9
メインで(分数式)を 計算します、とは。
分数式 + ' 'をメインの分数式にいれます。
0をsにいれます。
0をx1にいれます。
0をx2にいれます。
0をy1にいれます。
0をy2にいれます。
s <= 7でしたら、くりかえします。
メインでつぎの文字をとりだしまして、chにいれます。
chが「0123456789」にありましたら、
int(ch)をdにいれます。
s + 1をsにいれます。
メインでつぎの文字をとりだしまして、chにいれます。
chが「0123456789」にありましたら、くりかえします。
d * 10 + int(ch)をdにいれます。
メインでつぎの文字をとりだしまして、chにいれます。
s == 1でしたら、
ch == 「/」でしたら、
dをx1にいれます。
あるいは、s == 3でしたら、
「+-」にchがありましたら、
dをy1にいれます。
ch == 「+」でしたら、
「+」をopにいれます。
あるいは、ch == 「-」でしたら、
「-」をopにいれます。
あるいは、s == 5でしたら、
ch == 「/」でしたら、
dをx2にいれます。
あるいは、s == 7でしたら、
ch == 「 」でしたら、
dをy2にいれます。
s + 1をsにいれます。
y1 != 0でしたら、そして、y2 != 0でしたら、
メインでy1とy2の最小公倍数をもとめまして、lにいれます。
x1 * (l // y1)をxx1にいれます。
x2 * (l // y2)をxx2にいれます。
op == 「+」でしたら、
xx1 + xx2をrにいれます。
op == 「-」でしたら、
xx1 - xx2をrにいれます。
r < 0でしたら、
「-」をうちだします。
-rをrにいれます。
メインでlとrの最大公約数をもとめまして、gにいれます。
r // gをrrにいれます。
l // gをllにいれます。
ll == 1でしたら、
rrをおくりだします。
そうでなければ、
rr、「/」、llをおくりだします。
はじめに:
-----
プログラムの引数[1]を分数式にいれます。
あたらしいメインをつくりまして、メインプログラムにいれます。
メインプログラムで分数式を計算します。
本のなかでは、この例題の3章から関数の概念がでてきます。最大公約数をもとめる関数、最小公倍数をもとめる関数、といったぐあいです。Orotiには、いまのところ関数は導入していません。かわりに動詞を定義することができます。
Orotiの動詞はPythonではメソッドに対応しますが、動詞をつかうには主体がひつようになります。そこで、メインのプログラムなので、そのままメインという主体を定義して、それをつかっています。ふたつの関数は、それぞれ、「最大公約数をもとめます」、「最小公倍数をもとめます」という動詞にしました。このふたつの動詞の本体部分は2章のプログラムがよめれば、わかるはずです。
くわえて、「つぎの文字をとりだします」という動詞も定義しました。本では「次の文字を変数chに取り出す」という文をつかっています。C言語であれば、
ch = getchar();
とかくようなイメージです。Orotiでかきなおしたプログラムでは、式はコマンドライン引数からとるようにしています。ですので、文字列の先頭の字をとりだしてかえす動詞として定義しています。
プログラムのアルゴリズム 3.9の部分は、本をみないと理解するのがたいへんだとおもいます。状態遷移図にしたがって、文字列からx1, y1, x2, y2の値をよみとっていくのが前半部分です。後半は通分して、約分して、という手順を、最小公倍数と最大公約数をつかってスマートにといています。2でわって、3でわってと、しらみつぶしに計算してもいいけれど、もうすこし頭をつかおう。というのが、『プログラミングの考えかた』ということでしょうか。安易に「しらみつぶし法」を指示するようなひとは良心のいたみを感じるべきだと本にはかかれています。
「ジミニー!」
ディズニーの『ピノキオ』は、うそをつくと鼻がのびるシーンが印象にのこっているとおもいますが、本質的には良心の問題おはなしですよね。いつもピノキオのそばにいるコオロギのジミニーが、ピノキオの良心なのでした。
『プログラミングの考えかた』との表記法のちがい
- 本では絶対値をもとめるオペレーター |x| という表記をつかっています。OrotiでもPythonの関数abs(x)をつかってかいてもかまいません。ここでは、プログラムのなかで、じまえで処理するようにかきなおしています。
まとめ
今回は、『プログラミングの考えかた』のなかの例題を3つOrotiでかいて、うごかしてみました。
Orotiでは、いまのところ関数の定義を用意していません。このままずっと用意しなくてもよいような感じもします。例題3では、メインという主体をつくって、そのなかで関数相当のものを動詞として定義する例をしめしました。
すこしかんがえて、最小公倍数と最大公約数は「算数」という主体をつくって、そのなかにいれたらいいのに!そんなふうにかんがえるこどもがいたら、すごい優秀なひとだとおもいます。じっさいのところ、Pythonはそういう感じになっています(参考: 数学関数)。このあたりのイメージがわかれば、のこりの章のプログラムもOrotiでかきなおしていけるのではないかとおもいます。
『プログラミングの考えかた』は、いまは品ぎれのようで、図書館や古本屋さんでさがさないとよめなさそうです。算数の問題がおおくてむずかしいところもありますが、とてもおもしろい本だとおもいます。ぜひ、さがしてよんでみてください。
Orotiの表記方法は、『プログラミングの考えかた』の表記方法とはすこしちがいます。それでも、日本語のままでプログラムをうごかせるというのは、よいこともあるようにおもいます。
プログラミング言語は時代とともにはやりすたりがあります。この本がかかれたころは、BASIC, FORTRAN, Pascal, Cといった言語が有名でした。じっさい、続編の第2巻、第3巻では、この4つのプログラミング言語をあつかっています。しかし、いまよくつかわれているのは、PythonやJavaやJavaScriptなどのようです。
いまでは、きちんとコンピュータをまなんでいくために、BASICやFORTRANやPascalやCをまなぼうという人はとてもすくないようにおもいます。書籍のコンピュータ入門シリーズが品ぎれなのも、第2巻、第3巻などは、よもうというひとが、もうすくないからかもしれません。
それでも、第1巻にあたる『プログラミングの考えかた』は、特定のプログラミング言語に依存しないかたちでかかれていて、いまでも有益なままかわりません。シリーズから独立して、あたらしい版ができたりすると、よいのですが。そして、そのときにつかわれるのは、やはり日本語によるプログラムの表記なのだろうとおもいます。
というわけで、今回はここまでです。Orotiについてコメントやアイデアなどありましたら、GitHubのIssuesまでよせてください。