高校「情報Ⅰ」単語帳 - 日本文教「情報Ⅰ 図説と実習」 - アルゴリズムとプログラミング

プログラム ⭐⭐⭐

予定(表)、計画(表)、課程、式次第などの意味を持つ英単語。ITの分野では、コンピュータに行わせる処理を記述したコンピュータプログラムのことを略して単にプログラムということが多い。

コンピュータプログラム (computer program)

コンピュータが行うべき処理を順序立てて記述したもの。広義の「ソフトウェア」の一部であるが、実用上はプログラムとソフトウェアはほとんど同義のように扱われることが多い。

現代のコンピュータではプログラムは一定の形式に従ってデータとして表現され、記憶装置(メインメモリ)に格納される。実行時にはCPU(中央処理装置)がプログラムに記述された命令を順番に読み出して解釈・実行していく。

プログラムを作成する作業や工程を「プログラミング」(programming)、これを行う人や職種のことを「プログラマ」(programmer)という。人間がプログラムを記述する際には、人間が理解しやすい人工言語である「プログラミング言語」(programming language)を使うことが多い。プログラミング言語で記述されたプログラムを「ソースコード」(source code)という。

ソースコードはコンピュータが解釈・実行することができないため、コンパイラなどの変換ソフトによってコンピュータが解釈・実行できる機械語(マシン語)などで構成された「オブジェクトコード」(object code)に変換されてから実行される。スクリプト言語のように、この変換処理を開発時には行わず、実行時にインタプリタなどのソフトウェアによって動的に行う場合もある。

ソースコード 【ソースプログラム】 ⭐⭐

プログラミング言語などの人間が理解・記述しやすい言語やデータ形式を用いて書き記されたコンピュータプログラムのこと。プログラムに限らず、人工言語や一定の規約・形式に基いて記述された複雑なデータ構造の定義・宣言などのこともソースコードと呼ぶ場合がある。

コンピュータへの指示や一連の処理手順などをプログラミング言語によって文字データの羅列として表記したもので、そのままではコンピュータ(のCPU)では実行できないため、CPUが直に解釈できる命令コードの体系である機械語(マシン語)によるプログラムに変換されて実行される。

変換後の機械語による実行可能プログラムを「オブジェクトコード」(object code)、「オブジェクトプログラム」(object program)、「ネイティブコード」(native code)、「ネイティブプログラム」(native program)、「バイナリコード」(binary code)などと呼ぶ。

実行可能形式への変換

ソースコードからオブジェクトコードへの変換はソフトウェアによって自動的に行うのが一般的となっている。アセンブリ言語で記述されたソースコードを変換することを「アセンブル」(assemble)、そのようなソフトウェアを「アセンブラ」(assembler)という。

アセンブリ言語以外の高水準言語で記述されたソースコードを一括して変換することは「コンパイル」(compile)と言い、そのようなソフトウェアを「コンパイラ」(compiler)という。実行時に少しずつ変換しながら並行して実行するソフトウェアもあり、「インタプリタ」(interpreter)と呼ばれる。

開発時にソースコードから直接オブジェクトコードへ変換せずに、特定の機種やオペレーティングシステム(OS)の仕様・実装に依存しない機械語風の独自言語による表現(中間コード)に変換して配布し、実行時に中間コードからCPU固有の機械語に変換するという二段階の変換方式を用いる言語や処理系もある。

ソースコードの作成

ソースコードは多くの場合、人間がキーボードなどを操作して文字を入力して記述する。この作業・工程を「コーディング」(coding)という。ソースコードはテキストデータの一種であるため文書編集ソフトで作成することはできず、テキストエディタや統合開発環境(IDE)に付属する専用のコードエディタなどを用いることが多い。

必ずしも人間が記述するとは限らず、何らかの元になるデータや入力からソフトウェアによって生成したり、別の言語で記述されたソースコードを変換して生成したり、オブジェクトコードを逆変換してソースコードに戻したりといった方法で、ソフトウェアが自動的・機械的に作成する場合もある。

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

日本を含む多くの国でソースコードは著作物の一種として著作権で保護されている。販売される商用ソフトウェア製品の多くは、ソースコードを企業秘密として非公開とし、人間に可読でない中間コードやオブジェクトコードによる実行プログラムのみを利用者に提供している。

一方、ソースコードを公開し、誰でも自由に入手、利用、改変、再配布、販売などができるようにしている場合もある。そのようなソフトウェアを、ソースコードがオープンになっているという意味で「オープンソースソフトウェア」(OSS:Open Source Software)という。ボランティアのプログラマが個人あるいは共同で開発しているソフトウェアに多いが、企業がOSSを開発・公開している例も多く見られる。

