PascalのHello World

第23回は、Pascalを使ったHello Worldです。Pascalでは、リスト1のようにwritelnを使って記述します。文字列はシングルクォートで囲みます。writelnでは、文字列の後に改行コードが自動的に付加されます。

Pascalでは、プログラムのブロックをbegin~endで囲みます。これは、C言語での{ ~ ;}に相当します。プログラムの最後のendには、ピリオドを付けて終了します。

リスト1 writelnを使う(pascal_writeln.p)

Pascalのコンパイラとして、本稿ではPascalのソースをC言語に変換するp2cというソフトを使い、変換後のC言語をgccでコンパイルするという方法をとっています。このp2cには、PascalからC言語への変換と、gccでのコンパイルを自動的に行うp2ccというPerlスクリプトが付属しており、実行例1のようにp2ccコマンドを実行すれば、一気にPascalのコンパイルが行えます。

実行例1 Pascalのコンパイルと実行

writeを使う

writelnではなく、writeを使うと改行なしでの出力ができます。リスト2では、writeを使って改行なしで文字列を出力しています。その後、writelnを引数なしで実行し、改行のみを出力しているため、結局、前掲リスト1とまったく同じ出力が得られます。

なお、Pascalでは、C言語とは異なり、セミコロンは文と文の区切りに入れれば良いため、endの直前の文(リスト2ではwriteln)の後ろにはセミコロンは不要です。

リスト2 writeを使う(pascal_write.p)

文字列型変数に代入

少しプログラムらしく、文字列をいったん文字列型変数に代入してからwritelnで出力するようにしてみましょう(リスト3)。Pascalでは、変数はvarを使って宣言し、変数名の後ろにコロン(:)で区切って変数の型を記述します。string[11]は、長さ11の文字列型を意味します。また、Pascalでは代入の記号は「=」ではなく、「:=」になります。

リスト3 文字列型変数に代入(pascal_string.p)

文字列を連結してみる

さらに、文字列を分割して2つの変数に代入したあと、それらを連結してみましょう(リスト4)。Pascalでは、文字列に対して、単純に足し算を行うことにより、文字列の連結を行うことができます。

リスト4 文字列を連結してみる(pascal_string2.p)

配列を使う

今度は、文字列ではなく、配列を使ってみましょう(リスト5)。Pascalでは、C言語とは違って、文字型の配列は文字列とは異なります。

ここでは、要素数11の文字型配列messageを宣言し、同時に各要素をHello Worldの文字で初期化しています。C言語の文字列とは違って、終端に0のヌル文字が付いていないことにも注目してください。終端の0がなくても、writelnを実行すると、文字型配列messageの型からその要素数が11であることが言語的に判断できるため、文字列は正しく出力されます。

リスト5 配列を使う(pascal_array.p)

forを使ったループ

さらにプログラムらしく、ループを使ってみましょう。まずはforを使ったループです(リスト6)。

ここでは、前項と同様に文字型配列を宣言し初期化したあと、その各要素の文字を1文字ずつ、forループで出力しています。forループ中では、改行が出力されないようにwriteを使い、forループを抜けたあとに、writelnで改行のみを出力しています。

なお、このforループの中には、文としてwriteという1つの文しかないため、forループ本体を囲むbegin~endは省略してもかまいません。ただし、省略する場合はwrite()の直後にセミコロンを付ける必要があります。

リスト6 forを使ったループ(pascal_for.p)

whileを使ったループ

前項のforループをwhileループに書き換え、さらに文字型配列の最後の要素に終端を表す0を付加し、この0を見てループの終了を判定するようにしたのがリスト7です。文字型配列の要素数は1つ増やして12で宣言します。

whileループでは、条件が真である限りループが実行されます。ここでは、配列の要素が0ではないことを条件にしていますが、判定に使っているC言語での「!=」に相当する演算子は、Pascalでは「<>」になります

リスト7 whileを使ったループ(pascal_while.p)

repeat~untilを使ったループ

Pascalにはrepeat~untilというループもあります。これはC言語でのdo~whileに相当するループで、ループ条件の判定がループの最後に行われ、最低1回はループ内容が実行されます。

前項のwhileループを、repeat~untilに書き直したのがリスト8です。C言語のdo~whileとは真偽判定が逆で、untilのところに書かれた式の値が真になると、ループを終了します。

ここでは、配列の要素が0であることを終了条件としていますが、判定に使っているC言語での「==」に相当する演算子は、Pascalでは単に「=」になります。

なお、repeat~untilのループ内には複数の文が書けるので、ループ部分をbegin~endで囲む必要はありません。

リスト8 repeat~untilを使ったループ(pascal_repeat.p)

さいごに

「Hello Worldコレクション」は、今回をもって終了です。もちろん、世の中にはもっと多数のプログラミング言語が存在し、連載で取り上げたプログラミング言語は、その中のごく一部に過ぎません。連載に登場していないプログラミング言語のHello Worldプログラムについては、みなさん、および今後の筆者自身の課題としたいと思います。