C言語の次に学ぶべきこと編集

この節では、C言語及び標準ライブラリを学んだ後、次に学ぶべきことをまとめる。

といっても、「これら全てを学ばないとプログラムが作れない」というわけではなく、自分でプログラムを作りながら、必要なものを学んでいけばいいだろう。

標準ライブラリ以外のライブラリの使い方編集

C言語には標準ライブラリ以外にも、 様々なライブラリが存在する。 自分が使いたい機能を持ったライブラリの使い方を学習して、 何かプログラムを作ってみるといいかもしれない。

例えばゲームプログラミングをWindows上でしたいなら、後述するDirectXを使いやすくまとめた「DXライブラリ」というライブラリがある。

DXライブラリ  — 2001年に山田巧がC++用に開発した、コンピュータゲーム開発用ライブラリ。著作権は開発者の山田巧が保持している。

データ構造とアルゴリズム編集

データ構造とは、実際のデータをコンピュータのメモリ上でどのように表現するか定める形式である。 アルゴリズムとは、そのデータを用いて計算し問題を解くための手順や考え方である。 データ構造とアルゴリズムを学ぶことで、 より複雑な問題をプログラムで解けるようになる。

他の言語編集

ある一定以上複雑なプログラムを作ろうとすると、 C言語では難しくなる場合がある。 C言語以降に開発されたオブジェクト指向をサポートする言語を学ぶのも手だ。 例えば、C言語にクラスの機能を導入したC++という言語がある。 言語によって何ができるかにはあまり違いはないが、何を作りやすいかはかなり異なる。

インラインアセンブラ編集

インラインアセンブラとは、C言語のソースコードの一部に、アセンブリ言語で書かれたソースコードを含めることである。

もし、ハードウェアの制御などでC言語がサポートしていない動作をさせたい場合、アセンブラでプログラムする必要があり、このような時にインラインアセンブラを使うことで、C言語とアセンブラを併用できる。

また、プログラムの中で、最も頻度が高くかつ比較的実行時間のかかる部分(ホットスポットと呼びます)だけに、 インラインアセンブラを用いることで、プログラム全体の処理速度や応答時間を改善(最適化)することが出来る。

マイクロソフト Visual C++ の場合編集

Windowsの場合、Visual C++のソースコードにアセンブリ言語を含めるには、次のように記述する。

__asm アセンブリ文

または

__asm {アセンブリ複文}

asmの前にアンダーバー(_)が2つである。

gcc や clang の場合編集

gcc や clang の場合[1]

構文
__asm__ (アセンブリテンプレート, 上書きリスト, 入力リスト )
アセンブリテンプレート
アセンブリ言語で書かれた雛形(必須)
上書きリスト
アセンブリコードによって修飾されるレジスタ(任意)
入力リスト
引数となるC言語の変数(任意)

参考
インラインアセンブラの使用したソースコードの例(amd64)
#include <stdio.h>

int add(int a, int b) {
  int result = 0;
  __asm__("       \
    movl %1, %0;  \
    addl %2, %0;"
          : "=&r"(result)
          : "r"(a), "r"(b));
  return result;
}

int main() {
  int a = add(1, 2);
  printf("%d\n", a);
}
インラインアセンブラの使用したソースコードの例(arm64)
#include <stdio.h>

int add(int a, int b) {
  int result = 0;
  __asm__("add %w0, %w1, %w2"
          : "=&r"(result)
          : "r"(a), "r"(b));
  return result;
}

int main() {
  int a = add(1, 2);
  printf("%d\n", a);
}
実行結果
3

Windows依存の技術編集

下記の技術はWindowsだけに依存して、macOSやUNIXやUNIX互換OSでは使えない技術である。

だが、2010年代の今のところ、Windowsでこれらの分野の学ぶのが最も入門しやすいので、紹介しておく。

Visual Studio のC++(いわゆる Visual C++)を使うことで、下記の技術を利用することができる。

Win32API編集

C言語と標準ライブラリを学ぶことで、ウィンドウに文字列を出力したり、変数にキーボードから入力したりできる。 このような文字のみを用いたユーザインターフェイスを、キャラクタユーザインターフェイス(Character-based User Interface, 略はCUI)と呼ぶ。

一方、今日のプログラムは、画面にウィンドウを表示し、

ウィンドウ内にボタン、チェックボックス、コンボボックス、ラベル、リストボックス、
ピクチャボックス、ラジオボタン、テキストボックスなど様々なコントロールを配置し、

キーボードやマウスを使って操作できる。

このようなグラフィカルなユーザインターフェイスを、グラフィカルユーザーインターフェイス(Graphical User Interface, 略はGUI)と呼ぶ。

Windows上でGUIをもったプログラムを作成するには、「Win32API」を学ぶ必要がある。

Win32APIを用いることで、画面にウィンドウを表示し、BitBlt関数を用いて矩形範囲のグラフィックをコピーしたり、 sndPlaySound関数を用いてWAVE音声を再生したりできる。

Visual C++ でなくとも、Visual Basic などでも Win32APIの提供するAPIの多くは利用できる。だが、wikibooksのC言語の入門的な単元を読破した読者なら、Visual C++ でWin32APIに入門するのが比較的にラクだろう。

DirectX又はOpenGL編集

DirectX編集

高速な2Dグラフィック処理や、3Dグラフィック処理を行うには、Windows上で行う場合なら、 DirectXを学ぶ必要があるだろう。

DirectXを用いることで、ハードウェアを用いたマルチメディア機能を使うことができる。

DirectXは基本、Visual C++ で利用しなければならない。(Visual Basic や Visual C#では利用が困難または不可能と思われる。)


なおDirectXの実行環境(ランタイム)はWindowsにあらかじめインストールされている。

DirectXをつかったアプリを開発したい場合には、DirectXのSDK(ソフトウェア開発キット)をマイクロソフトのwebサイトから追加でダウンロードしてきてインストールすればいい。

OpenGL編集

一方、DirectX以外で3Dなどの高度なグラフィックス処理を行うには、OpenGLを学ぶ必要がある。

OpenGLを用いることで、3次元グラフィックス機能を使うことができる。

OpenGLは、アプリ名ではなく規格名であり、多くのOSが準拠している。

いくつかの企業などが、OpenGLに準拠したライブラリを提供しているので、それをインクルードするなどして、3D描画をする仕組みである。


WinSock2編集

UnixでもWindowsでもネットワーク機能を使うには「Socket API」を学ぶ必要がある[2]。Windowsでソケット通信するためにはWinSockを学ぶ必要がある。

WinSockを用いることで、Windowsのインストールされたコンピュータが、他のコンピュータと通信できる。

WinSock2 は、BSDソケットを模倣しMicrosoftが、Windowsに移植したネットワークAPIだが、 模倣の過程で他の Windows API と戻値の仕様などを合わせるという選択をした。 これによって、BSDソケットの為に書かれたソースコードとの互換性はない。

また Linuxは、POSIXに準拠した実装とされるので、BSDソケットの為に書かれたソースコードとの間に基本的な互換性がある(poll などのシステムコールセットの違いからくる差異は存在するので、条件コンパイルなどで吸収する必要がある)。

脚註編集

  1. ^ clang は gcc の独自拡張のレベルでの互換性があり、かつて「gcc の独自拡張を使用しているので、他のコンパイラでのコンパイルは無理」と言われていた Linux カーネルのビルドに、clangが2010年に成功している。
  2. ^ かつてSystam V系 Unix では、Socket API ではなく STREAMS がネットワーク・インターフェースとして提供されている。