プログラミング言語

Elementry
最終更新: タグ: Introduction

プログラムはコンピューターが従う命令のリストだと学んだ。でもここで疑問が浮かぶ:その命令はどの言語で書かれているのか? 答えはほぼ確実に「一つの言語ではない」だ。その理由を理解すると、ソフトウェアの世界全体がはるかに見えやすくなる。

なぜこんなに多くのプログラミング言語が存在するか

日本語で例えるなら、英語は科学論文を書くのに向いていて、日本語は敬語で細かいニュアンスを表現しやすく、アラビア語は詩に美しく流れる。それぞれの言語は使う人たちの文化と需要の中で育った。「最良の」言語は存在しない — それぞれが特定のものに向いている。

プログラミング言語も似ている。何十年もの間、プログラマーは既存の言語がある仕事に使いにくかったり遅かったりする場面に繰り返し直面した。だから新しい言語を作った。新しい言語はそれぞれトレードオフをした — 書きやすさか、実行速度か?初心者に優しいか、上級者にパワフルか?バグから守るか、パフォーマンスのために柔軟にするか?

今日、何百もの言語が使われている。でもランダムではなく、解決する問題の種類ごとにまとまる傾向がある。そのまとまりを見ていこう。

汎用言語 — そしてその周りに形成されるコミュニティ

目にする言語の大部分は汎用プログラミング言語(general-purpose programming language)だ — ほぼどんなタスクにも使えるという意味だ。でも実際には、コミュニティ、ツール、ライブラリが特定のユースケースの周りに成長し、各言語に「本拠地」ができている。

この区別は重要だ。下に挙げるカテゴリー — ウェブ、ネイティブアプリ、インフラ — はそれぞれの言語が一般的に使われる場所を表すのであって、独占的に使われる場所ではない。Java は大規模なサーバーサイドウェブアプリで支配的だが、Minecraft は Java で書かれている。Rust はオペレーティングシステムや Cloudflare のグローバルネットワークインフラで広く使われているが、ウェブサービスを作るのに使ってもまったく問題ない。Kotlin は Android アプリの主力言語だが、サーバーでも動く。

料理に例えるなら、フランス人シェフはタイ料理を作れるし、素晴らしくできる人もいる。でも「フランス料理で知られているのは?」と聞かれれば、具体的な答えが出てくる。カテゴリーは実際に存在して役に立つ — ただし壁と勘違いしてはいけない。

ウェブを作る言語

ウェブサイトを開くとき、裏側では多くのことが起きている。ブラウザで動くコード(フロントエンド(front end))と、どこかのサーバーで動くコード(バックエンド(back end))がある。それぞれの側で異なる言語が主流だ。

JavaScript — ブラウザの言語

JavaScript(ジャバスクリプト)はブラウザがネイティブに理解できる唯一のプログラミング言語だ。ウェブサイトにインタラクティブな動作があれば — ドロップダウンメニュー、ライブ検索ボックス、何かをするボタン — その裏にはほぼ確実に JavaScript がある。

JavaScript は1995年にたった10日で作られ、それ以来ウェブの中心にあり続けている。いくつかのクセ(「変な動作」の丁寧な言い方)があるが、非常に強力でどこでも動く。

TypeScript(タイプスクリプト)は JavaScript の上に直接構築された新しい言語だ。型システムを追加する — プログラムが実行される前にコンピューターがエラーを検出できるよう、データにラベルを付ける仕組みだ。今日の本格的なウェブプロジェクトのほとんどは生の JavaScript の代わりに TypeScript を使っている。

サーバーサイド言語

サーバー — データを保存してブラウザに送るコンピューター — はほぼどの言語でも動かせる。よく使われる選択肢:

  • Java(ジャバ)は世界で最も古く、最も広く使われている言語の一つだ。冗長だが信頼性が高く、巨大な組織(銀行、航空会社、Google のバックエンド)が重要なシステムを任せている。「一度書けばどこでも動く」は Java の当初の約束だ — Java プログラムは書き直さなくてもどのコンピューターでも動く。

  • Kotlin(コトリン)は Java と同じプラットフォーム(JVM、つまり Java Virtual Machine)で動く現代的な言語だ。Java の荒削りな部分の多くを修正し、書き心地がはるかに良い。同じプロジェクトで Kotlin と Java のコードを混在できるため、会社は徐々に Kotlin を採用できる。

  • PHP(ピーエイチピー)はもとはウェブページに動的なコンテンツを追加するシンプルなツールだったが、インターネットの膨大な部分を支える完全な言語に成長した — WordPress、Wikipedia、Facebook はすべて PHP で始まった。

  • Ruby(ルビー)は Ruby on Rails というフレームワークで人気を得た。驚くほど少ないコードで完全に機能するウェブアプリを作れるようにした。開発者の幸福感と可読性を優先するが、その利便性と引き換えに生の速度を犠牲にする。

  • Elixir(エリクサー)は非常に古く実績のある Erlang(アーラン)というプラットフォームの上に構築された新しい言語だ。何百万人もの同時ユーザーを捌くシステム — ライブチャット、リアルタイム通知、マルチプレイヤーゲーム — を作るために設計されている。Discord プラットフォームは何百万もの同時接続を捌くために何年も Elixir を使っていた。

