ホーム | ブログ | C++辞典 | サイトマップ | FAQ | 掲示板 | リンク集
メイン・メニュー
インデックス
プログラミング
その他
翻訳過程 のバックアップ差分(No.5)


  • 追加された行はこの色です。
  • 削除された行はこの色です。
* 翻訳過程 (translation phase) [#y9eb3bc0]
 
  翻訳過程における[[プログラム]]中の各構文要素は、それぞれの段階に応じて以下の優先順位となる。
 + 必要に応じて、[[ソースファイル]]に書かれた物理的[[文字]]を、[[処理系]]が定めた方法によって[[基本ソース文字集合]]の文字に変換する ([[改行文字]]の変換など) 。[[三つ組表示]]は対応する単一文字に置き換えられる。基本ソース文字集合にない拡張文字は対応する[[国際文字名]]に置き換える (拡張文字が直にソースファイルに書かれた場合と、その文字を表す国際文字名は同等に扱われる) 。~
 + 必要に応じて、[[ソースファイル]]中の物理的[[文字]]を、[[処理系]]が定めた方法によって[[基本ソース文字集合>文字集合#basic-source]]の文字に変換する ([[改行文字]]の変換など) 。[[三つ組表示]]は対応する単一文字に置き換えられる。基本ソース文字集合にない拡張文字は対応する[[国際文字名]]に置き換える (拡張文字が直接ソースファイルに書かれた場合と、その文字を表す国際文字名は同等に扱われる) 。~
 ~
 + [[逆斜線]]の直後に改行文字が現れる箇所では、その逆斜線と改行文字が取り除かれ、続く物理的な行と連結することで論理的な行にまとめられる。その結果として国際文字名が生じた場合の[[動作は未定義>未定義の動作]]である。空でないソースファイルが改行文字で終わっていない場合、または逆斜線に続く改行文字で終わっている場合の動作は未定義である。~
 ~
 + ソースファイルを、[[前処理字句]]と[[空白類文字]]の列に分解する。ソースファイル中の前処理字句や[[注釈]]は、途中で途切れることなく完結していなければならない。注釈は、それぞれ 1 個の[[空白文字]]に置き換えられる。改行文字はそのまま残されるが、改行文字以外の空白類文字からなる列を、単一の空白文字に置き換えるか、そのまま残されるかは[[処理系定義]]である。ソースファイル中の文字の列を前処理字句の列に分解する処理は、文脈に依存する ([[#include>前処理指令#include]] における < の扱いなど) 。~
 + ソースファイルを、[[前処理字句>前処理#token]]と[[空白類文字]]の列に分解する。ソースファイル中の前処理字句や[[注釈]]は、途中で途切れることなく完結していなければならない。注釈は、それぞれ 1 個の[[空白文字]]に置き換えられる。改行文字はそのまま残されるが、改行文字以外の空白類文字からなる列を、単一の空白文字に置き換えるか、そのまま残されるかは[[処理系定義]]である。ソースファイル中の文字の列を前処理字句の列に分解する処理は、文脈に依存する ([[#include>前処理#include]] における < の扱いなど) 。~
 ~
 + [[前処理指令]]を実行し、[[マクロ]]呼出しが展開される。[[字句連結]]の結果として、国際文字名が生じた場合の動作は未定義とする。前処理指令 [[#include>前処理指令#include]] によって取り込まれた[[ヘッダ]]またはソースファイルに対して、それぞれ1.〜4.の段階の処理を[[再帰的>再帰呼出し]]に行う。~
 + [[前処理指令>前処理#directive]]を実行し、[[マクロ]]呼出しが展開される。[[字句連結]]の結果として、国際文字名が生じた場合の動作は未定義とする。前処理指令 [[#include>前処理#include]] によって取り込まれた[[ヘッダ]]またはソースファイルに対して、それぞれ1.〜4.の段階の処理を[[再帰的>再帰呼出し]]に行う。~
 ~
 + [[文字リテラル>リテラル#character]]と[[文字列リテラル>リテラル#string]]の中の文字 (ソース文字集合の文字、逆斜線表記、国際文字名) を、それぞれ[[実行文字集合]]の文字に変換する。~
 ~
 + 隣接する[[文字列リテラル>リテラル#string]]および[[ワイド文字列リテラル>リテラル>wide-string]]を連結する ([[C99>C の歴史#C99]] では、[[ワイド文字列リテラル>リテラル#wide-string]]に通常の[[文字列リテラル>リテラル#character]]が連結できるが、[[C++]] では同種の[[文字列リテラル>リテラル#character]]同士でなければ連結できない) 。~
 ~
 + この段階以降では、[[字句]]を区切っている[[空白類]]は意味を持たない。それぞれの前処理字句は字句に変換され、この結果得られた字句の列を、構文解析および意味解析して翻訳が行われる。~
 ~
 + [[翻訳済み翻訳単位]]および[[具現化単位]]を[[結合]]する。まず、それぞれの翻訳済み翻訳単位が調べられ、必要な[[具現化]]の一覧表が作られる。必要な[[テンプレート]]の定義が見つけ出される。このとき、それらの定義を含んだ[[翻訳単位]]のソースが必要となるかどうかは処理系定義である。必要な具現化がすべて行われ、具現化単位が作られる。~
 ~
 + 外部[[オブジェクト>C++ オブジェクトモデル#object]]および外部[[関数]]への参照を解決する。[[ライブラリ]]の構成要素を結合することで、その翻訳単位の中で定義されていない関数や[[オブジェクト>C++ オブジェクトモデル#object]]の外部参照が解決される。こうして翻訳された結果出力を集め、実行環境で実行するために必要となる情報も付加することで、実行形プログラムが生成される。~
 ~

トップ   一覧 単語検索   ヘルプ   最終更新のRSS
 ホーム | プロフィール | メール | ログイン | 管理
Copyright © 2005-2009 by TAKAGI Nobuhisa