フローチャート 【流れ図】 ⭐⭐⭐

工程や手順の流れを図示する手法の一つで、個々の段階を箱で表し、それらを順序や論理の推移に従って矢印や線分で結んだもの。

ITの分野では、コンピュータプログラムの設計やアルゴリズム(計算手順)の理解などのために、内部で行われる処理や演算の詳細な流れをフローチャートに表すことが多い。プログラムに限らず、業務手順など様々な過程や手順の図示に応用できる。

一つのフローチャートには開始と終了があり、その間に一つ以上の工程が含まれる。流れは分岐や繰り返しによって複数に枝分かれしたり戻ったりすることがあるが、途中どのような経路を通っても必ず一つの開始から始まって一つの終了で終わる。

フローチャートで用いる部品の種類や図記号の形状はJIS X 0121で規格化されており、一般的にはこれを用いることが多い。主な部品として、開始や終了を表す「端子」(円・楕円・角丸長方形)、「処理」(長方形)、プログラムにおけるサブルーチンや関数などの「定義済み処理」(左右が二重線の長方形)、「入出力」(平行四辺形)、条件分岐などの「判断」(菱形)、繰り返しの範囲を示す「ループ端」(開始は上側、終了は下側の角が欠けた長方形)、他の図との出入り口を示す「結合子」(小さな丸)、処理の流れを示す「線」(右や下へは線分・左や上には矢印)などがある。

ループ

輪(状のもの)、環(状のもの)、仲間内、閉回路、などの意味を持つ英単語。ITの分野では、環状あるいは循環構造になっているものや、繰り返しのことを意味する。

通信経路のループ

ネットワークの分野では、通信ケーブルの配線や転送経路が循環構造になっている状態をループという。ループに迷い込んだ信号やデータは永久にその中をぐるぐる回り続け、回線資源を消費し尽くしてしまうため、障害の原因となる。

プログラムのループ

コンピュータプログラムの中で、プログラム中の特定の箇所を繰り返し実行することや、そのような制御構造やプログラムコードをループという。

多くのプログラミング言語にはループを制御するための命令や構文が用意されており、開発者が指定した繰り返し回数や終了条件などに基づいて処理が繰り返される。利用する制御文の違いにより「forループ」「whileループ」などと呼ばれる。

一回処理を行うごとに、ループ先頭に戻って再度繰り返すかループを終了するか判定するようになっている場合が多く、このような判定を処理の手前で行うことを「前判定ループ」、処理の後に行うことを「後判定ループ」という。このような判定がなく、永久に繰り返すように指定されたループのことを「無限ループ」という。

ループの先頭や終端以外の部分でループの制御ができる命令などが用意されている場合もある。C言語などではbreak文でループを強制終了、continue文でその回のループ終端までの処理をスキップできる。コード中の任意の位置に実行を移すgoto文が用意されている言語では、これを使ってループ中からループ外へ強制的に脱出できる場合もある。

アクティビティ図 【活動図】 ⭐⭐⭐

ソフトウェアの設計などに用いられるUML(Unified Modeling Language)で規定された図(ダイアグラム)の一つで、業務や処理の実行手順を表したもの。

アクティビティ図ではそれ以上分割できない最小の動作単位を「アクション」(action)と呼び、角丸四角形で図示する。アクションを組み合わせたひとまとまりの動作を「アクティビティ」(activity)と呼ぶ。

活動の開始ノード(黒丸で示される)から終了ノード(丸で囲った黒丸で示される)までの間にアクションやアクティビティを配置し、それぞれの依存関係に従って矢印で結んでいく。

次のアクションへ情報などが受け渡される場合には、中間に四角形で示す。矢印で結ばれた手順の流れを「フロー」(flow)という。異常終了などでフローが途中で終了する場合には、終了地点に丸囲みの×印を記す。

アクティビティ図全体を縦または横(あるいはその両方)に分割して実行主体や段階を示すことができる。アクションやアクティビティが分割されたどの領域に存在するかによって、どの主体による動作かを示したり、どのような段階に行われる動作かを示すことができる。

フローの分岐・合流

特定の条件に従ってフローが分岐する場合には、菱形の「デシジョン」(decision:判断)ノードを置いて2方向に矢印を記し、それぞれの脇に条件を記述する。フローが合流する地点には同じ菱形の「マージ」(merge:合流)ノードを置く。

ある時点から複数のフローを並列に実行する場合には、その開始地点に太い直線で示される「フォーク」(fork:分岐)ノードを置き、複数のフローを出発させる。これらの同期を取って一つのフローに戻したい場合には、同じく太い直線の「ジョイン」(join:結合)ノードを置き、フローを集合させる。

プログラミング言語 ⭐⭐⭐

