18
1 Ⓒ Copyright 守屋悦朗 2006 プログラミング言語総論 プログラミングの前に・・・ * 目的は? 何をしたいのか? 何が得られればよいのか? * 手段は? 何に着目して問題を整理するか? アプリケーションの利用で十分? それとも、プログラミングが必要? * 何を中心にしてプログラムを構成するか? データを単に整理するだけ → 処理のための計算順序を書けばよい ものの間の関係を記述する → 「もの」をどの範囲で捉えるか? 入力と出力の間の関係だけを記述する場合 もっと一般的に「もの」が何かを記述する場合 プログラミングのパラダイム programming paradigm paradigm 模範、典型 特に言語の場合、「学ぶ」は「まねる」である。模範的なものを学んでまねることが大事。 書法 習慣、作法、ツール、模範例を知ること。 1.プログラミングとは 今日のコンピュータのほとんどは、机上で(エディタ等によりコンピュータへ直接入力 する場合も含む)プログラムを作り(コーディング coding という)、それを計算機の記憶装 置内に読み込んで記憶しておき、 コンパイラ(compiler)と呼ばれるプログラムによりコンピ ュータが理解できるもの(機械語と呼ばれる言語で書かれたもの)に翻訳してから実行す る、という方式を採用している。これをプログラム内蔵方式(stored program method)とい う。 以下の手順でプログラムの作成から実行までが行われる。 (a)プログラムを書く プログラムやデータなど、コンピュータへの入力は通常は文字の列(テキスト)である。こ の入力の際、文字や行などの追加、削除、修正などの編集の支援をしてくれるプログラム エディタ(editor)という。

情報数学III 2001年度後期 担当:守屋 · 2017. 10. 2. · アセンブリ言語といえども、人間にとってはまだ使いにくい。その主たる理由は、処理

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 情報数学III 2001年度後期 担当:守屋 · 2017. 10. 2. · アセンブリ言語といえども、人間にとってはまだ使いにくい。その主たる理由は、処理

1

Ⓒ Copyright 守屋悦朗 2006

プログラミング言語総論

― プログラミングの前に・・・

* 目的は?

何をしたいのか? 何が得られればよいのか?

* 手段は?

何に着目して問題を整理するか?

アプリケーションの利用で十分? それとも、プログラミングが必要?

* 何を中心にしてプログラムを構成するか?

データを単に整理するだけ → 処理のための計算順序を書けばよい

ものの間の関係を記述する → 「もの」をどの範囲で捉えるか?

入力と出力の間の関係だけを記述する場合

もっと一般的に「もの」が何かを記述する場合

― プログラミングのパラダイム programming paradigm

paradigm = 模範、典型

特に言語の場合、「学ぶ」は「まねる」である。模範的なものを学んでまねることが大事。

書法 = 習慣、作法、ツール、模範例を知ること。

1.プログラミングとは

今日のコンピュータのほとんどは、机上で(エディタ等によりコンピュータへ直接入力

する場合も含む)プログラムを作り(コーディング coding という)、それを計算機の記憶装

置内に読み込んで記憶しておき、コンパイラ(compiler)と呼ばれるプログラムによりコンピ

ュータが理解できるもの(機械語と呼ばれる言語で書かれたもの)に翻訳してから実行す

る、という方式を採用している。これをプログラム内蔵方式(stored program method)とい

う。

以下の手順でプログラムの作成から実行までが行われる。

(a)プログラムを書く

プログラムやデータなど、コンピュータへの入力は通常は文字の列(テキスト)である。こ

の入力の際、文字や行などの追加、削除、修正などの編集の支援をしてくれるプログラム

をエディタ(editor)という。

Page 2: 情報数学III 2001年度後期 担当:守屋 · 2017. 10. 2. · アセンブリ言語といえども、人間にとってはまだ使いにくい。その主たる理由は、処理

2

(b)書かれたプログラムをコンピュータが理解できるものに翻訳する

人間がプログラミング言語で書いたプログラム(ソースプログラム source program と

いう)は単に文字の列であり、このままの形ではコンピュータが理解して実行することは

出来ない。コンピュータに実行させるためには、コンピュータが理解できる形の命令の列

に翻訳しなければならない。コンピュータが理解できる命令とは、それを直接に解読して

実行するためのハードウェア(CPU=central processing unit)が備わっているもののこと

をここでは指すが、それは機種ごとに異なるものである。そのような命令(あるいは、そ

ういった命令の列として書かれたプログラム)のことを機械語(machine code)と呼ぶ。機械

語は、0 と 1 のみで記述される。

人間にとってより分かり易い、機械語よりは高級な言語で書かれたソースプログラムを

