JPH0792758B2 - コンパイラおよびコンパイル方法 - Google Patents
コンパイラおよびコンパイル方法Info
- Publication number
- JPH0792758B2 JPH0792758B2 JP4006093A JP609392A JPH0792758B2 JP H0792758 B2 JPH0792758 B2 JP H0792758B2 JP 4006093 A JP4006093 A JP 4006093A JP 609392 A JP609392 A JP 609392A JP H0792758 B2 JPH0792758 B2 JP H0792758B2
- Authority
- JP
- Japan
- Prior art keywords
- program module
- program
- compiler
- module
- compiling
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Lifetime
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
- G06F8/423—Preprocessors
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Description
【0001】
【産業上の利用分野】この発明はモジュール方式のプロ
グラミング言語用のコンパイラに関し、とくにモジュー
ルのインターフェースを自動的に読み込めるようにした
ものである。
グラミング言語用のコンパイラに関し、とくにモジュー
ルのインターフェースを自動的に読み込めるようにした
ものである。
【0002】
【従来の技術】大規模化するソフトウエアの開発に対処
するため、モジュラ・プログラミングという手法が10
数年以上前に提案されている(Parnas, D. " A techniq
ue forsoftware module specification", Comm.ACM 1
5, 5 (May 1972), pp330-336 )。AdaやModula
−2といた言語ではこうしたプログラミングを積極的に
支援する構文をもっているし、Cのように構文上これと
いった支援のない言語によるプログラミングでも、モジ
ュラ・プログラミング風にコードを書くスタイルが広く
実践されている。この手法では、プログラムはモジュー
ル群により構成される。1つのモジュールは、論理的に
関連のあるデータおよび関数の集合体であり、インター
フェースとインプリメンテーションとによって定義され
る。前者は、モジュールを「どう使うか」を規定し、後
者は、「どう実現するか」を表わす。
するため、モジュラ・プログラミングという手法が10
数年以上前に提案されている(Parnas, D. " A techniq
ue forsoftware module specification", Comm.ACM 1
5, 5 (May 1972), pp330-336 )。AdaやModula
−2といた言語ではこうしたプログラミングを積極的に
支援する構文をもっているし、Cのように構文上これと
いった支援のない言語によるプログラミングでも、モジ
ュラ・プログラミング風にコードを書くスタイルが広く
実践されている。この手法では、プログラムはモジュー
ル群により構成される。1つのモジュールは、論理的に
関連のあるデータおよび関数の集合体であり、インター
フェースとインプリメンテーションとによって定義され
る。前者は、モジュールを「どう使うか」を規定し、後
者は、「どう実現するか」を表わす。
【0003】モジュラ・プログラミングの最大の特徴
は、モジュール同志が限定的に連関し合うことである。
すなわち、任意のモジュールMは、それを使用するモジ
ュール(Mのクライアントという)に対して、インター
フェースのみを公開し、Mのインプリメンテーションは
クライアントから完全に隠蔽されるのである。これによ
り、プログラムのある部分に対する修正がプログラム全
体に与える影響を局限化しつつ、プログラム開発を進め
ることができる。インプレメーテーションの修正はクラ
イアントに無関係に行える。
は、モジュール同志が限定的に連関し合うことである。
すなわち、任意のモジュールMは、それを使用するモジ
ュール(Mのクライアントという)に対して、インター
フェースのみを公開し、Mのインプリメンテーションは
クライアントから完全に隠蔽されるのである。これによ
り、プログラムのある部分に対する修正がプログラム全
体に与える影響を局限化しつつ、プログラム開発を進め
ることができる。インプレメーテーションの修正はクラ
イアントに無関係に行える。
【0004】ところで、このようなモジュラ・プログラ
ミングにおいてはモジュールMのクライアントをコンパ
イルするときに、モジュールMのインターフェースを予
め読み込んでおく必要がある。この読み込みの指定は、
言語により様々であるが、いずれにせよ、プログラマの
手作業に任せられている。たとえば、3つのモジュール
Symbol、String、Listを用いるモジュールは、Adaで
は、 with Symbol; with String; with List; という3つのwith節で始まるであろうし、C言語やC++
では、 #include "Symbol.h" #include "String.h" #include "List.h" という3つの#include命令で始まるであろう。但し、こ
こでは、モジュールSymbolのインターフェースは、ファ
イル Symbol.h にあるといった仮定をしている。
ミングにおいてはモジュールMのクライアントをコンパ
イルするときに、モジュールMのインターフェースを予
め読み込んでおく必要がある。この読み込みの指定は、
言語により様々であるが、いずれにせよ、プログラマの
手作業に任せられている。たとえば、3つのモジュール
Symbol、String、Listを用いるモジュールは、Adaで
は、 with Symbol; with String; with List; という3つのwith節で始まるであろうし、C言語やC++
では、 #include "Symbol.h" #include "String.h" #include "List.h" という3つの#include命令で始まるであろう。但し、こ
こでは、モジュールSymbolのインターフェースは、ファ
イル Symbol.h にあるといった仮定をしている。
【0005】このような、プログラマによる明示的な
「読み込み」の管理は、オブジェクト指向の言語ではさ
らに複雑なものとなる。すなわち、オブジェクト指向言
語では、モジュールの間に「継承」に基づく半順序関係
が存在し、モジュールの読み込みの順序もまた、この半
順序関係に従う必要があるからである。
「読み込み」の管理は、オブジェクト指向の言語ではさ
らに複雑なものとなる。すなわち、オブジェクト指向言
語では、モジュールの間に「継承」に基づく半順序関係
が存在し、モジュールの読み込みの順序もまた、この半
順序関係に従う必要があるからである。
【0006】プログラム開発中、その時々のモジュール
が使用するモジュール群は、頻繁に変化する。プログラ
マは、このような頻繁な変化に拘らず、矛盾なく、with
節ないし#include命令を正しい順序で配列する必要があ
り、ソフトウエアの生産性を大きく損ねるものである。
が使用するモジュール群は、頻繁に変化する。プログラ
マは、このような頻繁な変化に拘らず、矛盾なく、with
節ないし#include命令を正しい順序で配列する必要があ
り、ソフトウエアの生産性を大きく損ねるものである。
【0007】
【発明が解決しようとする課題】この発明は以上の事情
を考慮してなされたものであり、コンパイル時に自動的
にインターフェースを読み込んでゆくコンパイラを提供
することを目的としている。このようなコンパイラによ
ると、インターフェースの読み込みはコンパイラが全面
的に管理することになり、読み込みに関するプログラマ
の負担を完全に取り除き、ソフトエアの開発効率を高め
ることができる。
を考慮してなされたものであり、コンパイル時に自動的
にインターフェースを読み込んでゆくコンパイラを提供
することを目的としている。このようなコンパイラによ
ると、インターフェースの読み込みはコンパイラが全面
的に管理することになり、読み込みに関するプログラマ
の負担を完全に取り除き、ソフトエアの開発効率を高め
ることができる。
【0008】
【課題を解決するための手段】この発明では、以上の目
的を達成するため、所定のモジュールをコンパイル中
に、他のモジュールが使用されている局面に遭遇し、か
つ、当該他のモジュールのインターフェースをまだ読み
込んでいないならば、そのインターフェースのあるファ
イルを自動的に探索し、その場で読み込んで構文解析す
るようにしている。ここで、クリアしなければならない
問題点が3つある。(1) モジュールが使用されている局
面をコンパイラが認識できること。(2) モジュール名
と、インターフェースのあるファイル名とを対応づけら
れること。(3) 現在の構文解析を1時中断し、別のテキ
ストの構文解析を始められることである。
的を達成するため、所定のモジュールをコンパイル中
に、他のモジュールが使用されている局面に遭遇し、か
つ、当該他のモジュールのインターフェースをまだ読み
込んでいないならば、そのインターフェースのあるファ
イルを自動的に探索し、その場で読み込んで構文解析す
るようにしている。ここで、クリアしなければならない
問題点が3つある。(1) モジュールが使用されている局
面をコンパイラが認識できること。(2) モジュール名
と、インターフェースのあるファイル名とを対応づけら
れること。(3) 現在の構文解析を1時中断し、別のテキ
ストの構文解析を始められることである。
【0009】第1の問題点の解決手法は、対象となるプ
ログラム言語の構文に依存する。C++では、変数や式の
型、あるいは、トークン、を頼りにこれらの局面を認識
することができる。第2の問題点は、対応づけの規則に
より解決できる。第3の問題点は、パーザ(構文解析を
するルーチン)およびレキサ(字句解析を行なうルーチ
ン)が再入可能であれば解決できる。そして、パーザお
よびレキサを、オブジェクト指向プログラミングにおけ
るオブジェクトとして実現することにより、再入可能な
ものとすることができる。
ログラム言語の構文に依存する。C++では、変数や式の
型、あるいは、トークン、を頼りにこれらの局面を認識
することができる。第2の問題点は、対応づけの規則に
より解決できる。第3の問題点は、パーザ(構文解析を
するルーチン)およびレキサ(字句解析を行なうルーチ
ン)が再入可能であれば解決できる。そして、パーザお
よびレキサを、オブジェクト指向プログラミングにおけ
るオブジェクトとして実現することにより、再入可能な
ものとすることができる。
【0010】
【実施例】以下この発明をC言語をベースにしたオブジ
ェクト指向言語(以下COBと呼ぶことがある)のコン
パイラに適用した実施例について図面を参照して説明し
よう。
ェクト指向言語(以下COBと呼ぶことがある)のコン
パイラに適用した実施例について図面を参照して説明し
よう。
【0011】図1は実施例を全体として示すものであ
り、この図において1はワークステーション、2はオペ
レーティング・システム、3がコンパイラである。ワー
クステーション1は、たとえばインターナショナル・ビ
ジネス・マシーン社のRS6000(商標)である。オ
ペーレーティング・システム2は、たとえばインターナ
ショナル・ビジネス・マシーンズ社のAIX(Advanced
Interactive Executive)である。コンパイラ3はコン
パイラ・オブジェクト4、モジュール名ファイル名変換
探索部5からなり、コンパイラ・オブジェクト4にはモ
ジュール使用局面識別部6も含まれている。コンパイラ
・オブジェクト4、モジュール名ファイル名変換探索部
5およびモジュール使用局面識別部6については後に詳
述する。
り、この図において1はワークステーション、2はオペ
レーティング・システム、3がコンパイラである。ワー
クステーション1は、たとえばインターナショナル・ビ
ジネス・マシーン社のRS6000(商標)である。オ
ペーレーティング・システム2は、たとえばインターナ
ショナル・ビジネス・マシーンズ社のAIX(Advanced
Interactive Executive)である。コンパイラ3はコン
パイラ・オブジェクト4、モジュール名ファイル名変換
探索部5からなり、コンパイラ・オブジェクト4にはモ
ジュール使用局面識別部6も含まれている。コンパイラ
・オブジェクト4、モジュール名ファイル名変換探索部
5およびモジュール使用局面識別部6については後に詳
述する。
【0012】図2〜図4も参照して、Aというモジュー
ルを使用しているFUNC.COB というソース・プログラム
を例にして動作の概略を説明する。なおモジュールAは
モジュールBを使用しているものとする。コンパイラ3
の中心部分はコンパイラ・オブジェクト4である。この
コンパイラ・オブジェクト4がソース・プログラムFUN
C.COBを読み込み、構文解析し、オブジェクト・プログ
ラムFUNC.Cを出力する。ソース・プログラムFUNC.COBの
コンパイル処理が、モジュールAを使用している部分に
進んだとき、図3に示すようにイ)コンパイル・オブジ
ェクト4のモジュール使用局面識別部6がこれを識別
し、ロ) 新たなコンパイラ・オブジェクト4Aを生成
し、ハ)モジュール名ファイル名変換探索部5が、モジ
ュール名から対応するインターフェース・ファイル名A.
hを生成し当該ファイルを見つけ出し、ニ)このファイ
ルがコンパイラ・オブジェクト4Aの入力となる。さら
にコンパイラ・オブジェクト4AによるA.hのコンパイ
ル処理がモジュールBを使用している部分まで進んだと
き、図4のように、コンパイル・オブジェクト4Aのモ
ジュール使用局面識別部6Aがこれを識別し、新たなコ
ンパイラ・オブジェクト4Bが生成され、モジュール名
ファイル名変換探索部5がモジュールBのインターフェ
ースを保持しているファイルB.hを探しだし、これがコ
ンパイラ・オブジェクト4Bの入力ファイルとなる。イ
ンターフェースB.hのコンパイルが終了するとコンパイ
ラ・オブジェクト4Bが消滅し(図3)、コンパイラ・
オブジェクト4AがインターフェースA.hのコンパイル
を再開する。このコンパイルが終了するとコンパイル・
オブジェクト4Aが消滅し(図2)、コンパイル・オブ
ジェクト4がソース・プログラムFUNC.COBのコンパイル
を再開する。すべてのコンパイルが終了するとコンパイ
ル・オブジェクト4も消滅する。
ルを使用しているFUNC.COB というソース・プログラム
を例にして動作の概略を説明する。なおモジュールAは
モジュールBを使用しているものとする。コンパイラ3
の中心部分はコンパイラ・オブジェクト4である。この
コンパイラ・オブジェクト4がソース・プログラムFUN
C.COBを読み込み、構文解析し、オブジェクト・プログ
ラムFUNC.Cを出力する。ソース・プログラムFUNC.COBの
コンパイル処理が、モジュールAを使用している部分に
進んだとき、図3に示すようにイ)コンパイル・オブジ
ェクト4のモジュール使用局面識別部6がこれを識別
し、ロ) 新たなコンパイラ・オブジェクト4Aを生成
し、ハ)モジュール名ファイル名変換探索部5が、モジ
ュール名から対応するインターフェース・ファイル名A.
hを生成し当該ファイルを見つけ出し、ニ)このファイ
ルがコンパイラ・オブジェクト4Aの入力となる。さら
にコンパイラ・オブジェクト4AによるA.hのコンパイ
ル処理がモジュールBを使用している部分まで進んだと
き、図4のように、コンパイル・オブジェクト4Aのモ
ジュール使用局面識別部6Aがこれを識別し、新たなコ
ンパイラ・オブジェクト4Bが生成され、モジュール名
ファイル名変換探索部5がモジュールBのインターフェ
ースを保持しているファイルB.hを探しだし、これがコ
ンパイラ・オブジェクト4Bの入力ファイルとなる。イ
ンターフェースB.hのコンパイルが終了するとコンパイ
ラ・オブジェクト4Bが消滅し(図3)、コンパイラ・
オブジェクト4AがインターフェースA.hのコンパイル
を再開する。このコンパイルが終了するとコンパイル・
オブジェクト4Aが消滅し(図2)、コンパイル・オブ
ジェクト4がソース・プログラムFUNC.COBのコンパイル
を再開する。すべてのコンパイルが終了するとコンパイ
ル・オブジェクト4も消滅する。
【0013】つぎにコンパイラ・オブジェクト4の作成
方法について説明する。コンパイラ・オブジェクトは、
いわゆるオブジェクト指向プログラミングでいうところ
のオブジェクトであり、従って、現実のプログラミング
では、「コンパイラ・クラス」を作成することになる。
方法について説明する。コンパイラ・オブジェクトは、
いわゆるオブジェクト指向プログラミングでいうところ
のオブジェクトであり、従って、現実のプログラミング
では、「コンパイラ・クラス」を作成することになる。
【0014】この作成法の特徴は、ゼロからコンパイラ
・クラスを作成するのではなく、AIXにおいて普通の
方法で生成されるパーザとレキサをC言語をベースにし
たオブジェクト指向プログラム言語(COB)のクラス
に変換することによりコンパイラ・クラスを作成する点
にある。すなわち、コンパイラ・クラスは、クラス化さ
れたパーザ(パーザ・クラス)およびクラス化されたレ
キサ(レキサ・クラス)よりなる。
・クラスを作成するのではなく、AIXにおいて普通の
方法で生成されるパーザとレキサをC言語をベースにし
たオブジェクト指向プログラム言語(COB)のクラス
に変換することによりコンパイラ・クラスを作成する点
にある。すなわち、コンパイラ・クラスは、クラス化さ
れたパーザ(パーザ・クラス)およびクラス化されたレ
キサ(レキサ・クラス)よりなる。
【0015】AIXでは、パーザおよびレキサは通常パ
ーザ生成器yaccおよびレキサ生成器lexを使って作成さ
れる。yaccは、構文規則を記述したファイルを入力とし
て受け取り、yaccparというファイルを基本にして、yyp
arse()という関数(パーザ)などを含んだCのプログラ
ムを生成する。同様に、lexは、字句パターンを記述し
たファイルを入力として受け取り、ncformというファイ
ルを基本にして、yylex()という関数(レキサ)などを
含んだCのプログラムを生成する。
ーザ生成器yaccおよびレキサ生成器lexを使って作成さ
れる。yaccは、構文規則を記述したファイルを入力とし
て受け取り、yaccparというファイルを基本にして、yyp
arse()という関数(パーザ)などを含んだCのプログラ
ムを生成する。同様に、lexは、字句パターンを記述し
たファイルを入力として受け取り、ncformというファイ
ルを基本にして、yylex()という関数(レキサ)などを
含んだCのプログラムを生成する。
【0016】さて、このように生成されるCのプログラ
ムであるパーザやレキサを、COBのクラスであるパー
ザ・クラスおよびレキサ・クラスに変換していくのであ
る、ここでまず、第1表に、COBにおけるクラス定義
の一般的な構文を示しておく。また、第2表および第3
表に、パーザ・クラスおよびレキサ・クラスのインター
フェースをそれぞれ示しておく。CのプログラムをCO
Bのクラスに変換するには、Cの大域変数をCOBのイ
ンスタンス変数またはコモン変数に、Cの関数をCOB
のインスタンス関数またはコモン関数になるように、C
のプログラムに一連のテキスト処理をほどこす(図
5)。このとき、yaccとlexのテンプレートであるyaccp
arとncformをそれぞれ第4表および第5表のように予め
修正しておく。また、フィルタ1〜3は、第6〜8表に
示すようなedスクリプトあるいはsedスクリプトであ
る。前者はAIXのエディタed用のプログラムであり、
後者はAIXのストリーム・エディタsed用のプログラ
ムである。
ムであるパーザやレキサを、COBのクラスであるパー
ザ・クラスおよびレキサ・クラスに変換していくのであ
る、ここでまず、第1表に、COBにおけるクラス定義
の一般的な構文を示しておく。また、第2表および第3
表に、パーザ・クラスおよびレキサ・クラスのインター
フェースをそれぞれ示しておく。CのプログラムをCO
Bのクラスに変換するには、Cの大域変数をCOBのイ
ンスタンス変数またはコモン変数に、Cの関数をCOB
のインスタンス関数またはコモン関数になるように、C
のプログラムに一連のテキスト処理をほどこす(図
5)。このとき、yaccとlexのテンプレートであるyaccp
arとncformをそれぞれ第4表および第5表のように予め
修正しておく。また、フィルタ1〜3は、第6〜8表に
示すようなedスクリプトあるいはsedスクリプトであ
る。前者はAIXのエディタed用のプログラムであり、
後者はAIXのストリーム・エディタsed用のプログラ
ムである。
【0017】
【0018】
【0019】
【0020】 [第4表 修正版yaccpar] #ifdef COB #else int yydebug; /* set to 1 to get debugging */ #endif (同一につき略) /* ** global variables used by the parser */ #ifdef COB #include "/usr/local/cob/lib/lex.dec" #include "/usr/local/cob/lib/yacc.dec" class impl Yacc { class Lex lex; YYSTYPE yyval; YYSTYPE yyv[ YYMAXDEPTH ]; /* value stack */ int *yys; /* state stack */ int yypv; int yypvt; int *yyps; /* top of state stack */ int yystate; /* current state */ int yytmp; /* extra var (lasts between blocks) */ int yynerrs; /* number of errors */ int yyerrflag; /* error recovery flag */ int yychar; /* current input token number */ definition: void init(class Lex lex){ self->lex=lex; self->yys=(int*)malloc(sizeof(int)*YYMAXDEPTH); } /* ** yyparse - return 0 if worked, 1 if syntax error not recovered from */ int yyparse(void){ #else YYSTYPE yyv[ YYMAXDEPTH ]; /* value stack */ int yys[ YYMAXDEPTH ] ; /* state stack */ YYSTYPE *yypv; /* top of value stack */ YYSTYPE *yypvt; /* top of value stack for $vars */ int *yyps; /* top of state stack */ int yystate; /* current state */ int yytmp; /* extra var (lasts between blocks) */ int yynerrs; /* number of errors */ int yyerrflag; /* error recovery flag */ int yychar; /* current input token number */ /* ** yyparse - return 0 if worked, 1 if syntax error not recovered from*/ int yyparse() {#endif (同一につき略) #ifdef COB }; #endif
【0021】 [第5表 修正版ncform] #ifdef から #else、および、#endif が新たに追加された部分である。-DCOBオ プションでCOBの処理系にかけられたときのみ、変更が有効になる点に注意さ れたい。 . . #ifdef COB #include "/usr/local/cob/lib/lex.dec" class impl Lex { int yyleng; int yymorfg; int yytchar; FILE *yyin = {stdin}, *yyout = {stdout}; struct yysvf *yyestate; /* ::instance:: */ int yylineno =1; char *yytext; YYLMAX struct yysvf **yylstate; YYLMAX struct yysvf **yylsp, **yyolsp; char *yysbuf; YYLMAX char *yysptr; = yysbuf; int *yyfnd; int yyprevious = YYNEWLINE; int yylook(void); int yyback(int *,int); definition: overload void init(void){ self->yysptr=self->yysbuf=malloc(YYLMAX); self->yytext=malloc(YYLMAX); self->yylstate=(struct yysvf**)malloc(sizeof(struct yysvf*)*YYLM AX); } overload void init(FILE *in){ self->yyin=in; self->init(); } overload void init(FILE *in,FILE *out){ self->yyin=in; self->yyout=out; self->init(); } int yylex(void){ int nstr; /* ::yylex:: */ int yylook(void){ #else int yylineno =1; char yytext[YYLMAX]; struct yysvf *yylstate [YYLMAX], **yylsp, **yyolsp; char yysbuf[YYLMAX]; char *yysptr = yysbuf; int *yyfnd; extern struct yysvf *yyestate; int yyprevious = YYNEWLINE; yylook(){ #endif (同一につき略) #ifdef COB int yyback(int *p, int m){ if (p==0) return(0); while (*p) { if (*p++ == m) return(1); } return(0); } /* the following are only used in the lex library */ int yyinput(void){ return(input()); } void yyoutput(int c){ output(c); } void yyunput(int c){ unput(c); } }; #else yyback(p, m) int *p; {if (p==0) return(0); while (*p) { if (*p++ == m) return(1); } return(0); } /* the following are only used in the lex library */ yyinput(){ return(input()); } yyoutput(c) int c; { output(c); } yyunput(c) int c; { unput(c); } #endif
【0022】
【0023】 [第7表 パーザ・クラスYaccの作成用sedスクリプ]】 /static yyf/,/static (\*yyf\[\ )/s/yyval/(self->yyval)/g /static yyf/,/static (\*yyf\[\ )/s/yypvt/(self->yypvt)/g /static yyf/,/static (\*yyf\[\ )/s/yyv\[/(self->yyv)[/g /static yyf\([0-9 *\)() {/s int yyf\1(class Yacc self) {/g /static (\*yyf\[\ )()/s int (*yyf[ )(class Yacc)/g /extern int (\*yyf\[\ )();/d /(\*yyf\[yytmp\ )()/s (*yyf[yytmp )(self)/g /#define yyclearin yychar = -1/s/yychar/self->yychar/g /#define yyerrok yyerrflag = 0/s/yyerrflag/self->yyerrflag/g
【0024】
【0025】つぎにコンパイラ・オブジェクトのモジュ
ール使用局面識別部6について説明する。この識別部6
は変数や式の型またはトークンに基づいて未知のモジュ
ールの使用局面を識別するものである。プログラム言語
COBにおけて、モジュール(COBでいうところのク
ラス)の使用局面は、 1)クラスのコモンメンバへのアクセス 2)クラスのインスタンスメンバへのアクセス 3)クラス型の式の比較 4)クラス型の式の代入 5)クラス型の式の型変換 6)クラスの継承、の6つがある。これらの識別は、字
句解析あるいは構文解析に基づいておこなわれ、従っ
て、COBではモジュール使用局面識別部は、コンパイ
ラ・オブジェクトの構文解析部および字句解析部に埋め
込まれる。
ール使用局面識別部6について説明する。この識別部6
は変数や式の型またはトークンに基づいて未知のモジュ
ールの使用局面を識別するものである。プログラム言語
COBにおけて、モジュール(COBでいうところのク
ラス)の使用局面は、 1)クラスのコモンメンバへのアクセス 2)クラスのインスタンスメンバへのアクセス 3)クラス型の式の比較 4)クラス型の式の代入 5)クラス型の式の型変換 6)クラスの継承、の6つがある。これらの識別は、字
句解析あるいは構文解析に基づいておこなわれ、従っ
て、COBではモジュール使用局面識別部は、コンパイ
ラ・オブジェクトの構文解析部および字句解析部に埋め
込まれる。
【0026】上の6つの局面のうち最初の1つが字句解
析部で識別され、残りは構文解析部で識別される。CO
Bコンパイラ・オブジェクトの字句解析部は、lexに
「字句パターン」を与えることにより生成されるが、局
面1を識別する部分に対応する字句パターンを、第9表
に掲げる。 また、COBコンパイラ・オブジェクトの
構文解析部はyaccに「構文規則」を与えることにより生
成されるが、局面2〜6を識別する部分に対応する構文
規則を、第10表に示す。
析部で識別され、残りは構文解析部で識別される。CO
Bコンパイラ・オブジェクトの字句解析部は、lexに
「字句パターン」を与えることにより生成されるが、局
面1を識別する部分に対応する字句パターンを、第9表
に掲げる。 また、COBコンパイラ・オブジェクトの
構文解析部はyaccに「構文規則」を与えることにより生
成されるが、局面2〜6を識別する部分に対応する構文
規則を、第10表に示す。
【0027】 [第9表 局面1を識別する部分に対応する字句パターン] ({letter}|_)({letter}|{digit}|_)*{blank}*"@"{blank}*{ident}
【0028】 [第10表 局面2〜6を識別する部分に対応する構文規則] expression | primary_expression ARROW field_name /* 局面2 */ | expression EQ expression /* 局面3 */ | expression ^=^ expression /* 局面4 */ | ^(^ type_name ^)^ expression %prec UNOP /* 局面5 */ class_declaration | CLASS class_name ^<^ superclass_list ^{^ /* 局面6 */
【0029】つぎにモジュール名ファイル名変換探索部
5について説明する。この変換探索部5は、基本的に、
モジュール名Mからファイル名M.hを生成し、カレント・
ディレクトリ上でこの名前のファイルを探索する。しか
し、このような固定的な変換だけでは実用上不十分であ
るので、次のような3種類のカスタマイズ用コマンドを
用意している。これらのコマンドは、コンパイラ起動時
のオプションという形で与えられる。 (1) path <テ゛ィレクトリ名> : 探索するディレクトリを指
定する。複数存在するときは、複数のディレクトリをオ
プションの指定順に探索する。 (2) tail <テイル名> : インターフェースのあるファ
イルの拡張子を指定する。複数存在するときは、指定順
に使用され、最初に発見されたファイルが読み込まれ
る。 (3) map <モシ゛ュ-ル名> <ヘ゛-ス名> : 第1引数で指定され
るモジュールのインターフェースが、第2引数で指定さ
れるベース名をもつファイルに存在することを指示す
る。
5について説明する。この変換探索部5は、基本的に、
モジュール名Mからファイル名M.hを生成し、カレント・
ディレクトリ上でこの名前のファイルを探索する。しか
し、このような固定的な変換だけでは実用上不十分であ
るので、次のような3種類のカスタマイズ用コマンドを
用意している。これらのコマンドは、コンパイラ起動時
のオプションという形で与えられる。 (1) path <テ゛ィレクトリ名> : 探索するディレクトリを指
定する。複数存在するときは、複数のディレクトリをオ
プションの指定順に探索する。 (2) tail <テイル名> : インターフェースのあるファ
イルの拡張子を指定する。複数存在するときは、指定順
に使用され、最初に発見されたファイルが読み込まれ
る。 (3) map <モシ゛ュ-ル名> <ヘ゛-ス名> : 第1引数で指定され
るモジュールのインターフェースが、第2引数で指定さ
れるベース名をもつファイルに存在することを指示す
る。
【0030】プログラム言語COBにおける実施例で
は、モジュール名ファイル名変換探索部5は、3つの変
数によって制御されているが、これらを初期値(デフォ
ルト値)とともに第11表に示す。また、上記の3つの
オプションはこれらの変数の値をかえていくわけだが、
各オプションに対応するプログラム部分の概要を第12
表に示す。また、これら3つの変数に制御される、変換
探索部の主要部のプログラムの概要を第13表に掲げ
る。
は、モジュール名ファイル名変換探索部5は、3つの変
数によって制御されているが、これらを初期値(デフォ
ルト値)とともに第11表に示す。また、上記の3つの
オプションはこれらの変数の値をかえていくわけだが、
各オプションに対応するプログラム部分の概要を第12
表に示す。また、これら3つの変数に制御される、変換
探索部の主要部のプログラムの概要を第13表に掲げ
る。
【0031】 [第11表 モジュール名ファイル名変換探索部を制御する変数] stringlist pathlist=("."); stringlist taillist=(".h"); map[string,string] kmmap=(); /* empty */
【0032】 [第12表] モジュール名ファイル名変換探索部の制御変数を変更するプログラム部分 void path(string pathname){ pathlist=cons(pathname,pathlist); } void tail(string tail){ taillist=cons(tail,taillist); } void map(string classname, string modulename){ map_put(kmmap,classname,modulename); }
【0033】 [第13表 モジュール名ファイル名変換探索部の主要プログラム部分] /* * open an interface file * corresponding to class named ^kname^. */ FILE *mopen(string kname){ string mname; FILE *fp; if ((mname=map_get(kmmap,kname))!=NULL){ /* mapがあればそれを使う */ return mopen_search(mname); } else { for t in tallist { /* extensionの候補を1つづ試してみる */ mname=strcat(kname,t) if ((fp=mopen_search(mname))!=NULL) return fp; } return NULL; } } FILE *mopen_search(string mname){ FILE *fp; for p in pathlist { /* pathlist中のdirectoryを1つづつ探索してみる * / if ((fp=fopen(strcat(p,"/",mname),"r"))!=NULL) /* 見つかった */ return fp; } return NULL; /* どこにもなかった */ }
【0034】
【発明の効果】以上説明したようにこの発明によればモ
ジュラ・プログラミングにおいてインターフェースの読
み込みの指定をプログラマが行う必要がなくなり、ソフ
トウェアの生産性が向上する。
ジュラ・プログラミングにおいてインターフェースの読
み込みの指定をプログラマが行う必要がなくなり、ソフ
トウェアの生産性が向上する。
【図1】 この発明の実施例を示すブロック図である。
【図2】 実施例の動作説明図である。
【図3】 実施例の動作説明図である。
【図4】 実施例の動作説明図である。
【図5】 実施例のコンパイラ・オブジェクトを説明す
るブロック図である。
るブロック図である。
3…コンパイラ、4…コンパイラ・オブジェクト 5…
モジュール名ファイル名変換探索部、6…モジュール使
用局面識別部。
モジュール名ファイル名変換探索部、6…モジュール使
用局面識別部。
Claims (6)
- 【請求項1】 仕様を規定する第1の部分と機能を実現
する第2の部分とからなるプログラム・モジュールを利
用したソース・プログラムをコンパイルするコンパイラ
において、 ソース・プログラムのコンパイル中にプログラム・モジ
ュールの使用局面に遭遇したことを検出するプログラム
・モジュール使用局面検出手段と、 上記検出に応じて現在のコンパイルを中断させる手段
と、 上記検出に応じて当該プログラム・モジュールの第1の
部分を自動的に探索する手段と、 自動的に読む込んだ上記プログラム・モジュールの第1
の部分をコンパイルする手段と、 上記プログラム・モジュールの第1の部分のコンパイル
を終了したのち上記中断したコンパイルを再開させる手
段とを有することを特徴とするコンパイラ。 - 【請求項2】 上記プログラム・モジュール使用局面検
出手段は変数の式の型およびトークンに基づいてプログ
ラム・モジュールの使用局面を検出する請求項1記載の
コンパイラ。 - 【請求項3】 上記自動読み込み手段は、モジュール名
と当該モジュールの第1の部分のファイル名とをマッピ
ングする手段と、マッピングにより特定されたファイル
を探索する手段とからなる請求項1または2記載のコン
パイラ。 - 【請求項4】 仕様を規定する第1の部分と機能を実現
する第2の部分とからなるプログラム・モジュールを利
用したソース・プログラムをコンパイルするコンパイラ
において、 コンパイラ・オブジェクトを作成する手段と、 上記コンパイラ・オブジェクトでソース・プログラムを
コンパイルしているときに、プログラム・モジュールの
使用局面に遭遇したことを検出するプログラム・モジュ
ール使用局面検出手段と、 上記検出に応じて現在動作中のコンパイラ・オブジェク
トを中断させる手段と、 上記検出に応じて当該プログラム・モジュールの第1の
部分を自動的に探索する手段と、 自動的に探し出した上記プログラム・モジュールの第1
の部分を新たなコンパイラ・オブジェクトにコンパイル
させる手段と、 上記プログラム・モジュールの第1の部分をコンパイル
したのち上記中断したコンパイラ・オブジェクトによる
コンパイルを再開させる手段とを有することを特徴とす
るコンパイラ。 - 【請求項5】 仕様を規定する第1の部分と機能を実現
する第2の部分とからなるプログラム・モジュールを利
用したソース・プログラムをコンパイルするコンパイル
方法において、 コンパイラ・オブジェクトでソース・プログラムを解析
しているときに、プログラム・モジュールの使用局面に
遭遇したことを検出するステップと、 上記検出に応じて現在動作中のコンパイラ・オブジェク
トを中断させるステップと、 上記検出に応じて当該プログラム・モジュールの第1の
部分を自動的に探し出すステップと、 自動的に探し出した上記プログラム・モジュールの第1
の部分を新しいコンパイラ・オブジェクトでコンパイル
するステップと、 上記プログラム・モジュールの第1の部分をコンパイル
したのち上記中断したコンパイラ・オブジェクトによる
コンパイルを再開させるステップとを有することを特徴
とするコンパイル方法。 - 【請求項6】 仕様を規定する第1の部分と機能を実現
する第2の部分とからなるプログラム・モジュールを利
用したソース・プログラムをコンパイルするためにコン
ピュータ上で実行可能なプログラム製品において、 コンパイラ・オブジェクトでソース・プログラムを解析
しているときに、プログラム・モジュールの使用局面に
遭遇したことを検出するステップと、 上記検出に応じて現在動作中のコンパイラ・オブジェク
トを中断させるステップと、 上記検出に応じて当該プログラム・モジュールの第1の
部分を自動的に探し出すステップと、 自動的に探し出した上記プログラム・モジュールの第1
の部分を新しいコンパイラ・オブジェクトでコンパイル
するステップと、 上記プログラム・モジュールの第1の部分をコンパイル
したのち上記中断したコンパイラ・オブジェクトによる
コンパイルを再開させるステップと上記コンピュータに
実行させることをを特徴とするコンパイル用プログラム
製品。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP4006093A JPH0792758B2 (ja) | 1992-01-17 | 1992-01-17 | コンパイラおよびコンパイル方法 |
US08/454,446 US5560015A (en) | 1992-01-17 | 1995-05-30 | Compiler and method of compilation |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP4006093A JPH0792758B2 (ja) | 1992-01-17 | 1992-01-17 | コンパイラおよびコンパイル方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
JPH05265771A JPH05265771A (ja) | 1993-10-15 |
JPH0792758B2 true JPH0792758B2 (ja) | 1995-10-09 |
Family
ID=11628905
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP4006093A Expired - Lifetime JPH0792758B2 (ja) | 1992-01-17 | 1992-01-17 | コンパイラおよびコンパイル方法 |
Country Status (2)
Country | Link |
---|---|
US (1) | US5560015A (ja) |
JP (1) | JPH0792758B2 (ja) |
Families Citing this family (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5745749A (en) * | 1994-06-27 | 1998-04-28 | International Business Machines Corp. | Method and system of file version clustering of object blocks using a compiler and database and having a predetermined value |
US5978587A (en) * | 1997-11-13 | 1999-11-02 | Unisys Corp. | Method for propagating source code locations into objects in a compiler |
US5978586A (en) * | 1997-11-26 | 1999-11-02 | Unisys Corp. | Method for tracking changes in source locations in a compiler |
US6072952A (en) * | 1998-04-22 | 2000-06-06 | Hewlett-Packard Co. | Method and apparatus for coalescing variables |
US6202201B1 (en) | 1998-09-23 | 2001-03-13 | Netcreate Systems, Inc. | Text object compilation method and system |
US6173441B1 (en) | 1998-10-16 | 2001-01-09 | Peter A. Klein | Method and system for compiling source code containing natural language instructions |
US7822495B2 (en) * | 2002-04-15 | 2010-10-26 | Fisher-Rosemount Systems, Inc. | Custom function blocks for use with process control systems |
US7062755B2 (en) * | 2002-10-16 | 2006-06-13 | Hewlett-Packard Development Company, L.P. | Recovering from compilation errors in a dynamic compilation environment |
CN101246486B (zh) * | 2007-02-13 | 2012-02-01 | 国际商业机器公司 | 用于改进的表达式处理的方法和装置 |
Family Cites Families (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5345086A (en) * | 1962-11-28 | 1994-09-06 | Eaton Corporation | Automatic map compilation system |
US4885684A (en) * | 1987-12-07 | 1989-12-05 | International Business Machines Corporation | Method for compiling a master task definition data set for defining the logical data flow of a distributed processing network |
JPH0279127A (ja) * | 1988-09-14 | 1990-03-19 | Fujitsu Ltd | フォートラン・コンパイル処理方式 |
US5182806A (en) * | 1989-06-30 | 1993-01-26 | Digital Equipment Corporation | Incremental compiler for source-code development system |
US5170465A (en) * | 1989-06-30 | 1992-12-08 | Digital Equipment Corporation | Incremental-scanning compiler for source-code development system |
US5204960A (en) * | 1990-01-08 | 1993-04-20 | Microsoft Corporation | Incremental compiler |
-
1992
- 1992-01-17 JP JP4006093A patent/JPH0792758B2/ja not_active Expired - Lifetime
-
1995
- 1995-05-30 US US08/454,446 patent/US5560015A/en not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
JPH05265771A (ja) | 1993-10-15 |
US5560015A (en) | 1996-09-24 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10698682B1 (en) | Computerized software development environment with a software database containing atomic expressions | |
US5361357A (en) | Method and apparatus for optimizing computer file compilation | |
US5680622A (en) | System and methods for quickly detecting shareability of symbol and type information in header files | |
US6182281B1 (en) | Incremental compilation of C++ programs | |
US5249275A (en) | Apparatus and method enabling a compiled program to exactly recreate its source code | |
US7120898B2 (en) | Intermediate representation for multiple exception handling models | |
Burson et al. | A program transformation approach to automating software re-engineering | |
US6961931B2 (en) | Dependency specification using target patterns | |
US5367683A (en) | Smart recompilation of performing matchup/difference after code generation | |
US11294665B1 (en) | Computerized software version control with a software database and a human database | |
US5625822A (en) | Using sorting to do matchup in smart recompilation | |
JPH0792758B2 (ja) | コンパイラおよびコンパイル方法 | |
US5446899A (en) | Hint generation in smart recompilation | |
Emmerich et al. | Object-oriented database management systems for construction of CASE environments | |
US5535392A (en) | Using hint generation to cause portions of object files to remain the same | |
Koskimies et al. | The design of a language processor generator | |
Hume | Mk: a successor to make | |
GB2420638A (en) | Method of substituting code fragments in Internal Representation | |
Yang et al. | Identifying the within-statement changes to facilitate change understanding | |
Heldal et al. | Partial evaluation and separate compilation | |
EP0202007A2 (en) | A generator of program generators | |
Kazerooni-Zand et al. | Minimizing ripple recompilation in a persistent software environment | |
Teodosiu | Hare: An optimizing portable compiler for Scheme | |
Lutz | Program debugging by near-miss recognition and symbolic evaluation | |
Trimble et al. | The Study of the Transfer of Interrupted Computations between Computers and SAEC-0 User's Manual. |