2015年2月8日日曜日

すたんだ〜ど いんぷっと あうとぷっと▼
























 あまり画像で前置きするのはよくなかっただろうか?ということで、真面目に文字書きをしていたら飽きてしまったのでこうして変なことを書き始めて見た次第です。

 さて、プログラミングをする皆さんは初めて書いたプログラミング言語は何でしたか?私は実はFORTRANでした。別に私の年代がそうだったわけではなく、たまたまFORTRANだっただけで、当時は全然プログラミングにも興味がわかなくて、ただ必要だったから仕方がなく書いた程度のことです。その後、高専に入ってからはポケコン(PC-G850VS)なんていう玩具を手に入れてBASICを書いてみたりもしたわけです。

結構ポケコンは好きで、今でも玩具として、それ以上にやたら高性能で使いやすい(?)関数電卓として使っています。BASIC以外にもアセンブリを書いたことも(当時は全くの無知でライントレースロボットの動作速度をソフトウェア的に向上出来ないだろうか?と必死に努力していたが、結論からいうとハードウェア的な調整をしたほうがはるかに効果的だった・・・というw)。そしてもちろんCも。

ただポケコンで書くCって色々と大変なんです(笑)VSではコンパイル出来たほんの数行のソースコードですらポケコンではsyntax error...結構メンタルが折れます。それでも、ポケコンは11pin端子で8bit制御出来たりして楽しかったので色々と遊んでいました。何だかんだ高度なことはしなかったので、BASICで十分だったわけですね。

 実は、情報系のシフトするきっかけになったのはポケコンではないのですが、この辺りの話はまたあとで(笑)

(ところで、PC-850シリーズ用のプリンタやACアダプタはどこかで売っていないのだろうか・・・?ご存知の方がいれば教えて欲しい。)


 さて、無駄に長い懐古録も終わったところで。今だと大学や高専、あるいは高校もなのでしょうかね?その辺りでプログラミングを初めてやるぞ~となると一般的にはC言語から入るものらしいです。事実、私も今の大学に来て初めて触ったプログラミング言語はC言語でした。

まず初めにC言語で書くソースコードといえば

 #include <stdio.h>

 int main(void){
     printf("Hello World!");
     return 0;
 }


だったりすることが多いですよね。(というか多くの言語で初めて書くのはHello World!な人が多いよね)

 初めて書くと1行目でいきなり"studio.h"と書いてしまってコンパイル通らないこともよくある話でしょう。確かにstdioとstudioはよく似ているし、後者は実際に英単語ですから間違えやすいのもよくわかります(笑)

stdioはstandard I/O でstandard Input Output で標準入出力だーと知ってしまうと全然間違えない、あるいはその頃にはもう書き慣れてしまっていて間違えないか、あるいはその頃には非常に優秀な開発環境、エディタを手に入れていてエディタが候補を教えてくれるから間違えないでしょう。

 そのstdio.hはヘッダファイルというやつでね、これを読み込むと初めてあーだーこーだと関数を使えるだよ~なんてことを習うわけですね。自分はもともと機械系で、もっといえば分解大好きな人間でどうしても中身が気になるのです。まぁ機械系に限らず理工系の人たちは分解が好きな気がしますね。知らないけど。

stdio.hの中身が要するに本日の画像なわけです。この中にあるのは要するに入出力に関係する関数とマクロなんですね。そもそもに何が書いてあるか?と私に解説を求められても難しいので、当たり前の話だけをすることにしましょう。

 そもそも、コンパイルということをしなければ当然ソースコードは意味が無いのです。そのコンパイルをするときにコンパイラに送られる前にプリプロ(=プリプロセッサ)がコンパイラに送るために色々とゴニョゴニョします。

ソースコードの中でも#から始まる部分(例えば#include あるいは#define など)がそのプリプロに対する指示なわけです。

そして今回見ているstdio.hですが
 #include <stdio.h>
と書かれてソースコードの中にいらっしゃるわけです。#includeとは「#include <hogehoge>と書かれている部分はhogehogeというファイルの中身に置き換えてしまってくださいね~」とプリプロに対して命じるものです。したがって、プリプロに通した段階で少なくともたった1行の
#include <stdio.h>
は1000行近いすごいやつに置き換えられるのです。すごいね。

 さて、stdio.hの中身についてですがキーポイントになるのは
 #define
 #ifdef~#endif
です(というかそれくらいしか分からない(*ノω・*)テヘ)

基本的に#defineは文字列の置き換えを指示するものなので例えば
 #define foo hogehoge
とあればプリプロによってfooはhogehogeに置き換えられることになります。

また#ifdef~#endifはifの辺りからも察せるように条件付きなのです。具体的には
 #ifdef HOGE
 ...
 ...
 #endif
とある場合には、もしHOGEが置き換えられていたら#ifdef~#endifまでに書いてあることを読んでねーとプリプロに言ってます。

 この他にも色々と出てくるのですが#ifや#elseは基本的にいつも使うのと同じという解釈で大丈夫だと思います。まぁマクロについてはσ(゚∀゚ )オレシラナイという感じなのでエロい人に聞くことにしましょう。

ついでに1つざっくりとしたことを書くとextermと随所に出てきますが
 extern int foo;
とあれば、それは「他のところで定義してるから使うぞ~と宣言だけするよ」というものになります。

とりあえずこんなもんでしょうか。(結構いい加減な書きものなのですごい人たちに怒られてしまいそうだ...w初学者のメモだから許してちょ♡)

▼以下 きちんと知りたい人のための参考文献
   ・プリプロセッサリファレンス- https://msdn.microsoft.com/ja-jp/library/y4skk93w.aspx
   ・ITpro プログラミングの謎を解明する第10回- http://itpro.nikkeibp.co.jp/article/COLUMN/20100219/344843/
   ・C/C++ Reference[英語]- http://en.cppreference.com/w/