
コンピューティングにおいて、ソース コード(または単にコードあるいはソース )は、人間が読める プレーンテキストであり、最終的にはコンピュータの動作を制御することができます。コンピュータを制御するには、コンピュータ プログラムで処理する必要があります。つまり、インタープリタを介して直接実行するか、コンパイラなどを使用して、よりコンピュータが処理しやすい形式に変換する必要があります。場合によっては、コードはマシン コードに直接コンパイルされ、それ以上処理せずにコンピュータのネイティブ言語で実行できます。ただし、最近の多くの環境では、インタープリタを介して実行することも、ジャストインタイムコンパイルによってオンデマンドでマシン コードにコンパイルすることもできる、バイトコードなどの中間表現へのコンパイルが必要になります。
1940年代末に登場した最初のプログラム可能なコンピュータ[2]は、機械語(プロセッサが直接実行できる単純な命令)でプログラムされていました。機械語はデバッグが難しく、異なるコンピュータシステム間での移植性がありませんでした。 [3]当初、ハードウェア資源は不足し高価でしたが、人的資源は安価でした。[4]プログラムが複雑になるにつれて、プログラマの生産性がボトルネックになりました。これが、1950年代半ばにFortranなどの高級プログラミング言語の導入につながりました。これらの言語はハードウェアの詳細を抽象化し、人間がより簡単に理解できるアルゴリズムを表現できるように設計されました。 [5] [6]したがって、ソフトウェアは基礎となるコンピュータハードウェアとは別の命令であるため、比較的最近のものであり、 Fortran、Lisp、Cobolなどの初期の高級プログラミング言語にまで遡ります。[6]高級プログラミング言語の発明は、ソースコードをコンピュータハードウェアで直接実行できる機械語に自動的に変換するために必要なコンパイラと同時に行われました。[7]
ソースコードとは、人間が直接変更するコードの形式で、通常は高水準プログラミング言語で記述されます。オブジェクトコードは、機械によって直接実行可能であり、ソースコードから自動的に生成されます。ソースコードの生成には、多くの場合、中間段階としてアセンブリ言語が使用されます。オブジェクトコードは特定のプラットフォームでのみ動作しますが、ソースコードは別のマシンに移植し、そこで再コンパイルすることができます。同じソースコードでも、オブジェクトコードは大きく異なる可能性があります。これは、コンパイルされたマシンだけでなく、コンパイラによるパフォーマンス最適化によっても異なります。[8] [9]
ほとんどのプログラムは実行に必要なリソースをすべて備えておらず、外部ライブラリに依存しています。コンパイラの機能の一部は、これらのファイルをリンクし、プログラムをハードウェアで実行できるようにすることです。[10]

