こんにちは､ そしてお帰りなさい｡
この講義では､ cプログラムを作成する際のポイントについてお話したいと思います｡
つまり､ どんなC言語プログラムでも､ その作成には4つの基本的なタスクがある｡
そして､ その作業とは何かというと､ 編集､ コンパイル､ リンク､
実行などです｡
C言語のプログラムを書くときに採用するさまざまなステップについて､
要件を理解し､ コードを設計し､ コードを書き､ テストやデバッグなどを行い､
それを保守するという観点から話をしました｡
ここで言っているのは､ プログラムを書き始めるときに実際に必要なことです｡
編集､
コンパイルの話はなんとなくしましたが､ リンクや実行も重要です｡
そして､ ここでお話したいのは､ その詳細です｡
つまり､ これらの作業は､ cプログラムを書くたびにやっていることなので､
自然に身につくのです｡
ソースコードを編集し､ コンパイルし､
リンクし､ そして実行することになります｡
あなたは､ これをとても頻繁に行うことになります｡
つまり､ 編集､ コンパイル､ リンク､ 実行のプロセスは､ どんな環境でも､
どんなコンパイル言語でも､ プログラムを開発する上で同じなのです｡
これはcに限ったことではありません｡
java - javaのプログラムを書く場合､ ソースコードを書き､
ソースコードをコンパイルすることになります｡
リンク - javaではあまり意識されないかもしれませんが､ 何らかのリンクが行われます｡
リンクとは何かについて説明し､ その後プログラムを実行することになります｡
これだけやるんだから｡
ここで改めて説明するのは､ cで行う方法です｡
つまり編集とは､ まさにそのようなものなのです｡
実際のコードであるcソースコードを作成し､
修正する作業です｡
cのソースコードは､ ファイルの中に入ることになります｡
そして､ その中には､ あなたが書いたすべての文とすべての指示が含まれることになります｡
すべてのcのソースコード・ファイルは.NETで終わります｡ cの拡張子がついているので､ それでソースコード・ファイルであることがわかる｡
その前に. cの拡張子はベースネームと呼ばれることになるので､
ファイル名には意味を持たせたいものです｡
2つの数字を足し算するcプログラムを書くと､ addというファイルができることがあります｡
ソースコードが含まれる「c
そして､ ほとんどのCプログラムは､ 多くの多くの異なるファイルを持っていることを忘れないでください｡
ですから､ ファイルには良い名前をつけてください｡
しかし､ cのソースコードを識別する方法は､ . c 拡張｡
いずれも.NET Frameworkを搭載しています｡ c 拡張｡
さて､ このクラスのコードを編集する際には､ 統合開発環境を使用することにします｡
単純なエディターを使うだけではありません｡
簡単なエディターの例としては､ ワードパッドなどがあります｡
エディタがあるのはもちろんですが､ 他にもコードを効率的に書くための様々な機能があるものを使うことにします｡
IDE - これはIDE､ 統合開発環境と呼ばれるものです｡
この授業で使うのはコードブロック､ 詳しくはこれから説明しますが､
編集作業にはコードブロックを使うことにします｡
でも､ 好きなものを使っていいんですよ｡
メモ帳を使いたいなら､ さらに極小のものを使いたいなら､
Atom､ Visual Studio IDEがありますが､ ここで取り上げるのは､
コードやコードブロックを編集する方法です｡
これは素晴らしいアイデアで､ 私がこれを選んだ理由はこれから詳しく説明しますが､
クロスプラットフォームで使いやすいのです｡
つまり編集は､ コードを書くという基本的な作業なんですね｡
コンパイル中｡
コンパイラが何をするかは分かっている｡
また､ コードに含まれるエラーを検出することもできます｡
コードを編集した後､ コンパイラを実行することになります｡
つまり､ コンパイラへの入力は､ すべてのソースコード､ すべての.NET
Frameworkになるわけです｡ cは編集しているものすべてをファイルします｡
そしてまた､ cプログラムは多くのソースファイルを持つことができます｡
しかし､ コンパイラへの入力はこのソースファイルであり､ コンパイル自体はこのコードを変換する2段階のプロセスである｡
最初の段階は､ 前処理段階と呼ばれる｡
この間､ コードの修正・追加を行うことができます｡
そして第2段階が実際のコンパイルで､ アセンブリ言語のコードを生成します｡
そして､ この前処理段階については､ さらに詳しく説明します｡
ただ､ コンパイルをする際には2つの段階があることを､ 今知っておく必要があります｡
これから注目する､ あるいはわかりやすいのは､ オブジェクトコードの生成です｡
だから､ コンパイラはそれぞれの文を見て､
構文が正しいか､ 言語の意味論に合致しているかを確認することになるんだ｡
構文とは､ コードの構造が正しいか､ 文の終わりにセミコロンをつけているか､
データ型は使っているか､ 言語のルールに沿っているか､
などを確認することです｡
セマンティクスとは､ 言葉の意味のことです｡
つまり､ ifキーワードを使えば､ それが条件となるわけです｡
セマンティクスは､ シンボルテーブルの作成など､ コンパイルの段階で発生する｡
でも､ コンパイラは重要です｡
このようなオブジェクトコードが生成されるのです｡
構文に間違いがないかどうかを教えてくれます｡
また､ 基本的にコードが使われていないデッドコードの有無も認識できる場合があります｡
ロジックエラーは検出されません｡
シンタックスエラーしか検出されません｡
繰り返しになるが､ シンタックスとは規則や言語のことである｡
ロジックの間違いは､ 意味です｡
ロジックを間違えると､ 機能を間違うことがあるように｡
つまり､ コードは実行でき､ コンパイルもできますが､ 意図したとおりに動作しないことがあり､ これをロジックエラーと呼びます｡
コンパイラは､ ロジックエラーがあっても教えてくれない｡
もし､ 文字列ではなく数字を入力させようとしたり､ 名前の前に姓を入力させようとしたら､
それはロジックエラーになります｡
コンパイラはそういうエラーは教えてくれません｡
コンパイラが報告する典型的なエラーは､
宣言されていない変数､ 構文に適合しない式､
正しい括弧がない､ 終了ブロックがないブロック､ などである｡
コンパイラのエラーとその意味について､ とてもとても詳しくなることでしょう｡
うまくいけば､ c言語を学んだ後､ コンパイラを実行すると､
エラーが表示され､ すぐに修正することができるようになります｡
例えば､ シンタックスを忘れたとか､ セミコロンを忘れたとか､ ああ､
コードのブロックを終わらせる右括弧を用意するのを忘れたとか､ そういうことです｡
それが自然にできるようになるんです｡
つまり､ すべてのエラーを修正してコンパイルが成功したら､
アセンブリ言語に翻訳されて､ このオブジェクトコードが生成されるわけです｡
つまり､ 実際のオブジェクトコードは､ . o ファイルを作成します｡
実際に実行されるのは､ 要約言語のコードです｡
エクステンションを搭載しています｡ obj または . o. objは通常Windowsの場合､ 拡張子になります｡ LinuxまたはMacintoshシステム上のoは､ 拡張子になります｡
コードをコンパイルした後に､ そのファイルが生成されるのがわかると思います｡
そして､ それはあくまでコンパイルの最終段階であり､
実際のアセンブリ言語はこれです｡
バイナリになる､ テキストに見えない......そんなことはない｡
を持つようになるだけです｡ o 拡張を使用し､ コンパイラが生成するものです｡
cでコンパイラを実行する方法は､ 実際にコマンドを使用します｡
統合開発のエディタであるideがメニューオプションをクリックするだけでやってくれるので､
おそらくこの作業はあまり必要ないと思いますが､ 何が起こっているかを知ることは重要なことです｡
ですから､ コンパイラコマンドを発行するときは､ 通常､
GNUコンパイラ､ つまりgccコマンドを使用することになります｡
しかし､ 基本的なレベルでは､ ccかgccのどちらかのコンパイラプログラムを実行するだけでいいのです｡
そのプログラムを実行し､ 入力を指定するのです｡
コンパイラは､ ソースファイルを入力とすることを忘れないでください｡
入力は-cフラグで指定し､ ソースファイルを次々に指定していきます｡
そこで､ ここではcc-cmyprogを例に挙げます｡ c､ またはGNUコンパイラを使用している場合は､ 一般的なものであるgcc-cです｡
また､ cフラグを省略すると､ 次のステップであるプログラムのリンクも自動的に行われます｡
でも､ 本当はコマンドラインインターフェースであれば､ そのコンパイラを実行するのは簡単なんです｡
このクラスで行うであろうメニューオプションを使えば､
さらに簡単です｡
しかし､ ここでも入力であるcのソースファイルが必要です｡
コードブロックでは､ 先ほど申し上げたように､
メニューオプションをクリックするだけで自動的にリンクをコンパイルし､
別のメニューオプションをクリックすれば自動的に実行されます｡
しかし､ ここでも､ ボンネットの中で行われているのは､ 実際に-cフラグを付けたコンパイラ・コマンドと入力ソース・ファイルを発行することなのです｡
コンパイルしたら､ リンクする｡ どのプログラミング言語にもリンクがあると言いましたが､ 多くの場合､ リンクは透明で､
何が起こっているのかさえわからないでしょう｡
cでは､ 必ずしも透明性が高いとは言えないので､ リンクのプロセスが重要です｡
しかし､ 今日のほとんどのモダンなIDEでは､
そうですが､ cでは重要であることを強調する必要があります｡
だから､ プログラムがこれに変換された後｡ をオブジェクトコードに変換し､ リンクできるようになります｡
なぜリンクするかというと､ 外部のライブラリを使う場合､
他のライブラリをすべて取得して､ 1つのプログラムに入れなければならないからです｡
つまり､ リンクとは､ すべての依存関係を整え､ 実際の実行ファイルを構築することなのです｡
だから､ . o ファイルはオブジェクトです｡
そして､ すべての.NET Frameworkをリンクさせます｡ osを1つの実行ファイルにまとめたものです｡
そしてまた､ これは通常､ 透明で､
通常はコンパイル時に自動的に起こります｡
しかしまた､ そうでない場合もあり､ -l などの別のコマンドを実行する必要があるかもしれません｡
しかし､ それらのオブジェクトファイルをすべて取り込んで､ 1つの実行ファイルを構築するのです｡
そして､ 実行するのが実行ファイルです｡
だから､ それらをすべて統合することになる｡
そして､ 合体もするのです｡
そして､ あなたは持っているかもしれません｡ は追加ライブラリで､ 他の人が書いた使いたいプログラムや､
C言語についてくる他のライブラリです｡
それらを全部ひっくるめて､ まとめていくんですね｡
そして､ リンクの段階でもエラーを検出して報告します｡
2つのフェーズに分かれているんです｡
リンクは､ 再定義エラーや､ 存在しない関数を呼び出そうとした場合などに発生します｡
だから､ もしあなたがそれを持っていないなら. o ファイルでプログラム全体を構成すると､ リンクエラーになります｡
そして､ すべての.NET Frameworkが必要です｡ o'sです｡
そしてまた､ その. あなたのものでもないかもしれません｡
それらは同じ言語についてくるかもしれないし､ 標準ライブラリの一部かもしれないし､ 他の誰かが書いた別のプログラムについてくるかもしれない｡
しかし､ あなたはそれらのすべてが必要です｡ oを1つの実行ファイルとして作成します｡
そこで､ プログラムライブラリは､ 言語にはない操作を実行するルーチンを提供することで､ C言語をサポートし､
拡張しています｡
入出力ライブラリは､ 例えば､ 数学ライブラリ､
文字列操作ライブラリなどです｡
これは､ javaのプログラムに詳しい人なら､ javaのapiと同じことです｡
パッケージと同じことです｡
ファイルにデータを書きたいが､ 自分で実装するのは嫌だ､
言語に付属する既存のライブラリを使おうという考え方です｡
それはまだcで書かれている､ それはちょうど誰かcが付属しています｡
そのため､ さまざまな種類のライブラリがあり､
それを学び､ 使用することになります｡
これは､ リンキングフェーズの一部で行われます｡
つまり､ リンクの段階で失敗すると､
もう一度ソースコードに戻ってオブジェクトファイルを見つけられるように編集しなければなりません｡
これも自然に身につくでしょう｡
成功､ コンパイルに成功､ リンクに成功すれば､ 実行可能なファイルができあがる｡
Windows環境では､
実行ファイルには. exeの拡張子です｡
LinuxやWindowsでは､ デフォルトでaが付くだけです｡ を出しています｡
を変更することができます｡ を､ コンパイラコマンドと一緒に何か発行することで､
より意味のあるものにすることができます｡
しかし､ コードブロックでもほとんどのIDEは､
コンパイルとリンクのプログラムを一度に実行し､
実行ファイルを生成します｡ そして､ その実行ファイルをダブルクリックするか､ コマンドまたはメニューオプションから実行することができます｡
でも､ Linuxなら低レベルではダメで､
aが表示されます｡ を実行ファイルとしてデフォルトで出力します｡ ウィンドウズでは､ .NET Frameworkが表示されます｡ エクセレント
ある程度の大きさのプログラムは､ いくつかのソースコード・ファイルで構成されていることは､
先に述べたとおりです｡
各ソースコードファイルは､ コンパイラによってオブジェクトファイルが生成され､
それがリンクされる必要があります｡
プログラムをいくつかの小さなソースファイルに分割することで､ より簡単に管理できるようになりました｡
多くのソースファイルを使いたいだろうし､ 5000行のコードを含むソースファイルはいらないだろう｡
それは､ まとまりがないですね｡
それを管理するのは簡単なことではありません｡
つまり､ ソースコードを含むファイルを作成するわけですが､
そのソースコードは具体的なものになります｡
特定の機能を持つことになる｡
開発しやすくなり､ デバッグもしやすくなり､
まとまりもよくなります｡
だから､ 小さなソースファイルがたくさんできることになる｡
何千行ものコードで構成された大きなソースファイルは必要ないのです｡
そして､ これらのソースファイルはすべて､ プログラム全体を構成することになるのです｡
彼らは皆､ 自分の. oがあり､ それらはすべてコンパイラに入力されることになる｡
プログラムを構成するこれらの概念も､ 本来はすべてプロジェクトとみなされる｡
より高い次元でそう考えることができるのです｡
それはあなたのプロジェクトであり､ あなたのプログラムです｡
最終的にここまでやって､ リンクして､ 実行ファイルができたら､
あとはプログラムを実行するだけです｡
ほとんどのIDEでは､ これは単にメニュークリックになるか､
Windowsではexeをダブルクリックすることになります｡
そして､ Linuxなら､ aを入力するだけです｡ を出しています｡
今､ アの時｡ を実行するには､ 特定のパーミッションが必要なので､ チェンジモードコマンドを発行する必要があるかもしれません｡
/a. を出力すると､
コマンドラインLinuxからプログラムが実行されます｡
しかし､ これも通常は気にする必要はありません｡ つまり､ 実行段階とは､
プログラムを実行するところです｡
プログラムの各ステートメントが順番に実行されます｡
プログラムがユーザーに何らかのデータを要求した場合､
プログラムは一時停止してその入力を取得します｡
キーボードから入力を得ることもできますし､ Cコードにそのためのライブラリがあれば､ グラフィックユーザーインターフェイスから入力を得ることもできます｡
プログラムによって表示された結果は､ コンソールと呼ばれるウィンドウに表示されます｡
そして､ コードブロックの話をするときに､ その例を紹介するつもりです｡
しかし､ プログラムを実行すると､ 通常､ 出力が表示されます｡
常にというわけではなく､ 時には出力されないようなことをプログラムが行うこともあります｡
しかし､ 通常は出力を生成し､ ターミナルやコンソールでその出力を見ることができます｡
実行段階では､ さまざまなエラー状態も発生する｡
そのため､ 間違った出力をすることがありますが､
これは単なるロジックエラーであり､ ソースコードを編集し直さなければなりません｡
ロジックに問題があるため､ 何もしないまま放置されている可能性があります｡
つまり､ プログラムの中で何か悪いことをして､
そのせいでプログラムが死んだり､ OS上の他のプログラムがクラッシュしたりして､ コンピュータ全体がクラッシュする可能性があります｡
そのため､ 実際のcアプリケーションを実行すると､ 問題が発生することがあります｡ もし､ プログラムが意図した機能を実行しない場合は､ ソースコードに戻って編集しなければなりません｡
これは､ エラーを発見して修正するデバッグ段階と呼ばれるものです｡
それだけ重要なことなので､ デバッグのセクションを設けることにしました｡
先ほど､ 「失敗から学ぶのが一番の学習法」と申し上げました｡
常にソースコードに戻って編集し､ デバッグすることになります｡
プログラムのコンパイル､
リンク､ 実行の全工程を､ そのコードの機能に必要な結果がすべて得られるまで､
完了するまで繰り返す｡
ここで､ またまた私が好きなイラストをご紹介しましょう｡
これはホートン著の「ビギニングC」という本から引用しています｡
でも､ これはその過程なんですね｡
ソースコードを編集するのです｡
.NETを使ったファイルを作成するのです｡ cの拡張子と意味のある名前が必要です｡
そのためにエディタやIDE（統合開発環境）､ Code
Blocksのようなものを使うことになるでしょう｡
その後､ コンパイルすることになります｡
コンパイラは､ objファイルとoファイルを生成することになります｡
もし､ そのファイルが生成されない場合は､
エラーがあるということなので､ 戻って修正する必要があります｡
オブジェクトファイルであるobjファイルを作成した後､ それらをすべてリンクして実行ファイルを作成する必要があります｡
また､ その段階で正しくリンクされていないエラーが発生する可能性もあります｡
ソースコードに戻って編集する必要があります｡
実際にエラーがなく､ 実行可能なファイルができたら､
プログラムを実行することができます｡
そしてまた､ プログラムを実行した後も､ ロジックエラーが発生する可能性があるため､ エラーが発生することがあります｡
そうすると､ 戻ってソースコードを編集することになりますね｡
だから､ これは繰り返しの作業になり､
とても慣れることができるのです｡
編集､ コンパイル､ リンク､ 実行｡
そして､ これもまた､ すべての言語で典型的に行われることです｡
プログラムがすべての要件を満たすまで､ これを何度も何度も繰り返すことになります｡