Languages
プログラミング言語
プログラミング言語とは
プログラミング言語は、人間がコンピュータに指示を与えるための形式言語です。 人間が理解しやすい構文で書かれたコードを、最終的にコンピュータが実行できる機械語に変換します。
抽象化のレベル: 低水準言語(アセンブリ)は機械に近く、高水準言語(Python)は人間に近い。 抽象化が高いほど書きやすいが、細かい制御が難しくなる。
言語の分類
実行モデル
コンパイル型
ソースコードを事前に機械語に変換。実行速度が速い。
例: Go, Rust, C, C++
インタプリタ型
実行時に逐次解釈。開発サイクルが速い。
例: Python, Ruby, Bash
JIT(Just-In-Time)
実行時にコンパイル。両方の利点を持つ。
例: Java, JavaScript, C#
型システム
静的型付け
コンパイル時に型チェック
- ✓ 実行前にエラー発見
- ✓ IDE支援が強力
- ✓ リファクタリングが安全
動的型付け
実行時に型チェック
- ✓ 柔軟で書きやすい
- ✓ プロトタイピングが速い
- △ ランタイムエラーのリスク
プログラミングパラダイム
パラダイムは、プログラムの構造や問題解決のアプローチを決める「考え方」です。 多くの言語は複数のパラダイムをサポートします。
手続き型(Procedural)
処理を順番に記述。関数で処理をまとめる。シンプルで理解しやすい。
例: C, Bash, 初期のPython
オブジェクト指向(Object-Oriented)
データと処理を「オブジェクト」としてまとめる。カプセル化、継承、ポリモーフィズム。 大規模開発で広く使用。
例: Java, Python, Ruby, C++
関数型(Functional)
関数を第一級オブジェクトとして扱う。不変性、副作用の排除、高階関数。 並行処理と相性が良い。
例: Haskell, Elixir, Scala(Go/Rust/JSも部分的にサポート)
プロセス・スレッド・並行処理
言語やランタイムがどのように並行処理を行うかを理解することは、パフォーマンスチューニングやトラブルシューティングに不可欠です。
プロセス
独立したメモリ空間
スレッド
メモリ共有、OSスケジュール
goroutine / 軽量スレッド
ユーザー空間スケジュール
| 特性 | プロセス | スレッド | goroutine/軽量スレッド |
|---|---|---|---|
| メモリ | 独立(重い) | 共有(~1MB/スレッド) | 共有(~2KB) |
| 生成コスト | 高い | 中程度 | 低い |
| スケジューリング | OS | OS | ランタイム (M:N) |
| 同時実行数 | 数十〜数百 | 数千 | 数百万 |
| 通信 | IPC (パイプ, ソケット) | 共有メモリ + ロック | チャネル / 共有メモリ |
言語別の並行処理モデル
PHP
プロセスベース (PHP-FPM)
リクエストごとに独立したプロセス。メモリは共有されない(Shared Nothing)。 シンプルだがメモリ効率は低い。
Python
GIL制約あり
マルチスレッドでもGILにより同時に1スレッドのみ実行。 I/O待ちには有効だがCPU並列処理にはmultiprocessingを使用。
Java
マルチスレッド
OSスレッドを使用。スレッドプール(ExecutorService)でリソース管理。 Virtual Threads(Java 21+)で軽量化。
Go
goroutine + チャネル
M:Nスケジューリングで数百万のgoroutineを少数のOSスレッドで実行。 チャネルによる安全な通信。
SRE/インフラ観点
- • PHP-FPM: pm.max_children でワーカープロセス数を制限
- • Python: Gunicorn workers でプロセス数を調整
- • Java: スレッドダンプで問題スレッドを特定
- • Go: goroutine数の監視、リーク検出
SRE/インフラでの言語の役割
CLIツール開発
kubectl, terraform, docker など多くのツールはGoで書かれている。 シングルバイナリ、クロスコンパイルが強み。
推奨: Go, Rust
自動化スクリプト
デプロイ、監視、データ処理の自動化。 豊富なライブラリと書きやすさが重要。
推奨: Python, Bash
バックエンドサービス
API、マイクロサービスの実装。 パフォーマンス、並行処理、保守性のバランス。
推奨: Go, Python, Rust, TypeScript
Infrastructure as Code
Terraform (HCL)、Pulumi、AWS CDK。 インフラを宣言的または命令的に記述。
推奨: HCL, TypeScript, Python
言語選択の考え方
「最高の言語」は存在しません。タスク、チーム、制約に応じて最適な言語を選択することが重要です。
| 考慮点 | 質問 | 選択の指針 |
|---|---|---|
| パフォーマンス | レイテンシ要件は厳しい? | 厳しい → Go, Rust / 緩い → Python |
| 開発速度 | 素早くプロトタイプが必要? | 速さ重視 → Python / 品質重視 → Go, TS |
| エコシステム | 必要なライブラリはある? | K8s → Go / ML → Python / Web → TS |
| チームスキル | チームが使える言語は? | 学習コストと生産性のバランス |
| 保守性 | 長期メンテナンスが必要? | 型あり → Go, TS, Rust |
SRE/インフラでよく使う言語
ランタイムアーキテクチャ
SRE/インフラで重要: 各言語のリクエスト処理フローを理解することで、 エラー発生時にどの層で問題が起きているか素早く特定できます。
実行モデル別
言語の実行方式によって分類。各カテゴリで具体的な言語を学べます。
共通トピック
言語共通の重要な概念を深掘りします。