ネイティブアプリの言語

ネイティブアプリ(native app)とは、ブラウザの中で動くのではなく、特定のデバイスとオペレーティングシステム上で直接動くアプリだ。ネイティブアプリは一般的に速く、デバイスの機能(カメラ、GPS、センサー)へのアクセスが良いが、プラットフォームごとに異なる書き方が必要だ。

  • Kotlin(再登場)は Android アプリを作る主要言語だ。Google は2017年に Android の優先言語として採用し、その分野では Java を徐々に置き換えている。

  • Swift(スウィフト)は iPhone、iPad、macOS のアプリを作るための Apple の言語だ。Apple は2014年に、悪名高く奇妙な構文を持つ古い言語 Objective-C を置き換えるために Swift をリリースした。Swift は学びやすく、それでいて非常に速い。

  • C#(シーシャープ)は Microsoft の言語で、.NET プラットフォームの礎だ。Windows デスクトップアプリの構築に使われるが、MAUI などのフレームワークのおかげでクロスプラットフォームアプリも作れる。Unity ゲームエンジンでスクリプトを書くときにも使う言語だ。

  • C++(シープラスプラス)は今でも現役の最も古い言語の一つだ。コンピューターのハードウェアを極めて細かくコントロールできるため、パフォーマンスが重要なネイティブアプリの定番だ — AAA ビデオゲーム、グラフィックスエンジン、オーディオ処理ソフトウェア、ミリ秒単位で重要なアプリケーション。難しく間違えやすいというトレードオフがある。

  • Dart(ダート)は Google の言語で、主に Flutter のために設計されている。Flutter は一つのコードベースで Android、iOS、ウェブ、デスクトップのアプリを同時に配布できるフレームワークだ。Dart は比較的新しいが、Flutter の人気のおかげで急速に成長している。

インフラの言語

「インフラ」は広い言葉で、他のすべてのソフトウェアを可能にするもの全体をカバーする — OS、データベース、ネットワークツール、クラウドサービス、コンパイラなど。これらのシステムは極めて速く、極めて信頼性が高く、しばしばリソースが限られたハードウェアで動く必要がある。ここでは別のクラスの言語が主力だ。

  • C(シー)は現代プログラミング言語の祖先だ。ほとんどの OS — Windows、macOS、Linux — は主に C で書かれている。電子レンジ、車、ルーターの中のマイクロコントローラーも多くは C で動く。メモリとハードウェアへの直接アクセスを与えてくれる — それが超能力であり危険でもある。C はミスから守ってくれず、そのミスは深刻なバグを引き起こすことがある。

  • C++ もここで登場する — 基本的に C にオブジェクト指向機能を追加したものだからだ。ブラウザ(Chrome、Firefox)、データベースエンジン(MySQL、PostgreSQL)、ゲームエンジンは一般的に C++ で書かれている。

  • Go(ゴー、Golang とも呼ばれる)は2009年に Google で作られた。学びやすく、コンパイルが速く、多くのタスクを同時に処理するのが得意になるよう設計された。Go は現代のクラウドインフラのバックボーンになった — Docker、Kubernetes、Terraform はすべて Go で書かれている。

  • Rust(ラスト)は新しい言語だ(最初の安定版は2015年)。大胆な目標を掲げている — C と C++ と同じ速さで、でも安全に。Rust には、プログラムがクラッシュしたりセキュリティホールを作ったりするようなバグのクラス全体を、プログラムが実行される前のコンパイル時に発見するシステムがある。これがこのコースで学ぶことになる言語であり、Linux、Windows、ウェブブラウザ、組み込みシステムでの採用が増え続けている。

  • Erlang(アーラン)は1980年代に通信会社の Ericsson が電話交換機 — 絶対に落ちてはいけないシステム — を動かすために作った。Erlang は障害を優雅に処理して何百万もの軽量プロセスを同時に動かすための卓越したツールを持つ。WhatsApp のバックエンドは Erlang で動いていて、小さなエンジニアリングチームで毎日何十億ものメッセージを処理したことで有名だ。

  • COBOL(コボル、Common Business-Oriented Language)は1959年に設計され、今もひっそりと世界の金融インフラの多くを動かしている。銀行のコアトランザクション処理、社会保障の支払い、航空予約 — 膨大な量の COBOL コードがグローバル金融の基盤に横たわっている。使いにくいと評判があり、よく知っているプログラマーは減る一方だ。これは実際に重大な経済問題だ。