ソフトウェア開発者は、ソースコードファイルの変更を追跡するために構成管理(バージョン管理)を使用することが多い。構成管理システムは、どのオブジェクトコードファイルがどのバージョンのソースコードファイルに対応しているかを追跡する。[11]
ソースコード行数(SLOC)は、コンピュータプログラマーの生産性、コードベースの経済的価値、開発中のプロジェクトの労力見積もり、リリース後のソフトウェアメンテナンスの継続的なコストを評価する際の指標としてよく使用されます。[12]
ソースコードは、オンラインや書籍内のコードスニペットなど、関係者間でアルゴリズムを伝達するためにも使用されます。[13]
コンピュータプログラマーにとって、既存のソースコードを確認することはプログラミング技術を学ぶ上で有益です。[13]開発者間でソースコードを共有することは、プログラミングスキルの成熟に寄与する要因としてよく挙げられます。[13]ソースコードを表現力豊かな芸術的媒体と考える人もいます。[14]
ソースコードには、コンパイラが無視するようにマークされたテキストブロックであるコメントが含まれることがよくあります。このコンテンツはプログラムロジックの一部ではなく、読者がプログラムを理解するのに役立つことを目的としています。 [15]
企業は、企業秘密とみなされるアルゴリズムを隠すために、ソースコードを秘密にしておくことがよくあります。独自の秘密ソースコードとアルゴリズムは、刑事司法などの機密性の高い政府アプリケーションに広く使用されており、アルゴリズムの手法に関する透明性が欠如したブラックボックス的な動作につながっています。その結果、バイアスなどの問題に対する公的な監視を回避しています。[16]
ソースコード(オブジェクトコードだけでなく)へのアクセスは、コードを変更する上で不可欠です。[17]既存のコードを理解することは、コードがどのように機能するかを理解するために必要であり[17]、コードを変更する前に必要です。[18]理解の速さは、コードベースとプログラマのスキルの両方に依存します。[19]経験豊富なプログラマは、コードが高レベルで何をするかを理解するのが容易です。[20] ソフトウェアの視覚化は、このプロセスを高速化するために時々使用されます。[21]
多くのソフトウェアプログラマーは、生産性を向上させるために統合開発環境(IDE)を使用しています。IDEには通常、よくあるエラーをプログラマーに警告するソースコードエディタなど、いくつかの機能が組み込まれています。 [22]変更には、多くの場合、コードのリファクタリング(機能を変えずに構造を改善すること)と再構築(構造と機能を同時に改善すること)が含まれます。[23]コードへのほぼすべての変更は、新たなバグや予期せぬ波及効果をもたらし、再度の修正が必要になります。[18]
他の開発者によるコードレビューは、プロジェクトに追加された新しいコードを精査するためによく使用されます。[24]このフェーズの目的は、コードがスタイルと保守性の基準を満たしていること、およびソフトウェア設計の正しい実装であることを確認することです。[25]いくつかの推定によると、コードレビューにより、ソフトウェアテストの完了後に残るバグの数が劇的に減少します。[24]コードを実行して機能するソフトウェアテストに加えて、静的プログラム解析では、自動化ツールを使用してソースコードの問題を検出します。多くの IDE はコード解析ツールをサポートしており、コードの明瞭さと保守性に関するメトリックを提供できる場合があります。[26] デバッガーは、多くの場合、プログラマが実行をステップ実行しながら、どのソースコードが各状態の変化に対応しているかを追跡できるようにするツールです。[27]
高水準プログラミング言語のソースコードファイルは、命令を実行する前に、機械語への前処理段階を経る必要があります。 [7]コンパイルされたプログラムはオブジェクトファイルとして保存され、ローダー(オペレーティングシステムの一部)はこの保存されたファイルを読み込み、コンピュータハードウェア上のプロセスとして実行することができます。 [10]一部のプログラミング言語では、コンパイラではなくインタープリタが使用されます。インタープリタは実行時にプログラムを機械語に変換するため、コンパイルされたプログラミング言語に比べて10~100倍遅くなります。[22] [28]
多くのプログラムが実行可能なバイナリ ファイルではなくソース コード形式で配布されるもう 1 つの理由は、多くの場合、単一のソース コード ファイルを一度記述すれば、さまざまなエンド ユーザー マシン (それぞれ独自のローカライズされたコンパイラまたはインタープリタを使用) で実行できることです。一方、実行可能コード ファイルは、一般にほぼ同一のマシンでしか動作しません。ソース コードは、Unix の歴史の初期にはこの方法で Unix オペレーティング システムを配布するために使用され、後にスクリプト言語(特にJavaScript クライアント側スクリプト言語) で記述されたプログラムをさまざまなマシンで実行できるようにするために使用されました。
この目的のために、縮小、難読化、または逆コンパイルされたソース コード ファイル (いずれも元のコード内のコメントを削除したもの) は、変更にはあまり役に立たないため、GNU 一般公衆利用許諾書バージョン 2 (GPL2) のソース コードの定義を満たしていないにもかかわらず、一般に元のソース コード ファイル (ほぼ常にコメントを含む) と同様に移植可能です。
ソフトウェア品質とは、コードの正確性と効率性、再利用性と移植性、変更の容易さなどを指す包括的な用語です。[29]開発プロセスの後半で品質を追加するよりも、最初から製品に品質を組み込む方が通常は費用対効果が高くなります。[30]高品質のコードは、信頼性と保守性の向上により、サプライヤーと顧客の両方にとって生涯コストを削減します。[31] [32]
保守性とは、既存の機能を壊すことなくソフトウェアを容易に変更できる品質のことです。[33]目的に応じた明確な関数名や変数名を使用するなどのコーディング規約に従うことで、保守が容易になります。[34]条件付きループ文は、コードが複数回実行される場合にのみ使用し、実行されないコードを削除することでも、理解しやすさが向上します。 [35]多くのソフトウェア開発組織は、長期的なコスト増加につながるにもかかわらず、開発フェーズで保守性を無視しています。[32] 技術的負債は、プログラマーが怠惰や期限への焦りから、コードに保守性を組み込むのではなく、手抜きの解決策を選択することで発生します。[36]よくある原因は、ソフトウェア開発の労力見積もりを過小評価し、開発に割り当てられるリソースが不十分になることです。[37]保守性に関する課題は、多くのソフトウェアエンジニアリングのコースで保守性が重視されていないことです。[38]ソフトウェアの保守を担当しないことを知っている開発エンジニアには、保守性を組み込むインセンティブがありません。[18]
状況は世界各国で異なりますが、1974年以前のアメリカ合衆国では、ソフトウェアとそのソースコードは著作権の対象ではなく、常にパブリックドメインソフトウェアでした。[39] 1974年、米国著作物の新技術利用委員会(CONTU)は、「コンピュータプログラムは、著作者の独自の創作を具体化する限りにおいて、著作権の適切な対象である」と決定しました。[40] [41]
プロプライエタリソフトウェアがソースコードとして配布されることは稀である。[42]オープンソースソフトウェアという用語は文字通りソースコードへの公開アクセスを指すが、[43]オープンソースソフトウェアには追加の要件がある。それは、自由な再配布、ソースコードを変更して同じライセンスの下で派生作品をリリースする許可、そして商業的利用を含む異なる用途間の差別禁止である。[44] [45]オープンソースソフトウェアの自由な再利用性は開発を加速させることができる。 [46]