プログラミングを始める前に

1.C言語の簡単な歴史

C言語とはUNIXというオペレーティングシステムを開発するために作られた言語だそうです。
初期はUNIXの作者であるKen Tompsonはアセンブラでプログラムを書いていたが、それが嫌になったのか「B」という言語を開発しました。
Brian Kernighan によって改良を加えられ、NewB(NB)を経てC言語へと発展していきました。こうして出来たのが今で言うK&Rです。
こうして出来たC言語はあちこちに広がりましたが、機能があちこちで独自拡張されていきました。
これに収拾をつけるべくANCI(American National Standards Institute)とISO(International Organization for Standardization)は共同でC言語の規格を発表しました。
これが今日C89とかANCI-C89とかISO-C90とか呼ばれるものです(それぞれ1989年と1990年に規格を発行しました)。

さて、話は少し巻き戻り1979年、C with Classesと呼ばれる言語の開発が始まりました。
その名の通り、classを持つC言語で、1983年にはC++という名前に変わり、演算子と関数のオーバーロードや参照、const型、行コメント(//)などが追加されました。

C++はその元となったC言語にも大きな影響を与え、1999年、ISOとIEC(International Electrotechnical Commission)が共同で新たな規格を発行しました。
これが現在最も一般的に使われているC99と呼ばれる規格で、変数宣言位置の自由化やbool型、行コメント、inline関数などC++の機能が逆輸入されました。

なお、C++はC99の登場まで完全な互換性を持っていましたが、現在は異なる言語としてそれぞれ成長を続けています。

C言語ではC11と呼ばれる新規格を発表し、セキュリティ上大問題となっていたgets関数の廃止、_sサフィックス付き関数の追加、マルチスレッド機能、型判定マクロ、Unicode文字列リテラルの対応などをサポートしました。

Cの歴史

2.プログラ厶言語とはなにか

wordだって、excelだって、ニコニコだって、モンハンだって、エロゲだって、みんなみんなプログラムでできている友達なんだ!

というように、コンピュータで動くありとあらゆるものはプログラムでできています。プログラムを動かすには、我々人間が機械に命令を与える必要があります。命令文をプログラム言語で書くことによって、機械に命令、実行させることができます。

プログラミング言語で書かれたプログラムを読み込んで、それを機械への命令に変換して実行するのですが、その方法は大きく分けて2通りあります。

インタープリタ方式とコンパイル方式

インタープリタ方式とは、プログラミング言語で書かれたプログラムを読み込んで、直ちにそれを機械への命令に変換して実行してくれます。ある程度まとまってれば、完成してなかったり、適当なこと書いていてもその場で実行して結果を確かめることができるので便利です。主にweb系のプログラムにこれが用いられます。現にこのテキストもhtml,javascriptという言語で書かれているので、この方法が用いられています。この方式のデメリットは、1行1行翻訳して実行してるので実行速度が落ちてしまいます。ですので、動きのある凝ったゲームとか作りたいならこの方式はあまり推奨されないでしょう。

コンパイル方式とは、プログラミング言語で書かれたプログラムを、機械が理解できるデータに変換して、普通はそれをファイルとして保存するということをします。この保存されたファイルの拡張子は.exeだったり。実行の段階では、もう構文解析とか機械語への翻訳は終わっているので、最適な実行速度が得られるわけです。まぁ、バグを取り除く作業(デバッグ作業)はいちいち大変なんですけどね汗 C言語は主にこの方式をとっています。

詳しく知りたい人は参考書で調べるなりgoogle先生なりに聞いてね♡

参考:http://www.geocities.jp/naosacra/mops/forbeginner/2.html

3.プログラム言語の種類

プログラム言語はいっぱいあります。ほんといっぱいあります。

身近な例を挙げてみましょう

NINTENDO64
アセンブリ, C/C++, 他
minecraft
Java
艦これやスマホゲー
PHP, JavaScript, Object-C, Java, C++ 他
3Dゲーム
C#やC/C++
東京理科大ホームページ
HTML, JavaScript, CSS 他

たぶん、1年生の皆さんはゲームを作りたいと思うのでこれからゲーム作りに使うであろうライブラリや統合開発環境を紹介しときます。

ライブラリ
Unity, DxLibrary, OpenGL, DirectXSiv3D
統合開発環境 (IDE)
Unity, VisualStudio, eclips, NetBeans, QT Creator

ライブラリとは、関数がいっぱいあるソースコードのことで、例えばDirectXだと描画や音楽についての関数がいっぱいあります。
これを駆使することにより、根幹のプログラムを自分で作る必要がなく、作品に力を入れることができます。バグも減るし。だいたい全部自分で書くなんてめんdじゃないですか。

IDEとは、プログラムを書くためのエディタ、プログラムをコンパイルするビルドツール、不具合を修正するためのデバッガなどを1つのUIで提供するものです。 IDEは重く、画面を専有するなどの理由でエディタと端末エミュレーターのみで開発する人もいますが、今日では少数派です。

4.どんな流れでコードが処理されているか

大抵の場合、コードは上から下にコンピューターは読み取ります。C言語でも同様です。

例えば

int a = 10;
printf("a=%d",a);

とすると

a = 10

となりますが

printf("a=%d",a);
int a = 10;

という順番にすると、コンパイラに「printf内のaってなんすか?」って怒られます

関数を宣言するときも同じです。

大事なことなのでもう一度

原則として、コードは上から下にマシンは読み取ります。

5.C言語で開発するメリット・デメリット

長所

短所

その他C言語に対する不満から開発が行われた言語がいくつかあります。

 

6.ビルドの流れ

ビルドの流れ
プリプロセッサ
プリプロセッサとは、#includeや#define,#ifndef,#endifなどのプリプロセッサ分を解釈し、コンパイラへの入力を作成します。
ざっくり言うと、#includeとか#defineが先に読み込まれるってことだね。
コンパイラ
コンパイラは、ソースコードを機械語に変換します。機械語に翻訳したあと、オブジェクトファイル(UNIX系なら拡張子.o)を作ります。
リンカー
リンカーとは、オブジェクトファイル(複数個の場合がほとんど)とライブラリを結びつける働きをします。オブジェクトファイルにバグがあると正常に機能しません。
この時点でグローバル変数、static変数などの配置を決めていたりします。
Makefile
Makefileには例えば「○○.cというソースファイルをコンパイルして、○○.oを作成する」といったようにビルドする時の手順が細かく書かれています。
https://github.com/yumetodo/2015_C_Textbook/blob/gh-pages/src/strstr/GNUmakefile
みたいなやつです。
ソースコードに変更があった時だけコンパイルとかを実行できます。別にコンパイル以外のことも実行できるんですけどね。
なお大規模になるとMakefileからMakefileを呼び出すことができます (再帰)。
[Visual Studio]プロジェクトとソリューション
Makefileは細かく色々指定できて確かに便利なんですが、UNIX環境用に開発されているということ、IDEを想定していないことからVisual Studioとは相性が悪くなっています。
Visual Studioにはその代わりにプロジェクト(拡張子vcxproj)とソリューション(拡張子sln)があります。
普通ソリューションには多くても3つ、殆どの場合1つのプロジェクトがあります。プロジェクトごとにいろいろオプションを変えられたりするわけです。
便利。これのお陰で「実際この記事を書いてる私はMakfileを作ったことないです。」という発言が飛び出るくらいには。

デバッグ、デプロイ

デバッグとは、デ(de:取り除く)バッグ(bug:バグを)の意味です。どの時点でバグが起きたのか、今どんな状態なのかを確認することができます。

デプロイとは、プログラムを実際の運用環境に展開することです。

参考サイト
ビルドは何をしている? [VC++の使い方]
http://www.nitoyon.com/vc/tutorial/project/build_detail.htm
VC++ Tips - About Library
http://www.bb.wakwak.com/~yamaguchi/takashi/Software/VCPP-Tips/AboutLib.html

7.プログラミングの鉄則

めんd精神

多くのプログラマーの中での共通認識が有ります。それは

めんd

です。いかに面倒臭がるか、いかに手を抜くか、いかに楽してプログラミングするか、という意味です。 Perlというプログラミング言語を開発したLarry Wallはこんなことを言っています。

"We will encourage you to develop the three great virtues of a programmer: laziness, impatience, and hubris."

訳: 「私達は, 怠惰, 短気, 傲慢という3つの偉大なプログラマの徳をはぐぐむ後押しをします。」

最小の労力で同じ結果を得ましょう。
ここでもその精神を尊重し、「めんどう」と書くのも面倒という「めんd」精神により、省略しました。

たくさんコードを書く人はよくないプログラマー

そのうち関数の説明で最長不倒関数なんてものもお目にかけることができると思いますが、もうね、本当に頑張ってたくさんコードを書く人がいます。
その昔(昔だといいね)プログラムを、行数(長さ)で評価し、一行○○円なんてこともありました。怒ったプログラマが、プログラムの提出時にそこら辺の財務関係の資料を混ぜてかさ増しすることもあったとか。
業界の闇ですね。
そんなことを、これからプログラミングを学ぼうという人にやってほしくありません。
なぜならば、不可能な物量の仕事を効率化して実現可能にするのがプログラマーの仕事だからです。
というわけで僕から一言。

プログラム 書かなければ バグらない

当たり前のようで忘れがちです。ついつい一から自分で作ろうとしてしまいます。あなたがやろうとしていることは大抵誰かがすでにやっています
biboro(旧称:codegarage)Qiita(キータ)とかgoogleを検索するといいんじゃないかな。

まとめると、可能な限り書くコード量を減らすことが大事ということになります。そのために先ほど言ったライブラリーがあるのです。

コンパイラはプログラマの心を察してくれない

コンパイラも一つのプログラムです。決められた規格に従い、書かれたプログラムを適切に変換する作業を行うのがその仕事内容になります。
したがって、コンパイラはエスパーではありません。なのでここはこうだろうと察してはくれません。書いたとおりにしかコンパイルしてくれません。

書いてないことはやってくれない

コード量を減らすことは大事です。でも処理は必ず全部書かなければいけません。
いや、なんでこんなこと書くかというと、ものすごいレアケース・・・というわけでもなく、わりとこういう誤解をする人がいるからです。
可能な限り書くコード量を減らすの意味を取り違えて書かなきゃいけないことも省く馬鹿。

[迷信] コンパイラはプログラマの心を察してくれる | 株式会社きじねこ

8.コンパイラーの種類

組み込みまで考えだすと数えきれないほどのコンパイラーが存在しますが、有名どこを上げると概ね4つになると思います。

GNU C Compiler(gcc)
GNU Public License(GPL)で開発が続く超有名無料のコンパイラー。そこそこ規格準拠も早く、大抵のLinuxには標準で入っている。コンパイル環境を選ばない。
Clang
gccの対抗馬でgccを完全に置き換えることを目指すコンパイラー。University of Illinois/NCSA Open Source Licenseで開発されており、gccよりも規格準拠が早いことが特長。
Visual Studio (VS)
Microsoftが開発しているIDEで, Visual C++ (VC++) と呼ばれるC/C++コンポーネントもあり、それにコンパイラーも含まれる。
話しにならないくらい規格準拠が遅いが、IDEのデバッグ機能が他の追従を許さないくらい優秀すぎるため、幅広く使われている。
コンパイラーだけclangに差し替えるclang-clというプロジェクトもあるけど実用にはまだ耐えない。
おのれMS
・・・とおもいきや、VSでClangを公式サポートするらしい。
Intel C Compiler(ICC)
x86 CPUでは最強のコンパイラーかもしれない。比較的優秀なIDE(統合開発環境)と世界最強のコンパイラー。これに勝るものはなし。ただしお値段10万円ほど。VCほどじゃないけど少し規格準拠が遅い。