プログラミングの
基礎テクニック

C MAGAZINE連載(2003年〜2005年)

結城浩

はじめに

こんにちは、結城浩です。

ここは、月刊誌『C MAGAZINE』で『プログラミングの基礎テクニック』という連載を書いていたときのサポートページです。

この連載では、 問題と解決の間のギャップを埋めるテクニックとして、

  • 基本的なアルゴリズム
  • プログラミング言語のイディオム
  • そのほかの技法

の中から、よく使われるものを選び、具体的なプログラム例と図を使って解説します。

プログラミング言語としてはJavaやCなどを用いています。 文法は理解しているけれど、経験が浅いという人を対象にして解説しますが、 できれば、熟練者にとっても新しい発見があるような内容も盛り込んでいます。

内容

第1回 (2003年12月号) : Buffering ―― まとめ買いのメリット

デバイスへのアクセスに時間がかかる場合、 アクセス回数を減らすことによって高速化をはかることができます。 利用者とデバイスの間にバッファというメモリ領域を用意することで、 デバイスへのアクセス回数を減らすことができます。

第2回 (2004年1月号) : Caching ―― すぐまた使うならそばに置け

いま、準備するのに時間がかかるデータを扱っているとしましょう。 準備ができたデータを、 キャッシュと呼ばれるメモリ領域に一時的に保持しておけば、 スピードアップをはかることができます。

第3回 (2004年2月号) : Binary Search ―― 問題空間を二分せよ

最も有名な検索アルゴリズム、バイナリサーチを紹介します。 バイナリサーチは一言で言えば「検索対象を毎回半分に減らしていく」という検索方法です。 検索対象データを繰り返して二分することで、log nのオーダーで検索対象を見つけることができます。 ただし、前もってデータはソートされている必要があります。

第4回 (2004年3月号) : Quick Sort ―― 最速のソート

最も高速なソートアルゴリズム、クイックソートを紹介します。 クイックソートは一言で言えば「数列を、注目している数よりも大きい部分と小さい部分に分けていく」というソート方法です。 挿入ソートと比較してみます。

第5回 (2004年4月号) : Recursion ―― 再帰的な構造と再帰的な呼び出し

レベルNの問題を、レベルN-1以下の問題に帰着して記述する再帰という方法を紹介します。 階乗の計算をCで書いたり、ListのS式のサブセットをJavaで解析したりします。

第6回 (2004年5月号) : Serialization ―― 構造化データの保存と復元

構造を持ったデータをファイルとして保存したり、 ネットワークを通じて送ったりする必要が生じたとしましょう。 その場合、メモリ上のデータをそのまま送るわけにはいきませんから、 複雑な構造を壊さないように注意しながら一次元のバイト列に変換します。 これがシリアライゼーションです。 PerlとJavaでシリアライゼーションの例を示します。

第7回 (2004年6月号) : Reflection ―― 自分のことを知っているオブジェクト

リフレクションというのは、 「プログラムがプログラム自身の情報を取得・実行することができる」という性質のことです。 オブジェクト指向プログラミングで言えば 「オブジェクトがオブジェクト自身のことを知っている」と表現してもよいでしょう。 リフレクションの機能を利用して、簡単なクラスブラウザをJavaで作ります。

第8回 (2004年7月号) : CallbackとFuture ―― 非同期的な処理

非同期的な処理を行うための技法としてCallbackとFutureを紹介します。 Callbackというのは、呼び出した先から呼び出し元を「呼び返してもらう」ことです。 処理の結果が必要なときには、Futureが役に立つことがあります。 Callbackでは処理の結果をいわば「送りつけられる」ことになりますが、 Futureを使うと、非同期的な処理を行いながらも、処理の結果を自然な形で取得することができます。

第9回 (2004年8月号) : Immutable ―― 状態が変わらないなら共有できる

「定数」という概念を拡張したImmutableを紹介します。 C, Perl, Java, C#などの言語を通して「状態が変化しない」ということの意味を考えてみましょう。

第10回 (2004年9月号) : Double Buffering ―― ちらつき防止バッファ

Double Bufferingというのは、 GUIで画面のちらつきを防止するためによく使われるテクニックです。 自前でDouble Bufferingを作る例と、 JavaのBufferStrategyを使う例を示します。

第11回 (2004年10月号) : Compaction ―― 圧縮

通信時や保存時のデータサイズを小さくする圧縮というテクニックを紹介します。 ランレングス圧縮の簡単な例と、GZIPInputStreamの例、暗号と組み合わせる例をJavaで作ります。

第12回 (2004年11月号) : Hashtable ―― ハッシュテーブル

データ検索を高速に行うための技法ハッシュテーブルを紹介します。

第13回 (2004年12月号) : Embedded Document ―― 埋め込みドキュメント

ソースコードに埋め込むドキュメントとそれを変換するツールの紹介をします。 PerlのPODとJavaのjavadocを中心にお話します。

第14回 (2005年1月号) : Noninteractive ―― 人間とやりとりせずに処理をする

Noninteractiveというちょっと変わった切り口からプログラムについて考えてみましょう。 筆者が作成した「はてなダイアリーライター」というコマンドラインツールを紹介します。

第15回 (2005年2月号) : Object ―― 状態と振る舞いをまとめよう

「オブジェクト指向」の基本である「オブジェクト」の話をします。 よく使うものを「まとめる」観点から、再利用や修正の容易さについて考えましょう。 また、筆者が作成した KissReader を紹介します。

第16回 (2005年3月号) : Closure ―― 関数を値として扱う

関数を通常の値のようにして扱う「クロージャ」の話をします。 Perl, Java, Haskellでクロージャを作ります。

第17回 (2005年4月号) : Dependency Injection ―― 依存性の注入

Dependency Injection(依存性の注入)を紹介します。 シンプルなプログラムを段階を追って改良し、非常に単純なDIContainerを作ってみます。

関連リンク

更新履歴

  • 2019年3月1日、記録用として内容を更新。
  • 2003年11月10日、公開。
  • 2003年11月5日、作成開始。