浜村拓夫(・∀・)作品集

頭の中にあるイメージを表現できるデザイン力が欲しいです(><)

プログラミングの基本 その1「構造化プログラミング」

プログラミングを独学で勉強すると、知識に偏りが生じますね?

穴を埋めるには、情報処理試験の教科書を参考にして、広く浅く学ぶという手もあります。

(=大学等で使うコンピューターサイエンスの教科書のダイジェスト版みたいなもの)

 

 

【改訂版】 要点早わかり 応用情報技術者 ポケット攻略本 (情報処理技術者試験)

【改訂版】 要点早わかり 応用情報技術者 ポケット攻略本 (情報処理技術者試験)

 

 

さらに内容を絞り込んで、プログラミングに関する知識の要点をメモ。

・ハードウェアの仕組み

・ソフトウェアの仕組み

 

●コンピューターとは?

コンピューターは、日本語で言うと「電子計算機」のことです。

コンピュータとは|電子計算機|電算機 - IT用語辞典

コンピュータとは、与えられた手順に従って複雑な計算を自動的に行う機械。特に、電子回路などを用いてデジタルデータの入出力、演算、変換などを連続的に行うことができ、詳細な処理手順を人間などが記述して与えることで、様々な用途に用いることができる電気機械のこと。

 

●CPUとは?

コンピューターで、計算を行う部品は、「CPU」(中央処理装置)という部品です。

CPUとは|中央処理装置|Central Processing Unit - IT用語辞典

CPUとは、コンピュータを構成する部品の一つで、各装置の制御やデータの計算・加工を行う装置。メモリに記憶されたプログラムを実行する装置で、入力装置や記憶装置からデータを受け取り、演算・加工した上で、出力装置や記憶装置に出力する。

 

CPUは、電気のオンとオフで動く「論理回路」という仕組みで作られています。

論理回路 - Wikipedia

論理回路(logic circuit)は論理演算を行う電気回路及び電子回路である。真理値の「真」と「偽」、あるいは二進法の「0」と「1」を、電圧の正負や高低、電流の方向や多少、位相の差異、パルスなどの時間の長短、などで表現し、論理素子などで論理演算を実装する。基本的な演算を実装する論理ゲートがあり、それらを組み合わせて複雑な動作をする回路を構成する。

 

論理演算 - Wikipedia

論理演算(logical operation)あるいはブール演算(boolean operation)とは、「真」と「偽」の二つの元(真理値と呼ばれる)だけを持つ集合における演算である。(これらの演算によって上記の集合は環となり、ブール環と呼ばれる)
否定(NOT)・論理和(OR)・論理積(AND)・排他的論理和(XOR)・含意・同値などがある。
数理論理学やプログラミング言語などで使われる。プログラミング言語では通常の論理演算のほか、数値のビット毎に論理演算を行なう演算があり、これは特にビット演算という。

 

電気のオンとオフを表現するスイッチは、「リレー」や「トランジスタ」という電子部品で作ることができます。

CPUは、トランジスタを改良して、たくさん詰め込んだ電子部品です。

昔は、リレーやトランジスタを使ってコンピューター(電子計算機)を作ってました。

 

・リレー式計算機

www.fujitsu.com

 

リレー式コンピュータでは、リレー(電磁石を使ったスイッチ)の接点に電流が流れるか流れないかを電気回路のON/OFFに当てはめ、計算を行っています。
リレーは金属の接点が物理的に接合するため、計算に大きな音が発生します。その音があまりにも大きいため、当時は夜間11時以降の稼動は禁止されました。

 

f:id:hamamuratakuo:20160904112516j:plain

 

f:id:hamamuratakuo:20160904112525j:plain

 

オムロン(OMRON) G5V-1 DC3 マイクロリレー NN

オムロン(OMRON) G5V-1 DC3 マイクロリレー NN

 

 

トランジスタ式計算機

gigazine.net

 

コンピュータの進化は半導体の進化であり、それは集積回路(IC)の集積密度の高まりでもあるわけですが、そのコンピュータの進化の流れに逆行するかのように、ICを一切使わないでトランジスタだけで作られた自作コンピュータが「FullTr-11」です。

 

 

SODIAL(R)2N3904スルーホールNPNバイポーラトランジスタ50個

SODIAL(R)2N3904スルーホールNPNバイポーラトランジスタ50個

 

 

 

ぶっちゃけ、CPUは1と0の足し算と引き算をやってるだけです。

→これ重要!!!

 

(正確には、「論理演算」や「ビット演算」という計算をやっています。)

コンピューターのCPUは、単純な計算しかできないけど、超高速で計算できるので、うまく使えば、いろんな処理を実行できるんです。

 

図解入門よくわかるCPUの基本と仕組み (How‐nual Visual Guide Book)

図解入門よくわかるCPUの基本と仕組み (How‐nual Visual Guide Book)

 

 

●プログラミングの本質は超簡単!

コンピューターの正体は、とても簡単な計算しかやってない=誰でも分かるもの、ということを理解しておきましょう。

なので、プログラミングは本質的に難しいものではなく、簡単なものだと心得て下さい。