主に人間がコンピュータプログラムを記述、編集するために用いる人工言語。作成したプログラムは機械語による記述に変換した後、コンピュータで実行できるようになる。

プログラミング言語でプログラムを開発することを「プログラミング」(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)などの分類がある。

機械語 【マシン語】 ⭐⭐

コンピュータのマイクロプロセッサ(CPU/MPU)が直接解釈・実行できる命令コードの体系。0と1を並べたビット列として表され、人間が直に読み書きしやすい形式ではない。

プロセッサは設計段階でどのような命令番号(オペコード)が与えられたらどのように動作するかが決められている。機械語のプログラムは基本的に命令番号を実行順に並べたデータとなっており、個々の命令には必要に応じて処理すべき対象となるデータ(オペランド)などを付記する。

機械語はプロセッサに直接命令を与える言語であるため、プロセッサの持つすべての機能を利用することができる。どのようなプログラミング言語で記述されたプログラムであっても、ソフトウェアによる変換や調整を経て最終的には機械語のプログラムとしてプロセッサに渡され実行される。

ニーモニックとアセンブリ言語

人間が命令番号そのものを暗記して直にプログラムを記述するのは容易ではないため、各番号に意味を類推しやすいアルファベットの並び(ニーモニック)を一対一に対応付け、これを用いてプログラムを記述する手法が用いられる。このようにして作られたプログラミング言語をアセンブリ言語(assembly language)という。

アセンブリ言語によるプログラミングはハードウェアを直に制御でき、短く高速なプログラムを記述することができるが、大規模で複雑なプログラムや大人数での分業などには向いていない。OSやデバイスドライバなどハードウェアを直接的に制御する必要のあるプログラムや、極めてシビアに実行速度が求められる場面などで部分的に用いられることが多い。

命令セットとプログラムの互換性

命令番号と動作の対応関係、および各命令に付随するオペランドの形式などを定めた体系は命令セットアーキテクチャ(ISA:Instruction Set Architecture)あるいは単に命令セットと呼ばれ、同じ命令セットを持つプロセッサ間では互いに同じ機械語プログラムをそのまま実行することができる。

一般に、同じメーカーの同じ製品シリーズのプロセッサ製品間は同じ命令セットを共有し、新しい製品に新たな命令が追加されるようになっており、異なるモデルや世代の製品間でも同じ機械語プログラムを動作させることができる。異なるメーカーが同じ命令セットを実装した製品を開発する場合もあり、互換プロセッサなどと呼ばれる。

命令セットが異なるプロセッサ間では同じ機械語プログラムは動かないため、プログラムのソースコードからコンパイルなどの処理を行ってそのプロセッサの命令セットによって記述された機械語プログラムを生成する必要がある。

スクラッチ開発

製品を開発する際に、すでに存在する何かを土台とせずにゼロから新たに作り上げること。

情報システム開発などでは、パッケージ製品のカスタマイズや機能追加、現在使用中のシステムの改修などによらず、全体を新たに開発する(あるいは、開発し直す)ことを指してScratchということが多い。

ソフトウェア開発やWebサイト制作では、元になるソースコードや雛形(テンプレート)などを使用せず、何も無い状態からコードを記述していくことをScratchという。他から流用する要素が一切無い場合を特に「フルスクラッチ」(totally from scratch)ということがある。

既存製品を流用する場合に比べ費用や期間はかかるが、パッケージの制約や過去のしがらみなどに縛られることが少なく、独自機能を組み込んで他社と差別化するといった施策も行いやすい。流用部分がブラックボックス化することがなく、改良や修正、機能追加の自由度も高い。

構造化プログラミング 【構造化手法】

コンピュータプログラムの開発や理解、修正を円滑に行えるよう、プログラムを整理された少数の定型的な構造の組み合わせによって記述すること。

一般的には「順接、反復、分岐の三つの制御構造のみを組み合わせて処理の流れを記述すること」と説明されることが多いが、これは本来の定義とは異なる誤解が広まったものだとも指摘される(後段で詳述)。

今日一般的に言われる構造化プログラミングとは、プログラム中のコードの実行順の制御を、記述した順番に実行する「順接」あるいは「順次」(sequence)、指定された条件が成り立つ間繰り返す「反復」あるいは「繰り返し」(iteration)、指定された条件を満たすか否かによって枝分かれする「分岐」あるいは「選択」(selection)の三つのみを組み合わせて記述することとされる。

特に、実行順の制御をこの三つに限定することにより、かつてのプログラミングで多用されていた、指定した任意の位置に無条件に移動する “goto” 文を排除し、処理の流れがあちこちへ飛んで見通しが悪くなるのを防ぐことが重要であると説明される。

構造化定理とその解釈

