(2) 4/24の授業内容:プログラミングの基礎

コンパイル型言語とスクリプト型言語

コンピュータに対して命令を行う場合、人間とは異なり、全ての手順を最初から順番に、かつ正確に伝えなえれば理解してもらえない。これから学ぶプログラミング言語は、人間がコンピュータに正確に指示を伝えるために作られたものである。

コンピュータは一見するとアルファベットや漢字を理解できているように感じるが、実際には1と0しか取り扱うことができない。アルファベットも漢字も記号も全て1と0の組み合わせに置き換えられている。これを機械語という。このため、コンピュータに命令を行う場合は、機械語を用いなければならない。しかし、人間が機械語を用いるのは非常に大きな労力であり、間違いも生じやすい。そこでプログラミング言語では、人間が直接扱うことが難しい機械語のかわりにわかりやすい言葉でまず作成し、その後で機械語に翻訳してコンピュータに実行させるという方式を採用している。機械語への翻訳方法によりプログラミング言語は以下の2種類に分類することができる。

  • コンパイル型言語:わかりやすい言葉で書いたプログラム(これをソースコードとかソースと呼ぶ)を変換プログラムであるコンパイラを用いて事前に一括で機械語に変換する。ソースコードを作成した後で人間がこのコンパイルの作業を行う必要がある。コンパイルを行うと機械語に翻訳された実行形式のファイルが生成されるので、そのファイルを実行する。
  • スクリプト型言語:ソースコードをそのまま実行することができる。人間がコンパイルを行うコンパイル型言語とは異なり、実行するとソースコードの解釈プログラムであるインタプリタが勝手に1行ずつ機械語に翻訳してくれる。

このため、コンパイル型言語ではソースコードに誤りがあると、機械語への変換中(コンパイル)にエラーとなり、実行することができない。これに対して、スクリプト型言語では1行ずつの変換であるため、エラーが出現する手前までは実行が可能である。この授業で扱うRubyはスクリプト型言語に分類される。

まずはRubyをさわってみよう

Rubyプログラムのソースコードの作成はemacsで行う。まずはemacsの使い方を把握しよう。主なコマンドを以下に示す。その他のコマンドについては教科書の7ページを参照すること。

  • 新規作成:Ctrl-x Ctrl-f
  • ファイルを開く:Ctrl-x Ctrl-f
  • ファイルの保存:Ctrl-x Ctrl-s
  • 日本語入力のオンオフ:Ctrl-o
  • コピー&ペースト:コピーしたい部分をマウスで反転すると自動的にコピーされる。ペーストしたい場所でマウスの真ん中ボタンを押すとペーストされる
  • コマンドをうち間違えて変なメッセージが出ている:Ctrl-gでなかったことになる(コマンドの中止)

これらを確認しながら簡単なプログラムを作成してみよう。まずemacsでファイルの新規作成を行うコマンドはCtrl-x Ctrl-fなので、これを入力しよう。するとemacs下部のミニバッファに以下のように表示される。

Find file: ~/

この後に続けて以下のように入力しよう(入力した部分を黄色で示す)。

Find file: ~/ruby/greeting.rb[Return]

Rubyプログラムはファイル名に必ず.rbの拡張子をつける。ruby/greeting.rbとなっているが、これはrubyディレクトリの中にgreeting.rbというファイルを新規作成せよという意味である。正しく入力すると、emacsの上部に(greeting.rb)と表示される。

emacs上部にファイル名が表示される

では、プログラムを書いてみよう。まずは余り考えずに以下の通り入力してみよう。

#!/usr/koeki/bin/ruby
print "はじめまして。私の名前は○○(自分の名前)です。\n" 

日本語の入力を行う場合はCtrl-oを押す。Ctrl-oを押すごとに日本語入力と英語入力が切り替わる。

半角英数字と日本語入力の切り替えはCtrl-o

入力したら保存をする。保存はCtrl-x Ctrl-sである。保存をしていない場合は-E:の横に**と表示されている。保存をすると**が消えることを確認しよう。

保存していない場合はミニバッファの上のEの右横に**が表示される

プログラムを作成したら、今度は実行してみよう。実行するのはktermなので、ktermでrubyディレクトリに移動し、下記のように入力する。

