応用情報技術者第二弾ということで、さあ始まりました。
気合をいれて学習してまいりましょう。
れっつごー!
第2章 アルゴリズムとプログラミング
リスト
| 単語 | 意味 |
|---|---|
| リストの実現方法 | リストとは、複数のデータを順序づけて並べたものです。プログラムでは、これを「配列」または「連結リスト」という2つの主な方法で実現します。配列はメモリ上で連続した場所にデータを格納し、インデックス(番号)でアクセスします。一方、連結リストは、各データが「値」と「次のデータの場所(ポインタ)」を持つ構造で、メモリ上に飛び飛びに配置できます。配列はアクセスが速い一方、連結リストは要素の追加・削除が効率的です。 |
| 配列 | 配列は、同じ型のデータを一列に並べたものです。たとえば、5人のテストの点数を格納するには、score[0]からscore[4]のように、インデックスを使ってアクセスします。配列の最大の利点は、どの要素にも「瞬時に」アクセスできること(計算量O(1))です。しかし、サイズが固定で、途中に新しい要素を挿入するには、それ以降のすべての要素をずらす必要があり、時間がかかります(O(n))。そのため、頻繁にデータを変更する用途には不向きです。 |
| 連結リスト | 連結リストは、各データ(ノード)が「値」と「次のノードのアドレス(ポインタ)」を持つ構造です。たとえば、[10]→[20]→[30]のように、矢印でつながっています。この構造では、途中に新しいデータを挿入するとき、前後のポインタをつなぎ直すだけでよく、要素の移動は不要です。ただし、特定の位置のデータにアクセスするには、先頭から順にたどる必要があり、最悪でO(n)の時間がかかります。よって、追加・削除が頻繁な場面で有効です。 |
| 要素の追加 | 配列に要素を追加するには、新しい配列を作成してデータをコピーするか、事前に余裕を持たせた固定サイズを使う必要があります。これに対し、連結リストでは、新しいノードを生成し、前後のポインタをつなぎ直すだけで追加が完了します。たとえば、A→Cの間にBを挿入するには、「Aの次をBに」「Bの次をCに」変更するだけです。この操作自体はO(1)で済みますが、挿入位置を探すのにO(n)かかる点に注意が必要です。 |
| 要素の削除 | 配列から要素を削除するには、削除位置以降のすべての要素を1つ前にずらす必要があり、O(n)の時間がかかります。一方、連結リストでは、削除対象の前後のノードを直接つなぐだけで済みます。たとえば、A→B→CのBを削除するなら、「Aの次をCに」変えるだけです。ただし、単方向リストでは「前のノード」を見つけるのに時間がかかるため、削除全体としてはO(n)になることがあります。双方向リストなら、前後のポインタを持つため、削除がO(1)で可能になります。 |
| リストによる2分木の表現 | 2分木(各ノードが最大2つの子を持つ木)は、連結リストで自然に表現できます。各ノードに「左の子」と「右の子」へのポインタを持たせ、必要に応じて親へのポインタも加えます。これにより、再帰的な操作(例:探索、巡回)が容易になります。また、完全2分木の場合は、配列でも効率よく格納できます。インデックスiのノードの左の子は2i+1、右の子は2i+2、親は(i−1)//2で計算でき、ヒープや優先度付きキューの実装に使われます。 |
スタックとキュー
| 単語 | 意味 |
|---|---|
| スタック | スタックは、「最後に入れたものが最初に出る(LIFO: Last In, First Out)」という性質を持つデータ構造です。たとえば、皿を積み重ねて、上から1枚ずつ取るイメージです。基本操作は「プッシュ(push)」でデータを追加、「ポップ(pop)」でデータを取り出します。どちらもO(1)で高速です。スタックは関数呼び出しの履歴管理、Undo機能、式の評価(逆ポーランド記法)などに使われ、配列や連結リストで実現できます。 |
| キュー | キューは、「最初に入れたものが最初に出る(FIFO: First In, First Out)」という性質を持つデータ構造です。たとえば、コンビニのレジの待ち行列をイメージするとわかりやすいです。基本操作は「エンキュー(enqueue)」で追加、「デキュー(dequeue)」で取り出しです。配列で実現する場合、取り出すたびに全要素をずらすと非効率なため、「リングバッファ(循環配列)」を使うと、O(1)で処理できます。また、連結リストでも効率よく実装可能です。 |
| グラフの探索 | グラフは、ノード(点)とエッジ(線)で構成され、その探索には「深さ優先探索(DFS)」と「幅優先探索(BFS)」があります。DFSはスタック(または再帰)を使って、一つの道を最後までたどり、行き止まりなら戻ります。BFSはキューを使って、近くのノードから順に探索します。たとえば、迷路の最短経路を見つけるにはBFS、すべての経路を列挙するにはDFSが向いています。どちらも計算量はO(V + E)(Vは頂点数、Eは辺数)です。 |
木構造
| 単語 | 意味 |
|---|---|
| 木の基本構造 | 木は、階層的なデータ構造で、ルート(根)から始まり、子ノードが枝分かれしていきます。各ノードには親が1つ(ルートを除く)あり、子が0個以上あります。子を持たないノードは「葉(leaf)」と呼ばれます。特に、各ノードが最大2つの子を持つものを「2分木」といいます。木は再帰的構造を持つため、再帰関数との相性が非常に良く、探索や整列アルゴリズムの基礎となります。 |
| 木の種類 | 木にはいくつかの重要な種類があります。まず「2分木」は、各ノードが最大2つの子を持つ木です。「2分探索木」は、左の子 ≤ 親 ≤ 右の子となる2分木で、探索が高速です。「完全2分木」は、すべての層が埋まっていて、最後の層も左から詰まっている木で、配列で効率よく扱えます。また、「バランス木」(例:AVL木)は左右の高さ差が小さくなるよう自動調整され、性能が安定します。データベースで使われる「B木」は1ノードに複数のキーを持ち、ディスクアクセスを減らすのに適しています。用途に応じて使い分けます。 |
| 完全2分木 | 完全2分木とは、すべての層が完全に埋まっており、最後の層も左から連続してノードが並んでいる2分木のことです。たとえば、高さ2の完全2分木なら、ノード数は1(深さ0)+2(深さ1)+4(深さ2)=7個です。この構造は配列で非常に効率よく表現でき、インデックスiのノードの左の子は2i+1、右の子は2i+2で計算できます。この性質は、ヒープや優先度付きキューの実装で活用されます。 |
| 完全2分木の葉の個数 | 高さhの完全2分木における葉の個数は、2h個です。たとえば、h=2なら葉は4個(22)です。これは、各深さdのノード数が2^dであることから導かれます。また、総ノード数Nが分かっている場合、葉の数は(N+1)÷2で求められます(Nは必ず奇数)。この性質は、ヒープのメモリ使用量の見積もりや、木のバランス評価に役立ちます。 |
| 葉以外の節の個数 | 完全2分木で総ノード数がNのとき、内部ノード(葉でない節)の数は(N−1)÷2です。たとえば、N=7なら内部ノードは3個(ルートとその2つの子)になります。これは、葉の数が(N+1)÷2なので、N−(N+1)÷2=(N−1)÷2となることからわかります。この関係は、木の構築やメモリ確保、再帰処理の回数見積もりに有効です。 |
| 巡回法 | 木の巡回(走査)には主に3種類あります。「行きがけ順(前順)」は根→左→右、「通りがけ順(中間順)」は左→根→右、「帰りがけ順(後順)」は左→右→根の順でノードを訪れます。たとえば、数式「2+3×4」を表す木を通りがけで読むと、正しい数式「2+3×4」になります。行きがけは関数呼び出し、帰りがけはファイル削除(中身を先に消す)などに使われ、いずれも再帰関数で自然に実装できます。 |
| 幅優先探索(BFS順) | 幅優先探索(BFS)は、ルートから「同じ深さのノードを左から右に」順に訪れる方法です。キューを使って実現します。まずルートをキューに入れ、取り出すごとにその子をキューに追加していきます。たとえば、AがBとCを持ち、BがD、CがEとFを持つなら、BFS順はA, B, C, D, E, Fです。最短経路探索や、レベル単位での処理(例:階層表示)に適しています。 |
| 深さ優先探索(DFS順) | 深さ優先探索(DFS)は、一つの枝をできるだけ深くたどり、行き止まりになれば戻る方法です。スタック(または再帰)で実現されます。AがBとCを持ち、BがD、CがEとFを持つとき、行きがけ順ならA, B, D, C, E, F、帰りがけ順ならD, B, E, F, C, Aとなります。DFSは迷路探索や依存関係の解決(トポロジカルソート)に使われ、メモリ使用量は木の高さに比例(O(h))で、BFSより少ない場合があります。 |
| 2分探索木 | 2分探索木(BST)は、「左の子 ≤ 親 ≤ 右の子」というルールを持つ2分木です。この性質により、探索が効率的に行えます。たとえば、値50のノードがあれば、30は左、70は右にあり、不要な枝をたどらずに済みます。探索、挿入、削除の計算量は木の高さに比例します。バランスが取れていればO(log n)ですが、データの挿入順によっては一直線になり、O(n)になることがあります。その対策が「バランス木」です。 |
| 2分探索木における探索 | 2分探索木での探索は、ルートから始まり、「探したい値 < 現在のノードなら左へ、> なら右へ」進みます。一致するか、空の子に到達するまで繰り返します。計算量は木の高さに比例し、バランスが取れていればO(log n)、最悪(一直線)ならO(n)です。たとえば、1,2,3,4,5と順に挿入すると、木が片寄り、探索効率が劣化します。このため、実用系では自動でバランスを取る木(AVL木など)が使われます。 |
| 2分探索木における節の挿入と削除 | 挿入は、探索と同様に進み、空の子の位置に新ノードを置きます。削除は3パターンあります。 ① 葉ならそのまま消す。 ② 子が1つなら、その子で置き換える。 ③ 子が2つなら、「次に大きい値(右部分木の最小値)」または「次に小さい値(左部分木の最大値)」で置き換え、そのノードを削除します。 これにより、2分探索木の性質(左 ≤ 親 ≤ 右)を保ちつつ、削除が可能です。 |
| バランス木 | バランス木は、高さが常にlog n程度になるよう自動調整する2分探索木です。これにより、探索・挿入・削除の計算量が最悪でもO(log n)に保たれます。代表例には「AVL木」「赤黒木」「B木」があります。たとえば、AVL木は「左右の高さ差が1以内」を維持し、挿入・削除時に回転操作でバランスを回復します。大規模データの高速アクセスや、リアルタイム性が求められるシステムで不可欠です。 |
| AVL木 | AVL木は、すべてのノードで「左部分木と右部分木の高さ差が1以下」になるよう保つバランス木です。挿入や削除後に「回転(rotation)」と呼ばれる操作でバランスを回復します。回転には「単回転(左回転・右回転)」と「二重回転(左右回転・右左回転)」の4種類があります。AVL木は探索性能が非常に安定(常にO(log n))ですが、回転のオーバーヘッドがあるため、更新が極端に多い場合は赤黒木が使われることもあります。 |
| B木 | B木は、1ノードが複数のキーと子を持つ「多分木」で、主にディスクやSSDなどの外部記憶装置向けに設計されています。たとえば、次数3のB木なら、1ノードに2〜4個のキーを持ち、子の数はキー数+1です。階層が浅くなるため、ディスクI/O(読み書き)の回数が少なく済みます。データベース(例:MySQLのInnoDB)やファイルシステム(例:NTFS)で広く使われ、その変種であるB⁺木は、葉ノードだけにデータを持ち、範囲検索に強いです。 |
探索アルゴリズム
| 単語 | 意味 |
|---|---|
| 線形探索法 | 線形探索は、リストの先頭から順に1つずつ要素を調べ、目的の値と一致するかを確認する方法です。一致する要素が見つかるか、最後まで調べたら終了します。計算量はO(n)で、データが整列していなくても使える利点があります。たとえば、100万件のデータなら、平均50万回の比較が必要です。小規模データや、1回限りの探索、またはデータがランダムな場合に有効ですが、大規模データでは非効率です。 |
| 2分探索法 | 2分探索は、整列済みの配列に対して使える高速探索法です。中央の要素と比較し、「目的の値 < 中央なら左半分、> なら右半分」に絞り込み、再帰的に繰り返します。計算量はO(log n)で、100万件なら約20回で探索できます。ただし、データがソートされていないと使えません。また、配列(ランダムアクセス可能)が前提で、連結リストには不向きです。多くのライブラリ(例:Pythonのbisect)でサポートされています。 |
| ハッシュ法 | ハッシュ法は、キーから「ハッシュ関数」を使ってインデックスを計算し、その位置にデータを格納する方法です。理想では、どのデータもO(1)でアクセス可能です。たとえば、hash("apple") = 5なら、配列の5番目に保存します。しかし、異なるキーが同じインデックスになる「衝突(collision)」が発生するため、対策が必要です。主な対策には「オープンアドレス法」と「チェイン法」があり、高速な検索が必要な場面(例:データベースのインデックス、キャッシュ)で広く使われます。 |
| オープンアドレス法 | オープンアドレス法は、ハッシュ衝突が発生したとき、別の空き位置を探す方式です。代表的な方法に「線形走査(次を順に調べる)」「2次走査(飛び飛びに調べる)」「二重ハッシュ」があります。たとえば、インデックス5が埋まっていれば6、7…と探します。利点はメモリ効率が良く、キャッシュに優しいですが、データが多くなると衝突が連鎖し、「クラスタリング」という性能劣化が起きやすくなります。負荷率(使用率)は70%以下が望ましいとされています。 |
| チェイン法 | チェイン法は、衝突したデータを「連結リスト」で同じインデックスに格納する方式です。たとえば、ハッシュ値5の場所に[apple, banana]がリストで格納されます。利点は、衝突が増えても性能が比較的安定し、負荷率が高くても大丈夫な点です。ただし、ポインタのオーバーヘッドがあり、メモリ効率はオープンアドレス法より劣ります。実装が簡単で、JavaのHashMapやPythonのdict(内部実装)など、多くの現代的言語で採用されています。 |
| O記法 | O記法(ビッグオー記法)は、アルゴリズムの計算量(時間やメモリ)を「大まかに」表す方法です。たとえば、「O(n)」は「データ数nに比例」、「O(log n)」は「nが2倍になっても計算量は+1」を意味します。定数や低次の項(例:3n2+5n+10はO(n2))は無視します。これにより、アルゴリズムのスケーラビリティ(規模が大きくなっても使えるか)を比較できます。2026年現在も、性能評価やアルゴリズム選定の基本ツールとして広く使われています。 |
整列アルゴリズム
| 単語 | 意味 |
|---|---|
| バブルソート | バブルソートは、隣同士の要素を比較し、順序が逆なら入れ替える操作を繰り返す整列アルゴリズムです。「大きい数字が泡(bubble)のように上に浮かび上がる」イメージからその名がつきました。たとえば、[5, 3, 1] → [3, 5, 1] → [3, 1, 5] → [1, 3, 5]のように進みます。最悪・平均計算量はO(n2)で遅いですが、コードが非常に簡単で、小規模データや教育用途には向いています。すでに整列済みなら、交換が0回で済むため、O(n)に改良することも可能です。 |
| 単純選択法 | 単純選択法(選択ソート)は、「未整列部分から最小値を探し、先頭と交換」を繰り返す方法です。たとえば、[4, 2, 3, 1] → 最小値1を先頭に → [1, 2, 3, 4]。比較回数は常にn(n−1)/2でO(n2)ですが、交換はn−1回しか行いません。この性質は、メモリ書き込みコストが高い環境(例:SSDや組み込みシステム)では有利です。ただし、一般的な用途ではより高速なアルゴリズム(例:クイックソート)が使われるため、実用より学習用として知られています。 |
| 単純挿入法 | 単純挿入法(挿入ソート)は、トランプの手札を整えるように、1つずつ要素を取り出して「正しい位置に挿入」する方法です。たとえば、[3, 1, 2]なら、1を3の前に、2を1と3の間に挿入します。計算量は平均・最悪でO(n²)ですが、データがほぼ整列済みなら非常に高速(O(n))になります。また、安定ソート(同じ値の順序が保たれる)であり、小規模データや、他の高速アルゴリズム(例:クイックソート)の部分処理としても使われます。 |
| 整列法 | 整列法(ソート)は、データを特定の順序(昇順・降順など)に並べ替えるアルゴリズムの総称です。主な分類には、「比較ソート」(要素同士を比較して並べる)と「非比較ソート」(例:数え上げソート)があります。比較ソートの理論的下限はO(n log n)で、クイックソート、マージソート、ヒープソートなどがこれに達します。一方、非比較ソートは特定の条件(例:整数の範囲が限られる)でO(n)を実現できます。選択は、データの性質や安定性、メモリ制約に応じて行います。 |
| 逐次添加法 | 逐次添加法は、データを1つずつ取り出し、既に整列済みの部分列に「正しい位置に挿入」していく方法で、実際には「挿入ソート」と同じアルゴリズムを指します。この方法は、オンライン処理(データが随時到着する場合)に適しています。たとえば、リアルタイムで入力される数値を常に整列済みに保つ用途です。計算量はO(n2)ですが、小規模や部分的に整列されたデータでは効率的です。安定ソートであり、実装も直感的です。 |
| 分割統治法 | 分割統治法は、「問題を小さな部分問題に分割 → それぞれを解く → 解を統合する」というアルゴリズム設計手法です。代表例に「マージソート」「クイックソート」「高速フーリエ変換(FFT)」があります。たとえば、マージソートでは配列を半分に分け、それぞれをソートしてからマージ(結合)します。この手法は、再帰と相性が良く、多くの効率的アルゴリズムの基盤となっています。計算量は、分割と統合のコストによって変わりますが、O(n log n)になることが多いです。 |
| クイックソート | クイックソートは、分割統治法に基づく高速な整列アルゴリズムです。まず「ピボット」と呼ばれる基準値を選び、それより小さい要素と大きい要素に分けて、左右の部分列を再帰的にソートします。平均計算量はO(n log n)で、実行速度が非常に速いため、多くのライブラリ(例:C言語のqsort)で使われています。ただし、最悪(ピボットが常に最大・最小)ではO(n2)になるため、ピボットの選び方(例:中央値)や、小規模データでは挿入ソートに切り替える工夫がされます。 |
| ヒープソート | ヒープソートは、データを「ヒープ(完全2分木で親≥子)」に構成し、最大値(または最小値)を繰り返し取り出して整列するアルゴリズムです。まず配列をヒープ構造に変換(ヒープ化)し、最大値を末尾と交換、ヒープサイズを1減らして再構成を繰り返します。計算量は常にO(n log n)で、メモリをほとんど使わず(in-place)、最悪ケースでも安定しています。ただし、キャッシュ効率が悪く、実行速度ではクイックソートに劣ることが多いです。 |
| ヒープの再構成 | ヒープの再構成(ヒープ化)は、ヒープの性質(親 ≥ 子)を保つために、ノードの値を上下に移動させる操作です。たとえば、最大ヒープで親が子より小さい場合、「ヒープダウン(sift-down)」で値を下に押し下げます。逆に、新しい要素を追加したときは、「ヒープアップ(sift-up)」で上に上げます。この操作はO(log n)で、ヒープソートや優先度付きキューの基本になります。配列で実現でき、メモリ効率が良いのが特徴です。 |
| マージソート | マージソートは、分割統治法に基づく整列アルゴリズムで、配列を半分に分け、それぞれを再帰的にソートしてから「マージ(併合)」します。マージは、2つの整列済み配列を先頭から比較して新しい配列に並べるだけです。計算量は常にO(n log n)で、安定ソートであり、性能が安定しているため、外部ソート(ディスクを使う大規模データ)や、並列処理にも向いています。ただし、O(n)の追加メモリが必要な点が欠点です。 |
再帰法
| 単語 | 意味 |
|---|---|
| 再帰関数の定義 | 再帰関数とは、自分自身を呼び出す関数のことです。再帰を使うには、「基底条件(終了条件)」と「再帰条件(自分を呼び出す部分)」が必要です。たとえば、階乗n!は「n × (n−1)!」で、基底条件は「0! = 1」です。再帰は木の巡回、分割統治アルゴリズム、数学的定義の実装に自然に使われます。ただし、深くなりすぎるとスタックオーバーフローを起こすため、末尾再帰最適化や反復への変換が検討されることがあります。 |
| 再帰関数の実例 | 再帰の代表例は「フィボナッチ数列」や「階乗計算」ですが、実用的には「2分探索」「マージソート」「木の巡回」などに使われます。たとえば、2分木の行きがけ順巡回は、「ノードを表示 → 左部分木を再帰 → 右部分木を再帰」と定義できます。このように、再帰は「自己相似性(部分が全体と同じ構造)」を持つ問題に非常に適しています。多くの言語(例:Python, Java)は再帰をサポートし、2026年現在も重要なプログラミング技法です。 |
プログラム言語
| 単語 | 意味 |
|---|---|
| プログラム特性 | プログラム特性とは、ソフトウェアが再利用・再配置・並列実行などに対して持つ性質のことを指します。代表的なものに「再入可能(reentrant)」「再使用可能(reusable)」「再配置可能(relocatable)」があります。これらは、組み込みシステム、OSカーネル、マルチスレッド環境など、信頼性・効率性が求められる場面で重要です。たとえば、再入可能な関数は、割り込みや再帰呼び出しでも安全に動作します。 |
| 再入可能 | 再入可能(reentrant)とは、関数が実行中に再度呼び出されても、正しく動作する性質です。そのためには、関数がグローバル変数や静的変数を使わず、すべてのデータを引数やローカル変数で管理する必要があります。再入可能な関数は、割り込み処理や再帰呼び出し、マルチスレッド環境で安全に使えます。たとえば、OSのシステムコールや、リアルタイムシステムのルーチンでは、再入可能性が必須とされます。 |
| 再帰 | 再帰(recursion)は、関数が自分自身を呼び出すプログラミング技法です。再帰を使うには、必ず「基底ケース(終了条件)」を設ける必要があります。たとえば、nの階乗は「n * 階乗(n-1)」で、基底ケースは「n=0なら1」です。再帰は木構造や分割統治アルゴリズムで自然に使えますが、呼び出しが深くなるとスタック領域を大量に消費し、スタックオーバーフローを引き起こすことがあります。そのため、末尾再帰や反復への変換が推奨される場合があります。 |
| 再使用可能 | 再使用可能(reusable)とは、プログラムや関数が1回の実行後に再利用できる性質です。たとえば、ローカル変数のみを使う関数は、呼び出しごとに初期化されるため、何度でも再利用できます。一方、静的変数やグローバル変数を変更する関数は、前回の実行の影響を残すため、再使用可能とは言えません。再使用可能性は、ライブラリやモジュールの設計で重要で、信頼性の高いソフトウェア開発に不可欠です。 |
| 再配置可能 | 再配置可能(relocatable)とは、プログラムがメモリ上の任意のアドレスに読み込まれても正しく動作する性質です。これは、絶対アドレスを使わず、相対アドレスやオフセットでコードを記述することで実現します。再配置可能なコードは、共有ライブラリ(例:.soファイル、.dll)や、OSのメモリ管理(例:仮想メモリ)で広く使われ、2026年現在もモダンなソフトウェア開発の基盤技術です。 |
| プログラム制御 | プログラム制御とは、プログラムの実行順序を管理する仕組みで、主に「条件分岐(if)」「繰り返し(for, while)」「関数呼び出し」によって実現されます。これらは、CPUの命令ポインタ(プログラムカウンタ)を操作することで、実行フローを制御します。高度な制御には、例外処理(try-catch)やジェネレータ(yield)も含まれ、2026年現在の言語では、これらを安全かつ効率的に扱う機能が充実しています。 |
| 手続きの呼出し | 手続き(関数)の呼び出しでは、引数や戻りアドレスを「スタック」に積み、新しいスタックフレームを作成します。これにより、複数の呼び出しが入れ子になっても、それぞれのローカル変数や状態が独立して管理されます。戻り値は、呼び出し元のスタックフレームに書き戻され、スタックフレームが破棄されます。この仕組みは、再帰やネストした関数呼び出しを可能にし、現代のプログラミングの基盤となっています。 |
| 変数の記憶期間 | 変数の記憶期間(lifetime)とは、変数がメモリ上に存在する期間を指します。ローカル変数は「自動記憶域(automatic storage)」で、関数の呼び出しから戻るまで存在します。一方、グローバル変数やstatic変数は「静的記憶域(static storage)」で、プログラムの開始から終了まで存在します。2026年現在の言語(例:C++、Rust)では、所有権やライフタイムの明示的管理も可能で、メモリ安全を高めています。 |
| 動的メモリの割当て | 動的メモリの割当ては、プログラム実行中に必要に応じてメモリを確保(malloc/new)・解放(free/delete)する仕組みです。これにより、サイズが実行時まで決まらないデータ(例:リスト、木)を扱えます。ただし、解放忘れは「メモリリーク」、二重解放は「クラッシュ」を引き起こすため、注意が必要です。2026年現在、多くの言語(例:Java, Python)はガベージコレクションで自動管理し、C++ではスマートポインタが推奨されています。 |
| 言語の分割 | 言語の分割とは、プログラム言語を「手続型」「関数型」「論理型」「オブジェクト指向型」などに分類することです。これは、問題解決のアプローチやデータの扱い方の違いに基づいています。たとえば、手続型は「命令の列」、関数型は「関数の合成」、論理型は「述語と推論」を重視します。2026年現在、多くの言語(例:Python, Scala)は複数のパラダイムを混合(マルチパラダイム)しており、用途に応じた柔軟な開発が可能です。 |
| 手続型言語 | 手続型言語は、プログラムを「命令の列」で記述し、状態を変化させながら処理を進めるスタイルです。代表例にC、Pascalがあります。変数に値を代入し、ループや条件分岐で制御フローを記述します。このスタイルは、ハードウェアに近い動作を直感的に表現でき、組み込みシステムやOS開発で広く使われています。2026年現在も、効率性と制御性が求められる場面で重要なパラダイムです。 |
| 関数型言語 | 関数型言語は、「関数の合成」を中心にプログラムを構成し、変数の再代入(破壊的更新)を避けます。代表例にHaskell、Lisp、Erlangがあります。特徴として、「参照透明性(同じ入力なら常に同じ出力)」「副作用の排除」があり、並列処理やテストに強いです。2026年現在、Scala、F#、JavaScript(部分的に)など、多くの言語が関数型の要素を取り入れ、安全で簡潔なコード記述を可能にしています。 |
| 論理型言語 | 論理型言語は、「事実」と「ルール」を定義し、クエリに対して推論エンジンが答えを導くスタイルです。代表例はPrologです。たとえば、「親(X, Y) :- 親(X, Z), 親(Z, Y).」と定義すれば、「孫関係」を自動で推論できます。このパラダイムは、知識ベース、自然言語処理、AIの初期研究で使われましたが、2026年現在はニッチな用途に限定されています。ただし、制約論理プログラミングなど、応用分野は残っています。 |
| オブジェクト指向言語 | オブジェクト指向言語は、データ(属性)と操作(メソッド)を「オブジェクト」にまとめて、現実世界の概念をモデル化します。代表例にJava、C++、Pythonがあります。主な特徴は、「カプセル化(内部隠蔽)」「継承(共通性の再利用)」「ポリモーフィズム(多様性)」です。これにより、大規模ソフトウェアの保守性・再利用性が向上します。2026年現在、GUIアプリ、Webバックエンド、ゲーム開発などで広く使われています。 |
| その他の言語 | 「その他の言語」には、スクリプト言語(例:Python, JavaScript)、マークアップ言語(例:HTML, XML)、クエリ言語(例:SQL)、DSL(ドメイン特化言語)などが含まれます。これらは、特定の用途に特化して設計されており、汎用言語と組み合わせて使われます。たとえば、Web開発ではHTML(構造)+CSS(見た目)+JavaScript(動作)が標準です。2026年現在、AIやデータ分析向けに、新しいDSLも活発に開発されています。 |
| Javaアプレット | Javaアプレットは、Webブラウザ内で実行される小型Javaプログラムでした。1990年代後半から2000年代初頭にかけて、インタラクティブなWebコンテンツ(例:ゲーム、チャート)に使われました。しかし、セキュリティリスク(例:マルウェア)、パフォーマンス問題、モバイル非対応などの理由から、2026年現在は完全に廃止されています。代わりに、JavaScriptやWebAssemblyがブラウザ内実行の主流となっています。 |
| Javaサーブレット | Javaサーブレットは、Webサーバー上で動くJavaプログラムで、HTTPリクエストに応じて動的コンテンツ(例:HTML、JSON)を生成します。サーブレットは、リクエストごとにスレッドで処理され、JSP(JavaServer Pages)と組み合わせて使われました。2026年現在、直接の使用は減っていますが、Spring Bootなどの現代的フレームワークは、サーブレットAPIの上に構築されており、Webバックエンドの基盤技術として生き続けています。 |
| JavaBeans | JavaBeansは、再利用可能なソフトウェアコンポーネントの規約で、「引数なしコンストラクタ」「プロパティアクセス用のgetter/setter」「Serializableの実装」を条件とします。当初はGUI部品(例:ボタン、テキストフィールド)として使われ、後にエンタープライズアプリのデータモデル(例:User, Order)として広く採用されました。2026年現在、名前は使われないものの、POJO(Plain Old Java Object)として、Javaのオブジェクト設計の基礎となっています。 |
| EJB | EJB(Enterprise JavaBeans)は、Java EE(現:Jakarta EE)で提供された、分散トランザクションやセキュリティを自動管理するサーバーサイドコンポーネントモデルです。Session Bean(ビジネスロジック)、Entity Bean(データ永続化)、Message-Driven Bean(非同期処理)がありました。しかし、設定が複雑で、Spring Frameworkの台頭により、2026年現在はほとんど使われていません。ただし、その思想(コンテナ管理、AOP)は現代のフレームワークに受け継がれています。 |
| J2EE | J2EE(Java 2 Platform, Enterprise Edition)は、大規模なWebアプリケーションを開発するためのJavaの標準仕様で、2006年にJava EEに改名、2018年にはEclipse Foundationに移管され「Jakarta EE」となりました。Servlet、JSP、EJB、JNDI、JTAなどの技術を含み、エンタープライズシステムの基盤を提供しました。2026年現在、Jakarta EEはマイクロサービス時代に適応しつつあり、特に金融・通信分野で信頼性の高い基盤として使われています。 |
| Ajax | Ajax(Asynchronous JavaScript and XML)は、Webページを再読み込みせずに、バックエンドと非同期に通信してデータを更新する技術です。JavaScriptのXMLHttpRequest(またはfetch API)を使って、JSONやXML形式のデータをやりとりします。これにより、Google MapsやGmailのような「リッチなWebアプリ」が可能になりました。2026年現在、AjaxはWeb開発の標準技術であり、ReactやVue.jsなどのフロントエンドフレームワークも、内部で非同期通信を多用しています。 |
| CSS | CSS(Cascading Style Sheets)は、HTMLの見た目(色、フォント、レイアウト)を定義する言語です。セレクタで要素を指定し、プロパティでスタイルを設定します。2026年現在、CSSはFlexboxやGridによる高度なレイアウト、メディアクエリによるレスポンシブデザイン、カスタムプロパティ(変数)など、非常に高度な機能を備えています。また、CSS-in-JSやTailwind CSSなど、開発効率を高める新しいアプローチも広がっています。 |
| DTD | DTD(Document Type Definition)は、XML文書に使える要素や属性、その階層構造を事前に定義する仕組みです。たとえば、「〈book〉の中には〈title〉と〈author〉が1つずつ必要」といったルールを記述できます。これにより、XMLの形式が正しいかどうかを検証できます。ただし、名前空間やデータ型のサポートが弱く、2026年現在ではより高機能なXML Schema(XSD)に置き換えられています。レガシーシステムではまだ使われることもあります。 |
| XSLT | XSLT(Extensible Stylesheet Language Transformations)は、XML文書を別のXMLやHTML、テキストに変換する言語です。ルールベースで、要素にマッチするテンプレートを適用します。たとえば、XMLの商品データをHTMLテーブルに変換できます。XSLTは関数型言語の特徴を持ち、2026年現在は主にレガシーシステムや、XSL-FO(PDF生成)との組み合わせで使われています。新しいシステムでは、JSON+JavaScriptによる変換が主流です。 |
| SMIL | SMIL(Synchronized Multimedia Integration Language)は、W3Cが標準化した、マルチメディア(音声、動画、画像、テキスト)のタイミングとレイアウトを制御するXMLベースの言語です。たとえば、「5秒後に画像を表示、10秒でフェードアウト」などと記述できます。2000年代初頭に注目されましたが、FlashやHTML5の台頭により、2026年現在はほとんど使われていません。ただし、アクセシビリティや教育分野で限定的な利用が残っています。 |
| SVG | SVG(Scalable Vector Graphics)は、XMLでベクター画像(線、円、パスなど)を記述するW3C標準です。拡大しても画質が劣化せず、CSSやJavaScriptで操作可能という利点があります。2026年現在、Web上のアイコン、チャート、地図、アニメーションなどで広く使われ、レスポンシブデザインやアクセシビリティにも優れています。また、CSSアニメーションやWebGLとの連携も進んでおり、インタラクティブなビジュアライゼーションの基盤技術です。 |
| ebXML | ebXML(Electronic Business using eXtensible Markup Language)は、2000年代初頭にUN/CEFACTとOASISが共同で策定した、企業間取引(B2B)のためのXMLベースの標準仕様です。メッセージング、ビジネスプロセス、レジストリなどを定義し、EDI(電子データ交換)のインターネット対応を目指しました。しかし、複雑さと実装コストの高さから普及せず、2026年現在は事実上廃れています。現在のB2B連携は、REST APIやJSON、EDI over Internet(AS2)が主流です。 |
みんなで使おう!Ankiアプリで暗記しよう
Ankiアプリの記事と、現時点までに作成されたAnkiアプリのデータへのリンクを掲載しております。どうぞご利用ください。
本日分までのAnkiアプリデータはこちら。
firestorageダウンロード
パスワードは「shirakawa」です。お間違えのないように。
参考図書
応用情報技術者の資格勉強をするにあたり、科目A対策として以下の教科書を使用しています。できれば、こちらもAnkiアプリと併用しながらご利用いただければと思います。暗記した内容とのつながりが理解できるようになるのでオススメですよ。
合わせて読みたい
最後に
いかがでしたでしょうか?
Qwenで「意味」を出力させていますが、出力用のプロンプトを少し見直したほうが良いかなと思ったりもしています。もうちょっと文章でも詳しく解説して欲しいところですよね。
ちょこちょこプロンプトのほうはいじっていきますので、ご期待ください。
応用情報技術者の勉強は難しいと思いますが、皆さん一緒に頑張りましょう!

白川秋
ではでは、参考までに











コメント