💻

Languages

プログラミング言語

プログラミング言語とは

プログラミング言語は、人間がコンピュータに指示を与えるための形式言語です。 人間が理解しやすい構文で書かれたコードを、最終的にコンピュータが実行できる機械語に変換します。

抽象化のレベル: 低水準言語(アセンブリ)は機械に近く、高水準言語(Python)は人間に近い。 抽象化が高いほど書きやすいが、細かい制御が難しくなる。

言語の分類

実行モデル

コンパイル型

ソースコードを事前に機械語に変換。実行速度が速い。

例: Go, Rust, C, C++

インタプリタ型

実行時に逐次解釈。開発サイクルが速い。

例: Python, Ruby, Bash

JIT(Just-In-Time)

実行時にコンパイル。両方の利点を持つ。

例: Java, JavaScript, C#

型システム

静的型付け

コンパイル時に型チェック

Go, Rust, TS
  • ✓ 実行前にエラー発見
  • ✓ IDE支援が強力
  • ✓ リファクタリングが安全

動的型付け

実行時に型チェック

Python, Ruby, JS
  • ✓ 柔軟で書きやすい
  • ✓ プロトタイピングが速い
  • △ ランタイムエラーのリスク

プログラミングパラダイム

パラダイムは、プログラムの構造や問題解決のアプローチを決める「考え方」です。 多くの言語は複数のパラダイムをサポートします。

手続き型(Procedural)

処理を順番に記述。関数で処理をまとめる。シンプルで理解しやすい。

例: C, Bash, 初期のPython

オブジェクト指向(Object-Oriented)

データと処理を「オブジェクト」としてまとめる。カプセル化、継承、ポリモーフィズム。 大規模開発で広く使用。

例: Java, Python, Ruby, C++

関数型(Functional)

関数を第一級オブジェクトとして扱う。不変性、副作用の排除、高階関数。 並行処理と相性が良い。

例: Haskell, Elixir, Scala(Go/Rust/JSも部分的にサポート)

プロセス・スレッド・並行処理

言語やランタイムがどのように並行処理を行うかを理解することは、パフォーマンスチューニングやトラブルシューティングに不可欠です。

プロセス

Process
メモリ空間
ファイルハンドル
セキュリティコンテキスト
~1MB+ / プロセス

独立したメモリ空間

スレッド

Process
T1
T2
T3
~1MB / スレッド

メモリ共有、OSスケジュール

goroutine / 軽量スレッド

Process
g
g
g
g
g
g
g
g
g
g
g
g
~2KB / goroutine

ユーザー空間スケジュール

特性プロセススレッドgoroutine/軽量スレッド
メモリ独立(重い)共有(~1MB/スレッド)共有(~2KB)
生成コスト高い中程度低い
スケジューリングOSOSランタイム (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/インフラでよく使う言語

GoKubernetes、Docker、Terraform、Prometheus - インフラツールの標準
Python自動化、AWS Lambda、Ansible、データ処理 - 万能スクリプト言語
Rust高性能ツール、セキュリティ重視 - 次世代システム言語
TypeScriptAWS CDK、Pulumi、フロントエンド - 型付きJavaScript
Bashシェルスクリプト、CI/CD、簡単な自動化 - どこでも使える

ランタイムアーキテクチャ

SRE/インフラで重要: 各言語のリクエスト処理フローを理解することで、 エラー発生時にどの層で問題が起きているか素早く特定できます。

実行モデル別

言語の実行方式によって分類。各カテゴリで具体的な言語を学べます。

共通トピック

言語共通の重要な概念を深掘りします。