JPH04317133A - Program conversion device - Google Patents

Program conversion device

Info

Publication number
JPH04317133A
JPH04317133A JP3084179A JP8417991A JPH04317133A JP H04317133 A JPH04317133 A JP H04317133A JP 3084179 A JP3084179 A JP 3084179A JP 8417991 A JP8417991 A JP 8417991A JP H04317133 A JPH04317133 A JP H04317133A
Authority
JP
Japan
Prior art keywords
data type
type information
inference
source code
data
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.)
Pending
Application number
JP3084179A
Other languages
Japanese (ja)
Inventor
Yoshihiro Masuda
増田佳弘
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fujifilm Business Innovation Corp
Original Assignee
Fuji Xerox Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Fuji Xerox Co Ltd filed Critical Fuji Xerox Co Ltd
Priority to JP3084179A priority Critical patent/JPH04317133A/en
Publication of JPH04317133A publication Critical patent/JPH04317133A/en
Pending legal-status Critical Current

Links

Landscapes

  • Devices For Executing Special Programs (AREA)

Abstract

PURPOSE:To improve the execution efficiency of a program by permitting a user to learn a type inference result and to save labour writing a data type propaganda sentence in a source code. CONSTITUTION:A data type information retrieval means 11 detects data type information on variables existing in the source code, registers information on the data types of the fetched variables in a data type information storage table 14. A type inference means 12 infers the data type to the variable whose data type existing in the source code is not clear based on data type information on the registered variables. An inference result is stored in the data type information storage table 14 and a data type information addition means 13 merges the inference result in the source code and outputs the source code to which the inference result and data type information are added.

Description

【発明の詳細な説明】[Detailed description of the invention]

【0001】0001

【産業上の利用分野】本発明はコンピュータ上で動作す
るプログラムの変換方式に関するものであり、特に入力
プログラム中の変数に対して型推論を行い、推論結果を
入力プログラムにマージするようにしたプログラム変換
装置に関するものである。
[Industrial Application Field] The present invention relates to a conversion method for programs running on a computer, and in particular to a program that performs type inference on variables in an input program and merges the inference results into the input program. This invention relates to a conversion device.

【0002】0002

【従来の技術】C、LISP、FORTRAN等のプロ
グラミング言語で記述されたプログラム上の変数は、そ
の属性である「データ型」に従って対応する機械語のデ
ータに変換され、実行される。この「データ型」は一般
に「データ型宣言文」のようなプログラム上の構文要素
によって明示的に指定されるようになっている。CやF
ORTRAN、BASICのような言語では変数に対し
て必ずデータ型を属性情報として与える必要があるが、
LISPやSMALLTALK−80等の言語では変数
に対してデータ型を宣言する必要はなく、プログラムの
実行時に動的にデータ型を変化させることが可能である
。例えば、Cでは、int  a;と宣言されると、a
は整数を意味し、一方、LISPでは宣言なしで用いら
れるaという変数は値データへのポインタを意味し、そ
のポインタが指し示すアドレスのデータが整数であった
り、文字であったりすることになる。また、LISP等
の言語での変数はデータ型が宣言文によって明示的に指
定された時にはCやFORTRAN等と同様の直接的な
値データとして扱われるが、データ型が指定されなかっ
た場合にはその変数は値データへのポインタとなり、間
接的な値データとして扱われる。
2. Description of the Related Art Variables on a program written in a programming language such as C, LISP, or FORTRAN are converted into corresponding machine language data according to their attribute "data type" and executed. This "data type" is generally explicitly specified by a program syntax element such as a "data type declaration statement." C and F
In languages such as ORTRAN and BASIC, it is necessary to give data types to variables as attribute information, but
In languages such as LISP and SMALLTALK-80, there is no need to declare data types for variables, and data types can be dynamically changed during program execution. For example, in C, if int a; is declared, a
means an integer. On the other hand, in LISP, a variable a used without a declaration means a pointer to value data, and the data at the address pointed to by the pointer may be an integer or a character. Also, variables in languages such as LISP are treated as direct value data when the data type is explicitly specified by a declaration statement, similar to C or FORTRAN, but when the data type is not specified, The variable becomes a pointer to value data and is treated as indirect value data.

【0003】ところでプログラムを作成する立場から言
えば、CやFORTRANのようにデータ型をいちいち
宣言するのは面倒なので入れたくなく、一方LISP等
のようにデータ型を宣言しない場合には変数の表すデー
タを取り出すためにその都度ポインタが指し示すアドレ
スの値を参照しなければならず、プログラムを実行する
際にはこのようなデータ表現は直接的なデータ表現より
もアクセス時間や記憶領域をよけい必要とするため実行
効率が悪い。そのため、Compiling Func
tionalLanguages,John Will
ey & Sons,1988, “Inferrin
g types inSmalltalk” Proc
eeding of 8th ACM Symposi
um on Principles of Progr
amming Languages,1981,“A 
Theory of Type Polymorphi
sm in Programming”,Jornal
 of Computer and System S
ciences,vol.17,1978, “Coe
rcion and type inference”
,proceeding of11th ACM Sy
mposium on Principles of 
Programming Languages,198
4 等に述べられているように、変数に対する定数の代
入操作や適用関数等のプログラム上の構造からデータ型
を推論し、できる限り直接的な表現に変換するための「
型推論」と呼ばれるコード最適化のための技法が提案さ
れている。
By the way, from the standpoint of creating a program, it is troublesome to declare data types one by one as in C or FORTRAN, so I don't want to declare them.On the other hand, when data types are not declared as in LISP etc. To retrieve data, the value of the address pointed to by the pointer must be referenced each time, and when executing a program, such data representation requires more access time and storage space than direct data representation. Therefore, execution efficiency is poor. Therefore, Compiling Func
tionalLanguages, John Will
ey & Sons, 1988, “Inferrin
g types inSmalltalk” Proc
eeding of 8th ACM Symposia
um on Principles of Progr.
amming Languages, 1981, “A
Theory of Type Polymorphism
sm in Programming”, Journal
of Computer and System S
sciences, vol. 17, 1978, “Coe
rcion and type inference”
, proceeding of 11th ACM Sy
mposium on principles of
Programming Languages, 198
4, etc., the data type is inferred from program structures such as constant assignment to variables and application functions, and is converted into a representation as direct as possible.
A technique for code optimization called "type inference" has been proposed.