この原則は1966年にイタリアのコンピュータ科学者コラド・ベーム(Corrado Böhm)とジュゼッペ・ヤコピーニ(Giuseppe Jacopini)が証明した「構造化定理」(Structure theorem)あるいは「構造化プログラム定理」(Structured program theorem)によって基礎付けられているとされる。

確かにこの定理はすべてのアルゴリズムが順接、反復、分岐の三つの組み合わせで記述できることを示してはいるが、計算科学における理論上の可能性を述べており、これによって見通しの良いプログラムを開発できるといった趣旨の主張は含まれていない。

実際、高名なコンピュータ科学者のドナルド・クヌース(Donald Knuth)は、プログラムからgoto文を除去してこの三つの組み合わせに置き換えることにより却って構造が失われる例を示し、構造化定理のこのような解釈を批判している。

ダイクストラの構造化プログラミング

「構造化プログラミング」(structured programming)の語が最初に提唱されたのは1969年にオランダのコンピュータ科学者エドガー・ダイクストラ(Edsger W. Dijkstra)が発表した論文で、本来はこちらが構造化プログラミングの定義であるとされる。

彼の主要な問題意識は、プログラムの規模が大きくなっても正しさを容易に検証できるような「良く構造化されたプログラム」(well-structured program)を記述する方法論で、そのためのいくつかの考察と原則を構造化プログラミングという概念でまとめた。

これには、現代では関数やサブルーチンなどとして知られる、プログラムの「段階的な抽象化」(step-wise abstraction)、現代のオブジェクト指向プログラミングに近い、「抽象的なデータ構造」(abstract data structures)とこれに関連付けられた「抽象的な構文」(abstract statements)の「共同詳細化」(joint refinement)が含まれる。

これらを適用したプログラムは上下に階層化された交換可能なモジュール(部品)を連結したような構造になると指摘し、これを真珠のネックレスの構造に例えて説明している。この論考には「構造化定理」も「三つの制御構文」も「goto文」も登場せず、構造化プログラミングの本来の概念とこれらとはあまり関係がない。

しかし、ダイクストラが別の機会に発表したgoto文の濫用に疑問を呈する論説(1968年の “Go To Statement Considered Harmful” )や、他の論者とのいわゆる「goto文論争」、また、「構造化定理」と「構造化プログラミング」の名称の類似性などを通じて、次第に「三つの制御構文」式の理解が広まっていったと考えられている。

オブジェクト指向プログラミング 【OOP】

コンピュータプログラムの構造、構成法の一つで、関連するデータの集合体と、それを操作する手続きを「オブジェクト」(object)と呼ばれるひとまとまりの単位として一体化し、オブジェクトの組み合わせとしてプログラムを記述する手法。

オブジェクト指向プログラミングではオブジェクトの定義と、オブジェクト間の関係、相互作用を記述することによりプログラムを構築していく。オブジェクトにはそれぞれ固有のデータ(属性/プロパティ)と手続き(メソッド)があり、外部からのメッセージを受けてメソッドを実行し、データを操作する。オブジェクトに付随するデータの操作は原則としてすべてオブジェクト中のメソッドによって行われる。

オブジェクトは外部に公開されたメソッドにより機能を提供する。内部の状態を表す変数なども、外部からの参照・操作が必要なものだけが専用の手続きによってアクセス可能となり、それ以外は外から見えない存在となる。

このように、関連するデータと手続きを一つの単位にまとめることを「カプセル化」(encapsulation)、外部に対して必要な情報や手続きのみを提供することを「情報隠蔽」(information hiding)という。外から直に参照や操作をする必要のない内部の状態や構造は秘匿される。

主流のクラスベースのオブジェクト指向プログラミングでは、オブジェクトの雛形を「クラス」(class)として記述し、これをプログラムの実行時に「インスタンス」(instance)として実体化し、データの保存や操作を行う。

あるクラスを元に一部の振る舞いを改変したり新しい機能を追加した別のクラスを作成する「継承」(inheritance)を活用することで、ライブラリや既存のプログラムから必要な機能を流用し、足りない部分だけ新たに記述するといったスタイルで開発を進めることができる。

派生したクラスでは既存のメソッドの振る舞いを必要に応じて改変することができ、外部から同じメソッドを呼び出した際に各オブジェクトがそれぞれ自らに適したコードを実行してくれる。このような性質を「ポリモーフィズム」(polymorphism/多態性)という。

オブジェクト指向によるソフトウェア開発は、異なるプログラムを組み合わせたり、後で部分的に再利用したりするのが容易になるという特徴があり、現代では多くのプログラミング言語にオブジェクト指向的な記述を可能にする仕様が取り入れられている。オブジェクト指向を主要な言語仕様としているものは特に「オブジェクト指向プログラミング言語」(オブジェクト指向言語)と呼ばれることもある。

