KR100276086B1 - 로토스 명세로부터 씨 플러스 플러스 코드 생성방법 - Google Patents

로토스 명세로부터 씨 플러스 플러스 코드 생성방법 Download PDF

Info

Publication number
KR100276086B1
KR100276086B1 KR1019970059539A KR19970059539A KR100276086B1 KR 100276086 B1 KR100276086 B1 KR 100276086B1 KR 1019970059539 A KR1019970059539 A KR 1019970059539A KR 19970059539 A KR19970059539 A KR 19970059539A KR 100276086 B1 KR100276086 B1 KR 100276086B1
Authority
KR
South Korea
Prior art keywords
node
code
statement
generating
generated
Prior art date
Application number
KR1019970059539A
Other languages
English (en)
Other versions
KR19990039434A (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 KR1019970059539A priority Critical patent/KR100276086B1/ko
Publication of KR19990039434A publication Critical patent/KR19990039434A/ko
Application granted granted Critical
Publication of KR100276086B1 publication Critical patent/KR100276086B1/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/31Programming languages or programming paradigms
    • G06F8/315Object-oriented languages
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR 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/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4488Object-oriented

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computing Systems (AREA)
  • Stored Programmes (AREA)

Abstract

본 발명은 행위 컴파일러에 관한 것으로서, 정명 명세 언어인 LOTOS로 기술된 시스템 명세로부터 실행 가능한 C++ 코드를 생성하는 방법에 관한 것이다. 본 발명은 편집기를 통해 작성된 LOTOS(Language Of Temporal Odering Specification) 명세가 구문 및 의미 분석과정을 거친 중간 표현 형태의 AST(추상구문트리)를 행위 컴파일러가 읽어서 그 읽은 AST의 노드(Node)를 순차적으로 인식하고, 그 인식된 노드에 해당하는 유한 상태기에 의거하여 정의된 가상 기계 코드에 따라 해당 C++ 코드를 생성함으로써, PC 플랫폼상에서 실행하여 시스템의 기능모형이 사용자의 요구사항에 따라 동작하는가를 보여줌으로써 시스템 개발의 초기 단계에서 오류를 발견할 수가 있다.

Description

로토스 명세로부터 씨 플러스 플러스 코드 생성방법
본 발명은 행위 컴파일러에 관한 것으로서, 특히 정형(formal) 명세 언어로서 ISO의 표준인 LOTOS(Language Of Temporal Ordering Specification; 로토스) 언어로 작성된 시스템 명세로부터 실행 가능한 C++ 코드(C 플러스 언어의 버전 업된 언어의 코드)를 생성하는 LOTOS 명세로부터 C++ 코드 생성방법에 관한 것이다.
정보통신용 소프트웨어의 개발은 대용량, 고신뢰도, 고복잡도, 이질성 및 분산 환경이라는 특성을 가지고 있다. 이러한 시스템을 개발함에 있어서 개발 품질 및 적정 비용을 유지하기 위해서는 향상된 정형명세 기법과 이러한 기법을 지원하는 도구가 필수적이다. 그러나, 기존의 관련 도구들은 대부분 UNIX 플랫폼상에서 C나 Ada(에이다) 언어 생성을 지원하고 있을 뿐이다.
일반적으로, LOTOS는 ISO(International Organization for Standardization)가 제정한 프로토콜 명세 기술용 형식 기술기법(Formal Description Technique) 언어로서, 이것은 자연 언어에 이용하여 기술되고 있는 OSI(개방형 시스템간 상호 접속; Open System Interconnection)의 통신 규약을 보다 엄밀하게 기술하는 것을 목적으로 한다. LOTOS에서는 시스템의 특성을 기술하는 방법으로서 시스템과 주고 받는 외부에서 관측할 수 있는 사상(事象)의 발생 순서, 즉 어떤 사상이 발생한 다음의 동작을 규정한다는 형식으로 표현한다. LOTOS 등의 형식 기술 기법 언어에 의해 통신 규약을 기술함으로써 그 규약 중에 포함되는 모순성이나 애매성을 검사한다느지, 컴퓨터를 사용한 기계처리에 의해 명세의 해석을 한다든지, 통신 프로그램의 시험을 할 수가 있다.
이러한 LOTOS는 ACT ONE 기반의 자료 묘사 부분과 CCS/CSP 기반의 프로세스 묘사 부분의 두 구성 요소로 이루어진다. 값 표현식의 의미 해석을 위하여 프로세스 부분이 자료 부분을 참조하는 것을 제외하면 두 부분은 상호 독립적이다. 본 발명은 프로세스 부분에 해당한다.
상기 LOTOS는 OSI 표준 명세 언어로 대규모 분산 및 병행(concurrency) 시스템의 명세에 적합하도록 설계되었으며, 이러한 시스템들은 개발 단계의 초기에 시스템 명세의 오류를 발견하지 못할 경우 개발된 시스템 전체에 치명적인 영향을 줄 가능성이높고, 그 오류 수정을 위한 비용은 초기에 오류를 발견하여 수정하는 비용보다 훨씬 높은 문제점이 있다.
따라서, 본 발명은 상기와 같은 문제점을 해결하기 위해, LOTOS 언어로 작성된 명세로부터 C++ 코드를 생성하여 이를 PC 플랫폼상에서 실행하는 동작 모형을 통하여 시스템의 기능적 요구사항의 오류를 조기에 검출할 수 있는 프로토타이핑을 지원하는 도구로 사용하는데 그 목적이 있다.
도 1은 본 발명의 전체적인 행위 부분 코드 생성 과정을 나타낸 개략적 개념도,
도 2는 생성되는 C++ 코드 개념도,
도 3은 생성되는 C++ 클래스 구조도,
도 4a 및 도 4b는 유한 상태기에 바탕을 둔 가상 머신 코드의 객체 모형도 및 그 일 예시도,
도 5a는 본 발명에 따른 전체 흐름도,
도 5b는 추상구문트리(AST)의 노드 인식과정을 설명하기 위한 도면,
도 6a 내지 도 6f는 도 5의 상세 흐름도.
상기 목적을 달성하기 위한 본 발명의 LOTOS 명세로부터 C++ 코드를 생성하는 방법은, 편집기를 통해 작성된 LOTOS(Language Of Temporal Odering Specification) 명세가 구문 및 의미 분석과정을 거친 중간 표현 형태의 AST(추상구문트리)를 행위 컴파일러가 읽어서 C++코드로 생성하는 방법에 있어서, 상기 읽은 AST의 노드(Node)를 순차적으로 인식하는 제 1 과정과, 상기 인식된 노드에 해당하는 유한 상태기에 의거하여 정의된 가상 기계 코드에 따라 해당 C++ 코드를 생성하는 제 2 과정으로 수행함으로써, 개인용 컴퓨터(PC) 플랫폼 상에서 실행하는 동작 모형을 통하여 시스템의 기능적 요구사항의 오류를 초기에 검출할 수 있는 것을 특징으로 한다.
이하, 본 발명을 첨부된 도면에 의거하여 상세히 설명한다.
도 1은 본 발명의 전체적인 행위 부분 코드 생성 과정을 나타낸 개략적 개념도이다.
설명에 앞서, 상술한 LOTOS 명세 언어는 구문론적이고 의미론적인 면에서 매우 복잡한 언어이다. LOTOS 명세로부터 실행가능 코드를 생성하기 위해서는 여러 단계의 복잡한 작업을 거쳐야 한다. 코드 생성은 막대한 작업이며, 구현을 위한 수 많은 결정 사항들이 상위 수준의 LOTOS 명세로부터 하위 수준의 기계 코드로 옮겨가야 한다. 더욱이, 언어와 구현 쟁점 사항들에 대한 이해도를 더해감에 따라, 결정 사항들에 많은 변경이 일어날 수 있다. 엄격한 통제하에 복잡성을 유지하고, 유지보수를 쉽게 하기 위해서, 코드 생성 단계를 두 단계로 분리할 수 있다. 그 첫번째 단계는 LOTOS의 구문과 의미(=시멘틱)이 시멘틱 분석기에 의하여 분석되어, 중간 표현 형태인 AST(Abstract Syntax Tree; 추상 구문 트리)로 변환하는 단계이고, 두번째 단계는 AST(추상구문트리)로부터 C++ 코드를 생성하는 단계이다.
상기한 코드 생성단계를 도 1을 참조하여 보다 구체적으로 살펴보면 다음과 같다.
먼저, 구문/의미 검사 단계(10)를 설명하면, LOTOS 로 작성된 명세인 'spec.lot' 를 입력으로 받은 'lfe'는 상기 'spec.lot'가 문법에 맞는지 검사하고, 아무런 구문 오류가 없다면 'spec.lfe' 파일을 출력한다. 'lsa' 는 구문 검사된 'spec.lfe' 를 입력으로 받아 정적 의미 검사를 한다. 즉, 변수 사용은 올바른지 값 표현식이나 행위 표현식이 소트(sort, 데이타 타입)나 기능 선언에 적합한 형태로 선언되었는지 등의 검사를 수행하여 'spec.lsf' 와 'spec.asf' 화일을 생성한다.
다음으로, 중간 코드 생성 단계(20)를 설명하면, 'glad' 는 상기 'spec.lsf' 화일을 받아들여 심볼 테이블인 'spec.agf' 화일을 생성하고, 'om' 은 'spec.asf' 화일을 받아들여 중간코드인 'spec.ast' 화일을 생성한다.
마지막으로, C++ 코드로 변환하는 단계(30)를 설명하면, 'omlbC' 는 'spec.agf'와 'spec.ast' 화일을 받아들여 후술할 도 5의 변환 과정에 따라 C++ 의 메인 파일인 'lbc.cpp'와 헤더 화일인 'lbc.hh' 화일을 생성한다.
도 2는 생성되는 C++ 코드 개념도이다.
LOTOS 명세(21)에서 하나의 프로세스가 BUT(Behavior Unit; 행위 단위)(21)로 표현된다. 각 BUT은 상태와 공유하는 커널 트리(kernel tree)(31)를 갖는다. 커널 트리는 BUT 동기화 환경과 관련된 동적 정보를 가지고 있다. BUT(21)는 커널 호출을 통하여 트리의 가지를 따라 트리를 확장할 수 있다. 이러한 구조를 갖는 시스템을 위하여 생성되는 C++ 구조는 BUT과 커널(kernel)을 표현하기 위한 두 부분으로 나눌 수 있다.
도 3은 생성되는 C++ 클래스 구조도이다.
하나의 BUT을 C++ 클래스에 대응시킨다. BUT은 일반적인 운영체계의 프로세스처럼 자신이 실행할 문장들과 그에 필요한 자료를 갖는다. 실행할 문장은 코드로, 자료는 프레임으로 표현한다. 또한, BUT은 공통적인 특성을 정의한 GenericBUT과 BUT에 정의된 행위에 따라 결정되는 코드를 추가한 UBUT으로 나눈다.
도 3에서, '코드(code)'는 BUT의 행위를 묘사한 오토마타(automata; 컴퓨터와 같은 정보처리기계의 기억장치, 입출력장치, 제어장치 등을 수학적으로 모형화시킨 추상적인 기계)를 바탕으로 생성한다. 오토마타의 각 상태를 C++의 멤버함수로 구현하여 입력에 의한 오토마타의 상태 전환은 맴버함수들간의 호출로 동작한다.
'프레임(frame)'은 변수와 그에 해당하는 값을 등록한 곳으로 일정한 자료구조로 저장한다. 프레임에서 변수를 저장하는 것은 프레임에서 그 변수에 할당된 인덱스(index)를 사용하도록 한다. 변수의 값 표현은 자료 컴파일러에서 정의한 구조를 따를 것이다.
'스택(stack)'은 BUT 실행 과정상의 중간 결과(자료값, 게이트와 변수의 인덱스, experiment offer)를 저장하는 곳이다. 여러개의 BUT가 동시에 수행될 때에 각 BUT의 임시 자료를 독립적으로 저장하기 위해서는 각 BUT에 하나의 스택이 필요하다.
도 4a는 유한 상태기(Finite State Machine)에 바탕을 둔 가상 기계 코드의 객체 모형도로서, LOTOS 명세 언어를 C++ 언어 형식으로 대응시켜 표현하는 것으로 객체지향 언어로 표현한 것이다.
일반적으로, LOTOS 행위 표현은 시스템이 행할 수 있는 동작 열의 집합을 나타낸다. 따라서, 자료정의 부분을 무시한다면, LOTOS 명세는 프로세스라 불리우는 상호 작용을 하는 행위 단위의 집단으로 볼 수 있다. 이러한 각각의 프로세스는 집단의 나머지 프로세스와 동기화하는 도 4에 도시된 바와 같은 유한상태기로 모형화할 수 있다. 따라서, 본 발명의 행위 컴파일러는 AST를 입력으로 받아 유한상태기를 바탕으로 정의된 가상기계 코드에 따라 C++코드를 생성한다. 이에 부가적으로, LOTOS 명세는 시간이 지남에 따라 일어나는 프로세스간의 상호작용을 명세화하는 언어이다. 위에서 유한상태기는 상태들간의 전이 관계를 나타내는 것이다. 따라서 프로세스의 활동은 성공적인 동기화에 따라 상태와 상태를 이동하는 유한 상태기로 모형화할 수 있으며, 이를 반영한 중간 코드를 생성한다.
예를 들어, LOTOS로 표현된 행위 표현식인 'a ; c ; B'를 유한 상태기로 모형화 하면, 도 4b에 도시된 바와 같이 표현된다.
즉, 중간 코드의 예는,
s0 : parallel_explicit(a, s1, s3) ; goto(s1, s4);
s1 : offer(a) ; wait ; goto(s2) ;
s3 : choice(s4, s6) ; goto(s4, s6);
s4 : offer(b) ; wait ; goto(s6);
s6 : offer(c) ; wait ; goto(s7);
위와 같이 중간 코드는 유한 상태기의 형태인 행위 단위의 집합으로 나타낸다.
도 5a는 본 발명에 따른 LOTOS 명세로부터 C++ 코드를 생성하는 흐름도이다.
편집기를 통해 작성된 LOTOS 명세가 구문 및 의미 분석 과정을 거쳐서 중간 표현 형태인 추상구문트리(AST)로 변환된다. 도 5에서는 이와 같이 표현된 AST 화일을 행위 컴파일러가 읽어서 AST의 각 노드에 해당하는 C++ 코드를 생성하는 과정을 설명한다. 즉, LOTOS의 구문과 의미를 분석한 후 중간표현형태인 AST로 변환한 후 본 발명에서는 그 AST로부터 C++코드를 생성하는 방법을 제공한다. 이에 따른 중간 표현 형태인 AST의 각 노드(Node)에 대응하는 C++코드를 생성하는 과정을 도 5a를 참조하여 설명하면 다음과 같다.
먼저, AST 화일을 행위 컴파일러가 읽어온다(50).
그 읽어온 AST의 각 노드를 인식하는 과정(200)을 수행하여 각 노드에 대한 C++코드를 생성(300)하는데, 이를 간단히 설명하면, 첫번째 노드일 경우 헤더(Header)화일 코드, BUT 정의 노드일 경우 클래스(Class) 코드, 숨김(hiding) 노드일 경우 숨김 코드, 인에이블(Enable) 노드일 경우 인에이블 코드, 디스에이블(Disable) 노드일 경우 디스에이블 코드, 병렬 동기화(Parallel_full_synchronization) 노드일 경우 병렬 동기화 코드, 병렬 인터리빙(Parallel_interleaving) 노드일 경우 병렬 인터리빙 코드, 단일 동기화(Parallel_explicit synchronization) 노드일 경우 단일 동기화 코드, 선택(Choice) 노드일 경우 선택 코드, 가아드(guard) 노드일 경우 가아드 코드, 외부 제공(External offer) 노드일 경우 외부 제공 코드, 비정상 종료(Stop) 노드일 경우 비정상 종료 코드, 정상 종료(Exit) 노드일 경우 정상 종료코드, BUT 개체화 노드일 경우 BUT 개체화 코드, 예측(Predication) 노드일 경우 예측 코드, 실험 리스트(Experiment_list) 노드일 경우 실험 리스트 코드, 그리고 값(Value) 노드일 경우 값 코드를 각각 순차로 생성한다.
물론, 상기 AST의 각 노드를 순차가 아닌 LOTOS 명세 구성에 따라 그 순서를 바꾸어 인식할 수도 있다.
상술한 내용에 부가적으로, AST의 노드를 인식하는 과정을 도 5b를 참조하여 설명하면 다음과 같다.
코드 생성기의 입력으로 사용되는 화일을 예를 들면 도 5b에 도시된 바와 같이, AST 형태 <노드번호, 연결정보>로 표현되어 있다. 즉, <1, D>, <2, F>, <4, F>, <8, @>, <7, @>, <3, F>, <6, F>, <10, B>, <11, @>, <9, @>, <5, @>이다. 여기서, 연결정보는 형제 노드와 아들 노드가 있는지의 여부를 나타내고, '@'는 마지막 노드를 나타내는 잎(Leaf) 노드, 'B' 는 형제만 있는 노드, 'D'는 아들만 있는 노드, 'F'는 형제와 아들이 있는 노드를 나타낸다. 이러한 각 노드를 도 5b에 도시된 각 번호에 상기 도 5a에 도시된 노드를 대응시켜서 추상구문트리(AST)를 인식해가는 과정이 노드를 인식해 가는 과정이다.
상기와 같이 각 노드에 대한 C++코드를 생성하는 과정을 도 6a 내지 6f 를 참조하여 상세히 설명한다.
먼저, 도 6a에 도시된 바와 같이, AST의 노드가 첫번째 노드로 인식되면, 생성한 C++코드 화일의 시작 부분에 코드가 실행될 때 필요한 헤더 화일을 참조할 수 있도록 선언한 정의문을 생성(201)한다. 이 헤더 화일은 C++ 컴파일러가 제공하는 각 종 입출력 함수, 시간 함수, 기타 라이브러리 함수와 사용자가 미리 정의한 각 종 라이브러리를 포함하고 있는 화일로서, 프로그램 화일 시작 부분에 선언해야 하는 것이다. 예를 들면, # include<stdio.h>, # include <time.h> 가 있다. 상기 헤더 화일 정의문 생성 후, 헤더 화일에 클래스를 정의하고 클래스가 갖는 각 멤버 함수를 정의하는 클래스 정의문(C++ 프로그램에서는 헤더 화일에 클래스를 정의하고 클래스가 갖는 각 멤버 함수를 정의하고, 각 멤버 함수의 내용(기능)은 각 프로그램(cpp)화일에서 작성한다.)을 생성(202)하여 헤더 화일 코드를 생성한다. 상기 헤더 화일 코드 생성후, 다시 AST 의 노드를 인식한다(100).
그리고 상기한 첫번째 노드가 아니고, BUT(행위 단위) 정의 노드로 인식될 경우를 살펴보면 다음과 같다. LOTOS 로 작성된 명세는 각 프로세스 단위로 작성되는데, 이 프로세스가 중간 단계인 AST 화일에서는 BUT로 변환된다. 따라서, 프로세스 하나 당 하나의 BUT가 생성되고, 그 BUT는 다시 최종적으로 C++의 클래스로 매핑(mapping)된다. 이에 따라, BUT 정의 노느로 인식되면, 클래스는 기본구조를 구성하는 클래스 명과 클래스 메모리 할당문을 생성(205, 206)한 후, 그 클래스가 가지고 있는 행위를 표현하기 위한 스위치(switch)문과 케이스(case) 문을 생성(207, 208)한다. 그리고나서, 변수를 초기화 및 게이트(gate)를 초기화(209) 함으로써, 클래스 코드를 생성한다. 이 클래스 코드 생성 후, 다시 AST 의 노드를 인식한다(100).
상기 BUT정의 노드가 아니고, 숨김 노드로 인식될 경우를 살펴보면 다음과 같다. 여기서, 숨김(Hiding) 노드는 행위의 이벤트(event; 사건, 또는 게이트)를 외부로부터 숨기기 위해 사용하는 노드이다. 이러한 숨김 노드로 인식되면, 주석(annotation) 노드가 널(null)상태가 아닌지를 판단하여(210), 널 상태가 아닐 경우 지연(delay) 또는 대기(wait) 상태 실행문을 생성하고(211), 널 상태일 경우에는 다음 실행할 상태 지정문을 생성하고(212), 숨길 게이트 번호 지정문을 생성하고(213), 현재 노드 타입을 지정하는 지정문을 생성(214)함으로써, 숨김 코드를 생성한다. 그리고나서, 상기 AST 의 노드를 인식한다(100). 예를 들면, " hide middle in(begin ; middle; exit)|[middle]|(middle ; end ; exit)"(middle 이라는 이벤트는 외부에 나타나지 않는다)이다.
다음으로, 도 6b에 도시된 바와 같이, 상기 숨김 노드가 아니고, 인에이블 노드로 인식될 경우를 살펴보면 다음과 같다. 여기서, 인에이블 노드는 이벤트(사건)가 일어나는 순서를 표현하기 위해 사용하는 노드이다. 이에 따라, 인에이블 노드로 인식되면, 다음 실행할 상태 지정문을 생성하고(215), 클래스의 새로운 인스턴스(instance)를 생성하고 명령문을 생성(216)한다. 그리고, 현재 노드 타입을 지정하는 지정문을 생성(217)한다. 이렇게 수행하여 인에이블 코드를 생성한다. 이 코드 생성 후, 다시 상기한 AST 의 노드를 인식한다(100). 예를 들면, "SHOP >> EAT"(이벤트 "SHOP"이 성공적으로 수행되면 다음 이벤트인 "EAT"가 수행된다)가 있다.
그리고, 상기 인에이블 노드가 아니고, 디스에이블 노드로 인식될 경우를 살펴보면 다음과 같다. 여기서, 디스에이블 노드는, 행위가 다른 행위에 의하여 중단되는 것을 표현하는 노드이다. 이에 따라, 디스에이블 노드로 인식되면, 주석 노드가 널 상태가 아닌지를 판단하여(218), 널 상태가 아닐 경우 지연 또는 대기 상태 실행문을 생성(219)하고, 널 상태일 경우에는 다음 실행할 상태 지정문을 생성(220)한 후, 클래스의 새로운 인스턴스 생성 및 명령문을 생성한다(221). 그후, 현재 노드 타입을 지정하는 지정문을 생성(222)함으로써, 디스에이블 코드를 생성한다. 이 코드 생성 후, 다시 상기한 AST 의 노드를 인식한다(100). 그 예를 들면, "DATA_TRANSFER ▷ DISCONECTION "(이벤트 DATA_TRANSFER가 이벤트 DISCONECTION에 의해 중단된다)가 있다.
다음으로, 상기 디스에이블 노드가 아니고, 병렬 동기화 노드(Parallel_full_synchronizatio)로 인식될 경우를 살펴보면 다음과 같다. 여기서, 병렬 동기화 노드는 두 행위의 모든 이벤트에서 동기화가 일어나는 것을 표현하는 노드이다. 이에 따라, 병렬 동기화 노드로 인식되면, 상기 디스에이블 노드일 경우와 마찬가지 순서(223∼227)로 병렬 동기화 코드를 생성한다. 예를 들면, "(bang ; start ; finish ; ATHLETE) ∥(bang ; start ; finish ; STARTER)"(이벤트가 일어나는 순서는 bang ; start ; finish;:: )가 있다.
그리고, 도 6c를 참조하여, 상기 병렬 동기화 노드가 아니고, 병렬 인터리빙 노드(Parallel_interleaving) 노드로 인식될 경우를 살펴보면 다음과 같다. 여기서, 병렬 인터리빙 노드는, 각 행위의 이벤트가 교대로 엇갈려 일어나는 것을 표현하는 노드이다. 이에 따라, 병렬 인터리빙 노드로 인식되면, 상기 디스에이블 노드일 경우와 마찬가지의 순서(228∼232)로 병렬 인터리빙 코드를 생성한다. 상기와 같이 각 코드를 생성한 후 다시 AST의 노드를 인식한다(100).
그리고 상기 병렬 인터리빙 노드가 아니고, 단일 동기화 노드로 인식될 경우를 살펴보면 다음과 같다. 이때, 단일 동기화 노드(Parallel_explicit)는, |[::]|에 정의된 이벤트에서만 동기화가 일어나는 것을 표현하는 노드이다. 이에 따라, 단일 동기화 노드로 인식되면, 주석 노드가 널 상태가 아닌지를 판단(233)하여, 널 상태가 아닐 경우 지연 또는 대기 상태 실행문을 생성하고(234), 널 상태일 경우 다음 실행할 상태를 지정하는 지정문을 생성하고(235), 클래스의 새로운 인스턴스를 생성 및 명령문을 생성하고(236), 동기화 게이트(gate)를 지정하는 지정문을 생성하며(237), 현재 노드 타입을 지정하는 지정문을 생성(238)함으로써, 단일 동기화 코드를 생성한다. 이와 같이 코드 생성 후, 다시 상기한 AST의 노드를 인식한다(100). 이와 같은 단일 동기화 노드일 경우의 예를 들면, "(off_hook ; dial ; answer ; speak ; on_hook ; TELEPHONE) |[ dial ]| (find_number ; dial ; engage_brain ; speak ; CALL)"(dial 이벤트에서만 동기화가 일어난다)가 있다.
다음으로, 상기한 단일 동기화 노드가 아니고, 선택 노드로 인식될 경우를 살펴보면 다음과 같다. 이때, 상기 선택 노드는, 여러 행위 표현식에서 하나의 행위를 선택할 때 사용되는 노드이다. 이에 따라, 선택 노드로 인식되면, 다음 실행할 상태를 지정하는 지정문을 생성하고(239), 클래스의 새로운 인스턴스를 생성 및 명령문을 생성한다(240). 그후, 현재 노드 타입을 지정하는 지정문을 생성(241)함으로써, 선택 코드를 생성한다. 이와 같이 코드 생성 후, 다시 상기한 AST의 노드를 인식한다(100). 그 예를 들면, " EAT [ ] DRINK [ ] BE_MERRY "(행위 EAT 또는 DRINK 또는 BE_MERRY 중에서 하나의 행위만을 수행한다)가 있다.
도 6d를 참조하여, 상기한 선택 노드가 아니고, 가아드(guard) 노드로 인식될 경우를 살펴보면 다음과 같다. 이때, 가아드 노드는, 조건이 참(TRUE)일 경우 다음 행위를 수행하는 것을 표현하는 노드이다. 이에 따라, 가아드 노드로 인식되면, 주석노드가 널 상태가 아닌지를 판단하여(242), 널 상태가 아닐 경우 지연 또는 대기 상태 실행문을 생성하고(243), 널 상태일 경우에는 부울(Bool : 가아드 노드는 행위를 실행하기 위한 어떤 조건을 지정하는 노드로써, 조건이 만족되는지 여부를 판단하여 조건이 만족되면 부울 타입 "TRUE"값을, 조건이 만족되지 않으면 부울 타입 "FALSE" 값을 생성하기 위해 조건을 검사하는 지정문을 생성함) 타입의 참(TRUE) 값을 정의하는 정의문을 생성한다(244). 그후 변수가 지역변수와 동일한지를 판단하여(245), 동일하면, 지역 변수 값을 체크(Check)하는 실행문을 생성(246)함으로써, 가아드 코드를 생성한다. 그런데, 변수가 지역변수와 동일하지 않을 경우에는 상기한 AST의 노드를 인식한다(100). 예를 들면, "[Temperature > 0 ] → THAW) [ ] ([Temperature <=0]) → FREEZE )"(Temperature 가 0 보다 크면 THAW를 수행하고, Temperature <= 0 이면 FREEZE 를 수행한다.)가 있다.
그리고, 상기한 가아드 노드가 아니고, 외부 제공(External_offer) 노드로 인식될 경우를 살펴보면 다음과 같다. 여기서, 외부 제공 노드는 이벤트가 값(value)을 내보내는 것을 표현하는 노드이다. 즉, 외부 제공 노드로 인식되면, 다음 실행할 상태를 지정하는 지정문을 생성하고(247), 현재 게이트를 지정하는 지정문을 생성한다(248). 그리고나서, 현재 노드 타입을 지정하는 지정문을 생성(249)함으로써, 외부 제공 코드를 생성한다. 이 코드 생성 후, 상기한 AST의 노드를 인식한다(100). 예를 들면, " take ! 5 "(이벤트인 take 가 '5'를 내보낸다.)가 있다.
상기한 외부 제공노드가 아니고, 비정상 종료 노드로 인식될 경우를 살펴보면 다음과 같다. 여기서, 비정상 종료 노드(stop 노드)는, 비정상적인 종료를 표현하는 노드이다. 이에 따라, 비정상 종료 노드로 인식되면, 명령어 타입을 지정하는 지정문을 생성(250)함으로써, 비정상 종료 코드를 생성한다. 그 코드 생성 후, 상기한 AST의 노드를 인식한다(100).
상기한 비정상 종료 노드가 아니고, 정상 종료 노드로 인식될 경우를 살펴보면 다음과 같다. 여기서, 정상 종료(exit) 노드는, 정상적인 종료를 표현하는 노드이다. 이에 따라, 정상 종료 노드로 인식되면, 명령어 타입을 지정하는 지정문을 생성(251)함으로써, 비정상 종료 코드를 생성한다. 그 코드 생성 후, 상기한 AST의 노드를 인식한다(100).
다음으로, 도 6e를 참조하여, 상기 정상 종료 노드가 아니고, 행위 단위 개체화 노드로 인식될 경우를 살펴보면 다음과 같다. 그 행위 단위 개체화 노드는, 프로세스에 정의된 형식 매개변수(formal parameter)를 실제 값으로 인스턴스 한다. 이에 따라, 행위 단위 개체화 노드로 인식되면, 주석 노드가 널 상태인지를 판단하여(252), 널 상태일 경우 지연 또는 대기 상태 실행문을 생성하고(253), 널 상태가 아닐 경우에는 새로운 클래스의 인스턴스를 생성 및 명령문을 생성한다(254). 그후, 클래스간의 게이트 관계를 지정하는 지정문을 생성하고(255), 명령어 타입을 지정하는 지정문을 생성(256)함으로써, BUT 개체화 코드를 생성한다. 이 코드를 생성한 후, 상기한 AST의 노드를 인식한다(100). 예를 들면, " process GIVE_LECTURE [write_notes, give_lecture, understand_subject] : exit : = "(이는 프로세스 GIVE_LECTURE의 형식 매개변수가 실제값인 GIVE_LECTURE [plagiarise_notes_by_Ed, lecture_at_Harvard, understand_LOTOS]로 인스턴스된다는 것을 나타냄)가 있다.
상기 BUT 개체화 노드가 아니고, 예측 노드로 인식될 경우를 살펴보면 다음과 같다. 여기서, 예측(predication) 노드는 이벤트에서 출력되는(Offer) 값의 조건을 지정하는 노드이다. 이에 따라, 예측 노드로 인식되면 부울(Bool)타입의 "참(TRUE)" 값을 정의하는 정의문을 생성하고(257), 변수가 지역변수와 동일관계에 있을 경우(259), 그 지역변수값을 체크(Check)하는 명령문을 생성(259)함으로써, 예측 코드를 생성한다. 이 코드 생성 후, 상기한 AST 의 노드를 인식한다(100). 예를 들면, "g!x[x le 0]"(이는 값 x 가 0보다 작은지를 검사한다)가 있다.
아울러, 상기한 예측 노드가 아니고, 실험 리스트(Experiment_list) 노드로 인식될 경우를 살펴보면 다음과 같다. 여기서, 실험 리스트 노드는, 이벤트로 들어오는 값과 그 값의 데이터 타입을 지정하는 노드이다. 이에 따라, 실험 리스트 노드로 인식되면, 실험 리스트가 한정되지 않은(unbounded) 변수인지를 판단하여(260), 한정되지 않은 변수일 경우 변수 위치를 새롭게 지정하는 지정문을 생성(261)한 후 명령어 타입을 선언하는 선언문을 생성(264)하여 실험 리스트 코드를 생성한다. 한편, 한정된 변수일 경우에는 그 변수의 타입을 지정하는 지정문을 생성하고(262), 변수 위치를 지정하는 지정문을 생성하며(263), 명령어 타입을 선언하는 선언문을 생성(264)함으로써, 실험 리스트 코드를 생성한다. 이와 같이 코드 생성 후, 다시 상기한 AST의 노드를 인식한다(100). 예를 들면, "weight ? W : Int_Sort "(이는 이벤트인 weight 가 받아들이는 값 W를 나타내고 그 값이 Int_Sort 라는 데이터 타입이라는 것을 나타낸다)가 있다.
도 6f를 참조하여, 상기한 실험 리스트 노드가 아니고, 값(value) 노드로 인식될 경우를 살펴보면 다음과 같다. 여기서, 값 노드는 LOTOS 명세에 표현된 값을 표현하는 노드이다.
이에 따라, 값 노드로 인식되면, 자식(Child) 노드가 널 상태이고(265), 노드 타입이 OPN(연산자)인 경우(266), 입력 매개 값을 하나도 갖지 않는 기본 생성자이므로 독립(Stand-alone) 함수를 생성한다(267). 그리고 노드 타입이 OPN이 아닌(266) 변수 일 경우(268) 지역변수이면 지역변수값 지정문을 생성하고(269), 전역변수이면 전역변수값 지정문을 생성한다(270).
한편, 자식 노드가 널이 아니고(265), 노드 타입이 OPN 이 아닌(271) 변수이면 변수 지정문을 생성하고(272), 노드 타입이 OPN이고 OPN 타입이 특수 연산자 기호(예; '+', '-' 등)이면 오퍼레이터 함수를 생성하고(271, 273, 274), OPN 타입이 특수 연산자 기호가 아닌 경우(예; 'eg', 'le' 등)는 일반 멤버 함수를 생성한다(271, 275, 276). 상술한 단계(267, 269, 270, 272, 274, 276) 후, 다시 상기한 AST의 노드를 인식한다(100).
상술한 바와 같이, 행위 컴파일러는 AST 화일을 읽어서 AST의 각 노드에 해당하는 C++ 코드를 생성한다. 여기서, C++코드로 상태 변환이 일어나기 위한 조건이나 상태 변환시 일어나는 입,출력은 LOTOS 값 표현식으로 주어지므로 행위 컴파일러에 의해서 생성된 C++ 코드는 자료 컴파일러에 의하여 생성된 코드와 일정한 형태로 상호 작용한다.
이상과 같은 본 발명은 LOTOS로 작성된 시스템 명세로부터 실행가능한 C++코드를 자동 생성하여 PC 플랫폼 상에서 실행되는 동작 모형을 통하여 시스템의 기능적 요구사항의 오류를 초기에 검출할 수 있고, 이를 이용하여 프로토타이핑 도구로 사용될 수 있다.

Claims (3)

  1. 편집기를 통해 작성된 LOTOS(Language Of Temporal Odering Specification) 명세가 구문 및 의미 분석과정을 거친 중간 표현 형태의 AST(추상구문트리)를 행위 컴파일러가 읽어서 C++코드로 생성하는 방법에 있어서,
    상기 읽은 AST의 노드(Node)를 순차적으로 인식하는 제 1 과정과;
    상기 인식된 노드에 해당하는 유한 상태기에 의거하여 정의된 가상 기계 코드에 따라 해당 C++ 코드를 생성하는 제 2 과정으로 수행함으로써, 개인용 컴퓨터(PC) 플랫폼 상에서 실행하는 동작 모형을 통하여 시스템의 기능적 요구사항의 오류를 초기에 검출할 수 있는 것을 특징으로 하는 LOTOS 명세로부터 C++코드 생성방법.
  2. 제 1 항에 있어서,
    상기 제 1 과정은 첫번째 노드, LOTOS 명세를 프로세스 단위로 작성시 그 프로세스가 AST에서 변환된 행위 단위(BUT) 정의 노드, 행위의 이벤트를 외부로부터 숨기기 위해 사용하는 숨김 노드, 이벤트가 일어나는 순서를 표현하기 위해서 사용하는 인에이블 노드, 행위가 다른 행위에 의하여 중단되는 것을 표현하는 디스에이블 노드, 두 행위의 모든 이벤트에서 동기화가 일어남을 표현하는 병렬 동기화 노드, 각 행위의 이벤트가 교대로 엇갈리게 일어남을 표현하는 병렬 인터리빙 노드, 정의된 이벤트에서만 동기화가 일어남을 표현하는 단일 동기화 노드, 여러 행위 표현식에서 하나의 행위를 선택할 때 사용하는 선택 노드, 조건이 참(TRUE)일 경우 다음 행위를 수행하는 것을 표현하는 가아드 노드, 이벤트가 값을 내보냄을 나타내는 외부 제공 노드, 비정상적인 종료(Stop)를 표현하는 비정상 종료 노드, 정상적인 종료(exit)를 표현하는 정상 종료 노드, 프로세스에 정의된 형식 매개변수를 실제값으로 인스턴스하는 BUT 개체화 노드, 이벤트에서 출력되는 값의 조건을 지정하는 예측 노드, 이벤트로 들어오는 값과 그 값의 데이터 타입을 지정하는 실험 리스트 노드, 그리고 LOTOS 명세에 표현된 값을 표현하는 값 노드를 순차로 인식하는 것을 특징으로 하는 LOTOS 명세로부터 C++코드 생성방법.
  3. 제 1 항 또는 제 2 항에 있어서,
    상기 제 2 과정은
    첫번째 노드일 경우 헤더 화일 정의문을 생성한 후 클래스 정의문을 생성하여 클래스 코드를 생성하고,
    상기 첫번째 노드가 아니고 BUT 정의 노드일 경우 클래스 명, 클래스 메모리 할당문, 스위치 문 및 케이스 문을 순서적으로 생성한 후변수 및 게이트를 초기화하여 BUT 정의 코드를 생성하고,
    상기 BUT 정의 노드가 아니고, 숨김 노드일 경우 주석 노드가 널 상태가 아니면 지연 또는 대기 상태 실행문을 생성한 후 다음에 널 상태이면 수행하는 다음 실행할 상태 지정문, 숨길 게이트 번호 지정문 및 현재 노드 타입 지정문을 순서적으로 생성하여 숨김 코드를 생성하고,
    상기 숨김 노드가 아니고 인에이블 노드일 경우, 인에이블 노드가 아니고 디스에이블 노드일 경우, 디스에이블 노드가 아니고 병렬 동기화 노드일 경우, 병렬 동기화 노드가 아니고 병렬 인터리빙 노드일 경우에 각각 주석노드가 널 상태가 아니면 지연 또는 대기 상태 실행문을 생성한 후 다음에 널 상태이면 수행하는 다음 실행할 상태 지정문, 클래스의 새로운 인스턴스, 명령문 및 현재 노드 타입 지정문을 순서적으로 생성하여, 각각 인에이블 코드, 디스에이블 코드, 병렬 동기화 코드 및 병렬 인터리빙 코드를 생성하고,
    상기 병렬 인터리빙 노드가 아니고, 단일 동기화 노드일 경우 주석노드가 널 상태가 아니면 지연 또는 대기 상태 실행문을 생성한 후 다음에 널 상태이면 수행하는 다음 실행할 상태 지정문, 클래스의 새로운 인스턴스, 명령문, 동기화 게이트 지정문 및 현재 노드 타입 지정문을 순서적으로 생성하여 단일 동기화 코드를 생성하고,
    상기 단일 동기화 노드가 아니고, 선택 노드일 경우 다음 실행할 상태 지정문, 클래스의 새로운 인스턴스, 명령문 및 현재 노드 타입 지정문을 순서적으로 생성하여 선택 코드를 생성하고,
    상기 선택 노드가 아니고, 가아드(Guard)노드일 경우 주석노드가 널 상태가 아니면 지연 또는 대기 상태 실행문을 생성하고, 널 상태이면 직접 부울(Bool) 타입의 참값 정의문을 생성한 후, 변수가 지역변수와 동일 관계이면 지역 변수값 체크 실행문을 생성함으로써 가아드 코드를 생성하고,
    상기 가아드 노드가 아니고, 외부 제공 노드일 경우 다음 실행할 상태 지정문, 현재 게이트 지정문 및 현재 노드 타입 지정문을 순서적으로 생성하여 외부 제공 코드를 생성하고,
    상기 외부 제공 노드가 아니고 비정상 종료 노드일 경우, 비정상 종료 노드가 아니고 정상 종료 노드일 경우에 각각 명령어 타입 지정문을 생성하여 비정상 종료 코드 및 정상 종료 코드를 생성하고,
    상기 정상 종료 노드가 아니고, BUT 개체화 노드일 경우 주석노드가 널 상태가 아니면 지연 또는 대기 상태 실행문을 생성한 후 다음에 널 상태이면 수행하는 새로운 클래스의 인스턴스, 명령문, 클래스간의 게이트 관계 지정문 및 명령어 타입 지정문을 순서적으로 생성하여 BUT 개체화 코드를 생성하고,
    상기 BUT 개체화 노드가 아니고, 예측 노드일 경우 부울 타입의 참값 정의문을 생성한 후, 변수가 지역변수가 동일관계에 있으면 지역변수값 체크 명령문을 생성하여 예측 코드를 생성하고,
    상기 예측 노드가 아니고, 실험 리스트 노드일 경우 실험 리스트가 한정되지 않은 변수이면 변수위치 지정문을 생성한 후 명령어 타입 선언문을 생성하여 실험 리스트 코드를 생성하고, 실험 리스트가 한정된 변수이면 변수 타입 지정문, 변수 위치 지정문 및 명령어 타입 선언문을 순서적으로 생성하여 실험 리스트 코드를 생성하고,
    상기 실험 리스트 노드가 아니고, 값(value) 노드일 경우 자식(Child) 노드가 널 상태이고, 노드 타입이 OPN(연산자)인 경우, 독립(Stand-alone) 함수를 생성하고, 노드 타입이 OPN이 아닌 변수일 경우 지역변수이면 지역변수값 지정문을 생성하고, 전역변수이면 전역변수값 지정문을 생성하며,
    상기 자식 노드가 널이 아니고, 노드 타입이 OPN 이 아닌 변수이면 변수 지정문을 생성하고, 노드 타입이 OPN이고 OPN 타입이 특수 연산자 기호이면 오퍼레이터 함수를 생성하고, OPN 타입이 특수 연산자 기호가 아닌 경우에는 일반 멤버 함수를 생성하여, 값 코드를 생성하고,
    상기 각 코드들을 생성한 후 다시 상기 AST의 노드를 인식하는 것을 특징으로 하는 LOTOS 명세로부터 C++코드 생성방법.
KR1019970059539A 1997-11-12 1997-11-12 로토스 명세로부터 씨 플러스 플러스 코드 생성방법 KR100276086B1 (ko)

Priority Applications (1)

Application Number Priority Date Filing Date Title
KR1019970059539A KR100276086B1 (ko) 1997-11-12 1997-11-12 로토스 명세로부터 씨 플러스 플러스 코드 생성방법

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
KR1019970059539A KR100276086B1 (ko) 1997-11-12 1997-11-12 로토스 명세로부터 씨 플러스 플러스 코드 생성방법

Publications (2)

Publication Number Publication Date
KR19990039434A KR19990039434A (ko) 1999-06-05
KR100276086B1 true KR100276086B1 (ko) 2000-12-15

Family

ID=19524607

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1019970059539A KR100276086B1 (ko) 1997-11-12 1997-11-12 로토스 명세로부터 씨 플러스 플러스 코드 생성방법

Country Status (1)

Country Link
KR (1) KR100276086B1 (ko)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110109681B (zh) * 2019-05-08 2023-06-09 上海携程商务有限公司 不同平台间代码的转换方法及系统

Also Published As

Publication number Publication date
KR19990039434A (ko) 1999-06-05

Similar Documents

Publication Publication Date Title
US11036614B1 (en) Data control-oriented smart contract static analysis method and system
CN108885545B (zh) 用于实时数据流编程语言的工具和方法
US7152229B2 (en) Workflow code generator
US6002874A (en) Method and system for translating goto-oriented procedural languages into goto-free object oriented languages
US6029002A (en) Method and apparatus for analyzing computer code using weakest precondition
US7661096B2 (en) Interaction with nested and non-nested streams
CN110149800B (zh) 一种用于处理与源程序的源代码相关联的抽象语法树的装置
US7934205B2 (en) Restructuring computer programs
US6321376B1 (en) Apparatus and method for semi-automated generation and application of language conformity tests
CN108628635A (zh) 获取参数名和局部变量名的方法、装置、设备及存储介质
Wagner et al. CAGEN: A fast combinatorial test generation tool with support for constraints and higher-index arrays
US20040154009A1 (en) Structuring program code
EP0520708B1 (en) Method and apparatus for converting high level form abstract syntaxes into an intermediate form
CN107463421B (zh) 一种静态流程模型的编译执行方法及系统
Benzinger Automated complexity analysis of Nuprl extracted programs
US20030233640A1 (en) Structuring program code
Pereira et al. An IOPT-net state-space generator tool
KR100276086B1 (ko) 로토스 명세로부터 씨 플러스 플러스 코드 생성방법
JP2007122187A (ja) プログラム・コード生成装置
JP5399601B2 (ja) 実装コード開発システム、及び実装コード開発プログラム
EP4196874A1 (en) Representing asynchronous state machine in intermediate code
Bedadala et al. Generation of Call Graph for Java Higher Order Functions
Grigorev et al. String-embedded language support in integrated development environment
Redziejowski Left recursion by recursive ascent
US8516504B1 (en) Method for adding device information by extending an application programming interface

Legal Events

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

Payment date: 20070831

Year of fee payment: 8

LAPS Lapse due to unpaid annual fee