[WebP Vol.014] Cプログラミング ~コンパイラとリンカ~

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
【 Webプログラミング Code Sample 】                          Since2001/11/23

                  Code014: Cプログラミング  〜コンパイラとリンカ〜

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
                                                    Produced by ichikoro.com

           ▼毎週月曜日配信です。
           ▼等幅フォントでご覧いただくとキレイに見えます。
           ▼登録・解除はこちらから可能です。
               < http://www.ichikoro.com/webp/ >
                  ※バックナンバーへのリンクもあります。
                  ※お友達にもぜひお勧めください(^^)/


─【Contents】───────────────────────────────
    01.Review  .................. 前週のおさらい
    02.Guide  ................... コンパイラとリンカ:その1
    03.Guide  ................... コンパイラとリンカ:その2
    04.Guide  ................... コンパイラとリンカ:その3
    05.Guide  ................... コンパイラとリンカ:その4
    06.Sample  .................. エラーとワーニング
    07.Question  ................ 今週の問題
    08.News  .................... 今週の気になるニュース  ←今週から始まりました




最近お別れが続いています。


先月、2年余り住んだ街を離れたというのは最近のメルマガでお話しましたよね。
その影響で、今までに読んだ大量の本たちを今日はブックオフに委ねてきました。
いいひとに読まれ続けてください。

昨年末から調子の悪かった愛しのテレビも、ついに電源が入らなくなってしまいまし
た。中学生の時から大体10年くらいでしょうか。長い付き合いなだけに涙が出そうに
なりました。思い出深いやつでした。当時14型で2万円は格安でした。今までありがと
う。

