多くの人はソフトウエアとプログラムの区別を気にしないので、その違いを明確に説明できる人は少ない。
プログラムというコトバは知っていても、その具体的なイメージまではなかなか分かりにくい。
ソフトウエア設計を理解するには、プログラムが本質的にどんなモノかという一般的な理解が重要になる。
本シリーズは設計と文書化をテーマとし、本記事ではプログラムの本質を概観できるように、その性質を解説する。
| ソフトウエア設計シリーズ「守」③ | プログラミング言語 | 松浦公政 | 2023年 | |
| 対象読者 |
コンピュータのプログラムと設計の関係に興味があるIT技術者・システムエンジニア | |||
| コンピュータのプログラムが実際にどんなものか興味がある方 | ||||
| コンピュータのプログラムに不具合が多い理由に興味があるIT技術者・システムエンジニア | ||||
記事の音声解説付き(下のプレイボタンで解説開始)
プログラムとプログラミング言語
本シリーズ “序”「ソフトウエアの設計とは」で示した関係式「ソフトウエア = 設計 + プログラム」は、「設計とプログラムを合わせてソフトウエア」になるとの意味になる。
式の右辺と左辺を入れ替えると、次のように表現できる。
| 設計 + プログラム ➡ ソフトウエア |
|---|
プログラムを行き当たりばったりに作ってもソフトウエアは期待通りには動かず、「何を」「どう作る」かを事前に考え(=設計す)る必要がある。
ソフトウエアを作るために、設計とプログラムは、次のように役割分担する。
| 設計 | プログラムを作る上での「作戦」 |
|---|---|
| プログラム | 設計された作戦に従った「具体的な行動」 |
「コンピュータ」(計算機)は、作ったプログラム通りにしか動かない気が利かない機械。
| コンピュータを動かす(操作する)には、コンピュータが理解できるよう気を遣い、噛んで含めるように命令する必要がある。 |
| そして ⇩ |
| 「噛んで含める命令」を一続きにまとめると「プログラム」になる。 |
| 面倒だが ⇩ |
| プログラムは「プログラミング言語」というコンピュータが理解するコトバを使って表す。 |
プログラミング言語の文法
言語には文法と呼ぶ決まり事がある。
| プログラミング言語は「言語」の一種なので、日本語や英語などと同様に文法がある。 | ➡ | コンピュータを思い通りに動かすには、プログラミング言語の文法を知る必要がある。 |
文法は相手と意思疎通する際の共通ルールで、言語ごとに異なる。どの言語であれ、文法の構成要素は次の三つに集約される。
| 文法の構成要素 |
記号 | 文字 |
|---|---|---|
| 単語 | ||
| 記号を並べる順序 | ||
人間とコンピュータとがやり取りするプログラミング言語を区別するために、人間同士が対話する言語は「自然言語」と呼ばれる。
文法の構成要素は、自然言語である日本語や英語を例にとると、次のイメージになる。
| 文法の構成要素 |
自然言語 | ||
| 日本語 | 英語 | ||
| 記号 |
文字 | ひらがな、カタカナ、漢字、数字など | アルファベット、単語を区切る空白文字、数字など |
|---|---|---|---|
| 単語 | 数個の文字を繋げて作る:「好きだ」など | 数個の文字を繋げて作る:「love」など | |
| 記号を並べる順序 | 「わたし」(主語)➡「は」(助詞)➡「あなた」(目的語)➡「を」(助詞)➡「好きだ」(動詞) のように記号の順序に規則がある。 | 「I」(主語)➡「love」(動詞)➡「you」(目的語) のように記号の順序に規則がある。 | |
プログラミング言語は、計算機を操作する「言語」なので、日本語や英語などと同様に「文法」を持つ。
プログラミング言語の文法というと難しそうに見えるが、実は多くの人がプログラミング言語を使って機械(計算機)を操作した経験を持つ。
身近にある計算機の「電卓」の操作にも実はプログラミング言語が必要で、ほとんどの人がプログラミング言語と意識せずに電卓を操作している。
プログラミング言語の文法が何かの理解を進めるため、まず電卓の操作で使うプログラミング言語を文法の構成要素に当てはめてみる。
| 電卓のプログラミング言語の文法 | |||
|---|---|---|---|
| 記号 | 文字 | 「5」や「3」などの数字ボタン、「+」「×」などの演算ボタン、「=」の計算開始ボタンなど、ボタンの上に刻印されている記号で構成される。 | |
| 単語 | 単語=文字 の関係。 | ||
![]() 【画像出展】イラストAC |
たとえば左図のような単純な電卓だと、プログラミング言語を構成する要素数は、キーの数の14個になる。 | ||
| 記号を並べる順序 | 「5」 ➡ 「+」 ➡ 「3」 ➡ 「=」 の順に押すと電卓が計算を始め、計算結果を液晶窓に表示する(この場合は「8」を液晶表示する) のように記号の順序に規則がある。 | ||
| (「5」➡「=」➡「3」➡「+」の順序に押しても正しい計算結果は表示されない)。 | |||
電卓のプログラミング言語の理解とは ⇩
| 電卓を使うには、ボタンに刻印された記号の意味と、ボタンを押す順序がもたらす効果(「5」➡「=」➡「3」➡「+」の順序に押しても正しい計算結果は表示されないという知識)を理解する必要がある。 |
| 多くの人が電卓を使える理由は ⇩ |
|
電卓を使うプログラミング言語の文法は、小学校の算数で習う「数式」と同レベルで、四則演算(足し算・引き算・掛け算・割り算)を理解していれば難しくない。 |
プログラムが利用者にもたらす利便性
| 電卓は、算数の暗算や筆算などを、脳内で計算処理しなくてもボタンを押せば代行してくれる便利な機械。 |
| ただし ⇩ |
| その用途は「脳内で実行する計算の代行」に限定されている。 |
これに対し ⇩
| スマートフォンやパソコンは、「動画を見る」「文書を作る」「メールを送る」など、様々な用途で使える。 |
| もし ⇩ |
| スマートフォンで出来る様々な処理を、電卓同様にボタンで命令を入力しようとしたら、用意するボタンの種類と数が爆発的に増えてしまい、実用性がない。 |
そこで ⇩
| 画面に表示する少数のボタンをクリック(・タップ・ドラッグなど)すれば、スマートフォンやパソコンを専門知識がなくても手軽に使えるように製造元が、あらかじめスマートフォンやパソコンにプログラミング言語を使って噛んで含めるような指示を与えている。 | ||
| 指示の内容 | スマートフォンの小さな画面に仮想的なボタンを表示せよ。 どれかの仮想ボタンをタッチするとそのボタンに応じた別の画面を表示せよ。 |
|
| この操作で、あたかも画面が切り替わるように見えるが、実は演出である。 現実は(一つしかないスマートフォンの小さな画面を、まるでホワイトボードを白板消しで消すように)画面に映っている画像をいちど消し、別の画面の画像(ボタン・図柄・文字など)をあらためて表示し直している。 |
||
製造の過程でこういう指示を組み込む意味は ⇩
| この仕組みが、利用者がプログラミング言語を一切理解せずともスマートフォンを使いこなすための考慮だ。 |
|
| 使い勝手を向上して、より多く販売するための企業努力でもある。 | |
なお ⇩
| 上述のプログラムは「アプリケーション(応用)・プログラム」と呼び、慣習的に「アプリ」と短縮する。 |
||
| 21世紀初頭に利用者が多いアプリ例 | YouTube(Google)、Excel(Microsoft)など | |
ソフトウエア開発で使うプログラミング言語
噛んで含めるような指示を作る作業は、面倒なことに辛抱強く取り組めるメンタリティが必要な特殊技能で、専門的な訓練で技能を習得した「プログラム製作の専門家」(=プログラマ)が作る。
| 区分 | 機械を動かすために使う言語 |
|---|---|
| プログラマ | プログラミング言語 |
| 利用者 | アプリごとに独自に決めた「操作方法」(アプリのメーカが仕様を決める) |
プログラマが使うプログラミング言語は、電卓のプログラミング言語と比べると複雑で高度になるが、それでも英語などの外国語と比較して、単語は少なく、文法もシンプルだ ⇩
| 高度なプログラミング言語の文法 | ||
|---|---|---|
| 記号 | 文字 | アルファベット、数字など。 |
| 単語 | 数個の文字を繋げて作る「move」「compare」「add」などの英単語風の単語、コンピュータ内部のメモリ(記憶装置)を示す単語、単語を区切る空白文字 などの記号で構成される。 | |
| 記号を並べる順序 | 記号を規則的に並べて意味の単位(=機械への命令語)とする。 | |
| コンピュータへの命令語のイメージ例 | メモリにあるデータを計算装置内に取り込め。 |
|---|
命令語は、単語数が少ない上に、単純な動作しかできないので、ユーザから見たら1文で表せる(例:設定した時刻になったらブザーを鳴らす)程度の簡単な機能の実現すら9個の命令語を段取りを決めて正確に記述する必要がある。
| 命令語を羅列したプログラムのイメージ | ||
|---|---|---|
| 実行順序 | 命令語 | 命令語の意味・説明 |
| ① | move.a Current_Time | 「現在時刻」と名付けておいたメモリのデータを計算装置内に取り込め。 |
| ② | move.b Setting_Time | 「設定時刻」と名付けておいたメモリのデータを計算装置内に取り込め。 |
| ③ | cmp.f a,b | 計算装置内に取り込んだ二つのデータを比較せよ。 |
| ④ | if( f != 0 ) { | もし比較した二つのデータが同じ値でなかったら、 |
| ⑤ |
goto ①
|
①へ戻って設定時刻が来るか再確認しろ。 |
| ⑥ | } else { | もし比較した二つのデータが同じ値なら、 |
| ⑦ | move #0_5sec, BeepSecond | ブザーを鳴らす時間を指定するメモリに「0.5秒」を格納しろ。 |
| ⑧ | move #ON,SoundBeep | ブザー鳴動を開始を指示するメモリに「鳴動開始」を格納しろ。 |
| ⑨ | } return | 処理終了。 |
| ⇧ | ||
| 「設定した時刻になったらブザーを鳴らす」だけでも、コンピュータは、これだけの粒度(細かさ)での段取りを示すように、命令の羅列を求められる。 | ||
この結果 ⇩
| 段取りは、「この場合どうする」「あの場合どうする」のように様々な状況を想定し「考え」て決めないと、不意の状況が起きた時に不具合になる。 |
| 比較項目 | コンピュータが理解できる命令語 | 人間のコトバ(自然言語) |
|---|---|---|
| 単語の種類数 | 数十 | 数十万 |
| 意図を表現するのに必要な単語数 | 数十~数百万語 | 数語~数十語 |
| 文章の長さ | 単語の種類が少ない上に単純な単語のみのため、膨大な規模になる。 | 複雑な単語が豊富にあるため、比較的小さな規模になる。 |
この結果、現実に存在するプログラムの規模は大きい ⇩
| プログラムの規模は、1行に1命令語を記載すると仮定して「行数」で表す慣例ができている。 |
|
| 21世紀初頭に稼働しているプログラムは、数百万の命令語を連ねた巨大な製品が少なくない。 |
|
| スマートフォンを動かすプログラムの「Android」は1600万行らしい。(【出展】日本Androidの会 SDKワーキンググループ) | 原稿用紙の1行に1個の命令語を書くなら、1600万個の命令語は400字詰原稿用紙80万枚が必要で、0.09㎜/枚の紙を平積みすると72㎝の高さになる。 |
プログラムが持つ性質・特徴のまとめ
| プログラムは、コンピュータという機械をコンピュータが理解できるプログラミング言語を使って思いのままにコントロールする手段。 |
| プログラムは、プログラミング言語が持つ命令語を書き連ね文章を書くように作る。 |
| プログラミング言語の命令語は低機能なので、自然言語(日本語など)では短文で済む内容も、命令語をたくさん組み合わせたプログラムにならざるを得ない。 |
| 何万枚の原稿用紙に渡る巨大な文章の中に、間違い・誤記・矛盾を一切なくすのが困難なように、何百万行ものプログラムに含まれる間違いを完全に取り除くのは現実的でない。 |
このため ⇩
巨大で複雑なプログラムを作るには、綿密な作戦を立てて取り組む必要がある。
次回は、プログラムに与える作戦となる「プログラム設計の誤解」を解説します。
ソフトウエア設計シリーズの目次はこちらへ



コメント