第1回:イントロダクション

機械工学と情報処理

この講義では,コンピュータのプログラムを作成する方法について学習します.

機械工学科の学生の皆さんの中には,自分は機械の勉強をしに来たのであって,コンピュータや電気や,ソフトウェアについて学びに来たのではないと考える諸君もいるでしょう. しかしながら,現代では電子化されていない・コンピュータによる制御が行われてない「純粋な機械」を探すほうが難しいのが現状です.

例えば,自動車では従来型のガソリンエンジンによる車でさえ,少なくとも20個以上のコンピュータにより制御されており,それ以外にもあらゆる電化製品,デジタルガジェット類は言うまでも無いでしょう.

例えば,最近話題の自動運転車(Self-driving car)は,いまや世界中の自動社会社,IT企業,大学などで盛んに研究されており,一部実用化されています. この自動運転車は,カメラやレーザセンサの情報から,自分のいる場所,走行中のレーン,信号はどこにあり,何色か? さらには周りにいる他の自動車,バイク,自転車,歩行者,乳母車などを見分けて必要であれば停止したり,車線変更をしたり,相手に譲ったりなどが出来なければなりません.

この様なことのほぼすべては,自動車に搭載された組み込みコンピュータ(embedded computer)で 処理されます(注1)(注2). 正確には,その「処理」を行うのはコンピュータに内蔵されたソフトウェアです. このようなソフトウエアは,多くの場合C言語,またはその拡張版であるC++(シープラスプラス)言語を使って書かれています.
そしてこれらの多くが,機械をよく知るエンジニアによって作られています. 機械を制御するには,電気系や情報系の人よりも機械系の人のほうが,実際の機構,メカニクスの動きが良くわかるため,強みとなっています.

【注1】 最近は,処理の多くをネットワーク上のコンピュータ「クラウド」で行うケースも増えています. が,ネットワークが切れてしまったら処理出来ません. また自動運転車は瞬間的な判断が必要なので, その処理の殆どは搭載コンピュータ内で処理されます.
【注2】 embedded computerにはそれぞれ適材適所のものが使われます. 通常は電力効率の良いARMプロセッサ等が用いられます. 最近の携帯電話(Android, iPhone/iPad等)に用いられているものもほぼ同じものです.


https://www.youtube.com/embed/7Yd9Ij0INX0
グーグルの自動運転車


https://www.youtube.com/embed/4Y7zG48uHRo
自動運転車を滑らかに走らせるための制御方法


プログラミングを取り巻く環境

最近目にした幾つかの話題.

理学・工学の分野のみならず,「プログラミング」はもはや情報系だけの技術ではなく,より汎用性の高い「基礎教養」となっている.
また,入学試験においても情報科目が新しく設置されるなど,現代社会において「プログラミング」は重要な役割を果たしていることが明白です.

一般にコンピュータのプログラミングでは「プログラム言語」を用いるが,その言語には非常に多くの種類があります. ざっと挙げただけでも,BASIC, FORTRAN, COBOL, Pascal, C, C++, C#, Java, Javascript, Python, Swift 等があります.

それぞれの言語にはそれぞれ一長一短があるため,これだけ多くの言語が存在しているわけですが, これらの中で,C言語は歴史的にみても最も多くのプログラマが存在し,多くのアプリケーションを生み出し, その他の言語に対して大きな影響を及ぼしてきたのは間違いないでしょう.
すなわち最も基本的で,重要だと思われる言語はC言語(と,その派生言語のC++言語),と言えるでしょう(注3).

【注3】 先のグーグルの自動運転車の制御プログラムも,C++言語で書かれています.

C言語は1973年にAT&Tベル研究所の(Dennis M. Ritchie) が中心となって作ったプログラミング言語です. 同研究所の Ken Thompson が開発したB言語(BCPL)を改良して作られました.
また,その後Stroustrupによって,現実世界の複雑さをコンピュータ言語によってモデル化する有力な手段の一つである,オブジェクト指向の要素を取り込んだC++言語が開発されました. C/C++言語を身につけておけば,他のプログラミング言語を学ぶ際にも応用することができます.

