ソースコード(英: source code)は、プログラミング言語で書かれた、コンピュータプログラムを表現する文字列である。

## 概要

ソースコードはプログラミング言語を用いて書かれるものであり、各種コンピュータハードウェア(プロセッサ)のための機械語や仮想機械のための中間表現(バイトコード)よりも、人間が読み書きするのに適している。

ソースコードをコンピュータがどのように処理するかは、そのプログラミング言語の処理系によってさまざまである。与えられたソースコードをそのまま、インタプリタによって逐次的に実行する処理系もあるし、事前にソースコードをコンパイラによって機械語(またはアセンブリ言語)で書かれたオブジェクトコードに変換し、リンカによってライブラリやリソースと結合して実行可能ファイル(ロードモジュール)を生成し、オペレーティングシステム (OS) がその実行可能ファイルをメインメモリに読み込んでプログラムを実行するケースもある。コンパイル時に機械語には直接変換せず、いったん仮想機械向けの中間表現に変換しておき、実行時コンパイラによってプログラム実行時に環境に合わせた機械語にコンパイルする処理系もある。Pythonのような動的プログラミング言語で書かれたプログラムの一般的な配布形態はソースコードであり、ソースコードを解釈して実行するための言語処理系を実行環境にインストールする必要があるが、PyInstallerのように実行ファイルに事前変換するツールも存在する。

設計から実装へ、というプログラミングの過程(詳細は「プログラミング」の記事を参照)で、ソースコードを記述することを特に指してコーディングという。

ソースコードの量は通例ソフトウェアの規模に比例して増大する。ごく小規模のソフトウェアではソースコードが単一のソースファイルに収まるケースもあるが、大規模なソフトウェアでは通例機能ごとにソースコードを分類し、複数のソースファイルに分散して記述することでソースコードのメンテナンス性を確保する。ソースコードの行数をもとにソフトウェア開発プロジェクトの規模を見積もる手法も存在する。

### 例

下記のテキストはJavaのコンソールアプリケーションのソースコードの一例である。

Javaで書かれたプログラムはJava仮想マシン (Java VM, JVM) 上で実行されるが、一般的にJavaソースコード自体を直接実行させることはなく、コンパイラによってJavaバイトコードに変換したうえで実行される。例えば上記のテキストを"Main.java"という名前と拡張子を持つテキストファイル(Javaソースファイル)として保存したうえで、ソフトウェア開発キットであるJava Development Kit (JDK) に含まれるコンパイラjavacによってコンパイルする必要がある。コンパイラによって生成されたJavaクラスファイルとコマンドラインツールjarを用いることによってJARファイルを生成する。一般的にエンドユーザー環境に配布されるのはJavaソースファイルではなく、バイトコードなどを含むJARファイルの形態であり、Java Runtime Environment (JRE) がインストールされた任意の環境で実行できるようになる。

なお、プログラミング言語のソースファイルはテキストファイル形式であり、任意のテキストエディタで閲覧・編集することができるが、テキストに含まれる言語固有のキーワード(あるいは予約語)やコメントなどを認識し、色分けして分かりやすく表示するシンタックスハイライトに対応したコードエディタが使われることが多い。統合開発環境 (IDE) に搭載されているコードエディタは、いくつかの言語のシンタックスハイライトに標準で対応しているほか、設定変更やプラグインの導入によって対応言語を増やすことができるようになっていることもある。

下記は上記のテキストに対してMediaWikiによるシンタックスハイライトを適用した結果である。

プログラミング関連の書籍には説明やサンプル用のソースコードまたは疑似コードが掲載されているが、モノクロ印刷の都合上、色によるシンタックスハイライトができない代わりにボールド体(太字)やイタリック体(または斜体)でキーワードやコメントが区別されていることもある。

## 定義

ソースコードの定義は明瞭でない。しかし様々な定義が試みられている。

Linux Information Project (LINFO) はソースコードを「プレーンテキストの形で1から人間によって書かれたソフトウェア。例えば人が読めるアルファベットの形であったり、人によってコンピュータにタイプされたりするもの」と定義している。すなわちソースコードはプレーンテキスト(人の言葉)で書かれたもので、機械が生成・変換したのではなく人が1から書いてできているソフトウェアの実体を指す。ソース(源)という語が示すように、ソフトウェアはソースコードを変換(コンパイル)して生成した機械語によって動作するため、ソースコードはソフトウェアの源/ソースである。

