ITパスポート単語帳 - アルゴリズムとプログラミング
データ構造
データの集まりをコンピュータプログラムで扱いやすいように、一定の形式で格納したもの。特定の問題を解く手順(アルゴリズム)には、それぞれに適したデータ構造がある。
複数のデータの配置や関係性、データの参照や出し入れなどの操作のルールを定義したもので、様々な種類がある。それぞれに特徴や適した処理があるため、同じ処理の記述でも、目的に対して適切なデータ構造を選択できるかどうかでプログラムの複雑さや処理性能に大きな差がつくことがある。
データ構造の種類
最も基本的なデータ構造には、要素を一列に並べた「配列」(array)、要素を格納した順に取り出すことができる「キュー」(queue)、格納したのとは逆順に取り出すことができる「スタック」(stack)などがある。
格納された要素への参照データを含むデータ構造もあり、任意の標識と要素を一対一に関連付けて格納する「連想配列」(辞書、ハッシュ、マップとも呼ばれる)、要素が前後の要素への参照を持つ「連結リスト」(linked list)、要素が任意個の他の要素への参照を持つ「グラフ」(graph)、一つの頂点から樹状に枝分かれしたグラフである「木構造」(ツリー構造)などがある。
これらには細部の仕様が異なるバリエーションがある。例えば、連結リストには前の要素が後の要素への参照を持つだけの「片方向リスト」(単方向リスト)、これに加えて後の要素が前の要素への参照も持つ「双方向リスト」、要素が環状に連なっている「循環リスト」などいくつかの種類がある。
言語上の扱い
プログラミング言語では、基本的なデータ構造のいくつかが言語仕様や標準ライブラリなどにあらかじめ組み込まれて提供されていることが多い。用意されていない場合でも、既存のデータ構造や複合データ型、クラスなどの仕様を利用して開発者がデータ構造の定義や挙動の実装を行うことがある。
実際のプログラム上では基本的なデータ構造を単体で用いることも多いが、あるデータ構造の要素として別のデータ構造を格納するなど、アルゴリズムに合わせて組み合わせて用いる場合もある。
変数
コンピュータプログラムのソースコードなどで、データを一時的に記憶しておくための領域に固有の名前を付けたもの。プログラム上で値を代入したり参照することができる。
変数につけた名前を「変数名」と呼び、記憶されているデータをその変数の値という。データの入れ物のような存在で、プログラム中で複数のデータを扱いたいときや、同じデータを何度も参照したり計算によって変化させたい場合に利用する。
変数をプログラム中で利用するには、これからどんな変数を利用するかを宣言(declaration)し、値を代入(assignment)する必要がある。コード中で明示的に宣言しなくても変数を利用できる言語もある。変数に格納された値を利用したいときは、変数名を記述することにより値を参照(reference)することができる。
変数の型
プログラム中で扱うデータは整数、浮動小数点数、文字列など様々なデータ型に分かれており、変数も特定のデータ型を持つ。多くの言語では宣言時に一つのデータ型を指定しなければならず、後から型は変えられないが、特定の型を指定しなくても処理系が適切な型を適用(型推論)してくれる言語や、代入などによって途中で型を切り替えることができる言語もある。
変数のスコープ
変数は宣言した位置などにより通用する範囲(スコープ)が決まっており、範囲の外から参照や代入を行うことはできない。プログラム全体を通用範囲とするものを「グローバル変数」(大域変数)、特定のサブルーチンや関数、メソッド、コードブロックなどの中でのみ通用するものを「ローカル変数」(局所変数)という。オブジェクト指向言語では「クラス変数」や「インスタンス変数」などに分かれる。
フィールド ⭐⭐
野原、競技場、領域、現場、などの意味を持つ英単語。ITの分野では、異なる種類のデータなどが集まってできた何らかの構造体における個々の項目や要素を意味する用例が多い。
オブジェクトのフィールド
例えば、オブジェクト指向プログラミングにおいて、オブジェクトやインスタンスの持つ固有のデータのことをフィールドということがある。言語によっては「プロパティ」(property)あるいは「メンバ変数」(member variable)と呼ぶ場合もある。
テーブルのフィールド
リレーショナルデータベースや表計算ソフトなど、データの集合を表(テーブル)の形で表すシステムでは、行やレコードを構成する個々の要素やデータ項目をフィールドという。複数行の同じフィールドを並べたものを列という。
ユーザーインターフェースのフィールド
ソフトウェアの操作画面上で、入力フォームなどを構成する個々の入力項目や書き込み欄などのことをフィールドという。特に、利用者が任意の内容を入れることができる要素をこのように呼ぶことが多く、例えば文字を入力する欄を「テキストフィールド」(text field)という。
動画やディスプレイのフィールド
インターレース走査(飛び越し走査)の映像や表示機器などで、一回の走査で書き換える画面半分のことをフィールドという。上から奇数番目あるいは偶数番目のラインの集合のことで、2フィールドの走査で画面全体が1フレーム書き換わる。毎秒60フィールドの書き換え速度の場合、毎秒30フレームの書き換えが行われる。
フレームやパケットのフィールド
プロトコル(通信規約)などで定義されたフレームやパケットなどのデータの送受信単位において、ヘッダなど制御用のデータ領域に配置された個々のパラメータのための領域をフィールドという。
データ先頭からの距離(何ビット目/何バイト目)と長さ、内容の形式などで定義され、データの宛先や送信元のアドレスなど、データの送受信に必要な制御用の情報が記録される。
配列 【配列型】
複数のデータを連続的に並べたデータ構造。各データをその配列の要素といい、非負整数などの添字(インデックス)で識別される。
配列はほとんどのプログラミング言語に存在する最も基本的なデータ構造の一つで、単純に変数を一列に並べたものである。データ全体はコード中で配列名で指し示され、各要素は通し番号などの添字で区別される。例えば、長さ5の整数型の配列変数xを宣言すると、x[0]からx[4]まで5つの整数型の変数が用意され、それぞれ独立に整数値を格納することができる。
各要素のデータ型が同じでなければならない言語と、要素ごとに異なる型のデータを格納できる言語がある。変数の宣言が必須の言語では、配列変数の宣言時に要素のデータ型と数をあらかじめ指定しなければならないことが多い。要素数を後から増減できる動的配列(可変長配列)が利用できる言語もある。
添字は0から始まる整数とする言語が多く、要素がn個の配列の添字は0からn-1までとなる。添字に文字列など整数以外のデータ型の値を取れるようにしたデータ構造を利用できる言語もあり、これを「連想配列」(associative array)と呼ぶ。言語によっては同様のデータ構造を辞書(ディクショナリ)、ハッシュ、マップ、連想リスト等と呼ぶこともある。
配列の要素として配列を格納した、入れ子状のデータ構造を「多次元配列」という。配列の要素が配列になっており、その要素が値になっている構造が「2次元配列」で、配列が3段階に入れ子状になっている構造は「3次元配列」である。同様に、入れ子がn段階になっている配列を一般に「n次元配列」という。要素が値になっている単純な配列をこれらと対比する場合は「1次元配列」と呼ぶことがある。
レコード ⭐
記録(する)、記録物、登録(する)、録音(する)、録画(する)などの意味を持つ英単語。一般の外来語としては音声信号を記録した薄い樹脂製の円盤(アナログレコード)や、運動競技の最高記録などのことを指すことが多い。
データベースのレコード
リレーショナルデータベース(RDB)において、あるテーブル(表)に格納された、一組の値の連なりのことをレコードあるいは行(row)、組(tuple)などという。
RDBのテーブルは格納すべきデータの名前(属性名、フィールド名)と形式(データ型)を列挙して定義される。テーブル上のデータを操作(挿入や削除、更新など)する際には、定義で列挙された値の組を一件の記録単位として行う。この一組の値の集合をレコードと呼ぶ場合がある。一方、テーブル内の各レコードの特定のフィールドの値を並べたデータ集合は列(カラム/column)、属性(attribute)などという。
データ構造のレコード
いくつかのプログラミング言語では、データベースのレコードのように、固有の識別名やデータ型、形式を持つ複数の変数を一つにまとめたデータ構造のことをレコード型と呼ぶ場合がある。
レコード型の値の内部には、異なる型の変数や別のデータ構造(配列など)などを含めることができ、全体をまとめて一つの変数として関数などの引数や返り値に指定したり、丸ごと複製や代入を行ったりすることができる。
レコードをプログラム上で扱うには、まずレコードの構造の定義を行い、定義したレコードの実体を宣言して値を代入する。この過程は開発者がその言語に新しいデータ型を組み込むようなものであるため、言語によっては「ユーザー定義型」のように呼ぶ場合もある。ちなみにC言語では同じ仕組みを構造体と呼ぶ。
ファイル
コンピュータにおけるデータの管理単位の一つで、ストレージ装置(外部記憶装置)などにデータを記録する際に利用者やオペレーティングシステム(OS)から見て最小の記録単位となるデータのまとまり。
利用者がコンピュータを用いて記憶媒体にデータを保存、読み込み、移動、削除などする際に一つのまとまりとして取り扱うデータの集合を表し、OSの一部であるファイルシステム(file system)によって管理される。
ハードディスクやSSD、USBメモリ、光学ディスク(CD/DVD/Blu-ray Disc)などの記憶装置・記憶媒体を利用する際に用いられるほか、コンピュータと周辺機器の間やコンピュータ間の通信においてもデータの送受信単位として利用される。
ディレクトリとパス
ファイルシステムは記憶媒体内でファイルの作成や削除、上書き、移動、複製などを管理する仕組みで、複数のファイルをまとめて一つの集まりとして扱う「ディレクトリ」(directory)や「フォルダ」(folder)などの入れ物(領域)を作成することもできる。
ディレクトリやフォルダの中に別のディレクトリやフォルダを作成し、入れ子状にすることもでき、記憶媒体全体を階層構造に整理して管理する。装置内でのファイルの位置は、「C:¥Windows¥System32¥cmd.exe」のように最上位から順にディレクトリ名を繋げた「パス」(path)という記法で表される。
ファイル名
ファイルにはそれぞれ固有のファイル名が付けられ、これを用いて識別・指定される。多くのOSではファイル名の末尾にファイルの種類や形式を表す「拡張子」(extension)と呼ばれる数文字の英数字の符号が付与される。
コンピュータの操作画面ではファイルは記憶媒体内での位置(パス)やファイル名で表示され、キーボードなどからパスやファイル名を指定して操作する。グラフィック表示を用いるGUI(Graphical User Interface)を備えたOSでは、ファイルは種類によって異なるアイコン(絵文字)とファイル名によって表示され、マウス操作やタッチ操作でアイコンを指し示して操作を行う。
ファイル属性
ファイルはファイルシステムに記録される際に様々な属性や付加情報(メタデータ)と共に記録される。作成日時や最終更新日時、最終アクセス日時、作成者(所有者)、各利用者やグループのアクセス権限などが記録、設定される。
また、多くのOSではファイルに「読み取り専用」属性を付与でき、解除されるまで削除や上書きができなくなる。「隠しファイル」に設定されたファイルは通常の動作モードではファイル一覧画面などに表示されなくなる(ファイル名を直に指定すれば操作はできる)。
ファイル形式
ファイルに記録されるデータの形式や書式(ファイルフォーマット)は作成したソフトウェアによって様々だが、大きく分類すると「バイナリファイル」(binary file)と「テキストファイル」(text file)に分かれる。
バイナリファイルは特に制約なくあらゆるビットパターンを記録できる自由な形式で、その形式に対応したソフトウェアでなければ何が記録されているか知ることができない。テキストファイルはデータを文字情報として記録したファイルで、文字コード規格で規定されたコードに従ってデータを文字列に置き換えて記録する。対応ソフトがなくてもどのような文字が記録されているかは見ることができる。
リスト
一覧(表)、目録、羅列、一覧に載せる、一覧にする、などの意味を持つ英単語。一般的の外来語としては同じ種類の情報を羅列した一覧のことを指すことが多く、ITの分野でもこの用法が多い。
プログラミングの分野では、ソースコードのことを「プログラムリスト」「ソースリスト」などと呼び、これを略してリストということがある。
データ構造のリスト
基本的なデータ構造の一つで、複数のデータを順序を付けて格納することができる複合データ型(コンテナ/コレクション)をリストという。
中でも、各データが次のデータの所在を表す参照情報(リンク/ポインタ)を持っているものを「連結リスト」(linked list:リンクリスト/リンクトリスト)と呼び、これを略してリストという場合も多い。リストは他に動的配列などを用いても実装することができる。
連結リストの各要素はデータの他に自分の隣の要素を指し示す所在情報を持っている。これを辿ることで、各要素に順番にアクセスすることができる。各要素が自分の次(後)の要素への参照のみを持つ構造を「片方向リスト」「単方向リスト」と呼び、これに加えて自分の前の要素への参照をもつものを「双方向リスト」という。
また、先頭から末尾へ直線上に要素が連結されているものを「線形リスト」、先頭も末尾もなく要素が円環状に連結されているものを「循環リスト」という。
キュー 【待ち行列】 ⭐⭐
最も基本的なデータ構造の一つで、要素を入ってきた順に一列に並べ、先に入れた要素から順に取り出すという規則で出し入れを行うもの。窓口などの順番を待つ人の行列をモデル化したものとも言える。
キューは先頭が常に最も古い要素になるデータ構造で、新しい要素は必ず末尾に追加される。取り出すときは常に先頭の最も古い要素から取り出される。このように先に入れたものほど先に取り出される管理方式を「FIFO」(First-In First-Out:先入れ先出し)という。
実装上は、キューのために確保された記憶領域の中ですべての要素が到着順に並ぶとは限らず、実際の位置や順序とは別に到着順や末尾の位置などの情報を内部的に記録・管理する手法が用いられることが多い。人間の行列のように要素が取り出されるたびに残りのすべての要素の物理的な位置を隣(一つ前)に移動させるのは非効率だからである。
バリエーションとして、列の両端から要素の追加や取り出しを行える「両端キュー」(double-ended queue)や、追加する要素に優先度を設定して、優先度の高いものから取り出すようにする「優先度付きキュー」(priority queue)などがある。
一方、「先に足された要素ほど後に取り出される」(末尾から順に取り出す)という規則で要素の出し入れを管理するデータ構造は「スタック」(stack)と呼ばれる。そのような管理方式を「LIFO」(Last-In First-Out:後入れ先出し)あるいは「FILO」(First-In Last-Out:先入れ後出し)という。
要素の出し入れ
キューに要素を追加する操作を「エンキュー」(enqueue)、取り出す操作を「デキュー」(dequeue)という。エンキューされた要素はキューの末尾に追加され、キューの要素数は1増加する。
デキューを指示するとキューの先頭の要素が取り出され、その要素はキューから取り除かれる。先頭から2番目にあった要素(2番目に古かったデータ)が新しい先頭になり、キューの要素数は1減少する。
キューイング (queuing/queueing)
キューを用いて要素の管理を行うことを「キューイング」(queuing)という。キューイングは機器間やプログラム間など独立に動作する二つの主体の間で非同期にデータの受け渡しを行う手法としてよく用いられる。システム間で汎用的にデータを受け渡しするシステムを「メッセージキュー」(message queue)という。
例えば、コンピュータからプリンタにデータを伝送する速度とプリンタがデータを紙に印刷する速度では、後者のほうが圧倒的に遅い。伝送と印刷を同時に行おうとするとコンピュータ側はほとんどの時間待たされることになり無駄であるため、印刷データを一旦キューに保管し、プリンタの処理の進み具合に応じて専用の制御プログラムが少しずつデータを伝送する手法が用いられる。
スタック ⭐⭐⭐
最も基本的なデータ構造の一つで、要素が入ってきた順に一列に並べ、後に入れた要素から順に取り出すという規則で出し入れを行うもの。本や書類、箱などを積み上げて置くことになぞらえてこのように呼ばれる。
スタックは要素が入ってきた順に並べ、先頭が最も古く、末尾が最も新しい要素となる。取り出すときは末尾にある最も新しいものから順に取り出す。このように後に入れたものほど先に取り出される管理方式を「LIFO」(Last-In First-Out/後入れ先出し)あるいは「FILO」(First-In Last-Out/先入れ後出し)という。
ほとんどのマイクロプロセッサにはメモリ領域に設けたスタックを操作するための機械語の命令やレジスタなどを内蔵しており、機械語のプログラムの実行制御などで非常によく用いられるデータ構造として知られる。特に、サブルーチンや関数を呼び出す際に処理中のデータや戻りアドレスなどを一時的に退避するコールスタック(実行スタック)のことを単にスタックと呼ぶ場合もある。
一方、先に追加した要素ほど先に取り出される(先頭から順に取り出す)規則で要素の出し入れを管理するデータ構造は「キュー」(queue)あるいは「待ち行列」と呼ばれる。
プッシュ/ポップ (push/pop)
スタックに要素を追加する操作を「プッシュ」(push)、取り出す操作を「ポップ」(pop)という。プッシュされた要素はスタックの末尾に追加され、スタックの要素数は1増加する。
ポップを指示するとスタックの末尾の要素が取り出され、その要素はスタックから取り除かれる。末尾から2番目にあった要素(2番目に新しかった要素)が新しい末尾となり、スタックの要素数は1減少する。
プログラミング言語などによっては、この2つの操作に加え、末尾あるいは指定位置の要素を取り出さずに値を読み込む「ピーク」(peek)、末尾あるいは指定位置の値を書き換える「ポーク」(poke)といった操作を提供している場合もある。
プロトコルスタック/ソフトウェアスタック
ネットワークプロトコル(通信規約)やソフトウェアは物理的な装置や回線に近い部分から利用者に近いものまで、役割に応じて階層構造に分かれていることが多い。
このとき、互いに相互運用性のあるプロトコルやソフトウェアを積み重ね、全体として一つのシステムや機能を実現したものをプロトコルスタック、ソフトウェアスタックなどということがある。
例えばプロトコルであれば、物理層からアプリケーション層まで、UTPケーブル - Ethernet - IP(Internet Protocol) - TCP(Transmission Control Protocol) - HTTP(Hypertext Transfer Protocol)といったように積み上げた各階層の機能が互いに連携しあって通信が可能となる。
専門知識や技能のスタック
ある事業や業務に必要な専門的な知識や技能の総体を、プロトコルやソフトウェアになぞらえて階層状に整理したものをスタックと呼ぶことがある。
階層の積み上げ方は分野によって異なり、ソフトウェアのようにハードウェア寄りから利用者寄りへ重ねていく場合と、企画-設計-実装-…といったように工程の前後関係に基づいて整理する考え方がある。
特に、ある事業分野に必要なすべてのスキルを一人で備え、すべて遂行することができる技術者のことを「フルスタックエンジニア」(英語では “full stack developer”)という。
例えば、Webサービスを開発・提供する場合に、通常はそれぞれの専門的なスタッフや部門で分業される、企画、設計、ページやユーザーインターフェースのデザイン、画像制作、HTML/CSSコーディング、サーバ側(バックエンド)プログラミング、クライアント側(フロントエンド)プログラミング、テスト、機材や回線の調達・導入、ネットワーク設定、サーバ管理、システム運用、プロモーション、利用者サポートなどを一人でできる人材のことをフルスタックであるという。
木構造 【ツリー構造】 ⭐⭐
データ構造の一つで、一つの要素(ノード)が複数の子要素を持ち、子要素が複数の孫要素を持ち、という具合に階層が深くなるほど枝分かれしていく構造のこと。
木が幹から枝、枝から葉に分岐していく様子になぞらえた名称である。木構造を構成する要素を「ノード」(node:節)と呼び、ノード間の繋がりを「エッジ」(edge)という。繋がったノード同士は親子関係を持ち、親を持たない始祖のノードを「根ノード」(root node:ルートノード)という。根ノードに近い側が「親ノード」(parent node)で、遠い側が「子ノード」(child node)である。
親は複数の子を持つことができるが、子はただ一つの親を持つ。親が共通の子ノード同士は「兄弟ノード」(sibling nodes)という。一つ以上の子を持つノード(いずれのノードの親であるノード)を「枝ノード」(branch node)「内部ノード」(internal node/inner node)「中間ノード」(intermediate node)「非終端ノード」(non-terminal node)などという。
子の無い末端のノードは「葉ノード」(leaf node:リーフノード)「終端ノード」(terminal node)「外部ノード」(external node/outer node)という。あるノードより根ノード側にあるノード群を「先祖ノード」(ancestor nodes)、葉ノード側にあるノード群を「子孫ノード」(descendant nodes)と呼ぶことがある。
根を基準に、あるノードまでのエッジの数を「深さ」(depth/level)という。根ノードの深さは0となる。また、あるノードを基準に、その子孫の葉ノードのうち最も深いものまでのエッジ数を「高さ」(height)という。根ノードの高さは最も深い葉ノードの深さに等しく、これが木構造全体の高さとなる。同じ深さにあるノードの数を「幅」(width)という。
現実の木は地中の根から上に向かって幹や枝を伸ばし、葉が上方にあるが、木構造を図示する際にはこれとは逆に、根ノードを図の最上部に描き、一段下に子ノード群、その下に孫ノード群、といった具合に下向きに広がるように描くことが多い。家系図の描き方と同じである。
木構造は子の数についての制約によって分類することが多い。例えば、子の数が2に制限されている木を「二分木」(二進木、バイナリツリー)と呼び、3つ以上の子を持つことができるものを「多分木」という。そのうち、子の数がN個(Nは3以上の自然数)に制限されている木を「N分木」(N進木)という。
他の性質による分類も用いられる。例えば、葉の深さがなるべく等しくなるように構築された木を「平衡木」(バランス木)と呼ぶ。二分木かつ平衡木であれば「平衡二分木」で、多分木の平衡木にはB木などがある。他にも用途によって様々な木構造が考案され、様々な場面に応用されている。
木の中で特定のノードおよびその子孫を「部分木」(subtree:サブツリー)という。複数の木からなる集合を「森」(forest:フォレスト)ということがある。
多分木 (multi-branch tree/multi-way tree)
木構造のうち、親ノードが3つ以上の子ノードを持つことができるもの多分木という。二分木ではノードに格納される値は一つだが、多分木ではノードに複数の値を格納し、子ノードの参照と対応付けた構造にする場合がある(B木など)。子の数に制約がなくいくつでもよい場合と、子が特定の数以下でなければならない「N分木」が含まれる。
N分木 (N進木/N-ary tree/N-way tree)
木構造のうち、親ノードが持つ子ノードの数がN個に制限されているものをN分木あるいはN進木という。
Nは2以上の自然数を表し、Nが2であるような(2個以下の子しか持てない)ものは「二分木」と呼ばれるため、通常はNが3以上の木を総称してN分木という。例えば、子が必ず3つ以下のものは「三分木」、4つ以下のものは「四分木」である。“N”の代わりに“K”や“M”などの文字を用いて表記されることもあるが、意味は同じである。
N分木のうち、子を持つノードの子の数がすべてN個であるようなものを「全N分木」(full N-ary tree)、全N分木のうち、すべての葉の深さが揃っているものを「完全N分木」(perfect N-ary tree)という。また、最下層を除いてすべての階層がノードで満たされ、最下層の葉ノードが可能な限り左に寄せられているような木を “complete N-ary tree” と呼び、これを完全N分木とすることもある。
二分木 【バイナリツリー】
データ構造の一つである木構造(ツリー構造)のうち、どの親ノードも二つ以下の子ノードを持つもの。子がN個以下に制限されたN分木(N-ary tree)のうち最も単純な構造の木である。
木構造はグラフ構造のうち要素に親子関係があり、親が複数の子を持つことができるようなものを意味し、根ノード(root node)を頂点として階層的に枝分かれしていく構造となる。
2分木はこのうち、どの親ノードも子ノードを一つか二つしか持たないという制限が課せられたものを指し、図示したときに左側にあるものを左ノード、右にあるものを右ノードという。子は一つのみの場合もあり、子がないノードは末端の葉ノード(leaf node)となる。
全二分木/完全二分木 (full binary tree/perfect binary tree)
2分木のうち、(子のない葉ノードを除く)子を持つノードの子の数がすべて二個ずつであるようなものを「全二分木」(full binary tree)、全二分木のうちすべての葉ノードの深さが揃っているものを「完全二分木」(perfect binary tree)という。
また、最下層を除いてすべての深さがノードで満たされ、最下層の葉ノードが可能な限り左に寄せられているような木を “complete N-ary tree” と呼び、これを完全二分木とすることもある。
アルゴリズム ⭐
ある特定の問題を解く手順を、単純な計算や操作の組み合わせとして明確に定義したもの。数学の解法や計算手順なども含まれるが、ITの分野ではコンピュータにプログラムの形で与えて実行させることができるよう定式化された、処理手順の集合のことを指すことが多い。
曖昧さのない単純で明確な手順の組み合わせとして記述された一連の手続きで、必ず有限回の操作で終了し、解を求めるか、解が得られないことが示される。コンピュータで実行する場合は、基礎的な演算、値の比較、条件分岐、手順の繰り返しなどを指示する命令を組み合わせたプログラムとして実装される。
数値などの列を大きい順または小さい順に並べ替える「整列アルゴリズム」、たくさんのデータの中から目的のものを探し出す「探索アルゴリズム」、データが表す情報を損なわずにより短いデータに変換する「圧縮アルゴリズム」といった基本的なものから、画像の中に含まれる人間の顔を検出する、といった複雑なものまで様々な種類のアルゴリズムがある。
同じ問題を解くアルゴリズムが複数存在することもあり、必要な計算回数や記憶領域の大きさ、手順のシンプルさ、解の精度などがそれぞれに異なり、目的に応じて使い分けられる。例えば、ある同じ問題に対して、原理が単純で簡単にプログラムを記述できるが性能は低いアルゴリズム、計算手順が少なく高速に実行できるが膨大な記憶領域を必要とするアルゴリズム、厳密な解を求めるものより何桁も高速に近似解を求めることができるアルゴリズムなどがある。
フローチャート 【流れ図】 ⭐⭐⭐
工程や手順の流れを図示する手法の一つで、個々の段階を箱で表し、それらを順序や論理の推移に従って矢印や線分で結んだもの。
ITの分野では、コンピュータプログラムの設計やアルゴリズム(計算手順)の理解などのために、内部で行われる処理や演算の詳細な流れを流れ図に表すことが多い。プログラムに限らず、業務手順など様々な過程や手順の図示に応用できる。
一つの流れ図には開始と終了があり、その間に一つ以上の工程が含まれる。流れは分岐や繰り返しによって複数に枝分かれしたり戻ったりすることがあるが、途中どのような経路を通っても必ず一つの開始から始まって一つの終了で終わる。
流れ図で用いる部品の種類や図記号の形状はJIS X 0121で規格化されており、一般的にはこれを用いることが多い。主な部品として、開始や終了を表す「端子」(円・楕円・角丸長方形)、「処理」(長方形)、プログラムにおけるサブルーチンや関数などの「定義済み処理」(左右が二重線の長方形)、「入出力」(平行四辺形)、条件分岐などの「判断」(菱形)、繰り返しの範囲を示す「ループ端」(開始は上側、終了は下側の角が欠けた長方形)、他の図との出入り口を示す「結合子」(小さな丸)、処理の流れを示す「線」(右や下へは線分・左や上には矢印)などがある。
順次構造
コンピュータプログラムの命令実行の流れの一つで、プログラムに記述された順番通りに命令を実行していくもの。
コンピュータのCPUがプログラムを実行する際、特に指定がなければプログラムを先頭から読み込んで命令を並んでいる順に従って一つずつ実行していく。この最も基本的な命令実行の制御構造を、(他の構造と対比するため便宜的に)順次構造と呼ぶ。
一方、命令の中には命令実行の流れを変更するものもある。これを用いて、条件に従って別の実行位置に流れを分岐させる制御構造を「選択構造」あるいは「分岐構造」、条件が満たされる間だけ同じ個所を繰り返し実行する制御構造を「反復構造」あるいは「繰り返し構造」という。
選択構造 【分岐構造】
コンピュータプログラムの命令実行の流れの一つで、実行時に評価する条件によって、次の命令を実行するか、指定されたメモリ上の位置に移行するか分岐するもの。
コンピュータのCPUがプログラムを実行する際、特に指定がなければ命令を先頭から順に実行するが、分岐命令が存在する場合、特定の条件が満たされたらメモリの指定番地に実行位置を変更(ジャンプ)し、以降はそこから順に命令を実行していく。
このような実行制御を「条件分岐」と呼び、プログラムに複雑な処理をさせたい場合は必須の機能となる。一方、条件が満たされる間だけ同じ個所を繰り返し実行する制御構造もあり、「反復構造」あるいは「繰り返し構造」という。
反復構造 【繰り返し構造】
コンピュータプログラムの命令実行の流れの一つで、指定の条件が満たされている間、特定の個所を何度も繰り返し実行するもの。
コンピュータのCPUがプログラムを実行する際、特に指定がなければ命令を先頭から順に実行するが、反復構造になっている場合、指定の条件が満たされている間、指定範囲の末尾の命令を実行したら範囲の先頭に戻り、その範囲を繰り返し実行する。
同じ処理を様々な対象に次々に適用したい場合などに用いられ、プログラムに複雑な処理をさせたい場合には必須の機能となる。一方、特定の条件が満たされたらメモリの指定番地に実行位置を変更(ジャンプ)する制御構造もあり、「選択構造」あるいは「分岐構造」という。
式
定数や変数、演算子、関数などを一定の規則に従って組み合わせたもの。評価すると一つの値が得られる。
数学では数や文字、演算記号などの組み合わせを数式(mathematical expression)というが、プログラミングでも同じように、リテラル(コード中に直に記された値)や変数、関数呼び出し、演算子などを組み合わせた表現のことを式という。
記された演算などを実際の値を用いて実施(これを「評価」という)すると、一つの値が得られる。式の持つ値は、リテラルや変数の持つ値と同じように、変数に代入したり、関数の引数として渡したりすることができる。
言語によって式に使用できる演算子の種類や機能、優先順位(結合順位)が決まっている。多くの言語では数式と同じように加算(+)、減算(-)、乗算(*)、除算(/)の演算記号を使い、剰余やべき乗などの演算記号が用意されている言語もある。他にも、言語によって論理演算子やビット演算子、条件演算子、代入演算子など様々な演算子がある。
数式では乗除算は加減算に優先するといった結合順が決まっているが、プログラミングでも言語仕様によって細かな順位が決まっている。数式と同じように括弧で囲んで (x+1)*y のように優先順位を明示できるが、入れ子にする際に括弧の種類を使い分けることはせず、((x+1)*y+1)/z のように丸括弧だけで何重にも囲むのが一般的である。
一方、プログラムの構成単位のうち、手続きや命令、宣言、実行制御などを行うものを「文」(statement:ステートメント)という。式は必ず値を持つが、文は値を持たない(か、持つとは限らない)。言語によっては、すべての構文が式となっている(必ず値を持つ)ものや、文と式の区別が曖昧なものもある。
条件式
プログラミング言語などで用いられる式の種類の一つで、値や式の比較や論理演算を組み合わせたもの。計算結果は真(true)または偽(false)となり、プログラムの分岐条件の記述などに用いられる。
二つの項が満たすべき関係を関係演算子(比較演算子)によって記述し、複数の関係を論理演算子によって組み合わせることができる。項は値(リテラル)や変数のほか、算術式や関数などを置いて計算結果を評価させることもできる。
関係演算子は二項を比較してどのような関係にあるかを表す演算子で、「等しい」(C言語では“==”)、「等しくない」(同“!=”)、「より大きい」(同“>”)「以上」(同“>=”)「より小さい」(同“<”)「以下」(同“<=”)などがある。論理演算子は命題の関係を記述する演算子で、「ではない」(NOT演算/C言語では“!”)、「または」(OR演算/同“||”)、「かつ」(AND演算/同“&&”)などがある。
条件式はこれらを組み合わせて記述する。例えば「a > 0 && a < b」という式は「aが0より大きく、かつ、aがbより小さい」という意味で、計算時のaやbの値によって、この条件が満たされる場合は式の値は真(true)に、満たされない場合は偽(false)になる。
条件式は「if( a > b )[ … }」といったようにif文やwhile文などの制御構文の条件として記述するほか、言語によっては「t = a > b;」のように演算結果をブール型の変数などに代入できる場合もある。
演算子 【オペレータ】
数学やプログラミングなどで式を記述する際に用いられる、演算内容を表す記号などのこと。演算の対象となる値や変数などのことは「被演算子」(operand:オペランド)という。例えば「x+1」という式では「+」が演算子、「x」「1」が被演算子である。
プログラミング言語では言語仕様などで様々な演算子が定義されており、これを組み合わせて式や命令文を構成することができる。対象となる被演算子の数によって、「a++」のように一つしか取らないものを「単項演算子」(unary operator)、「a+b」のように二つのものを「二項演算子」(binary operator)、「c?x:y」のように三つのものを「三項演算子」(ternary opeator)、任意個の被演算子を列挙できるものを「多項演算子」(n-ary operator)という。
演算子は演算の内容によっても分類でき、「a-b」「x/10」のように四則演算などの算術的な計算を記述する「算術演算子」(arithmetic operator)、「a>b」「x==y」のように二項の比較や関係を表す「比較演算子」(comparison operator)あるいは「関係演算子」(relational operator)、「a&&b」「x||y」のように論理演算を行う「論理演算子」(logic operator)などがある。
多くの言語では演算子は言語仕様で定義されており開発者が任意に追加、削除、変更することはできないが、言語によってはコード中で独自の演算子を定義して利用することができたり、既存の演算子に別の演算内容を割り当てる「多重定義」(オーバーロード)ができる場合もある。
代入
数学で文字を値や式で置き換えること。IT分野では、コンピュータプログラム上で変数に値を設定することを代入という。
例えば、プログラム上で整数型の変数xを宣言し、これに1を代入すると、以降のコードではxの値は1として扱われる。別の値を再代入すれば、以降xはその値となる。他の変数に格納された値を代入することもできる。
プログラミング言語にはデータ型(data type)の区別があり、整数の 1 と文字列の "1" は内部的に別の表現形式で表され、適用可能な操作も異なる。変数の型が固定される言語では異なる型の値を再代入することはできないが、スクリプト言語などでは代入によって値と型の両方を同時に変更できる場合もある。
代入を表す書式は言語によって異なるが、C言語やその記法を受け継ぐ多くの言語(JavaやJavaScriptなど)では「x=1;」のように等号(イコール記号)が代入を表す。条件式などで「もし等しければ」という比較を表す場合は、if(x==1) のように等号を2つ並べて「==」と記す。
この記法では、「xの現在の値に1を加算する」は「x=x+1;」のようになり、数学の等号とは意味が異なるため、初学者を混乱させるとして批判されることもある。このため、「=」を数式と意味が似ている比較に用い、代入は「:=」など別の記法にしている言語もある。
言語によっては、演算と代入を組み合わせ、変数の現在の値に指定の演算を行う「復号代入演算子」が用意されていることがある。例えば、加算「+」と代入「=」を組み合わせた加算代入演算子「+=」は、左辺の変数に右辺の値を加算する操作を表す。「x=x+1;」は「x+=1;」と書くことができる。
なお、英語では数学の代入は「代用」「置き換え」などを意味する “substitution” である一方、プログラミングの代入は「割り当て」を意味する “assignment” であり、異なる語、概念となっている。変数の substitution という場合は、変数名が記述された箇所を実際の値で置き換える操作などを表す。
コメント
論評、注釈、批評などの意味を持つ英単語。一般の外来語としては、ある対象についての感想や意見、評価などをまとめた短い文章や発言などを指すことが多いが、英語では注釈や説明書きなどの用法も多い。
ソースコードのコメント
プログラミング言語やマークアップ言語では、ソースコード中に記述されるがコードとしては解釈されない、人間に向けた文字列をコメントという。
主にコードの記述者が別の開発者などにコードの意味や動作、使い方、注意点などについて注釈や説明を加えるために使われる。特殊な記法でコード本体と区分けされており、オブジェクトコードなどへの変換時に自動的に取り除かれ、プログラムの一部として機能することはない。
<$Fig:comment|center|false>WebサービスやSNSのコメント欄
ブログやSNS、Webサービスなどで、ページの閲覧者が入力欄に文字列を記入して投稿し、ページ上に設けられた枠内に表示することができる機能を「コメント機能」「コメント欄」などという。
ページを見た感想や意見、指摘などを投稿して他の閲覧者からも見られるようにしたもので、投稿日時に基づいて時系列に表示されることが多い。電子掲示板(BBS)のように機能し、閲覧者間の議論やコミュニケーションなどが行われることもある。俗に「コメ」「米」「※」(「米印」からの連想)などと略されることもある。
I/O 【Input/Output】
機器やシステムなどに、外部からデータや信号を入力(input)したり、外部に出力(output)したりすること。また、そのための回路や装置、ソフトウェアなどのこと。
コンピュータの入出力という場合、一般的にはCPUやメインメモリが、それ以外の装置や機器とデータや信号をやり取りすることを指すことが多い。そのための回路や伝送路、接続端子(ポート、コネクタ)、および、オペレーティングシステム(OS)やファームウェアがアプリケーションに提供するそれらの制御手段などを意味することもある。
狭義には、キーボードやマウスなど利用者がコンピュータへ操作やデータを入力する仕組みや装置と、ディスプレイやプリンタなどコンピュータから利用者へデータを出力する仕組みや装置、ネットワーク機能などコンピュータが外部とデータを送受信する仕組みや装置を指すことがある。
また、CPUやメインメモリとハードディスクやSSDなどのストレージ(外部記憶装置)の間のデータの読み込みや書き込みのことを「ディスク入出力」あるいは「ストレージ入出力」などというが、コンピュータの性能評価などの文脈では、これを指して単に入出力という場合もある。
プロシージャ
「手続き」という意味の英単語で、コンピュータプログラム内で複数の命令や処理などを一つにまとめ、外部から呼び出し可能にしたものをこのように呼ぶことがある。
全体として何らかの特定の処理や機能を実現するために作成されるもので、繰り返し必要になるコードをまとめておくことで何度も似たようなコードを記述しなくて済むようになり、プログラムの保守性や再利用性も高まる。
このようなコードのかたまりを作成する仕組みを何と呼ぶかはプログラミング言語によって異なり、ルーチン(routine)、関数(function/ファンクション)、メソッド(method)なども似たような仕組みを指す(言語により意味や仕様はそれぞれ異なる)。PascalやVisual Basicのように呼び出し元に値を返さないものをプロシージャ、返すものを関数と呼んで区別する場合もある。
関数 【ファンクション】
コンピュータプログラム上で定義されるサブルーチンの一種で、数学の関数のように与えられた値(引数)を元に何らかの計算や処理を行い、結果を呼び出し元に返すもののこと。
プログラム上で関連する一連の命令群を一つのかたまりとしてまとめ、外部から呼び出せるようにしたサブルーチンやプロシージャ(手続き)の一種である。呼び出し時に引数(ひきすう/argument)と呼ばれる値を指定することができ、この値をもとに内部で処理を行って、結果を返り値(かえりち/return value)あるいは戻り値(もどりち)として呼び出し元に通知する。
プログラミング言語によって、返り値を持つものを関数(ファンクション)、処理を行うだけのものをサブルーチンやプロシージャとして区別する場合もある(Pascalなど)が、C言語やJavaScriptのようにすべてが関数で引数や返り値が省略可能になっている言語もある。
多くのプログラミング言語は開発者が自由に関数を定義してプログラム中で呼び出せる構文や記法を定めているほか、算術関数や文字列処理などよく使われる基本的な関数言語仕様や標準ライブラリなどの中であらかじめ実装済みとなっている(組み込み関数)。
関数といっても数学のように計算を行うものには限られず、「利用者に入力を促して入力値を返す」関数といったものもあり得る。途中で画面に何かを表示するなど、引数や返り値と直接関係ない処理を行ってもよい。
プログラムは内部に変数の値など実行状態を持つため、これを反映して同じ引数から異なる返り値が得られる場合もある。また、関数が行う処理によって状態が変化することもあり、これを関数の持つ「副作用」という。多くの算術関数のように副作用のない関数もある。
引数
プログラム中で関数やメソッド、サブルーチンなどを呼び出すときに渡す値のこと。渡された側はその値に従って処理を行い、結果を返す。オペレーティングシステム(OS)の操作などで利用者がコマンドを実行する際に指定するパラメータ(コマンドライン引数)などを指すこともある。
仮引数と実引数
関数などを定義する際に外部から受け取った値を表す変数などを「仮引数」(formal argument)、関数を呼び出す側が実際に指定した値を「実引数」(actual argument)という。
例えば、2つの数を受け取って和を返す関数 function sum(a, b){ return a + b; } があるとき、aやbを仮引数という。一方、この関数を呼び出すコード s=sum(1,2); における1や2が実引数となる。1はaに、2はbに代入されて関数内の処理が実行される。
値渡しと参照渡し
プログラミング言語の引数には「値渡し」(call by value)と「参照渡し」(call by reference)があり、どちらもサポートしている言語と片方のみサポートしている言語がある。
値渡しは変数の内容をコピーして渡す方法で、渡された関数などが変数の内容を変更しても、元の変数には影響がない。参照渡しは変数の所在を表す情報を渡す方法で、渡した側と渡された側が同じ変数を共有するため、呼び出された側で変更を加えると呼び出し側にも変更が反映される。
戻り値 【返り値】
プログラム中で呼び出された関数やメソッド、サブルーチンなどが処理を終了する際に、呼び出し元に対して渡す値。計算結果の報告などのために用いられる。
関数などが処理を行った結果として呼び出し元に報告される値のこと。反対に、呼び出し元から関数などに対してパラメータとして渡す値のことは「引数」(ひきすう、argument)という。
戻り値は計算結果の数値や処理結果のデータなどが代表的だが、処理が正しく終了したかどうかを表す真偽値やコード番号、メッセージなどを返す場合もある。多くの言語では「return x+y;」(変数xとyの和を返却する)のようにreturn文(リターン文)と呼ばれる記法で返す値を指定する。
ほとんどのプログラミング言語では戻り値は一つしか返すことができないが、変数への参照やメモリアドレス(ポインタ)を返したり、配列などの複合的なデータ構造、データ型に値を格納して返すことで、複数のデータの集合を返すことができるようになっていることが多い。C言語のvoid型関数のように、明示的に何も返さないよう指定できる言語もある。
関数などを定義する際に戻り値のデータ型もあらかじめ宣言するようになっていることが多く、呼び出し側で受け取る変数の型も揃える必要がある。言語によっては、同じ名前だが引数と戻り値のデータ型が異なる複数の関数やメソッドなどを同時に定義し、引数の型によって自動的に使い分ける機能(オーバーロード)が利用できる場合もある。
データ型
プログラミング言語などが扱うデータをいくつかの種類に分類し、それぞれについて名称や特性、範囲、扱い方、表記法、メモリ上での記録方式などの規約を定めたもの。
あるデータがどのような性質のもので、どのように取り扱うべきかを定めたもので、典型的なものには整数型や文字列型などがある。それぞれの変数や値のデータ型に応じて、それを適切に扱うためのプログラムコードが生成・適用される。
例えば、整数型の値について「1+1」という処理を実行すると、数値計算のコードが適用されて「2」という結果が得られるが、文字列型の値について「"1"+"1"」という処理を実施すると、文字列の連結処理が適用されて「"11"」という結果が得られる。
整数を文字列で除算しようとするなど、型が不整合な処理はエラーとなる。"1"という文字列型の値を1という整数型の値に変換するなど、異なる型へ一定のルールに基づいて変換することを「型変換」あるいは「型キャスト」(type casting)という。
プリミティブ型と複合型
様々なデータ型のうち、それ以上要素に分解できない最小単位のデータを格納する最も基本的なデータ型を「単純データ型」「プリミティブデータ型」などという。
言語によって用意されている単純型の種類は異なるが、文字型や文字列型、整数型、浮動小数点数型(あるいは固定小数点数型や実数型)、論理型(ブーリアン型)、日付・時刻型、バイナリ型などが用意されていることが多い。
ポインタ型や参照型などメモリ上の位置を格納する型や、関数型などプログラムをデータのように扱う型、データが「無い」ことを明示するvoid型など、特殊な型が用意されている言語もある。
浮動小数点数型に単精度や倍精度など異なる精度の型が用意されていたり、整数型がバイト長や符号の有無(負数を表現できるか否か)でいくつかの種類に分かれているなど、データの種類が同じでも仕様が異なる複数の型に分かれている場合もある。
一方、複数のデータ型を組み合わて定義された型や、複数の要素からなるデータ構造を格納するためのデータ型を「複合データ型」(complex type)という。配列や連想配列(ハッシュ、マップ、辞書)、リスト、タプル、集合型(セット)、列挙型などがこれに当たる。
組み込み型とユーザー定義型
言語仕様や標準ライブラリなどにあらかじめ用意されているデータ型を「組み込みデータ型」(ビルトインデータ型)、開発者が独自に定義したものを「ユーザー定義データ型」(user-defined type)という。
組み込み型は言語処理系が標準的に扱うことができ、演算子による演算を行ったり、基本的な操作や処理を行うための関数やメソッドが標準で提供されることが多い。
ユーザー定義型は単に既存の組み込みデータ型に別名を与えられるだけの場合もあるが、様々なデータ型を組み合わせた複合データ型を独自に定義できる機能を指すことが多い。演算子の処理内容を独自に定義(上書き)して、ユーザー定義型の値に対しても演算子を適用できる言語もある。
型宣言と型付け
プログラムの開発者がそれぞれの変数などのデータ型をプログラム上に明示することを「型宣言」(type statement)という。コード中で使用する変数などについて必ず事前に型宣言しなければならない言語と、型宣言しなくても変数などを使ってよい言語がある。
プログラムの実行前、ソースコードの記述やコンパイルの時点で型が決定されることを「静的型付け」(static typing)、実行時に実際の値に基づいて型が決定されることを「動的型付け」(dynamic typing)という。
型宣言が不要な言語の多くは動的型付けを採用しているが、「型推論」(type inference)機能により内部的に静的型付けを自動的に行う仕組みの言語もある。
整数型 【int型】
プログラミング言語などで用いられるデータ型の一つで、整数の値を格納できるもの。多くの言語に実装されている最も基本的なデータ型で、ビット長や符号の有無などにより複数の種類に分かれている場合もある。
どのくらいの長さのデータで一つの整数を表現するかによって表現できる値の範囲が異なる。例えば16ビット(2バイト)符号なし整数型であれば、0から65,535(216-1)までの間に含まれる整数値を表現できる。
多くの言語では、“int” や “Integer” などの型名で示される整数型が16ビットあるいは32ビットを表し、8ビットや16ビットは “short” などの型名や修飾子で、32ビットや64ビットは “long” などで表されることが多い。言語によっては8ビットの任意のビット列を格納する “char” や “byte” などの型が用意されており、8ビット長の整数型としても利用できる。
C言語の場合は処理系によってshort、int、longの長さが異なるが、規格上はint16_tのようにビット長を明示した型名も用意されている。同じように “Int64” といった長さが明記されたデータ型を用いる言語もある。
符号付きと符号なし
扱う値の範囲の違いにより、0と正の整数のみを格納できる符号なし整数型(unsigned integer)と、負の整数も格納できる符号付き整数型(signed integer)が選択できる場合がある。
符号付き整数は最上位ビットが正負の符号を表しており、表現できる値の幅は符号なしと同じだが、絶対値の上限は半分となる。例えば、16ビット符号なし整数の範囲は 0~65,535 だが、16ビット符号付き整数の範囲は -32,768~32,767 となる。
実数型 【real型】
コンピュータで数値を扱うためのデータ型の一つで、実数を格納できるもの。数学における実数すべてを表現できるわけではなく、小数点以下の数を扱うことができる数値データ型という意味である。プログラミン言語などでは「real」「Real」「REAL」などの型名で示されることが多い。
コンピュータプログラムやデータベースでは、数値や文字列など様々な種類のデータについて、それぞれの表現形式や表現可能な範囲などを規定した「データ型」に則って取り扱う。実数型は数値データ型の一種で、小数点以下の数を含む数値を格納、計算することができる型である。
コンピュータでは一つのデータを表現するために確保するメモリ領域には限りがあるため、実数型といっても数学で扱うありとあらゆる実数を表現可能なわけではなく、最大値や最小値、最長の桁数などに制約がある。上限などはプログラミング言語やデータベース管理システムなどの仕様で規定されている。
実数型のうち、小数点を置く位置(小数点前後の数字の桁数)を固定したものを「固定小数点数型」(fixed-point number type)、小数点の位置が可変で値ごとに指定するようにしたものを「浮動小数点数型」(floating-point number type)という。他にも、整数で分母と分子の値を保持する有理数型などが用いられることがある。
ブーリアン型 【論理型】
プログラミング言語などに用意されているデータ型の一つで、「真」(true)と「偽」(false)の二種類の値だけを取りうるもの。
論理型の値は条件式や論理演算(ブール演算)の結果を表すことができ、また、論理型の変数や定数、リテラルをこれらの計算の項として式に含めることもできる。論理型の変数が利用できることで、例えば複雑な比較の結果をいったん変数に格納し、別の場所で繰り返し参照して処理を行う(その都度同じ比較処理を記述しなくてよい)といったことができるようになる。
論理型の値に対しては、「かつ」を表す論理和(言語によりAND、&、&&などと表される)、「または」を表す論理積(OR、|、||など)、「ではない」を表す論理否定(NOT、!、~など)、「等しい」を表す同値(=、==など)、「異なる」を表す非同値(!=、<>など)などの演算を適用できる。
リテラルの表記は言語によって異なるが、真は「true」「True」「TRUE」などと、偽は「false」「False」「FALSE」などと表記することが多い。論理型に相当する値を整数で代用し、0が偽、0以外が真とする言語や処理系もある。
文字列型 【String型】
多くのプログラミング言語やデータベース管理システム(DBMS)に用意されている基本データ型の一つで、複数の文字の並びを一つの値として格納するもの。
文字を表す文字コードを連ねた文字列データを格納する型で、予め格納できる文字列の長さを指定する固定長文字列型(fixed length string)と、任意の長さの文字列を格納できる可変長文字列型(variable length string)がある。言語や処理系によっては一方しか無い場合もある。
古い言語や処理系ではASCII文字(いわゆる半角英数字・記号)しか格納できない仕様のものもあるが、近年ではUnicodeなどで表現さrた多バイト文字(漢字など)をそのまま格納できるようになっているものが多い。
一文字分の文字コードを格納するためのデータ型として文字型(character type)が用意されているC言語/C++言語などでは、組み込みデータ型としての文字列型が無く、文字型のデータの配列などの形で文字列を格納する。
探索
未知の物事を探し求めること。情報科学では、データ集合などの中から指定の条件に合致する要素を見つけ出す操作を指すことが多い。
データの探索
何らかのデータ形式やデータ構造として集められたデータの集合に対して、一定の手順に基づいて指定の条件を満たすデータを探し出し、一致したデータやその位置を明らかにする(あるいは対象の中には存在しないことを確定させる)操作のことを「探索」(search)という。
探索アルゴリズム
コンピュータなどで実行できるよう定式化された探索手順のことを「探索アルゴリズム」(search algorithm)という。例えば、最も単純な方法として、一列に並べたデータ列に対して端から順に指定の条件に一致するか照合する方法がある。これを「線形探索」(linear search)という。
また、順位や大小が比較できるデータ群であれば、大きい順または小さい順に整列(並べ替え)して、目的のデータと半分の位置にあるデータを比較すれば、含まれる方の半分に絞り込むことができる。残ったデータ群の半分の位置と比較すれば、もう半分に絞り込める。これを繰り返して残りが一つになれば探索完了となる。この方法は「二分探索」(binary search)と呼ばれる。
線形探索では一回の比較で一つしか候補が減らないため、平均してデータの個数に比例した回数の比較が必要となる(これを と表記する)が、二分探索ならば一回の比較で候補を半分に減らせるため、平均してデータの個数の2を底とした対数で済む(これを と表記する)。
このように、探索する対象の特性に適したアルゴリズムを選択することで効率的に探索を行うことができる。文字列内の特定のパターンを探索するためのアルゴリズムや、木構造やグラフなどのデータ構造に格納された要素を探索するためのアルゴリズムなどがよく知られている。
検索との違い
ITの分野では「検索エンジン」「全文検索」のようにデータ群から条件に一致するものを探し出す操作を「検索」と呼ぶこともある。いずれも英語では “search” であり、意味や用法に明確な違いはないが、慣例として情報科学などの学問分野では「探索」の語が、探索法を応用した具体的なシステムやサービスなどでは「検索」の語が好まれる。
マージ 【併合】
融合する、併合する、合併する、混合する、結合する、統合する、などの意味を持つ英単語。ITの分野では、複数のファイルやデータ、プログラムなどを、決められたルールに従って一つに統合する操作を指すことが多い。
また、プログラミングやソフトウェア開発の分野では、バージョン管理システムなどで管理している開発中のプログラムなどに、新たにコードを追加したり、修正を反映させたりする操作をマージということがある。
データ列などをマージするという場合には、対象全体を単純に後ろに繋いでいくのではなく、データ構造の一貫性などを保ちながら要素を取り出して融合していく操作を指すことが多い。例えば、(1,3,5)と(2,4,6)をマージするという場合、単に前後に連結して(1,3,5,2,4,6)を得るのではなく、値の大小関係を考慮して(1,2,3,4,5,6)を得る操作を指す。
ソート 【整列】
複数のデータが並んだ列を、何らかの順序に基いて順番通りになるよう並べ替えること。数値を大きい順または小さい順に並べたり、文字をアルファベット順や五十音順に並べたり、日時を古い順または新しい順に並べ替えることが該当する。
複数の同じ種類の要素が一列に並んでいる場合に、すべての要素に一律に適用可能な順序の規則を用いて並べ替える操作を意味する。数値と日付のように異なる種類の要素が混在していたり、要素間にじゃんけんの出し手のような循環的な関係性がある場合には正しく整列することができない。
数を小さい方から大きい方へ並べる順序を「昇順」(ascending order)、その逆を「降順」(descending order)という。数以外の場合、アルファベットを「A」から「Z」へ、読み仮名を「あ」から「ん」へ、日付や時刻を古い方(過去)から新しい方(未来)へといったように、本来の並び順や自然な順序を昇順、逆を降順という。
ソートアルゴリズム
コンピュータによるデータ処理でもソートは頻繁に用いられる操作で、整列手順を定式化したものを「ソートアルゴリズム」(sorting algorithm)という。古くから活発に研究され様々な手法が考案されており、計算回数の少なさ(高速さ)や必要な記憶装置の容量、手順のシンプルさ(プログラムの短さ)などが異なる。
平均的に効率が良く、広く用いられるのは「クイックソート」(quick sort)と呼ばれる手法で、要素数がn倍になると平均の計算時間が n×log2n 倍になる。プログラミング言語に標準で組み込まれた配列を整列する関数などによく採用されている。
データ列に同じ値が含まれる場合、その出現順がソート前後で変わらない手法を「安定ソート」(stable sorting)、保存されるとは限らない(順序が入れ替わることがある)手法を「不安定ソート」(unstable sorting)という。
また、元のデータ列の格納領域のみを用いて操作が完結する手法を「内部ソート」(in-place sorting)、外部に別の領域を確保する必要がある手法を「外部ソート」(external sorting)という。組み込みシステムなど利用できるメモリ領域が限られる場合には、高速性よりも内部ソートであることが重視されることもある。
線形探索 【リニアサーチ】 ⭐
データ探索アルゴリズムの一つで、配列などに格納されたデータ列の先頭から末尾まで順番に、探しているデータと一致するか比較していく手法。
最も単純なアルゴリズムで、配列などに格納されたデータ列の中から、まず先頭の要素を探しているデータと比較する。一致しなければ2番目の要素と比較する。これを末尾の要素まで繰り返し、途中でデータを発見したらそこで探索を終了する。
N個のデータ列の中から線形探索法する場合、最良のケースは先頭の要素と一致する場合で比較回数は1回、最悪のケースは末尾まで探してもデータが見つからなかった場合で比較はN回、平均の比較回数はN/2回となる。比較回数の平均値は要素数に正比例して増大する。
仕組みが単純なため短いプログラムコードで記述でき、コードを読んだ人が処理を理解しやすく、探索対象のデータ列以外に余分な記憶領域を消費せず、事前にデータ列のソート(大きい/小さい順に並べ直す処理)などの前処理を行う必要がないという利点がある。より高度なアルゴリズムに比べると平均の比較回数は多く、性能の高いアルゴリズムとは言えない。
二分探索 【2分探索】
データ検索アルゴリズムの一つで、一定の順序にソート(整列)済みのデータ群の探索範囲を半分に絞り込むを操作を繰り返すことで高速に探索を行う手法。
まず、データを降順(大きい順)あるいは昇順(小さい順)に並べ替え、探索したいデータが中央の要素より大きいか小さいかを調べる。これにより、データが全体の前半分にあるか後ろ半分にあるかを判定することができるため、存在しない側の半分は探索範囲から外すことができる。
半分になったデータ群の中央の要素と再び比較し、前半と後半のどちらにあるかを調べる。この操作を繰り返し行うことで、一回の操作ごとに探索範囲の大きさが半分になっていき、中央の要素が求めるデータに一致するか、探索範囲の要素数が一つになる(求めるデータは見つからなかったことが確定する)と探索は終了する。
値の大小は文字の索引順の前後関係などに適宜置き換えることにより、順序と比較手段を定義できればどのようなデータにも適用することができる。
n個のデータ群から平均でlog2n回の比較で探索を終えることができ、例えば1000個のデータを10回の比較で探索できる。原理は単純ながら高速なアルゴリズムである。ただし、要素があらかじめ整列済みである必要があるため、未整列のデータに適用するにはソートの分の計算時間も必要となる。
選択ソート 【基本選択法】
与えられたデータ列を大小などの順序通りになるよう並べ替えるソート(整列)アルゴリズムの最も基本的な手法の一つで、未整列の要素の中から最大あるいは最小のものを選択し、整列済みの列の末尾に追加していくもの。
数値の列を先頭から小さい順(昇順)に並べる場合を考える。まず、先頭から末尾までの間で最も小さい値を見つけ、先頭の値と交換する。次に2番目から末尾までの間で最も小さい値を見つけ、2番目の値と交換する。
以降も同様に、「n番目から末尾までで最も小さい値を見つけ、n番目と入れ替える」という操作を繰り返す。これを末尾の一つ前の値まで繰り返せば、先頭が最も小さく末尾が最も大きい数値の列が得られる。
列の元の状態によらず O(n2) の計算量がかかるため処理時間の予測はしやすいが、ソートアルゴリズムの中では最も遅いものの一つに分類される。木構造の一種である二分ヒープ木を用いて改良した手法を「ヒープソート」(heap sort)という。
整列したいデータ列以外の記憶領域を用意しなくてよいインプレースソート(内部ソート)で、同じ大きさの要素の順序の維持は保証されない不安定ソートである。挿入ソートなどと同じように、アルゴリズムの理解や実装が容易なため、対象データ列が短いことが分かっている場合などに利用されることがある。
バブルソート 【単純交換法】
与えられたデータ列を大小などの順序通りになるよう並べ替えるソート(整列)アルゴリズムの最も基本的な手法の一つで、端から順番に隣接する要素同士を比較・交換していくもの。
すべての要素について隣接する要素と大きさを比較し、並べたい順番と逆転していたら両者を入れ替える。この手順を最高で要素数-1回繰り返すと並べ替えが完了する。要素の入れ替えが発生しなくなった時点で処理を打ち切ってもよい。
一般的な実装では、この処理を列の一方の端から反対の端まで順番に行うことが多く、繰り返しの度に未整列の要素の中で最も大きな(あるいは小さな)要素が列の端に移動していく様子を泡(バブル)が浮き上がっていく様に例えてこのような名称となった。
最良の場合の計算時間は O(n) と高速だが、最悪の場合の計算時間は O(n2) と整列法の中でも最も遅い部類に入り、平均して高速な手法とは言えない。ただし、要素の比較・交換は順序を問わず並列化しやすいという特徴があり、並列分散処理が可能な環境では高速化することができる。
整列したいデータ列以外の記憶領域を用意しなくてよいインプレースソート(内部ソート)で、同じ大きさの要素の順序が入れ替わらない安定ソートである。アルゴリズムの理解や実装が容易で、コードの記述量が少ない。実用上はあまり使われないが、整列法の学習ではほぼ必ず取り上げられ、効率化した派生アルゴリズムも多く考案されている。
クイックソート
与えられたデータ列を大小などの順序通りになるよう並べ替えるソート(整列)アルゴリズムの一つで、分割統治法を応用したもの。最も高速な手法の一つで、1960年に英コンピュータ科学者アントニー・ホーア(Charles Antony Richard Hoare)氏が考案した。
大きな問題を小さな部分問題に分割していく「分割統治法」を利用した整列法で、データ列から適当に基準値を決め、これより大きいグループと小さいグループに分けるという手順を、分けた小さなグループに対しても再帰的に繰り返していく。
基準値の選び方には様々な方式があり、これによって比較・交換回数が左右されるが、あまり複雑な決定法だと基準値を選出するのに計算量を費やしてしまうため、単純に先頭やランダムな位置を選択することも多い。
n個の要素をソートする計算量は最良でも平均でも O(nlogn) と高速だが、最悪の場合は O(n2) になってしまう欠点もある。同じ計算量オーダーとなる整列法はヒープソートなどいくつかあるが、実際に試してみると平均的にクイックソートが高速であるとされる。
元のデータ列を格納した領域以外に別の記憶領域を必要としないインプレースソート(内部ソート)だが、通常は関数の再帰呼び出しを用いて実装するため、実用上はスタックの容量が O(logn) だけ必要となる。同じ大きさの要素の順序の維持は保証されない不安定ソートである。
例
例えば、(3,7,4,2,6,1,5)という整数列を小さい順(昇順)に並べ替える場合を考える。先頭の3を基準として、左右端から反対の端に向かって値を一つずつ基準と比較していき、左から探した3以上の値が右から探した3未満の値より左にあったら交換する。両者を比べて3以上が右にあったら探索終了となる。
3と1、7と2が交換され、(1,2,4,7,6,3,5)となる。2と4を比較して探索が終わったので、この間で2つのグループに分け、(1,2)-(4,7,6,3,5)のそれぞれに同じ操作を行う。(1,2)は(1)-(2)に、(4,7,6,3,5)は(3)-(7,6,4,5)に分かれる。
(7,6,4,5)に同じ操作を繰り返すと、(5,6,4)-(7) → (4)-(6,5)-(7) → (4)-(5)-(6)-(7) と分割されながら整列されていく。分割によってすべてのグループの要素数が1になったところで整列終了となる。このとき、端から順に小さい順に値が並んでいることが分かる。
プログラミング ⭐⭐
コンピュータに意図した動作を行わせるために、まとまった処理手順を作成し、与えること。作成された手順のことを「コンピュータプログラム」(computer program)あるいは単にプログラムという。
狭義には、プログラミング言語やそれに相当する仕組みや道具を用いて、人間が読み書きしやすい形式のプログラム(ソースコード)を記述していく「コーディング」(coding)作業を指す。広義には、その前後に行われる、設計や試験(テスト)、修正(デバッグ)、実行形式や配布形式への変換(コンパイルやビルドなど)といった一連の作業を含む。プログラミングを行う人や職種のことを「プログラマ」(programmer)という。
プログラムの作成
プログラミングを行うには、まず何をするプログラムを作るのかを明確に定義し、仕様や要件を自然言語で記述したり、大まかな処理の流れを箇条書きやフローチャートなどの図表を用いて設計する。集団でソフトウェア開発を行う場合はプログラムの記述者とは別の設計者が専門に作業を行い、仕様書や設計書などの形でまとめる場合もあるが、個人が小規模のプログラムを作成する場合はこの工程を頭の中で行い、作業や手順としては省略する場合もある。
どんなプログラムを作りたいか決まったら、これをコンピュータが解釈できるプログラミング言語を用いてソースコードとして記述していく。言語やプログラムの記述法には様々な種類があるが、手続き型の言語(手続き型プログラミング)の場合、実行すべき命令を先頭から順に書き下していく。必要に応じて、複数の命令をひとまとめにして名前をつけて呼び出せるようにしたり(関数やサブルーチンなど)、条件分岐や反復(繰り返し)などで命令の流れの制御を行う。
プログラムの実行
ソースコードそのものはコンピュータ(の処理装置)が解釈・実行できる形式ではないため、これを機械語(マシン語)のプログラムなど実行可能な形式に変換する必要がある。ソースコードを機械語などのコード(オブジェクトコード)に変換する工程をコンパイル(compile)と呼び、プログラムの起動処理やライブラリなど実行に必要なコードを連結する工程をリンク(link)という。これら一連の工程を行って実行可能ファイルやパッケージを作ることをビルド(build)という。
スクリプト言語(軽量言語)などの場合はこうした明示的な変換工程は不要で、ソースコードを機械語に変換しながら同時に実行するインタプリタなどの処理系で直に実行することができる。記述したコードをすぐ実行でき手軽だが、変換しながら実行するため実行可能ファイルを生成する場合より実行速度やメモリ効率では劣る。
プログラムの修正
作成したプログラムが一度で完全に思い描いたとおりに動作する場合もあるが、大抵は何らかの誤りや不具合を抱えているものである。このため、ビルドしたプログラムを実行してみてテスト(動作試験)を行い、仕様通りに動くか調べる。
誤り(バグ)が発見されると原因や解決策を考え、正しく動作するようにプログラムを書き換える(デバッグ)。バグには単純な記述ミスのようなものから、そもそも解くべき問題に対して選択した計算手順(アルゴリズム)が合っていないといった根本的なレベルのものまで様々な種類がある。
デバッグ作業が完了したら再びビルドとテストを行い、誤りが正されていることを確認する。このビルド→テスト→デバッグの繰り返しによって次第にプログラムの完成度や品質が上がっていき、実際に実用可能なプログラムに仕上げることができる。実際のプログラミングにおいては作業時間の多くがこの繰り返しの工程に費やされる。
プログラミング言語
主に人間がコンピュータプログラムを記述、編集するために用いる人工言語。作成したプログラムは機械語による記述に変換した後、コンピュータで実行できるようになる。
プログラム言語でプログラムを開発することを「プログラミング」(programming)、プログラム言語で記述したプログラムを「ソースコード」(source code)という。語彙、文法、記法などが自然言語よりも厳密に定義されており、記述したソースコードはソフトウェアによって自動的に解析、処理、変換などすることができる。
コンパイラとインタプリタ
プログラム言語は人間にとって理解、記述しやすい語彙や文法で構成された言語であり、そのままではコンピュータ(のCPU)が解釈、実行することができないため、ソフトウェアによってCPUが実行可能な言語(機械語、マシン語)によるプログラムに変換して実行される。
開発時や導入時などに一度にまとめて変換処理を行うことを「コンパイル」(compile)、そのような変換ソフトを「コンパイラ」(compiler)という。実行時に変換と実行を同時並行で行うソフトウェアを「インタプリタ」(interpreter)という。
高水準言語と低水準言語
プログラム言語は人間にとっての理解のしやすさや機械語に対する抽象度の高さによって分類されることがあり、機械寄りの言語を「低水準言語」(low-level language)あるいは「低級言語」と呼び、人間寄りの言語を「高水準言語」(high-level language)あるいは「高級言語」という。
機械語の命令コードと一対一に対応する命令語を用いてプログラム言語を行う低水準言語のことを特に「アセンブリ言語」(assembly language)と呼び、機械語への変換ソフトを「アセンブラ」(assembler)という。
プログラミングパラダイム
プログラムをどのようなものとして捉え、構築していくかについて一定の設計思想やルールがある場合が多く、これを「プログラミングパラダイム」(programming paradigm)という。複数の書き方が可能な言語は「マルチパラダイム」であるという。パラダイムに基いて言語を分類することもある。
手続きを順番に記述していく「手続き型言語」(procedural language)あるいは「命令型言語」(imperative language)や、関連するデータ群と手続き群を一つのまとまりとして捉える「オブジェクト指向言語」(object-oriented language)、プログラムを関数の組み合わせとして捉える「関数型言語」(functional language)、データ間の関係や論理を記述していく「論理型言語」(logic programming language)などの種類がある。
また、主な利用目的や主要な処理系の実装方式により分類することもあり、記述や実行の手間を軽減して迅速にプログラム開発ができる「スクリプト言語」(script language)あるいは「軽量言語」(LL:Lightweight Language)、特定の分野や処理に特化した「ドメイン固有言語」(DSL:Domain Specific Language)などの分類がある。
C言語 【C language】
広く普及している手続き型の高水準プログラミング言語の一つ。汎用的な言語で様々な分野で広く利用されているが、特にオペレーティングシステム(OS)などハードウェアを直接制御するプログラムの開発で利用される機会が多い。
特徴と用途
繰り返しや条件分岐、関数定義など構造化プログラミングを実現するための制御構文を多く備え、実行位置を任意の箇所に変更する構文(いわゆるgoto文)を排除した見通しの良いプログラムを記述することができる。自由度が高く拡張性が高いが、プログラムの安全性を高める配慮はあまりなく、よく仕様を理解して注意深く記述することが求められる。
波括弧 { } で括った複数の文を一つの文とみなすコードブロックの仕組みや、セミコロン(;)による文の区切り、「++」「!=」のように記号文字を組み合わせた演算子表記など、C言語で採用された記法の多く(必ずしもCオリジナルではなくそれ以前の言語から移入されたものも多い)は、その後現れた多くのプログラミング言語が踏襲している。
メインメモリ(RAM)のアドレスを直に指定したり変数に格納して操作することができる「ポインタ」(pointer)や、プログラム中にアセンブリ言語を埋め込んで記述することができるインラインアセンブラなど、低水準(ハードウェア寄り)の制御が可能な仕組みが用意されている。
C言語は高速性やハードウェア制御が必要なソフトウェアの開発に用いられることが多く、オペレーティングシステム(OS)やドライバソフト、他のプログラミング言語の言語処理系(スクリプト言語のインタプリタなど)、電子機器の組み込みシステムの制御ソフトウェアなどの開発によく用いられる。
実行環境と移植性
C言語で記述したプログラム(ソースコード)はコンパイラと呼ばれるソフトウェアによって機械語のプログラム(オブジェクトコード)に変換されて実行される。様々な機種やOS向けの開発環境で標準的にCコンパイラが提供されており、最も対応環境が多く移植性の高い言語の一つである。
ただし、環境によって標準ライブラリが提供する関数などが異なったり、ハードウェアの仕様に依存するコードがそのままでは動作しない場合があるため、他の環境へ移植する際には書き換えやプリプロセッサによる条件付きコンパイルなどの調整が必要なことが多い。
歴史
C言語の最初の仕様は1972年に当時のAT&T社ベル研究所でデニス・リッチー(Dennis M. Ritchie)氏とブライアン・カーニハン(Brian W. Kernighan)氏によって発表された。初期のUNIXはC言語で記述されており、UNIXにはC言語の処理系が同梱されていたためUNIX系OSと共に広まっていった。
言語仕様は1989年にANSI(米国国家規格協会)によって「ANSI C」と通称される標準規格となった。1990年にISO(国際標準化機構)とIEC(国際電気標準会議)によってISO/IEC 9899となり、日本でも1993年にISO標準を訳したものがJIS(日本産業規格)の一部として標準化(JIS X 3010)されている。
標準規格は機能の追加など改版を重ねており、当初の標準規格を制定年から「C90」、1999年の改訂版(ISO/IEC 9899:1999)を「C99」といったように通称する。2011年版の「C11」、2018年版の「C18」あるいは「C17」(仕様が固まったのが2017年のため)、2023年版の「C23」が知られている。
「C」という名称の由来は、当時存在した「B」という言語を改良したものであることからとされる。後にC言語の仕様にオブジェクト指向などの仕様を追加した「C++」言語が開発され、現在ではC++言語が用いられることが多い。
Fortran 【Formula Translating System】
科学技術計算などでよく用いられるプログラミング言語の一つ。1954年に米IBM社のジョン・バッカス(John W. Backus)氏が考案した言語で、世界で最初の高水準プログラミング言語であるとされる。
手続き型言語で、複素数型を組み込みデータ型として利用できたり、数式を数学での表現に近い形で記述できるなど、数値計算プログラムを記述しやすいようにできている。また、科学技術分野で長年用いられてきたことから数値計算ライブラリなどが豊富に蓄積・整備されている。
当時の大型コンピュータではパンチカードでプログラムの入力を行っていたため、1行が80桁固定で、1~6桁目はラベルやコメント宣言、7~72桁目がプログラム本文、73~80桁目が注釈などと決まっていた。他にも変数名が6文字以内など古いコンピュータ設計に基づく制約があったが、Fortran 90以降では現代的な仕様に生まれ変わっている。
歴史
コンピュータプログラムの作成にアセンブリ言語しか使えなかった当時、初の本格的な高水準言語として好評を博した。1960年代には各コンピュータ会社が自社機向けに派生仕様や専用の開発環境などを提供しはじめたため、1966年にANSI(米国規格協会)が標準規格(FORTRAN 66)を定めた。
コンピュータ技術の発展とともにFORTRAN 77、Fortran 90、95、2003、2008、2018と標準仕様は今日まで継続的に改訂され続けている。近年の規格ではオブジェクト指向や並行処理についての仕様が追加される一方、時代遅れの古い仕様が削除されている。
初期のコンピュータはアルファベット小文字に対応していなかったことなどから、当初は「FORTRAN」(印刷物などではO以降が小さいサイズの大文字=スモールキャピタルとなる)と表記されたが、Fortran 90以降では「Fortran」表記が規格上の正式名称であるとされる。
Java ⭐
様々な分野で人気の高いオブジェクト指向プログラミング言語の一つ。旧サン・マイクロシステムズ(Sun Microsystems)社が開発したもので、同社を買収した米オラクル(Oracle)社が開発を引き継いでいる。
C言語に似た表記法を採用しているが、過去の言語の仕様を受け継がず新たに設計されており、特にオブジェクト指向プログラミングを前提として言語仕様が整理されている点が大きな特徴となっている。強力なセキュリティ機構や豊富なネットワーク関連の機能が標準で用意されており、ネットワーク環境で利用されることを強く意識した仕様になっている。
Javaで開発されたソフトウェアは特定のコンピュータの機種やオペレーティングシステム(OS)などに依存することなく、基本的にはどのようなプラットフォームでも動作する。ただし、JNI(Java Native Interface)のようなインターフェースを通じてOSなどの機能を直接呼び出したり、ある開発環境に固有のライブラリやAPIを利用しているプログラムは特定の環境でしか動作しない。
同社では標準の開発環境としてJDK(Java Development Kit)、統合開発環境(IDE)としてNetBeans、実行環境としてJRE(Java Runtime Environment)をそれぞれ開発・配布しているが、これ以外にも他社やオープンソースプロジェクトなどによって多種多様な開発・実行環境が提供されている。
エディションと用途
Javaには対象機種や用途ごとにライブラリやAPIの標準仕様のセットを定めた複数のエディションがあり、様々な規模や特性のシステムで使い分けられている。最も汎用性が高く一般的な環境向けはJava SE(Standard Edition)で、パソコン上のデスクトップアプリケーションの開発などに用いることができる。
企業の情報システム向けにはJava EE(Enterprise Edition)が提供され、サーバ上で実行されるWebアプリケーションなどの開発に適した機能が用意されている。組み込みシステム向けにはJava ME(Micro Edition)があり、デジタル家電や携帯情報機器などに組み込まれる特定用途の小型コンピュータシステムの開発が可能となっている。
バイトコードと仮想マシン
Javaで記述されたソースコードは、コンパイル時にJavaバイトコードと呼ばれる中間コードにいったん変換される。ソフトウェアはバイトコードの状態で配布され、実行時にはJava仮想マシン(JVM)と呼ばれるソフトウェアによって、実行するプラットフォームに対応した実行可能形式(ネイティブコード)に変換され、実行される。
機種やOSごとの仕様の違いは仮想マシンが吸収するため、開発時にはプラットフォームの違いを意識しなくてよい。ただし、コードの実行そのものにかかる負荷に加えてネイティブコードへの変換のために処理時間やメモリ領域を必要とするため、実行速度やメモリ容量に厳しい要件がある用途では注意が必要となる。
JVM言語
Java仮想マシン(JVM)およびJavaバイトコードの仕様はJava言語自体の仕様とは独立しており、また仕様は公開されているため、Java以外の言語からJVMのバイトコードへ変換(コンパイル)して実行形式のファイルを得ることもできる。
そのようなJVMによる実行方式を前提に開発されたプログラミング言語や言語処理系のことをJVM言語と総称する。単体の言語としてはScalaやGroovy、Kotlin、Clojureなどが有名で、既存の言語をJVM言語化する言語処理系としてはRubyを利用するJRubyやPythonを利用するJythonがよく知られる。
C++言語
広く普及しているオブジェクト指向型の高水準プログラミング言語の一つで、C言語を拡張したもの。ハードウェア制御やオペレーティングシステム(OS)の一部など、システムに深く根ざしたプログラムの開発に用いられる。
Cにオブジェクト指向関連の仕様などを追加したもので、Cの仕様を引き継いだ上位互換となっており、ほとんどのCプログラムはそのままC++プログラムとしても有効である。高度で抽象的な機能と低水準(ハードウェア寄り)な機能を兼ね備えた汎用的なプログラミング言語として、様々な用途で広く普及している。
Cにはない要素として、クラスの定義や継承などのオブジェクト指向プログラミングのための要素や、関数や演算子のオーバーロード(多重定義)、テンプレート、仮想関数、例外処理、名前空間などが追加されている。プログラムの部品化や再利用がしやすく、複雑・大規模なプログラムを開発するのに向いている。一方で、仕様が肥大化・複雑化しすぎ、プログラムが難解になっているとの批判もある。
Cと同じように、記述したプログラムはコンパイラと呼ばれるソフトウェアによって機械語のプログラムに変換されて実行される。様々なCPUやオペレーティングシステム(OS)向けの開発環境で標準的にC++コンパイラが提供されており、最も対応環境が多い言語の一つとなっている。
C++言語は1983年にAT&T社ベル研究所(当時)のビャーネ・ストロヴストルップ(Bjarne Stroustrup)氏が考案したもので、1998年にISO/IEC 14882として標準化された。日本でも2003年にISO標準を和訳したものをJIS規格(日本工業規格)の一部として標準化している。ISO標準は何度か改訂されており、俗にそれぞれの制定年を取って「C++98」「C++03」「C++11」「C++14」「C++17」「C++20」「C++23」などと呼ばれることもある。
「C++」という名称の由来は、C言語に存在する算術演算子の一つで、整数型の変数の値に1を加えるインクリメント演算子「++」から。Cの仕様を引き継いで機能を拡張した言語は他にもあり、C++と同じくオブジェクト指向的な拡張を施した「Objective-C」が有名である。
Python
簡潔で読みやすい文法が特徴的な汎用の高水準プログラミング言語の一つ。いわゆるスクリプト言語の草分けの一つで、UNIX系OSを中心に広く普及している。近年では初学者向けの学習用途、統計処理やAI関連のプログラム記述用途として用いられることも多い。
基本的な特徴としては、豊富なデータ型とコンテナ型、ガベージコレクション、Unicodeによる多言語対応、プログラムのモジュール(部品)化による他のプログラムへの容易な組み込み、プログラムの仕様の文書化(ドキュメンテーション)を支援する機能などがある。
ユニークな特徴としては、多くの言語では人間にとってプログラムを読みやすくするために便宜的に行われるインデント(字下げ)を言語仕様上の構文の一つとして採用しており、ブロックの範囲を示すのに用いられる。
言語自体の文法や語彙、記法な最小限のシンプルなものに抑えられているが、対照的に、極めて広範囲の分野に渡り豊富な機能を提供する標準ライブラリが用意されている。当初は手続き型言語とオブジェクト指向言語の特徴を備えた言語として設計されたが、関数型言語の要素の多くを取り入れ、様々なスタイルのプログラミングが可能なマルチパラダイム言語として知られている。
他の言語や環境との連携機能も充実しており、Pythonからアクセスできない低レベルの機能をC言語で記述して拡張モジュールとして組み入れる仕組みが提供されているほか、Javaライブラリを利用できる実行環境の「Jython」や、Microsoft .NET環境で.NET Frameworkの機能を利用できる「IronPython」などの処理系もある。
標準の言語処理系(CPython)にはソースコードを読み込みながら同時に実行するインタプリタが含まれ、コンパイルやビルドなど手間や時間のかかる作業を省略して記述したプログラムを即座に実行してみることができる。この処理系はオープンソースソフトウェアとして公開されており、誰でも自由に入手、利用、改変、再配布などすることができる。
Pythonの最初のバージョンは1991年にオランダのグイド・ヴァン・ロッサム(Guido van Rossum)氏によって発表された。現在ではWebアプリケーションの開発用言語として人気が高いほか、データ処理や統計解析などの分野でよく利用されることで知られる。
JavaScript 【JS】 ⭐⭐
主にWebページに組み込まれたプログラムをWebブラウザ上で実行するために用いられるプログラミング言語の一つ。いわゆるスクリプト言語の一つで、近年ではブラウザ以外の実行環境でも利用される。
主な特徴
C言語やJavaに似た記法や文法を採用した手続き型の言語で、簡潔な記述でプログラムを開発することができる。関数を変数のように(第一級のオブジェクトとして)扱ったり、関数を引数に取る高階関数を定義できるなど、関数型プログラミング言語の仕様も取り込んでいる。
オブジェクト指向にも対応しているが、他の多くの言語で一般的な、オブジェクトの雛形を定義したクラスを用いる方式(クラスベース)ではなく、既存のオブジェクトを複製して機能を追加していく「プロトタイプベース」と呼ばれる手法を採用している。
Webブラウザでの利用
WebページのHTMLファイル内に特殊な記法を用いて埋め込まれて記述され、Webブラウザに内蔵された言語処理系によってページの表示時に解釈・実行されることが多い。スクリプトのみを記述したファイル(.jsファイル)を読み込む形で利用されることもある。ページ内の要素に動きや効果を加えたり、閲覧者の操作に即座に反応して何らかの処理を行ったりするのに用いられる。
主要なWebブラウザの多くが標準で対応しているが、ブラウザの種類やバージョンによって仕様や挙動に違いがあり、開発者を悩ませ続けている。他の言語の場合にも見られる言語そのものの仕様・実装の違い(バージョンの違いや各社独自の拡張や仕様・実装の相違)の他に、HTMLやCSSの仕様や解釈の相違や、スクリプトからWebページ上の表示要素を扱う際に必要となるDOM(Document Object Model)と呼ばれるAPIの違いもあるため、複数のブラウザで同じように動作するスクリプトを開発するのは一筋縄ではいかない。
他の実行環境
近年ではWebブラウザに留まらず様々な環境に言語処理系が移植され、様々な用途で使用されている。Node.jsやASP.NETのようにWebサーバ上でプログラムを実行して動的にWebブラウザに応答を返すシステムや、オペレーティングシステム(OS)上で直に実行可能な処理系(Windows Scripting Hostなど)がよく知られる。米アドビ(Adobe)社の「Flash」では標準のスクリプト言語に採用されていた(正確にはActionScriptと呼ばれる方言)。
AltJS
開発効率や保守性、プログラムの読みやすさなどの改善、よく起こりがちな誤りの防止などを目的に、JavaScriptを元に独自の機能や仕様を追加したり、文法や記法の追加・変更を行った言語がいくつか開発されており、「AltJS」(Alternative JavaScript)と総称される。
これらの言語で書かれたプログラムは「トランスパイラ」(transpiler:トランスコンパイラの略)と呼ばれる変換ソフトにより一旦JavaScriptによる表記に変換されるため、JavaScriptの実行環境さえあれば通常のスクリプトと同じように実行できる。著名なものには「TypeScript」や「JSX」、「CoffeeScript」などがあり、Webアプリケーションの開発現場などでよく利用される。
Javaとの違い
名称にプログラミング言語「Java」の語を冠しているが、他の「Java○○」技術とは異なり、Java言語の拡張仕様や関連技術などではなく、記法や予約語などの一部が共通していること以外に直接的な繋がり互換性はない。
実際、型システムや関数、オブジェクト指向の扱いなど言語仕様の根本的な部分のいくつかがJavaとは大きく異なる。かつてはJavaにもWebページ内にプログラムを埋め込んで実行する「Javaアプレット」と呼ばれる仕組みがあったため、主に技術者以外のWebに携わる人々にとって名称が紛らわしく、しばしば混同や取り違えが発生した。
歴史
1995年にネットスケープ・コミュニケーションズ(Netscape Communications)社(当時)のブランダン・アイク(Brendan Eich)氏によって開発され、当時最も人気の高いWebブラウザだった「Netscape Navigator 2.0」に初めて実装された。
当初は「LiveScript」(ライブスクリプト)という名称だったが、同社がJava開発元のサン・マイクロシステムズ(Sun Microsystems)社(当時)と提携していたことから、Javaの名称を冠してJavaScriptに改称された。
1997年にはEcma International(エクマ・インターナショナル)によって「ECMAScript」の名称で仕様が標準化され、ISOやJISなども同様の規格を標準化した。ECMAScriptは20年以上に渡って活発に改版を重ねており、各社の処理系もこれに準拠する形で機能追加が進められている。
R言語
統計解析に適した仕様を持つプログラミング言語の一つ。プログラミングの専門家でなくても短い記述で大量のデータを効率よく処理できるよう配慮されている。標準の処理系はオープンソースソフトウェアとして公開されている。
基本的な文法や記法は、同じ統計処理言語のS言語や関数型言語のSchemeなどの影響を受けているが、C言語のような手続き型の書式やオブジェクト指向についての仕様も規定されている。データ処理や統計解析に特化した言語であるため、汎用プログラミング言語のようなアプリケーション開発には向かない。
ユニークな仕様として「ベクトル処理」があり、ベクトル(vector)と呼ばれるリストや配列に似たデータ構造にデータを格納し、関数による一括処理やベクトル同士の演算という形で多数のデータを対象とする処理を簡潔に記述することができる。汎用言語ではfor文などでループ処理を記述する場面でも、一行のベクトル処理で済ませられることが多い。
ベクトルだけでなく配列(array)、行列(matrix)、リスト(list)、表に相当するデータフレーム(data frame)、時系列データ(time series)など様々なデータ構造、文字型、論理型、複素数を表現可能な数値型などのデータ型に標準で対応する。関数をデータとして扱う高階関数も利用できる。
統計やデータ処理についての機能が標準で豊富に組み込まれており、基本的な統計関数、検定関数、多変量解析のための関数(因子分析、主成分分析、クラスタリングなど)、様々な確率分布における確率密度や累積分布、確率点、乱数を求める関数、線形回帰モデル、分散分析モデル、欠損値(N/A)を表す定数、サンプリング関数などが用意されている。
グラフなど図表の描画機能も充実しており、解析結果を印刷物でも使用可能な品質の図表や画像に表すことができる。PNGやJPEGなどの画像ファイル、PDFやLaTeX、PostScriptなどの文書ファイルとして書き出す機能も標準で備えている。
標準に存在しない機能は「パッケージ」として追加することができる。世界中の開発者が作成したパッケージが「CRAN」(The Comprehensive R Archive Network)と呼ばれるインターネット上の集積所で公開されており、簡単な操作でパッケージの取得や開発環境への導入、更新などを行うことができる。
コーディング規約 【コーディングルール】 ⭐
ソフトウェア開発者がコンピュータプログラムのソースコードを記述する際に要請される、コードの書き方や形式に関する決まりごと。組織やプロジェクトごとに内部的に定める場合と、言語の開発元が標準を定める場合がある。
プログラミング言語の文法とは異なり、様々な書き方が可能な場合にどういった書き方(スタイル)にするかを集団内の約束として決めたものを指す。変数や関数などの命名規則や、利用してはいけない機能などの禁止事項、インデントやスペース、括弧や演算子などの記号の配置の仕方などで構成される。
企業の開発部門やオープンソースプロジェクトなど集団でプログラミングをする場合、各々ばらばらの流儀でコードを書くと他人の書いたコードを理解したり修正したりすることが難しくなる。コードの表記法をコーディング標準として統一しておくと、可読性や保守性が高まり、開発効率を向上させることができる。
どのような規約を定めるかは言語や開発環境の制約、組織やメンバーの考え方や方針により様々で、一律に良し悪しや優劣を定められるものではなく、集団が異なれば同じ項目でも異なる方針が採用されることもしばしばである。PythonのPEP 8のように言語側で標準のコーディング標準が用意されている場合もある。
具体的な項目としては、実行制御の入れ子(ネスト)構造に従った各行先頭の字下げ(インデント)の仕方(タブかスペースか、一段何文字分とするか等)、コードブロックの開始や終了を示す括弧や制御文の置き方(行末で開始するか、改行して行頭で開始するか等)、コメントの記述形式、変数や演算子などの前後に空白文字を置くか否か、三項演算子など可読性を落としがちな構文の使用を許容するか否か、などがある。
インデント
文章の行頭に空白を挿入して先頭の文字を右に押しやること。また、そのために左端に挿入された空白や、テキストエディタやワープロソフトの持つ字下げ機能のこと。
横書きの日本語は段落の先頭を一文字分字下げすることになっているため、文書作成ソフトなどにはそのための機能が用意されていることが多い。
ソースコードのインデント
プログラミングの分野では、プログラムの構造を見やすくするために制御構文の内側にある行などの先頭に一律に同じ幅の空白を挿入することをインデントという。
どの行が同じブロックに含まれるのか視覚的に分かりやすく表示することができ、プログラムの流れが理解しやすくなる。範囲の取り違えなどに起因するバグなどを減らす効果も期待できる。
あるブロックの中に別のブロックが含まれるという入れ子構造(ネスト)になっている場合、各行のインデントも入れ子の深さに応じて長くなっていく。これにより、プログラムの階層構造をコード中で視覚的に表すことができる。
インデントとして挿入されるのはタブ文字か連続した空白文字(スペース文字)で、タブ文字の場合はインデントの幅は表示する側のソフトウェアの設定により異なる。空白文字で表す場合は2~8文字程度の連続した空白でインデントする。
読む側で好みの幅を調整できるのでタブが好ましいとする人と、書く側で幅を決定して環境によらず同じように表示できるので空白文字が好ましいとする人の間で長年論争があり、また、いずれの場合も一段のインデント幅を何文字分とするかで好みが分かれる。
ほとんどのプログラミング言語ではインデントはソースコードの見た目の問題でありプログラムの意味には影響を及ぼさない(取り除いても同じように動作する)が、Pythonのようにインデントによってプログラムの構造を記述する言語もある。
ネスト 【入れ子】
あるものの中に、それと同じ形や種類の(一回り小さい)ものが入っている状態や構造のこと。IT分野では、コンピュータプログラムやデータ構造において、ある構造の内部に同じ構造が含まれている状態のことを指す。
よく知られるのはプログラムの制御構造のネストで、if( 条件A ){ ... if( 条件B ){ ... } ... } といったように、条件分岐やループの内部に、別の条件分岐やループなどが含まれた制御構造を指す。複雑な条件による分岐や多重ループを記述するための基本的なテクニックとして多くのプログラミング言語で利用できる。
for文の中にfor文を記述するなど、同じ構文を入れ子状に繰り返すことを指す場合が多いが、while文の中にif文など、異なる制御構文を内部に記述することも含む場合がある。内側の構文の内部にさらに構文を重ねて、マトリョーシカのように何重も入れ子にすることができ、階層の多さを「ネストの深さ」と表現することがある。
サブルーチンなどのネスト
プログラミング言語の中には、サブルーチンやプロシージャ、関数、クラスなどのコードのまとまりをネストさせ、内部に同種のまとまりを定義することができるものもある。例えば、関数の内部に定義された別の関数を「関数内関数」「ローカル関数」などと呼び、クラスの内部に定義された別のクラスを「クラス内クラス」「インナークラス」「内部クラス」などという。
データ構造のネスト
あるデータ構造の要素として、そのデータ構造自身を埋め込むことができる場合があり、データ構造のネストを形成する。例えば、配列を構成する個々の要素が配列になっている多次元配列は配列のネストである。
配列の配列など、内部が再帰的に同じ構造になっているものを指すことが多いが、連想配列の要素が配列になっているものなど、制御構文の場合と同じように異なる構造が入れ子状になっている場合も含むことがある。
命名規則 【ネーミング規約】
変数名などコンピュータプログラムのソースコード上で開発者が名付ける識別名についての決まりごと。言語仕様や開発環境などによって定められているものと、ソフトウェア開発を行う組織やチームが内部的に定めるものがある。
クラス名やメソッド名、関数名、定数名、変数名など、プログラム上で定義して扱う対象に名前を付ける機会は多くあるが、複数人で開発を行う場合などにそれぞれが異なる考え方や基準で名前を付けると、互いのコードの可読性や視認性が損なわれ、開発効率や保守性の悪化につながる。名前の衝突や使い回しなどでバグが生じることもある。
そこで、名前の付け方に一貫したルールを設け、これに従って識別名を命名するようにするのが命名規則である。よく定義された命名規則に従うと、対象の意味や機能、使い方などが名前からある程度推測できるようになり、コード自体がドキュメントの役割を果たすようになる。検索や置換、ツールによる自動化なども行いやすくなり、デバッグや修正、追加開発の効率も向上する。
どのような規則を定めるかはプログラミング言語や開発環境の制約、組織やメンバーの考え方や方針によって様々であり、必ずしも良し悪しや優劣を論じられるものではなく、規格化された標準などがあるわけでもない。言語やフレームワークによっては仕様上定められている命名規則が存在する場合もある。
よく定められる項目としては、「isClickable()」のように先頭や末尾に付け加える特定の意味を持つ接頭辞や接尾辞(ハンガリアン記法)、大文字と小文字の使い方や組み合わせ方、複数単語の連結の仕方などがある。古くはメモリ容量節約などのため、名前の文字数の制限が定められることもあった。
キャメルケースとスネークケース
英語の複合語や、フレーズ(句)や文を一語に繋げて表記する際、“JavaScript” のように各構成語の先頭を大文字にする方式を「キャメルケース」(camel case)という。大文字部分が上に出っ張っているのをラクダ(camel)のこぶに例えた呼称である。
このうち、“getDate” のように先頭は小文字とする方式を「ローワーキャメルケース」(LCC:Lower Camel Case)、“GetWindow” のように先頭も大文字とする方式を「アッパーキャメルケース」(UCC:Upper Camel Case)あるいは「パスカルケース」(Pascal Case)という。
一方、「file_get_contents」のように単語間のスペース(空白文字)をアンダースコア(_)に置き換える方式を「スネークケース」(snake case)という。大文字がなく、長く一連なりに文字が続く様を地を這う蛇(snake)になぞらている。
モジュール分割
コンピュータプログラムを設計する際に、全体を何らかの基準に則って複数の部品に分割すること。この部品は特定の機能や構造を表す適切な大きさのプログラムのまとまりであり、これを組み合わせてプログラム全体を構成していく。
一定の方針に基いてモジュール分割を行うことにより、開発者にとってプログラムの構造が見通しやすくなり、複数人での分担や問題発生時の原因の発見、コードの再利用などが行いやすくなる。古くから様々な技法が提唱されている。
共通機能分割
プログラム全体を複数の部品(モジュール)に分割するための設計指針の一つで、プログラム中の様々な箇所で共通して行われる処理をモジュールとして切り出す方式を共通機能分割という。
プログラム中にはエラー処理のように、様々な処理の中で同じか似たような処理を行う箇所が存在する場合があり、これを共通の機能として分離して一つのモジュールにまとめ、必要な時に呼び出すようにするのが共通機能分割である。まず全体を他の手法でモジュール分割し、複数のモジュールに共通する部分を共通機能分割で取り出すといった利用法が多い。
TR分割 (トランザクション分割)
プログラム全体を複数の部品(モジュール)に分割するための設計指針の一つで、データの種類とその処理内容に応じて分割する方式をTR分割(トランザクション分割)という。
対象となるデータの種類と、そのデータに対する関連する一連の処理をトランザクションという単位にまとめ、プログラムをトランザクション単位で分割していく手法で、データの種類などによって処理の流れが複数に分岐する場合によく用いられる。
STS分割
プログラム全体を複数の部品(モジュール)に分割するための設計指針の一つで、データの入力(Source:源泉)、変換(Transformation)、出力(Sink:吸収)の3つに分割する手法をSTS分割という。
プログラム中でのデータの流れに着目し、プログラムへのデータの入力や取得、読み込みなどを行うモジュールと、データの計算や加工、変換などを行うモジュール、データの出力や表示、印刷、書き出しなどを行うモジュールに分割する。
これらのモジュールを直に繋いで流れ作業的に連続して実行する場合もあるが、これらの上位に制御用のモジュールを配置してデータの流れや実行状態の管理を行う場合もある。
ワーニエ法 (Warnier method)
プログラム全体を複数の部品(モジュール)に分割するための設計指針の一つで、入力データの構造を分析してプログラムの構造を決定していく方式をワーニエ法という。1970年代にフランスの情報科学者ジャン・ドミニク・ワーニエ(Jean-Dominique Warnier)氏によって考案された。
ワーニエ法では、データがいつ、どこで、何回使われるかを分析し、これを元に、順次(連結)、選択、繰り返しの3種類の制御構造を組み合わせて制御の流れを決めていく。これを図示したものをワーニエ図という。
ジャクソン法
プログラム全体を複数の部品(モジュール)に分割するための設計指針の一つで、入出力データの構造からプログラムの構造を決定していく方式をジャクソン法という。マイケル・ジャクソン(Michael A. Jackson)氏が1975年に発表した。
プログラムの入力データと出力データの対応関係を把握し、入力から出力が得られるようプログラムの構造を決定していく。その際、データやそれを扱うモジュールを、基本、連接、選択、反復の4つの要素を組み合わせて表現する。
メインルーチン
あるコンピュータプログラム全体の中で中心となる部分のこと。起動時に最初に実行されるエントリポイントが含まれる。
プログラムはオペレーティングシステム(OS)などによって起動されるが、起動して最初に実行するコードが含まれる部分がメインルーチンとなる。メインルーチンの最後のコードを実行し終えると、プログラムの実行も終了となる(他の箇所で終了することもできる)。
例えば、C言語のプログラムは「main」という関数から実行が開始される仕様になっており、このmain関数がメインルーチンとなる。多くのスクリプト言語ではプログラムの先頭およびそれに続く部分(オブジェクトや関数などの定義に含まれない部分)がメインルーチンとなる。
メインルーチンから呼び出して実行する手続きや関数、メソッドなどのコードのまとまりのことは「サブルーチン」(subroutine)という。サブルーチンの実行が終了すると、メインルーチンの呼び出し箇所に戻り、続きのコードが実行される。
利用者の操作など何らかの指示やきっかけに応じてプログラムが終了する構造にしたい場合には、メインルーチンが終わらないよう終了条件が満たされるまでループし続ける制御構造にすることがある。これを特に「メインループ」(main loop)という。
サブルーチン 【サブルーティン】
コンピュータプログラムの中で特定の機能や処理をひとまとまりの集合として定義し、他の箇所から呼び出して実行できるようにしたもの。単に「ルーチン」とも呼ばれる。
プログラム中の様々な状況や箇所で繰り返し必要となるような処理をサブルーチンとして名前をつけて一つの塊として定義することで、その処理を何度も繰り返し記述・複製する必要がなくなり、コード量の削減や開発効率の向上、記述ミスなどによる誤り(バグ)の減少などが期待できる。
サブルーチン内部の処理に反映させるため、呼び出し側から値を指定できるようになっている場合が多く、この値を「引数」(ひきすう/argument)という。また、処理結果として呼び出し元に値を返すことができる場合があり、この値は「返り値」あるいは「戻り値」という。返り値を持つサブルーチンは「関数」(function)と呼ぶのが一般的である。
かつてはプログラムが起動したとき最初に実行される主系統のコード集合を「メインルーチン」(main routine)、そこから呼び出される形で実行される副系統のコード群をサブルーチンと呼んで区別していたが、現在ではそのような構造に当てはまらない例も増えており、サブルーチンのことを単にルーチンと呼ぶことも多い。
サブルーチンに相当するコード集合は、プログラミング言語によっては「プロシージャ」(procedure)のように異なる名称で呼ばれることもある。オブジェクト指向プログラミングでは一般的に「メソッド」(method)という。返り値を持つか否かで名称が異なる言語(Pascalのプロシージャと関数など)や、C言語のようにすべてを関数と呼ぶ場合もある。
ライブラリ
図書館、図書室、資料室、書庫、書斎、蔵書、文庫、選書、双書などの意味を持つ英単語。ある分野の資料やデータなどを一定の形式で集めたものを、図書館になぞらえて比喩的にライブラリと呼ぶことがある。
ITの分野では、ある特定の機能を持ったコンピュータプログラムを他のプログラムから呼び出して利用できるように部品化し、そのようなプログラム部品を複数集めて一つのファイルに収納したものをライブラリということが多い。
一般的に、ライブラリにはオブジェクトコード(機械語などで記述された実行可能形式のプログラム)が格納されているが、それ単体で起動して実行することはできず、他の実行可能ファイルに連結されて利用される。言語や処理系によってはソースコードの集合をライブラリという場合もある。
様々なプログラムが共通して利用する汎用性の高い機能などがライブラリとして開発・提供されることが多く、標準的なライブラリはオペレーティングシステム(OS)やプログラミング言語の開発環境、開発ツールなどの一部として付属することが多い。
特定のソフトウェアやハードウェアを利用したプログラムを開発するために必要な機能がライブラリの形でまとめられている場合もあり、当該システムのソフトウェア開発キット(SDK)などの一部として開発者に提供される。
また、部品化されたコンピュータプログラム以外にも、特定の分野や形式のデータなどを検索、取得、再利用しやすい形にまとめたファイルやデータベース、Webサイトなどのことを「フォトライブラリ」「音声ライブラリ」などといったように呼ぶことがある。
API 【Application Programming Interface】
あるコンピュータプログラム(ソフトウェア)の機能や管理するデータなどを、外部の他のプログラムから呼び出して利用するための手順やデータ形式などを定めた規約のこと。
個々のソフトウェアの開発者が毎回すべての機能をゼロから開発するのは困難で無駄なため、多くのソフトウェアが共通して利用する機能は、OSやミドルウェアなどの形でまとめて提供されている。
そのような汎用的な機能を呼び出して利用するための手続きを定めたものがAPIで、個々の開発者はAPIに従って機能を呼び出す短いコードを記述するだけで、自分で一から処理内容を記述しなくてもその機能を利用したソフトウェアを作成することができる。
広義には、プログラミング言語の提供する機能や言語処理系に付属する標準ライブラリの持つ機能を呼び出すための規約などを含む場合もある(Java APIなど)。
また、APIを経由して機能を呼び出す形でプログラムを構成することにより、同じAPIが実装されていれば別のソフトウェア上でそのまま動作させることができるのも大きな利点である。実際、多くのOS製品などでは同じ製品の旧版で提供していたAPIを引き継いで新しいAPIを追加するという形で機能を拡張しており、旧バージョン向けに開発されたソフトウェアをそのまま動作させることができる。
APIの形式
APIは人間が記述・理解しやすい形式のプログラムであるソースコード上でどのような記述をすべきかを定めており、原則としてプログラミング言語ごとに定義される。
関数やプロシージャなどの引数や返り値のデータ型やとり得る値の意味や定義、関連する変数や定数、複合的なデータ構造の仕様、オブジェクト指向言語の場合はクラスやプロパティ、メソッドの仕様などを含む。
通信回線を通じて遠隔から呼び出すような構造のものでは、送受信するパケットやメッセージの形式、通信プロトコル(通信規約)などの形で定義される仕様をAPIと呼ぶこともある。
Web API
近年ではネットワークを通じて外部から呼び出すことができるAPIを定めたソフトウェアも増えており、遠隔地にあるコンピュータの提供する機能やデータを取り込んで利用するソフトウェアを開発することができる。
従来は通信を介して呼び出しを行うAPIはRPC(リモートプロシージャコール)の仕様を元に製品や環境ごとに個別に定義されることが多かったが、インターネット上でのAPI呼び出しの場合は通信にHTTPを、データ形式にXMLやJSONを利用するWeb APIが主流となってきている。
2000年代前半まではWeb APIの標準として仕様が巨大で機能が豊富なSOAPの普及が試みられたが、2000年代中頃以降は軽量でシンプルなRESTful APIが一般的となり、狭義のWebアプリケーションだけでなく様々な種類のソフトウェアやネットサービス間の連携・接続に幅広く用いられるようになっている。
APIと実装
API自体は外部からの呼び出し方を規定した決まりごとに過ぎず、呼び出される機能を実装したライブラリやモジュールなどが存在して初めてAPIに挙げられた機能を利用することができる。
あるソフトウェアのAPIが公開されていれば、同じAPIで呼び出すことができる互換ソフトウェアを開発することもできる。ただし、APIを利用する側のプログラムが(スクリプトなどではなく)バイナリコード(ネイティブコード)の場合にはこれをそのまま動作させることはできないのが一般的で、同じソースコードを元に互換環境向けにコンパイルやビルドをやり直す必要がある(ソースレベル互換)。
また、API自体は標準実装における動作の詳細までは定義していないため、APIが同一の互換ソフトウェアだからといって動作や振る舞いがまったく同じであるとは限らない。商用ソフトウェアの場合はAPIが非公開だったり、すべては公開されていなかったりすることが多く、公開情報だけではAPI互換の製品を作ることも難しい。
APIと知的財産権
従来は特許で保護されている場合を除いて、APIそのものには著作権その他の知的財産権は存在しないとする見方が一般的で、実際、元のソフトウェアのコードを複製せずすべて独自に実装するという方法でAPI互換ソフトウェアが数多く開発されてきた。
ところが、米オラクル(Oracle)社が権利を有するJava言語やその処理系に関して、米グーグル(Google)社が同社の許諾を得ずにAndroidスマートフォン向けにJava APIを実装した実行環境(Dalvik VM)を開発・提供しているのは著作権侵害であるとの裁判が起こされ、米裁判所は訴えを認める判決を出した。今後はAPIの権利について従来の状況が変化していく可能性がある。
Web API 【Web Application Programming Interface】
HTTPなどのWeb技術を応用して、あるコンピュータで動作しているソフトウェアの機能を、ネットワークを通じて他のコンピュータから利用できるようにする仕組み。
API(Application Programming Interface)とは、コンピュータプログラムが提供する機能を他のプログラムから呼び出して利用するための規約で、処理要求や応答のデータ形式、双方のやり取りの手順などで定義される。
Web APIはWebサーバ上で動作しているプログラムが外部に機能を提供するためのAPIで、Webサイトに別のサイトの提供する機能やデータを組み込んだり、アプリケーションソフトからWeb上で提供されているサービスの機能やデータを利用するために用いられる。
Web APIで機能を公開しているサーバに対して、インターネットなどを通じて依頼内容をHTTPリクエストの形で送信すると、処理結果がHTTPレスポンスの形で送られてくる。呼び出し側が挙動や入力データを指定する引数はURLパラメータ(クエリ文字列)などの形でURLの一部として指定することが多い。
送受信されるデータの形式はAPIの種類や目的によって様々だが、WebコンテンツやWebサービスで馴染み深いHTMLやJSON、XML、プレーンテキストなどがよく用いられる。応答として画像ファイルやPDFファイル、CSVファイルなど、内容を特定形式のファイルにまとめて送る仕組みもよく見られる。
RESTful APIとSOAP
Web APIの構成法としてよく知られるものに「SOAP(Simple Object Access Protocol/ソープ)と「REST」(Representational State Transfer/レスト)がある。
SOAPはXMLとHTTPを基本として、Web APIで用いるメッセージの形式や通信手順(プロトコル)などを規定した標準規格で、用途や目的ごとに詳細な拡張仕様が規定されている。2000年代初頭にWebサービス実装の有力な規格として期待されたが、仕様の複雑さや規模の大きさが敬遠されあまり普及しなかった。
RESTはシンプルさを重視するAPIの設計原則で、セッションなどの状態管理の仕組みを持たない(ステートレスである)など、4つの原則で構成される。これをWeb APIの設計に適用したものを「RESTful API」(レストフルAPI)あるいは「REST API」という。
RESTfulなWeb APIではHTTPやURLなどWeb技術の仕様をなるべくそのまま取り込み、HTTPメソッドによる動作の指定、HTTPステータスコードによる結果の通知、URLだけで機能や対象の一意な指定や識別を行う、実行状態を保存せず同じ入力に対しては常に同じ出力を返すなどの特徴がある。
REST自体は原則を示しているだけで個別の用途に応じた仕様の策定などは開発者に任されるため、似た目的のためにそれぞれ互換性のないAPI仕様が乱立するなどの問題はあるものの、仕様がシンプルで開発や利用が容易なことから広く普及している。
ローコード開発
ソフトウェア開発の手法の一つで、特殊なツールを用いることで、プログラミング言語によるコードをほとんど書かずに開発を進めること。
一般的なソフトウェア開発では、仕様や設計を元にプログラミング言語を用いてソースコードを記述するコーディング過程が多くの時間と工数を占め、コードの記述によってソフトウェアの振る舞いのほとんどが決定される。
ローコードでは、図形などのグラフィックによる表示・操作を行うGUI(Graphical User Interface)ツールを使い、画面上でシンボルを配置したり繋ぎ合わせたりしてプログラムの挙動を決めていく。表示画面の設計も実際に画面に表示要素を配置してデザインする。完全にコードが不要とは限らず、細かな設定や挙動の記述のために部分的にコードを記述することはある。
ローコードはプログラミングなどに習熟していない従業員などでも行うことが可能で、設計工程やテスト工程の一部も統合できるため、業務現場のニーズに即して迅速に低コストで特定目的・用途のソフトウェアを開発・導入できる利点がある。
ただし、多くのツールは「ローコード開発プラットフォーム」(LCDP:Low-Code Development Platform)として開発環境と実行環境が統合されており、特定の製品やメーカーへ依存したシステム構造(ベンダーロックイン)となる。利用可能な機能や連携可能な外部システムなどにも制約があり、コードを記述せず複雑な機能を作り込むことも難しい。
また、コード記述が不要と言っても適切なデータ構造や処理パターンの設計などには一定のスキルやノウハウが必要なほか、全社的なデータ基盤やシステム基盤、共通システムの整備などが行われないまま部署単位で独自にローコードを進めると、却って全体最適や効率化が阻害される危険(サイロ化/シャドーIT化)もある。
ほぼ同様の手法で、まったくコードを書かずにソフトウェア開発を完結させられる手法を「ノーコード開発」(no code development)という。ローコードよりも敷居が低く、迅速に開発を進められるが、実現できる機能の幅はより狭くなる。
ノーコード開発
ソフトウェア開発の手法の一つで、特殊なツールを用いることで、プログラミング言語によるコードを一切書かずに開発を進めること。
一般的なソフトウェア開発では、仕様や設計を元にプログラミング言語を用いてソースコードを記述するコーディング過程が多くの時間と工数を占め、コードの記述によってソフトウェアの振る舞いのほとんどが決定される。
ノーコードでは、図形や画像などのグラフィックによる表示・操作を行うGUI(Graphical User Interface)ツールを使い、画面上でシンボルを配置したり繋ぎ合わせたりしてプログラムの挙動を決めていく。表示画面の設計も実際に画面に表示要素を配置してデザインする。
ノーコードはプログラミングなどに習熟していない従業員などでも行うことが可能で、設計工程やテスト工程の一部も統合できるため、業務現場のニーズに即して迅速に低コストで特定目的・用途のソフトウェアを開発・導入できる利点がある。
ただし、多くのツールは「ノーコード開発プラットフォーム」(NCDP:No-Code Development Platform)として開発環境と実行環境が統合されており、特定の製品やメーカーへ依存したシステム構造(ベンダーロックイン)となる。原則としてツール側に用意された機能を組み合わせてソフトウェアを構成するため、用意されていない機能を追加したり細かな挙動を作り込むことは難しい。
また、コード記述が不要と言っても適切なデータ構造や処理パターンの設計などには一定のスキルやノウハウが必要なほか、全社的なデータ基盤やシステム基盤、共通システムの整備などが行われないまま部署単位で独自にローコード開発を進めると、却って全体最適や効率化が阻害される危険(サイロ化/シャドーIT化)もある。
ローコード開発との違い
ほぼ同様の手法で、ソフトウェア開発の大半をツールの操作によって済ませることができるが、一部にプログラムコードの記述を加えることができる(あるいはコード記述が必要となる)手法を「ローコード開発」(low-code development)という。ノーコードよりも実現できる機能の幅が広がるが、基礎的なプログラミング技能が要求される。
マークアップ言語 ⭐
文書の本文中に構造や見栄えなどを指定するデータを埋め込む形で記述することができる人工言語。テキストデータにタグを埋め込むHTMLやXMLがよく知られているが、バイナリデータに埋め込む言語など様々な種類がある。
ソフトウェアにとって単純なテキストデータは文字が端から端まで一列に並んだデータに過ぎないが、マークアップ言語を用いることで、見出しや段落を設けたり、文字色などの見栄えを指定する制御情報を埋め込むことができ、構造的な文書データとすることができる。
データ中に特定の記法で埋め込まれた制御データを「マークアップ」(markup)という。テキストエディタなどを用いて人間が表示・編集することができ、専用のソフトウェアを用いて整形済みの状態を表示したり、その状態のまま編集できるもの(WYSIWYGエディタ)もある。
HTMLやTeX、Markdown、Wiki記法のように文書を構成するためのマークアップ言語が有名だが、画像データやソフトウェアの設定ファイルなどへの応用例もある。また、SGMLやXMLのように、特定の対象や用途に特化したマークアップ言語を作り出すための汎用の言語もあり、ベクター画像を記述するSVGのように、XMLから派生した特定用途のマークアップ言語は数多く存在する。
言語によって構文や記法、指定できる内容などは異なっている。例えば、文書中に見出しを設定するには、HTMLでは「<h1>見出し</h1>」のように、TeXでは「\section{見出し}」、MarkDownやWiki記法では「# 見出し」のように記述する。HTMLやXMLで用いられる、「<」と「>」で囲まれた標識を「タグ」(tag)という。
HTML 【HyperText Markup Language】 ⭐⭐⭐
Webページを記述するためのマークアップ言語。文書の論理構造や表示の仕方などを記述することができる。Webブラウザは標準でHTML文書の解釈・表示が行える。
HTMLでは、文書の一部を“<”と“>”で挟まれた「タグ」と呼ばれる特別な文字列で囲うことにより、文章の構造や修飾についての情報を文書に埋め込んで記述することができる。例えば、HTMLファイル中で <br> と書かれた場所はブラウザなどにおける表示では改行が行われ、<h1>HTMLの概要</h1> のように括られた箇所は大見出しとみなされ(通常の設定では)上下の要素から少し離れた独立した行に大きくて太い文字で表示される。
様々な機能や意味を持つタグが定義されており、文章の中で表題や見出し、段落の区切りを指定したり、箇条書きの項目を列挙したり、縦横に項目が並んだ表を定義したり、文書の一部として画像や音声、動画を埋め込んだり、他の文書へのハイパーリンクを設定したりすることができる。
HTML文書の構造
典型的な構造のHTMLは冒頭にHTMLのバージョンなどを示すDOCTYPE宣言があり、以下ページ全体がhtml要素(htmlタグで括られた領域)となる。
html要素内にはhead要素とbody要素に分かれ、head要素には文書についての情報が記述される。ページタイトルや言語、文字コード、他の文書との繋がり、読み込むスタイルファイルやスクリプトファイルなどを指定する。body要素が表示されるページの本体で、具体的な内容が記述される。
他の言語の混在
他の言語による記述をHTML要素として文書中に記述することができる。例えば、CSS(カスケーディングスタイルシート)による要素の見栄えの記述を文書中にまとめて記したい場合は<style>と</style>で括られた領域に記述することができる。
また、<script>と</script>で囲った領域にはJavaScriptという簡易なプログラミング言語を用いてスクリプトを記述することができ、ページがブラウザなどに表示された後に実行される。
これら別の言語による記述はHTMLタグ中の属性(style属性やonclick属性)の値として記述することもできる。
歴史
HTMLは元々SGML(Standard Generalized Markup Language)の簡易版として生まれ、最初の標準規格は1993年にIETFによって発行された。1994年にW3Cが設立され、以降の改訂はW3Cが担当している。
当初は主に文章の論理構造を記述する言語だったが、Webの普及が進むにつれて要素の見栄えに関する仕様がブラウザメーカー主導で相次いで追加されていった。その後、表示の仕方を記述する専用のスタイル言語としてCSS(Cascading Style Sheet)が考案され、文書の論理的な構造の記述をHTMLに、見栄えの記述をCSSに分離すべきとされるようになった。
2000年前後には汎用的なマークアップ言語であるXML(Extensible Markup Language)に準拠するよう一部の仕様を改めたXHTMLへの移行が企図されたが普及せず、以後も独立した規格として維持されている。
XML 【Extensible Markup Language】 ⭐⭐
文書やデータの意味や構造を記述するためのマークアップ言語の一つ。汎用性、拡張性が高く、用途に応じて独自のマークアップ言語を定義することができる。
マークアップ言語とは「タグ」(tag)と呼ばれる特定の記法の文字列で地の文に情報の意味や構造、装飾などを埋め込んでいく人工言語のことで、XMLは利用者が独自のタグを定義できることから、マークアップ言語を作成するためのメタ言語とも言われる。
XMLの表記法
XMLにおけるタグはHTMLやSGMLなどと同じように「<」(小なり記号)と「>」(大なり記号)に囲まれた文字列で、「<」に続く先頭部分が要素名(タグ名)を表し、続いてスペース区切りで属性が「 属性名="値"」という形式で列挙される。
タグには「<要素名>」という形式の開始タグと「</要素名>」という形式の終了タグがあり、両者に挟まれた領域が要素の内容(タグによる指定の有効範囲)となる。内容を含まず単体で完結したタグもあり、「<要素名 属性群 />」のようにタグの末尾を「/」とする。
用途と関連規格
XMLにより統一的な記法を用いながら独自の意味や構造を持ったマークアップ言語を作成することができるため、ソフトウェア間の通信・情報交換に用いるデータ形式や、様々な種類のデータを保存するためのファイルフォーマットなどの定義に使われている。
XMLを応用して特定の種類やデータや用途のために定義された標準的なマークアップ言語もある。ベクター画像を記述するための「SVG」(Scalable Vector Graphics)、数式を記述するための「MathML」、Webページを記述するHTMLをXMLの仕様を満たす形式に改めた「XHTML」、各種のオフィスソフトの文書を記述するための「Office Open XML」および「ODF」(OpenDocument Format)などである。
また、XMLを様々な場面で利用しやすいよう、関連技術の規格も数多く存在する。文書を表示する際の書式や装飾などを指定する「XSL」(Extensible Stylesheet Language」や「XSLT」(XSL Transformations)、ハイパーリンク機能を実現する「XLink」や「XPointer」、XMLベースの言語の仕様を記述するためのスキーマ言語である「XML Schema」や「RELAX」、XMLをプログラムで利用するためのAPIである「DOM」(Document Object Model)や「SAX」(Simple API for XML)などである。
タグ
荷札、付箋といった意味の英単語。ITの分野では、特殊な記法により文書内に記述され情報の意味付けなどを行う文字列のことや、文書や情報の分類に用いられる単語や短いフレーズなどのことを指すことが多い。「ICタグ」のように原義の通り物に取り付ける小さな札を指す場合もある。
マークアップ言語のタグ
Webページなどの記述に使われるHTMLやXMLなどのマークアップ言語では、元になる文書に「<」と「>」で囲まれた標識を埋め込むことにより、表示ソフトに対して文書構造や書式、文字飾りなどを指示したり、画像や他の文書へのリンクを埋め込むことができるようになっている。
このように、地の文とは別の主体や階層によって解釈され(文章を読むのは人間だがタグを表示に反映するのはソフトウェア)、付加情報を埋め込む特殊な文字列などのことをタグと言う。
タグによる情報の分類
ソフトウェアやネットサービスで情報を分類・整理する際に、その属性や特徴を表す単語や短いフレーズをタグという。利用者が考えた様々なタグを対象に対応付けて分類していく手法をタギング(tagging/タグ付け)という。
単語を書いた付箋をたくさん貼り付けるようなイメージの分類法で、共通点の乏しい多様な対象が集まっていて階層構造などで整理・分類するのが難しい場合や、様々な側面から情報を検索・抽出したい場合などに用いられる。
例えば、ある歌手の歌唱した音声を保存したファイルに対して、曲名、収録媒体、歌唱者、作曲者、作詞者、発表年などをタグ付けしておけば、大量のファイルがあってもこれらの情報に基いて検索や分類、共通の属性を持つファイルの抽出・一覧などを容易に行なうことができる。
SGML 【Standard Generalized Markup Language】
文書の構造やデータの意味などを記述するマークアップ言語を定義することができるメタ言語の一つ。現代ではほとんど使われていないが、Webページを記述するHTMLを生み出す元になった言語としてよく知られる。
文書を文字(テキスト)形式で記述し、本文中に「<」と「>」で囲まれた「タグ」(tag)と呼ばれる文字列を埋め込むことで文書の構造やデータの意味などを記述する。このような本文中に制御データを埋め込む記述方式を「マークアップ」(markup)という。
例えば、文書中に「SGML入門 1500円」と書かれているだけでは、コンピュータはそれが何の情報か、要素間にどういう関係があるのか判断できないが、「<item type="book"><title>SGML入門</title><price>1500円</price></item>」のようにマークアップしてあれば、これらが書名と価格であると判断して処理に反映させることができる。
メタ言語としてのSGML
タグにどのような種類があり、それぞれどんな属性を持つのかなどといった仕様は「DTD」(Document Type Definition:文書型定義)というテキスト形式のデータで記述する。DTDは「スキーマ言語」というSGML自体とは別の記法・構造を持つ専用の言語で記述する。
DTDが違えばタグの種類も違うため、DTDが異なる文書は同じSGMLで記述されていても別のマークアップ言語で記述された文書のようになる。つまり、SGMLはそれ自体が特定の目的や文書形式のためのマークアップ言語なわけではなく、特定用途のマークアップ言語を定義することができる「メタ言語」(言語のための言語)であると言える。
構造と見栄えの分離
文書の表示の仕方は「スタイルシート言語」と呼ばれる言語で文書本体とは別に定義することで、文書の構造の記述と見栄えの記述を分離している。標準規格として「DSSSL」(Document Style Semantics and Specification Language)という言語が定められている。
出力先によってスタイルシートを切り替えることで、同じ文書でもそれぞれに適した見栄えに整形することができる。例えば、ソフトウェアで画面上に表示する場合と、ページ単位で区切って印刷する場合に、文書本体を編集しなくてもそれぞれ読みやすい見た目に整形できる。この仕組みを応用して、元になるSGMLデータからWebページやPDF文書など別の形式に変換するシステムも提供されている。
歴史
1979年、特定のソフトウェアやデータ形式に依存せずに文書の電子化やコンピュータ上での管理を行うために、米IBM社が原型となる「GML」(Generalized Markup Language)を考案した。これを元に、1986年に国際標準化機構(ISO)が「SGML」の名称でISO 8879として仕様を標準化した。
初期にはIBM社の社内文書の電子管理や、米軍で航空機マニュアルの電子化を行う際の標準データ形式として採用された。その後、大量の文書の作成・管理に悩む各国の軍や公的機関、研究機関、防衛産業、航空機産業、製薬産業などが文書管理の電子化を進めるために導入した。
Webページを記述するマークアップ言語である「HTML」(Hypertext Markup Language)は、当初はSGMLで定義されたマークアップ言語の一つだった。後に、SGMLの複雑で巨大な仕様を簡略化し、処理の困難な部分を改善したメタ言語として「XML」(Extensible Markup Language)が考案され、現在ではSGMLが構想していた用途にはXMLを用いるのが一般的となっている。
JSON 【JavaScript Object Notation】
JavaScriptにおけるオブジェクトの表記法を応用したテキスト(文字)ベースのデータ形式。多数の要素が複雑な構造で組み合わせられたデータを簡潔な表記で書き表すことができる。JavaScriptプログラム上ではコードとして実行するだけで読み込みが完了する。
JavaScriptではオブジェクト定義の構文として、キーと値のペアを列挙したデータ構造を用いる。これは他のプログラミング言語では連想配列、ハッシュ、マップ、辞書(ディクショナリ)などと呼ばれるものに近い。
JSONでは、これと配列を利用して複合的なデータ構造を記述することができる。配列やオブジェクトの値として別の配列やオブジェクトを入れ子の形で記述でき、深い階層構造を持つ複雑なデータを表すことができる。
値として利用できるデータ型はJavaScriptに用意されているプリミティブデータ型で、整数型、浮動小数点数型、文字列型、ブール型(真偽値)、null(値無し)、配列、オブジェクトである。
配列は [“A”,“B”,“C”] のように全体を角括弧で囲み、値をカンマ区切りで列挙していく。オブジェクトは { Key1:“Value1”, Key2:“Value2”} のように全体を中括弧で囲み、キーと値をコロン(:)で区切って表記したペアをカンマ区切りで列挙していく。
JSONはJavaScriptでの扱いが簡単なため、WebサービスやAjaxなどでプログラム間でのデータ交換フォーマットとして多用されている。また、数多くのプログラミング言語でJSONを簡単扱えるようにする追加機能などが公開されており、設定ファイルやデータ交換などでXMLに代わって普及している。
歴史
JSONはもともとJavaScriptの構文規則の一部だが、2001年にダグラス・クロックフォード(Douglas Crockford)氏がこれをデータ形式のように扱うことできることを「発見」し、これをJSONと命名した。
2006年には独立したデータ形式としてIETFがRFC 4627として規格化した。JavaScriptの標準化を行っていたEcma Internationalが2011年にECMAScript 5.1の一部として標準化、2013年にはECMA-404として独立した規格が発行された。両団体間で一部の仕様が異なる問題があったため、2017年にRFC 8259およびECMA-404の改訂版として仕様が統一された。