プログラミングを難しいものだと勘違いして恐れる必要はありません。

(難しいんじゃなくて、面倒くさいだけ!?笑)

 

●プログラミングとは?

プログラミング (コンピュータ) - Wikipedia

プログラミング(programming)とは、プログラムを作成することにより、人間の意図した処理を行うようにコンピュータに指示を与える行為である。

 

プログラム (コンピュータ) - Wikipedia

コンピュータプログラム(computer programs)とは、コンピュータに対する命令(処理)を記述したものである。

 

例えて言えば、プログラムは「おつかいのメモ」みたいなもんですね。

(例)今日のおつかいメモ

(1) ヨークマートに行く。

(2) 入口でカゴを持つ。

(3) 1リットルの牛乳を1本カゴに入れる。

(4) 8枚切の食パンを1斤カゴに入れる。

(5) 1名様1パック限定の特売品の卵があったら1パックカゴに入れる。(特売品の卵がなかったら入れない)

(6) レジに行ってお金を払う。

(7) 特売品の卵がまだ残っていたら、もう1回レジに並んで買う。

 

特売品を買うために、レジに2回並ぶとかしませんか?\(せこいw)/

…それはさておき、

 

この「おつかいメモ」には、人間への指示(命令)が書かれています。

コンピューターに対する命令を書いたものを「プログラム」と言い、

プログラムを書く(作る)ことを「プログラミング」と言います。

 

プログラムを書くための言葉を「プログラミング言語」と言います。

 

●データと処理

プログラムは、

・データ

・処理(計算)

という2つの構成要素から成り立っています。

プログラム → 「データ」+「処理」

この仕組みは、どんなプログラムでも変わりません。→これ重要!!!

 

「データ」しかないプログラムとか、「処理」しかないプログラムを作っても、何も起こらないので、無意味でしょう?

 

●入力と出力

データと処理の関係は、

(1)データの入力 → (2)処理 → (3)データの出力

という関係になっています。

 

例えで言えば、製麺機のような仕組みです。

 

 

パスタマシンで麺道楽―うどん、中華麺、韓国風冷麺、もちろんパスタ!

パスタマシンで麺道楽―うどん、中華麺、韓国風冷麺、もちろんパスタ!

 

 

f:id:hamamuratakuo:20151121110052p:plain

 

プログラムの最小単位は、「入力→処理→出力」となっており、

基本的には必ず入口と出口があるということを覚えておきましょう。

 

・入口と出口をつなぐと、無限ループを作ることもできます。

・出口に、何も出さない(void)というパターンもあります。

 

●プログラミング・パラダイム

この「データ」や「処理」を扱いやすくしようとして、いろんな人がいろんな方法を工夫してきました。

データや処理を扱う「考え方」「方法」のことをプログラミング・パラダイムと言います。

 

パラダイム(ぱらだいむ)とは - コトバンク

方法論のこと。パソコン用語では、プログラミングにおける開発チームの中での共通の思考パターンを指す。

 

プログラミングパラダイム - Wikipedia

プログラミングパラダイムは、プログラマプログラムの見方を与えるものと言える。たとえば、オブジェクト指向プログラミングにおいて、プログラムとはオブジェクトをつくりそれを管理するものである。関数型プログラミングにおいては、状態を持たない関数の評価の連続である。

多くのプログラミングパラダイムでは、「やってはいけないこと」(禁じ手)が存在する。たとえば純粋な関数型プログラミングでは、副作用があってはならず、構造化プログラミングではgotoの無制限な利用は戒められる。

こうした特定のテクニックを避けるということで、プログラミング言語の一般的な法則に制約されることなく、プログラムの正確さ(あるいは単にその動作を理解すること)についての法則を証明しやすくする。

 

いろんな工夫を積み重ねて、いろんなプログラムの作り方(プログラミング・パラダイム)が提案されてきました。

 

主なパラダイムに、命令型宣言型などがあります。

 

命令型プログラミング - Wikipedia

計算をプログラム状態を変化させる文の列で記述するプログラミングパラダイムの一種。

自然言語の命令法がなすべき行動への指令を表現するのとよく似た方法で、命令型プログラムはコンピュータが実行すべき命令列で構成される。

 

宣言型プログラミング - Wikipedia

処理方法ではなく対象の性質などを宣言することでプログラミングするパラダイムを意味する。

ある出力を得るにあたってそれを作成する方法ではなく、出力の性質を記述することを「宣言型」と称する。

 

こんな辞書的な説明だと、何言ってんだか?よく分かりませんねw><

具体的なプログラミング言語を挙げて、例を見てみましょう。

 

プログラミング言語の種類

プログラミング言語の種類は、(分類方法にもよりますが)ざっくりと4種類あります。

(参考)「日経ソフトウエア」2008年3月号(p.55)