プログラムの種類

機械語

現代のコンピュータは,ディジタル・コンピュータと呼ばれます.(昔はアナログコンピュータが存在した.)
ここで,ディジタル(digital)とは2値という意味です. 2値はバイナリ(binary)とも呼ばれます. すなわち,コンピュータは,2値(2進数)しか理解しません.
具体的にいうと,コンピュータのハードウエアであるディジタル電気回路では,電圧が高いか,低いかを区別しています.

2進数では0または1の値を取ります. 我々が使い慣れた10進数では,一桁あたり 0~9 までの10種類の値を取るのと同じで,2進数の場合は 0 から 1 までの2値を取るのです. コンピュータでは,一つ一つのトランジスタをスイッチとして用い,スイッチOFFを0,ONを1として表しています.逆の場合もあります.(正論理,負論理と言います)

このようにON/OFFを1/0で表す一つの要素をビット(bit = binary digit)と呼び, 8個のビット= 8 bit を集めて 1 セットとしたものを バイト( 1 byte)と呼ぶ. これらはまた後で詳しく学習します.

ともかく,コンピュータはこのON/OFFで動いているため,1/0の2値しか理解しないのです. プログラムも最終的には1/0の組み合わせである必要があります. これを機械語またはマシン語という.

機械語(マシン語)の例.もちろん理解できなくてもよい?

