ソースコード

[[ファイル:CodeCmmt002.svg|thumb|Javaのソースコードをシンタックスハイライトした例。赤  の範囲と緑  の行で示されているのがコメントで、青  で示されているのが有効なコードである。]]ソースコードは、プログラミング言語で書かれた、コンピュータプログラムを表現する文字列である。

1. 概要
-----

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

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

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

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

2. 定義
-----

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

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

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

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

3. ソースコードの公開・非公開
----------------

ソースコードはソフトウェアの開発段階を経て機械語を生成した後でもそのソフトウェアの保守に不可欠であり、類似ソフトウェアの新たな開発や既存ソフトウェアの改善に有用であり、また、ソフトウェアに制御されるハードウェアの内容を知る大きな手がかりともなるため、ソースコードを独占あるいは逆に公開することは大きな意味を持つただし、動的なウェブページの制御に使われるプログラミング言語であるJavaScriptのソースコードは、ウェブサイト作成に使われる[[HyperText Markup Language。

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

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

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

アメリカ合衆国の政府資金によるソフトウェア開発では、開発成果は納税者である国民に還元すべきであるとの考えから、ソースコードを一般に公開する場合も多い。
リチャード・ストールマンとフリーソフトウェア財団の考えによれば、コンピュータの利用者は自由にソフトウェアによる恩恵を享受できるべきであり、その実現に反するソースコードの独占・隠蔽は許されない不道徳である。
エリック・レイモンドに代表されるオープンソース支持者の中には、ソースコードの公開がソフトウェアの発展のためには有用であるという考え方もあるオープンソース支持者の考えでは、例えば有用なソフトウェアの場合、ソースコードを公開すると直ちに世界中のソフトウェア開発者が興味を引かれてソースコードを読み漁るので、重要なバグは直ちに修正される。足りない機能は直ちに追加される。レイモンドはこのことを論文「伽藍とバザール」の中で「目玉の数さえ十分あれば、どんなバグも深刻ではない」[1]と言い表した。これはLinuxのような成功したオープンソースプロジェクトに共通する性質である。}}。
レッドハットのビジネスモデルのように、知的所有権よりはブランドイメージとユーザーサポート、安心感を売る形態の場合、ソースコードの公開が戦略的に有意義であることもある。ソースコードを独占しておくよりは、それを公開することでそのソフトウェアを普及させ、市場の拡大に役立てた方が良い場合である。
UNIXやLinux、Androidのように、OSのソースコードが公開され、ライセンスの範囲内で利用と改変が許可されていることが、サードパーティの参入障壁を下げ、ハードウェアおよびアプリケーションソフトウェアの実行プラットフォームの普及につながっているケースもある。

4. リバースエンジニアリング
---------------

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

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

5. 兵器のソースコード
------------

兵器で使用されるプログラムのソースコードはきわめて重要な機密とされる場合が多い軍用機の例では日本の国産戦闘機開発計画[[F-2 。

プログラムに起因する兵器の限界や制限を知っていれば、対抗手段を得られる可能性が高くなる、date=2009年12月。

6. 用語の由来
--------

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

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

コーディングという言葉は、元々はアセンブリ言語のようなごく低水準の言語でプログラムを書く作業、というきわめて限定された意味から派生して、一般にソースコードを記述する、という意味になった語である。しかし、date=2017年10月はHTMLを書くという意味にも使われるなど濫用され気味である。

6.1. 和訳
-------

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

7. 脚注
-----

7.1. 注釈
-------

7.2. 出典
-------

8. 関連項目
-------

オブジェクトファイル
実行ファイル
重複コード
機械語
コンパイラ
インタプリタ
ソフトウェア品質
プログラミング作法
LOC
バージョン管理システム