機械語に翻訳する作業を行うプログラムをコンパイラ(compiler、翻訳系)といい、その作業

をコンパイル(compiling)という。コンパイラはソースプログラムの誤りを見つけると、そ

れがどんな種類のエラーであるかを推定してエラーメッセージ(error message)も出す。C

言語にはC言語のコンパイラがあり、Java には Java のコンパイラがある、というように、

言語ごとに別々のコンパイラが必要である。

コンパイラと似たものにインタプリタ(interpreter、通訳系)と呼ばれるものがあるが、こ

れはコンパイラのようにソースプログラムを機械語に翻訳してしまうことはせず、ソース

プログラムを逐一解釈しながら実行していくプログラムである。

(c)翻訳したものに必要なものを付け加えて実行可能な形に修正する

コンパイラがソースプログラムを翻訳した結果であるオブジェクトプログラム(object

program)は未確定部分を含んだままの機械語コードである。これに、あらかじめシステム

に登録してあるプログラム群(ライブラリ library という)の中から取り出した必要なもの

(入出力関係のルーチン、あるいは、例えばソースプログラムで sin を使っている場合には

sin を計算するルーティンなど)や、すでにコンパイルして保存されている他のプログラムを

持ってきたりして、それらを結合して実行可能なプログラム(実行形式という)に編集する作

業をリンケージといい、それを行なうプログラムをリンカ(linker, linkage editor)という。

コンパイルとリンケージは通常、1つの過程として連続して実行することが多い(まとめて

コンパイル・リンケージと呼ぶ)。

(d)実行可能な形になったものを実行する

以上の作業を経て作られた実行可能プログラムはメモリ上にファイル(実行ファイル

executable file と呼ぶ)として生成され、実行することができる。そのときには実行を行う

ためのプログラムを起動させる。

Page 3: 情報数学III 2001年度後期 担当:守屋 · 2017. 10. 2. · アセンブリ言語といえども、人間にとってはまだ使いにくい。その主たる理由は、処理

3

問題解決のためにプログラムの作成から実行まで

始 め

問題/仕事

......解決策を検討する

解法/作業手順 ......アルゴリズムを考える algorithm

......コーディング(プログラムを書く) coding

プログラム(机上) ......プログラミング言語で記述

Pascal,C,Java,FORTRAN など

......入力 (エディタを使う) editor

デバッグ... ソースプログラム source program

debugging (原始プログラム) 人間にしかわからない文字の列

(エラーがある ....コンパイラによって機械語に翻訳する compiling

場合に、 .

プログラムを オブジェクトプログラム(オブジェクトコード) object program

修正する) 未確定部分を含む機械語コード

ライブラリや library

他のオブジェクト linkage editing

プログラム .... リンカによって他のプログラムと結合・編集する

実行可能プログラム executable program

機械語で記述された命令の列

(コンピュータが理解できる 0,1 の列)

データ

......実行 execution (run)

実行結果

......結果が ok なら終了

終 了

Page 4: 情報数学III 2001年度後期 担当:守屋 · 2017. 10. 2. · アセンブリ言語といえども、人間にとってはまだ使いにくい。その主たる理由は、処理

4

2.機械語とアセンブリ言語

1つの機械語命令は、命令の種類とその作業対象となるデータの入っている場所(アド

レス)などを 0,1 で表現したものであり、このような機械語命令の列を機械語プログラム

という。機械語(machine language)は単に 0,1 の列であるが、アセンブリ言語(assembly

language)は、より人間に分かりやすいように命令の書き方などを記号化したものである。

(例)X と Y の和を Z に代入するプログラム

機械語(8080A) アセンブリ言語(8080A) 汎用高級言語

00111010 LDA X Z=X+Y (FORTRAN)

00000001 LXI H,Y COMPUTE Z=X+Y. (COBOL)

10000000 ADD M z:=x+y; (PASCAL)

00100001 STA Z Z←X+Y (APL)

00000010 (SETQ Z (+ X Y)) (LISP)

10000000 Z=X+Y; (PL/I)

10000110 _z is _x+_y (Prolog)

00110010 z=x+y; (C,C++,Java)

00000011

10000000

高級言語と違い、機械語の仕様はCPU(すなわち、機種)ごとに異なっている。上お

よび以下の例に用いたのは、インテル社製の 8080Aと呼ばれるMPUの機械語である(8080A

はマイコンが出現した当初の 8 ビットマシン。MPU=micro processor unit=マイコン

のCPU)。通常、機械語命令の種類(命令セット)は 100個から 200個くらいあり、1つ

の命令は次のような構造をしている(命令によって、長さや形式がかなり異なる):

① ② ③

命令コード 補助情報 命令の対象となるアドレスあるいはデータ

