KR100323372B1 - 이엠 코드에 대한 실행시간 스택의 타입 분석 방법 - Google Patents

이엠 코드에 대한 실행시간 스택의 타입 분석 방법 Download PDF

Info

Publication number
KR100323372B1
KR100323372B1 KR1019990006512A KR19990006512A KR100323372B1 KR 100323372 B1 KR100323372 B1 KR 100323372B1 KR 1019990006512 A KR1019990006512 A KR 1019990006512A KR 19990006512 A KR19990006512 A KR 19990006512A KR 100323372 B1 KR100323372 B1 KR 100323372B1
Authority
KR
South Korea
Prior art keywords
stack
type
code
analysis
operator
Prior art date
Application number
KR1019990006512A
Other languages
English (en)
Other versions
KR20000056822A (ko
Inventor
이광근
이욱세
김병철
Original Assignee
서평원
엘지정보통신주식회사
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 서평원, 엘지정보통신주식회사 filed Critical 서평원
Priority to KR1019990006512A priority Critical patent/KR100323372B1/ko
Publication of KR20000056822A publication Critical patent/KR20000056822A/ko
Application granted granted Critical
Publication of KR100323372B1 publication Critical patent/KR100323372B1/ko

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30098Register arrangements
    • G06F9/3012Organisation of register space, e.g. banked or distributed register file
    • G06F9/30134Register stacks; shift registers
    • GPHYSICS
    • G06COMPUTING; CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation

Abstract

본 발명은 EM(End of Medium character) 코드에 대한 실행시간 스택의 타입 분석에 관한 것으로, 특히 스택을 기반으로 하는 EM 코드를 레지스터를 기반으로 하는 어셈블리어로 변환하는 컴파일러에 있어, 명령어 전/후에 실행시간 스택의 타입을 분석하도록 함으로써, 기본 블록간에 소정 값을 전달하는 경우 스택을 사용하지 않고 레지스터를 사용할 수 있도록 한 EM 코드에 대한 실행시간 스택의 타입 분석 방법에 관한 것이다.
종래에는 가상 스택 방법을 이용하여 컴파일을 수행하므로 기본 블록간에 스택을 통해 소정 값을 전달하는 경우 해당 전달 값들이 적재된 스택의 타입(적재된 값의 종류와 개수)을 알 수 없어 레지스터를 기반으로 하는 효율적인 코드를 생성할 수 없다는 문제점이 있고, 이에 따라 컴파일된 코드의 처리 속도가 늦은 단점이 있었다.
본 발명은 도메인과 타입 분석 함수 및 합치는 연산자를 정의하고, 해당 정의한 요소들을 이용하여 실행시간 스택의 타입을 분석함으로써, 기본 블록 내부만이 아니라 해당 기본 블록간에도 레지스터를 기반으로 하는 효율적인 코드를 생성할 수 있게 되어 컴파일된 코드의 처리 속도가 향상되는 효과가 있다.

Description

이엠 코드에 대한 실행시간 스택의 타입 분석 방법{Type Reconstruction Method Of Run Time Stack For EM Code}

본 발명은 EM(End of Medium character) 코드에 대한 실행시간 스택의 타입 분석에 관한 것으로, 특히 스택을 기반으로 하는 EM 코드를 레지스터를 기반으로하는 어셈블리어로 변환하는 컴파일러에 있어, 명령어 전/후에 실행시간 스택의 타입을 분석하도록 함으로써, 기본 블록간에 소정 값을 전달하는 경우 스택을 사용하지 않고 레지스터를 사용할 수 있도록 한 EM 코드에 대한 실행시간 스택의 타입 분석 방법에 관한 것이다.

일반적으로, 교환 시스템 프로그램은 실시간 동작을 중점적으로 수행해야 하므로 해당 시스템의 기능 수행에 있어서 실시간의 제한을 많이 받는다. 특히 하드웨어 장치를 제어하는 하위레벨 프로세스의 경우는 실시간 성격이 더욱 강하며, 상위레벨 프로세스의 경우는 하위레벨에 비하여 실시간 성격은 약하지만 하위레벨 프로세스에서 처리된 메시지의 처리 및 응답 등을 수행하는데 있어서 실시간 처리가 요구된다.

따라서, 대부분의 교환 시스템의 경우 실시간 성격이 강한 하위레벨 프로세스에서는 MC68xxx 어셈블리 언어와 C 언어를 사용하였으며, 보다 기능적 처리에 주된 기능을 수행하는 상위레벨 프로세스에서는 보다 쉬운 프로그래밍, 판독성(readability)의 향상, 소프트웨어의 유지보수성 향상, 이식성(portability)의 향상을 제공할 수 있는 CHILL(CCITT HIgh-Level Language) 언어를 사용하였다.

또한, 해당 CHILL 언어의 사용은 국제 경쟁력의 향상, 동시 처리(concurrent processing) 달성, 엄격한 타입 검사(type checking)에 의한 품질 향상 등을 제공할 수 있기 때문에 하위레벨 프로세스에서도 표준화를 위하여 CHILL 언어의 사용을 원칙으로 하고 있으며, 필요한 경우 어셈블리 명령어를 CHILL 언어와 혼용하여 사용하도록 권고하고 있다.

한편, CHILL 언어를 입력받아 시스템의 중앙처리장치에서 사용할 수 있는 실제 코드를 생성하는 컴파일러의 경우 ACK를 사용하여 개발할 수 있으며, 해당 ACK(Amsterdam Compiler Kit)에서는 컴파일러를 손쉽게 만들기 위해 어셈블리어 수준의 중간언어(intermediate language)인 EM 코드를 사용하는데, 해당 EM 코드는 스택을 기반으로 하는 언어로서, 함수 호출시 파라미터와 결과 값을 주고 받을 때, 산술 연산 등 기본적인 수행에 스택을 이용할 뿐, 레지스터를 다루는 명령어가 없고, 단지 내부적으로 쓰는 몇몇 레지스터들을 가정하고 있다.

그리고, 해당 EM 코드를 중간언어로 사용하는 컴파일러는 해당 CHILL 언어 즉, 소스(source) 언어를 입력받아 EM 코드로 변환하는 전단부(front-end) 컴파일러와, 해당 EM 코드를 실제 코드 즉, 목적(target) 어셈블리어로 변환하는 후단부(back-end) 컴파일러로 구성되는데, 이때 해당 EM 코드를 레지스터 기반으로 하는 기계어로 변환하는 후단부 컴파일러(현재, EM-to-SPARC 컴파일러가 구현되어 있다)에서는 가상 스택 방법을 사용하고 있다.

이러한 가상 스택 방법을 사용하는 컴파일러의 동작 원리를 첨부된 도면 도 1과 같이 입력언어와 결과언어를 정의하여 설명하면 다음과 같다.

해당 입력언어는 EM 코드의 주요 명령어들을 나타낸 언어이고, 해당 결과언어는 레지스터를 기반으로 하는 중간언어로서, 결과언어를 중간언어로 한 이유는 기술하고자 하는 종래 기술의 문제점을 보다 정확히 표현하기 위한 것으로 실제 기계어에서 발생될 수 있는 문제들 즉, 레지스터 할당(register allocation), 명령어순서 배열(instruction scheduling) 등을 제외하였다.

여기서, 도 1의 (가)를 보다 상세히 설명하면, 해당 입력언어는 한 단어(word, 4바이트)를 기본 단위로 하는 스택을 기반으로 하는 언어로서, 사용되는 값으로는 크기가 한 단어인 정수형과, 크기가 두 단어 즉, 스택에 적재하거나 읽어낼 때 해당 스택의 두 단어 공간이 사용되는 실수형이 있다.

해당 명령어(instr)에는 스택에서 τ형의 값 두 개를 읽어들여 계산한 후 그 결과를 해당 스택에 적재하는sop와, 스택에서 τ형의 값 두 개를 읽어들여 'boolop'에 따라 비교한 후 참이면 '1'을, 거짓이면 '0'을 해당 스택에 적재하는 CMPτ boolop와, τ형의 값v(v τ )를 스택에 적재하는 PUSHv τ와, 스택에서 정수형 번지 값을 읽어들인 후, 해당 번지 값이 지정하는 메모리로부터size크기의 값을 읽어들여 해당 스택에 적재하는 LOIsize와, 스택에서 정수형 번지 값과 size 크기의 값을 읽어들인 후, 해당 번지 값이 지정하는 메모리에size크기의 값을 기록하는 STIsize와, size 크기의 값을 스택에서 제거하는 POP size와, 스택의 최상위에 적재된 τ형의 값을 한 번 더 적재하는 DUPτ와, 무조건label로 분기하는 JMPlabel과, 조건에 따라 즉, 스택에서 정수 값을 읽어들여 '0'이 아니면 분기하고, '0'이면label로 분기하는 BCClabel이 있다.

그리고, 도 1의 (나)를 보다 상세히 설명하면, 해당 결과언어는 정수형 또는 실수형 레지스터 기반의 언어로서, 해당 τ n 은 인덱스(index)가n인 τ형 레지스터를 의미하고, M[e i ]는e i 가 지시하는 주소의 메모리를 의미한다. 그리고, 해당 PUSH e τ 와, JMPlabel과, BCCe b label과, POP τ 는 종래 기술의 문제점을 설명하기 위해 삽입한 스택 명령어로서, 예를 들어, 스택 포인터를i 1이라 가정하면, PUSHe i 는 'i 1 i 1 +1; M[i 1 ]←e i '의 두 명령어와 동일한 기능을 수행한다.

상술한 바와 같은 가상 스택 방법은 실행시간 스택(run-time stack)을 시뮬레이션하여 결과코드를 생성해 주는데, 해당 가상 스택은 결과코드(결과언어) 또는 이와 유사한 코드를 내용으로 하는 스택으로서, 도 1의 (나)에 도시된e τ,e b 를 원소로 하는 스택이며, [e 1,e 2, …,e n]과 같이 가상 스택이 적재된 경우 왼쪽 즉,e 1을 스택 입구(top)로 본다.

또한, 해당 가상 스택 방법은 각각의 EM 명령어가 실행 중에 동작하는 것을 코드로 표현하되 실제 스택을 가상 스택으로 흉내를 내어 코드를 생성하는 것으로, 아래 표 1을 예를 들어 설명하면 다음과 같다.

입력코드 가상 스택 출력된 결과코드 PUSHbPUSHcADD i SUB i PUSH 0STI 1 [][b][c,b][c+b][i 0 -(c+b)][0,i 0 -(c+b)][] i 0 ←POP i M[0]←i 0 -(c+b)

여기서, ADD i 명령에 의해 두 정수 코드인 'c'와 'b'를 가상 스택에서 읽어들여 가산한 코드 'c+b'가 가상 스택에 적재된 후, SUB i 명령을 수행해야 하는데,이때, 해당 가상 스택에 하나의 값만이 적재되어 있으므로 실제 스택에서 읽어오는 명령을 생성하게 된다. 즉, 새로운 정수형 레지스터 'i 0 '에 대해 'i 0 ←POP i '를 생성하고 가상 스택은 [i 0 ]이 되어 해당 SUB i 명령을 수행한 결과, 해당 가상 스택에는 'i 0 -(c+b)'가 적재된다. 그리고, PUSH 0 명령에 의해 '0,i 0 -(c+b)'가 가상 스택에 적재된 후, STI 1 명령에 의해 결과코드 'M[0]←i 0 -(c+b)'가 생성되고, 해당 가상 스택은 비게 된다.

그런데, 전술한 바와 같은 종래의 가상 스택 방법에서는 기본 블록(basic block) 내에서만 효율적인 코드를 생성할 수 있었다. 즉, 분기 명령어에 대해서는 효율적인 코드를 생성할 수 없었다. 여기서, 효율적인 코드라 함은 스택(메모리)이 아닌 레지스터를 임시 저장 장소로 사용하고, 생성되는 기계어 코드의 수가 적은 것 즉, 스택을 사용하는 코드보다는 레지스터를 사용하는 코드를 의미한다.

예를 들어, 첨부된 도면 도 3을 살펴보면 해당 EM 프로그램 즉, 입력코드 측은 4개의 기본 블록(A, B, C, D)으로 이루어져 있고, 가능한 제어 흐름은 'A→B→D'와 'A→C→D'가 있고, 초기 가상 스택은 소정의 불린(boolean) 코드 'e b '이다. 여기서, 기본 블록 A가 입력으로 주어지면 가상 스택은 비게 되고, 기본 블록 B가 입력으로 주어지면 가상 스택은 [30,50]이 되며, 기본 블록 C가 입력으로 주어지면 가상 스택은 [20,40]이 된다. 따라서, 기본 블록 D를 입력으로 받기 전에 가상 스택은 두 가지의 경우 즉, 기본 블록 B를 실행한 후와 기본 블록 C를 실행한후의 경우를 나타낼 수 있고, 해당 가상 스택 [30,50]과 [20,40]을 동시에 나타낼 수 있는 가상 스택은 없으므로, 종래에는 기본 블록 B, C의 입력코드를 수행한 후 해당 가상 스택에 적재된 코드들을 실제 스택에 적재하는 명령어를 삽입하고, 기본 블록 D의 입력코드 이전에 해당 가상 스택을 비우고 시작하면 해당 가상 스택을 통해 값이 전달되어 도 2와 같은 결과코드(1)가 생성된다.

따라서, 종래에는 가상 스택 방법을 이용하여 컴파일을 수행하므로 기본 블록간에 스택을 통해 소정 값을 전달하는 경우 해당 전달 값들이 적재된 스택의 타입(적재된 값의 종류와 개수)을 알 수 없어 레지스터를 기반으로 하는 효율적인 코드를 생성할 수 없다는 문제점이 있고, 이에 따라 컴파일된 코드의 처리 속도가 늦은 단점이 있었다.

본 발명은 전술한 바와 같은 문제점을 해결하기 위한 것으로 그 목적은, 도메인과 타입 분석 함수 및 합치는 연산자를 정의하고, 해당 정의한 요소들을 이용하여 실행시간 스택의 타입을 분석함으로써, 기본 블록 내부만이 아니라 해당 기본 블록간에도 레지스터를 기반으로 하는 효율적인 코드를 생성할 수 있도록 하는데 있다.

도 1은 종래 컴파일러에 대한 입력언어와 결과언어를 정의한 도면.

도 2는 입력코드에 대해 생성된 결과코드를 도시한 도면.

도 3은 본 발명에 따른 실행시간 스택의 타입 분석을 적용한 컴파일러의 동작 순서도.

도 4는 본 발명에 따른 스택 타입의 기본 연산자와 합치는 연산자를 정의한 도면.

도 5는 본 발명에 따른 타입 분석 함수를 정의한 도면.

도 6은 본 발명에 따른 n!을 계산하는 입력코드에 대한 분석을 예시한 도면.

상기와 같은 목적을 달성하기 위한 본 발명의 특징은, 실행시간 스택을 기반으로 하는 EM 코드를 입력받아 레지스터를 기반으로 하는 어셈블리어 코드로 변환하는 컴파일러에 있어서, 상기 실행시간 스택을 기반으로 하는 EM 코드를 입력받는 과정과; 입력받은 EM 코드에 대한 실행시간 스택의 타입을 합치는 연산자를 이용하여 소정의 타입 분석 함수에 따라 분석하여 얻은 분석 값을 도메인으로 표현한 후에 상기 도메인을 이용하여 실행시간 스택의 타입을 분석하는 과정과; 상기 분석 결과로서 각 기본 블록 사이에 전달되는 분석 값을 저장할 레지스터를 할당한 후에 가상 스택 방법에 따라 어셈블리어 코드를 생성하는 과정을 포함하는 이엠 코드에 대한 실행시간 스택의 타입 분석 방법을 제공하는데 있다.

한편, 상기 도메인은 스택의 내용이 없음을 표현하는 바텀 또는 원소들의 시퀀스 중 소정 길이 이하인 것들에 모든 것이 가능함을 의미하는 탑을 붙여 생성한 분석 값으로 표현하는 것을 특징으로 하며, 상기 타입 분석 함수는 EM 프로그램에 대해 앞에서부터 분석하는 순방향 분석 함수와, 해당 EM 프로그램에 대해 뒤에서부터 분석하는 역방향 분석 함수를 포함하는 것을 특징으로 하고, 상기 합치는 연산자는 두 개 이상의 스택 타입이 가능한 경우 해당 두 스택 타입을 함의하는 스택 타입을 결정하는 연산을 수행하도록 하는 것을 특징으로 한다.

나아가, 상기 실행시간 스택의 타입을 분석하는 과정은, 상기 실행시간 스택의 타입을 분석하는 과정은, EM 프로그램의 각 명령어 또는 기본 블록을 노드로 하는 각 노드에 초기 분석 값으로 아무 것도 가능하지 않음을 나타내는 분석 값 바텀 '⊥'을 저장하되, 타입 분석 함수에 따라 시작 노드 또는 끝 노드에 모든 것이 가능함을 나타내는 분석 값 탑 ''을 저장하는 단계와; 입력받은 EM 코드의 각 명령어에 대해 바로 이전 분석 값을 상기 타입 분석 함수에 입력으로 제공하면서 합치는 연산자로 연산된 분석 결과 값에 대한 도메인이 변화하지 않기까지 해당되는 실행시간 스택의 타입 분석을 반복 수행하는 단계를 포함하는 것을 특징으로 한다.

이하, 본 발명의 실시예를 첨부한 도면을 참조하여 상세하게 설명하면 다음과 같다.

본 발명에 따른 교환 시스템에서의 컴파일러는 첨부한 도면 도 3과 같은 과정을 통하여 컴파일하는데, 먼저, EM 프로그램이 입력되면, 입력된 EM 프로그램의 구문을 분석하여(스텝 S1), 내부 표현방식(abstract syntax tree)으로 변환한다.

그리고, 해당 EM 프로그램을 레지스터 기반의 중간언어인 MLTree로 변환하되, 해당 EM 프로그램의 분석 값을 표현하는 도메인(domain)과, 각 명령어에서의 타입 분석 함수 및 해당 분석 값을 합치는 연산자를 정의하여 실행시간 스택의 타입을 분석한 후(스텝 S2), 분석한 스택 타입 정보와 가상 스택 방법을 이용하여 EM 코드와 어셈블리어와의 의미적 차이(semantic gap)를 보완해주는 중간 표현인 해당 MLTree로 변환한다(스텝 S3).

이후, 변환한 MLTree를 레지스터가 무한히 많다는 가정하에 어셈블리어 코드로 생성하고(스텝 S4), 생성한 어셈블리어 코드에 대해 각각 레지스터를 할당한 후(스텝 S5), 해당 어셈블리어 코드를 출력함으로써, 해당 시스템의 프로세스에서 실시간 동작을 수행할 수 있게 된다.

특히, 본 발명에서는 교환 시스템의 컴파일 동작 중에 수행되는 EM 코드에 대한 실행시간 스택의 타입을 분석하는 방법을 제공함으로써, 소정의 기본 블록 내부에서만이 아니라 해당 기본 블록간에도 레지스터를 기반으로 하는 효율적인 코드를 생성할 수 있게 된다.

본 발명에 따른 EM 코드에 대한 실행시간 스택의 타입 분석은 분석 값을 표현하는 도메인과, 각 명령어에서의 타입 분석 함수 및 해당 분석 값을 합치는 연산자(join operation)를 정의한 후, 해당 도메인과 타입 분석 함수 및 합치는 연산자를 이용하여 일반적으로 널리 알려진 분석 틀인 'CC77' 즉, 요약 해석 방법(abstract interpretation)에 의해 분석할 수 있게 되는데, 이러한 동작은 해당 EM 코드가 입력으로 주어지는 경우 각 명령어 전/후에 실행시간 스택의 타입을 분석하게 되는 것이다.

해당 분석 값을 표현하는 도메인(D)은 아래 수학식 1과 같이, 어떤 프로그램 지점이 수행될 수 없는 경우 가능한 스택의 내용이 없음을 표현하는 바텀(bottom) '⊥'이거나 'S'의 원소들의 시퀀스(sequence) 중 소정 길이(k) 이하인 것들에 모든 것이 가능함을 의미하는 탑(top ;)이 붙어 이루어진 'S≤k '로서 분석 값을 나타내게 되는데, 여기서, 해당 'S'는 불린(boolean) 타입의 원소(B) 또는 정수형 레지스터에 저장 가능한 원소(I) 또는 실수형 레지스터에 저장 가능한 원소(F) 또는 특정 타입으로 사용되지 않았음을 의미하는 정해지지 않은 타입의 원소(U w ) 또는 정의할 수 없는 타입 즉, 정수와 실수로 동시에 사용되어 메모리를 통하여 연산을 수행해야 하는 타입의 원소(N)를 의미한다. 예를 들어, 어떤 프로그램의 한 지점에서 분석 값이 'II'이라면, 이는 실제 실행시간에 그 시점을 통과할 때 스택 입구부터 두 개의 정수 타입 원소가 있고, 그 이하는 모든 것이 가능함을 의미한다.

해당 합치는 연산자는 두 개 이상의 스택 타입이 가능한 경우 첨부한 도면도 4와 같이 몇 가지의 기본적인 연산자 즉, 스택 내용의 크기를 결정하는 연산자와, 앞 자르는 연산자(hd d )와, 뒤 자르는 연산자(tl d ) 및 붙이는 연산자를 이용하여 해당 두 스택 타입을 함의(implication)하는 스택 타입을 결정하기 위한 연산자로서, 어떤 프로그램 지점에서 스택 타입 σ, τ가 모두 가능하다면, 그 지점의 스택 타입은 'σ∪τ'가 되는 것이다.

한편, 도 4의 (가)는 크기를 결정하는 연산자로서, 해당 크기 단위로는 단어(word)를 사용한다.

그리고, 도 4의 (나)는 도메인(D)의 원소의 앞을 자르는 연산자(hd d )로서, S*의 원소를 입력으로 받아 스택의 앞으로부터d크기만큼 자른 값을 전달하는 연산을 수행하도록 하는데, 도면에 정의된 내용을 보다 구체적으로 설명하면, ''은 어떤 경우라도 0 크기만큼' 앞을 자르면 빈 것(ε)이 됨을 의미하고, ''는 x의 앞을 d 크기만큼 자르려는데 x가 d 보다 작거나 같다면 그냥 x 가 됨을 의미하며, ''은 실수 값(F)은 길이가 2 인데, 1 크기만 잘라내면 정수와 실수로 동시에 사용된 값(N)으로 됨을 의미하고, ''는 길이가 w 이고 정수로도 실수로도 쓰이지 않은 값(UW)을 w보다 작게 앞을 자르면 길이가 d 이고 정수로도 실수로도 쓰이지 않은 값(Ud)이 됨을 의미하며, ''와 ''는 s와 x로 연결된 것을 d 크기만큼 자르려는데, s의 길이가 d 보다 크거나 같다면 x 와 상관없이 s를 d 개만큼 자른 것과 같게 됨을 의미하고, 그렇지 않다면 즉, s 가 d 보다 작다면 x에서 'd - (s의 크기)' 크기만큼 잘라낸 것의 앞에 s를 붙인 것과 같게 됨을 의미한다. 또한, 도 4의 (다)는 도메인(D)의 원소의 뒤를 자르는 연산자(tl d )로서, S*의 원소를 입력으로 받아 스택의 앞으로부터d크기만큼 자르고 남은 값을 전달하는 연산을 수행하도록 하는데, 만약, 입력이d크기보다 작은 경우 해당 입력 값을 전달(hd d x=xif ∥x∥≤d)하게 되지만, 실수 타입 F는 크기가 두 단어(2 word)이므로 한 단어씩 자르면 N이 된다. 즉,hd 1 F=N이고tl 1 F=N이 되는데, 이것은 실수 타입이 나뉘어져 사용되면 타입을 정의할 수 없기 때문이다. 도면에 정의된 내용을 보다 구체적으로 설명하면, ''은 의미가 없는 값은 앞을 잘라내도 의미가 없음을 의미하고, ''은 어떠한 스택이나 가능한 값은 앞을 잘라내도 아무 스택이나 가능함을 의미하며, ''는 어떠한 경우라도 앞을 0 크기만큼 자르면 자기 자신이 됨이 나타내고, ''은 상술한 앞 자르는 연산자(hd d )와 마찬가지로 실수 값(F)은 길이가 2 인데, 1 크기만 잘라내면 정수와 실수로 동시에 사용된 값(N)으로 됨을 의미하고, ''는 아무 타입으로 사용되지 않은 길이 w의 값(UW)은 d 크기만큼 앞을 자르면 길이가 w-d로 작아짐을 의미하며, ''와 ''는 s와 σ로 이루어진 것을 앞을 d 크기만큼 자르려는데, s 의 길이가 d 보다 길다면, σ와 상관없이 s를 d 크기만큼 잘라낸 것을 σ앞에 붙인 것과 같게 됨을 의미하고, 그렇지 않은 경우 s의 길이가 d 보다 작다면 s를 잘라버리고 추가로 σ에서 'd - s의 크기'만큼 잘라낸 것과 같게 됨을 의미한다.

나아가, 도 4의 (라)는 두 스택 타입을 붙여주는 연산(concatenation)을 수행하도록 한 붙이는 연산자로서, (나)의 앞 자르는 연산자(hd d )나 (다)의 뒤 자르는 연산자(tl d )와 반대의 기능을 수행하는 연산자인데, 도면에 정의된 내용을 보다 구체적으로 설명하면, ''은 의미가 없는 것에는 앞에 무엇을 붙여도 의미가 없음을 의미하고, ''은 x에 y을 붙이면 xy이 됨을 의미하되, 앞의 도메인 정의에서 길이를 k 개로 제한하였으므로 xy를 길이 k 개만큼 잘라낸 것과 같게 됨을 의미한다. 또한, 도 4의 (마)는 두 스택 내용의 공통 부분을 표현하는 하나의 스택 타입을 결정하는 연산(join)을 수행하도록 한 합치는 연산자로서, 합치는 연산은 순서(order) 정의에 의해 수행될 수 있는데, 스택 타입 σ∪τ는 σ, τ≤υ를 만족하는 υ 중 가장 순서가 낮은 것이 되며, 이때, 해당 스택 타입의 순서는 같은 크기의 스택 타입 원소들 사이에 존재하고, 원소들의 리스트인 스택 타입 사이에는 크기별로 나누어서 존재한다. 도면에 정의된 내용을 보다 구체적으로 설명하면, ''는 의미가 없는 것과 의미가 있는 스택 타입 σ를 합치면 의미가 있는 σ가 됨을 의미하고, ''는 어떠한 것이나 가능한 스택 타입과 합치면 어떠한 스택 타입이나 가능하게 됨을 의미하며, ''는 원소간에 포함 관계()가 있는 경우 이를 합치면 다른 원소를 포함하는 원소가 포함하는 원소가 됨을 의미(예를 들어, 정수나 실수로 사용되지 않는 크기 1 인 값(U1)과 정수(I)를 합치면 정수로 사용된 값(I)이 되고, 정수(I)와 정수와 실수로 동시에 사용되는 값(N)을 합치면 N이 된다. 단, 포함 관계는 크기가 같은 원소 사이에서 정의된다)하고, ''는 두 스택 타입 sσ와 tτ를 합치려고 할 때, s 의 크기가 t의 크기보다 작거나 같으면, s와 t를 s의 크기만큼 자른 것을 합친 것과, σ와 tτ를 s의 크기만큼 잘라내어 합친 것을 붙인 것과 같게 됨을 의미한다.

해당 타입 분석 함수에는 첨부한 도면 도 5와 같이, EM 프로그램에 대해 앞에서부터 분석하는 순방향 분석 함수 'F e (s)'와, 해당 EM 프로그램에 대해 뒤에서부터 분석하는 역방향 분석 함수 'B e (s)'가 있는데, 본 발명에서는 EM 코드의 의미 구조(semantics)로부터 자동으로 유추할 수 있는 명령어 타입 정보 즉, 해당 명령어가 어떤 타입의 값들을 스택에서 읽어들여 어떤 타입의 값들을 스택에 적재하는가를 나타내는 정보가 해당 명령어의 수행 전/후로 전달되기 때문에 해당 순방향 분석 함수와 역방향 분석 함수를 혼합하여 분석하되, 해당 분석 결과가 변하지 않을 때까지 반복적으로 분석한다. 예를 들어, 'PUSH 10; PUSH 20; STI 1'과 같은 프로그램에서 'STI 1' 수행 전의 스택 타입은 'II…'으로서, 이는 앞의 'PUSH 10' 명령어로부터 'STI 1'에서 저장할 값이 정수 타입이라는 정보를 전달한 것이며, 'LOI 1; DUP i '와 같은 프로그램에서는 'LOI 1'에서 읽어온 값이 정수 타입이라는 정보를 뒤의 'DUP i '에서 전달한 것이다.

즉, 명령어 타입으로부터 순방향 또는 역방향으로 분석하는 계산식이 나올 수 있는데, 두 계산식은 각각 명령어 'e'가 수행되기 전 또는 수행된 후의 스택 타입 σ를 전달하면 수행되기 전 또는 수행된 후의 스택 타입을 결과로 전달해 주되, 명령어가 스택으로부터 읽어들인 만큼 자르는 연산자에 의해 자른 뒤, 해당 명령어가 스택에 적재하는 원소들의 타입들을 붙이는 연산자에 의해 붙여주는 것으로, 도면에 정의된 내용을 보다 구체적으로 설명하면, 순방향 분석 함수 ''는 명령어가 'e'이고, 해당되는 명령어의 타입이 'σ1→σ2'이고, 명령어를 수행하기 전의 스택 타입이 's' 이면, 우선 명령어가 스택에서 추출하는 크기만큼 스택의 앞을 잘라()낸 후, 해당 명령어가 스택에 쌓는 원소들의 타입을 스택의 앞에 붙여주는 것이고, 역방향 분석 함수 ''는 명령어가 'e'이고, 해당되는 명령어의 타입이 'σ1→σ2'이고, 명령어를 수행한 후의 스택 타입이 's' 이면, 순방향 분석 함수와는 반대로 우선 명령어가 스택에 쌓는 크기만큼 스택의 앞을 잘라()낸 후, 해당 명령어가 스택에 추출하는 원소들의 타입을 스택의 앞에 붙여주는 것이다.

이와 같은 실행시간 스택의 타입 분석 방법을 적용한 본 발명에 따른 컴파일러는 도메인과 타입 분석 함수 및 합치는 연산자를 이용하여 EM 코드 입력으로부터 실행시간 스택의 원소들의 타입을 분석한 후, 해당 분석 결과로서 각 기본 블록 사이에 전달되는 분석 값에 따라 이를 저장할 새로운 레지스터를 할당해 주고, 할당된 레지스터를 이용하여 가상 스택 방법에 따라 어셈블리어 코드를 생성하게 된다.

여기서, 해당 실행시간 스택의 순방향 타입 분석 절차를 상세히 설명하면 다음과 같다.

먼저, EM 프로그램을 각 명령어 또는 기본 블록을 노드로 하는 제어 흐름 그래프(control-flow graph)로 나타내고, 각 노드에 분석 값을 저장할 수 있도록 한 후, 초기에는 첨부한 도면 도 6에 예시한 '초기 값' 열과 같이 모든 노드에 아무 것도 가능하지 않음을 나타내는 분석 값인 바텀 '⊥'을 저장하되, 시작 노드(실행시간 스택의 역방향 타입 분석인 경우 '끝 노드')에는 모든 것이 가능함을 나타내는 초기 값인 탑 ''을 저장한다.

그리고, 각 노드에서 상위 노드 즉, 바로 이전 노드의 분석 값을 타입 분석 함수에 입력으로 제공하여 연산된 결과 값을 저장하는데, 이때, 상위 노드가 다수 개일 경우 각 상위 노드들의 분석 값을 합치는 연산자를 이용하여 수행한 연산 결과 값을 입력으로 제공하여 모든 노드의 분석 값이 변화하지 않을 때까지 반복 수행함으로써, 변화하지 않는 각 노드의 분석 값 즉, 분석하고자 했던 결과 값을 얻게 된다.

이후, 분석이 종료되면 각 기본 블록 사이에 전달되는 분석 값을 저장할 레지스터를 할당하게 되는데, 예를 들어, 블록 A와 블록 B, C 사이의 분석 값이 'IIF '인 경우 두 개의 정수 값과 한 개의 실수 값이 전달되는 것을 의미하므로, 사용되지 않은 새로운 정수형 레지스터 두 개와 실수형 레지스터 한 개를 할당하게된다.

이렇게 할당된 레지스터를 이용하여 효율적인 코드를 생성할 수 있는데, 기본적으로 가상 스택 방법을 사용하여 코드를 생성하되, 기본 블록의 시작 지점과 끝 지점에서는 다른 방법으로 코드를 생성한다. 즉, 해당 기본 블록의 시작 지점에서는 기할당된 레지스터들이 가상 스택에 적재되어 있다고 보고 코드를 생성하며, 해당 기본 블록의 끝 지점에서는 남아있는 가상 스택의 코드들을 끝 지점에 할당된 레지스터로 옮기는 명령어를 삽입해 준다.

'n!'을 계산하는 입력 코드에 대한 분석을 첨부한 도면 도 6을 참조하여 설명하면 다음과 같다.

초기 스택 타입으로 시작점은 탑 '', 나머지는 바텀 '⊥'으로 한 후, 순방향 분석 함수(F e )로 앞에서부터 분석하고, 역방향 분석 함수(B e )로 뒤에서부터 분석하면, 해당하는 분석 값이 생성되는데, 이때, 해당 타입 분석은 분석 값이 변하지 않을 때까지 반복적으로 수행하게 된다. 그리고, 해당 분석 값으로부터 레지스터를 할당하게 되는데, 해당 블록 S와 블록 A 또는 블록 B와 블록 A 사이의 분석 값 'II '에 대해서는 레지스터 'i 0'와 'i 1'을 할당하고, 블록 A와 블록 B 또는 블록 A와 블록 C 사이의 'II '에 대해서는 레지스터 'i 2'와 'i 3'을 할당하게 된다.

여기서, 블록 B를 컴파일하는 경우를 살펴보면, 초기 가상 스택을 할당된 레지스터 [i 2,i 3]으로 하여 가상 스택 방법에 의해 컴파일하고, 남은 가상 스택[M i [t],i 3*i 5]를 할당된 레지스터 'i 0'와 'i 1'에 저장하는 코드 즉, 'i 1i 3*i 5;i 0←M i [t];'와 같은 효율적인 코드를 생성하게 된다.

상술한 바와 같이, 본 발명에서는 가상 스택에 적재되는 원소들의 개수와 타입을 타입 분석 방법에 따라 알 수 있으므로 첨부된 도면 도 2와 같은 효율적인 결과코드(2)를 생성할 수 있게 된다. 즉, 분석 값을 전달하는 임시 저장장소로 레지스터를 사용할 수 있는데, 블록 B, C가 실행된 후, 블록 D가 실행되기 전에 스택에 두 개의 정수형 분석 값이 적재되어 있다는 것 즉, 스택의 타입 정보를 알 수 있어, 두 개의 새로운 레지스터 'i 1'와 'i 2'를 사용하여 기본 블록 사이에 분석 값을 전달할 수 있게 된다. 다시 말해서, 블록 B, C가 실행된 후, 가상 스택의 코드들을 레지스터i 1'와 'i 2'에 저장하는 코드를 생성하고, 블록 D가 실행되기 전에 가상 스택을 [i 1,i 2]라 두고 컴파일하게 됨에 따라 해당 컴파일된 코드의 처리 속도가 향상된다.

이상과 같이, 본 발명은 도메인과 타입 분석 함수 및 합치는 연산자를 정의하고, 해당 정의한 요소들을 이용하여 실행시간 스택의 타입을 분석함으로써, 기본 블록 내부만이 아니라 해당 기본 블록간에도 레지스터를 기반으로 하는 효율적인 코드를 생성할 수 있게 되어 컴파일된 코드의 처리 속도가 향상되는 효과가 있다.

Claims (11)

  1. 실행시간 스택을 기반으로 하는 EM 코드를 입력받아 레지스터를 기반으로 하는 어셈블리어 코드로 변환하는 컴파일러에 있어서,
    상기 실행시간 스택을 기반으로 하는 EM 코드를 입력받는 과정과;
    입력받은 EM 코드에 대한 실행시간 스택의 타입을 합치는 연산자를 이용하여 소정의 타입 분석 함수에 따라 분석하여 얻은 분석 값을 도메인으로 표현한 후에 상기 도메인을 이용하여 실행시간 스택의 타입을 분석하는 과정과;
    상기 분석 결과로서 각 기본 블록 사이에 전달되는 분석 값을 저장할 레지스터를 할당한 후에 가상 스택 방법에 따라 어셈블리어 코드를 생성하는 과정을 포함하는 것을 특징으로 하는 이엠 코드에 대한 실행시간 스택의 타입 분석 방법.
  2. 제 1항에 있어서,
    상기 도메인은, 스택의 내용이 없음을 나타내는 바텀 또는 원소들의 시퀀스 중 소정 길이 이하인 것들에 모든 것이 가능함을 의미하는 탑을 붙여 생성한 분석 값으로 표현하는 것을 특징으로 하는 이엠 코드에 대한 실행시간 스택의 타입 분석 방법.
  3. 제 2항에 있어서,
    상기 원소는, 불린 타입의 원소 또는 정수형 레지스터에 저장 가능한 원소 또는 실수형 레지스터에 저장 가능한 원소 또는 특정 타입으로 사용되지 않았음을의미하는 정해지지 않은 타입의 원소 또는 정의할 수 없는 타입의 원소인 것을 특징으로 하는 이엠 코드에 대한 실행시간 스택의 타입 분석 방법.
  4. 제 1항에 있어서,
    상기 타입 분석 함수는, EM 프로그램에 대해 앞에서부터 분석하는 순방향 분석 함수와, 해당 EM 프로그램에 대해 뒤에서부터 분석하는 역방향 분석 함수를 포함하는 것을 특징으로 하는 이엠 코드에 대한 실행시간 스택의 타입 분석 방법.
  5. 제 1항에 있어서,
    상기 합치는 연산자는, 두 개 이상의 스택 타입이 가능한 경우 상기 두 스택 타입을 함의하는 하나의 스택 타입을 결정하는 연산을 수행하도록 하는 것을 특징으로 하는 이엠 코드에 대한 실행시간 스택의 타입 분석 방법.
  6. 제 1항에 있어서,
    상기 합치는 연산자는, 스택 내용의 크기를 결정하는 연산자와, 앞 자르는 연산자와, 뒤 자르는 연산자 및 붙이는 연산자를 포함하는 것을 특징으로 하는 이엠 코드에 대한 실행시간 스택의 타입 분석 방법.
  7. 제 6항에 있어서,
    상기 앞 자르는 연산자는, 원소들을 입력으로 받아 스택의 앞으로부터 소정 크기만큼 자른 값을 전달하는 연산을 수행하도록 하는 것을 특징으로 하는 이엠 코드에 대한 실행시간 스택의 타입 분석 방법.
  8. 제 6항에 있어서,
    상기 뒤 자르는 연산자는, 원소들을 입력으로 받아 스택의 앞으로부터 소정 크기만큼 자르고 남은 값을 전달하는 연산을 수행하도록 하는 것을 특징으로 하는 이엠 코드에 대한 실행시간 스택의 타입 분석 방법.
  9. 제 6항에 있어서,
    상기 붙이는 연산자는, 두 개 이상의 스택 타입이 존재하는 경우 해당 스택 타입을 붙여주는 연산을 수행하도록 하는 것을 특징으로 하는 이엠 코드에 대한 실행시간 스택의 타입 분석 방법.
  10. 삭제
  11. 제 1항에 있어서,
    상기 실행시간 스택의 타입을 분석하는 과정은, EM 프로그램의 각 명령어 또는 기본 블록을 노드로 하는 각 노드에 초기 분석 값으로 아무 것도 가능하지 않음을 나타내는 분석 값 바텀 '⊥'을 저장하되, 타입 분석 함수에 따라 시작 노드 또는 끝 노드에 모든 것이 가능함을 나타내는 분석 값 탑 ''을 저장하는 단계와;
    입력받은 EM 코드의 각 명령어에 대해 바로 이전 분석 값을 상기 타입 분석 함수에 입력으로 제공하면서 합치는 연산자로 연산된 분석 결과 값에 대한 도메인이 변화하지 않기까지 해당되는 실행시간 스택의 타입 분석을 반복 수행하는 단계를 포함하는 것을 특징으로 하는 이엠 코드에 대한 실행시간 스택의 타입 분석 방법.
KR1019990006512A 1999-02-26 1999-02-26 이엠 코드에 대한 실행시간 스택의 타입 분석 방법 KR100323372B1 (ko)

Priority Applications (1)

Application Number Priority Date Filing Date Title
KR1019990006512A KR100323372B1 (ko) 1999-02-26 1999-02-26 이엠 코드에 대한 실행시간 스택의 타입 분석 방법

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
KR1019990006512A KR100323372B1 (ko) 1999-02-26 1999-02-26 이엠 코드에 대한 실행시간 스택의 타입 분석 방법

Publications (2)

Publication Number Publication Date
KR20000056822A KR20000056822A (ko) 2000-09-15
KR100323372B1 true KR100323372B1 (ko) 2002-02-19

Family

ID=19575171

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1019990006512A KR100323372B1 (ko) 1999-02-26 1999-02-26 이엠 코드에 대한 실행시간 스택의 타입 분석 방법

Country Status (1)

Country Link
KR (1) KR100323372B1 (ko)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2013115561A1 (ko) * 2012-01-31 2013-08-08 삼성전자 주식회사 데이터 처리 시스템 및 그 시스템에서 데이터 시뮬레이션 방법

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2013115561A1 (ko) * 2012-01-31 2013-08-08 삼성전자 주식회사 데이터 처리 시스템 및 그 시스템에서 데이터 시뮬레이션 방법
US9606779B2 (en) 2012-01-31 2017-03-28 Samsung Electronics Co., Ltd Data processing system and data simulation method in the system

Also Published As

Publication number Publication date
KR20000056822A (ko) 2000-09-15

Similar Documents

Publication Publication Date Title
Krall Efficient JavaVM just-in-time compilation
AU716371B2 (en) Application program and documentation generator system and method
US7733347B2 (en) Automated construction of shader programs
US5734907A (en) Method of programming an information processing device for network management applications using generic programming
Elrad et al. Aspect-oriented programming: Introduction
JP3315857B2 (ja) 一般フロントエンド、及び動的にロード可能なバックエンドを有するコンパイラ
DE19815865B4 (de) Kompiliersystem und Verfahren zum rekonfigurierbaren Rechnen
US6973644B2 (en) Program interpreter
Talbot et al. An integer programming algorithm with network cuts for solving the assembly line balancing problem
US4791558A (en) System and method for generating an object module in a first format and then converting the first format into a format which is loadable into a selected computer
US5586328A (en) Module dependency based incremental compiler and method
US6643711B2 (en) Method and apparatus for dispatch table construction
US6826677B2 (en) Renaming registers to values produced by instructions according to assigned produce sequence number
KR101522444B1 (ko) 소스 코드 처리 방법, 시스템, 및 프로그램
US8181155B2 (en) Unified expression and location framework
US7496894B2 (en) Methods for enhancing pointer analyses
US9038041B2 (en) Stream processor with compiled programs
US5359546A (en) Automatic generation of test drivers
US6832369B1 (en) Object oriented method and apparatus for class variable initialization
US9043770B2 (en) Program module applicability analyzer for software development and testing for multi-processor environments
US8769485B2 (en) Data parallelism and parallel operations in stream processing
US4435753A (en) Register allocation system using recursive queuing during source code compilation
US5303357A (en) Loop optimization system
US7016807B2 (en) Device and method for monitoring a program execution
JP2783641B2 (ja) 設計評価方法および設計評価ツール

Legal Events

Date Code Title Description
A201 Request for examination
E902 Notification of reason for refusal
E701 Decision to grant or registration of patent right
GRNT Written decision to grant
FPAY Annual fee payment

Payment date: 20080102

Year of fee payment: 7

LAPS Lapse due to unpaid annual fee