この文章は、プログラミング言語「にぱも」の紹介と、それを通じたプログラ ミング自体の入門書です。「にぱも」とは、 日本語パイソンもどき (NIhongo PAison MOdoki) という拙作のプログラミング言語です。パイ ソン(Python) は Guido van Rossum さん作のプログラミング言語で、Python は(セキュリティ関連を含む)システム管理、データマイニングなど幅広く利 用されているプログラミング言語ですので、ぜひ自分のものにしましょう。こ の文書はその入門の、さらに入門書の位置付けです。
この文書自体も「インスタント・パイソン」というものを手本にして書きま した。Python は非常に習得しやすい言語で、初心者が学習するためにも適した言語 だと思っています。そして、その Python を、さらに我々(?)日本語を母語 とする人が親しみをもてるように開発したものが 「にぱも」です。「にぱも」 は内部でPythonだけを利用していますので、Python がインストールされてい ればすぐ「にぱも」は使えるはずです。 「にぱも」は学習用に特化しています。「にぱも」で物足りなくなった人は是 非Python を勉強してください。「にぱも」は現状では Web アプリケーション としてのみ動くように作ってあります。
現在、 https://puffin.hannan-u.ac.jp/nipamo/ で、username: semi, password: hannannipamo 公開しています。ちなみに、プログラム例を動かす場合は、それぞれをテキストファイルに 保存してから テキストボックスで動かすことをお勧めします。そうしな いと、後に残らない=復習できないからです。元は https://ma.echan.xyz/nipamo/ で、username: semi, password: hannan 公開していました。… さらに、ネットワーク越しではなく、自分の環境で動かしたい人のためにパッケー ジを作っていました。まず zip で固めたパッケージ を取得してください。そして、適当なフォルダを作ってその中で npm-pkg.zip を展開して、sv86.py を動かしてください。Windows でも Python)がインストールされていれば、展開して setup 等すれば、ダブルク リックで動くはずです(学内PC教室では未確認)そうすると、ブラウザで
にアクセスすることでテキストボックスを介した対話環境が利用できるよう になるはずです。 …事情によりネット越しの利用を優先させてください。プログラミングに限らず、外国語を含め、とにかく言語の習得は 「経験値 を高める」 、つまり予習はともかく(?もちろんするに越したことはな いですが)復習を繰り返して自分のものにするのが一番大切だと、しみじみ思 います…
さて、まずは最初に簡単な「にぱも」プログラムを動かしましょう。
「こんにちは」を出力する
上のリスト(といっても1行だけですが)を、例えば example1.np (以下 の例も同様にしてください)としてエディタで作成し、テキストボックスに コピー&ペーストして実行します (実行ボタンを押します)。すると
実行結果 こんにちは
と、ちゃんと挨拶が返ってきます。ちなみにその上の 『中間コード』 というのは「にぱも」プログラムに対応する Python のコードです。
「コード」 とは、プログラムの記述(文)を指すことばです。プロ グラムをテキスト、すなわち文の塊(表現)という捉え方で言うときに使うこ とが多いと思います。「にぱも」はそのコードをPython のコードに変換して動作させるようになっ てます。「にぱも」はまだ完成度が低いので、少しでも変な書き方をするとエ ラーが返ってきます。その時は、サンプルコードをしっかりと見直してくださ い。 ここで、「を出力する」というところが「にぱも」の出力文です。「を」の前 には変数名(後述)か、「○△」のように「」(鉤括弧) で囲んだ文字列を指定します。変数名の場合にはその変数の内容が、 「○△」の場合にはその文字列自身を出力します。コンパイル言語の場合、コンパイル前のプログラムを(ソース)コードと呼び ます。コンパイル後の実行可能形式はプログラムと呼ぶことは出来ますが、コー ドとは呼びません。代わりに 「バイナリ (binary)」 と呼ぶことが あります。
ちなみに短いプログラムは 「スクリプト」 とも言います。プログラ ムとスクリプトの境目は微妙ですが、1つ言えるのは、コンパイル言語のソー スコードはスクリプトと言うことはないですし、インタープリタ言語の場合は 多少長くてもスクリプトということが多いような気がします。Python と、それ を基にする「にぱも」はインタープリタ言語ですのでスクリプトと言ってよい でしょう。コンパイルとインタープリタの違いは別資料を参照してください。ちなみに、「プログラムの(ソース)コード」とは言いますが、「スクリプト のコード」とはあまり言わないような気がします。「スクリプト」という単語 には「コード」と同様に 「文」 という意味あいがあるからかもしれ ません。つまり、「危険があぶない」のような冗長さが感じられるということ です。
アを1とする イを2とする イにアを足す イを出力する
別の例として、上のリストを保存してから動かしてみてください。計算結果の 3が出力されているはずです。このコードを読んでもらえれば、「にぱも」は プログラミングの教科書にあるような、疑似コードだと考えられるかもしれま せん。
「にぱも」の変数は他のプログラミング言語同様、値をあとで使えるように持っ ておく【箱】のようなものです。「にぱも」の変数は型(詳細は略)を持たな いので、使う時に宣言をする必要がありません。変数は代入する、すなわち値 を入れる(設定する)時に作られます。「にぱも」ではカタカナは変数(と、 関数(後述))の名前として用意されています。逆に言うとカタカナは他では 使えません。実は「甲」「乙」「丙」「丁」も変数名として使えます。
「にぱも」でも「=」(等号)によって値を代入することも可能ですが、 「イを2とする」という書き方で値を代入できます。
○△に●▲を足す ○△に●▲を加える ○△から●▲を引く ○△に●▲を掛ける ○△を●▲で割る
「ブロック」とは、プログラム内の一部の記述のかたまりを、ひとまとまりと して扱うということです…だと分かり辛いので、詳細は以下で説明します。ブロックの区切りは、インデントによって表します。本当にインデント だけで、です。つまりBEGINもENDも中括弧も何もなしです。また、「インデント」とは字下げ、つまり行の頭に空白を挿入することです。
C/C++/Java 等のプログラミング言語ではインデントは意味がありませんが、 読みやすさのために適宜挿入することが推奨されています。しかし、 「にぱ も」(と、その本家である Python) ではインデントが本質的な意味を持って います。これをいい加減にして書くとプログラムとして動きません。
一般的な表現(繰り返しについては後述)を見てみると、こうなります。
甲を20とする 乙を0とする 丙を1とする 丙が甲以下の間繰り返す 乙に丙を足す 丙に1を足す 「合計は」を出力する 乙を出力する 「です。」を改行出力するこれを実行すると
実行結果 合計は210です。と表示されます。これは1から20までの整数の合計を計算するものです。こ こで、
丙が甲以下の間繰り返す 乙に丙を足す 丙に1を足すの下2行は、行頭に空白があります。これがブロックの印で、つまりこの2行 をまとめて『上の「繰り返す」の対象にする』という意味です。この空白はい くつあってもいいのですが、同じブロックに含まれる文の前には同じ長さの空 白である必要がありますので注意してください。現在の「にぱも」の仕様では、 いわゆる全角空白「 」と半角空白2つは同じものとみなしますので、(プロ ポーショナルフォントでは駄目ですが)多くの環境では見た目の字下げが一緒 ならば一緒のブロックとして扱われると期待できます。
ちなみに、「改行出力する」とは、出力のあと行をかえることを指示する文で す。こうしない限り、出力は続いていきます。
アを4とする アを出力する もしアを2で割った余りが0ならば 「は偶数です」を改行出力する「もし」と「ならば」で挟まれた部分が条件式、つまり判断することを記述し て、それが正しいかどうかでプログラムの流れを変えるというわけです。現在 「にぱも」では、条件式として以下が用意されています。
○△が●▲と同じ ○△が●▲と違う ○△が●▲以上 ○△が●▲以下 ○△が●▲以外 ○△が●▲未満 ○△が●▲より大きい ○△が●▲で割り切れる ○△が●▲で割り切れない ○△を●▲で割った余りが■□
「にぱも」でも他のプログラミング言語同様、「そうじゃなければ」という キーワードで、「もし」以外の場合の処理を記述できます。以下のようなも のです。
アを5とする アを出力する もしアを2で割った余りが0ならば 「は偶数です」を改行出力する そうじゃなければ 「は奇数です」を改行出力する上のプログラムで偶数か奇数かを判定することができました。
イを0とする 10までのそれぞれをアとして繰り返す イにアを足す イを出力する
実は「…まで」は、Python に元々ある(ということを「ビルトイン」と呼ぶ ことがあります)関数のrange()を使っています。「にぱも」では「10ま で」と書けば10を含み、1からの数を順番に使えるようにしていますが、 元々の range() は0から指示された数字より1つ少ない数までであること に注意が必要です(データの個数が指示された数になります)。つまり range(3) は (0,1,2) の数字の集まりになる、ということです。これで、理論上は、どのようなアルゴリズムでも「にぱも」で実装できること になります(詳細は略しますが Dijkstra という人が証明しています)。
☆ヒント:単に「5まで」とすると0から掛けてしまうので、「1から5まで」 としないとうまく計算してくれません。
イに入力する ウを1とする イまでのそれぞれをアとして繰り返す もしアが0以外ならば ウにアを掛ける ウを出力するWeb版「にぱも」では便宜的に入力用のテキスト枠を2つ用意しています。 1つは数値用、もう1つは文字用です。単に「入力する」とすると、数値 用を入力とします。適宜使いわけてください。今のところは3つ以上の入 力はできません。 元来の Python では input関数というビルトインがあり、 指示された(空の時もある)プロンプトを表示し、ユーザーにPythonで有 効な値を入力させます。
本来の Python は、もう少し複雑なデータ形式として「辞書(あるいは連想 配列)」というものもあるのですが「にぱも」では今のところ使えません。以下は、20までの奇数のリストをつくってその合計を計算させています。
変数アを0とする 変数イを【1、3、5、7、9、11、13、15、17、19】とする イのそれぞれをウとして繰り返す アにウを足す 「合計は」を出力する アを出力する 「です。」を改行出力する
実は、上の「…まで」のところで少し触れた range() 関数は、リストを 作ります。にぱもでは、「○△から●▲まで」という記述が可能です。以下の例は、 1から10までの合計を計算します。
変数アを0とする 変数イを 1から10までとする イのそれぞれをウとして繰り返す アにウを足す 「合計は」を出力する アを出力する 「です。」を改行出力する
さらに、Python にはない 「にぱも」独自の仕様として、繰り返 しの時に、インデックス変数(上述)の指定を省略することができます。そして、 繰り返しのブロックの中でその値を使いたい場合は 「それ」 と いうことで利用できます。以下の例は、上の1から10までの合計を計算す るものを書き換えたものです。
変数ゴウケイを0とする 1から10までを繰り返す ゴウケイにそれを足す 「合計は」を出力する ゴウケイを出力する 「です。」を改行出力する
関数ゴウケイを定義する 甲を20とする 乙を0とする 丙を1とする 丙<=甲の間繰り返す 乙に丙を足す 丙に1を足す 「合計は」を出力する 乙を出力する 「です。」を改行出力する 関数ゴウケイを呼び出す「関数○△を定義する」で、以下のブロックに○△という名前をつけます。そ れを使いたいときは「関数○△を呼び出す」という形で呼び出します。関数の 定義の中でももちろん変数が使えますが、その変数は関数の中だけで有効です。
これをローカル変数ということがあります。それに対して、関数の外側で定義 されていてプログラム中のどこでも使える変数はグローバル変数といいます。 このような有効範囲のことはスコープと言ってプログラミングでは重要な概念 ですが、詳細は略します。また、以下のように引数(パラメータ)を渡すこともできます。
関数ゴウケイを引数はアで定義する 乙を0とする 丙を1とする 丙<=アの間繰り返す 乙に丙を足す 丙に1を足す 「合計は」を出力する 乙を出力する 「です。」を改行出力する 関数ゴウケイを引数は30で呼び出す「引数は○△で」をつけることで、引数(パラメータ)を渡すことが出来ます。 入力のときと同様、今の「にぱも」では引数は1つしか渡すことが出来ません。
もちろん、値を返すことも出来ます。以下のようになります。
関数ゴウケイを引数はアで定義する ケッカを0とする カウンタを1とする カウンタ<=アの間繰り返す ケッカにカウンタを足す カウンタに1を足す ケッカを返す ソウワを関数ゴウケイを引数は30で呼び出したものとする ソウワを出力する「○△を返す」で、値を返すことを明示します。そして「関数○△を引数は●▲で呼 び出したもの」で、その関数呼び出しを実行します。
また、その後で アルゴリズム入門 もあわせて勉強してもらうと幸せになれるかもしれません。