irsv{naoya}% cd ruby[Return] #=>ruby/に移動
irsv{naoya}% ruby greeting.rb[Return] #=>greeting.rbの実行

すると次のように表示される(はずである)。

irsv{naoya}% ruby hello.rb[Return]
はじめまして。私の名前は○○です。

greeting.rbはたった2行だが、これでも立派なプログラムである。各行についてそれぞれ解説する。

  • 1行目:#!/usr/koeki/bin/rubyはrubyインタプリタのあるディレクトリを指定している。次の「プログラムの実行方法」の項で詳しく説明する。
  • 2行目:printは""内を表示せよという命令で、このような特別な働きをする文字列のことをRubyではメソッドと呼ぶ。""内は具体的に表示する内容をあらわす。\nは「バックスラッシュエヌ」と呼び改行をあらわす。バックスラッシュは環境により円マークとして表示される場合がある。キーボードにバックスラッシュがある場合はそれを入力し、ない場合は円マークで代用する。

練習

\nの有無により、出力結果が変化することを確認しよう。以下の2つのプログラムは\nの有無のみが異なっている(違いがわかりやすくなるよう\nを黄色で表示している)。それぞれのプログラムを指定した名前をつけて保存し、結果がどうなるか確認してみよう。

今回はいちいち入力するのは面倒なので、コピー&ペーストを使ってみよう。emacsでファイルを新規作成した後で、コピーしたいところをマウスで反転させて選択し、emacs上でマウスの真ん中クリックで貼り付けよう。

greeting2.rb

#!/usr/koeki/bin/ruby
print "はじめまして。\n"
print "私の名前は\n"
print "○○(自分の名前)です。\n" 

greeting3.rb

#!/usr/koeki/bin/ruby
print "はじめまして。"
print "私の名前は"
print "○○(自分の名前)です。\n" 

早くできた人はgreeting3.rbの\nを削除して実行してみよう。何が起こるだろうか?

Rubyプログラムの実行方法

Rubyはスクリプト型の言語であり、実行時にインタプリタという翻訳プログラムが1行ずつ機械語に翻訳する。Rubyインタプリタの起動方法により、2種類の実行方法を選択することができる。どちらを使用してもよい。

  • Rubyインタプリタを起動してからプログラムを実行する方法(ruby プログラム名[Return])
irsv{naoya}% ruby greeting.rb[Return]
  • Rubyインタプリタをソースコードに埋め込む方法(ファイルに実行属性を与えてから、./ファイル名)
irsv{naoya}% chmod +x greeting.rb[Return]
irsv{naoya}% ./hello.rb[Return]

1行目のchmod +x greeting.rbはファイルに実行属性を与えるというもので、最初に1回だけ実施すればよい。その後は2行目の./greeting.rbを入力するだけで実行できる。新しいプログラムファイルをを作成した場合のみ、最初に実行する際に1行目を実施する。

2つの方法の違いについて例をあげながら説明しよう。以下はWindowsのWordで作成したファイルである。左側はgreeting.docという名称で、.docという拡張子がついている。拡張子はどのプログラムで作成されたかを示すもので、.docはWordで作られたファイルであることをあらわしている。左側はダブルクリックするとWordが起動し、ファイルを開くことができる。右側は左側のファイルから拡張子を取り除いたものである。拡張子を取り除くとどのプログラムで作成されたのかがわからなくなるため、アイコンの絵柄も変わる。右側はダブルクリックしてもWordは起動せず、ファイルを開くことはできない。右側のファイルを開く場合には、まずWordを起動し、メニューの「開く」からファイルを指定する必要がある。

Windowsでは拡張子のついたファイルはダブルクリックすると関連付けされたプログラムで開くことができる。拡張子を取り除くと何のプログラムで作られたファイルだかわからなくなるのでダブルクリックしても開けない

ruby ファイル名[Return]という実行方法は、上記の例で言えば右側のファイルを開くことに相当する。ruby ファイル名[Return]のrubyの部分でRubyインタプリタというプログラムを起動し、その後に対象ファイルを開いて実行している。./ファイル名[Return]による実行は左側のファイルを開くことに相当する。ファイル名のみの入力による実行は、アイコンのダブルクリックと同一のイメージである。では、./ファイル名[Return]の場合、プログラムとファイルの関連付けはどのように行われているのであろうか。Windowsの場合、そのファイルがどのプログラムで作成されたのかは拡張子で判断される。Rubyプログラムの場合、関連付けは1行目の#!/usr/koeki/bin/rubyで行われている。これは、このファイルを実行する際には、usrというディレクトリの中のkoekiというディレクトリの中のbinというディレクトリの中にあるrubyインタプリタを利用せよという指示である。