①の「命令コード」はその命令の名前を 2 進数で表したものであり、③の「アドレス部」

にはその命令の操作対象となるデータが入っているメモリ(主記憶装置)のアドレス、あ

るいは使われるデータ自身が入れられる。②(「修飾部」)には、レジスタ番号その他の補

助情報が入れられる。レジスタ(register)とは、演算に使われる少数個の高速メモリのこ

とである。

Page 5: 情報数学III 2001年度後期 担当:守屋 · 2017. 10. 2. · アセンブリ言語といえども、人間にとってはまだ使いにくい。その主たる理由は、処理

5

命令には、足し算や掛け算などの算術演算を行なうものや、論理和や論理積などの論理

演算を行なうものや、命令の対象となるデータをメモリからレジスタに取ってきたり演算

結果をメモリに戻す命令や、命令の実行順序を変えるための命令などがある。

例えば、数値の足し算を行なう ADD命令は、アセンブリ言語では

ADD r (rはレジスタの名前)

のように書き、演算を行なうためのレジスタである A レジスタにすでに入っている数値デ

ータ(固定小数点数と呼ばれる形式で表されている)に、rレジスタに入っている数値デ

ータを加算する命令である。ただし、r=M のときは、H-L レジスタの対が示すメモリ内の

番地を表わす(上図参照)。「ADD M」命令はコンピュータの内部(機械語)では

のように表わされている。

10000111

は ADD 命令(ただし、演算対象データは H-L レジスタ対が示すメモリの上にある)の 2 進

コードであり、逆に、「ADD M」をこの命令のニモニック(mnemonic、記憶法・記憶術 ⇒ ADD

は 10000111よりも覚えやすいように付けた名前なのでこのように呼ぶ)という。

機械語命令とアセンブリ言語の命令の対応例をもう1つだけ説明しておこう。LDA 命令

(load accumulator direct)は、アセンブリ言語では

LDA m (mはメモリの記号番地)

A

F

C

D

E

H 0

L

+

B

0 0 0 1 0 0 1 0 0 0 1 1 0 1 0 0

H-L レジスタペア=(1234)16

0000 番地

0001 番地

1234 番地

FFFF番地 レジスタ群

メモリ

1 0 0 0 0 1 1 0

MSB LSB

1000 0111 は 16 進数で 86

Page 6: 情報数学III 2001年度後期 担当:守屋 · 2017. 10. 2. · アセンブリ言語といえども、人間にとってはまだ使いにくい。その主たる理由は、処理

6

のように書き、記号番地(メモリ上のアドレスに便宜的に付けられた名前)mにあるデー

タを Aレジスタに直接格納する命令である。LDAは 3バイト使って書かれる命令であり、1

バイト目には命令コード(3B)16が書かれ、2バイト目と 3バイト目に記号番地mのアドレス

が書かれる。例えば、上の例の場合、

LDA X

は、コンピュータ内部では

00111010

00000001

10000000

となっており、これは変数 X はメモリ上の(10000000 00000001)2=(8001)16 番地に入ってい

ることを示している(アドレスの上位1バイトは命令の 3 バイト目に、下位 1 バイトは命

令の2バイト目に書かれる)。

3.汎用高級言語

アセンブリ言語といえども、人間にとってはまだ使いにくい。その主たる理由は、処理

を記述するために使える命令が人間の日常使う言語とかけ離れていることになる。

そこで、人間の使う言語(自然言語)により近い言語を使ってプログラムを書くことが

できるように開発されたものが高級言語(高水準言語, high-level language)である。多く

の高級言語は、特定の目的(例えば、文字処理だけに限定とか、シミュレーション用とか、

表計算用とか、データベース操作用など)に合うプログラムだけが書き易いようにではな

く、どんな用途のプログラムでも書けるように設計されており、そのような言語を汎用プ

ログラミング言語(general-purpose programming language)という。

このような高級言語で書いたプログラムは勿論そのままではコンピュータには実行がで

きないので、アセンブラのように「高級言語から機械語へ翻訳するプログラム」が必要に

なる。このような翻訳プログラムのことをコンパイラ(翻訳系、compiler)と呼ぶ。その

ため、コンパイラを必要とするようなプログラミング言語のことをコンパイラ言語

(compiler language)とも呼ぶ。

3.1 代表的なプログラミング言語

代表的な高級言語をいくつか挙げると・・・

最初に登場した高級言語は IBM704用に開発された FORTRAN である(1954年。IBM社の

J.Backusが設計した)。FORTRANは FORmula TRANslation から名付けられているように、

科学技術計算を主目的に開発されたものである。現在でも使われ続けられているが、その

