Windows APIを使うのか、POSIXに寄せるのか

先に紹介した実装はPOSIXに寄せたコードになっている。詳しい説明はいずれ行うとして、ここではPOSIXはUNIX系のオペレーティングシステムでよく使われているAPI集のようなものと考えていただきたい。POSIXに寄せて書いておけば、Windowsで動いたプログラムがMacでもLinuxでもコンパイルして利用できるようにしやすい。Windowsだけで動けばよいということであれば、このようなソースコードではなく、Windows API (Win32 API)を使ってソースコードを書くほうがWindows的だ。

この辺りは、開発者が何を求めているかで採用するものが変わってくる。Windowsだけで動けばよく、将来的にMacやLinuxに移植することはまずないのなら、Windows APIなどのMicrosoftが提供しているAPIを使って実装するとよいだろう。Windowsのための機能だ。

一方、Windowsで開発するがLinuxでも実行できる必要がある、といった場合は、UNIX系オペレーティングシステムの多くが準拠または準拠に近い状態にあるPOSIXに習った実装をしておくとよい。先ほどのソースコードがそれに近い。C言語の教科書的な書籍や、C言語の演習などで最初に習うソースコードはPOSIXコードを使っていることが多いだろう。

組み込みになると話はまた変わり、組み込み用のSDKが提供している関数を使ったコーディングを行うことになる。結局のところ、プラットフォームや製品ごとに使うべき関数は異なるので、その場その場に合わせて関数を理解して使うしかない。

WindowsでPOSIX系の実装を行う場合、現状はWSL (Windows Subsystem for Linux)と呼ばれる機能を使うのが公式となるだろう。しかし、WindowsでPOSIX系の実装を行う方法はほかにもいくつかある。Windows APIやPOSIX系の実装に関してはいずれもっと詳しく説明する予定だ。まずは作ったものを動かしてみよう。

書き換えたMakefile

複数のソースコードをビルドする方法として、makeを紹介した。最もシンプルな書き方から取り上げて、徐々に実際に使われるような書き方に変えていったが、次に掲載するMakefileが今回のバージョンだ。

Makefile

CMD=    csv2tsv.exe

SRCS=   $(wildcard *.c)
OBJS=   $(SRCS:.c=.o)

CC= clang
CFLAGS+=-g

build: $(CMD)

$(CMD): $(OBJS)
    $(CC) $(CFLAGS) -o $(CMD) $(OBJS)

.c.o:
    $(CC) -c $< -o $@

clean:
    rm -f $(CMD)
    rm -f $(OBJS)
    rm -f *.ilk
    rm -f *.pdb

前回まではSRSCにCソースコードファイルの名前を直接書いていたが、今回はここを$(wildcard *.c)という記述に変えてある。GNU makeの機能を使って、.cという拡張子のファイルを自動的に指定するといった処理になっている。

こんな感じの書き方にしておくと、他のソフトウェアを開発する際に流用しやすい(当然すべてが流用できるわけではないし、限度もあるが)。今回と似たような構成であれば、CMDに指定するバイナリ名だけを書き換えれば使えるといった感じだ。実際にはもっと多くのオプションを編集することになるのだが、とっかかりとしてはこの程度でよいだろう。

ビルドして使ってみる

では、早速ビルドして使ってみよう。当たり前だが、次のようにCSVファイルをTSVデータへ変換できることを確認できるはずだ。

  • csv2tsv.exeの実行サンプル

    csv2tsv.exeの実行サンプル

(これまでに構築した環境でビルドすると、実際にはコンパイル時にワーニングが出るのだが、見にくくなるので今回はそこは排除した。この点もいずれ取り上げる)

こんな感じで比較的簡単に単機能のコマンドは開発できる。Cで開発すると意識しなくても、高速に動作するプログラムが出来上がりやすい。慣れないとポインタや参照、メモリの使いに難儀するとは思うが、使えるようになっておくとつぶしが効きやすいプログラミング言語なのだ。

参考