コンパイラ

人間に分かりやすく複雑な機能や構文を持つ高水準プログラミング言語(高級言語)で書かれたコンピュータプログラムを、コンピュータが解釈・実行できる形式に一括して変換するソフトウェア。“compiler” の原義は「翻訳者」。

コンパイラは、プログラミング言語で書かれた「ソースコード」(source code)を読み込んで解析し、コンピュータが直に実行可能な機械語や、それに相当する中間言語などで記述された「オブジェクトコード」(object code)に変換する。この変換工程のことを「コンパイル」(comple)という。

コンパイラが生成したオブジェクトコードはそのままでは実行可能でない場合が多く、リンカなど別のソフトウェアを用いて、起動に必要なコードを追加したり、必要なライブラリなどを結合(リンク)したりして実行可能形式のプログラムとする。コンパイルを含む一連の工程を「ビルド」(build)という。

一方、ソースコードを読み込みながら、逐次的に実行可能コードを生成して実行するソフトウェアを「インタプリタ」(interpreter:「通訳者」の意)という。コンパイルやリンクなどのビルド工程を経ずにソースコードをいきなり実行できるため、スクリプト言語の実行環境としてよく用いられる。

様々なコンパイラ

Javaや.NET言語など、CPUやオペレーティングシステム(OS)の種類に依存しない中間形式でプログラムを配布する言語では、実行時に実行環境固有のコード形式(ネイティブコード)に変換するコンパイラを「JITコンパイラ」(Just-In-Time compiler)あるいは「実行時コンパイラ」という。この方式では、開発時にソースコードから中間形式へ、実行時に中間形式からネイティブコードへ、2段階のコンパイルを行う。

デジタル家電などの組み込みソフトウェアの開発など、開発環境と実行環境が異なる場合、開発環境上で別の環境向けのオブジェクトコードを生成する「クロスコンパイラ」(cross compiler)という。実行プログラムは対象環境に送ってテストや実行を行う。

コンパイラとは逆に、コンパイル済みのオブジェクトコードを解析して元のソースコードに逆変換するソフトウェアを「デコンパイラ」(decompiler)あるいは「逆コンパイラ」という。高水準言語ではソースコードとオブジェクトコードの各要素は一対一に対応しないため、完全な復元は難しい。特に、変数名などのシンボルはコンパイル時に失われるため、オブジェクトコードから取り出すことはできない。

インタプリタ

人間に分かりやすい高水準プログラミング言語(高級言語)で書かれたコンピュータプログラムを、コンピュータが解釈・実行できる形式に変換しながら同時に少しずつ実行していくソフトウェア。英語の原義は「通訳者」。

人間などがプログラミング言語で記述したソースコードを処理の流れの順に少しずつ読み込んでいき、内容を解析して実行可能なプログラムに変換し、即座に実行する。変換と実行を逐次的に繰り返し行い、処理を進めていく。

コンパイラなどで一括して変換してから実行する方式に比べ、ソースコードを即座に実行開始できるため開発や修正をテンポよく進めることができるが、変換にかかるオーバーヘッドの分だけ実行速度やメモリ使用量では劣る。

また、インタプリタによる実行を前提とする場合はプログラムの配布をソースコードで行うことになるが、環境ごとに変換済みのバイナリコードを用意しなくてよく、インタプリタさえ用意されていれば様々な環境で動作させられる反面、利用者にソースコードを必ず開示しなければならない点が嫌がられることもある(商用ソフトウェアなどの場合)。

いわゆるスクリプト言語や軽量言語(LL)と呼ばれる言語は標準の処理系としてインタプリタが用意されており、すぐに実行できるようになっている。

ライブラリ

図書館、図書室、資料室、書庫、書斎、蔵書、文庫、選書、双書などの意味を持つ英単語。ある分野の資料やデータなどを一定の形式で集めたものを、図書館になぞらえて比喩的にライブラリと呼ぶことがある。

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の権利について従来の状況が変化していく可能性がある。

変数 ⭐⭐⭐

コンピュータプログラムのソースコードなどで、データを一時的に記憶しておくための領域に固有の名前を付けたもの。プログラム上で値を代入したり参照することができる。

変数につけた名前を「変数名」と呼び、記憶されているデータをその変数の値という。データの入れ物のような存在で、プログラム中で複数のデータを扱いたいときや、同じデータを何度も参照したり計算によって変化させたい場合に利用する。

変数をプログラム中で利用するには、これからどんな変数を利用するかを宣言(declaration)し、値を代入(assignment)する必要がある。コード中で明示的に宣言しなくても変数を利用できる言語もある。変数に格納された値を利用したいときは、変数名を記述することにより値を参照(reference)することができる。

