プ ロ グ ラ ミン グ言 語 変 換 シ ス テ ム の 開 発
第 1報 PAD トランス レー タの開発 堀内征治 堀内泰輔
A Development of a System for Program Transformation
( T h e f i r s t r e p o r t : A S y s t e m f o r t h e T r a n s f o r m a t i o n o f P r o b l e m A n a l y s i s D i a g r a m )
Seiji HORIUCHI Taisuke HORIUCHI
In the developmentofsoftware, tllereare many prOgraming langllageS. In recentyears,structuredprograminglanguages‑ C,structured Basic andsoon‑
havebeen used forprograming instead ofearlier languages‑Fortran,Basic, as・
semblylanguageetc.Therefore,itisimportanttomakeatransformation between these two programing languages. Butitisnotsoeasytomakesoftwareforthe transformation.
In thispaper,an intermediatelanguage issuggestedinordertomakeiteasy todevelopthetransformation software.Onthebasisofdesigningtheintermediate language,atransformationsystem forPAD hasbeendeveloped.
Thistransformationsystem hastwoessentialsubsystems.Inthe丘rstsubsystem
,
PAD drawnontheCRT screenistransformedintoasourceprogram oftheinterme・diatelanguage.And then in thesecond one,thesourceprogram istransformed intothetargetlanguage,suchasC,Basic,andsoon.
1
.は じ め に
‑‑ ドウェア技術の驚異的な発展に追随するかたちで, ソフ トウェアの面で も幾多のプロ グラミング言語の提案が行なわれ,最近では構造化 プログラ ミング指向の言語 (た とえ はC 言語や構造化BASI
C)が注 目され 着実にユーザ数を増加 させている.
一方, これまでに蓄積 したプログラム群が足かせ となって,言語の切 り替えが困難なユー ザが多いことも事実である. このような事情か ら最近では特定言語間のソースレベルでの変 換 ユーティ リティが市販 され るようになった. しか し, このようなユーティ リテ ィを開発す る場合,変換前後の両言語間の差異のみに注目す るため,ほかの
2言語間の変換 ユーテ ィリ テ ィを再開発す る際には,それ までに開発 したプログラムをほ とん ど活かす ことができず, 結果的に多大の労力を強いられることになるだろ う.
* 横桟工学科 助教授
* * 機械工学科 講師
原稿受付 平成元年
9月
30日
堀内征治 ・堀内泰輔
本研究は, これ らの状況に鑑み,プ ログラミソグ言語間の汎用的な変換 システムの開発を 目標 としている・つ ま り,文法や差異をデータベース として串述するだけで, プログラムの 変更は一切不要に した ものである.この目的を実現するためのひ とつの方法 として中間言語 を用いることが考えられ る.つ ま り,変換す る言語をいったん共通基盤 としての中間言語に 変換 し,次にその中間言語をターゲッ ト言語に変換するとい う2 段階に分割化する方法であ
る.
本報では第一段階 として,中間言語 のアイデアを もとに した
PADトランス レータについ て述べる
・PAI)は, 7°‑チャー トに代わ声,構造化 プログラ ミング用 のツールとして注 目されているものであ り,今回開発 したのは,画面上に描いた
PADを自動的に中間言語に 変換す るものである・. さらに,得 られた中間言語テキス Iを . C 言語などの実際 のプログラ ミ ング言語に変換するツール も開発 した.また, このシステムが特に情報処理教育に有用であ ることにも言及す る.
2.
中間言語の設計
2‑1中間言語について
中間言語の考え方は,例えは; コンパイラを作成するときに用い られ る.図
1は
UNIXシステムにおける
C言語 コンパイラの処理過程を示す. この場合, アセンブ リ言語が中間言 語 として位置づけ られ,他の言語 ( 例 えば
FORTRAN77)か らの同様な中間言語出力 とア センブ リ言語 レベルで結合 され,最終的に機械語か らなる実行可能プログラムに変換 される.
この仕組みは直接機械語に翻訳す るのに比べ手間がかか るが, コンパイラの開発効率,汎用 性か らみて有用 な手法 といえる.
本稿で提案す る中間言語は, これを高級言語間変換のレベルにまで拡張 しよ うとす るもの で,図 弓には従来の中間言語を用 いずに直接変換す る方法 と本方法を対比 して示 した・本方 法を
3つ以上の言語間相互変換に適用すると大 きなメ リッ トを生ず る.つ ま り,特定言語を 中間言語に変換す るためのツール とその逆方向の変換 ツールを一度開発 しておけば,別の言 語への ( あるいは,特定言語か らの)変換が必要になった場合, この新たな言語に関する同 様 な 2 つのツールを開発す るだけでよ く,あ とはこ うしてできた 4 つのツールを組み合わせ ることで 目的が達成できる.これを従来の方法で行なお うとす ると,双方 の特定言語を意識 しつつ ツール開発を行な う必要があ り, また他の言語 との変換が必要になった ときにせっか く開発 したツールがほ とんど利用できないこと. になる. この点中間言語を用いれば, 1度開 発 した ツールは何度 も再利用できる点で優れている・
2‑2
中間言語の設計
まえがきで述べたように, プログラム変換の必要性は従来の比較的低機能な言語 ( 以後, 低言語 と呼ぶ)か ら,,最近注 目されている 構造化 プログラ ミング を意識 した 高機能な言語 ( 以後,高言語 と呼ぶ)‑の変換 (これを,低高変換 と呼ぶ ことにする)が主であ り,例え はC 言語か ら BASI C といった逆方向の変換 ( 高低変換)はあま りニーズがない とみてよい.
ただ,高言語間の相互変換は必要であろ う.
このような実状を考慮 して,中間言語のレベルを高言語,低言語のどちらに置 くかを検討
図
1 UNIX(4.2/3)におけ る
Cコソ′ tイルの処理過程
( a ) 直接変換 O ) ) 中間言語を仲介とした変換
図 2 2 つのプt ]グラム変換方法
4
堀内征治 ・堀内泰輔
す る必要がある.一般に低高変換は,高言語の低言語以上 の機能を犠牲にすれば容易である.
逆 に高低変換は展開を要するため極めて困難 といえる.低言語間,高言語間の変換は,高低 変換に比べれば容易である. この考察か ら,中間言語を低言語にすると,高言語間の変換を す る際に高低変換が必要にな り不利になる.一方中間言語を高言語にすれば, この問題は生
じない. このことか ら,中間言語の機能を豊富にすることが低高変換においては重要 となる.
前述のように,通常は高低変換の必要性はあま りないが,情報処理教育の面か ら見ると, これ も必要になる.つ ま り,構造化言語を教育 したいが,現実にはそのための資源がな く, BASI C 等の非構造化言語で 教育せざるを得ない とき に,構造化 フローチャー トと して の PAD や構造的な疑似言語を援用する場合, これ ら高言語か ら BASI C 等の低言語への高低 変換 ツールが必要 となる.以上のことか ら, このような高低変換においては,中間言語のレ ベルを高言語,低言語のどちらに匿いても差異はない といえる.
表
l中間言語 の文法
く 7 ● ロ ケ ■
ラム〉::= く ス テ I t J 州〉く く ス テ I Hyト 〉 )
く ス テ ー 日ソト 〉・ . ・ . ;く代入文 〉 lく 入 力文 〉 lく出力文 〉r く d i l n 文 〉 tく制御文 〉 く代入文 〉:: ;く変数〉≡く式 〉ls y a p く 変 数〉.く 変数 〉
く入力文 〉 : : … i n く変数〉( く.変 数〉I
く出力文 〉 : : = o u t く変数 〉 rく 式 〉 1 , く 変 数 〉I く 式 〉I
く d i m 文 〉 : : = d i m く変数〉( く整定 数 〉 日,く変数〉( く整定 数〉)I く制御文 〉 : : ≡ く i f 7 °ロ1 ク 〉l く y h i l e 7 ●Dl ク 〉)く f o r 7 ■叫 ク 〉lく b r e a k 文〉
く i f 7 ' t l 1 ク 〉 . I : : i f く式 〉く ポーr fンr )( く ポー り州 〉 Ie n d i fJ
i f く式 〉
くストりン I 〉1 く ス
トり ン ト 〉 Ie l s e くステーけ ン ト 〉 t く ス テーり ン ト 〉 Ie n d i f く y h i l e 7 ■ ロ 1 ク 〉 : : ; d oy h i l e く式〉 く ス テ ー t fント 〉t く ス テー 日 ソ t ) I1 . o o p
く f o r 7 ° t ] 7 ク 〉 : : ; d of o r く整変数〉 ≡く式).く 式〉
くステート
Jyト 〉( く ス テ ー t /ンr ) Il o o p く b r e a k 文 〉 : : = b r e a k
く変数 〉:: =く識別子 〉l く識別子〉く型文字 〉1 く 配列変数〉
く識別子〉:: ;く英字〉( く英字 〉
く英字〉:: = alblcl d
く数字 〉 : : = 112131 4
jlklll nl n
lol pl qlrlsltlu
lv l yf xl ylz 0
く型文字 〉:: = % l
H #lSく配列変 数〉:: =く 識別子〉( く 式 〉 ) Lく 識別子〉く 型文字 〉( く 式〉) く整変数〉:: ;く識別子 〉 l く識別子〉篤
く式〉:: ;く 単純 式 〉I く単純式〉
く2項 演算子 1 〉く 単純式 〉
̀ く単純式〉:: =く符号〉く 項 〉 lく符号〉く 項 〉 く2 項 演算子 2 〉く 項〉
く 符号〉:: = 1 十トI く2 項演算子 1〉 ; ; = く
く2 項演算子 2 〉 : : ≡ + 〉
lく 〉1く =l く ;
‑J o r
く項 〉:: ≡く因子
〉lく因子〉く乗除演算子〉
く乗除演算子
〉::; *[ /
lm o dI a n d
く因子〉:. I :く変数 〉 lく関数名〉( く 式 〉 I . く式〉 1 日 ( く 式 〉 )l r L O t く因子 〉 lく定数〉
く関数 名 〉 : : ; a b sls q rls i nIc o sHx p
く定数 〉:: ;く数値定数 〉 lく文字定数 〉 く 数値定数〉:: ;く整定数 〉 lく実定数〉
く整定数〉:: =く符号〉く数字列〉
く数字列 〉:: =く数字〉I く数字〉〉
く実定数〉:: ;く符号〉く数字列〉 .く数字列〉′
く 文字定数 〉:: ;く文字列 〉■
く文字 列 〉:: =く く英字 〉 lく数字 〉l く 特殊記 号 〉 )
く特殊 記号 〉 : ; [ (J )J ' :l、H ltl ‑I @llH I ]l り ;l*[ +Jくl
2 ‑3 PAD トランスレータにおける中間言語の設計
今回の開発では ,PAD ( Pr obl e m Anal ys i sDi a gr am :1 9 7 0 年代に日立製作所で開発 さ れた構造化図法)か ら,低言語 としての BASI C や高言語である C 言語や BASI C/ 9 8 ( 構造 化 BASI C の 1 つ)へのプログラム変換を対象 とした・ これは現実に教育面で上記 のニーズ が高いためである. PAD がきちん とかければ構造化プログラ ミングを一応習得 した ことに なるし,任意のプT ]グラ ミシグ言語での記述‑の移行 もスムーズである. よって ,PAD は 形憩 こそ異なるにせ よ,一種のプログラミング言語 として位置づけ られ よう・
このように,今回の PAD トラソスレーク開発には,高低,低高の丙変換を伴 うこと,お よび対象を情報処理教育用 とした ことを考慮した.そのため中間言語のレベル としては,初 歩的なアル ゴリズム教育に最低限必要な制御構造 とステー トメン トを扱 う程度 とし,低言語 に近い ものに設定 した. この中間言語の仕様を表
1に示す・
3.
システム概要
図
3に PAD トランス レータの概要を示す・ システム全体は,メニュープログラム ,PAD ェディタ , 3 本の中間言語変換 プログラムの 5 本のプログラムか らなる・
三三三」
iiZSiZ!
墜 ⊥ 塗
壁転 」i i i ー i i i ̲̲̲ i i i i i i i i i i i i i
iii」 塵̲̲̲堕 」
二二 に
二二. ̲
由 匡 垂 ∃
巨空コ
図 3 PAD トラソスレークシステム枕要図
pAD エディタは PAD チャー トを画面上に作成す るためのソフ トウェアであ る・入力装 置 としてはマウスを積極的に活用 し,キーボー ドの使用は PAD シンボル内のステー トメ
+/トや ファイル名入力など,最小限に抑えた.さらに,マニュアルな しで も操作で きるよ う各 pAD シンボルや諸機能をアイコン化 し, シンボルの配置 ・結線か ら中間言語への変換に至 るまでを簡単な操作で行えるよう配慮 した.なお ,PAD エディタの出力は
2つあ り ,PAD 図の再編集に必要なイメージファイル と,中間言語に変換 された ソースファイルである・
中間言語か ら3 つの特定言語への変換は,それぞれの中間言語変換 プログラムに よ り行 な
われる.制御構造の弱い BASI C への変換は高低変換,機能の多い C 言語 と BASI C/ 9 8 へ
の変換は低高変換 となる.
6
堀内征治 ・堀内春輔
なお, これ ら一連 の操作を簡単化す るために,全体を統括するメニュープログラム も作成 した. また, ターゲ ッ トマ シンは
FMR‑50( 富士通製)であ り, ソブ トの開発には
C言 語
(LatticeC)を用 いた.
4.
PAD エデ ィタ
メニュープログテムか ら PAD ェデ ィタに制御が移 ると,図 4 に示す初期画面が現れる.
これは,前述 のように,新 たに PAD 図を作成す る場合 と,すでに保存 されているものの再 編集を可能 とす るよ うに設計 した もので,次 の
3群 の機鹿をそれぞれ,画面左端にアイコン 化 した.
(1)
PAD 作図の長めの各種 シンボル
ボックスの配置 と結線 のための機能 シンボル
(2)画面のイメージファイルの保存お よび呼び出 しのための機能
(3)
PAD エデ ィタか らメニュープ ログラム‑の移動用機能
これ らの中で ,( 1 ) の作図に関するシンボルは図 5 に示す 6 種類に限定 した.先 に述べたよ う に ,PAD トランス レータを情報処理教育用 の入門に有用 とす るための配慮か ら,必要度中 限のものに放 ったためであ る.
1989/09/29 15:26:17
f l 通常シンボル
l 入力シンボル
出力シンボル
l l 反榎シンボル
(. 選択シンボル
図 4 PAD ェディタの初期画面 ( 部分) 図 5 PAD シソポル一覧表
PAD チャー トの描画は, シンボル アイコンの選択 と配置,そ して シンボル内への記述項
日の入力を繰 り返 した後∴各 シンボルを結合する とい う手順 を とる.原則 としてマウスの左
ボタンは選択,右 ボタンはキャンセル とした. また,各 シンボル結合の手続 きでは,不適切
な シンボル同士が結 ばれない ようチェックも施 した.なお,画面は開始時 の状態 に対 して上
図 6 PAD の例
1989/09/29 15:22:22
[:コ
⊂⊃⊂=〕[コ 】1
l >
▲
▼ w a p x( i )
mX(50) l
l X( i + 1 )
=1
r 1‑Ol
〜
50 x(i(I)(+i) ‑/\I l e L "'
1儒 L x i k i iLJ / 酢 → ‑ = > i 号,
英小 図 7 PAD コ エ ディタの使用例
下左右にス クロールで き,可視画面の
9倍 までの作図が可能である.図
6に示す PAD の簡 単な例を ,PAD エデ ィタに展開 した ものが図
7である.
前述 のよ うに ,PAD ェデ ィタの出力対象はイメージファイル と中間言語 ファイルの
2つ であ り
,SAVEアイコンを ク リック後, システ ムが発生す るメッセージに答え る形で選択 で きる・
・rトランス レー ト」を指定す る と,後述す 亭ような形で中間言語 ファイルが カレン ト
ドライブに保存 され る.・ この ときのファイル名拡張子は 「
.PCD 」 とした.
中間言語への トランス レー トのアル ゴリズムを図 8 に示す.
図 8 中間言語への トラソス・ レ‑′ トのアルゴリズム
8
堀内征治 ・堀内泰庫
PAD チャー トにおける開始 シンボルの検索は,作図されたパターンを解析す ることに よ って行われ, これに よ りツ リーウォー クの開始点が定 まる.開始点が確定 され ると,そのシ ンボルの種類 に応 じたキー ワー ドと内容,次の シンボルの番号を与え,以下 このループを繰 り返す. シンボルの種類が選択 シンボルや反復 シンボルの ときは,そのシンボルの右側 のシ ンボルに制御が移 る. この ときの右側 のシンボルを子 シンボル,元 のものを親 シンボル と称 した. これ らの制御 ブ ロックが閉 じる ときには,ループの終わ りを示すキー ワー ド (
"loop""endif
" ) が与 え られ,再び,親 シンボルの下に制御が移 ることになる. このよ うな検索 を しなが ら,個 々の PAD シンボルに対 し,一対一の中間言語が生成 され る.図 9 に図 7 の ト ランス レー ト結果を示す.
なお ,PAD ェデ ィタか らメニュープログラムへの移行は ,END アイ コンの選択に よ り, 自動的に行われ る.
dimx(50) dofori=0.50 ifx(
i )
くⅩ(i+1)swapI(i).I(i+1)
k=i
doWhilekく〉1 k=k‑1
ifx(k)くx(k+I)
swapx(k).x(k+1)
else break endif loop endif loop
100D川 X(50) 110FORI=OTO50
120 IFX
(
I)くX(Ⅰり)THEN 130 SYAPA(I).X(I+1) 140 Ⅹ=1150 DOYHILEKく〉1 160 E=K‑1
170 IFX(Ⅹ)くX(K+I)THEN 180 SYAPA(I(),X(K+1) 190 ELSE
200 EXITFOR 210 ENDlF 220 LOOP 230 ENDIF 240NEXTI
図9 中間言語‑の変換例 図 1 0 BASI C/ 9 8 ‑の変換例
5.
高級言語への トランス レー ト
今回開発 した PAD トランス レータでは,前述の よ うに BASI C ( N8 8 BASI C) ,構造 化 BASI C ( BASI C/ 9 8 ) お よび C 言語‑の変換を可能に した. これ らの選択は前節同様 メニュ ープログラムでなされ,それぞれ の変換 ソフ トウェアに制御が移 る.
第
3節で述べた ように, トランスレータにおける中間言語はかな り BASI C に近い構成 と なった. もちろん ,PAD 自体が構造化手法を意識 した表現形態 であるため,中間言語は結 果的には構造化 BASI C の性格に似た もの となっている.したが って,中間言語か ら BASI C/
9 8 への変換はほぼ一対一の対応で処理 できる.すなわ ち,読み込 んだ中間言語 の リス トは先
ず キー ワー ド ( 特定言語 の予約語に相 当す るもの) とそれ以外 の情報 とに分解 され る.ヰ ‑
ワー ドを判定す るとターゲッ ト言語である BASI C/ 9 8 の予約語への変換が行おk,その際
に前段 で分解 された種 々の有意情報が当該位置に埋め込 まれ ることになる.図
10に,変換 さ
れ た BASI C/ 9 8 のプ ログラムを示す. これか らも明 らかな ように, プログラムの美化を考
慮 してのオー トインデ ン ト機能 も付加 した.
N88BASIC
のような非枯造化
BASICへの展開は, ことに判定の制御構造に配慮が必要 である.今回は条件節 として中間言語での条件を論理否定 した表現を用い, 自動的に適当な 位置にラベルを配 して,疑似的に構造化を図って対処 した.変換例は図1 1のとお りである・
10
0 DINX
(5 0) 1
10 FOR I王O TO5012
0 IF NOT(I(I) く X(I+
I) )T
ElEⅣlEL113 0
SYAP X(I ) ,
X(
I+1 ) 140
Ⅹ=115 0
YHILEKく〉116 0
X=Xl1170
1F NOT(
X( K )
くX(
K+1
)) TIIEⅣlE L 2
180
SYAP X( K
).
X(
Ⅹ+1 ) 190
GOTOI E
NIF2200
1EL221 0
GOTO +LOUT122 0
1EⅣI F2 23 0
YEND24 0
1LOUT125 0
GOTO +ENI F1 26 0
IE L1
27
0 書ENIFl28 0
Vハ LLJ ̲▲HT図
11 N88BASICへの変換例
staticfloatxl51】;
staticfloati;
staticfloatk;
voidmain() I
floatpad̲Gyp;
for(i;0;iく;50;l十十日
if(xl(int)i](xl(int)i+1])I pad̲syp;xl(int)i】;
x【(tnt)i】=xl(int)i+l];
xl(int)i+1】=pad̲Gyp;
k;i:
yhHe(k!:
1 日
k=k‑1;if(xl(ht)k】くxl(int)k+1】)I pad̲syp=xl(iTLt)k];
xl(lTLt)k]
;
xl
(int)i+1】;x【(int)k+1】=pad‑syp;
Ielse.I break;
I l I
I
図
12 C言語への変換例
高言語であるC への変換を試みた ものが図1
2である.
BASIC系 の言語か らの変換で最 も 重要な部分のひ とつは変数の型宣言に関わ る部分であ り,上述のキーワー ドの判定の際に, 構文解析 して変数を ピックアップす る必要がある. しかるのち,上述のキーワー ドか ら予約 語部への変換がなされるように設計 した.また,この例にみ られ るように,中間言語で swap
と記述された命令を 3 つの代入文に変換す ることも必要である. このようなキーワー ドは数 は少ないが入門教育の折 りにも必要 となることか ら,本 システムではこれ らについて もサポ
ー トすることとした.
6.
結 び
本報では, プログラ ミング言語間の変換 の必要性を強調 し, この変換が,中間言語を媒介 とした汎用的な システムとして行われるべ きであることを提言 した.そ して,その第一段階 として ,PAD チャー トか ら 3 種煩の高級言語への トランスレータの開発を行い,その結果 について述べた.
構造化 プログラ ミングの教育においては ,PAD か らアプローチすることが大 きな効果を
もた らす ことはすでに報告 されているが, さらに,今回開発 した トランス レータを初心者の
入門教育に用いたことに よ り,構造的な言語の教育にきわめてスムースに移行できることが
10
堀内征治 ・堀内泰輔
明 らかになった. また,非構造的であるとされている従来か らの BASI C に変換す ることも 容易 とな り, あわせて,疑似構造化の啓蒙に も貢献で きた. さらに低言語か ら高言語の変換
の一例 として, C言語 の トランスレー トも実現で きた.
これ らの変換において設計 した中間言語が, このよ うな多言語 の トランス レー トを必要 と す るシステムに とって,実に有用であ ることも実証 された. しか し, さらに多 くの言語間の 変換を 目指 した り,あ るいは, 目的を教育用か ら実務用 に発展 させ ることを考えると, この 中間言語の設計は さらに絞密に行 うことが必要 となろ う.
PAD ェデ ィタについて も,当初 の 目的を達す ることはで きたが,ス クロールの高速化や アイコンの適切な位置配置な どについての改善 も必要 と思われ る. これ らの改良については 第
2段階 としての言語間 トランスレー トの開発 の中で達成 していきたい.
おわ りに,本 システムの開発 の一部は,平成元年度機械工学科 の卒業研究 のテーマ として 与 えた ものであ り, とくに,情報研究室学生 岡本寛史君 の功掛 ま多大である. ここに深 く感 謝 の意を表す る.
参 考 文 献
(1)