すべての「言語」が汎用プログラミング言語ではない

上に挙げたもの — JavaScript、Java、Rust、Go、Swift など — はすべて一つの重要な特性を共有する。汎用だということだ。原則として、それぞれを幅広い問題に向けることができる。でもコンピューティングの中には全く違うものがある。まったく一つの仕事をするために作られており、意図的に他のことをする能力を持たない。これをドメイン固有言語(domain-specific language)、略して DSL と呼ぶ。

SQL — データベースの言語

SQL(Structured Query Language、構造化照会言語。「シークエル」または「エスキューエル」と発音する)はデータベース — プラットフォームの全ユーザー、ストアの全商品、銀行の全取引といった整理されたデータの保存場所 — と会話するために使う。

SQL では Java や Rust でプログラムを「書く」ような意味でプログラムを書くのではない。代わりに質問をする:

-- "2024年1月1日以降に登録したすべてのユーザーの名前を取得"
SELECT name
FROM users
WHERE signup_date > '2024-01-01';

SQL は日常的な使い方ではチューリング完全ではなく(汎用言語のように任意の計算を表現できない)、単体でアプリを作ることはない。でもデータを保存するほぼすべてのアプリは裏で SQL を使っている — アプリは Python や Ruby や Java で書かれていて、そのコードがデータベースに SQL クエリを送る。

CSS — 視覚スタイルの言語

CSS(Cascading Style Sheets、カスケーディングスタイルシート)はウェブページ上のものがどう見えるかを記述する — 色、フォント、サイズ、スペース、レイアウト。HTML(ページの構造を記述する)と JavaScript(動作を追加する)と並んで使う。

CSS は伝統的な意味でのプログラミング言語ではない — 基本形には変数も、ループも、条件もない。実行する命令を与えるのではなく、適用するルールを宣言する。warning というクラスを持つ段落のテキストを赤にする。画面が600ピクセルより狭ければ、これらのカラムを横並びではなく縦に積む。

これらの「言語」はソフトウェアの絶対に不可欠な部分だ — 汎用プログラミングには使われないにしても。プログラムは JavaScript や Python で書かれるが、それらのプログラムは常に SQL や CSS を生成したり消費したりしている。「プログラム用の言語」対「何かを記述する言語」という区別は、テックの世界を掘り下げるにつれて役立つメンタルモデルだ。

トレードオフの世界

「最良の」プログラミング言語は存在しない。経験豊富な開発者はキャリアを通じていくつかの言語を使う。すべての言語は選択の集合体だ — 何を簡単にするか、何を可能にするか、何を不可能にするか。Rust はメモリバグのクラス全体を防ぐ。Python はデータ解析コードを書きやすくする。SQL は構造化されたデータへの質問を優雅にする。

気づくのは、2番目の言語を学ぶのは1番目より、3番目は2番目よりずっと簡単だということだ。概念 — ループ、条件、関数、データ構造 — はすべての言語に登場する。構文は変わっても、アイデアは残る。

まとめ

  • プログラミング言語はコンピューターが実行できる命令を書くための形式的な言語だ。今日、何百もの言語が使われており、それぞれ異なる強みを持つ。
  • ウェブのフロントエンド:JavaScript(と TypeScript)はブラウザがネイティブに動かせる唯一の言語だ。
  • ウェブのバックエンド:多くの言語がサーバーで使われている — Java、Kotlin、PHP、Ruby、Elixir が一般的な選択肢だ。
  • ネイティブアプリ:Android は Kotlin、Apple プラットフォームは Swift、Windows/.NET は C#、高パフォーマンスソフトウェアは C++、クロスプラットフォームアプリは Dart。
  • インフラ:OS とエンジンには C と C++、クラウドツーリングには Go、安全なシステムプログラミングには Rust、耐障害性の分散システムには Erlang、レガシー金融インフラには COBOL。
  • SQL や CSS のような**ドメイン固有言語(DSL)**は汎用プログラミング言語ではない。特定のものを記述したり照会したりするためのもので、単独のプログラムとしてではなく、プログラムのまたはとともに使われる。
  • 「最良の」言語はない。どれもトレードオフであり、優れた開発者は複数の言語を知っている。