分類 基礎となる計算モデル 事例
手続き型言語 チューリングマシン C, Java
問い合わせ言語 (非手続き型言語 関係モデル SQL
関数型言語 ラムダ計算 Lisp, Haskell
論理型言語 一階述語言語 Prolog

 

(1) 手続き型言語: C、JavaPHPRubyPython

(2) 問い合わせ言語: SQL

(3) 関数型言語: LispHaskell、Elixer

(4) 論理型言語: Prolog

などがあります。

 

・命令型プログラミング → (1) 手続き型

・宣言型プログラミング → (2) 問合せ型、(3) 関数型、(4) 論理型

 

普段よく使うのは、手続き型言語が多いですね。

データベースを操作するときは、問い合わせ言語のSQLもよく使います。

 

手続き型言語の代わりに、たまに関数型言語を使う場合もあります。

(→関数型の参照透過性を利用すると、テストが簡単になるから?)

 

●構造化プログラミング

手続き型言語を細分化すると、さらにいろんなやり方(パラダイム)があります。

 

・構造化プログラミング

オブジェクト指向プログラミング

など。

 

構造化プログラミングは、手続き型言語の中で、最も基本的なやり方です。

 

とりあえず、構造化プログラミングの仕組みを理解すれば、すぐにプログラムが作れるようになると思います!→これ重要!!!

 

構造化プログラミングは、基本的な動作原理が3個だけなので、使い方は簡単です。 

構造化プログラミング - Wikipedia

構造化プログラミング(structured programming)とは、1960年代後半にエドガー・ダイクストラらによって提唱された仮想機械モデルに基づく段階的詳細化法を用いたプログラミングのことを言う。

 

三つの構造化文

順次

 順接、順構造とも言われる。プログラムに記された順に、逐次処理を行なっていく。

反復

 一定の条件が満たされている間処理を繰り返す。

分岐

 ある条件が成立するなら処理Aを、そうでなければ処理Bを行なう。

 

状態遷移表による設計手法(5):状態遷移表からの実装 (3/3) - MONOist

構造化プログラミングは、階層的に抽象化されたプログラムの組み合わせとして、プログラムを記述する手法であり、「順次」「選択」「反復」の3種類の制御構造のみを用いてプログラミングを行います。

構造化プログラミングの目的は、品質の良いプログラミング構造を実現することであり、無条件に、指定されたラベルや行番号にジャンプ(跳ぶ)するGOTO文を使用しません。GOTO文を使用すると、動作するシーケンスが複雑になるため、動作品質の保証が困難となります。

 

f:id:hamamuratakuo:20151121115235j:plain

 

プログラムの最小単位である「入力→処理→出力」をパーツのように並べていくと、いろんな処理ができます。

その並べ方には、「順次」「繰り返し」「条件分岐」の3種類があるよ、という話でした。 

 

フローチャート図(流れ図)

構造化プログラミングでは、処理の並べ方を図に書いて、プログラムの設計図にします。

この図を「フローチャート図」(流れ図)と言います。

フローチャート - Wikipedia

フローチャート (flowchart) は流れ図または流れ作業図のことで、各ステップを様々な形の箱で表し、それらの間を実線または矢印で繋いで流れを表すことで、アルゴリズムやプロセスを表現する。

この図式的知識表現で、与えられた問題の段階的解法を示せる。

データフロー図と対比すると、フローチャートでは一般にデータの流れを表すことはなく、操作を順に示すことでデータの流れを暗示する。

フローチャートは様々な分野の工程の解析・設計・文書化・管理に用いられる。

 

FLOWCHART

f:id:hamamuratakuo:20151121122428p:plain

 

フローチャートを紙に書く場合、箱を書くための定規があります。

ステッドラー コンピュータ定規  976 06

ステッドラー コンピュータ定規 976 06

 

 

上記の「おつかいメモ」も、フローチャート図にできますね!

 

●プログラミングの練習

プログラミングを練習する場合、作りたいものが決まっていれば、それに合ったプログラミング言語を選んで使えばOKです。

 

(例)

・Webサイト → PHPSQLなどを使って作成。

iPhoneアプリ → Objective-C、Swiftなどを使って作成。

Androidアプリ → Javaなどを使って作成。

Windowsアプリ → C#などを使って作成。

 

作りたいものが特に決まっていない場合、簡単ですぐに使えるプログラミング言語として、「JavaScript」をおすすめします。

JavaScriptは、ブラウザーテキストエディターの2つがあれば、すぐに作れます。

=だいたい、どのパソコンにもこの2つは入ってますね?

 

3ステップでしっかり学ぶ JavaScript入門 (今すぐ使えるかんたんプラス)

3ステップでしっかり学ぶ JavaScript入門 (今すぐ使えるかんたんプラス)

 

 

こういうプログラミングの話を、図やアニメにして教材を作ってみたいです。

(・∀・)

 

 

【追記】2017年1月2日

プログラミングの仕組みや歴史、パラダイム(方法論)について、よくまとまっている本があったので、追記しておきます。参考にどうぞ!

 

コーディングを支える技術 ~成り立ちから学ぶプログラミング作法 (WEB+DB PRESS plus)

コーディングを支える技術 ~成り立ちから学ぶプログラミング作法 (WEB+DB PRESS plus)

 

 

・著者のサイト → 西尾泰和のはてなダイアリー

 

 

・著者のサイト → Strategic Choice