このページでは、再入・再帰・再使用・再配置可能なプログラムの違い、値呼出しと参照呼出し、言語の4つの分類、Java・XMLの用語がわかります。
- 一言で言うと:
- プログラムの性質(何度でも・同時に・どこでも動けるか)、手続の呼び出し方と変数の寿命、言語の種類、JavaやXML関連の用語の話。
プログラムの性質(再入・再帰・再使用・再配置)→ 呼び出しと記憶域(値呼出し・参照呼出し、static・auto、ヒープ)→ 言語の種類(手続型・関数型・論理型・オブジェクト指向、マークアップ言語、Java・XML用語)
覚え方の軸
- プログラム特性は「再〜」の4つを、できることの違いで区別する:
- 再入可能=同時に呼ばれてもOK、再帰=自分を呼べる、再使用可能=ロードし直さずに何度も使える(ただし順番に)、再配置可能=どのアドレスに置いても動く
- 再入可能の作り方は「手続部分は共有、データ部分はタスクごと」
- 引数の渡し方は「値をコピーするか、アドレスを渡すか」:
- 値呼出しは呼出し元に影響しない、参照呼出しは呼出し元の変数も変わる
- 変数の寿命は「プログラムの終わりまで(static)」か「手続の終わりまで(auto)」
- 言語は「何を書くか」で4つ:
- 手順(手続型)、関数(関数型)、事実と規則(論理型)、オブジェクト(オブジェクト指向)
プログラム特性:同時に、何度も、どこでも動けるか
- 再入可能(リエントラント):
- 複数のタスクから同時に呼び出されても、それぞれに正しい結果を返せるプログラム
- 実現方法(★試験によく出る):
- 実行で内容が変わるデータ部分と、変わらない手続部分に分ける。手続部分は複数のタスクで共有し、データ部分はタスクごとに用意する
- 再帰(リカーシブ):
- 手続の中で自分自身を呼び出して使えるプログラム
- 特徴:
- 自分自身を呼び出せる
- 実行途中の状態は、スタックを使ってLIFO方式で管理される
- 再入可能である
- 再使用可能(リユーザブル):
- 一度実行したプログラムを、ロードし直さずにもう一度実行しても、正しい結果を返せるプログラム
- プログラムの最初か最後で各変数の値を初期化して、逐次使えるようにしている
- 再入可能の性質はもたないので、あるタスクが使っている間は、他のタスクは待たされる
- 逐次再使用可能(シリアリリユーザブル)ともいう
- 逐次処理(シリアライジング)の実現には、セマフォなどを使う
- 再配置可能(リロケータブル):
- 主記憶上のどのアドレスに配置しても実行できるプログラム
- 仕組み:
- ベースレジスタにプログラムの先頭アドレスを入れ、命令を実行するときにベースレジスタの値をアドレス部の値に加えて有効アドレスにする。だからプログラムを変えずにどこに置いても動く
| 特性 | 英語 | 一言で | ポイント |
|---|---|---|---|
| 再入可能 | リエントラント | 同時に呼ばれてもOK | 手続部分は共有、データ部分はタスクごと |
| 再帰 | リカーシブ | 自分を呼べる | スタック(LIFO)で管理。再入可能でもある |
| 再使用可能 | リユーザブル | ロードし直さず何度も使える | 変数を初期化する。同時は不可(他は待つ) |
| 再配置可能 | リロケータブル | どのアドレスでも動く | ベースレジスタ+アドレス部=有効アドレス |
プログラム制御:手続の呼び出し方と変数の寿命
- 手続(プロシージャ):
- 特定の目的のための一連の動作をまとめて定義したもの。必要なときに呼び出して使う
- 仮引数:
- 手続の中で定義された引数
- 値呼出し(call by value):
- 主プログラムから値そのものを引数として渡す
- 手続の中で変数の値を変えても、主プログラムの変数には一切影響しない
- 参照呼出し(call by reference):
- 主プログラムから変数のアドレスを渡す
- 手続の中で変数の値を変えると、主プログラムの変数の値も変わる
- 例(手続calc(X, Y)、Xは値呼出し、Yは参照呼出し):
- 主プログラム:
- X=3、Y=5 にして calc(X, Y) を呼ぶ
- 手続calc:
- X=X×2、Y=X+Y
- 1行目:
- 手続内のXに 3×2=6 が入るだけ(主プログラムのXは3のまま)
- 2行目:
- 主プログラムのYに 6+5=11 が入る
- 戻った後の主プログラム:
- X=3、Y=11
- 主プログラム:
- 変数の記憶期間:
- 変数には、記憶場所と存続期間を指定できる
- 静的変数(staticを付けて宣言):
- プログラムの実行中ずっと(プログラムが終わるまで)記憶域がある
- 初期化は、プログラムの実行前に一度だけ
- 自動変数(autoを付けて宣言):
- 手続が呼ばれたときに記憶域が確保され、手続が終わると自動的に解放される
- 初期化は、記憶域を確保した時点でその都度行う。ただし初期化されるのは、変数宣言で初期化を書いている場合だけ(例:auto int x=0; なら0で初期化される)
- 例(手続count(u)の中に static int v=0; v=v+u; return v;):
- x=count(5) → vは5
- y=count(5) → vは前の値が残っているので 10
- vが自動変数なら、毎回0から始まるので、どちらも5になる
- 動的メモリの割当て:
- プログラムの実行中に、領域を動的に確保すること。通常、ヒープという領域を使う
- 長所:
- 必要な領域をその都度確保できる
- 短所:
- 確保を繰り返していると、どこからも参照されない領域ができることがある
- ゴミ(ガーベジ、garbage):
- 不要になったのに解放されず、どこからも参照されないまま残った領域。増えるとヒープの空き領域が足りなくなり、領域を確保できなくなる
- メモリリーク:
- 不要になった領域を解放せずにそのままにしておくこと。または、それで空き領域が不足すること
- ガーベジコレクション:
- ゴミになった領域を解放・回収して、再び使えるようにする機能(Javaなど)
- 解放された領域は空き領域リストに追加される。隣り合う空き領域があれば結合して、1つの大きな空き領域にすることがある
- 注意:
- ガーベジコレクションがあっても、動的確保のときは確保が成功したかの確認処理を書く必要がある
言語の分類:何を書く言語か
- 手続型言語:
- 問題解決の処理手順(アルゴリズム)を、1文(命令)ずつ順を追って書く
- 文の種類:
- 宣言文(変数などを宣言)、代入文(変数に値を設定)、制御文(分岐や繰返し)
- 制御文を使うと、1文ずつ順に実行するだけでなく、変数の値で命令の実行順序を変えられる
- 代表例:
- Fortran、COBOL、PL/I、Pascal、BASIC、C
- 関数型言語:
- 再帰処理向きの言語。関数の定義とその呼出しでプログラムを書く
- 基本の書き方は「関数(引数の並び)=式」。右辺に「if 条件 then 式 else 式」のような条件式も書ける
- 関数定義の中で、定義済みの関数や自分自身を使える
- Lisp:
- リストや2分木などの再帰的データ構造を直接定義する仕組みがあり、自分自身のプログラムもリストで表せる
- 論理型言語:
- 述語論理を基礎にした論理式でプログラムを書く
- 「〜ならば…である」という推論が必要な問題に向いている
- プログラムに“事実”と“規則”を書けば、処理系の導出原理で結論(“質問”に合う事実)を導ける
- 代表例:
- Prolog
- ユニフィケーション(単一化):
- 推論の規則に質問のパターンを比べ、変数に値を代入するなどして、同じ形のものを作っていく操作
- バックトラック(後戻り):
- 途中で単一化に失敗したら、それまでの単一化の効果をすべて元に戻し、別のパターンで比較・単一化し直す操作
- エキスパートシステムの開発に使われる
- エキスパートシステム:
- 知識ベースを使って推論し、その分野に詳しくない人でも正しい結論を導けるシステム。知識ベースと推論エンジンでできている
- 知識ベース:
- いろいろな事実や常識、人間の知識や経験則を、「もし〜ならば…」の形で蓄えた特殊なデータベース
- エキスパートシステム:
- オブジェクト指向言語:
- “オブジェクト”をプログラムの基本にする言語。すべてのデータはオブジェクトで、すべての計算はオブジェクトにメッセージを送ることで行う
- 代表例:
- C++、Java
| 分類 | 何を書く? | 向いていること | 代表例 |
|---|---|---|---|
| 手続型 | 処理手順を1文ずつ | 一般的な処理 | Fortran、COBOL、C など |
| 関数型 | 関数の定義と呼出し | 再帰処理 | Lisp |
| 論理型 | 事実と規則(述語論理) | 推論、エキスパートシステム | Prolog |
| オブジェクト指向 | オブジェクトとメッセージ | 部品化 | C++、Java |
- その他の言語
- マークアップ言語:
- 文書の一部をタグ(<…>と</…>)で囲み、文書の構造や文字の大きさなどの修飾情報を書く言語
- XML(Extensible Markup Language):
- マークアップ言語の代表。利用者が目的に応じて任意のタグを定義できる
- YAML:
- XMLと比べられる規格。タグの代わりにインデントでデータの構造を表す
- 「YAML Ain’t a Markup Language(YAMLはマークアップ言語ではない)」の略
- JSON(JavaScript Object Notation):
- JavaScriptの言語仕様のうち、オブジェクトの表記法などの一部を基に決めた規格
- 「名前と値の組の集まり」と「値の順序付きリスト」の2つの構造でオブジェクトを表す
- 書き方:
- オブジェクトは“{”で始まり“}”で終わる。ダブルクォーテーション(")で囲んだ名前と値をコロン(:)で区切る(例:{"score":80})。組が複数あるときは“,”で区切る。[ ]は配列
- 例:
- {"番号":"3", "名前":"HANA", "年齢":28, "趣味":["読書","登山"]}
- スクリプト言語:
- 比較的かんたんにコードを書いたり実行したりできるプログラミング言語
- JavaScript:
- 動的なWebサイトの作成に使う
- Python:
- AI開発に向いた言語として注目されている
- PHP、Ruby、Perl:
- Webアプリケーション開発に向いている
- マークアップ言語:
- Java・XMLに関連する用語
| 用語 | 一言で言うと |
|---|---|
| Javaアプレット(アプレット) | Webサーバ上のJavaバイトコードをWebブラウザがダウンロードし、Java仮想マシン(Java VM)で実行するプログラム |
| Javaサーブレット(Servlet) | Webクライアントの要求に応じてWebサーバ上で実行されるJavaプログラム。一度ロードされるとサーバに常駐し、スレッドとして実行される |
| JavaBeans | Javaで作ったプログラムを、アプリケーションの部品(コンポーネント)として扱うための規約 |
| EJB | Enterprise JavaBeansの略。JavaBeansの規約に、エンタープライズ向け(サーバ側の処理)の機能を加えたもの |
| J2EE | Java 2 Platform, Enterprise Editionの略。Webベースの大規模企業システムで、サーバ側アプリケーションを作るための枠組み(プラットフォーム技術の仕様)。構成技術はServlet、JSP、EJB、JDBCなど |
| Ajax | Asynchronous JavaScript+XMLの略。JavaScriptの非同期通信で、画面遷移が起こらない動的なユーザインタフェースを実現する技術 |
| CSS | Cascading Style Sheetsの略。HTMLやXML文書の文字の大きさ、色、行間などの見た目の情報を扱う仕様。文書の表現の定義をHTMLから分離する |
| DTD | Document Type Definitionの略。XMLの文書構造(データの書き方)を定義するスキーマ言語、またはその記述 |
| XSLT | XML Stylesheet Language Transformationsの略。XML文書を、別の形式のXML文書やHTML文書などに変換するための仕様 |
| SMIL | Synchronized Multimedia Integration Languageの略。動画や音声などのマルチメディアのレイアウトや再生のタイミングをXMLで書くためのW3C勧告(例:「○秒ごとに動画を切り替える」) |
| SVG | Scalable Vector Graphicsの略。W3Cが作った、矩形や円、直線などの図形をXML形式で表す規格。ベクタ形式なので拡大・縮小しても輪郭が粗くならない。メモ帳などのテキストエディタでも作れる |
| ebXML | XMLを使った、Webサービス間の通信プロトコルやビジネスプロセスの書き方、取引情報の形式などを定義する一連の仕様 |
- Javaバイトコード:
- Javaのソースコードをコンパイルして作られる中間コード
- Java仮想マシン:
- Javaバイトコードを解釈し、プラットフォームに合ったオブジェクトコード(機械語)に変換して実行するプログラム
- ベクタ形式:
- 画像を、点や線などの図形を表す数値(計算式)の集まりで表す形式
- W3C:
- Webで使う技術の標準化を行う非営利団体
- CSS3のメディアクエリ:
- CSSのメディアタイプを拡張した機能。いろいろなデバイスの画面サイズに合わせて表示するレスポンシブWebデザインを実現できる
- 注意(古くなっている情報):
- Javaアプレットは、主要ブラウザがプラグインのサポートをやめたため、今はほぼ使われていない。Applet APIはJDK 26(2026年3月)で削除された。試験ではまだ用語として出る可能性があるので、意味は覚えておく
- J2EEは、2006年にJava EEに、2018年にEclipse Foundationへ移管されてJakarta EEに名前が変わった。試験では旧名のJ2EEのまま出ることがある
混同しやすいペア
- 再入可能(同時に呼ばれてもOK)/再使用可能(ロードし直さず何度も使えるが、同時は不可)
- 再帰(自分を呼べる、再入可能でもある)/再配置可能(どのアドレスでも動く、ベースレジスタ)
- 値呼出し(値を渡す、呼出し元は変わらない)/参照呼出し(アドレスを渡す、呼出し元も変わる)
- 静的変数 static(プログラムの終わりまで残る、初期化は一度だけ)/自動変数 auto(手続の終わりで解放、初期化はその都度)
- ゴミ(ガーベジ)(参照されなくなった領域)/ガーベジコレクション(ゴミを回収する機能)/メモリリーク(解放し忘れで空きが減ること)
- 関数型(Lisp、再帰向き)/論理型(Prolog、推論向き)
- ユニフィケーション(単一化。パターンを合わせる)/バックトラック(失敗したら元に戻してやり直す)
- Javaアプレット(ブラウザ側で動く)/Javaサーブレット(サーバ側で動く)
- JavaBeans(部品化の規約)/EJB(そのサーバ向け版)
- DTD(XMLの文書構造を定義)/XSLT(XMLを別の形式に変換)/CSS(見た目を指定)
- XML(タグで構造を表す)/YAML(インデントで構造を表す)/JSON(名前と値の組、{ }と[ ])