【0004】0004

【発明が解決しようとする課題】しかしながら前述した
従来の型推論はコンパイラ内部でユーザから見えない形
で行われ、推論の結果、変数のデータ型が特定できなか
った場合には間接的な表現にコンパイルされるようにな
っており、どの変数に関するデータ型が与えられれば変
数のデータ型が特定できるのかどうかということがユー
ザにとっては知ることができなかった。また、仮にデー
タ型推論の結果がユーザに表示されたとしても、それら
全てのデータについてデータ型宣言文を書き変えるとい
うことは、ユーザにとって負荷の大きな作業となってし
まう。
[Problem to be Solved by the Invention] However, the conventional type inference described above is performed inside the compiler in a way that is invisible to the user, and if the data type of a variable cannot be specified as a result of inference, indirect expression is used. Since the data type of the variable is compiled, the user cannot know whether the data type of the variable can be specified if the data type of the variable is given. Furthermore, even if the results of data type inference were to be displayed to the user, rewriting the data type declaration statements for all of the data would be a heavy task for the user.

【0005】本発明は上記課題を解決するためのもので
、入力プログラム中の変数に対して型推論を行い、その
推論結果をユーザに分かるように出力し、また推論結果
をデータ型宣言文の形式でソースコードにマージするこ
とによりユーザがデータ型宣言文をソースコード中に書
き込む労力を省き、さらにユーザがこの生成された宣言
文に対して推論結果を基にデータ型の整合性がとれるよ
うに編集を加え、各変数は直接的なデータ型表現にコン
パイルできるようにし、結果としてプログラムの実行効
率を向上させることができるプログラム変換装置を提供
することを目的とする。
The present invention is intended to solve the above problems, and it performs type inference on variables in an input program, outputs the inference results in a way that the user can understand, and also outputs the inference results in a data type declaration statement. By merging data type declaration statements into the source code in the format, the user can save the effort of writing data type declaration statements in the source code, and furthermore, the user can maintain data type consistency based on the inference results for the generated declaration statements. The object of the present invention is to provide a program conversion device that can edit the program and compile each variable into a direct data type representation, thereby improving program execution efficiency.

【0006】[0006]

【課題を解決するための手段】本発明は、図1に示すよ
うに、ソースプログラムを同一または別のプログラミン
グ言語のソースコードあるいは機械語に変換する装置1
において、入力されたソースコード中に存在する変数に
関するデータ型情報を検出するデータ型情報検出手段1
1と、検出したデータ型情報を保持するデータ型情報格
納テーブル14と、該テーブルに保持された各変数に関
するデータ型情報に基づいて、データ型が明示的に宣言
されていない変数に対して型推論を行い、推論結果を前
記テーブルに登録する型推論手段12と、型推論結果か
らデータ型が明示的に宣言されていない変数についてソ
ースコード中にデータ型情報を追加するデータ型情報追
加手段13と、型推論結果を出力する出力手段3とを備
えたことを特徴とする。
[Means for Solving the Problems] As shown in FIG. 1, the present invention provides an apparatus 1 for converting a source program into source code or machine language of the same or another programming language.
data type information detection means 1 for detecting data type information regarding variables existing in input source code;
1, a data type information storage table 14 that holds detected data type information, and a type for variables whose data type has not been explicitly declared based on the data type information about each variable held in the table. Type inference means 12 performs inference and registers the inference results in the table; Data type information addition means 13 adds data type information to the source code for variables whose data types are not explicitly declared based on the type inference results. and an output means 3 for outputting a type inference result.

【0007】[0007]

【作用】本発明はソースコードが入力されると、データ
型情報検出手段によりソースコード中に存在するデータ
型宣言文のような変数のデータ型情報を検出して取り出
す。
According to the present invention, when a source code is input, the data type information detecting means detects and extracts data type information of a variable such as a data type declaration statement existing in the source code.

【0008】取り出した各変数のデータ型に関する情報
は、データ型情報格納テーブルに格納され保存される。 データ型情報検出手段による処理が終わると、データ型
情報格納テーブルに登録された各変数に関するデータ型
情報に基づいて、型推論手段によってソースコード中に
登場するデータ型が不明の変数に対し、変数に対する定
数の代入操作や適用関数等のプログラム上の構造からデ
ータ型を推論する。
[0008] Information regarding the data type of each extracted variable is stored and saved in a data type information storage table. After the processing by the data type information detection means is completed, the type inference means uses the data type information for each variable registered in the data type information storage table to determine whether the data type is unknown for variables that appear in the source code. Infer data types from program structures such as constant assignment operations and application functions.

【0009】この推論結果はデータ型情報格納テーブル
に格納されると共に、データ型情報追加手段により推論
結果がソースコード中にマージされ、推論結果およびデ
ータ型情報が追加されたソースコードが出力される。
[0009] This inference result is stored in the data type information storage table, and the inference result is merged into the source code by the data type information addition means, and the source code with the inference result and data type information added is output. .

【0010】0010

【実施例】図1は本発明のプログラム変換装置の機能ブ
ロック図、図2は装置構成を示す図、図3はデータ型情
報格納テーブルを示す図、図4はCommon  Li
spの説明図、図5,図6はデータ型推論の処理フロー
を示す図である。図中、1はプログラム変換装置、11
はデータ型情報検出手段、12は型推論手段、13はデ
ータ型情報追加手段、14はデータ型情報格納テーブル
、2は入力手段、3は出力手段、21はCPU、211
はデータ型情報検出部、212は型推論部、213はデ
ータ型情報追加部、22は主メモリ、221はデータ型
情報、222は推論情報、23は出力装置、24は入力
装置、25は外部記憶装置、30,31,32はフレー
ム、35,36はトップレベルを示している。
[Embodiment] FIG. 1 is a functional block diagram of a program conversion device of the present invention, FIG. 2 is a diagram showing the device configuration, FIG. 3 is a diagram showing a data type information storage table, and FIG. 4 is a diagram showing a common Li
The explanatory diagrams of sp, FIGS. 5 and 6, are diagrams showing the processing flow of data type inference. In the figure, 1 is a program conversion device, 11
12 is a data type information detection means, 12 is a type inference means, 13 is a data type information addition means, 14 is a data type information storage table, 2 is an input means, 3 is an output means, 21 is a CPU, 211
212 is a data type information detection unit, 212 is a type inference unit, 213 is a data type information addition unit, 22 is main memory, 221 is data type information, 222 is inference information, 23 is an output device, 24 is an input device, 25 is an external device Storage devices 30, 31, and 32 are frames, and 35 and 36 are top levels.

