- なぜ言語を比較するのか
- 比較のフレームワークと評価基準
- プログラミング言語の歴史的変遷と影響関係 (概観)
- パラダイムの定義と概要 (詳細はプログラミングパラダイム MOCも参照)
- 命令型プログラミング (Imperative Programming) の特徴と比較
[[C言語における命令型スタイル]]
[[Pascalにおける命令型スタイル]]
[[FORTRANにおける命令型スタイル]]
- 手続き型プログラミング (Procedural Programming) の特徴と比較 (命令型の一部)
[[C, Pascal, Goにおける手続きの扱いと比較]]
- オブジェクト指向プログラミング (OOP) の特徴と比較
[[クラスベースOOP (Java, C++, C#-python-の比較|, Python) の比較]]
[[プロトタイプベースOOP (JavaScript) の特徴]]
[[カプセル化の実現方法の比較 (private, protectedなど)]] (Java vs. C++ vs. Python)
[[継承の実現方法の比較 (単一継承 vs. 多重継承 vs. Mixin vs. Trait)]] (Java vs. C++ vs. Python vs. Ruby vs. Scala)
[[ポリモーフィズムの実現方法の比較 (仮想関数、ダックタイピングなど)]] (C++ vs. Python vs. Java)
- 関数型プログラミング (FP) の特徴と比較
[[純粋関数型言語 (Haskell) vs. マルチパラダイム言語におけるFP機能 (Scala, F#-javascript-python-java|, JavaScript, Python, Java)]]
[[第一級関数のサポート比較 (JavaScript vs. Python vs. Java vs. C++)]]
[[不変性 (Immutability) のサポート比較 (Scala vs. Clojure vs. Pythonのタプル vs. Javaのfinal)]]
[[高階関数の比較 (map, filter, reduceの実装と言語サポート)]]
[[遅延評価のサポート比較 (Haskell vs. Pythonのジェネレータ vs. ScalaのStream)]]
[[パターンマッチのサポート比較 (Haskell vs. Scala vs. F#-vs-python-310| vs. Python 3.10+)]]
- 宣言型プログラミング (Declarative Programming) の特徴と比較 (上記FP、論理型、クエリ言語など)
- マルチパラダイム言語 (Multi-paradigm Languages) の比較
[[Scala (OOP + FP) の特徴]]
[[Python (OOP + 手続き型 + FP要素) の特徴]]
[[C++ (手続き型 + OOP + FP要素 + ジェネリック) の特徴]]
[[JavaScript (プロトタイプOOP + FP要素) の特徴]]
[[Swift (OOP + FP要素) の特徴]]
[[Kotlin (OOP + FP要素) の特徴]]
[[Rust (システムプログラミング + 所有権 + FP要素) の特徴]]
- パラダイムの組み合わせとトレードオフ
- 型システムの基本概念
- 静的型付け (Static Typing) vs. 動的型付け (Dynamic Typing)
[[静的型付け言語の比較 (Java, C++, C#-go-rust-haskell-scala|, Go, Rust, Haskell, Scala)]]
[[動的型付け言語の比較 (Python, JavaScript, Ruby, Lisp)]]
- 漸進的型付け (Gradual Typing) (TypeScript, Pythonの型ヒント)
- 強い型付け (Strong Typing) vs. 弱い型付け (Weak Typing)
[[強い型付け言語の比較 (Python, Java, Haskell)]] (暗黙の型変換が少ない)
[[弱い型付け言語の比較 (C, JavaScriptの一部挙動)]] (暗黙の型変換が多い)
- 型安全 (Type Safety) との関係
- 型推論 (Type Inference)
- ジェネリックプログラミング (Generic Programming) / パラメータ多相 (Parametric Polymorphism)
[[ジェネリクスの実現方法の比較 (Javaのジェネリクス vs. C++のテンプレート vs. C#のジェネリクス-vs-goのジェネリクス|のジェネリクス vs. Goのジェネリクス)]]
- Constraints)
- 高度な型システムの機能比較
[[代数的データ型 (ADT) とパターンマッチのサポート比較 (Haskell, Scala, Rust, Swift)]]
[[型クラス (Haskell) vs. トレイト (Scala, Rust) vs. インターフェース (Go, Java) の比較]] (アドホック多相)
[[高カインド型 (Higher-Kinded Types) のサポート比較 (Scala, Haskell)]]
[[依存型 (Dependent Types) の導入言語 (Idris, Agda - 概要)]]
[[Null許容型 (Nullable Types) とNull安全 (Null Safety) の比較 (Kotlin, Swift, C#-javaのoptional|, JavaのOptional)]]
[[共変性 (Covariance) と反変性 (Contravariance) のサポート比較 (Java, C#-scala|, Scala)]]
[[構造的部分型 (Structural Subtyping) vs. 公称的部分型 (Nominal Subtyping)]] (Goのインターフェース vs. Javaのインターフェース)
- メモリ管理の概要
- 手動メモリ管理 (Manual Memory Management)
- 自動メモリ管理 (Automatic Memory Management)
- 値型 (Value Types) vs. 参照型 (Reference Types) とメモリ
[[Java (プリミティブ型 vs. オブジェクト型) とC#-struct-vs-class-の比較| (struct vs. class) の比較]]
[[スタック割り当て vs. ヒープ割り当ての比較]]
- エスケープ解析 (Escape Analysis)
- コンパイル方式 vs. インタプリタ方式 vs. ハイブリッド方式
[[コンパイル言語の比較 (C, C++, Go, Rust, Haskell, Scala)]] (AOTコンパイル)
[[インタプリタ言語の比較 (Python, Ruby, JavaScriptの一部実行)]]
[[ハイブリッド方式言語の比較 (Java, C#---バイトコードとjitコンパイル| - バイトコードとJITコンパイル)]]
- 仮想マシン (Virtual Machine - VM) の有無と比較
[[JVM (Java Virtual Machine) ベース言語 (Java, Scala, Kotlin, Clojure) の特徴]]
[[.NET CLR (Common Language Runtime) ベース言語 (C#, F#, VB.NET) の特徴]]
[[BEAM (Erlang VM) の特徴 (軽量プロセス、耐障害性)]]
- パフォーマンス特性の比較 (特定のベンチマークやユースケースに基づく)
- 低レベル操作の可否と比較
[[ポインタ操作、インラインアセンブリなどのサポート比較 (C, C++, Rust vs. Java, Python)]]
- 構文の冗長性 vs. 簡潔性
[[Java/C#の冗長性-vs-pythonrubyの簡潔性|の冗長性 vs. Python/Rubyの簡潔性]]
- ボイラープレートコードの量
- 記号の多用 vs. 自然言語に近い構文
[[Perl/APLの記号的多さ vs. Python/COBOLの平易さ]]
- 静的型付け言語の型宣言のスタイル比較 (
int x vs. x: int)
- インデントの強制 (Python) vs. 波括弧 (C系言語)
- 命名規則の慣習 (キャメルケース、スネークケースなど)
- コメントのスタイル
- DSL (Domain-Specific Language) の埋め込みやすさ (Ruby, Scala, Lispなど)
- 構文糖衣 (Syntactic Sugar) の多寡と比較
- コードフォーマッタとリンターの文化
- 標準ライブラリの充実度と比較
- パッケージマネージャと比較
[[npm (JavaScript), pip (Python), Maven/Gradle (Java), Cargo (Rust), RubyGems (Ruby), NuGet (C#|)]]
- サードパーティライブラリの豊富さと質
- フレームワークの比較
[[Webフレームワーク比較 (Django/Flask vs. Spring Boot vs. Ruby on Rails vs. Express.js vs. ASP.NET Core)]]
- ビルドツールと比較 (Make, Ant, Maven, Gradle, Webpack, Cargoなど)
- IDEと開発ツールのサポート状況
- スレッドベースの並行処理
- プロセスベースの並行処理
- 軽量プロセス / コルーチン / 非同期処理
[[Goのゴルーチン (Goroutines) とチャネル (Channels)]]
[[Kotlinのコルーチン (Coroutines)]]
[[Pythonのasync/await (asyncio)]]
[[JavaScriptのasync/awaitとPromise]]
[[C#のasyncawait-task-parallel-library|のasync/await (Task Parallel Library)]]
[[Erlang/Elixirのアクターモデル (Actor Model) と軽量プロセス]]
[[JavaのProject Loom (Virtual Threads)]]
- データ並列性 (Data Parallelism)
[[SIMD命令の利用しやすさ]]
[[並列コレクション処理のサポート比較 (Java Streams, Scala Parallel Collections)]]
- 共有メモリ vs. メッセージパッシング
- 関数型プログラミングと並行性の親和性 (不変性による副作用の排除)
- 戻り値によるエラー通知
[[C言語のエラーコードとerrno]]
[[Goの多値返し (value, error)]]
- 例外処理 (Exception Handling)
- Option/Maybe型とResult/Either型によるエラー処理 (関数型スタイル)
[[RustのResult<T, E>とOption<T>]]
[[ScalaのOption[T]とEither[A, B]]]
[[HaskellのMaybe aとEither a b]]
[[JavaのOptional<T>]]
- パニック (Panic) / フェイルファスト (Fail-Fast)
[[Goのpanic/recover]]
[[Rustのpanic!]]
- エラー処理のベストプラクティスと言語ごとの慣習
- メタプログラミングの定義 (コードを生成・操作するコード)
- 実行時メタプログラミング (Runtime Metaprogramming)
[[リフレクション (Reflection) のサポート比較 (Java, C#-python-go|, Python, Go)]]
[[Pythonのデコレータ、メタクラス]]
[[Rubyのオープンクラス、sendメソッド]]
[[JavaScriptのプロキシオブジェクト]]
- コンパイル時メタプログラミング (Compile-time Metaprogramming)
[[C++のテンプレートメタプログラミング (TMP)]]
[[Lisp系のマクロ (Macros)]] (Scheme, Common Lisp, Clojure)
[[Rustのマクロ (宣言的マクロ、手続き的マクロ)]]
[[Scalaのマクロ]]
[[D言語のコンパイル時関数実行(CTFE)と文字列Mixin]]
- アノテーション (Annotations - Java) / 属性 (Attributes - C#) / デコレータ (Decorators - Python)
- コード生成ツールの利用
- 言語の設計目標とトレードオフ
[[C ("Simplicity, Efficiency, Portability" - at a low level)]]
[[C++ ("Zero-overhead abstraction", Multi-paradigm for systems programming)]]
[[Java ("Write Once, Run Anywhere", Object-Oriented, Robustness)]]
[[Python ("Readability counts", Simplicity, Rapid development)]]
[[JavaScript ("Ubiquity in browsers", Event-driven, Dynamic)]]
[[Go ("Simplicity, Concurrency, Fast compilation, Static linking")]
[[Rust ("Memory safety without GC, Concurrency, Performance")]
[[Haskell ("Purity, Laziness, Strong static typing")]]
[[Lisp ("Programmable programming language", Homoiconicity)]]
- 言語コミュニティの文化と価値観
- 「正しいやり方 (The Right Way)」の提示度合い (Pythonの”one obvious way” vs. PerlのTIMTOWTDI)
- システムプログラミング (
C, C++, Rust, Go, Zig)
- Web開発 (バックエンド) (
Python (Django/Flask), Java (Spring), C# (ASP.NET), Ruby (Rails), JavaScript (Node.js), Go, PHP, Elixir (Phoenix))
- Web開発 (フロントエンド) (
JavaScript, TypeScript とそのフレームワーク React, Angular, Vue, Svelte)
- モバイルアプリ開発 (
Swift (iOS), Kotlin/Java (Android), Dart (Flutter), C# (Xamarin/MAUI), JavaScript (React Native))
- データサイエンスと機械学習 (
Python (NumPy, Pandas, Scikit-learn, TensorFlow, PyTorch), R, Julia, Scala (Spark))
- ゲーム開発 (
C++, C# (Unity, Godot), Lua (scripting))
- 組み込みシステム (
C, C++, MicroPython, Rust)
- デスクトップアプリケーション (
C++, C#, Java (Swing/JavaFX), Python (Tkinter/Qt/Kivy), Swift/Objective-C)
- DevOpsとスクリプティング (
Python, Ruby, Go, Bash, PowerShell)
- 科学技術計算 (
FORTRAN, Python, Julia, MATLAB, R)
- 金融業界 (
Java, C++, Python, Scala)
- 習得の容易さ
[[Pythonの初心者向け vs. C++/Haskellの学習曲線]]
- ドキュメンテーションの質と量
- エラーメッセージの分かりやすさ
- デバッグのしやすさ
- ツールのエコシステム (IDE, linter, formatter, debugger)
- コミュニティサポート (Stack Overflow, forums, etc.)
- 「楽しさ」や「生産性」の主観的評価 (開発者アンケートなど)
- 他言語との連携のしやすさ
[[C/C++とのFFI (Foreign Function Interface) のサポート]] (多くの言語が提供)
[[JVM言語間の相互運用 (Java, Scala, Kotlin)]]
[[.NET言語間の相互運用 (C#, F#, VB.NET)]]
[[WebAssembly (Wasm) へのコンパイルターゲットとしての言語]]
- プラットフォームサポート (OS, アーキテクチャ)
- 標準データフォーマット (JSON, XML, Protocol Buffersなど) の扱いやすさ
- メモリ安全性
- 型システムとセキュリティ (静的型付けによるエラー防止)
- サンドボックス化と実行環境の分離
- 標準ライブラリにおけるセキュアなAPIの提供 (暗号化、入力検証など)
- 脆弱性スキャナや静的解析ツールの利用しやすさ
- 言語レベルでの並行処理の安全性