ソースコードは人が書くものだが、より抽象度の高い表現でソフトウェアを記述し、それを基に従来人が書いていたソースコードを機械に書かせる(機械に生成させる)ことが古くからおこなわれてきた(トランスパイラ、自動プログラミング)。機械が生成したコードは人が書いたものではなく、また機械の生成物であって生成元(ソース)ではないため、上記の定義からするとソースコードではない。ただし従来ソースコードだったものが生成されているので、この種の中間コードもソースコードと呼ばれることがある(cf. 自動プログラミング § ソースコード生成)。現代のソフトウェア開発では大元の高水準ソースコードが幾重にもわたって中水準のソースコードまたは中間表現にコンパイル/トランスパイルされ、最終的に機械語のコード/プログラムとなる場合が多い(例: C#→CIL→機械語、TypeScript→JavaScript ES6→JavaScript ES5→機械語)。

アセンブリ言語のような低水準言語のプログラムを、ニーモニックを使って手作業で記述したものはソースコードと言えるが、プログラムの規模が増大した現代では保守性の観点から、低水準言語を直接使ってプログラムを記述する機会は少ない。通例ソースコードは高水準言語を使って記述・保守されるようになっている。

## ソースコードの公開・非公開

ソースコードはソフトウェアの開発段階を経て機械語を生成した後でもそのソフトウェアの保守に不可欠であり、類似ソフトウェアの新たな開発や既存ソフトウェアの改善に有用であり、また、ソフトウェアに制御されるハードウェアの内容を知る大きな手がかりともなるため、ソースコードを独占あるいは逆に公開することは大きな意味を持つ。

一般に人間には機械語は扱いがたく、特に1990年代以降のPCで使用されている大規模なOSやアプリケーションソフトウェアのプログラム全体を機械語で書くことはほとんど不可能である。そのため、通常は人間にとって理解のしやすいプログラミング言語によって書かれたソースコードとしてプログラムを作成し、その後にコンパイラなどを用いてまとめて機械語に変換する。変換された機械語プログラム(バイナリ)は数値の羅列にすぎず、人間には理解が極めて困難である。機械語を各プロセッサに対応するアセンブリ言語のニーモニックに変換して表示することで、命令レベルのプログラム内容を把握することも可能ではあるが、読解の効率や保守性の点で問題がある。従って、既存のプログラム上の誤りであるバグを修正したり、改良を加えたりするためには元のソースコードが必須である。

知的財産権を収益の根幹とするソフトウェア産業では、ソースコードを企業秘密として保持し、使用者には機械語プログラムの複製の使用権を販売することで利益を得ていることが多い。このような考え方の下に開発されているソフトウェアはプロプライエタリソフトウェアと呼ばれる。これらの企業にとってはソースコードは独占すべき重要な資産である。もしソースコードが流出すれば、自社の開発成果が競合他社の製品に利用される恐れがある。

これに対し、ソースコードを積極的に公開しようとする考え方もある。

- アメリカ合衆国の政府資金によるソフトウェア開発では、開発成果は納税者である国民に還元すべきであるとの考えから、ソースコードを一般に公開する場合も多い。
- リチャード・ストールマンとフリーソフトウェア財団の考えによれば、コンピュータの利用者は自由にソフトウェアによる恩恵を享受できるべきであり、その実現に反するソースコードの独占・隠蔽は許されない不道徳である(自由ソフトウェア運動)。
- エリック・レイモンドに代表されるオープンソース支持者の中には、ソースコードの公開がソフトウェアの発展のためには有用であるという考え方もある。
- レッドハットのビジネスモデルのように、知的所有権よりはブランドイメージとユーザーサポート、安心感を売る形態の場合、ソースコードの公開が戦略的に有意義であることもある。ソースコードを独占しておくよりは、それを公開することでそのソフトウェアを普及させ、市場の拡大に役立てた方が良い場合である。
- UNIXやLinux、Androidのように、OSのソースコードが公開され、ライセンスの範囲内で利用と改変が許可されていることが、サードパーティの参入障壁を下げ、ハードウェアおよびアプリケーションソフトウェアの実行プラットフォームの普及につながっているケースもある。

## リバースエンジニアリング

通例、ソースコードから実行コードへの変換で多くの情報が失われるため、実行コードから完全なオリジナルのソースコードを得ることはできない(不可逆変換)。しかし、実行コードしか入手できない場合であっても、時間と手間を掛ければリバースエンジニアリングによってソースコードに近いものを作り出すことは可能である。このため、真に機密保持が重要なプログラム、例えば暗号化装置のようなものでは意図的にプログラムが複雑に構成され、物理的にも読み出しにくいハードウェアに記録されているものがある(セキュリティについては隠蔽によるセキュリティも参照のこと)。

Java VMや.NET Frameworkなど、仮想マシンあるいは中間言語方式のフレームワーク上で動作するアプリケーションソフトウェアは、バイナリ形式にコンパイルおよびビルドされた後も型名や変数名といったプログラム自身に関するメタデータを多く含んでおり、逆コンパイルによりJavaやC#といった高水準言語のソースコードに変換することもできることから、比較的リバースエンジニアリングしやすい性質を持つ。プロプライエタリな商用ソフトウェアにこのようなフレームワークを利用する場合、第三者によるリバースエンジニアリングを防止するために、難読化 (obfuscation) を施すこともある。

## 兵器のソースコード

兵器で使用されるプログラムのソースコードはきわめて重要な機密とされる場合が多い。

プログラムに起因する兵器の限界や制限を知っていれば、対抗手段を得られる可能性が高くなる、という指摘がある。

## 用語の由来

コンピュータプログラムのことを「コード」と呼ぶ慣習は元々、プログラミング言語が広く使われるより以前のコンピュータの黎明期に、機械語またはそれを直接表現する「ニモニック」(mnemonic) によるアセンブリ言語のプログラムが、まるで暗号のようだ、ということに由来する(なお、暗号学では「コード」とは暗号の分類の一つである。「コード (暗号)」の記事などを参照)。

よってその由来からは、「ソースファイル」はともかく「ソースコード」とはコンピュータプログラムのものだけを指すことになるが、ハードウェア記述言語によるハードウェアの記述なども広義としてソースコードと呼ばれていることもある。

コーディングという言葉は、元々はアセンブリ言語のようなごく低水準の言語でプログラムを書く作業、というきわめて限定された意味から派生して、一般にソースコードを記述する、という意味になった語である。しかし、近年はHTMLを書くという意味にも使われるなど濫用され気味である(なお、デモシーンでは機械語のテクニックを駆使して高効率のプログラムを書く、というような本来の意味に近い意味で使われている)。

### 和訳

プログラムを「算譜」等とした過去の日本語訳の類例として、ソースコードを原算帳と訳した例がある。