Page 7: 情報数学III 2001年度後期 担当:守屋 · 2017. 10. 2. · アセンブリ言語といえども、人間にとってはまだ使いにくい。その主たる理由は、処理

7

仕様は初期の頃と比べればかなり拡張されたものとなっている。大文字で FORTRAN と表記

した場合、FORTRAN 77以前の FORTRANを指し、Fortranと表記した場合、Fortran 90また

は 95を指すことがある(数字は改定の年度を表す)。

COBOL(COmmon Business Oriented Language)は事務処理用に開発された言語である。開

発メーカーごとに異なっていた事務処理言語を統一するために、アメリカ国防総省によっ

て共通言語の開発が提案され、CODASYL(Conference on Data Systems Languages、データ

システムズ言語協議会)が設立して開発された共通事務処理用言語が COBOLである。

BASIC (Beginner's All-purpose Symbolic Instruction Code)は1964年、米ダートマス

大学の数学者ジョン・ケメニーとトーマス・カーツによって、コンピュータ教育用の言語

として開発された。FORTRAN の文法が基になっている。1970年代末から1980年代初頭にか

けて、BASICインタプリタがROMの形で搭載されはじめ、一気に当時のマイコンにおける標

準言語の地位を獲得したが、各メーカーのパソコンに標準搭載された BASICは、機種ごと

に独自拡張が行われ(例えば、マイクロソフト社の MS-BASIC, GW-BASIC, Quick BASIC(1985),

Visual BASIC (1991)などや、F-BASIC, S-BASIC, N88-BASIC (日本電気)など)、いわゆる

方言が生まれた。パソコンがCUI環境からGUI環境となった現在でも、Visual Basic (VB) が

Windows における代表的なプログラミング言語のひとつとして広く利用されている。ただ

し、Visual Basicは、GUIに特化した大幅な拡張が施され、元の BASIC言語とはかけ離れて

しまっている。

ALGOL (ALGOrithmic Language)は、科学技術計算用言語(アルゴリズム記述用)とし

て欧州を中心にして 1960 年に開発されたものである(その後開発された Algol68 と区別し

て Algol60 とも言う)が、プログラミング言語が持つべき機能や考え方の多く(再帰、構

造化、サブプログラム間のパラメータ受け渡しの方法など)を初めて取り入れると同時に、

シンタックス(構文=プログラムの形に関する規定)を厳密に記述する方法(BNF記法)

を初めて取り入れて言語の厳密な定義をした等、理論的な発展に多大な寄与をした言語で

ある。そのため、Pascal, C など、その後登場した構造化プログラミング言語(structured

programming language)の基になった。

構造化プログラミングとは、プログラム全体をいくつかの小さな処理に分解して階層的

な構造となるようにする手法のことであり、そうすることにより、プログラムの構造が明

確になり、誤りの発見や修正やメインテナンスが容易になる。1970 年代以降のプログラミ

ング言語の殆どは構造化プログラミングに向いた仕様を満たしたものであった。1980 年代

に初めて登場するオブジェクト指向プログラミングは、構造化プログラミングの考え方を

発展させたものである。

Page 8: 情報数学III 2001年度後期 担当:守屋 · 2017. 10. 2. · アセンブリ言語といえども、人間にとってはまだ使いにくい。その主たる理由は、処理

8

Pascalはプログラミング言語の教育用に 1968年にスイス連邦工科大学の N.Wirthによっ

て設計されたものであり、開発当初は大学等で広く用いられたが、最近はほとんど使われ

なくなっている。C言語と同じALGOLの流れを汲むプログラミング言語である。Borland社

のWindowsアプリケーションソフト開発環境であるDelphiは、Pascalにオブジェクト指向的

な拡張を施したものである。

C 言語は、もともとは中型機のシステム設計用の言語として 1972 年ごろアメリカのベル

研究所の Dennis M. Ritchie によって開発された言語であるが、多くの優れた特徴を持って

いたために次第に高く評価され、システム関係のプログラム記述用言語に止まらず広く一

般に使われるようになり、現在ではパソコンやワークステーションから大型機に至るまで

広く使われている。C++は、C をベースにしてオブジェクト指向言語として拡張したもので

ある。

以上挙げた言語は、データに対する処理の手順(アルゴリズム)を記述するという発想

で設計されているため、手続き型言語(procedure-oriented language)と呼ばれている。これ

に対し、非手続き型言語の1つであるオブジェクト指向型言語(object-oriented language)

では、プログラムが対象としようとしている世界に属す「もの」(=オブジェクト)を中心

に据えて、それらの特徴(属性=持っている性質、および、データに対する処理機能)を

記述することがプログラムの主要な部分を成す。オブジェクト指向型の思想を最初に取り

入れたのは Smalltalk(1980 年)であり、その後登場する C++, Java などのオブジェクト指

向型言語の基になった。

その他の汎用非手続き型言語には、LISP (LISt Processing language)や APL (A

Programming Language)に代表される関数型言語と、Prolog(PROgramming in LOGic)

に代表される論理型言語などがある。

一方、機械語への変換作業(コンパイル)を省略して簡単に実行でき(インタープリタ

方式)、小規模なプログラムをすばやく作成することができるプログラミング言語を総称

して、スクリプト言語(script language)あるいは簡易プログラミング言語と呼ぶことが

ある。一般のプログラミング言語に比べて機能は低いが、習得が容易で記法も簡便である。

代表的なものには Perl や VBScript、JavaScript などがある。これらの言語はWebページ

に動きを加えたり、Webサーバ上で動的にページを生成するのに用いられることが多い。

Page 9: 情報数学III 2001年度後期 担当:守屋 · 2017. 10. 2. · アセンブリ言語といえども、人間にとってはまだ使いにくい。その主たる理由は、処理

9

3.2 プログラミング言語の分類

高級言語は、その設計思想、機能などによってさまざまに分類することができる。分類

の仕方はいろいろあるが、ここではプログラムをどのように記述するかによって 4 種類に

分類してみる。

3.2.a.手続き型言語

手続き型言語で書くプログラムでは、計算手順(=基本的処理や操作がどのような順序

で実行されるべきであるか)を記述する。

代表的な言語: Fortran, COBOL, Pascal, C, BASIC, PL/I, Ada, …

(例)n! を求める

反復的定義

n! = 1×2×・・・×n

あるいは、再帰的定義

1 n=0 のとき n! =

(n-1)! ×n n>0 のとき

に従って操作(計算手順)を記述する。

Pascal によるプログラム例

再帰的関数の定義 反復的実行

program factorial(input, output); program factorial(input, output);

var n: integer; var f, i, n: integer;

function f(n: integer); begin

begin readln(n);

if n=0 then f := 1 f := 1;

else f := f(n-1)*n for i := 1 to n do f := f* i;

end; writeln(n, “! = “, f)

begin end.

readln(n); .

writeln(n, “! = “, f(n))

end.

Page 10: 情報数学III 2001年度後期 担当:守屋 · 2017. 10. 2. · アセンブリ言語といえども、人間にとってはまだ使いにくい。その主たる理由は、処理

10

C によるプログラム例

#include <stdio.h> #include <stdio.h>

int f(int n) { main() {

if (n==0) return 1; int f, i, n;

else return f(n-1)*n; scanf("%d", n);

} f = 1;

main() { for (i = 1; i <= n; i++)

int n; f = f*i;

scanf("%d", n); printf(“n != %d”, f);

printf(“n != %d”, f(n)); }

}

FORTRAN によるプログラム例

FUNCTION F(N) READ(5,100) N

F=1 100 FORMAT(I2)

DO 10 I=1,N F=1

10 F=F*I DO 10 I=1,N

RETURN 10 F=F*I

END WRITE(6,200) F

200 FORMAT(I20)

READ(5,100) N STOP

100 FORMAT(I2) END

M=F(N)

WRITE(6,200) M

200 FORMAT(I20)

STOP

END

BASIC によるプログラム例

10 INPUT N 10 INPUT N

20 GOSUB 1000 20 F=1

30 PRINT F 30 FOR I=1 TO N

40 END 40 F=F*I

1000 F=1 50 NEXT I

1010 IF N=0 THEN 1050 60 PRINT F

1020 FOR N=1 TO N 70 END

Page 11: 情報数学III 2001年度後期 担当:守屋 · 2017. 10. 2. · アセンブリ言語といえども、人間にとってはまだ使いにくい。その主たる理由は、処理

11

1030 F=F*I

1040 NEXT I

1050 RETURN

1060 END

PL/I によるプログラム例

FACT: PROCEDURE OPTIONS(MAIN); FACT:PROCEDURE OPTIONS(MAIN);

DECLARE N; DECLARE F,I,N;

GET LIS(N); GET LIST(N);

M=F(N); F=1;

PUT LIST(M); DO I=1 TO N BY 1;

F: PROCEDURE(N); F=F*I;

IF N=0 END;

THEN RETURN(1); PUT LIST(F);

ELSE RETURN(F(N-1)*N); END FACT;

END F;

END FACT;

3.2.b.関数型言語

関数型言語では、プログラムは関数の集まりであり、関数を定義することがプログラミ

ングであり、すべての計算は関数の適用によって行われる。手続き型言語と違い、変数へ

代入するという概念は(初期値設定以外では)ない。広い定義では Lisp やその方言の1つ

である Scheme は関数型言語に分類されるが、これらの言語では変数の書き換えが可能な

ため、厳密な定義ではこれらは関数型言語の機能を備えた手続き型言語であるもいえる。

代表的な関数型言語には、APL、Lisp、ML、OCaml、Scheme などがある。

(例)n! を再帰的関数として定義する

Lisp によるプログラム例

(DEFFUN f (n) … 関数 f(n)を定義する

(COND ((greaterp n 0) f(n-1)*n) … n>0 なら f(n-1)*n が f(n)の関数値

(T 1) … そうでないなら 1 が f(n)の関数値

)

) … 定義はここで終わり

(f 5) … これは 5! の計算

Page 12: 情報数学III 2001年度後期 担当:守屋 · 2017. 10. 2. · アセンブリ言語といえども、人間にとってはまだ使いにくい。その主たる理由は、処理

12

C によるプログラム例のうちの再帰的関数によるものも参照せよ。

3.2.c.論理型言語

論理型言語では、問題を論理的関係として記述することがプログラミングである。

代表的言語: Prolog, GHC, OPS

(例)親子兄弟関係

Prolog によるプログラム例

sibring(_x,_y):-sibring(_y,_x). x と y が兄弟なら y と x も兄弟である

father(_x,_y):-parent(_x,_y),man(_x). x が y の親で男なら、x は y の父親である

man(A). A は男である

man(B). B は男である

parent(A,C). A は C の親である

?-father(_x,C). C の父親は誰か?

Lisp および Prolog については別資料『Lisp』および『Prolog』を参照せよ。

3d.オブジェクト指向型言語

オブジェクト指向型言語では、「もの」(オブジェクト)を主体とした考え方をする。各

オブジェクトはそれを特徴づける固有の特性(ある属性を持つデータ(フィールドと呼ぶ)

や環境に変化をもたらす動作など(関数として表すことができるようなもの。メソッドと呼

ばれる))を持っているが、共通の特性をもつオブジェクの集団を抽象的に表したものをク

ラスという。オブジェクト指向型言語では、いくつかのクラスを定義することがプログラ

ミングである。

代表的言語: Smalltalk, C++, C#, Java, JavaScript, Delphi, Ruby, PHP

(例)

Java によるプログラム例

銀行口座

「口座」を表わす bankAccount というクラスは、次のようなフィールドやメソッドを

持つものとして定義することができる:

・フィールド name:口座所有者(文字列)

・フィールド number:口座番号(整数)

・フィールド balance:残高(整数)

・メソッド deposit:預金操作

・メソッド withdraw:預金引き出し操作

Page 13: 情報数学III 2001年度後期 担当:守屋 · 2017. 10. 2. · アセンブリ言語といえども、人間にとってはまだ使いにくい。その主たる理由は、処理

13

・メソッド main:このメソッドから実行が開始される

class bankAccout {

String name;

int number;

int balance;

void deposit(int amout) {

balance += amount;

}

void withdraw(int amount) {

balance -= amount;

}

public static void main(String[],args) {

bankAccount a = new bankAccount();

a.name = ”Taro”;

a.number = 12345;

a.balance = 0;

a.deposit(10000)

a.withdraw(5000);

System.out.println(a.balance);

}

}

3e.スクリプト言語

汎用高級言語がコンパイル言語と呼ばれているのは、ソースプログラムを機械語に翻訳

(コンパイル)してから実行されるからであるが、これをせず、ソースプログラムをイン

タープリタ方式により直接実行できるようにしたプログラミング言語をスクリプト言語と

いう。コンパイラ言語(汎用高級言語)とほとんど同様にソースコードを記述するが、小

規模なプログラムをすばやく作成することが主な目的であるため、一般のプログラミング

言語に比べて機能は落ちる。

代表的な言語:Perl,VBScript,JavaScript

Webページに動きを加えたり、Webサーバ上で動的にページを生成するのに用いられること

が多い。ワープロソフトや表計算ソフトなどのマクロ言語もスクリプト言語の一種である。

Page 14: 情報数学III 2001年度後期 担当:守屋 · 2017. 10. 2. · アセンブリ言語といえども、人間にとってはまだ使いにくい。その主たる理由は、処理

14

4.プログラミング言語に共通な要素

手続き型プログラミング言語を中心に、どの言語にも共通する概念・事柄について述べ

ておこう。

(1)書式

アセンブリ言語やかつてのFORTRANでは、行番号(あるいはラベル)やプログラムの各行

は1行の何桁目から何桁目までの間に書かなければいけない、といった書式上の制約があ

った。しかし、現在のプログラミング言語の殆どは、プログラムを1行中にどのように書

いてもよく、1行の長さの制限もない。大抵の場合、空白は文字(または文字列)として使わ

れるときのみ意味を持つ。ただし、区切り記号としての役割もある。

(2)使える文字

プログラムを書くために使える文字として、通常、

英字A~Z,数字0~9,および*,+,/,-,(,),&,などの特殊文字

が指定されている。英字は、大文字しか使えないあるいは使わない言語(古いFORTRAN, COBOL

など)、大文字と小文字を区別しない言語(BASICなど)、大文字と小文字を区別する言語(C,

C++, Javaなど)がある。

(3)語句(トークン、字句、token)

プログラムを構成する論理的意味を持つ最小単位を語句という。識別子、キーワード、

定数、文字列、演算子、区切記号が語句であり、この他に、語句ではないがプログラムの

構成要素として「注釈(コメント)」がある。

(4)注釈

注釈(コメント、comment)は、プログラム作成者が「覚え書き」や「注意」のためにプログ

ラムの中に書くものであり、プログラムの内容に影響を及ぼさない。コメントは

/* ....... */ 間に改行を含んでいてもよい

のように、/* と */ (あるいは、(* と *)、あるいは { と }、など、言語によって異な

る)で括って表わす。「行」という概念がある言語では、「C」 とか 「#」 とか 「//」 と

いう特定の文字によって注釈の始まる位置(そこから行末までが注釈となる)を指定でき

ることもある。通常、注釈の中には漢字、仮名をはじめ、どんな文字も書くことができる。

Page 15: 情報数学III 2001年度後期 担当:守屋 · 2017. 10. 2. · アセンブリ言語といえども、人間にとってはまだ使いにくい。その主たる理由は、処理

15

(5)識別子(名前、name, identifier)

たいていのプログラミング言語では、変数や配列に付ける名前や関数の名前などに使う

ために、先頭が英字、2文字目以降が英字か数字(英字または数字のことをまとめて英数字

という)であるような文字列(アンダースコア _ も英字として扱うことが多い)を用いるこ

とが多い。

(6)予約語

予め決められた意味をもって使われる文字列が定まっている言語がある。これらはキ

ーワード(予約語、reserved word, key word)と呼ばれ、その他の用途には使えない。

(7)定数

数を表わす定数には、整数を表わすもの(コンピュータの内部表現的には固定小数点

数と呼ばれる)と実数を表わすもの(同じく、浮動小数点数と呼ばれる)があって区別さ

れるのが普通である。また、整数は、10進数、8進数、16進数が使えることが多い。

その他に、1文字を定数として扱ったり、文字の列を定数として扱うことができる。1

文字と文字列を区別するために、1文字は' 'で括り、文字列は" "で括って表わすことが

多い。

(8)プログラム

ほとんどのプログラム言語においてプログラムは、サブルーティンとか、関数とか、

手続きとか、クラスとか呼ばれるものを独立した基本的単位として構成され、そういった

ものを定義することがその言語でプログラムを書くことである。それらの中の1つをメイ

ンに指定しておくこと(C系言語の main 関数、FORTRAN などの主プログラム、Pascal の

手続き program、などがこれに当たる)により、プログラムはそこから実行が開始される。

例えば、「関数」を単位とする場合(C言語における例)、その定義は

関数の型 関数名(引数並び) ヘッダー

宣言 関数本体 関数の定義

文の並び

のように書く。まず、名前を付け(関数名)、その属性を宣言し(データ型など)、何を受

け取って処理を行なうかをパラメータとして指定する(パラメータのことを引数と呼ぶ)。

以上の部分をヘッダーと呼び、ヘッダーの後ろに関数の本体の定義(処理内容)を書く。

関数本体の定義の際には、その処理を行なうために作業用に使う変数などを宣言したりす

ることも必要になる。(1)~(7)で説明したものはこの関数本体を定義するときに使わ

Page 16: 情報数学III 2001年度後期 担当:守屋 · 2017. 10. 2. · アセンブリ言語といえども、人間にとってはまだ使いにくい。その主たる理由は、処理

16

れるものである。

こういった書き方は、サブルーティン、手続き、クラスなどもほとんど同じである。

(9)式と文

処理の記述は式と文による。式には、算術式(数式)、論理式(条件式)、文字列式な

どがあるが、どのような演算子があるかに依存して、言語によって大きく異なる。式は文

を記述するために使われる。

処理の順序を表すためには文(statement)を用いる。文には、変数などに値を設定する

ための代入文、条件を判定して分岐を起こすためのif文、繰り返し実行を記述するための

for文、while文、DO文など、実行順序を変更するためのgoto文、入出力を扱う文などがあ

るが、それらの種類、機能などは言語によって大きく異なる。

(10)変数、配列、それ以外のデータ構造

処理を記述するために使われる作業用のデータの入れ物として、変数(ハードウェア

に対応した基本的なデータを保持できるもの)や配列(array, 一群の変数に連続する番号

添え字として付けたもの)はたいていの高級言語で使える基本的なデータの入れ物である。

近代的な言語のほとんどは、変数や配列などについてそのデータ型(どのような値を取り

うるか等を決めたもの)をユーザが宣言するようになっている。これは、プログラムの誤

動作をできるだけ無くそうという趣旨から来ているが、型宣言をしなくてもデフォールト

で型が決まるようになっている言語もあり(FORTRAN, Perlなど)、ユーザが自分で新しい

型を定義できる言語もある(Pascalなど)。

(11)プログラム単位間の値の受け渡し

あるプログラム単位(関数、クラスなど)から別のプログラム単位に実データを渡し

て処理を下請けさせるとき、両者の間でデータをどのように渡すか(処理依頼時と、処理

終了後の処理結果返却時)は重要な問題であり、言語によって、方式が異なる。FORTRAN,

Algol等で用いられた方式とは別に、現在多くのプログラミング言語で用いられているデー

タ受け渡し(parameter passing)の方式には、値渡し(call by value)と番地渡し(call

by address)の2つの方式がある。前者は、呼び出し側の実データ(実引数という)の値

が、呼ばれて処理を依頼される側の対応する引数(仮引数という)にコピーされる方式で

ある。このとき、仮引数と実引数はメモリ上で異なる番地に割り当てられている。後者は、

実引数の番地が呼ばれたプログラム単位に渡され、実引数と仮引数が同じメモリ上の番地

を共有する方式である。この場合、計算結果を明示的に返さなくても、呼んだ側に値を渡

すことができる。

Page 17: 情報数学III 2001年度後期 担当:守屋 · 2017. 10. 2. · アセンブリ言語といえども、人間にとってはまだ使いにくい。その主たる理由は、処理

17

(12)名前の有効範囲

変数、配列、関数、クラスなどの名前は、プログラム全体の中のどの範囲で有効か、

どの程度有効かを宣言して区別することができることが多い。ある範囲(ブロックと呼ば

れる範囲など)の中だけで有効なものをその範囲内で局所的(local)であるという。それ

に対し、より広い範囲(プログラム全体など)で有効なものを大域的(global)であると

いう。

プログラムの書き方

良いプログラムの作り方・書き方に対する考え方には言語ごとにいろんな書法がある。

構造化プログラミングでは、プログラムとは単に目的の処理ができるものであればよいの

ではなく、処理手順をプログラムの外見的な形や内容的な構造の上からも反映するように

書かれるべきであると考える。例えば、C言語の場合、

main(){int m;scanf("%d",&m);printf("%d",m);}

と書くよりは

main()

{

int m;

scanf("%d", &m);

printf("%d", m);

}

と書いた方が視覚的にもプログラムの内容を理解しやすいし、2重のループがあった場合、

while (...) {

...

while (...) {

...

}

}

とインデント(段付け、字下げ:indentation)を行なうと、ループの構造が一目で分かる。そ

ういったことにより、プログラムの誤りが少なくなり誤りの発見が容易になるし、プログ

ラムのメインテナンスが容易になる(修正が容易)といったメリットがある。インデントの仕

方は人さまざまであり、どれが標準ということもないので、自分の好みにあったものを使

えばよい。例えば、

Page 18: 情報数学III 2001年度後期 担当:守屋 · 2017. 10. 2. · アセンブリ言語といえども、人間にとってはまだ使いにくい。その主たる理由は、処理

18

for (...) { for (...) for (...)

... { {

while (...) { ... ...

... while (...) while (...)

} { {

... ... ...

} } }

... ...

} }

などがよく用いられている。

5.アセンブラとコンパイラ・インタープリタ

人間にとってより分かりやすい言語(アセンブラ語や、BASIC, FORTRAN, C, Pascalなど

の汎用プログラミング言語)で書かれたプログラムは、コンピュータのハードウエアが直

接理解して実行できるプログラム(=機械語)に翻訳する必要があり、アセンブリ言語で

書かれたプログラムを機械語に翻訳するプログラムがアセンブラであり、汎用言語で書か

れたプログラムを機械語に翻訳するプログラムがコンパイラ(翻訳系)であることはすで

に述べた。コンパイラは実行前に前もって翻訳をすませるのに対し、実行時にプログラム

を 1行 1行逐一通訳するようなプログラムをインタープリタ(通訳系)という。これらを

総称して言語プロセッサという。

これらについては別の資料『アセンブラとコンパイラ・インタープリタ』を参照された

い。