00:0000 4D 5A 90 00 03 00 00 00-04 00 00 00 FF FF 00 00  MZ.............. 
00:0010 B8 00 00 00 00 00 00 00-40 00 00 00 00 00 00 00  ........@....... 
00:0020 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................ 
00:0030 00 00 00 00 00 00 00 00-00 00 00 00 F8 00 00 00  ................ 
00:0040 0E 1F BA 0E 00 B4 09 CD-21 B8 01 4C CD 21 54 68  ........!..L.!Th 
00:0050 69 73 20 70 72 6F 67 72-61 6D 20 63 61 6E 6E 6F  is program canno 
00:0060 74 20 62 65 20 72 75 6E-20 69 6E 20 44 4F 53 20  t be run in DOS  
00:0070 6D 6F 64 65 2E 0D 0D 0A-24 00 00 00 00 00 00 00  mode....$....... 
00:0080 61 8B 74 A9 25 EA 1A FA-25 EA 1A FA 25 EA 1A FA  a.t.%...%...%... 
00:0090 91 76 EB FA 21 EA 1A FA-91 76 E9 FA 52 EA 1A FA  .v..!....v..R... 
00:00A0 91 76 E8 FA 28 EA 1A FA-F8 15 D1 FA 26 EA 1A FA  .v..(.......&... 
00:00B0 25 EA 1B FA 70 EA 1A FA-1E B4 19 FB 22 EA 1A FA  %...p......."... 
00:00C0 1E B4 1F FB 39 EA 1A FA-1E B4 1E FB 37 EA 1A FA  ....9.......7... 
00:00D0 B2 B4 1F FB 24 EA 1A FA-B2 B4 18 FB 24 EA 1A FA  ....$.......$... 
00:00E0 52 69 63 68 25 EA 1A FA-00 00 00 00 00 00 00 00  Rich%........... 
00:00F0 00 00 00 00 00 00 00 00-50 45 00 00 64 86 06 00  ........PE..d... 
00:0100 09 BF CB 5A 00 00 00 00-00 00 00                 ...Z.......      

この数字の羅列では人間に非常にわかりにくいため,計算機にとって意味のある数バイト分の 1/0 の組み合わせ(加算や減算)を,文字に置き換えた「アセンブリ言語」が発明された.

アセンブリ言語は,その名の "Assenbly" が示す通り,機械語の意味を持つひとかたまりの部品に名前(ニーモニックという)をつけ,これらの部品を組立てて行くように作成できるようにしたものである. 例えば,加算がadd, 減算はsub, データの移動はmovなどである.
これは0/1の並びである機械語よりも圧倒的にわかりやすく,かつ機械語を直接触っているのと変わらないため,非常に細かい作業が行える反面,大規模なプログラムを書くためには困難が伴う.

アセンブリ言語の例.まだわかりにくい...?

main	PROC
; Line 4
$LN3:
	sub	rsp, 56					; 00000038H
; Line 5
	mov	DWORD PTR i$[rsp], 10
	mov	DWORD PTR j$[rsp], 100			; 00000064H
; Line 6
	mov	eax, DWORD PTR i$[rsp]
	imul	eax, DWORD PTR j$[rsp]
	mov	DWORD PTR k$[rsp], eax
; Line 8
	mov	r9d, DWORD PTR k$[rsp]
	mov	r8d, DWORD PTR j$[rsp]
	mov	edx, DWORD PTR i$[rsp]
	lea	rcx, OFFSET FLAT:$SG4870
	call	printf
; Line 10
	xor	eax, eax
; Line 11
	add	rsp, 56					; 00000038H
	ret	0
main	ENDP

高級言語 - インタプリタとコンパイラ

そこに登場したのが「高級言語」と呼ばれるものである.

高級言語は,機械語のようにコンピュータに直接命令を記述することはできないが,人間にとって読みやすく, 大規模なプログラムを書いたり誤りの少ないプログラムを書くことができるものであった. それを可能にしたのは,機械語を直接書くやり方ではなく,人間にとって読みやすい「ソースコード」を書きそれを機械語に変換する方式(コンパイラ,インタプリタ)が確立されたおかげである.

C言語の例.かなりわかりやすくなった!?

#include <stdio.h>

int main(void)
{
    int i=10,j=100;
    int k = i*j;

    printf("%d %d %d", i, j, k);

    return 0;
}

ソースコードを一行ごとに機械語に変換しては実行する方式=インタプリタでは,ソースコードを一行ごとに機械語に変換(翻訳=interpret)するので,実行時の間違いがわかりやすくて学習には向いていた. 具体的には,BasicやPythonが有名です,

インタプリタ方式は,毎回機械語に変換しながら実行するので,実行速度が遅いという問題があった. これを解決するために,プログラムのソースコードをあらかじめすべて機械語に変換する方式=コンパイル方式ができた. FORTRAN,COBOL, Ada, Pascal, C,C++, Objective-C言語などの多くの言語はコンパイル方式を採用している.

コンパイル方式のメリットは,速度だけではなく秘匿性にもある. 最初にプログラムを機械語にすべて変換してしまうため,ソースコードを公開する必要がないためです. このため,商用アプリケーションのほとんどはコンパイル方式の言語で開発されている.

一方で,最近では Web 系開発言語や機械学習の分野ではその性格上,インタプリタ方式の採用が多く,Java, Javascript, Go, Perl,Python言語などがその代表である. インタプリタ方式の問題であった実行速度も,JIT(Just-In-Time)コンパイル技術など,実行直前に自動でコンパイルしてしまうような技術が開発されてかなりも改善されてきている. 【注4】 携帯電話の Android のプログラムはJavaで書かれている. iPhone/iPadは,Objective Cという,Cの派生言語で書かれていたが,最近ではSwiftという言語に切り替わったなど,プログラミング言語のはやりすたりの周期は比較的短いが,その中にあってC言語は非常に寿命の長いプログラミング言語といえる.

実習その1

プログラミングの基礎では,スマホのようなたちスクリーンではなく,(物理的な)キーボードを沢山,叩くことになる.
そのため,なるべく早くキーボードに慣れてしまおう.

早速,タイピングの練習をしてみよう.
https://www.e-typing.ne.jp/roma/check

これ以外にも,タイピングの練習にはいろいろなソフトウエアやWebサイトがあるので,自分で探して練習しよう.

開発環境のセットアップ

ここを参照して, 各自でUSBメモリを準備して,ポータブルな開発環境(エディタとコンパイラ)をセットアップしよう.(宿題,必須!)