したがって、ruby ファイル名[Return]の形式で実行する場合には#!/usr/koeki/bin/rubyを1行目に記述する必要はない(記述しても良い)。ただしこの授業の中では、どちらの実行方法にも対応できるように、原則として1行目には#!/usr/koeki/bin/rubyを記述するものとする。

課題を行うためのプログラム

次のような問題を想定する。

△△銀行に普通預金で10万円預けました。利率は0.1%です。お金の出し入れをしない場合、残高が11万円になるのは何年後でしょうか。

#!/usr/koeki/bin/ruby

deposit = 100000
goal = 110000
rate = 1.001
y=0
while deposit <= goal
    deposit *= rate
    y += 1
    printf ("%3d年後\t%d円\n", y, deposit)
end

これが問題を解決するプログラムである。deposit.rbという名前をつけて保存し、実行してみよう。何年後になるだろうか。実行したら、以下の解説に進もう。

まずはこのプログラムを全て日本語で記述したものを示す。

変数depositに10万を代入する
変数goalに11万を代入する
変数rateに1.001を代入する
変数yに0を代入する
depositの値がgoalの値より小さい間は以下の処理を繰り返し行いなさい
 depositの値をrate倍(1.001倍)しなさい
 yに1足しなさい
 ○年後□円と表示しなさい。○にはy、□にはdepositの値を入れ込むこと
繰り返しここまで

このプログラムでは現在の預金額をdeposit、目標金額をgoal、利率をrate、経過年数をyとしている。これらは値を入れておく箱の役割を果たしており、総称して変数と呼ぶ。数学の方程式の問題でもxやyに値が代入されていたがそれと同じことである。

変数の名前のつけ方には決まりはないので、depositのかわりにzandakaとしても良いし、yのかわりにyearとしても良い。英語名を使う場合には全て英語名とし、日本語のローマ字表記にする場合は全てローマ字表記とする(つまり、deposit、goal、riritsu、nenというようなセットにはしない)という緩やかなルールはあるが厳密なものではない。いずれにしても変数名からその変数があらわすものがわかるように工夫する。

"while〜end"は繰り返しをあらわす決まった表現で、ここではdepositの値がgoalの値よりも小さい間はwhileとendの間の処理を繰り返せという指示をしている。繰り返し行う処理は3行あり上の2行では*=や+=といった見慣れない表記がなされているが、日本語による各行の説明と照らし合わせれば働きは理解できると思われる。

printfはprintと同様""内を表示させるメソッドである。ただし今回のプログラムでは「○年後□円」と表示し、○と□にはそれぞれyとdepositの現在の値が代入される。このように表示するメッセージ内に、変数に代入されている値が含まれる場合はprintではなくprintfを使用する。""内の%の位置に""の後ろに指定した変数に代入されている値が表示される。したがって""内の%の数と""の後の変数の数は一致していなければならない。%に続くdは表示形式であり、変数に代入された値を10進数の形式で表示せよという意味である。%3dのように%とdの間に入れた数字は桁ぞろえの指定である。ここでは3桁で表示せよという意味になる。2桁の場合には左に1つスペースが開き、1桁の場合は左に2つスペースが開くことになる。見栄えを整え、読み間違いを防ぐ工夫である。\tはTabを意味し、少し間隔をあけるという意味である。printfの詳細な説明は5回目の授業で行う。

%とdの間に数字を入れると桁ぞろえができる

課題

プログラミングを行った感想をメールで送る。説明の方法や授業のペースに対する要望があればあわせて記載すること(不満を書いても減点しません)。

  • 提出先:naoya@e.koeki-u.ac.jp
  • Subject:学籍番号-ruby02
  • 本文:1行目に学籍番号と氏名を記載すること
  • 提出期限:授業終了時まで

採点:本日は出席点のみです

Tips:emacsでの日本語入力のオンオフはCtrl-oです

Tips:Mewによるメールの送り方はMewコマンドを参照