This is C <C. >

 

タイトル                               <for Title. >

公開研究所(案内)              <for openLaboratory. >

プログラム部門(案内)         <for program Entrance. >

C言語研究室                      <for C Language research Room.>

 

 

C言語研究室1 <Room 1 for C Language.>

 

 

索引

 

         雑談

 

まず初めから。

 

次の問題?

 

構造?

 

 

(索引の終わり)

 

雑談 <Talks >

 

トップダウンとボトムアップ

 

 

トップダウンとボトムアップ

2/27/03 6:12:43 PM JMT

 

 C言語というものを考えてみる場合に、トップダウンからの視点とボトムアップからの視点が考え得る。

 

 

 

 

 

 

 

(“トップダウンとボトムアップ“の終り)

 

本文 <Articles >

 

 

 

まず初めから

 

              int main(int argc, char *argv[], char *enpv)        について

 

改定:追補2/27/2006 2:51:44 AM JMT

 

 と、言うわけで、C言語であるからには避けられない問題である、 main (慣習的に“めいんかんすう“と発音されている)関数である。

 

 避けられない理由は、”main”という名前の関数から、プログラムは始まり、通常の場合には、この関数によって、プログラムが終わる、からである。

 Hello world”という、C言語の慣習的な、“第1歩プログラム“を学んだことがあるならば、この関数以外には、関数が存在しないプログラムをみたことがあると思うが、一般的なC言語プログラム(アプリケーションに類するものすべて、である。)は、実は、このmain関数以外には、関数が無いプログラムと、同等である。

 つまり、以下の図のような図式で、メイン関数についての詳細な記述を行うだけで、本質的には、hello world と同様の構造持っているのがC言語の一般的なプログラムとなるのである。以下の図1を参照のこと。 言い方を変えると、C言語によるプログラムとは、main関数についての、詳細な記述によって複雑化するものである。

 このC言語の性質については、並列処理型プログラミング言語、HTMLなどの環境記述型言語[1]ADAのような例外併記記述言語[2] などの新型言語を派生させる理由ともなっていると、いえるだろう。

 

図1

 

 

 このmain関数の定義[3] には、かなりの意味合いが存在している、が、システムとの接合部であることからも、記述と意味については、固定的である。

 

 最初の “int” は、関数の型を意味している。 MS-DOS などのコマンドラインから起動した場合の、プログラムの返り値の方である。加えて、C言語では、このmain関数の型は、変えることはできずに、常にint型となる。(慣習的に16bitである。すっきりしない部分もあるのであるが、これは余談。)

 

argc とは、 引数の個数を表す変数である。 プログラム名が、先ず次のargv の最初の要素となるので、常に1よりも大きくなる、という特徴がある。

argv とは、引数そのものを示すポインターの配列である。内容的には、文字列へのポインターの配列となっており、数値そのもののデータではない。

次の、envp とは、環境文字列へのポインターである。言語によってはサポートしていない、引数ではある。

 

 以上の引数(関数へと渡される値)をいれた変数は、省略も可能である。

 

 という訳で、最小のC言語プログラムは以下の用になる。

 

main(){}

 

              という、1行である。

 

 解説すると

省略により、デフォルトの型が、メイン関数に定義され、これは、メイン関数の規約による型と一致する。

              同じく、引数の省略が、行われる。

              処理内容は、“すぐに、プログラムを終了せよ。“、ということになるだろう。

 

 以上。

 

 

(“まず初めから“の終わり)

 

 

次の問題?

 

              プリプロセッサとは?

 