変数の型

プログラム中で扱うデータは整数、浮動小数点数、文字列など様々なデータ型に分かれており、変数も特定のデータ型を持つ。多くの言語では宣言時に一つのデータ型を指定しなければならず、後から型は変えられないが、特定の型を指定しなくても処理系が適切な型を適用(型推論)してくれる言語や、代入などによって途中で型を切り替えることができる言語もある。

変数のスコープ

変数は宣言した位置などにより通用する範囲(スコープ)が決まっており、範囲の外から参照や代入を行うことはできない。プログラム全体を通用範囲とするものを「グローバル変数」(大域変数)、特定のサブルーチンや関数、メソッド、コードブロックなどの中でのみ通用するものを「ローカル変数」(局所変数)という。オブジェクト指向言語では「クラス変数」や「インスタンス変数」などに分かれる。

代入

数学で文字を値や式で置き換えること。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 という場合は、変数名が記述された箇所を実際の値で置き換える操作などを表す。

順次構造 ⭐⭐⭐

コンピュータプログラムの命令実行の流れの一つで、プログラムに記述された順番通りに命令を実行していくもの。

コンピュータのCPUがプログラムを実行する際、特に指定がなければプログラムを先頭から読み込んで命令を並んでいる順に従って一つずつ実行していく。この最も基本的な命令実行の制御構造を、(他の構造と対比するため便宜的に)順次構造と呼ぶ。

一方、命令の中には命令実行の流れを変更するものもある。これを用いて、条件に従って別の実行位置に流れを分岐させる制御構造を「選択構造」あるいは「分岐構造」、条件が満たされる間だけ同じ個所を繰り返し実行する制御構造を「反復構造」あるいは「繰り返し構造」という。

選択構造 【分岐構造】 ⭐⭐⭐

コンピュータプログラムの命令実行の流れの一つで、実行時に評価する条件によって、次の命令を実行するか、指定されたメモリ上の位置に移行するか分岐するもの。

コンピュータのCPUがプログラムを実行する際、特に指定がなければ命令を先頭から順に実行するが、分岐命令が存在する場合、特定の条件が満たされたらメモリの指定番地に実行位置を変更(ジャンプ)し、以降はそこから順に命令を実行していく。

このような実行制御を「条件分岐」と呼び、プログラムに複雑な処理をさせたい場合は必須の機能となる。一方、条件が満たされる間だけ同じ個所を繰り返し実行する制御構造もあり、「反復構造」あるいは「繰り返し構造」という。

反復構造 【繰り返し構造】 ⭐⭐⭐

コンピュータプログラムの命令実行の流れの一つで、指定の条件が満たされている間、特定の個所を何度も繰り返し実行するもの。

コンピュータのCPUがプログラムを実行する際、特に指定がなければ命令を先頭から順に実行するが、反復構造になっている場合、指定の条件が満たされている間、指定範囲の末尾の命令を実行したら範囲の先頭に戻り、その範囲を繰り返し実行する。

同じ処理を様々な対象に次々に適用したい場合などに用いられ、プログラムに複雑な処理をさせたい場合には必須の機能となる。一方、特定の条件が満たされたらメモリの指定番地に実行位置を変更(ジャンプ)する制御構造もあり、「選択構造」あるいは「分岐構造」という。

関数 【ファンクション】 ⭐⭐⭐

コンピュータプログラム上で定義されるサブルーチンの一種で、数学の関数のように与えられた値(引数)を元に何らかの計算や処理を行い、結果を呼び出し元に返すもののこと。

プログラム上で関連する一連の命令群を一つのかたまりとしてまとめ、外部から呼び出せるようにしたサブルーチンやプロシージャ(手続き)の一種である。呼び出し時に引数(ひきすう/argument)と呼ばれる値を指定することができ、この値をもとに内部で処理を行って、結果を返り値(かえりち/return value)あるいは戻り値(もどりち)として呼び出し元に通知する。

プログラミング言語によって、返り値を持つものを関数(ファンクション)、処理を行うだけのものをサブルーチンやプロシージャとして区別する場合もある(Pascalなど)が、C言語やJavaScriptのようにすべてが関数で引数や返り値が省略可能になっている言語もある。

多くのプログラミング言語は開発者が自由に関数を定義してプログラム中で呼び出せる構文や記法を定めているほか、算術関数や文字列処理などよく使われる基本的な関数言語仕様や標準ライブラリなどの中であらかじめ実装済みとなっている(組み込み関数)。

関数といっても数学のように計算を行うものには限られず、「利用者に入力を促して入力値を返す」関数といったものもあり得る。途中で画面に何かを表示するなど、引数や返り値と直接関係ない処理を行ってもよい。

