コレクション 01
主要なプログラミング言語(20)
C
1972年 / 静的・弱い型付け
OS やドライバ、組込みの土台を作る低レベル言語。ハードウェアに近く高速で、ほぼすべての言語や OS の基礎になっている。
SQL
1974年 / —(宣言型クエリ言語)
リレーショナル DB を操作する宣言型のクエリ言語。「どう取るか」ではなく「何が欲しいか」を書く。DB を扱うなら言語を問わず必須の共通スキル。
C++
1985年 / 静的・強い型付け
C を拡張した高性能システム言語。ハードを細かく制御でき、ゲームエンジン・組込み・科学計算・高頻度処理で現役。
Perl
1987年 / 動的・弱い型付け
テキスト処理と正規表現に強い老舗スクリプト言語。かつて CGI や運用スクリプトの定番で、「インターネットの接着剤」と呼ばれた。
Haskell
1990年 / 静的・強い型付け(型推論・純粋)
純粋関数型のパイオニア的言語。副作用を型で管理し、遅延評価と強力な型システムを持つ。学術・研究や、堅牢さが要る領域で評価される。
Python
1991年 / 動的・強い型付け
読みやすさを最優先した汎用言語。データ分析・AI/機械学習・自動化・Webバックエンドまで幅広く、いま最も人気のある言語のひとつ。
R
1993年 / 動的・弱い型付け
統計解析とデータ可視化に特化した言語・環境。豊富な統計パッケージ(CRAN)と作図機能を持ち、研究・データ分析で広く使われる。
JavaScript
1995年 / 動的・弱い型付け
ブラウザ上で動く唯一の言語。Node.js でサーバ側でも動き、Web 開発の中心。どこでも動く反面、弱い型付けの落とし穴も多い。
Java
1995年 / 静的・強い型付け
“Write Once, Run Anywhere” の JVM 言語。成熟・安定し、エンタープライズの基幹システムや(従来の)Android で根強い。
PHP
1995年 / 動的・弱い型付け(近年は型宣言が拡充)
Web に特化して生まれたサーバサイド言語。WordPress や多くの Web サービスを支え、レンタルサーバで手軽に動く。PHP 8 で性能・型が大幅に改善した。
Ruby
1995年 / 動的・強い型付け
「書いて楽しい」を重視した日本生まれのオブジェクト指向言語。Ruby on Rails により Web 開発で一世を風靡し、今もスタートアップで人気。
C#
2000年 / 静的・強い型付け
Microsoft の .NET 言語。言語機能が豊富で書きやすく、業務アプリ・Web バックエンド・ゲーム(Unity)まで幅広い。
Scala
2004年 / 静的・強い型付け(強力な型推論)
JVM 上で関数型とオブジェクト指向を高い水準で融合した言語。型システムが強力で、大規模データ処理(Apache Spark)やバックエンドで使われる。
Go
2009年 / 静的・強い型付け
シンプルさと並行処理を重視した Google 製言語。学習しやすく高速起動で、クラウドインフラやマイクロサービスで人気。
Rust
2010年(1.0 は 2015年) / 静的・強い型付け
所有権モデルで「メモリ安全」と「高速」を GC なしで両立するシステム言語。学習は難しいが安全性と性能が要る基盤で評価が高い。
Kotlin
2011年 / 静的・強い型付け(null 安全)
JetBrains が作った JVM 言語。Java と完全互換ながら簡潔で安全に書け、Google が Android 開発の第一言語に推奨する現代 Android の標準。
Dart
2011年 / 静的・強い型付け(null 安全)
Google 製のクライアント最適化言語。Flutter の言語として、1 つのコードから iOS/Android/Web/デスクトップ アプリを作れる。
Elixir
2011年 / 動的・強い型付け
Erlang VM(BEAM)上で動く関数型言語。軽量プロセスによる大量の並行処理と耐障害性が強みで、リアルタイム Web(Phoenix)やチャット基盤に向く。
TypeScript
2012年 / 静的・強い型付け(JS のスーパーセット)
JavaScript に静的な型を足した言語。JS の資産をそのまま使え、大規模開発の事実上の標準。型が消えて実行されるのは JS。
Swift
2014年 / 静的・強い型付け(Optional)
Apple が Objective-C の後継として作ったモダン言語。安全・高速で書きやすく、iOS/macOS アプリ開発の標準。サーバサイドでも使える。
| 項目 | C | SQL | C++ | Perl | Haskell | Python | R | JavaScript | Java | PHP | Ruby | C# | Scala | Go | Rust | Kotlin | Dart | Elixir | TypeScript | Swift |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 登場 | 1972年 | 1974年 | 1985年 | 1987年 | 1990年 | 1991年 | 1993年 | 1995年 | 1995年 | 1995年 | 1995年 | 2000年 | 2004年 | 2009年 | 2010年(1.0 は 2015年) | 2011年 | 2011年 | 2011年 | 2012年 | 2014年 |
| 型付け | 静的・弱い型付け | —(宣言型クエリ言語) | 静的・強い型付け | 動的・弱い型付け | 静的・強い型付け(型推論・純粋) | 動的・強い型付け | 動的・弱い型付け | 動的・弱い型付け | 静的・強い型付け | 動的・弱い型付け(近年は型宣言が拡充) | 動的・強い型付け | 静的・強い型付け | 静的・強い型付け(強力な型推論) | 静的・強い型付け | 静的・強い型付け | 静的・強い型付け(null 安全) | 静的・強い型付け(null 安全) | 動的・強い型付け | 静的・強い型付け(JS のスーパーセット) | 静的・強い型付け(Optional) |
| 実行方式 | コンパイル(ネイティブ) | DB エンジンが解釈・最適化 | コンパイル(ネイティブ) | インタプリタ | コンパイル(GHC) | インタプリタ(CPython) | インタプリタ | インタプリタ(JIT エンジン) | JVM(バイトコード + JIT) | インタプリタ(Zend Engine) | インタプリタ(YARV) | .NET(JIT / AOT) | JVM(+ Scala.js / Native) | コンパイル(ネイティブ・単一バイナリ) | コンパイル(ネイティブ) | JVM(+ Native / JS) | AOT / JIT コンパイル(+ JS) | BEAM(Erlang VM) | トランスパイル → JavaScript | コンパイル(ネイティブ・LLVM) |
| 一番の強み | ハードを直接制御でき非常に高速 | 宣言的で簡潔にデータを操作できる | 最高クラスの実行性能・ハード制御 | 正規表現・テキスト処理が強力 | 純粋関数型で副作用を型で制御 | 構文が読みやすく学習しやすい | 統計・データ分析に特化 | ブラウザ標準・どこでも動く | 成熟・安定・巨大なエコシステム | Web に特化し導入が手軽(レンタルサーバ) | 人間中心で書きやすく表現力が高い | 言語機能が豊富で生産性が高い | 関数型 + OOP を高い水準で融合 | 文法が小さく学習が容易 | GC なしでメモリ安全(所有権・借用) | Java と完全相互運用で移行が容易 | Flutter で iOS/Android/Web/Desktop を一括 | 軽量プロセスで桁違いの並行性 | 型で安全・エディタ補完が強力 | 安全(Optional)で高速・書きやすい |
| 主な用途 | OS・カーネル・ドライバ | データの検索・集計・分析 | ゲームエンジン | ログ・テキスト処理 | 研究・教育(関数型) | データ分析・AI/ML | 統計解析・研究 | Web フロントエンド | エンタープライズ・基幹システム | Web サイト・CMS(WordPress) | Web アプリ(Ruby on Rails) | 業務アプリ・Web(ASP.NET) | ビッグデータ処理(Apache Spark) | クラウドインフラ(Docker / Kubernetes) | システム / 低レイヤ | Android アプリ開発 | モバイルアプリ(Flutter) | リアルタイム Web(Phoenix / LiveView) | 大規模 Web アプリ | iOS / macOS アプリ |
操作して学ぶ
プログラミング言語の影響グラフ
1957年のFortranやLispから現代のRust・Swift・TypeScriptまで、言語は互いに影響し合いながら進化してきました。 実線は直系の後継・進化、 破線はコードは継がない設計上の影響。 ドラッグとズームで探検し、気になる言語をクリックすると解説が出ます。
ノードをクリックすると、そのOSの解説と関連記事がここに表示されます。
操作して学ぶ
同じ処理を10言語で — FizzBuzzから並行処理まで見比べる
同じ4課題を Python・Go・Rust・Haskell など10言語で並置。ループ・資源管理・並行処理の“書き方の思想”の違いが1画面で分かる。
操作して学ぶ
ソートアルゴリズム可視化 — 6つの並べ替えを目で見る
バブル・クイック・マージ・ヒープ… 比較と交換のアニメで、計算量の違いが直感で分かる。
操作して学ぶ
経路探索可視化 — BFS・ダイクストラ・A*を目で見る
壁を描いて探索を比較。A*がなぜ無駄なく最短経路を見つけるかが一目で分かる。
操作して学ぶ
gitコミットグラフ可視化 — ブランチとマージを目で理解
commit/branch/checkout/merge をステップ再生。「ブランチはただのポインタ」が腑に落ちる。
操作して学ぶ
IEEE 754 可視化 — なぜ 0.1 + 0.2 ≠ 0.3 なのか
入力した数のビット分解と「実際に格納される正確な値」をBigIntで厳密表示。浮動小数点の誤差が腑に落ちる。
操作して学ぶ
圧縮アルゴリズム可視化 — Huffman木とLZ77を動かす
頻度から木を作る様子、スライド窓で繰り返しを参照に置き換える様子。gzip/deflateの中身が見える。
理解度チェック
What will this print? — 言語仕様の罠クイズ
0.1+0.2・typeof null・可変デフォルト引数… コードの出力を当てて、ハマりどころを理由ごと学ぶ。
理解度チェック
Big-O計算量あてクイズ — コードから計算量を見抜く
O(1)〜O(2ⁿ)を12問で。ネストは掛け算・並列は足し算・半分は対数という読み方が身につく。
操作して学ぶ
⁘ 正規表現エンジン可視化 — NFAへのコンパイルと照合
正規表現を状態機械に変換し、入力を1文字ずつ照合。なぜ状態集合方式が線形で速いかが分かる。
操作して学ぶ
状態遷移(FSM)可視化 — TCPの11状態を歩く
イベントを押して状態を遷移。CLOSE_WAITが自分側のバグでTIME_WAITが正常な理由が図で腑に落ちる。
操作して学ぶ
ガベージコレクション可視化 — mark & sweep
ルートから到達可能をマーク→ゴミを回収。参照カウントが漏らす循環参照も回収できる理由が分かる。
操作して学ぶ
ハッシュテーブル可視化 — 衝突とリサイズを動かす
チェイン法と線形探索でキーを挿入。衝突・プローブ・負荷率0.75超のリサイズが目で分かる。
操作して学ぶ
Bloomフィルタ可視化 — 偽陽性が生まれる瞬間
要素追加でビットが立ち、追加していない値が「たぶんある」と誤答する偽陽性を体感。「無い」は確実の非対称性。
リファレンス
正規表現パターン集 — なぜこう書くか、どこで効かないか
メール・URL・日付など定番18種を、部品の意味と「この式では足りない場面」つきで。その場で試せる。
リファレンス
マジックナンバー辞典 — ファイルシグネチャで本当の形式を見抜く
拡張子は自己申告に過ぎない。PNG・ZIP・ELFなどの先頭バイト列と、CAFEBABEの偶然の衝突まで検索できる。
リファレンス
IT用語 読み方辞典 — nginx・k8s・GIF の正しい読み方と由来
読みが割れる用語と記号の呼び名を、公式・作者の表明や由来つきで引ける。GIF=ジフ、JWT=ジョットの根拠も。
操作して学ぶ
LRUキャッシュ可視化 — GET/PUTで追い出しの瞬間を動かす
教科書(LeetCode 146)の例をそのまま再生。ハッシュマップ+双方向連結リストがなぜO(1)なのかが分かる。
操作して学ぶ
LFUキャッシュ可視化 — 使用頻度が最も低いキーから追い出す
教科書(LeetCode 460)の例をそのまま再生。頻度グループ×グループ内LRUの2階層構造がLRUとの違い。
操作して学ぶ
ヒープ可視化 — 配列1本でsift-up/sift-downを動かす
木構造と配列表示を同時に見ながらステップ再生。ビルドヒープがO(n)で済む様子まで確認できる。
操作して学ぶ
トポロジカルソート可視化 — Kahn法とDFS法で依存解決
ビルド依存・履修の前提科目をステップ実行。循環依存があると解決不可能になる様子も体感。
操作して学ぶ
誕生日のパラドックス/UUID衝突確率
23人で50%超という直感に反する速さをグラフと実演で体感。UUIDが衝突しない理由も同じ式で分かる。
操作して学ぶ
マークル木可視化 — 改ざんがルートハッシュに伝わる仕組み
本物のSHA-256でリーフから積み上げ。1件編集すると根までの経路が変化。Merkle Proofも確認できる。
操作して学ぶ
スキップリスト可視化 — コイン投げでO(log n)を作る
検索は右へ進んで詰まったら1段下へをステップ再生。挿入はコイン投げでレベルが決まる過程を確認。
操作して学ぶ
赤黒木可視化 — 回転と再彩色でO(log n)を決定的に保つ
キーを挿入してBST探索→赤い葉として追加→フィックスアップをステップ再生。3性質のライブ判定つき。
操作して学ぶ
AVL木可視化 — 高さ差±1を厳格に保つ単一/二重回転
キーを挿入してLL/RR/LR/RL回転をステップ再生。挿入では回転1回で木全体が直ることまで確認できる。
操作して学ぶ
トライ木(Trie)可視化 — 共通接頭辞を1本の経路にまとめる
単語を挿入してノードの再利用/新規作成をステップ再生。検索・前方一致ではオートコンプリートの実例まで確認。
操作して学ぶ
Union-Find可視化 — 経路圧縮とunion by rankでほぼO(1)に
find(経路圧縮)とunion(union by rank)をステップ再生。findだけで木が平たくなる様子が見える。
解説記事
考え方・概念
言語をまたいで効く「プログラミングの土台」。まず TL;DR で要点を。
ABA問題とハザードポインタ(ロックフリーのメモリ回収)
ロックフリー構造で「いつノードを安全に解放できるか」を判断できれば、ABA問題やuse-after-freeを踏まずに高並行コードが書ける。ハザードポインタ・エポックGC・RCUの原理と使い分けを内部から解説します。
ABI・呼び出し規約とリンカの仕組み
ソースが実行ファイルになるまでの最後の一段が見えると、リンクエラーの正体が腑に落ちる。呼び出し規約・名前修飾・シンボル解決・再配置を原理から押さえる。
API 設計の基本
使いやすく壊れにくい API はどう設計するか。命名・一貫性・後方互換・エラー設計という品質を左右する勘所を、ソフト同士をつなぐ約束の観点から解説。
async/awaitとコルーチンの内部実装
async/awaitが裏で何をしているか分かれば、性能の勘所もハマりどころも見通せる。状態機械への変換とイベントループの連携を原理から押さえます。
B+木とディスク指向インデックスの内部
なぜDBのインデックスが赤黒木でなくB+木なのかが腑に落ちる。ノード分割・併合、葉のリンク走査、ファンアウトとページサイズの関係を、ディスクI/O回数を最小化するという一点から正確に押さえる。
Hindley-Milner型推論の仕組み
型注釈ゼロでも全式の型が決まる秘密が分かる。単一化とlet多相という二本柱で、ML/Haskellがどう型を導くかを原理から押さえます。
JITコンパイルとプロファイル誘導最適化の内部
なぜ実行中に速くなるのか。インタプリタ起動の手軽さと機械語の速度を両取りする JIT の内部を、ホットスポット検出から脱最適化まで原理から解き明かします。
LL・LR・LALR 構文解析アルゴリズムの違い
なぜ多くのパーサ生成系が LALR を選ぶのか。トップダウンの LL とボトムアップの LR・SLR・LALR を、解析戦略と表のサイズから一気に整理して腑に落とす。
LSM木と書き込み最適化構造
なぜ書き込みの速いDBはB木でなくLSM木を選ぶのかが腑に落ちる。メモリ表・SSTable・コンパクションの仕組みと、書き込み増幅と読み出し増幅のトレードオフを正確に押さえる。
NP困難問題への近似アルゴリズムと近似比
厳密最適解が現実的に求まらない問題でも、近似比という保証付きで「最悪でもこの範囲」と言い切れる設計力が手に入る。頂点被覆・TSP・集合被覆を題材に、PTAS/APXの分類まで原理で押さえられる。
SSA形式とコンパイラ最適化
最適化が「効く」中間表現の正体がSSA。各変数を一度だけ代入する形に直すと、定数伝播やデッドコード除去が劇的に単純化される理由を原理から押さえます。
Union-Find(素集合データ構造)の償却計算量
連結性の判定と併合がほぼ定数時間で回せる理由が腑に落ちる。経路圧縮とランク併合が逆アッカーマン関数 α(n) という事実上の定数に収まる仕組みを、Kruskal法などの応用とともに正確に押さえる。
アルゴリズムパラダイムの系統(探索・最適化・近似の地図)
初見の問題にどの設計手法を当てるか、勘ではなく構造で選べるようになる。全探索から分割統治・動的計画・貪欲・乱択・近似・分枝限定までを1枚の地図に整理し、分岐の判断軸を示す。
イテレータとジェネレータの内部(遅延列の実装)
巨大な列やフィルタ連鎖が遅い・メモリを食う原因は中間配列。イテレータとジェネレータの内部を押さえると、無限列を必要な分だけ流し、配列を作らず処理できる勘所が見えます。
イベントループとI/O多重化(epoll・kqueue・io_uring)
1スレッドで数万接続をさばく高並行サーバーの心臓部が分かる。select/epoll/kqueueのスケーラビリティ差と、io_uringが変えた設計の勘所を原理から押さえます。
イミュータビリティ(不変性)
副作用を減らし並行処理でも安全に扱えるのがイミュータビリティ。値を変更せず必要なときは新しい値を作る設計方針を、利点とあわせてやさしく解説。
インライン化と関数間最適化(LTO)
関数呼び出しの壁を壊すとなぜ速くなるのか。インライン展開の損益判断、仮想呼び出しを直呼びに変えるデバート化、翻訳単位を越えて効くLTOの仕組みを原理から押さえます。
オブジェクト指向プログラミング(OOP)
データと処理をオブジェクトにまとめ、現実の概念のように整理してプログラムを組み立てられるのがオブジェクト指向(OOP)。その考え方をやさしく。
ガベージコレクション
メモリ解放の手間とバグから解放されるのがガベージコレクション。もう使わないメモリを処理系が自動回収する仕組みと、一時停止という代償をやさしく解説。
ガベージコレクションアルゴリズムの内部(世代別・並行GC)
GCの停止時間がどこから来てどう削るのかが腑に落ちる解説。マーク・スイープからG1・ZGCの並行回収とwrite barrierまで、内部アルゴリズムを正確に押さえる。
ガベージコレクションの停止時間制御(低レイテンシGC)
ヒープが数百GBでも停止が数ミリ秒で収まる理由が分かる解説。ZGC・Shenandoah・C4のカラーポインタと読み取りバリア、並行コンパクションの原理を正確に押さえる。
グラフ探索の原理(BFS・DFSと到達可能性)
BFSとDFSの探索順序と計算量、到達可能性の判定法を原理から押さえ、連結成分やサイクル検出まで自力で組めるようになる。
クロージャとスコープ
状態を持つ関数が作れる理由はここにある。変数の見える範囲スコープと、定義時の外側変数を閉じ込めて覚え続けるクロージャの仕組みを実例で。
クロージャの実装原理(環境キャプチャとアップバリュー)
クロージャが状態を覚え続ける仕組みを内部から理解すれば、性能の勘所もメモリリークの原因も見抜ける。環境キャプチャの実装を原理から解き明かします。
コードとデータの分離(実行モデルとフォン・ノイマン)
なぜプログラムは「ただのデータ」として配れるのか。フォン・ノイマン型の実行モデルを原理から押さえると、JITも自己書き換えもセキュリティ対策も一本の線で理解できる。
コンパイルとインタプリタ
速度も配布のしやすさも、この違いで決まる。ソースを事前に機械語へ翻訳するか、その場で1行ずつ解釈するか。コンパイルとインタプリタの仕組みと得失。
ジェネリクス(総称型)
型安全とコード共通化を両立できるのがジェネリクス。型を引数のように後から指定し、同じコードを複数の型で安全に再利用する仕組みをやさしく。
ジェネリクスの実装戦略(単相化と型消去)
同じ `Vec<T>` がC++/Rustでは速くJavaでは遅い理由がわかる。単相化はコード膨張と引き換えに速度を、型消去はバイナリ互換と引き換えに実行時制約を選ぶ。二大戦略のトレードオフを原理から解説します。
スキップリストと確率的平衡
回転もリバランスもない単純なリンクリストだけで、平衡木と同じ期待O(log n)探索が手に入る。コイン投げで層を決める確率的構造の仕組みと、並行実装で平衡木より有利になる理由を原理から押さえる。
スタックとヒープの実態(コールスタックとフレーム)
なぜローカル変数は速くて再帰は落ちるのか。コールスタックのフレーム構成と戻りアドレス、ヒープの動的確保を配置図で押さえ、性能とクラッシュの勘所をつかむ。
スレッドプールと作業窃取スケジューラ
スレッドを使い回し、暇なワーカーが他人のタスクを横取りする仕組みが分かれば、コア数に張り付く高並行コードが書ける。タスク粒度・プールサイジング・両端キューの原理を解説します。
スレッド同期プリミティブの内部(ミューテックス・セマフォ・条件変数)
ロックが速い理由と、待つときだけ寝かせる仕組みが分かれば、無駄なCPU消費も誤起床バグも避けられる。futexやpark/unparkでカーネルと連携する内部を原理から解説します。
ソートアルゴリズムの内部と下界(比較ソートの限界)
クイック・マージ・ヒープソートの内部挙動と、比較ソートが n log n より速くなれない理由を理解し、実装の選択基準まで腹落ちさせる。
データフロー解析とプログラム最適化
コンパイラ最適化がなぜ安全に成立するのか。到達定義や生存変数を半束上の固定点反復として捉えると、定数畳み込みや不要コード除去の根拠が一望できます。
データ構造(配列・リスト・スタック・キュー・マップ)
適材適所でデータ構造を選べるようになる。配列・連結リスト・スタック・キュー・マップの、並べ方と出し入れの特徴、計算量を押さえる入門。
デザインパターン
設計の意図を短い名前で共有できる、定番の解き方のカタログ。よくある設計課題への再利用される解法をデザインパターンとして整理し、語彙として使う。
テストの基礎
コードが期待どおり動くと自信を持てるのがテスト。自動検証の入門として、単体・結合・E2E の役割とテストピラミッドの考え方をやさしく押さえます。
デッドロックの四条件と検出・回避
デッドロックは四条件のどれか一つを崩せば必ず防げる。Coffman条件と資源割当グラフ、銀行家アルゴリズム、そして実務で効くロック順序付けとタイムアウトを原理から整理します。
デバッグの技法
当てずっぽうをやめ、不具合の原因を筋道立てて突き止める。再現・仮説・切り分けを軸に、ログやデバッガで原因を一つずつ絞り込むデバッグの技法。
トレイト/型クラスと辞書渡しの仕組み
同じ関数名が型ごとに別実装へ届く「アドホック多相」を、トレイト/型クラスと辞書渡しの一語で見通せる。継承なしに後付けできる理由と、静的/動的ディスパッチの選び分けまで原理から解きほぐします。
パターンマッチングの実装(決定木コンパイル)
なぜ多段のmatch式が連続if文より速く、しかも分岐漏れまで防げるのか、その正体がつかめる。パターンを決定木へコンパイルする手順と、網羅性・冗長性検査が同じ機構で動く仕組みまで一気に見通せます。
バックプレッシャーとフロー制御(リアクティブストリーム)
速い生産者に消費者が押しつぶされる事故を、需要シグナルとバウンドキューで未然に防ぐ設計が身につく。Reactive Streamsのdemand制御とドロップ/バッファ戦略を原理から押さえます。
ハッシュテーブルの内部(衝突解決とオープンアドレス法)
平均O(1)の正体が腑に落ちる解説。ハッシュ関数・チェイン法とオープンアドレス法・ロビンフッドハッシュ・負荷率とリハッシュまで、内部機構を正確に押さえる。
ハッシュ関数の設計と均一性(非暗号学的)
速くて衝突しないハッシュの作法が腑に落ちる解説。雪崩効果・分布均一性・速度の三目標から、FNV・MurmurHash・xxHashの設計と、ハッシュフラッディングを防ぐSipHashまで正確に押さえる。
ヒープと優先度付きキューの内部
最小値の取り出しがなぜO(log n)で済むのかが原理から腑に落ちる。二分ヒープの配列表現とsift操作、ビルドヒープがO(n)になる訳、フィボナッチヒープがダイクストラを速める仕組みまで正確に押さえる。
ファジングとカバレッジ誘導テスト
ランダムな入力を投げるだけでは深いバグは出ない。カバレッジを報酬に変異を進化させる仕組みで、AFL や libFuzzer は人手では届かない経路までクラッシュを自動で掘り当てます。
プログラミングパラダイムの系統(手続き型・関数型・論理型)
パラダイムを計算モデルの違いとして理解すれば、言語選定や設計判断の軸がぶれなくなる。手続き型・関数型・論理型の数理的基盤と系統を、つかみどころから整理する。
プログラミング言語の系統樹(言語の派生図)
なぜこの言語はこう書くのか、が腑に落ちる。ALGOL・Lisp・C・Smalltalk の4祖から主要言語へ続く影響関係を、年代と分岐つきの系統図として俯瞰します。
プロパティベーステストと最小化(shrinking)
手で例を並べるテストでは抜ける入力を、性質の検証で機械に探させる。ランダム生成で大量の反例を見つけ、shrinking が最小の例まで縮めてバグの核心を一目で示します。
プロファイリングとパフォーマンス計測の原理
勘で速くしようとして外す前に。どこが遅いかを統計的に突き止めるサンプリングと計装の原理、PMUカウンタ、フレームグラフの読み方とマイクロベンチの罠を解き明かします。
ポインタと参照
大きなデータを安く受け渡せるのがポインタと参照。値そのものではなくメモリのアドレスを指す仕組みと、ヌル参照やダングリングという落とし穴をやさしく。
ポインタ解析とエイリアス解析
なぜCやC++で最適化が効きにくいのか。どのポインタが同じメモリを指しうるかを推定するエイリアス解析を理解すると、コンパイラが保守的にならざるを得ない理由と精度を上げる手立てが見えてきます。
ホーア論理とプログラム検証
テストでは「バグがないこと」を示せない。ホーア論理を使うと、事前条件と事後条件の三つ組でプログラムの正しさを数学的に証明でき、ループ不変条件で複雑なコードの正当性も裏づけられる。
メタプログラミングとマクロ(コンパイル時計算)
繰り返しの定型コードをコンパイル時に自動生成できれば、実行時コストゼロで抽象化できる。マクロが何を操作し、なぜ衛生性が要るのかを原理から押さえる。
メモリモデルとhappens-before関係
並行バグの9割は可視性と並び替えの誤解から来る。何が保証され何が壊れるかを規定するメモリモデルとhappens-before関係を原理から押さえれば、ロックも不要な書き方も自信を持って選べる。
メモリレイアウトとデータ局所性(キャッシュを意識した設計)
同じアルゴリズムでも数倍速くなる鍵がデータの並べ方。アライメント・SoA・キャッシュラインを押さえ、ハードウェアに優しい設計を身につける。
リアクター/プロアクターパターンと非同期I/O
高並行サーバーの骨格をどちらで組むか迷わなくなる。準備完了通知型のReactorと完了通知型のProactor、その違いとOSのI/Oモデルとの対応を原理から整理します。
レジスタ割り当て(グラフ彩色)の仕組み
なぜ同じコードでも速さが変わるのか。限られたCPUレジスタへ変数をどう詰め込むかをコンパイラがグラフ彩色やLinear Scanで解く原理を、スピル判断まで押さえます。
ロックフリー・ウェイトフリーとCAS命令
ロックを使わずに並行データ構造を安全に更新する原理が分かれば、デッドロックと無縁の高並行コードが書ける。CASとABA問題、進行保証を内部から解説します。
依存関係管理(パッケージ管理)
依存地獄を避け、どの環境でも同じ依存を再現する。マニフェストとロックファイルで誰がどの版をどう使うかを固定する、パッケージ管理の考え方。
依存型と証明としてのプログラム
範囲外参照や長さ不一致を、テストではなくコンパイル時に消せる。値に依存する型で不変条件を保証し、Curry-Howard対応により証明とプログラムを同一視する仕組みが分かる。
仮想マシンとバイトコード実行(スタック型VSレジスタ型)
VMの内部が見えると、なぜLuaやDalvikが速いのかが腑に落ちる。スタック型とレジスタ型の命令ディスパッチと計算機モデルの差を原理から解き明かす。
仮想メモリとページングのプログラミング的含意
なぜmallocは速いのにメモリ確保が遅く感じる瞬間があるのか。アドレス変換・ページフォルト・コピーオンライトを押さえ、性能とメモリ共有の勘所をつかむ。
関数(引数・戻り値・スコープ)
同じ処理を名前で何度も呼び出せる、再利用の基本単位が関数。入力(引数)を受け取り処理して結果(戻り値)を返す仕組みと、スコープの考え方をやさしく。
偽共有とキャッシュコヒーレンシ(MESIプロトコル)
並行処理が並列化したのに遅いとき、犯人は論理的に独立な変数の奪い合い。MESIの動作と偽共有の原理を押さえれば、パディング一発で数倍の差を取り戻せる。
擬似乱数生成器の原理(PRNG)
rand() がなぜ本物の乱数でないかが内部状態から腑に落ち、再現性とセキュリティの地雷を踏まなくなる。線形合同法からMersenne Twister・PCG、CSPRNGとの境界までを正確に解説。
型システム(静的型付け vs 動的型付け)
安全性と書きやすさのトレードオフを決めるのが型システム。値の型をコンパイル時に守るか実行時に確かめるか、静的型付けと動的型付けの違いをやさしく。
型理論の基礎(ラムダ計算と型付け)
型システムがなぜ正しさを保証できるのか、その数理的な根っこが分かる。ラムダ計算とCurry-Howard対応を軸に、型注釈の裏側にある理論を一気に見通せる。
形式的意味論(操作的・表示的・公理的)
プログラムの意味を曖昧さなく定める3つの流儀が分かる。仕様書の言葉尻でなく数学で挙動を固定できるので、言語設計や検証で「本当にこう動くか」を根拠を持って語れるようになります。
継続とコルーチンの理論(call/ccと一級継続)
ジェネレータも例外も非同期も「実行の続き」を捕まえて呼び直す同じ仕組みだと見通せる。call/ccと限定継続を原理から押さえ、コルーチンの正体まで一本で理解できます。
計算モデルの体系(チューリング機械・λ計算・帰納関数)
見た目の違う計算モデルがなぜ同じ強さなのかが腑に落ちる。チューリング機械・λ計算・帰納的関数・レジスタ機械の等価性をたどると、チャーチ・チューリングのテーゼの意味が一気に見通せる。
計算可能性と決定不能問題(停止性問題)
なぜ完璧なバグ検出器やリンタが原理的に作れないのか。停止性問題の決定不能性を理解すると、静的解析ツールの限界と近似という設計判断が腑に落ちる。
計算量クラス P・NP と NP完全性
なぜ一部の問題は「速く解けない」と言われるのか、その線引きが腑に落ちる。P・NP・NP完全・NP困難の包含関係と還元を押さえ、目の前の問題の難しさを構造から見抜けるようになる。
計算量と Big-O 記法
データ量が増えたとき処理時間がどれだけの勢いで伸びるかを表す物差し。Big-O 記法でアルゴリズムの良し悪しを規模感で比べられるようになる。
決定性と再現性(ビルドと実行の再現可能性)
同じ入力なのに結果が変わる、ビルドのたびに成果物が違う。その非決定性の源を時刻・乱数・並行・浮動小数点へ正確に切り分け、固定して、テストとデバッグを安定させられるようになります。
言語の設計哲学 — 何を最適化し、何を捨てたか
言語の好き嫌いや流行ではなく「何を最適化し何を諦めたか」で捉えると、各言語の書き味と向き不向きが一本の筋で腑に落ちる。C・Go・Rust・Python・Haskellなど主要言語の設計判断を対比する。
効果システムとモナド(副作用の型付け)
副作用を型で追跡できれば、どの関数がIOやエラーを起こすか一目で分かり、合成の安全性をコンパイラが保証する。モナドと代数的効果でその仕組みを原理から押さえられる。
高階型と種(カインド)システム
FunctorやMonadを「any container」に対して一度だけ書ける理由が分かる。型の型である種(カインド)を導入し、型を引数に取る型コンストラクタと高階抽象の原理を一気に見通せる。
高速フーリエ変換(FFT)の原理
離散フーリエ変換の素朴な O(n^2) を O(n log n) へ落とすFFTの中身を、Cooley-Tukey分割・回転因子・バタフライ演算から原理で腹落ちさせる。多項式乗算や信号処理で効く理由まで一気通貫で説明する。
再帰
関数が自分自身を呼び出して、大きな問題を「同じ形の小さな問題」に分割して解くテクニック。木構造の探索や分割統治と相性が良い。
最短経路アルゴリズムの体系(ダイクストラ・ベルマンフォード・A*)
重みの符号と前提知識の有無で最短経路アルゴリズムを正しく選び分けられるようになる。ダイクストラ・ベルマンフォード・A* の正当性と計算量、優先度付きキューの役割まで腰を据えて押さえる。
参照カウントの仕組みと循環参照
メモリがいつ解放されるか読める仕組みが参照カウント。即時解放の原理とコスト、循環参照リークの正体、弱参照やサイクル検出で穴を塞ぐ方法をARCとCPythonで正確に押さえる。
字句解析と構文解析の原理(オートマトンと文法)
コンパイラの入口がなぜその構造になるかを原理から理解できる。正規言語と有限オートマトン、文脈自由文法とLL/LR解析の数理を、トークンから構文木までの内部動作で押さえる。
自動ベクトル化とSIMDの活用
ループを書き換えるだけで数倍速くなる鍵がSIMD。ベクトル化の成立条件と失敗要因を押さえ、コンパイラ任せと組み込み関数を正しく使い分けられるようになる。
実行ファイル形式の内部(ELF・PE・Mach-O)
バイナリが起動する仕組みが見えると、起動失敗やリンクエラーの切り分けが速くなる。ELF・PE・Mach-Oのセクション・セグメント・エントリポイント・再配置・ロードを原理から押さえる。
所有権と借用によるメモリ管理(Rustモデル)
GCも手動freeも使わずにメモリ安全を勝ち取る仕組みが分かる。所有権・借用・ライフタイムがなぜコンパイル時にダングリングや競合を潰せるのか、その原理を線形型の理論から解き明かす。
償却計算量の解析手法(会計法・ポテンシャル法)
動的配列の追加がなぜ平均O(1)なのかを数式なしで腑に落とす。集計法・会計法・ポテンシャル法の3手法で、たまに高コストでも全体では安いことを正確に示せるようになる。
数値計算の安定性と条件数
計算結果がなぜ大きく狂うのか、その犯人が問題側かアルゴリズム側かを切り分けられるようになる。条件数と後退安定性、ガウス消去のピボット選択を浮動小数点の観点から正確に解説。
制御構文(条件分岐とループ)
プログラムの実行する順番を操るのが制御構文。順次・条件分岐・繰り返しの3つを組み合わせて、思い通りのロジックを組み立てる基本を解説。
整数表現と2の補数・オーバーフロー
桁あふれや符号バグの原因を内部表現から理解でき、ラップアラウンドや未定義動作の地雷を踏まなくなる。2の補数の仕組みと飽和演算・ビット演算の落とし穴を原理から解説。
正規表現
文字列の検索・抽出・置換をパターン一発でこなせるのが正規表現。記号でパターンを表す小さな言語の基礎を、メールやログ照合の例とともにやさしく。
正規表現エンジンの内部(NFA・DFA・バックトラッキング)
正規表現がなぜ一瞬で終わる時と固まる時があるのか、その答えはエンジンの内部構造にある。NFA・DFA・バックトラッキングの原理を押さえ、ReDoSを構造から見抜けるようになる。
接尾辞配列とトライ木(全文検索の基盤)
全文検索が部分文字列をなぜ高速に引けるのかが腹落ちする。トライ・基数木・接尾辞木/接尾辞配列の構造と構築計算量、LCP配列の役割まで、索引の内部を正確に押さえる。
代数的データ型とパターンマッチの網羅性検査
なぜEnumとパターンマッチが「漏れのない安全なコード」を生むのか、その数理が腑に落ちる。直和・直積という代数の視点から、コンパイラの網羅性検査の中身まで一気につかめる。
抽象解釈と静的解析の理論
静的解析がなぜ「健全」と言い切れるのか。抽象解釈は具体的な実行を格子とガロア接続で安全に近似し、固定点として解を求める枠組みで、誤検知はあれど見逃しゼロを設計から保証します。
抽象構文木(AST)と中間表現(IR)の設計
最適化が効く理由は中間表現の設計で決まる。ソースをASTへ、さらに三番地コードやSSA、バイトコードへ落とす各段で何を解析し何を捨てるかを内部構造から読み解く。
動的ディスパッチとvtableの内部
仮想関数が「どこで呼び先を決めているか」を内部から押さえれば、継承時のレイアウトもインターフェース呼び出しのコストも見抜ける。vtableとfat pointerの実装差を原理から解き明かします。
動的リンクとシンボル解決(PLT/GOT・遅延束縛)
共有ライブラリ起動の謎が解けると、起動の遅さや謎のクラッシュの原因を切り分けられる。PIC・PLT/GOT・遅延束縛・シンボル干渉を原理から押さえる。
動的計画法の原理(最適部分構造と重複部分問題)
指数時間の素朴な再帰を多項式時間へ落とす設計原理がわかる。最適部分構造と重複部分問題の2条件、状態と遷移の立て方を、ナップサックや編集距離から原理で押さえられる。
同期処理と非同期処理
通信やファイル読み書きの待ち時間をうまく扱う鍵が同期と非同期。結果を待ってから進むか、待たず先へ進んで後で受け取るかの違いをやさしく解説。
任意精度演算(多倍長整数)の内部
BigInt がなぜ任意の桁を扱えるのかを内部表現から理解でき、巨大整数演算の速さの勘所がつかめる。桁配列・桁上がり・乗算アルゴリズムの閾値切り替えまで原理から解説。
評価戦略(正格・遅延・名前呼び/値呼び)
値呼びと参照呼びの取り違えで起きるバグや、無限リストが書ける理由を一段深く理解できる。評価のタイミングという軸で言語の挙動を見通せるようになります。
浮動小数点数の内部(IEEE 754と誤差)
なぜ0.1が正確に表せないのかを内部構造から理解でき、金額計算や条件比較のバグを根本から防げるようになる。IEEE 754のビット配置と誤差の発生原理を実務目線で解説。
部分型付けと分散(共変・反変)
ジェネリクスの型引数を「いつ広げて・いつ狭めて」代入できるかが腑に落ちる。共変・反変・不変の規則を関数型から導き、配列共変が招く型安全性の穴まで原理で押さえます。
分割統治法とマスター定理
再帰アルゴリズムの計算量を、漸化式とマスター定理で一目で見抜けるようになる。Karatsuba や Strassen が素朴な下界を破る仕組みまで原理から腹落ちさせる。
文字コードとUnicodeの内部(符号化と正規化)
なぜ絵文字で文字数がずれ、見た目が同じ文字列が==で不一致になるのか。コードポイント・UTF-8/16・サロゲート・書記素・正規化の内部を押さえ、文字化けと比較バグを根本から防げる。
文字列照合アルゴリズム(KMP・Boyer-Moore・Rabin-Karp)
テキストからパターンを探す処理を、素朴照合の O(nm) から線形級へ引き上げる。KMP・Boyer-Moore・Rabin-Karp の前処理と原理を押さえ、用途ごとの選び方まで腹落ちさせる。
文字列内部表現(イミュータブル・インターン・SSO)
同じ文字列の==が速い言語と遅い言語の差、短い文字列でヒープ確保が起きない理由がわかる。不変・インターン・SSO・ロープという処理系の文字列実装を押さえ、性能とメモリの勘所を掴める。
平衡木の原理(赤黒木・B木・AVL木)
なぜ木を平衡に保つだけで検索が速くなるのかが腑に落ちる。AVL・赤黒木・B/B+木の平衡条件と回転・分割を、メモリ内かディスクかという用途の違いから正確に押さえる。
並行性のテスト(決定性再生とモデル検査)
たまにしか落ちない並行バグを、運任せでなく原理で潰す手立てがある。インターリーブの網羅探索・決定性再生・モデル検査の三本柱で、再現と検証を機械に任せる方法を整理します。
並行性モデル(CSP・アクター・STM)
ロックで悩む並行処理を、より安全な計算モデルで設計し直すための地図がここにある。共有メモリ・CSP・アクター・STMの同期原理と向き不向きを整理。
並列プログラミングモデル(データ並列・タスク並列・SPMD)
OpenMPやMPI、GPGPUがどの並列モデルに属するのか迷わなくなる。データ並列・タスク並列・SPMD・PGASの分類軸と、各APIの対応関係を整理。
並列計算の理論限界(アムダール則とグスタフソン則)
コアを増やしても速くならない上限を式で見抜き、どこを並列化すれば投資が報われるかを判断できるようになる。アムダール則の悲観とグスタフソン則の楽観を一本の理屈でつなぐ。
変数とデータ型
代入やコピーの挙動を正しく理解できるのが変数とデータ型の基礎。値に付ける名札としての変数と、プリミティブ・参照型での違いをやさしく解説。
末尾呼び出しとスタックフルvsスタックレス
なぜGoroutineは数十万本でも軽く、async/awaitは関数を汚染するのか。OSスレッドからファイバーまでの切り替えコストとメモリを横並びで比べ、ランタイム選択の根拠が手に入ります。
末尾呼び出し最適化と継続(CPS)
末尾再帰がなぜスタックを食わずに済むのか、その原理を一段深く理解できる。継続(CPS)まで知れば、例外も非同期も同じ仕組みの応用だと見通せます。
末尾再帰以外の再帰除去とループ変換
再帰をループに変えるだけでは終わらない。不変式の巻き上げ・展開・融合・交換・タイリングを知れば、同じ計算でも局所性と並列性を引き出して桁違いに速くできます。
乱択アルゴリズムと確率的解析
なぜ乱数を混ぜると最悪ケースを潰せるのかが腑に落ちる。乱択クイックソートやミラーラビン素数判定を題材に、期待計算量と成功確率の保証、Las Vegas と Monte Carlo の違いを原理から正確に押さえる。
例外処理(エラーハンドリング)
本来の処理とエラー処理を分けて書ける利点はここにある。処理が続けられない事態をエラーとして投げ、呼び出し側でまとめて受け止める例外処理の仕組み。
例外処理の実装(テーブル駆動とスタック巻き戻し)
投げていない間は一切遅くならないのに、なぜ throw できるのか。アンワインドテーブル・ランディングパッド・デストラクタ呼び出しまで、ゼロコスト例外の内部機構を原理から押さえる。
貪欲法と最適性の証明(交換論法・マトロイド)
貪欲法が「たまたま当たる」のか「必ず最適」なのかを見極める力が手に入る。交換論法とマトロイドで正当性を証明し、区間スケジューリングやハフマン符号で実際に確かめる。