追補:2/27/2006 3:14:36 AM JMT 近藤敏郎

 

 プリプロセッサというC言語の企画の以前に、説明しなければならないことが、先ず存在している。

 つまりは、

              1            ソースコードの記述              : editor

              2            プリプロセッサ処理              : CPP

              3            コンパイル                          : CC

              4            リンク                                  : Linker

 

              という段階を経て、プログラム実行形式ファイル, .exe[4] が作成されるということである。

              その昔のコンパイラーの開発についての逸話等が、プログラマーの世界でささやかれなくなって久しいが[5] コンパイル(というよりもアセンブル作業とリンク作業、である。まあ、リンク作業という用語の代わりにロード作業という用語が使われていた、環境と言語も存在するのではあるが。)作業が、もっと大変な時代もあったのであるが、それはそれとして。

 

1については、

 ど゙のようなプログラムにするのかの具体的な定義を行う段階、であるといえるだろう。あんまり楽になっていないことも含めると、あれこれと改良しがいがあるし、するべきな段階だといえるだろう。エディターなど、プログラマートーク的には好まれるし、あれこれと楽しい段階ではあるが、この文章では省略する。

 

2については、

 後で、説明する。

 

3については

 具体的に、人間の言葉(C言語などの人工言語、プログラム言語である)から、機械語(コンピュータの言葉、マシンランゲージとも言う。[6])に変換する作業である。

 

4については

 機械語になったプログラムを実行可能な形式へと変換する作業である。歴史的経緯と、データ(一般的なプログラムに関連した情報群の意味)の扱い等の理由から、リロケータブルオブジェクト(リンカブル)形式のコンパイラが主流である。もちろん、専用言語などによる、1パス式(コマンド1発型コンパイル)コンパイラも、比較的ポピュラーであるといえるだろう。

 

 という、訳で、ソースコードをエディターで書いて(たいてい、テキスト形式で、シフトJIS、あるいはあんまりポピュラーじゃなくなっているASCII形式ファイル)、コンパイルして、リンクして、出来上がり、というのが、プログラム・コンパイル作業であるといえる、だろう。

 

 さて、プリプロセッサである。

 予測の方がついたかたもいるとは思うのだが?

 

実は、プログラムとコンパイルの補助作業を行う段階である。つまりは、プログラマーとコンパイラーの便利を図っているのがこの段階であり、CPPといわれるプリプロセッサというツールの仕事である。

 具体的には、

              インクルードファイルを展開、つまりは取り込んで、1本のファイルに直す、作業とか

              指定文字列を 指定されている文字列に置換する、

              などの作業が、この段階で行われるのである。

C言語からとも、C言語が開発されつつあった環境(コンピュータの環境という意味合いである)で開発されたとも言われている、ツールであり、概念であり、作業である。フォートランなどや、アセンブラーでも、使用されることがあるので、覚えておくといいかもしれない。

 M4GREPFINDなどが、実は、このプリプロセッサといわれるツールの仲間であり、マクロ記述可能な文章編集、文章処理ツールという分類に入る。

 器用なプログラマーは、プリプロセッサーをワードプロセッシング(ワープロを使用した文章作成と編集)にも使用するといわれている。未確認ではあるが…

 

という訳で…

 プリプロセッサ命令とは

              C言語のソースコードに入り混じって書かれている、他のツールへの指示(言語)である。

              C言語の規約、企画の中に含まれており、尚且つC言語ではない。

 C言語のソースコード、あるいは、ベーシック言語の中にC言語のプログラムがいきなり現れるとかは、かなり異常な事態だと感じられると思うが、プリプロセッサ命令は、事実、その様な形式で、組み込まれており、使用される。たいていのプログラマーにとっては、C言語のマイナーな使用よりも、身近に感じられるステートメントとなるといえるだろう。

 

 具体的なプリプロセッサー言語、命令については

              常に、文頭から始まる。(フリーフォーマット形式をとっているC言語ではなく、分処理言語である為。)

              常に、#文字からコマンドが始まる。

              という特徴を持つ。

 

ソースコードの作成の際には、使用するコンパイラ付属のプリプロセッサのマニュアルを参照のこと。

 恐らくは、標準的なCPP仕様となっている筈では、あるが。

 

以上。

 

 

(“次の問題?”の終わり)

 

構造?

