【注意】 本講義では,Oh-o! meijiを利用した課題の提出を行います. Oh-o! Meijiの本格的な利用開始は,履修登録後になりますが, 仮登録をすると利用できるようになります.
【注意】 これから本格的なコンピュータ・プログラミングを始めますので, 各自【自宅のパソコンへの開発環境の導入】 をしましょう.
この講義では,コンピュータのプログラムを作成する方法について学習します. 機械工学科の学生の皆さんの中には,自分は機械の勉強をしに来たのであって, コンピュータや電気や,ソフトウェアについて学びに来たのではないと考える諸君もいるでしょう. しかしながら,現在において,電子化され,コンピュータによる制御が行われてない機械を探すほうが 難しいのが現状です. 自動車は,従来型のガソリンエンジンによる車でさえ, 少なくとも20個以上のコンピュータにより制御されていますし, あらゆる家電,デジタルガジェット類は言うまでも無いでしょう.
例えば,最近話題の自動運転車(Self-driving car). 自動運転車は,いまや世界中の自動社会社,IT企業,大学などで盛んに研究されていて, 実用化間近と言われています.この自動運転車は,カメラやレーザセンサの情報から, 自分のいる場所,道路のどのレーンにいるか? 信号はどこにあり,何色か? さらには周りにいる他の自動車,バイク,自転車,歩行者,乳母車などを見分けて 必要であれば,止まったり,車線変更をしたり,相手に譲ったりなどが出来なければなりません.
この様なことのほぼすべては,自動車に搭載されたコンピュータ(embedded computer)で 処理されます注1,注2. またその「処理」を行うのはコンピュータに内蔵されたソフトウェアです.多くの場合, C言語,またはその拡張版であるC++(シープラスプラス)言語を使って書かれています.
【注1】 最近は,処理の多くをネットワーク上のコンピュータ「クラウド」で行うケースも増えています. が,ネットワークが切れてしまったら処理出来ません.また自動運転車は瞬間的な判断が必要なので, その処理の殆どは搭載コンピュータ内で処理されます.
【注2】 embedded computerにはそれぞれ適材適所のものが使われます.通常は電力効率の良いARMプロセッサ等が 用いられます.最近の携帯電話(Android, iPhone/iPad等)に用いられているものもほぼ同じものです.
グーグルの自動運転車
自動運転車を滑らかに走らせるための制御方法
コンピュータのプログラム言語には非常に多くの種類があります.
ざっと挙げただけでも,BASIC, FORTRAN, COBOL, Pascal, C, C++, ADA, Java, Python, Swift
等があります.それぞれの言語にはそれぞれ一長一短があるため,これだけ多くの言語が存在しているわけですが,
これらの中で,歴史的にみても最も多くのプログラマが存在し,多くのアプリケーションを生み出し,
その他の言語に対して大きな影響を及ぼしてきたのはCおよびC++言語でしょう.
すなわち
【注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個のビットを集めて1セットとしたものをバイト(byte)と呼びます.これらはまた後で詳しく学習します.
ともかく,コンピュータはこのON/OFFで動いているため,1/0の2値しか理解しないのです.プログラムも最終的には1/0の組み合わせである必要があります.しかし,人間は1/0の組み合わせをみてもさっぱりわかりませんよね?このため,1/0の組み合わせで意味のあるまとまりを文字に置き換えた,アセンブリ言語が発明されました.アセンブリ言語は,その名の "Assenbly" が示す通り,機械語の意味を持つひとかたまりの部品に名前(ニーモニックという)をつけ,これらの部品を組立てて行くように作成できるようにしたものです.機械語を直接いじるよりも圧倒的にわかりやすく,かつ機械語を直接触っているのと変わらないため,非常に細かい作業が行える反面,大規模なプログラムを書くためには困難が伴いました.
そこに登場したのが高級言語と呼ばれるものです.機械語ほど,コンピュータの中身を直接操作することはできませんが,人間にとって読みやすく,大規模なプログラムを書いたり,誤りの少ないプログラムを書くことができるものでした.それを可能にしたのは,機械語を直接書くやり方ではなく,人間にとって読みやすい「ソースコード」を書き,それを機械語に変換する方式でした.
最初は一行ごとに変換しては実行する方式,インタプリタが広まりました.これは一行ごとに機械語に変換(翻訳=interpret)するので,実行時の間違いがわかりやすくて学習には向いていました.Basic言語が有名です,
インタプリタ方式は,しかし,いちいち変換しながら実行するので,実行速度が遅いという問題があります.これを解決するために,プログラムのソースコードのすべてを一気に機械語に変換する方式,コンパイル方式ができました.FORTRAN,COBOL, Ada, Pascal, C,C++, Objective-C言語などの多くの言語はコンパイル方式です.コンパイル方式のメリットは,速度だけではなく,秘匿性にもあります.最初に機械語に変換してしまうため,ソースコードを公開する必要がないためです.このため,商用アプリケーションのほとんどはコンパイル方式の言語で開発されています.
その一方で,最近ではWeb系開発言語がその性格上,インタプリタ方式を採用しています,JAVAやJavascript,Perl,Python言語などがその代表です.問題であった実行速度も,JIT(Just-In-Time)コンパイル技術など,実行直前に自動でコンパイルしてしまうような技術が開発されて実行速度も改善されてきています.
【注4】 携帯電話の Android のプログラムはJAVAで書かれています.iPhone/iPadは,Objective Cという,Cの派生言語で 書かれていましたが,最近,Swiftという言語に切り替わりました.Androidも近くSwiftになると言われています.
さあ,早速自分のプログラムを作ってみよう! いきなりプログラムコードを書くのはとても難しいので, まずはコードを書かなくてもできる,新しい方式のプログラムを作ってみよう.
ここでは,MITで開発された,子供向けのプログラミング環境, Scratch(スクラッチ)を使っていろいろいじってみよう.
「え〜!子供向けだろ,これ!」などとバカにしてはいけません. これでもとても高度なプログラムが作れますし,基本的な プログラミングの概念もしっかり入っているので, ちゃんとしたプログラムの基礎を学ぶことが出来るんですよ.
【ヒント】 まずは動かしてみて,いろいろいじってみよう.動きがわかったら,中身を見てみよう. どういうコードを書くと,どう動くのか,わかるようになるよ.
【ヒント】 地球のボタン を押して,言語をEnglishにしよう. 今後,C言語を勉強していく時の親和性が高くなります. 最初,内容がわかるようになるまでは日本語で,その後, だいたい理解できたら英語に切り替えると良いと思います.
【ヒント】 「制御」コマンドを有効に使って,コードができるだけ短くなるように工夫しよう.
【注意】 これからC言語による本格的なコンピュータ・プログラミングを始めますので, 来週までに各自【自宅のパソコンへの開発環境の導入】 をしておきましょう.