私がまだ高校生だった頃にはじまった(ハズの)GTOも終わっちゃいましたね。
(なんて書いてると年齢がバレテしまう(笑))反町が主演でドラマになるわ、映画になる
わ、社会現象になってましたからねぇ。

    ・ふじさわでGOーっ!!
     http://fujisawa.comic.to/index2.html
        ※の割に初めて訪れましたな(^^;


会社でも先月お別れがあったのですが.....(編集後記に続く)


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  01.Review  「前週のおさらい」
──────────────────────────────────────

前週はコンパイラのセットアップをしました。では具体的にどんなことをしていたの
か、解説するところから入りたいと思います。あ、そうそう今後はWindows+Borland
C++をベースに解説しますが、基本的な部分は全て同じです。


前回のプログラムは、

    #include<stdio.h>

    int main(int argc, char **argv)
    {
        printf("Hello! World\n");

        return(0);
    }

でしたね。
ざっと流して解説します。詳しいことは次以降に説明しますので。

基本的にプログラムは命令文を書き連ねたものです。
上から下に向かって実行されていきます。


    1行目:
        printfを使うために必要。
        stdio.hというファイルをここに読み込みます。
        このファイルの中にprintfの中身が入ってます。
            ※厳密に言うと違うんですが、こんなイメージです。

    3行目:
        メイン関数と呼ばれています。。
        この下に書いてある { から } までがメイン関数です。
        この中にプログラムを書いていきます。

    5行目:
        printf("文字列")
        文字列の所には好きな言葉が書けます。
        これは、ディスプレイに文字列を出力しますよっていう命令(関数)
        です。\nは改行を示します。

    7行目:
        普段は書かなくても動作事態に問題はありませんが、
        コンパイラや設定によってはワーニング(警告)が出ます。


さてさて、上記のプログラムを実行するために前回やった手順は以下の通り
でした。

    (1)プログラムの準備(hello.c)
    (2)以下のコマンドを実行(コンパイル)

        C:\>bcc32 hello.c

    (3)hello.exeが作成される
    (4)hello.exeを実行

基本的に、プログラミングはこの作業の繰り返しです。
間違いや修正したい箇所があれば、1から順番に行います。


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  02.Guide  「コンパイラとリンカ:その1」
──────────────────────────────────────

(1)についての詳しいことはこれからじっくり解説するとして、(2)は一体どんなことを
しているんでしょうか?とはいっても大体察しはついていらっしゃると思いますが(^^;

(2)の作業を、一般的に“コンパイル”と呼びます。このコンパイルをするソフトウェ
アのことを“コンパイラ”と言います。つまりこのメルマがで取り上げているBorland
C++ はコンパイラなわけです。

もう少し詳しく言うと、“リンク”という作業も同時に行っています。
このリンクを行うソフトウェアのことを“リンカ”といいます。正確に言うとここで
言っているBorland C++はコンパイラであり、リンカでもあるわけです。1台2役なので
す。

その証拠に

・実行例
C:\>bcc32 hello.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
hello.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
という具合に、まずコンパイラ(Borland C++)が起動し、続けざまにリンカ(Turbo In cremental Link)が立ち上がっているのが確認できると思います。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 03.Guide 「コンパイラとリンカ:その2」 ────────────────────────────────────── では、コンパイルとリンクをすることで一体何のメリットがあるんでしょうか? コンピューターは、C言語を直接理解することはできません。なぜならC言語は人間が 理解しやすい、プログラムを作りやすいように考え出されたものだからです。Javaや Perlも人間が理解しやすいといえます。この人間に近い言語の事を一般的に『高級言 語』と呼びます。 また、その逆に『低級言語』と呼ばれるものがあります。コンピューターくんは基本 的にこの低級言語に属するものしか読むことができません。このコンピューターが読 める言語は、「機械語」と呼ばれます。 早い話、コンパイルとリンクは、 高級言語(人間向け)  →  機械語(コンピュータ向け) という変換を行っているのです。 翻訳家さんみたいな感じですね。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 04.Guide 「コンパイラとリンカ:その3」 ────────────────────────────────────── じゃぁ、コンパイラとリンカの違いは何なのでしょうか? まずコンパイラのお仕事は下記の通りです。 (1)文法が間違っていないかチェック → もし間違っている場合はエラーを出して終了 → 怪しいんだけど文法的に正解の場合は、ワーニング(警告)を表示。   この場合はそのまま次の工程に移る。 (2)低級言語、もしくは機械語に変換 → ちなみに、hello.objがこの変換をしたファイルになります。 作成された oooooo.obj というファイルを、『オブジェクトファイル』と呼びます。 これは完全な機械語のファイルではなく、まだ実行できる段階ではありません。さら にいくつかの必要な部品を取り込み、その上コンピューターに正しく命令を与えるた めの正しい位置にセットして、ようやく動かすことができます。 それを行うのが「リンク」なのです。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 05.Guide 「コンパイラとリンカ:その4」 ────────────────────────────────────── リンクという言葉には、つなぎ合わせるという意味があります。実行できるプログラ ムを作るために、必要な部品を用意してつなぎ合わせる作業がリンクです。 もう少し具体的に説明しましょう。 例えば下記のプログラムの場合、 #include<stdio.h> int main(void) { printf("hello!"); return(0); } printf(" ")はダブルコーテーションの間を画面に表示させろという意味ですが、こ の命令(関数)は、あらかじめコンパイルされた形で提供されており、リンカは所定の 場所から、printfの働きをする部分を引っ張り出してきます。 また、C言語は複数のファイルにプログラムを分けることができます。 詳しいやり方は後ほど出てくると思いますが、そのような場合もリンクの段階 で組み合わされます。 こうして必要な物が揃ったら、「ooooooo.exe」が作られます。 これだけの過程を経て、ようやく実行可能ファイルが作成されるわけです。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 06.Sample 「エラーとワーニング」 ────────────────────────────────────── 上でチョコチョコっと出てますが、コンパイラとリンカが出すメッセージは 大きく分けて二つに分類されます。 ・エラー ・ワーニング(警告) エラーの場合は実行ファイルの作成まで行われない、致命的なミスに 当たります。文法が間違っていたり、スペルミスなどが原因だったりします。 プログラムを見直し、もう一度コンパイラにかけましょう。 ワーニングはというと、   “間違ってはいないけれど、あまり好ましくない表現(処理)です”   “もしかしたら本来書きたかった物と違っていませんか?” という意味合いになります。 例えば、前回のメルマガで紹介した #include<stdio.h> int main(int argc, char **argv) { printf("Hello! World\n"); return(0); } の場合、ワーニングが出たと思います(ごめんなさい、ごめんなさい、ごめんなさい)。 これは、コンパイラが   “もしかしたら本来書きたかった物と違っていませんか?” と解釈したためです。 まさにその通りでした(^^; ※でも実際の動きに問題はありませんでしたよね? では、下のプログラムのエラーを予想してみましょう。 といってもC言語については何も解説していないので、分からないと思いますが(^^; #include<stdio.h> int main(void) { printf("Yahoo!") return(0); } C言語では何らかのステートメント(文)を記述したら、その最後にセミコロン(';')を 書かないといけないルール(文法)になっています。「ここで終わりだよ」ということ を教えてあげるわけです。 この場合、上のプログラムは printf の後に 「セミコロンがないよ。おかしいんじゃない?」 って内容のエラーメッセージが出ます。
・実行例
C:\>bcc32 hello.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
hello.c:
エラー E2379 hello.c 6: ステートメントにセミコロン(;)がない(関数 main )
警告 W8070 hello.c 7: 関数は値を返すべき(関数 main )
*** 1 errors in Compile ***
見ると分かると思いますが、Turbo Incremental Linkが起動していません。 つまりリンクの作業まで行っていないということです。これは4項で説明した 通りです。 じゃぁ、次の問題です。 #include<stdio.h> int main(void) { pri("Yahoo!"); return(0); } priなんて命令(関数)は、C言語にはありません。 でもこれは文法的に正しいので下記のような結末が待っています。
・実行例
C:\>bcc32 hello.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
hello.c:
警告 W8065 hello.c 6: プロトタイプ宣言のない関数 'pri' の呼び出し(関数 main )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 外部シンボル '_pri' が未解決(C:\HELLO.OBJ が参照)
コンパイラはワーニング(警告)を出しましたが、そのままリンカが起動しています。 で、 「priなんて部品はどこにもないぞ?何これ??」 というメッセージを出して、終了してしまいました。 つまり、コンパイラは文法のチェック(とオブジェクトファイルの作成)しかやってい ないためです。その後、各部品をつなぎ合わせるのはリンカーに任せてしまっている ため、このようなことが起こります。 ※逆にこれを理解しておくとデバッグ(プログラムの修正作業)が、格段に  楽になります。 これでリンクとコンパイルの役割の違いがなんとなくわかっていただけたでしょうか? まぁわかんなくても、今のうちはあんまり困りません(笑) そのうち必要になれば、スンナリと頭に入ってくると思います。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 07.Question 「今週の問題」 ────────────────────────────────────── 今後は、復習と予習も兼ねて一問だけ問題を出題することにします。 Q1.ディスプレイにあなたの名前をローマ字で3回表示さるプログラムを 書きなさい。ただし一回名前を表示させる度に改行すること。 方法は問いません。
・実行例
C:\>bcc32 sample.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
sample.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

C:\>sample
M.Katsube
M.Katsube
M.Katsube
解答は次回配信時に! ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 08.News 「今週の気になるニュース」 ────────────────────────────────────── 今週からサックリとついてくる、おまけコーナーです。 ネット系の話題を当分しないと思いますので。 突然無くなったり気合が入ってない週があるかもしれませんが、笑って許して ください(アッコ調)。主にIT系です。っていうか“IT”ってもう死語ですよ ねぇ...(^^; ■1月28日(月) 『NTT西日本など、フレッツユーザー向けファイル共有サービスを提供開始』  http://www.watch.impress.co.jp/internet/www/article/2002/0128/ntt.htm  セキュリティー大丈夫なのでしょうか?ナプスターみたいに問題になったりし  ないのでしょうか?でも実現したらすごく面白そうですね!(^-^) ■1月29日(火) 『JR東日本、“インターネット対応次世代通勤電車”の試験運用を2月開始』  http://www.watch.impress.co.jp/internet/www/article/2002/0129/actrain.htm  というか、新幹線につけてください(グリーン車)。世の中のニーズを本当に理解  してるんでしょうか?(ボソ)通勤中、ケーブルが絡まったおじさんたちの阿鼻叫  喚の叫びが脳裏をよぎりましたが、これはこれで携帯電話とはまた違った、新し  いインターネットの可能性が広がりそうで興味大ではあります。というか携帯電  話がこれを利用するようになったりしそうですね。 『Webサービスに対応した「C++Builder6」を今年発表〜米Borland』  (Linux版C++Builderも発表予定)  http://www.watch.impress.co.jp/internet/www/article/2002/0129/borland.htm  あまり真面目に読んでないんですが、この“Webサービス”って何を指すん  でしょう?とりあえずクロスプラットフォームになるのは、CodeWarriorと  正面対決するつもりなんでしょうか?むー、どっちを応援すればよいのだ  ろう(^^; ■1月30日(水) 『Yahoo! BB がんばります宣言!?』  http://japan.internet.com/busnews/20020130/2.html"  これを見てディスプレイを殴りたくなった人が日本にどれだけいることで  しょう(^^; 『シャープの“インターネット電子レンジ”がさらに進化?』  http://www.watch.impress.co.jp/internet/www/article/2002/0130/sharp.htm  うーん、もうヒトコエでしょうか。  まだ実用レベルじゃないですねぇ。 『英国家庭のインターネット普及率は45%〜1年間で1.5倍に増加』  http://www.watch.impress.co.jp/internet/www/article/2002/0130/oftel.htm ■1月31日(木) 『Windows 2000 SP2のセキュリティ修正パックが公開 - 適用を推奨』  http://pcweb.mycom.co.jp/news/2002/01/31/16.html バグが発見されるたびに、「不良品を売るM$の功罪」みたいなことが言われます が、正直その議論はナンセンスだと思います。M$は個人的に嫌いなのですが、簡 単にアップデートする手法を提供しているのですから。Macも8.5くらいから自動 的にアップデートしてくれる機能がつきましたよね?人間が作ったものなんだか ら、バグの一つや二つあって当然です。問題はいかにその後の対処をするかでは ないかと。携帯電話も、以前は頻繁に回収してましたが、これもそのうち自動アッ プデートみたいな機能がつくんでしょうね。 ■2月1日(金) 『Linuxの「標準仕様」リリース』 http://www.zdnet.co.jp/news/0202/01/e_linux.html 携帯電話も早く標準仕様を定めて欲しいものです。 『NTT、ADSL加入増狙い、初期費用72,000円なくす「加入電話・ライトプラン」』  http://pcweb.mycom.co.jp/news/2002/02/01/22.html 私はこれを日経かなんかで読んで、昨年末にINSネット64・ライトに加入しま した。加入権も今では3〜4万くらいで買えるんですが、無駄なお金を払うのが シャクだったので(^^;   ※まだインフラが整備されていない頃は必要なお金だったのだと思いますが。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 編 集 後 記 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 今週も概要に終わってしまいました。 変数までいきませんでしたね(^^; 来週はがんばって原稿書きます! で、冒頭の続きです。 会社でも、先月末にお別れがありました。 今の会社に正式に入社して一ヶ月経っていない頃、転職されてこられた5歳(?)年上の お姉さんでした。1年強同じグループでやってきたこともあり、色々思い出深いです。 といって思い出されるのが、迷惑かけ通しだったなぁという事ばかりで今でも胸が痛 みます。もう少し力になって上げれればと思う反面、まだまだ子供だった上に(今でも あんまり変わらないような気がしますが)、意固地な性格が...というよりは勇気がな かったんだと思います。もっと人間的にも社会的にも頼られるくらい、大人になりた いと思って止みません。 どこかでバッタリ会ったときに、胸を張っていられるように生きていきたいです。 お元気で。体には気をつけてください。いつか、どこかで。会えてよかったです。 ---------------------------------------------------------------------------- ★相互広告募集のお知らせ ---------------------------------------------------------------------------- Webプログラミングでは、読者数を増やしたいメルマガ発行者さんを募集していま す。お互いに一定期間(1〜3回程度)広告を掲載しませんか? 詳しいことは、Subjectに「相互広告」などと付け、下記のメールアドレスにお送 りください。 mm-webp@ichikoro.com ちなみにこちらの発行部数は毎回フッタに掲載しています。  信用ならないという方はこちらを   ・メールマガジン発行部数ランキング    http://pro.que.ne.jp/magzine/mag2/     ※日曜更新だそうですので、多少タイムラグがあるかもしれないです。 ---------------------------------------------------------------------------- ★コラム募集のお知らせ ---------------------------------------------------------------------------- Webプログラミングでは、寄稿していただけるコラムやプログラムなどを募集して います。最近疑問に思っていることや、めっこりと作ったプログラムやシステムに ついて語っていただいたりと、テーマは基本的に自由です。たくさんの読者の方に あなたをアピールする場にもなります。ぜひ有意義な情報やご意見をお送りくださ い。 Subjectに「コラムへ寄稿」などと付け、最後に簡単な自己紹介をお願いいたしま す。ご応募は下記のメールアドレスにお送りください。 mm-webp@ichikoro.com ※必ず、著作権をもたれた方、ご本人がご応募ください。 ※著作権が、Webプログラミングにわたる物ではありません。 ※編集の都合上、加筆・修正や変更のお願いをすることなども ございます。またご応募いただきましてもご遠慮いただく場 合もございます。あしからずご了承くださいませ。 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 【 Webプログラミング Code Sample 】 発 行 : ichikoro.com 発行責任者 : 勝部 麻季人 < katsube@ichikoro.com > 発行部数 : 1616部(前回) Webサイト : < http://www.ichikoro.com/webp/ > お問い合わせ先 : < mm-webp@ichikoro.com > Powerd by まぐまぐ All Right Reserved, CopyRight(C) 2001 Webプログラミング Code Sample ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■