プログラムは内部に変数の値など実行状態を持つため、これを反映して同じ引数から異なる返り値が得られる場合もある。また、関数が行う処理によって状態が変化することもあり、これを関数の持つ「副作用」という。多くの算術関数のように副作用のない関数もある。

配列 【配列型】 ⭐⭐⭐

複数のデータを連続的に並べたデータ構造。各データをその配列の要素といい、非負整数などの添字(インデックス)で識別される。

配列はほとんどのプログラミング言語に存在する最も基本的なデータ構造の一つで、単純に変数を一列に並べたものである。データ全体はコード中で配列名で指し示され、各要素は通し番号などの添字で区別される。例えば、長さ5の整数型の配列変数xを宣言すると、x[0]からx[4]まで5つの整数型の変数が用意され、それぞれ独立に整数値を格納することができる。

各要素のデータ型が同じでなければならない言語と、要素ごとに異なる型のデータを格納できる言語がある。変数の宣言が必須の言語では、配列変数の宣言時に要素のデータ型と数をあらかじめ指定しなければならないことが多い。要素数を後から増減できる動的配列(可変長配列)が利用できる言語もある。

添字は0から始まる整数とする言語が多く、要素がn個の配列の添字は0からn-1までとなる。添字に文字列など整数以外のデータ型の値を取れるようにしたデータ構造を利用できる言語もあり、これを「連想配列」(associative array)と呼ぶ。言語によっては同様のデータ構造を辞書(ディクショナリ)、ハッシュ、マップ、連想リスト等と呼ぶこともある。

配列の要素として配列を格納した、入れ子状のデータ構造を「多次元配列」という。配列の要素が配列になっており、その要素が値になっている構造が「2次元配列」で、配列が3段階に入れ子状になっている構造は「3次元配列」である。同様に、入れ子がn段階になっている配列を一般に「n次元配列」という。要素が値になっている単純な配列をこれらと対比する場合は「1次元配列」と呼ぶことがある。

リスト ⭐⭐

一覧(表)、目録、羅列、一覧に載せる、一覧にする、などの意味を持つ英単語。一般的の外来語としては同じ種類の情報を羅列した一覧のことを指すことが多く、ITの分野でもこの用法が多い。

プログラミングの分野では、ソースコードのことを「プログラムリスト」「ソースリスト」などと呼び、これを略してリストということがある。

データ構造のリスト

基本的なデータ構造の一つで、複数のデータを順序を付けて格納することができる複合データ型(コンテナ/コレクション)をリストという。

中でも、各データが次のデータの所在を表す参照情報(リンク/ポインタ)を持っているものを「連結リスト」(linked list:リンクリスト/リンクトリスト)と呼び、これを略してリストという場合も多い。リストは他に動的配列などを用いても実装することができる。

連結リストの各要素はデータの他に自分の隣の要素を指し示す所在情報を持っている。これを辿ることで、各要素に順番にアクセスすることができる。各要素が自分の次(後)の要素への参照のみを持つ構造を「片方向リスト」「単方向リスト」と呼び、これに加えて自分の前の要素への参照をもつものを「双方向リスト」という。

また、先頭から末尾へ直線上に要素が連結されているものを「線形リスト」、先頭も末尾もなく要素が円環状に連結されているものを「循環リスト」という。

アルゴリズム ⭐⭐⭐

ある特定の問題を解く手順を、単純な計算や操作の組み合わせとして明確に定義したもの。数学の解法や計算手順なども含まれるが、ITの分野ではコンピュータにプログラムの形で与えて実行させることができるよう定式化された、処理手順の集合のことを指すことが多い。

曖昧さのない単純で明確な手順の組み合わせとして記述された一連の手続きで、必ず有限回の操作で終了し、解を求めるか、解が得られないことが示される。コンピュータで実行する場合は、基礎的な演算、値の比較、条件分岐、手順の繰り返しなどを指示する命令を組み合わせたプログラムとして実装される。

数値などの列を大きい順または小さい順に並べ替える「整列アルゴリズム」、たくさんのデータの中から目的のものを探し出す「探索アルゴリズム」、データが表す情報を損なわずにより短いデータに変換する「圧縮アルゴリズム」といった基本的なものから、画像の中に含まれる人間の顔を検出する、といった複雑なものまで様々な種類のアルゴリズムがある。

同じ問題を解くアルゴリズムが複数存在することもあり、必要な計算回数や記憶領域の大きさ、手順のシンプルさ、解の精度などがそれぞれに異なり、目的に応じて使い分けられる。例えば、ある同じ問題に対して、原理が単純で簡単にプログラムを記述できるが性能は低いアルゴリズム、計算手順が少なく高速に実行できるが膨大な記憶領域を必要とするアルゴリズム、厳密な解を求めるものより何桁も高速に近似解を求めることができるアルゴリズムなどがある。