2/28/2006 6:36:43 PM JMT 近藤敏郎

 

 C言語は、関数型言語[7]であるといえる。

 

 初期型のフォートラン[8]、では、処理は、常に、プログラムソースの、文頭から始まって、1行ずつ文末へと行われる、という構造になっていた。

 この原則は、C言語のような関数型言語でも、踏襲されており、関数内の処理の記述は、関数定義の最初から、1行ずつ、関数末へと行われる、というのが、やはり原則となっている。

 初期型のフォートランの様な、順次処理が行われているのが原則である言語を、手続き型言語を一般には呼ぶ。正しくは、手続き定義型言語とも、言うようであるが、一般的ではない予備型であると、考える。IF,GOTO などの制御命令を含まない、手続き型言語を純粋手続き型言語と呼ぼう。

 又、この初期型フォートラン型言語では、main関数を持たない。プログラムの文頭から処理が行われる為に、必要が無いからである。

 

 制御構造命令と言ったが、処理を途中で変えるなどの、命令を制御命令と一般には言う。

 例えば、IF文が、有名・ポピュラーであろう。

 一般的には、対象となる変数の値を調べて、その値に応じて処理を変える、という動作を行う命令である。

 ついで、GOTO分ということになるだろう。

 これは、無条件で、処理を指定された分、いくつか飛ばす、という、動作を行う。

 初期型FortranBasic[9] では、記述された行単位で番号がついていた。このGOTO分での、指定処理移動先を指定は、この行番号で、行っていた。最近では、処理の記述に、機能の無い、ラベル文というのを、付け加えて、GOTOなどのジャンプ先、制御命令の基準としている。

 以上2つの組み合わせにより、ある変数の値に応じて、ある処理を行い、別のある処理を行わないという処理を記述できる。

 これらを制御命令、これらによって形成される処理の流れを制御構造と一般には言う。

 

 

 Pascalという言語においては、処理の記述は、C言語に似ているが、関数型でなく、関数型によく似ているといえるだろう。

 処理の記述は、Function, Procedure の二つの分類による、処理のまとまりを記述することで行われる。日本語での翻訳は、“関数”,”手続きである。という訳で、Pascal においては、返り値(単純に値である)を持つ・返す処理のまとまりと、帰り値を持たない・返さない処理のまとまりとに分類されるわけである。

 

 C言語においては、処理のまとまりである関数は、常に何らかの値を持つ。void 型の返り値にしても同様に値である。

 

 中断。

 

 

 

 

(“構造?”の終わり)

 

 

 

 

 

<End of Contents. Thank you. J >.



[1] とりあえずの造語である。 プール型言語という、定義を他のページでしていた筈であるし。       近藤

[2] 造語ではない。   近藤

[3] 宣言と定義は、C言語において非常に紛らわしいといえる関係にある。概念的にはかなり簡単であるので、一度しっかり勉強しておくのがいいかもしれない。C++でも使える、知識となる訳だし。              近藤

[4] ゆ*にっくすでは、”.bin”ファイルが、標準的な実行ファイルであるし、”.com”ファイルも実行形式ファイルの位置を維持しているようであるが、ここでは一般的なWindows形式を標準として話を進めることにする。コンパイル等の実行可能形式ファイルの作成方法についても、同様である。            近藤敏郎

[5] 幸せな老後を迎えていることを期待したい。    近藤敏郎

[6] CPUといわれる部分と周辺LSIというのがわかる言葉! である。 つまりは、表を読みながらCPUと周辺LSIが、あれこれと動作する状況を考えるといいだろう。   近藤敏郎

[7] Forth, Lisp, C, ?付きでPascalなどが、関数型言語である。           近藤敏郎

[8] 最初の高級言語である。もっとも、その前に、いわゆるマシン後といわれることもあるニーモニック言語があるだろう。という、意見も、あるが。        近藤敏郎

[9] フォートランのサブセットから始まり、拡張型、独自言語化した言語である。   近藤敏郎