• 検索結果がありません。

: キーワード ( 予約語 ) などについて 計算機言語 I 第 8 回コンパイラの仕事

N/A
N/A
Protected

Academic year: 2021

シェア ": キーワード ( 予約語 ) などについて 計算機言語 I 第 8 回コンパイラの仕事"

Copied!
5
0
0

読み込み中.... (全文を見る)

全文

(1)

計算機言語

I

8

コンパイラの仕事

:

キーワード

(

予約語

)

などについて

この講義資料は, 次の場所にあります.

http://www.math.u-ryukyu.ac.jp/~suga/gengo/2018-1/08.pdf

1

プログラミング言語の動作

(

教科書

pp. 102 – 105)

Cでのコンパイル作業は,次のように工程が分離されていると,以前述べました.

1. cpp (Cプリプロセッサ): コメント文の除去,#includeなどの処理.

2. ccom : cppで処理されたデータをアセンブリ言語に変換.

3. as : アセンブリ言語を機械語に変換.

4. ld (リンカ,リンクエディタ) : 上でできた機械語ファイルにライブラリ関数や実行環境のデータを付加

して,実行ファイルにする.

ここでは, 2番目の ccomの動作の一部を少し解説します.

ccomでは, まず(文字定数と文字列定数以外の)空白文字(空白, タブ,改行など)を基準に, ソースコード

を「語(word)」に分割します.

例えば,

int a=10 ;

という文は,空白文字で分割すると, 3つの語int, a=10,;に分割されます.

そのあと,これらの語に対して字句解析(lexical analysis)が実行されます. 字句解析では,まず,これらの語 をさらに文法的にこれ以上分割することができないもの(トークン, token)に分解します.

上の例では,int,;はそれぞれ変数の型名の宣言,文の終わりの記号で,これ以上分解できません. もうひと つの語,a=0,変数名a,代入記号=,数値103つのトークンに分解されます.

さらに,このあと構文解析器(parser), 文法的に正しい記述であり, コンピュータが実行可能な命令が作 れることをチェックしたあと,アセンブリ言語を組み立てます.