【0011】図1の入力手段2は図2のマウス,キーボ
ード等からなる入力装置24に対応し、これによりフロ
ッピディスク、ハードディスク等の外部記憶装置25に
ソースコードが入力され、主メモリ22に読み込まれる
。CPU21のデータ型情報検出部211に対応する図
1のデータ型情報検出手段11は読み込まれたソースコ
ード中に存在するデータ型宣言文のような変数のデータ
型宣言に関する情報を検出して取り出す。取り出された
各変数のデータ型に関する情報は、データ型情報格納テ
ーブル14に格納され保存される。一方、データ型情報
検出手段11による処理でソースコード中に登場するデ
ータ型が不明であった変数に対し、CPU21の型推論
部212に対応する型推論手段12により、データ型情
報格納テーブル14に格納された情報を参照し、プログ
ラム中において変数に対して整数が代入されているか否
か、あるいはキャラクタが代入されているか否か等のこ
とより判断してデータ型の推論が行われ、その結果はデ
ータ型情報格納テーブル14に格納される。
The input means 2 in FIG. 1 corresponds to the input device 24 consisting of a mouse, keyboard, etc. in FIG. It will be done. The data type information detecting means 11 of FIG. 1, which corresponds to the data type information detecting unit 211 of the CPU 21, detects and extracts information regarding the data type declaration of a variable, such as a data type declaration statement existing in the read source code. Information regarding the data type of each extracted variable is stored and saved in the data type information storage table 14. On the other hand, for variables whose data types appearing in the source code are unknown in the processing by the data type information detection means 11, the type inference means 12 corresponding to the type inference section 212 of the CPU 21 stores them in the data type information storage table 14. The data type is inferred by referring to the stored information and determining whether an integer or character is assigned to a variable in the program, etc. is stored in the data type information storage table 14.

【0012】推論された結果はデータ型情報追加手段1
3によりデータ型宣言文がソースコード中にマージされ
、型推論結果およびデータ型宣言文がマージされたソー
スコードが出力手段13を通して出力される。従って、
ユーザはデータ型の推論結果およびデータ型宣言文がマ
ージされたソースコードを表示画面あるいはプリントア
ウトしたものにより知ることができる。
[0012] The inferred result is sent to data type information adding means 1.
3, the data type declaration statement is merged into the source code, and the source code in which the type inference result and the data type declaration statement have been merged is outputted through the output means 13. Therefore,
The user can see the source code in which the data type inference result and the data type declaration statement have been merged on a display screen or in a printout.

【0013】以下にCommon  Lispを例にと
って説明する。
[0013] Common Lisp will be explained below as an example.

【0014】まずCommon  Lispにおけるデ
ータ型宣言について説明すると、変数のデータ型に関す
る宣言は、以下に示すようなproclaimフォーム
、declareフォームによって行われる。
First, data type declaration in Common Lisp will be explained. Declarations regarding the data type of variables are made using the proclaim form and declare form as shown below.