線形探索 【リニアサーチ】 ⭐⭐

データ探索アルゴリズムの一つで、配列などに格納されたデータ列の先頭から末尾まで順番に、探しているデータと一致するか比較していく手法。

最も単純なアルゴリズムで、配列などに格納されたデータ列の中から、まず先頭の要素を探しているデータと比較する。一致しなければ2番目の要素と比較する。これを末尾の要素まで繰り返し、途中でデータを発見したらそこで探索を終了する。

N個のデータ列の中から線形探索する場合、最良のケースは先頭の要素と一致する場合で比較回数は1回、最悪のケースは末尾まで探してもデータが見つからなかった場合で比較はN回、平均の比較回数はN/2回となる。比較回数の平均値は要素数に正比例して増大する。

仕組みが単純なため短いプログラムコードで記述でき、コードを読んだ人が処理を理解しやすく、探索対象のデータ列以外に余分な記憶領域を消費せず、事前にデータ列のソート(大きい/小さい順に並べ直す処理)などの前処理を行う必要がないという利点がある。より高度なアルゴリズムに比べると平均の比較回数は多く、性能の高いアルゴリズムとは言えない。

二分探索 【2分探索】 ⭐⭐

データ検索アルゴリズムの一つで、一定の順序にソート(整列)済みのデータ群の探索範囲を半分に絞り込むを操作を繰り返すことで高速に探索を行う手法。

まず、データを降順(大きい順)あるいは昇順(小さい順)に並べ替え、探索したいデータが中央の要素より大きいか小さいかを調べる。これにより、データが全体の前半分にあるか後ろ半分にあるかを判定することができるため、存在しない側の半分は探索範囲から外すことができる。

半分になったデータ群の中央の要素と再び比較し、前半と後半のどちらにあるかを調べる。この操作を繰り返し行うことで、一回の操作ごとに探索範囲の大きさが半分になっていき、中央の要素が求めるデータに一致するか、探索範囲の要素数が一つになる(求めるデータは見つからなかったことが確定する)と探索は終了する。

値の大小は文字の索引順の前後関係などに適宜置き換えることにより、順序と比較手段を定義できればどのようなデータにも適用することができる。

n個のデータ群から平均でlog2n回の比較で探索を終えることができ、例えば1000個のデータを10回の比較で探索できる。原理は単純ながら高速なアルゴリズムである。ただし、要素があらかじめ整列済みである必要があるため、未整列のデータに適用するにはソートの分の計算時間も必要となる。

昇順 【小さい順】

数字やアルファベット、ひらがな・カタカナ、日付、時刻、曜日など順序や方向が決まっている要素の列について、本来定められた順序のこと。英語の “ascending order” を略した “ASC” “asc” などの略号で示されることもある。

データの並べ替え(ソート)における順序の指定などに用いられる概念で、小さい方から大きい方へ、あるいは本来の並び順における先頭側から末尾側へ「昇(のぼ)っていく」順序のことを意味する。

数字であれば1、2、3…と小さい値から大きい値へ、アルファベットであれば「A」から「Z」に向けて、カナであれば「ア」から「ン」に向けて、日付や時刻であれば過去側・古い側から未来側・新しい側に向けて並べる順序である。

一方、大きい方から小さい方へ、あるいは本来の並び順とは逆に並べる順序は「降順」(descending order)という。「9、8、7」「Z、Y、X」「ん、を、わ」といった本来とは逆の並び順のことである。

降順 【大きい順】

数字やアルファベット、ひらがな・カタカナ、日付、時刻、曜日など順序や方向が決まっている要素の列について、本来とは逆の順序のこと。英語の “descending order” を略した “DESC” “desc” などの略号で示されることもある。

データの並べ替え(ソート)における順序の指定などに用いられる概念で、大きい方から小さい方へ、あるいは本来の並び順における末尾側から先頭側へ「降(お)りていく」順序のことを意味する。

数字であれば9、8、7…と大きい値から小さい値へ、アルファベットであれば「Z」から「A」に向けて、カナであれば「ン」から「ア」に向けて、日付や時刻であれば未来側・新しい側から過去側・古い側に向けて並べる順序である。

一方、小さい方から大きい方へ、あるいは本来の並び順の通りに並べる順序は「昇順」(ascending order)という。「1、2、3」「A、B、C」「あ、い、う」といった本来定められた並び順のことである。

ホーム画面への追加方法
1.ブラウザの 共有ボタンのアイコン 共有ボタンをタップ
2.メニューの「ホーム画面に追加」をタップ
閉じる