こんにちは､ そしてお帰りなさい｡
この講義では､ プログラミング言語cに関連する具体的な機能について説明したいと思います｡
だから､ 私たちはcの長所をすべて知っているのです｡
そういう話を延々としたんです｡
cはコンパクトで効率的なプログラムを生成することが分かっています｡ それはそれで重要な言語機能ですが｡
最も重要なプログラミング言語の一つであり､ 今後もそうあり続けるでしょう｡
私たちはすべてを知っています｡
だから､ もう一度､ 言っておきたいのです｡
しかし､ c言語の主な特徴は､ 効率的で移植性が高く､
強力で柔軟なプログラマ指向の言語であることです｡
そして､ これらが何を意味するのか､ より詳しく解説していきます｡
しかし､ これらはcの重要な特徴である｡
この言語でコードを書く方法を理解するためには､ それらを改めて理解する必要があるのです｡
では､ 効率性と携帯性とはどういうことなのでしょうか｡
まあ､ cは効率的な言語ですからね｡
現在のコンピュータの能力をすべて活用しています｡
非常にコンパクトなプログラムで､ C言語で書かれています｡
とても速く､ コンパクトです｡
先ほど､ ある言語の命令とc文の対応付けが非常に効率的であることをお話ししました｡
これが速さの理由のひとつです｡
昔､ Javaに対する不満の1つに､ 「おい､ javaは本当に遅いぞ」というのがありました｡
まあ､ cにはこんな問題はないでしょうけど｡
C言語でプログラムを書くと､ 高速に動作し､ 非常にコンパクトになります｡
それが言語機能なんですね｡
それが効率です｡
プログラマーは､ このような低レベルのプログラムだからこそ､ プログラムを微調整してさらに効率を上げることができるのです｡
メモリをより効率的に使うことができるのです｡
javaではこんなことはできない｡
Javaには独自のガベージコレクタがあり､ メモリを操作して効率化することはできません｡
だからcは効率的な言語であり､ ポータブルな言語なのです｡
そこで､ 以前の講義で簡単に触れましたが､ これが重要なのは､ あるオペレーティングシステムでcプログラムを書いた場合､
それを他のオペレーティングシステムで修正せずに実行できる､
ということです｡
今の時代､ コードを書くときの問題のひとつは､ 多言語で書いたり､
広範囲に手を加えないと動かないことがあることです｡
ですから､ 例えばアンドロイド携帯用のアプリケーションを書いたとしても､
それがiOS携帯で動くことはないのです｡
cにはそういう問題はないんですね｡
cを書けば､ あらゆる種類のハードウェア､ あらゆる種類のオペレーティングシステムで動作するのです｡
実際､ cは移植性の高さ､ この能力､ コンパイラの入手のしやすさではトップクラスです｡
コンパイラはWindows､ Linuxで問題なく入手できます｡
Linux/Unixシステムには通常cコンパイラが付属しているので､ Macintoshと同じLinux/Unixの場合はダウンロードする必要すらありません｡
そのため､ 外部からのダウンロードは不要で､ すぐにcプログラムを書き始めることができます｡
また､ Windows用も当然用意されています｡
しかし､ 一般的にWindowsの場合､ コンパイラをダウンロードする必要があります｡
そして､ 必要なソフトをダウンロードするときに､ それを行うことにしています｡
だから､ どんなデバイスを使っても､ cコンパイラが手に入る可能性が高いんだ｡
Cコンパイラは､ アンドロイド端末やiOS端末､
マイクロコンピュータやミニコンピュータ､ プロセッサや自動車など､ 低レベルのものでも入手できます｡
また､ 非常に柔軟であることも重要で､ 非常にパワフルでもあります｡
だから､ Unix Linuxのカーネルはcで書かれている｡
カーネルとは何ですか？
さて､ 私たちはUnixとLinuxがオペレーティングシステムであることを知っています｡
オペレーティングシステムは､ ユーザーがより効率的にコンピュータを使えるようにするもので､
ハードウェアとのインタラクションなど､ 多くの側面を制御しています｡
カーネルはオペレーティングシステムの頭脳である｡
CPUがコンピュータの頭脳であるように､ カーネルはOSの頭脳と知識を集約したもので､
ハードウェアとカーネルのインターフェースを持ち､ メモリを管理したり､
さまざまなことを行います｡
そして､ それはすべてC言語で書かれている｡
だから､ 言葉の持つパワフルな面を伝えることができるのです｡
オペレーティングシステムのカーネルがその言語で書かれていれば､
その言語は強力です｡
そのため､ 他の言語用のコンパイラやインタプリタの多くは､
cをベースに作られたり､ cで書かれたりしています｡
だから､ これが言葉の力強さを物語らないとしたら､ 私は何を物語るのかわからない｡
しかし､ Fortran､ Perl､ Python､ その手の言語で書かれたコンパイラーはすべてcで書かれている｡
だからcプログラムは､ 物理学や工学の問題を解くために､
さらには映画の特殊効果をアニメーション化するために､ 広くさまざまなことに使われてきたのだ｡
特に､ 開発者としてこのコードを書く場合は､ 柔軟性も重要です｡
いろいろなやり方ができるようになりたいんですね｡
いろいろな方法で問題を解決できるようになりたいものです｡
一般的には､ 柔軟性が高いほど良いとされています｡
しかし､ 柔軟性と性能はトレードオフの関係にある｡
しかし､ cはフレキシブルに設計されており､
非常に柔軟です｡
だから､ cプログラムでやりたいことは何でもできる｡
さまざまなアプリケーションを書き出すことができます｡
また､ メモリを管理したり､ 他の多くの言語では制限されているさまざまなことを行うことができます｡
柔軟性がある分､ バグが増えたり､ 複雑になって開発者が特定の概念を十分に理解できなくなったりすることもあるので､
トレードオフの関係にあります｡
しかし､ 最終的には柔軟性があることは良いことで､ 特に言語をよく理解している開発者であれば､
なおさらでしょう｡
また､ 先ほどのc++など､ より高度な言語の基礎にもなっています｡
objective-cの形で携帯電話アプリの開発に使用されています｡
Objective-cは､ Apple社が独自に開発した言語です｡
基本的にはc++と同じようにオブジェクトを持つcですが､ 独自の言語を書くことにしたそうです｡
ただ､ Swiftが普及しつつあるためiOSで使われることは少なくなっていますが､
コンパクトなので習得しやすいのも特徴です｡
プログラマーになりたい人が最初に学ぶ言語として理想的です｡
そして､ その根拠はかなり説明したつもりです｡
実用的なアプリケーション開発のための十分な知識を､
非常に早く､ 非常に簡単に習得することができます｡
だから､ 最初に習うのにちょうどいいんです｡
この授業で気づくのは､
C言語を学んだおかげで､ JavaやPHPを学ぶのがずっと簡単になったということでしょう｡
プログラマー志向です｡
それは､ 言語機能です｡
プログラマーのニーズを満たしている｡
Dennis Ritchieがこの言語を作ったとき､ より開発者にフォーカスした言語にしたいと考え､
それを実現したことはお話しました｡
彼はその目標を達成した｡
ハードウェアに直接アクセスでき､ メモリに直接アクセスでき､ 自分のメモリを管理することができるようになります｡
だから､ プログラマーオリエンテッドになったときに､ 柔軟性が発揮されるのです｡
javaでは､ 自分のメモリを管理するなど､ こういったことはあまりできません｡
また､ C言語には他にも多くの機能があり､ 柔軟性を持たせることができます｡
また､ プログラマーはそういうものを好むので､ その柔軟性によって､ よりプログラマー志向になれると思います｡
彼らはその柔軟性を好み､ 何をすべきかを指示されることを望まないのです｡
豊富な演算子を搭載しており､ 簡潔な表現が可能です｡
さて､ これはまだ演算子が何であるかを知らないということです｡
しかし､ 演算子には､ 加算や減算を行う数学演算子や､
データをメモリに代入する代入演算子などがある｡
また､ 演算子の数が増えれば増えるほど､ コードでの表現力が高まります｡
そして､ よりプログラマ指向の言語機能として､ この演算子のリストがあるのですが､
これについては､ もっと詳しく説明します｡
他の言語に比べて､ できることの制限が緩やかなんです｡
柔軟性と厳密性というトレードオフの関係にあることは申し上げました｡
いろいろなやり方ができるのが強みですね｡
しかし､ 特にポインターのようなものでは､ プログラマーがエラーを起こしやすくなるので､
危険かもしれません｡
だから､ cで自分のメモリを管理できるというのは､ 非常に柔軟性があるんですが､ 時に非常に複雑でもあるんです｡
そして､ その結果､ 多くのプログラマーがプログラムにバグを混入させてしまう｡
今のjavaはメモリ管理ができない｡
しかし､ 柔軟性に欠ける反面､ プログラムのバグを減らすことができます｡
つまり､ トレードオフの関係にあるわけです｡
基本的には､ あまり複雑でないものも許容することで柔軟性を持たせたいのでしょう｡
C言語は自由度が高い反面､ 開発者により多くの責任を負わせるので､
プログラムオリエンテッドになるわけです｡
C言語の実装には､ 便利なc関数の大規模なライブラリがあります｡
だから､ 何かやりたいことがあっても､ 全部cで書く必要はないんです｡
プログラミング言語には､ 通常､ その言語に付随する他のプログラム機能が含まれているはずです｡
ですから､ 例えばユーザーからの入力を読み取る場合､ そのために低レベルのCコードを書くのは好ましくありません｡
cにはすでにそれを行うコードがあり､ あなたはそのコードを再利用するだけです｡
そして､ それは通常､ ライブラリと呼ばれるものに内包されています｡
そして､ cには､ キーボードからデータを読んだり､ ファイルにデータを書き込んだり､
さまざまな処理と脅威を伴うあらゆる種類の素晴らしいものを作り出すための､ あらゆる種類のライブラリ関数があります｡
いろいろといいことづくめということです｡
ですから､ 多くの実装が言語と一緒に提供され､ 実際に自分で実装する必要がなく､
ライブラリの使い方を覚えればよいというのは､ 非常に有利で､
プログラマ指向と言えます｡
cの他の特徴として､ 一般的に低レベルの言語が提供する低レベルの機能を提供している､
という話をしました｡
しかし､ やはり一番いい例は､ メモリ管理､ メモリへの直接アクセスです｡
プログラムはビットを使って操作することができます｡
これが低レベルでなければ......何が低レベルなのかわからない｡ メモリ表現をビット単位で管理する機能である｡
ビットとバイトは､ コンピュータに実際にデータを格納する方法であり､
さまざまなビット操作の演算子を提供します｡
これもまた､ 文言の中にあるもので､ 詳しくは後述します｡
cではポインタが大きな役割を果たす｡
これは､ 聞いたことがあるようなないような概念ですが､
メモリ管理に関連するものです｡
ポインターの講義が多くなりますね｡ しかし､ これはcの非常に非常に重要な機能であり､
非常に高いレベルで熟知している必要があります｡
Cは､ メモリ､ Cポインタを管理します｡ c言語といえば､ まずポインターを思い浮かべる人が多いのではないだろうか｡
そして､ これらはすべて､ メモリへのダイレクトアクセスです｡
cのデメリットとして､ 柔軟性と自由度のトレードオフという話をしました｡
また､ 責任も重くなります｡
これをデメリットと捉える人もいれば､ ポインタが悪用されるとの見方もある｡
その結果､ 多くの人が悪いcプログラムを書いてしまうのです｡
そうですね､ もしあなたが誰かに何かをするための道具を与えたとして､ その人が間違ったやり方をしたら､
誰が悪いのでしょうか？
つまり､ 悪用されるから規制するのか､ それとも柔軟性を持たせるために規制するのか､
ということです｡
そのため､ より柔軟に対応することができますが､ その分エラーも多くなり､ 特にメモリに関するエラーの場合､
その発見や追跡が非常に困難になることが多々あります｡
だから､ それが問題になることもある｡
その他､ 演算子が豊富で簡潔なため､ 時には読みにくい､
ついていけない言語になってしまいます｡
ほとんどの場合､ cは非常に読みやすい｡
しかし､ こうしたさまざまな演算子をたくさん使うと､ その分複雑になってしまいます｡
だから､ 無名のコードを書き上げる機会もあるのですが､ それはどんな言語でも下手なことはできません｡
だから､ 話すときに英語を使っていても､ 文法が悪くてもいいんです｡
それは､ プログラミング言語を使う､ つまり文章を書くときも同じです｡
しかし､ Cの場合､ これらのオペレーターがいるため､ 不利になるという意見もあります｡
使い方を間違えると､ コードを追うのが大変になることもあります｡
では､ ちょっとまとめます｡
これは､ Webで見つけた素敵なイラストを再びお届けします｡
c言語の主な特徴として､ 高速で効率的､ 移植性が高い､ コードを再利用できる素晴らしいライブラリがたくさんあり､
自分で何かをする必要がない､ モジュール性､ 先ほども話しましたが､
これは関数を中心にコードを構成するという考え方で､ 簡単に拡張でき､ さらに強力な演算子で様々なことができるのです｡
だから､ いい機能がたくさんあるんです｡
そして､ 今話したような機能のほとんどは､ cをベースに構築されているため､
多くの現代言語に搭載されているのです｡