【0015】 (proclaim(integer *counte
r* ))(defun  careful(x  y
)      (declare(integer  
x)(float  y)      (setq  
z(+  x  y))   このようなフォームにより *counter* 
,xはinteger型、yはfloat型として宣言
されたことになる。
(proclaim(integer *count
r*))(defun careful(x y
) (declare(integer
x) (float y) (setq
z (+ x y)) With this form *counter*
, x are declared as integer types, and y as float types.

【0016】まず、図1のデータ型情報検出手段11で
は入力装置からCommon  Lispのソースコー
ドをトップレベル・フォームの単位で入力する。トップ
レベル・フォームとは、図4のプログラムの例で示すよ
うに、最左端から書き出された最上位の概念のプログラ
ム単位で、図の35,36をトップレベルと言い、フレ
ーム30がその単位となり、この単位毎に入力される。
First, in the data type information detecting means 11 of FIG. 1, Common Lisp source code is inputted in units of top-level forms from an input device. As shown in the program example in Figure 4, the top-level form is a program unit of the highest level concept written from the leftmost end, 35 and 36 in the figure are called the top level, and frame 30 is the unit. and is input for each unit.

【0017】フレーム名はプログラムの単位を示し、図
4の例ではフレーム30,フレーム31,フレーム32
のように各レベルのフレームが存在し、各フレーム毎に
変数の定義が行われ、図示するようにフレーム31と3
2とで同じ変数「a」が定義されている場合、フレーム
32の「a」はフレーム31には適用されない。そのた
めフレーム31と32の変数「a」を、例えばfooー
let1ーa、fooーlet2ーaのように命名して
区別する。これらの各フレーム名は関数やフレームと同
様なブロック等、入れ子の関係に対して与えられる名前
である。
The frame names indicate the units of the program, and in the example of FIG. 4, frame 30, frame 31, frame 32
There are frames at each level as shown in the figure, variables are defined for each frame, and frames 31 and 3 as shown in the figure
If the same variable "a" is defined in frame 32 and frame 31, "a" in frame 32 is not applied to frame 31. Therefore, the variables "a" of frames 31 and 32 are named, for example, foo-let1-a and foo-let2-a to distinguish them. Each of these frame names is a name given to a nested relationship such as a function or a block similar to a frame.

【0018】これらのフォームのうちからprocla
imフォームやdeclareフォームを取り出し、デ
ータ型情報格納テーブル14に登録する。データ型情報
格納テーブルには、図3に示すように、変数名およびそ
れに対応するフレーム名、データ型名、推論型が登録さ
れる。なお、図3のフレーム名におけるTはトップレベ
ルを示している。
Among these forms, procla
The im form and declare form are taken out and registered in the data type information storage table 14. As shown in FIG. 3, variable names, corresponding frame names, data type names, and inference types are registered in the data type information storage table. Note that T in the frame name in FIG. 3 indicates the top level.

【0019】また、関数名に対するデータ型名は図3の
テーブル中のcdrのように(function(<引
数のデータ型1><引数のデータ型2>…)<戻り値の
データ型>)のような形式で格納される。また、推論型
の欄は格納されたものが型推論によって得られた結果で
あるか否かを示すもので、Tと記述されているものは推
論した結果を示している。なお、このデータ型情報格納
テーブルには加算、減算等ユーザが定義する以外に基本
的なCommon  Lispの組み込み関数に関する
データ型情報が予め格納されており、これに対してもデ
ータ型が登録されている。
[0019] Also, the data type name for the function name is (function (<Argument data type 1><Argument data type 2>...) <Return value data type>) as shown in cdr in the table in Figure 3. It is stored in such a format. Further, the inference type column indicates whether or not what is stored is a result obtained by type inference, and those described as T indicate inference results. This data type information storage table pre-stores data type information regarding basic Common Lisp built-in functions, such as addition and subtraction, in addition to those defined by the user, and data types are also registered for these functions. There is.

【0020】テーブルへのデータ型情報の登録作業が終
了すると、型推論手段12により再度ソースコードが最
初からトップレベルフォームを単位に入力されていき、
それぞれのフォーム中に出現するデータ型が求められる
。もし、データ型格納テーブルに登録されていない未定
義変数を発見した場合には、前述したように変数に整数
が代入されているか否か、キャラクタが代入されている
か否か等より型推論が行われ、その結果として得られた
データ型がデータ型情報格納テーブル14のデータ型名
に登録され、推論型の欄にTがセットされる。
[0020] When the registration of data type information in the table is completed, the type inference means 12 inputs the source code again from the beginning in units of top level forms.
The data types that appear in each form are determined. If an undefined variable that is not registered in the data type storage table is found, type inference is performed based on whether an integer is assigned to the variable, whether a character is assigned, etc., as described above. The resulting data type is registered as a data type name in the data type information storage table 14, and T is set in the inferred type column.

【0021】なお、関数名等のグローバル変数について
は変数参照の後方で定義されている可能性があるので、
この型推論はファイル中の全ての未定義変数に対する型
推論が収束するまで、すなわちそれ以上の推論ができな
くなるまで、繰り返しソースファイルを読み込んで行わ
れる。
[0021] Note that global variables such as function names may be defined after the variable reference, so
This type inference is performed by repeatedly reading the source file until the type inference for all undefined variables in the file converges, that is, until no further inference can be made.

【0022】このような処理が終了すると、まずデータ
型情報追加手段13によりデータ型情報格納テーブル中
のエントリ(入っている場所)のうちフレーム名がT、
つまりトップレベルでかつ推論がT(推論されたデータ
型)が変数全てについて(proclaim‘(int
eger  z))のようなproclaimフォーム
を生成し、出力手段3により出力される。なお、これと
同時に型推論結果がユーザに対して出力装置23より表
示される。この処理が終了すると再度入力装置よりソー
スコード中のフォームを先頭から読み込み、フォーム中
の各フレーム中で使用されている変数についてデータ型
情報格納テーブル14中のフレーム名からそのエントリ
が調べられ、推論されたデータ型(T)の変数全てにつ
いて以下の下線部に示すようなdeclareフォーム
を出力装置より出力する。
When such processing is completed, first, the data type information adding means 13 selects the frame name T, among the entries (locations) in the data type information storage table
That is, at the top level and the inference is T (inferred data type) for all variables (proclaim'(int
A proclaim form such as eger z)) is generated and outputted by the output means 3. At the same time, the type inference results are displayed to the user from the output device 23. When this process is completed, the form in the source code is read from the beginning again from the input device, and the entry is checked from the frame name in the data type information storage table 14 for variables used in each frame in the form, and inferences are made. For all variables of the specified data type (T), a declare form as shown in the underlined part below is output from the output device.

【0023】 (defun  baz(n)       (declare(integer  n
))      (let  ((foo‘(name
))            (declare(sy
mbol  foo))              
……                       
               ))そして、これと同
時に型推論結果が出力装置より表示される。
(defun baz(n) (declare(integer n
)) (let ((foo'(name
)) (declare(sy
mbol foo))
……
)) At the same time, the type inference results are displayed on the output device.

【0024】以上の処理フローについて図5,図6によ
り説明する。
The above processing flow will be explained with reference to FIGS. 5 and 6.

【0025】まずソースファイルから1つのトップレベ
ルフォームを入力し、proclaimフォームまたは
declareフォームを含んだフォームであるか否か
をみて、含んでいればデータ型情報格納テーブルに宣言
されたデータ型を格納し、これを全てのトップレベルフ
ォームについて行う(ステップ101〜104)。この
処理が終了するとソースファイルにリワインドし、ソー
スファイルから1つのトップレベルフォームを入力し、
データ型情報格納テーブルの情報やプログラムの構造か
ら未定義の変数に対して型推論を行い、データ型情報格
納テーブルに推論された変数とそのデータ型を格納する
(ステップ105〜109)。この処理を全てのファイ
ル中のトップレベルについて行い(ステップ110)、
次にデータ型情報格納テーブル中のフレーム名がTであ
り、かつ推論がT(推論されたデータ型)の変数に対す
るproclaimフォームを生成し、出力するとと同
時にこれらの変数に対して行われた推論結果を表示する
(ステップ111)。次にソースファイルにリワインド
し、ソースファイルから1つのトップレベルフォームを
入力し、フォーム中の各フレームに対しデータ型情報格
納テーブル中にTの変数があるかどうか調べ、あればそ
の変数に対するdeclareフォームを生成し、その
フォームをマージしたトップレベルフォームを出力し、
これを全てのファイル中のトップレベルフォームに対し
て行って処理を終了する。
First, input one top-level form from the source file, check whether the form includes a proclaim form or a declare form, and if so, store the declared data type in the data type information storage table. This is then done for all top-level forms (steps 101-104). When this process is finished, rewind to the source file, fill in one top-level form from the source file,
Type inference is made for undefined variables from the information in the data type information storage table and the structure of the program, and the inferred variables and their data types are stored in the data type information storage table (steps 105 to 109). This process is performed for the top level of all files (step 110),
Next, a proclaim form for variables whose frame name is T in the data type information storage table and whose inference is T (inferred data type) is generated and output, and at the same time the inferences made for these variables are displayed. Display the results (step 111). Next, rewind to the source file, input one top-level form from the source file, check for each frame in the form whether there is a variable T in the data type information storage table, and if so, declare form for that variable. , output a top-level form that merges the form,
This is done for the top level forms in all files and the process ends.

【0026】以下に示すものはCommon  Lis
pにより記述されたデータ型宣言なしのプログラムを本
発明により変換した例を示すものである。
[0026] The following is a Common Lis.
This figure shows an example in which a program without a data type declaration written in p is converted according to the present invention.

【0027】入力したプログラムは次の通りである。The input program is as follows.

【0028】 {DSK }<home>reggae>ymasud
a>CLICHE>TIS>gabriel>infe
red>fft.lisp;1;;;FFT−−Thi
s is an FFT benchmark wri
ttn by Harry Barrow.;;;It
 tests a variety of float
ing point operations, inc
luding array ref−erences. ( defvar** ft−re**    (ma
ke−array 1025. :element−t
ype `float :initial−eleme
nt 0.0))( defvar** ft−im*
*    (make−array 1025. :e
lement−type `float :initi
al−element 0.0))(defun ff
t                        
             ;fast fourie
r transform       (areal 
aimag                    
        ;areal = real par
t   (prog                
                        ;
aimag = imaginary part   
 (ar ai i j k m n le le1 
ip nv2 nm1 ur ui wr wi tr
 ti)     (setq ar areal  
                    ;init
ialize           ai aimag
          n (array−dimens
ion areal 0)           n 
(1− n)          nv2 (floo
r n 2)           nm1 (1− 
n)          m 0          
                 ;compute
 m = log(n)           i 1
) l1 (cond ((< i n )       
   (setq m (1+ m)        
        i (+ i i))       
   (go l1)))    (cond ((n
ot (equal n (expt 2 m))) 
         (princ“error ...
 array size not a power o
f two.”)          (read)           (return (terpri
))))    (setq j 1        
                         
  ;interchange elements  
       i 1)              
                    ;in b
it−reversed order l3 (con
d ((< i j )          (set
q tr (aref ar j)        t
i (aref ai j)          (s
etf (aref ar j) (aref ar 
i)           (setf (aref 
ar j) (aref ai i)        
   (setf (aref ar i) tr) 
          (setf (aref ar 
i) ti)))    (setq k nv2)  l6 (cond ((< k j )       
   (setq j (− j k)       
          k (/ k 2))     
     (go 16)))     (setq 
j (+ j k)           i (1+
 i))     (cond ((< i n ) 
           (go 13)))    (
do ( (l 1 (1+ l)))       
  ((> l m))              
      ;loop thru stages  
      (setq le (expt 2 l)
               le1(floor 
le 2)               ur 1.
0              ui 0.0    
          wr (cos (/ pi (
float le1)))             
  wi (sin (/ pi (float le
1))))        (do ((j 1 (1
+ j)))            ((> j l
e1))              ;loop t
hru butterflies          
   (do ( (i j (+ i le))) 
                ((> i n))
            ;do a butterf
ly                (setq i
p(+ i le1)               
        tr(− (* (aref ar 
ip) ur)                  
         (* (aref ai ip) 
ui))            ti(+ (* (
aref ar ip) ui)          
                 (* (aref
 ai ip) ur)))            
    (setf (aref ar ip)(− 
(aref ar i) tr))         
        (setf (aref ai ip
)(− (aref ai i) ti))     
            (setf (aref a
r i)(+ (aref ar i) tr))  
              (setf (aref
 ai i)(+ (aref ai i) ti))
))        (setq tr (−(* u
r wr) (* ui wi))         
      ti (+(* ur wi) (* u
i wr))               ur t
r               ui  ti)  
               (return t)
));;; the timer which doe
s 10 calls on fft  (defun
 fft−bench ()   (dotimes 
(i 10)     (fft  **fft−re
**  **fft−im**))) ;;; cal
l:  (fft−bench)   これを本発明によるプログラム変換を行った結果、
次の様なproclaim、declareが挿入され
、データ型宣言が行われたプログラムを出力として得る
ことができた。
{DSK}<home>reggae>ymasud
a>CLICHE>TIS>gabriel>infe
red>fft. lisp;1;;;FFT--Thi
s is an FFT benchmark wri
ttn by Harry Barrow. ;;;It
tests a variety of float
ing point operations, inc.
luding array ref-erences. (defvar** ft-re** (ma
ke-array 1025. :element-t
ype'float: initial-eleme
nt 0.0)) (defvar** ft-im*
* (make-array 1025.:e
element-type 'float :initi
al-element 0.0)) (defun ff
t
;fast fourie
r transform (areal
aimag
;areal = real par
t (prog
;
aimag = imaginary part
(ar ai i j km n le le1
ip nv2 nm1 ur ui wr wi tr
ti) (setq ar areal
;init
realize ai aimag
n (array-dimens
ion area 0) n
(1-n) nv2 (floo
r n 2) nm1 (1-
n) m 0
;compute
m = log(n) i 1
) l1 (cond ((< i n )
(setq m (1+ m)
i (+i i))
(go l1))) (cond ((n
ot (equal n (expt 2 m)))
(princ“error...
array size not a power o
f two. ”) (read) (return (terpri)
)))) (setq j 1

;interchange elements
i1)
;in b
it-reversed order l3 (con
d ((< i j ) (set
q tr (aref ar j) t
i (aref ai j) (s
etf (aref ar j) (aref ar
i) (setf (aref
ar j) (aref ai i)
(setf (aref ar i) tr)
(setf (aref ar
i) ti))) (setq k nv2) l6 (cond ((< k j )
(setq j (− j k)
k (/k2))
(go 16))) (setq
j (+ j k) i (1+
i)) (cond ((< i n )
(go 13))) (
do ((l 1 (1+ l)))
((> l m))
;loop through stages
(setq le (expt 2 l)
le1(floor
le 2) ur 1.
0 ui 0.0
wr (cos (/ pi (
float le1)))
wi (sin (/ pi (float le
1)))) (do ((j 1 (1
+ j))) ((> j l
e1)) ;loop t
hru butterflies
(do ((i j (+ i le)))
((> i n))
;do a butterf
ly (setq i
p(+i le1)
tr(- (* (aref ar
ip) ur)
(* (aref ai ip)
ui)) ti(+ (* (
aref ar ip) ui)
(* (aref
ai ip) ur)))
(setf (aref ar ip) (-
(aref ar i) tr))
(setf (aref ai ip
)(- (aref ai i) ti))
(setf (aref a
r i) (+ (aref ar i) tr))
(setf (aref
ai i) (+ (aref ai i) ti))
)) (setq tr (-(* u
r wr) (* ui wi))
ti (+(* ur wi) (* u
i wr)) ur t
r uiti)
(return)
));;; the timer which does
s 10 calls on fft (defun
fft-bench () (dotimes
(i 10) (fft **fft-re
** **fft-im**))) ;;; cal
l: (fft-bench) As a result of program conversion according to the present invention,
The following proclaim and declare were inserted, and a program with data type declarations could be obtained as output.

【0029】 {DSK }<home>reggae>ymasud
a>CLICHE>TIS>gabriel>infe
red>fft.lisp;1;;;  ;;;CLICHE Type Inferer ou
tput for the source file 
: ;;; {DSK }<home>reggae>
ymasuda>CLICHE>TIS>gabrie
l>infered>fft.lisp;1;;;  ;;;  Source file created 
Monday, 4 February 1991,1
3:39:54 ;;;  Type infered
 file created Saturday, 1
6 February 1991,16:24:20;
;;  ;;;  ;;; Inference Level : 2 ;
;;  ;;; The literal NIL is ig
nored in type inference. 
;;;  ;;; Type Reduction Rules 
are follows. ;;;    ratio
nal  −−>fixnum;;;  (in−package `tis) (proclaim `((simple−array
 float 1025)             
 **fft−re**))(proclaim `(
(simple−array float 1025)
              **fft−im**)
)(proclaim `(function fft
 ((simple−array fioat 102
5)                       
    (simple−array fioat 1
025))                    
symbol)) (proclaim `(func
tion fft−bench nil nil)) 
(defvar **fft−re** (make−
array 1025 :element−type 
`float :initial−         
                         
                       el
ement0.0))(defvar **fft−i
m** (make−array 1025 :ele
ment−type `float :initial
−                        
                         
        element0.0))(defu
n fft (areal aimag)      
 (declare ((simple−array 
float 1025)              
   areal)               (
(simple−array float 1025)
               aimag))   
    (prog (ar ai i j k m 
n le le1 ip nv2 nm1 ur ui
 wr wi tr ti)            
 (declare ((simple−array 
float 1025)              
         ar)             
         ((simple−array f
loat 1025)            ai)                       (fi
xnum i)                  
    (fixnum j)           
           (fixnum k)    
                  (fixnum
 m)                      
(fixnum n)               
       (fixnum le)       
                (fixnum l
e1)                      
(fixnum ip)              
         (fixnum nv2)    
                  (fixnum
 nm1)                    
  (float wr)             
         (float wi)      
                (float tr
)                      (f
loat ti)             (set
q ar areal ai aimag n (ar
ray−dimension areal 0)   
                n        
           (1− n)        
            nv2          
         (floor n 2)     
              nm1        
           (1− n)        
            m 0 i 1)     
         l1               (cond ((< i 
n))                    (s
etq m (1+ m)             
             i           
                (+ i i)) 
                   (go l1
)))        (cond ((not (e
qual n (expt 2 m)))      
              (princ“erro
r ... array size not a po
wer of two.”)            
        (read)           
         (return (terpri)
))             (setq j 1 
i 1)              l3               (cond ((< i 
j)                     (s
etq tr (aref ar j)       
                   ti    
                      (ar
ef ai j))                
    (setf (aref ar j)    
                       (a
ref ar i))               
     (setf (aref ai j)   
                        (
aref ai i))              
      (setf (aref ar i)  
                         
tr)                     (
setf (aref ai i)         
                  ti)))  
            (setq k nv2) 
             l6               (cond ((< k 
j)                     (s
etq j (− j k)            
               k         
                  (/ k 2)
)                    (go 
l6)))               (setq
 j (+ j k )              
      i                  
   (1+ i))               
(cond ((< i n)           
(go l3)))                
(do ((l 1 (1+ l)))       
           ((< l m)      
          (declare (fixnu
m l))                (set
q le (expt 2 l)          
             le1         
              (floor le 2
 )                       
ur 1.0 ui 0.0 wr (cos (/ 
pi (float le1)))         
              wi         
             (sin (/ pi (
float le1)))             
 (do ((j 1 (1+ j)))      
            ((> j le1)   
             (declare (fi
xnum j))              (do
 ((i j (+ i le)))        
          ((> i n))      
           (declare (fixn
um i))                (se
tq ip (+ i le1)          
            tr           
           (− (* (aref ar
 ip)                     
       ur)               
           (* (aref ai ip
)                        
    ui))                 
     ti                  
    (+ (* (aref ar ip)   
                         
ui)                      
    (* (aref ai ip)      
                      ur)
))                 (setf 
(aref ar ip)             
         (− (aref ar i)  
                       tr
))                 (setf 
(aref ai ip)             
         (− (aref ai i)  
                       ti
))                 (setf 
(aref ar i)              
         (+ (aref ar i)  
                       tr
))                 (setq 
(aref ai i)              
         (+ (aref ai i)  
                       ti
))))            (setq tr 
(− (* ur wr)             
          (* ui wi))     
             ti          
           (+ (* ur wi)  
                     (* u
i wr))                  u
r tr ui ti))         (ret
urn t))) (defun fft−bench
 nil (dotimes (i 10)     
                    (decl
are (fixnum i))          
                (fft **ff
t−re**  **fft−im**)))    なお、上記実施例では型推論を行った結果を表示し
、かつソースコードにその結果をマージしたものを出力
するようにしたが、本発明はこれに限定されるものでは
なく、単にソースコードを入力し、型推論を行った結果
をソースコードにマージしたものを出力するような処理
系として実現してもよく、この場合コンパイラーの補助
機能として本発明のプログラム変換装置を組み込むよう
にしてもよい。また、型推論結果の出力は画面、ファイ
ル、宣言文の出力されるファイルのいずれであっても良
い。
{DSK}<home>reggae>ymasud
a>CLICHE>TIS>gabriel>infe
red>fft. lisp;1;;;;;;CLICHE Type Inferer ou
tput for the source file
: ;;; {DSK}<home>reggae>
ymasuda>CLICHE>TIS>gabrie
l>infered>fft. lisp;1;;;;;;Source file created
Monday, 4 February 1991, 1
3:39:54 ;;; Type infered
file created Saturday, 1
6 February 1991, 16:24:20;
;;;;;;;;; Inference Level: 2;
;; ;;; The literal NIL is ig
nored in type inference.
;;; ;;; Type Reduction Rules
are follows. ;;; ratio
nal -->fixnum;;; (in-package 'tis) (proclaim '((simple-array
float 1025)
**fft-re**)) (proclaim `(
(simple-array float 1025)
**fft-im**)
)(proclaim `(function fft
((simple-array fioat 102
5)
(simple-array fioat 1
025))
symbol)) (proclaim `(func)
tion fft-bench nil nil))
(defvar **fft-re** (make-
array 1025: element-type
'float: initial-

el
element0.0))(defvar **fft-i
m** (make-array 1025:ele
ment-type 'float: initial


element0.0))(defu
n fft (areal aimag)
(declare ((simple-array
float 1025)
areal) (
(simple-array float 1025)
aimag))
(prog (ar ai i j km
n le le1 ip nv2 nm1 ur ui
wr wi tr ti)
(declare ((simple-array
float 1025)
ar)
((simple-array f
loat 1025) ai) (fi
xnum i)
(fixnum j)
(fixnum k)
(fixnum
m)
(fixnum n)
(fixnum le)
(fixnum l
e1)
(fixnum ip)
(fixnum nv2)
(fixnum
nm1)
(float wr)
(float wi)
(float tr
) (f
loat ti) (set
q ar real ai aimag n (ar
ray-dimension area 0)
n
(1-n)
nv2
(floor n 2)
nm1
(1-n)
m 0 i 1)
l1 (cond ((< i
n)) (s
etq m (1+ m)
i
(+i i))
(go l1
))) (cond ((not (e
qual n (expt 2 m)))
(prince “erro
r. .. .. array size not a po
Were of two. ”)
(read)
(return (terpri)
)) (setq j 1
i 1) l3 (cond ((< i
j) (s
etq tr (aref ar j)
Ti
(ar
ef ai j))
(setf (aref ar j)
(a
ref ar i))
(setf (aref ai j)
(
aref ai i))
(setf (aref ar i)

tr) (
setf (aref ai i)
ti)))
(setq k nv2)
l6 (cond ((< k
j) (s
etq j (- j k)
k
(/k2)
) (go
l6))) (setq
j (+ j k )
i
(1+i))
(cond ((< i in)
(go l3)))
(do ((l 1 (1+ l)))
((< l m)
(declare (fixnu)
m l)) (set
q le (expt 2 l)
le1
(floor le 2
)
ur 1.0 ui 0.0 wr (cos (/
pi (float le1)))
wi
(sin (/ pi (
float le1)))
(do ((j 1 (1+ j)))
((> j le1)
(declare (fi)
xnum j)) (do
((i j (+ i le)))
((> i n))
(declare (fixn)
um i)) (se
tq ip (+ i le1)
tr
(- (* (aref ar
ip)
ur)
(* (aref ai ip
)
ui))
Ti
(+ (* (aref ar ip)

ui)
(* (aref ai ip)
ur)
)) (setf
(aref ar ip)
(- (aref ar i)
tr
)) (setf
(aref ai ip)
(- (aref ai i)
Ti
)) (setf
(aref ar i)
(+ (aref ar i)
tr
)) (setq
(aref ai i)
(+ (aref ai i)
Ti
)))) (setq tr
(- (* ur wr)
(* ui wi))
Ti
(+ (* ur wi)
(* u
i wr)) u
r tr ui ti)) (ret
urn t))) (defun fft-bench
nil (dotimes (i 10)
(decl
are (fixnum i))
(fft **ff
t-re** **fft-im**)))) In the above example, the result of type inference is displayed and the result is merged with the source code and output. The invention is not limited to this, and may be realized as a processing system that simply inputs source code and outputs the result of type inference merged with the source code. The program conversion device of the present invention may be incorporated as a function. Further, the type inference results may be output to a screen, a file, or a file in which declaration statements are output.

【0030】[0030]

【発明の効果】以上のように本発明によれば、型推論を
した結果から、ユーザはどの変数に対するデータ型情報
が不足しているかを知り、また型推論の結果がデータ型
宣言文としてソースコードに挿入されるため、従来のよ
うにユーザは推論結果をみていちいちデータ型宣言を挿
入する必要がなく、またユーザがこれらの出力されたデ
ータ型宣言を編集して適切なデータ型を指定することに
よりコンパイラーはより効率的をオブジェクトコードを
出力することが可能となる。
[Effects of the Invention] As described above, according to the present invention, from the result of type inference, the user can know for which variable data type information is lacking, and the result of type inference can be used as a data type declaration statement as a source. Because it is inserted into the code, the user does not have to insert data type declarations each time after checking the inference results as in the past, and the user can edit these output data type declarations to specify the appropriate data type. This allows the compiler to output object code more efficiently.

【図面の簡単な説明】[Brief explanation of drawings]

【図1】  本発明のプログラム変換装置の機能ブロッ
ク図である。
FIG. 1 is a functional block diagram of a program conversion device of the present invention.

【図2】  装置構成を示す図である。FIG. 2 is a diagram showing the device configuration.

【図3】  データ型情報格納テーブルを示す図である
FIG. 3 is a diagram showing a data type information storage table.

【図4】  COMMON  LISPの説明図である
FIG. 4 is an explanatory diagram of COMMON LISP.

【図5】  型推論の処理フローを示す図である。FIG. 5 is a diagram showing the processing flow of type inference.

【図6】  型推論の処理フローを示す図である。FIG. 6 is a diagram showing the processing flow of type inference.

【符号の説明】[Explanation of symbols]

1…プログラム変換装置、11…データ型情報検出手段
、12…型推論手段、13…データ型情報追加手段、1
4…データ型情報格納テーブル、2…入力手段、3…出
力手段、21…CPU、211…データ型情報検出部、
212…型推論部、213…データ型情報追加部、22
…主メモリ、221…データ型情報、222…推論情報
、23…出力装置、24…入力装置、25…外部記憶装
置、30,31,32…フレーム、35,36…トップ
レベル。
DESCRIPTION OF SYMBOLS 1...Program conversion device, 11...Data type information detection means, 12...Type inference means, 13...Data type information addition means, 1
4...Data type information storage table, 2...Input means, 3...Output means, 21...CPU, 211...Data type information detection unit,
212...Type inference unit, 213...Data type information addition unit, 22
...Main memory, 221...Data type information, 222...Inference information, 23...Output device, 24...Input device, 25...External storage device, 30, 31, 32...Frame, 35, 36...Top level.

Claims (1)

【特許請求の範囲】[Claims] 【請求項1】  ソースプログラムを同一または別のプ
ログラミング言語のソースコードあるいは機械語に変換
する装置において、入力されたソースコード中に存在す
る変数に関するデータ型情報を検出するデータ型情報検
出手段と、検出したデータ型情報を保持するデータ型情
報格納テーブルと、該テーブルに保持された各変数に関
するデータ型情報に基づいて、データ型が明示的に宣言
されていない変数に対して型推論を行い、推論結果を前
記テーブルに登録する型推論手段と、型推論の結果から
データ型が明示的に宣言されていない変数についてソー
スコード中にデータ型情報を追加するデータ型情報追加
手段と、型推論結果を出力する出力手段とを備えたこと
を特徴とするプログラム変換装置。
1. In an apparatus for converting a source program into source code or machine language of the same or different programming language, data type information detection means for detecting data type information regarding variables existing in input source code; Based on a data type information storage table that holds detected data type information and data type information regarding each variable held in the table, type inference is performed for variables whose data types are not explicitly declared; a type inference means for registering the inference results in the table; a data type information addition means for adding data type information to the source code for variables whose data types are not explicitly declared based on the result of the type inference; and a type inference result. A program conversion device comprising: output means for outputting.
JP3084179A 1991-04-16 1991-04-16 Program conversion device Pending JPH04317133A (en)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP3084179A JPH04317133A (en) 1991-04-16 1991-04-16 Program conversion device

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP3084179A JPH04317133A (en) 1991-04-16 1991-04-16 Program conversion device

Publications (1)

Publication Number Publication Date
JPH04317133A true JPH04317133A (en) 1992-11-09

Family

ID=13823261

Family Applications (1)

Application Number Title Priority Date Filing Date
JP3084179A Pending JPH04317133A (en) 1991-04-16 1991-04-16 Program conversion device

Country Status (1)

Country Link
JP (1) JPH04317133A (en)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2011113394A (en) * 2009-11-27 2011-06-09 Internatl Business Mach Corp <Ibm> Method for converting source code written in dynamic typing language into target code written in static typing language and executing the same, and computer program and computer system for the method

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2011113394A (en) * 2009-11-27 2011-06-09 Internatl Business Mach Corp <Ibm> Method for converting source code written in dynamic typing language into target code written in static typing language and executing the same, and computer program and computer system for the method
US8627281B2 (en) 2009-11-27 2014-01-07 International Business Machines Corporation Method, computer program and computer system for converting source code written in dynamically typed language into target code written in statically typed language and executing target code

Similar Documents

Publication Publication Date Title
US5680622A (en) System and methods for quickly detecting shareability of symbol and type information in header files
US5761510A (en) Method for error identification in a program interface
US7962888B2 (en) Producing unitary class definitions from module specifications
US7526753B2 (en) System and method for creating, managing and using code segments
Konat et al. Declarative name binding and scope rules
US6202202B1 (en) Pointer analysis by type inference for programs with structured memory objects and potentially inconsistent memory object accesses
US7240340B2 (en) System and method for browse information parsing without compilation
AU2004232058A1 (en) Method and system for detecting vulnerabilities in source code
Favre Preprocessors from an abstract point of view
Chen et al. A C++ data model supporting reachability analysis and dead code detection
Spinellis Global analysis and transformations in preprocessed languages
US7669191B1 (en) Compile-time dispatch of operations on type-safe heterogeneous containers
US8910137B2 (en) Code profiling of executable library for pipeline parallelization
US20070142929A1 (en) Specifying optional and default values for method parameters
Teixeira et al. Multi-language static code analysis on the lara framework
CA2428558C (en) System and method for defining and using subclasses declaratively within markup
Morgan et al. Profiling large-scale lazy functional programs
Garcia et al. Design and implementation of an efficient hybrid dynamic and static typing language
US5884081A (en) Method and system for synchronizing code with design
Steinbeck et al. Javadoc violations and their evolution in open-source software
JPH04317133A (en) Program conversion device
JP3266097B2 (en) Automatic reentrant method and system for non-reentrant program
CN114489653A (en) Compiler-based data processing method, compiler-based data processing device and readable storage medium
Alaküla et al. Property probes: Live exploration of program analysis results
Atterer Automatic test data generation from VDM-SL specifications