C言語の変数名(や関数名)には制限があります. その制限は,上の字句解析がきちんとできるようにするた めです. アルファベットもしくはアンダースコア_から始まる文字列があれば,それは識別子(名前,変数名や

(2)

さらに,言語に対して特別な意味が決まっている語,intifも名前として利用できません. 字句解析で問 題を起こすからです. これらの特別な意味を持つ語をキーワードと言ったり予約語(言語によってあらかじめ 意味が予約されている語)と言ったりします. キーワード一覧は,教科書 p. 102にあります.

上で述べたように, ccomは最初に空白文字を目印にプログラムを語に分けます. したがって,語に分けるこ とがきちんとできれば,空白文字はどれだけ書いても問題ありません. それが,教科書p. 104の例です. ただ ,このように書くと, ccomは処理できますが,人間はそれを読むことができませんので,普通はこのような 書き方はしません.

#includeのような先頭が#で始まる行は, cppが処理しますから,空白文字の扱いも異なります. cppにつ いては,後の講義で少し解説することがあると思います.

2

プログラムの書き方

:

名前の付け方とコメント文

プログマミング言語には, コメント文という仕組みがあります. プログラムの内容に対する注釈を書くため のものです. 現時点までのプログラムでは,コメント文はほとんど書かれていません. 理由は,コメント文を書 くまでもなく処理内容がわかるからです.

その意味で,「コメント文がなくても処理内容がわかるようにプログラムを書く.」というのは, 推奨される べき行為です. そのためには,「変数名や関数名を工夫する」ということを推奨されるのが通常です. 「名は体 を表す.」というのは, プログラミングでも実行すべきことなのです.

教科書のプログラムでは,「意味がわかる変数名を付ける」がなされていません. 例えば,教科書では整数値 の入力値を保持するのにnoという名前の変数を用いています. おそらくフランス語のnombreかラテン語の

numeroの略語だと思いますが, noである理由がわかりません. 入力データを保持する変数に用いているので,

inputのような変数名を利用する方が,より読みやすいプログラムになるはずです.

変数名などを工夫してわかりやすいプログラムを書くと,コメントが全く不要であるかというと,そうでは ありません. 以前レポート問題に出しましたが,

小さい整数から大きい整数までの和を出力する. というプログラムを書くとします.

素朴な for 文のループを用いた次のプログラムは, プログラムを読めばその処理は理解できますが,

min, maxの差が大きければ, その差だけ加法を実行する必要があり,計算効率が悪くなるのは以前に述べた

通りです.

(3)

#include <stdio.h>

int main(void) {

int min, max, i;

int answer=0;

printf("小さい方の整数を入力して下さい: ");

scanf("%d", &min);

printf("大きい方の整数を入力して下さい: ");

scanf("%d", &max);

for ( i=min ; i<=max; i++){

answer += i;

}

printf("%d から %d までの和は, %d です. \n", min, max, answer);

return 0;

}

これを等差数列の和の公式を利用したブログラムは次のようになります. しかし,等差数列の和公式を覚え ている人は,世の中ではかなり少数です. したがって,そのような公式を利用するというコメントを書きます.

#include <stdio.h>

int main(void) {

int min, max;

printf("小さい方の整数を入力して下さい: ");

scanf("%d", &min);

printf("大きい方の整数を入力して下さい: ");

scanf("%d", &max);

/* 等差数列の和の公式を利用する. */

/* min + (min + 1) + ... + max = (min + max)*(max - min + 1)/2 */

printf("%d から %d までの和は, %d です.\n", min, max, (min+max)*(max-min+1)/2);

(4)

3

配列

基本変数型だけでも, かなりなプログラムを書くことができますが, 本格的なプログラミング(複雑な処理) では,大変になります. そこで,多くのプログラミング言語では,「基本変数型から, 別の型を派生させて作る. という操作が用意されています.

どのような変数型が必要か? ,処理内容(処理データと処理アルゴリズム)によって決まります. したがっ ,「基本変数型を利用して,プログラマが自由に必要な変数の型を作り出せる.」という機能は,実用的なプロ グラミング言語には,ほぼ備わっています.

C言語での配列は,「同じ型の変数を一定数ならべたもの」です. これは, Awk でも出てきました. Awk

の違いは, Awk では変数宣言が不要だったり, 配列の要素指定に文字が使えたりするのですが, C では,使う

前に宣言が必要であることと,要素指定は非負整数に限られることです.

3.1 配列変数の宣言

配列変数は次の形で宣言されます.

配列要素の型 配列変数名[配列要素の個数];

例えば,

int tokuten[10];

,tokutenという名前の整数型10個の配列を宣言します. このとき,tokuten[0],...,tokuten[9]10 int型の変数が宣言されます. 配列要素の指定は, 0から始まる整数でなされます. 配列要素の型は,基本変 数型でなくても構いません. 後の講義で述べる予定である,「構造体」の配列なども,高度なプログラミングで はよく用いられます.

配列変数も基本変数型と同様,宣言しただけの時の初期値は「不定」で, どのような値が入っているかは処 理系や実行環境によって,ありとあらゆる可能性があります.

教科書p. 112, p. 113List 5-2からList 5-4をコンパイル,実行して下さい. これらのプログラムでは,

プログラム中での配列要素の初期化の方法を記述しています.

3.2 宣言と同時に初期化

配列変数を宣言すると同時に初期化するには,

配列要素の型 配列変数名[配列要素の個数] = {初期値0, 初期値1,...};

の形で記述します. 左辺の個数は,要素の個数以下でないとエラーです. 左辺の個数が要素の個数より小さけ れば,最初から順に初期値が代入され,残りは配列要素の型が基本変数型なら, 0で初期化されます.

教科書p. 114, List 5-5をコンパイル,実行してください.

(5)

3.3 配列のコピー

教科書p. 115にあるように, 配列の要素全体の値を別の配列に代入文を利用してコピーすることはできま

せん. forループを用いて, 1要素ごとにコピーする以外に手はありません.

これは不便ですが,現実問題として配列のコピーを実装すると, 機械語レベルでは上のような操作以外に方 法はないのです. そこで, C言語の設計者は,言語仕様にそのようなものを入れなかったのだと思います. すな わち,配列全体をコピーするという動作は手間がかかるので, 「そのようなことをしなくても済むようなプロ グラムを書かせるようにした.」 と思われます. どうしてもコピーする必要がある場合には,教科書のように1 要素ごとにコピーします.

p. 115 List 5-6をコンパイル,実行してください. それが終わったら, p. 116, p. 117List 5-7, List 5-8 もコンパイル,実行してください. for文によるループが多用されることを,実感してください.

レポート問題

締め切りは, 611

1. 演習5-2,件名: Enshu 5-2 2. 演習5-4,件名: Enshu 5-4

3. 配列の要素数よりも多い初期値を与えて初期化するプログラムを書いたときのエラーメッセージをレ ポートせよ. 件名: 配列のエラーメッセージ.

4. 配列の要素数の範囲外のデータにアクセスするプログラムを書いたときに何が起こるかをレポートせ . 件名: 範囲外の配列アクセス.

すでに経験済みだとは思いますが,文法的に問題のあるプログラムをコンパイルしようとすると,コンパイ ラはエラーメッセージを出力します. そのメッセージをきちんと読んで理解する習慣もつけて下さい.

参照

関連したドキュメント

2021] .さらに対応するプログラミング言語も作

と言っても、事例ごとに意味がかなり異なるのは、子どもの性格が異なることと同じである。その

しかし,物質報酬群と言語報酬群に分けてみると,言語報酬群については,言語報酬を与

②上記以外の言語からの翻訳 ⇒ 各言語 200 語当たり 3,500 円上限 (1 字当たり 17.5

今回の調査に限って言うと、日本手話、手話言語学基礎・専門、手話言語条例、手話 通訳士 養成プ ログ ラム 、合理 的配慮 とし ての 手話通 訳、こ れら

という熟語が取り上げられています。 26 ページ

自然言語というのは、生得 な文法 があるということです。 生まれつき に、人 に わっている 力を って乳幼児が獲得できる言語だという え です。 語の それ自 も、 から

東海日本語ネットワーク 代表 酒井美賀