KR20050118177A - Lyee지향 소프트웨어에 관한 정적(靜的)분석방법 - Google Patents

Lyee지향 소프트웨어에 관한 정적(靜的)분석방법 Download PDF

Info

Publication number
KR20050118177A
KR20050118177A KR1020057016947A KR20057016947A KR20050118177A KR 20050118177 A KR20050118177 A KR 20050118177A KR 1020057016947 A KR1020057016947 A KR 1020057016947A KR 20057016947 A KR20057016947 A KR 20057016947A KR 20050118177 A KR20050118177 A KR 20050118177A
Authority
KR
South Korea
Prior art keywords
word
declaration
type
lyee
definition
Prior art date
Application number
KR1020057016947A
Other languages
English (en)
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 카테나 가부시키가이샤
Publication of KR20050118177A publication Critical patent/KR20050118177A/ko

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3604Software analysis for verifying properties of programs

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)

Abstract

Lyee 요건중에, 종래법에서 이용된 정적분석수법을 응용한다. 구체적으로는, Lyee 요건을 대상으로 하여, 최적화(고전적 최적화, 술부 벡터의 순서부에 의한 최적화), 슬라이싱, 요건 디버그, 타이핑(오류 검출, 타입 발견, 타입을 이용한 시큐러티)을 실시한다. 또한, 이들을 Lyee All 툴로의 최적화 코드의 생성에 적절한 사전 처리를 실시한 형식으로서 요건을 출력한다. 이것에 의해, Lyee 방법론에 있어서의 보다 좋은 품질(보다 적은 메모리와 실행시간의 소비)을 가진 코드 생성을 위한 요건정확의 최적화가 가능해진다.

Description

Lyee지향 소프트웨어에 관한 정적(靜的)분석방법{STATIC ANALYSIS METHOD FOR LYEE-ORIENTED SOFTWARE}
본 발명은, 예를 들면 업무용·개인용 등의 용도, 비즈니스 어플리케이션·게임 등의 종류·내용, 소프트웨어 단품·전자제품 ROM 조립 등의 형태를 불문하고 모든 용도, 종류·내용, 형태에 있어서의 소프트웨어에 이용할 수 있는 소프트웨어의 분석방법에 관한 것이며, 특히 Lyee(등록상표. 이하 동일) 지향 소프트웨어에 관한 정적분석방법에 관한 것이다.
소프트웨어 개발과 유지는 우리의 경제에 있어서 주요한 중요성을 가진 활동이 되었다. 컴퓨터가 광범위하게 사용될 때에는, 이러한 활동은 산업에 크고 광범위하게 관련되게 된다.
매년, 소프트웨어를 개발·유지하기 위해서 몇천억달러의 거액의 자금이 소비되고 있다. 오늘날, 소프트웨어 개발분야의 참가자끼리의 경쟁은 이전보다 격렬함이 증대되고 있다. 그 경주에서 살아남기 위해서, 이들 참가자(회사)는 생산성을 최대한으로, 비용을 최소한으로 유지하지 않으면 안 된다. 그들은 또한, 높은 품질을 가진 제품(소프트웨어)을, 시간내에, 납입해야 한다. 그러나, 소프트웨어 개발을 위해서 현재 이용가능한 툴과 방법론은 회사의 요구에 정확히 적합하다고 말할수 없는 부분이 있다.
기본적으로, 소프트웨어 연구·개발의 목표는, 간단하게, 재빠르게, 보다 품질의 높은 소프트웨어를 구축할 수 있는 방법을 찾는 것이다. 최근 10년간, 다양한 방법론과 테크닉이 연마되어 제안되어 오고, 그 나름대로 소프트웨어 개발 라이프 사이클의 스텝을 개량해 왔다.
이들은 개량에 대해 꽤 공헌을 했다고 인정됨에도 불구하고, 그것들을 광범위하게 사용하려면 곤란함이 있었다. 사실상, 그들중, 명확한 이해나 수정을 가능하게 하는 시스템이 만들어진 것은 거의 없었고, 그들 사용은 여전히, 능력, 기능, 및 지식을 폭넓게 가진 전문가에게만 편리하다고 생각되어져 왔기 때문이다. 이것은 반대로, 소프트웨어의 실행에는, 고급 인재의 등용, 고가가 드는 유지, 및 대규모 점검을 필요로 하는 것을 의미한다. 이들 이유로부터, 기업은 현재, 새로운 유망한 소프트웨어 개발 사이클의 개량방법론에 대해서는, 어떤 것이어도 충분히 환영하고, 동시에, 대가를 지불할 준비가 되어 있다.
Lyee(「소프트웨어 개발을 위한 통일적 방법론」를 의미하는 약자어)는 새롭게 매우 유망한 방법론의 하나이다. 다른 분야에 관련한 광범위한 소프트웨어 문제를 효율적으로 취급하는 것이 의도되어 있는 Lyee는, 단순히 원하는 소프트웨어 개발의 요건을 정의하는 것만으로 소프트웨어를 개발하는 것을 가능하게 한다. 보다 정확하게 말하면, 사용자는 단순히 단어, 단어에 대한 계산식, 그 계산의 조건(전제조건), 및 화면과 프린트 아웃의 레이아웃을 주는 것만으로도 좋다(예를 들면, 특허문헌 1 및 2, 4 내지 6 참조).
그후는, 컴퓨터의 손에 그 후의 모든 귀찮은 프로그래밍 과정(콘트롤 로직의 측면)을 맡기는 것이다. 즉, SE(시스템 엔지니어) 등의 사람이 논리를 설계할 필요는 없다.
Lyee는 발명후 아직 얼마되지 않았음에도 불구하고, 그 사용의 결과는 상상을 초월하는 가능성을 나타내고 있다. 사실상, 종래의 방법론과 비교해서, 개발시간, 유지시간, 및 문서용량을 매우 감소시킬 수 있다(70∼80%). 현재까지, 요건으로부터 코드의 자동생성을 실시하는 개발자는, Lyee All로 불리는 원시적인 지원 툴을 이용 가능하다(예를 들면, 특허 문헌 3 및 4 참조).
그럼에도 불구하고, 어떤 새로운 방법론에 있어도 그렇듯이, Lyee에 대해서도, 그 효율을 입증하고, 그 좋은 품질을 개량할 수 있도록 연구를 하지 않으면 안 된다. 또한, Lyee All 툴은, 더욱더 사용자친화성을 실현하도록 개량되는 여지가 제로라고는 말할 수 없다.
한편, 소프트웨어의 정적분석수법으로서는, ① 최적화의 테크닉, ② 프로그램·슬라이싱·테크닉, ③ 요건 디버그, ④ 타이핑 등이 있다(비특허문헌 1 및 4 참조).
① 최적화의 테크닉(비특허문헌 3 및 8 참조)은, 일련의 변경을 도입하는 것으로, 코드열의 용량, 그 실행시간, 소비메모리 등을 단축할 목적으로 이루어지는 것이지만, Lyee 방법론과의 조합에 있어서는, 지금까지는 최적화의 대상은 Lyee에 의해서 이루어진 코드열이며, Lyee 요건을 그 대상으로 하는 것은 기술적으로 명확하게 실현되어 있지 않았다(특허문헌 4 참조).
② 프로그램·슬라이싱·테크닉은 전통적인 프로그래밍언어중에서는, 프로그램 독해와 디버그를 「분할하여 지배하는」어프로치로서, 장시간, 사용되어 왔다. 또한, 많은 어플리케이션의 분석에도 순조롭게 사용되어 왔지만 이들 어플리케이션의 목표로 하는 것은, 결합, 알고리즘의 디버그, 리버스 엔지니어링, 컴퍼넌트 재사용, 자동병행화, 프로그램통합, 및 검증 보조를 측정하는 것 등이며, 지금까지는 Lyee방법론과 조합한다고 하는 발상이 없었다(비특허문헌 12 참조).
③의 요건 디버그는 코드가 생성되기 전에 요건 버그를 검출하여 보다 유익한 결과를 얻을 수 있지만, 지금까지는 Lyee 방법론과 조합한다고 하는 발상은 없었다.
④의 타입 시스템(비특허문헌 2 및 11 참조)은 프로그램의 몇가지 동적인 좋은 행동의 특성을 정적으로 보증하는데에 주로 사용되고, 이것에 의하면, 프로그램의 실행시에 빈번히 일어나는 에러를, 컴파일시에 검출할 수 있다. 또한, 타이핑 기술은, 개발된 소프트웨어가 어떠한 시큐러티 문제에 대처하는지를 확실하게 하는데 성공적으로 사용되어 왔다(비특허 문헌 11 참조)가, 지금까지는 Lyee 방법론과 조합한다고 하는 발상은 없었다.
(특허문헌 1)
국제 공개 WO 97/16784 A1 팜플렛
(특허문헌 2)
국제 공개 WO 98/19232 A1 팜플렛
(특허문헌 3)
국제 공개 WO 99/49387 A1 팜플렛
(특허문헌 4)
국제 공개 WO 00/79385 A1 팜플렛
(특허문헌 5)
국제 공개 WO 02/42904 A1 팜플렛
(특허문헌 6)
일본특허공개 2002-202883호공보
(비특허문헌 1)
엠·보쯔가, 제이·씨·페르난데스, 엘·길브(M.Bozga, J.C.Fernandez, and L.Ghirvu)저, 「자동테스트 생성개량을 위한 정적분석의 사용」, 2000년, p.235-250
(비특허문헌 2)
엘·카델리(L. Cardelli) 저, 「타입·시스템」,컴퓨터 사이언스와 공학의 핸드북, 제103장, CRC 프레스사, 1997년
(비특허문헌 3)
티·헤닝(T.Henning) 저, 「최적화 수단」, 스프링·페아라크 출판, 1975년
(비특허문헌 4)
에스·무히닉크(S.Muchnick) 저, 「컴파일러 디자인의 이식」, 모간코프만 출판사, 캘리포니아, 1999년
(비특허문헌 5)
근래문생(根來文生) 저, 「Lyee 소프트웨어의 본질」, 21세기 정보화 사회에 관한 국제회의 2000(IS 2000), p.121-189, 2000년 11월
(비특허문헌 6)
근래문생(根來文生) 저, 「Lyee입문」, 소프트웨어 생산기술 연구소, 도쿄, 일본, 2001년
(비특허문헌 7)
근래문생(根來文生), 아이·하미드(I.HamId) 저, 「의사공학의 제안」, 데이터 베이스와 정보시스템에 관한 제5회 동유럽회의연구(AD BIS' 2001), 2000년 9월
(비특허문헌 8)
에스·판데(S.Pande), 디·피·아그로왈(D.P.Agrawal) 저, 「스케이러블 평행 시스템을 위한 컴파일러 최적화: 언어, 컴파일 테크닉, 및 실행시간 시스템」, 스프링·페아라크, 2001년
(비특허문헌 9)
디·이·라자포드(D.E.Rutherford) 저, 「격자 이론(래티스 이론)에의 서론」, 하프넨 출판, 뉴욕, 1965년
(비특허문헌 10)
에프·팁(F. Tip) 저, 「프로그램 슬라이싱 기술에 관한 조사」, 프로그래밍 언어져널, 3(3): p.121-189, 1995년 9월
(비특허문헌 11)
디·볼파노(D.Volpano), 지·스미스(G.Smith), 및 씨·아비인(C.lrvine) 저, 「확실한 플로우 분석을 위한 정적 타입 시스템」, 컴퓨터 시큐러티 져널, 4(3) : p.167-187, 1996년
(비특허문헌 12)
더블류·바이자(W.Weiser) 저, 「프로그램 슬라이싱」, IEEE 트랜스·소프트웨어·엔지니어링, p. 352-357, 1984년 7월
이와 같이, 간단하게, 재빨리, 보다 품질이 높은 소프트웨어를 구축할 수 있는 방법으로서 종래보다 다양한 방법론과 기술이 제안되어 오고 있고, 그 나름대로 소프트웨어 개발 라이프 사이클의 스텝을 개량해 왔지만, 이들은 명확한 이해나 수정을 실현하는 것은 아니었고, 그들 사용은, 능력, 기능, 및 지식을 폭넓게 가진 전문가에만 사용이 편리하였으므로, 소프트웨어의 실행에는, 인건비, 소프트웨어 유지비, 및 체크비에 대규모 지출을 불가피하게 들이고 있다고 하는 문제가 있었다.
이 문제를 해결하기 위해 Lyee로 불리는 유망한 방법론이 제안되었지만, 그 효율, 품질에서의 연구, 더욱 사용자친화성의 실현을 위한 개량의 여지가 있다.
본 발명은 상기의 종래 기술의 문제를 해결하기 위해서 이루어진 것이다. 구체적으로는, 본 발명은, Lyee 방법론에 있어서의 보다 좋은 품질(보다 적은 메모리와 실행 시간의 소비)을 가진 코드 생성을 돕는 Lyee지향 소프트웨어에 관한 정적분석방법을 제공하는 것을 목적으로 한다.
그를 위해서 본 발명은, Lyee 요건(그들 정의, 그들 계산상태, 및 그들 속성중의 1세트의 단어)을 분석하기 위해서 고전적인 정적분석의 테크닉을 이용함으로써 Lyee 방법론을 한층 증진시킬 수 있는 방법을 나타내고, 그것을 실제로 이용하는 것이 가능한 Lyee 지향 소프트웨어에 관한 정적 분석 방법을 제공하는 것을 또다른 목적으로 한다.
또한 본 발명은, 타이핑과 다른 정적인 분석의 테크닉이 얼마나 Lyee방법론의 어떠한 국면을 개량할 수 있는지를 나타내고, 그것을 실제로 이용하는 것이 가능한 Lyee 지향 소프트웨어에 관한 정적분석방법을 제공하는 것을 또 다른 목적으로 한다.
또한 본 발명은, Lyee 요건분석기, 즉, 몇가지 정적분석의 테크닉을 부여하기 위해서 개발된 원형을 제시하여, 그것을 실제로 이용하는 것이 가능한 Lyee 지향 소프트웨어에 관한 정적분석방법을 제공하는 것을 또 다른 목적으로 한다.
또한 본 발명은, 최종적으로, 본 작업 및 향후의 연구에 관한 몇가지 결론적 소견을 개관하여 제시하고, 그것을 실제로 이용하는 것이 가능한 Lyee 지향 소프트웨어에 관한 정적분석방법을 제공하는 것을 또 다른 목적으로 한다.
여기서 「Lyee(등록상표)」란, 본원 발명에 관한 발명자의 한 사람인 근래문생(根來文生)에 의해 발명된 소프트 웨어 생산방법 등에 관련된 발명, 기술을 말하며, 그 상세한 내용은 예를 들면, 상기 특허문헌 1 내지 특허문헌 6 등에 의해서 규정되는 여러 국제공개공보 등에 개시되어 있다.
[발명의 개시]
본 발명은 상기 목적을 달성하기 위해서, Lyee 방법론에 준거하여 소프트웨어를 생산하기 위해서 단어마다의 정의식을 포함한 요구정의를 얻는 스텝과, 상기 얻어진 요구정의를 단어를 키로 하여 상수를 검출하는 스텝과, 상기 검출된 상수를 사용하는 정의식에 따라서 상기 상수를 전파시키는 스텝을 구비한다.
「상수를 전파시키는」것이란, 요구정의(Lyee 요건) 중의 단어에 상수가 있는 경우에, 이러한 상수를 그 단어에 대입하고, 이 단어를 이용한 정의식을 가진 단어에 대입하여, 연선과 대입해 나감으로써 단어마다의 정의식을 정리하는 것을 말한다.
이러한 본 발명에서는, Lyee에 의한 소프트웨어 생산의 전단계인 Lyee 요건에 대해서 최적화를 실시하므로, Lyee 방법론에 의한 소프트웨어 생성에 있어서 코드열의 용량의 경감, 소비 메모리의 경감, 프로그램 실행 시간의 더 큰 경감이 달성된다.
또한 본 발명은, Lyee 방법론에 준거하여 소프트웨어를 생산하기 위해서 단어마다의 정의식을 포함한 요구정의를 얻는 스텝과, 상기 얻어진 요구정의중의 정의식으로부터 패턴을 검출하는 스텝과, 상기 요구정의를 상기 검출된 패턴을 치환식으로 하는 표현으로 바꾸는 스텝을 구비한다.
「패턴을 치환식으로 하는」것이란, 요건중의 패턴이 몇번이나 나타나는 경우에, 그것을 일시적인 변수로 바꾸는 것을 말한다.
이러한 본 발명에서는, Lyee요건의 여러 차례 출현 패턴을 단 1회만 계산하여 몇번이나 계산되는 경우를 없애므로, 코드의 실행시간의 감소가 달성된다.
또한, 본 발명은, Lyee 방법론에 준거하여 소프트웨어를 생산하기 위해서 단어마다의 정의식 및 전제 조건을 포함한 요구정의를 얻는 스텝과, 상기 요구정의에 기초하여, 적어도 상기 단어와 관련된 식별자, 정의식 및 전제 조건을 BNF 문법을 준수하여 기술한 선언을 얻는 스텝과, 상기 얻어진 선언마다 Def/Use함수를 정의하는 스텝과, 상기 정의된 Def/Use함수간의 순서 관계로부터 상기 선언사이의 순서 관계를 얻는 스텝을 구비한다.
「선언」이라 함은, 요건중의 단어와 그에 대한 정의식, 전제 조건, 입출력 속성 등을 1개의 함수적 표현으로 한 것이다. 또한, 「Def/Use함수」라 함은, 이러한 선언마다 피정의단어를 표현한 함수, 상기 피정의단어를 정의하기 위해서 이용하는 다른 단어를 표현한 함수이다.
이러한 본 발명에서는, Lyee 요건중의 단어와 그 정의식 등을 선언의 형태로 변환·분석하는 결과 Lyee 기저논리중의 술부 벡터가 가장 좋은(즉, 실행 시간이 감소되는) 조합을 알 수 있으므로, 예를 들면 요건으로부터 코드를 생성하는 툴(Lyee All)과 조합함으로써, Lyee에 의한 소프트웨어 생성에 있어서의 효율화를 더욱 추진할 수 있다.
그리고 또한, 본 발명은, Lyee 방법론에 준거하여 소프트웨어를 생산하기 위해서 단어마다의 정의식 및 입출력 속성을 포함한 요구정의를 얻는 스텝과, 상기 요구정의에 기초하여, 적어도 상기 단어와 관련된 식별자, 상기 정의식 및 입출력 속성을 기술한 선언을 얻는 스텝과, 상기 얻어진 선언(제 1 선언)으로부터, 상기 선언에 관련된 단어의 정의에 공헌하는 다른 선언(제 2 선언)을 도입하여, 상기 제 1 및 제 2 선언을 동일 선언군으로 하는 슬라이스함수를 해당 모든 선언에 대해서 실행하는 스텝과, 상기 슬라이스 함수로부터 서로 독립인 슬라이스를 얻는 스텝을 구비한다.
「슬라이스 함수」라 함은, 프로그램을 특정의 계산에 관련한 선언에 수렴시켜, 서로 독립적인 선언군마다 나누는 기능을 가진 함수를 말한다.
이러한 본 발명에서는, 서로 독립인 슬라이스군을 병행 실행할 수 있으므로, 실행시간의 감축, 특히 선언수가 많을 때에도 요건정의의 파악에 있어서의 잘못의 감축을 달성할 수 있다.
또한, 본 발명은, Lyee 방법론에 준거하여 소프트웨어를 생산하기 위해서 단어마다의 정의식 및 입출력 속성을 포함한 요구정의를 얻는 스텝과, 상기 요구정의에 기초하여, 적어도 상기 단어와 관련된 식별자, 상기 정의식 및 입출력 속성을 기술한 선언을 얻는 스텝과, 상기 얻어진 선언에 대한 소정의 분석에 기초하여 상기 요구정의중의 버그를 검출하는 스텝을 구비한다.
「요구정의중의 버그를 검출하는」것이란, 예를 들면 선언에 대한 룰을 이용하는 것으로, 비활성 선언, 사이클릭 선언, 불완전 선언, 여분 선언 등을 발견하는 것을 말한다. 물론, 버그 검출에는 이들 선언에 한정되는 것이 아니고, 다른 선언을 대상으로 하는 것도 가능하다.
이러한 본 발명에서는, Lyee 방법론에 있어서의 시나리오 함수 실행에 있어서, 실제로 실행되지 않는 서브 프로그램에 제어가 옮겨가는 것을 방지할 수 있으므로, 처리시간의 경감, 소비 메모리의 효율화 등이 달성된다.
또한, 본 발명은, Lyee 방법론에 준거하여 소프트웨어를 생산하기 위해서 단어마다의 정의식 및 입출력 속성을 포함한 요구정의를 얻는 스텝과, 상기 요구정의에 기초하여, 적어도 상기 단어와 관련된 식별자, 상기 정의식 및 입출력 속성을 기술한 선언을 얻는 스텝과, 상기 얻어진 선언, 상기 선언중의 연산자 및 데이터에 대해서 각각 타입 대수(代數)를 정의하는 스텝과 상기 정의된 타입 대수에 대해서 관련지을 수 있는 환경 및 소정의 타입규칙을 이용하여 상기 요구정의중의 타입 오류를 발견하는 스텝을 구비한다.
「타입 대수(代數)」라 함은, 요건으로부터 생성하는 선언과 관련된 단어, 정의식 등에 타입의 개념을 도입하여, 타입이 다른 것을 동격으로 취급하고자 하는 것을 에러로 하여 요건 단계에서 배제하는 조작을 수식적으로 실시하기 위해서 도입하는 개념이다.
이러한 본 발명에서는, Lyee 요건을 대상으로 하여 타입적으로 분석을 실시하여, 타입 규칙을 이용하여 요건중의 오류를 발견하므로, 프로그램 에러의 경감을 더욱 촉진할 수 있다.
또한, 본 발명은, Lyee 방법론에 준거하여 소프트웨어를 생산하기 위해서 단어마다의 정의식 및 입출력 속성을 포함한 요구정의를 얻는 스텝과, 상기 요구정의에 기초하여, 적어도 상기 단어에 관련된 식별자, 상기 정의식 및 입출력 속성을 기술한 선언을 얻는 스텝과, 상기 얻어진 선언, 상기 선언중의 연산자 및 데이터에 대해서 각각 타입 대수를 정의하는 스텝과, 상기 정의된 타입 대수를 기초로, 소정의 환경 및 타입 규칙을 이용하여, 상기 요구정의중의 입력 단어로부터 중간 개재물 및 출력 단어의 타입을 생성하는 스텝을 구비한다.
이러한 본 발명에서는, 입력 단어로부터 미리 출력단어나 중간개재물의 타입을 유일적으로 도출하므로, 사용자 작업의 간소화, 오류의 감소를 달성할 수 있다.
또한, 본 발명은, Lyee방법론에 준거하여 소프트웨어를 생산하기 위해서 단어마다의 정의식 및 입출력 속성을 포함한 요구정의를 얻는 스텝과, 상기 요구정의에 기초하여, 적어도 상기 단어와 관련된 식별자, 상기 정의식, 입출력 속성 및 시큐러티 라벨을 기술한 선언을 얻는 스텝과, 상기 얻어진 선언중의 시큐러티 라벨간의 관계를 나타내는 라치스를 이용하여, 상기 단어의 값에 시큐러티 라벨을 관련짓는 라벨 함수를 정의하는 스텝과, 상기 정의된 라벨 함수를 기초로, 소정의 시큐러티 방침을 이용하여, 규정의 시큐러티 방침을 준수하지 않는 프로그램을 산출하는 스텝을 구비한다.
「시큐러티 라벨」이라 함은, 어느 정보에 대한 시큐러티 요건(예를 들면, 「공개의」,「비밀의」등)을 나타내는 라벨이다. 「라벨 함수」는, 요건중의 단어에 대해로 이러한 시큐러티 라벨을 부여하여 이것을 수식적으로 처리하기 위한 함수이다. 또한, 「시큐러티 방침」이란, 사용자측에서 자유롭게 규정할 수 있는, 어느 시큐러티 라벨을 가진 정보는 어떻게 취급할 것인지를 정한 지침을 말한다.
이러한 본 발명에서는, 상술의 타이핑 기술을 정보 시큐러티에도 확대하는 것으로, 시큐러티 위반을 발생시키는 여지가 있는 설계상의 결함을 명확하게 하는데 도움이 되는 자동적 프로그램 검증을 달성할 수 있다.
본 발명은 또한, Lyee 방법론에 준거하여 소프트웨어를 생산하기 위해서 단어마다의 정의식 및 전제 조건을 포함한 요구정의를 받아들이는 요구정의 수취부와, 상기 수취된 요구정의로부터 이것에 포함되는 어휘 및 구문을 분석하여 중간적 표현을 출력하는 분석부와, 상기 출력된 중간적 표현으로부터 시작하여 상기 요구정의에 대해서 데이터 플로우 및 제어 플로우에 관한 분석을 실시하여 데이터 플로우도 및 제어 플로우도를 출력하는 플로우 분석부와, 상기 플로우 분석을 거친 요구정의에 대해서 최적화를 실시하여 개선된 규약을 출력하는 최적화부를 구비하도록 구성하는 것도 가능하다.
이러한 경우의 「요구정의 수취부」란, 본원에 의한 소위 가공이 실시되기 전의 Lyee 요건(요구정의)이 입력되는 기능을 가진 단위를 말하고, 예를 들면, 해당 기능을 프로그램화하여 실행가능한 형식으로 한 것을 게재한 기록 매체나 ROM 등으로서 실현될 수 있다.
「분석부」란, 받아들인 상기 요구정의로부터 어휘 및 구문을 추출하여 분석한 후, 상기 요구정의를 구문상태의 중간적 표현으로서 출력하는 기능을 가진 단위를 말하고, 예를 들면, 해당 기능을 프로그램화하여 실행가능한 형식으로 한 것을 게재한 기록 매체나 ROM 등으로서 실현될 수 있다.
「플로우 분석부」란, 중간적 표현으로부터 시작하여, 1 요건 포인트로부터 다른 1포인트까지 도달하는 데이터 플로우 콘트롤의 순환에 관계 있는 모든 정보를, 예를 들면 제어 플로우도(Control Flow Graph: CFG) 및 데이터·플로우도(Data-Flow Graph: DFG) 등으로서 출력하는 기능을 가진 단위를 말하고, 예를 들면, 해당 기능을 프로그램화하여 실행 가능한 형식으로 한 것을 게재한 기록 매체나 ROM 등으로서 실현될 수 있다.
「최적화부」란, 예를 들면 상수 전파 기술을 실행하고, Lyee All 툴이, 보다 빠르게 실행할 수 있고, 소비하는 메모리가 보다 적은 프로그램을 생성하는데에 적합한, 규칙적으로 간이화된 선언의 계열을 생산하는 기능을 가진 단위를 말하고, 예를 들면, 해당 기능을 프로그램화하여 실행 가능한 형식으로 한 것을 게재한 기록 매체나 ROM 등으로서 실현할 수 있다.
「슬라이서」란, 플로우 베이스 분석요소 및 슬라이싱 평가기준에 의해서 만들어지는 플로우에 관한(각 단어에 관련지어진 Def/Use 등의) 정보를 받아들여, 이들 주어진 평가 기준에 대응하는 슬라이스를 출력으로서 부여하는 기능을 가진 단위를 말하고, 예를 들면, 해당 기능을 프로그램화하여 실행 가능한 형식으로 한 것을 게재한 기록 매체나 ROM 등으로서 실현할 수 있다.
따라서 본 발명에 의하면, 상술의 각각의 기능을 실현가능단위의 예를 들면 매체로 했으므로, 입력으로서 Lyee 요건을 받아들이고, Lyee All 툴로의 최적화 코드의 생성에 적절한 슬라이스와 순서를 정비된 요건을 출력으로서 부여하는 것, 또한, 상수전파 등의 다른 요건 최적화를 실행하는 것이 가능해진다.
또한, 본 발명은, 소프트웨어 분석방법으로서 뿐만 아니라, 소프트웨어 분석장치, 혹은 넓게 소프트웨어 개발방법, 소프트웨어 개발장치, 및, 이들을 컴퓨터에 실시시키기 위한 소프트웨어, 해당 소프트웨어를 기록한 기록 매체, 해당 소프트웨어를 탑재한 장치, 해당 소프트웨어를 예를 들면 ROM 등에 저장한 전용 머신, 혹은 이들을 업무 형태로서 실행하는 비즈니스모델 등으로서도 실현가능하고, 본 발명은 이러한 실현 형태를 포함하는 것이다.
도 1은, 본 발명에 관한 Lyee 방법론에 있어서의 요건 실행을 코드열로 나타낸 개념도이다.
도 2는, 본 발명에 관한 Lyee 방법론에 있어서의 팔레트의 개념을 설명하기 위한 개념도이다.
도 3은, 본 발명에 관한 Lyee 방법론에 있어서의 시나리오 함수의 개념을 설명하기 위한 개념도이다.
도 4는, 본 발명에 관한 Lyee 방법론에 있어서의 술부 벡터의 동적 구조를 나타내는 플로우챠트이다.
도 5는, 본 발명에 관한 Lyee 방법론에 있어서의 L4, a , 및 L4, b의 술부 벡터의 동적 구조를 나타내는 플로우챠트이다.
도 6은, 본 발명에 관한 Lyee 방법론에 있어서의 L3, a, 및 L3, b의 술부 벡터의 동적 구조를 나타내는 플로우챠트이다.
도 7은, 본 발명에 관한 Lyee 방법론에 있어서의 화면의 상호작용을 개념적으로 설명하기 위한 개념도이다.
도 8은, 본 발명에 관한 Lyee 방법론에 있어서의 처리 경로도의 개념을 설명하기 위한 개념도이다.
도 9는, 본 발명의 일실시형태에 관한 UseDirectAndIndirect(s, S)의 알고리즘을 설명하기 위한 플로우챠트이다.
도 10은, 본 발명의 일실시형태에 관한 순환선언문을 검출하는 알고리즘을 설명하기 위한 플로우챠트이다.
도 11은, 본 발명의 일실시형태에 관한 불완전 선언문을 검출하는 알고리즘을 설명하기 위한 플로우챠트이다.
도 12는, 본 발명의 일실시형태에 관한 불요 선언문을 검출하는 알고리즘을 설명하기 위한 플로우챠트이다.
도 13은, 본 발명의 일실시형태에 관한 불요 선언문을 검출하는 알고리즘을 설명하기 위한 플로우챠트이다.
도 14는, 본 발명의 일실시형태에 관한 2개중 선행 실행해야 할 선언문을 검출하는 알고리즘을 설명하기 위한 플로우챠트이다.
도 15는, 본 발명의 일실시형태에 관한 선언문의 순서의 질서를 세우는 알고리즘을 설명하기 위한 플로우챠트이다.
도 16은, 본 발명의 일실시형태에 관한 선언문의 순서의 질서를 세우는 알고리즘을 설명하기 위한 플로우챠트이다.
도 17은, 본 발명의 일실시형태에 관한 단어 a의 슬라이스를 추출하는 알고리즘을 설명하기 위한 플로우챠트이다.
도 18은, 본 발명의 일실시형태에 관한 단어 a의 슬라이스를 추출하는 알고리즘을 설명하기 위한 플로우챠트이다.
도 19는, 본 발명의 일실시형태에 관한 독립한 슬라이스를 검출하는 알고리즘을 설명하기 위한 플로우챠트이다.
도 20은, 본 발명의 일실시형태에 관한 타이핑의 알고리즘을 설명하기 위한 플로우챠트이다.
도 21은, 본 발명의 일실시형태에 관한 타이핑의 알고리즘을 설명하기 위한 플로우챠트이다.
도 22는, 본 발명의 일실시형태에 관한 타이핑의 알고리즘을 설명하기 위한 플로우챠트이다.
도 23은, 본 발명의 일실시형태에 관한 타이핑의 알고리즘을 설명하기 위한 플로우챠트이다.
도 24는, 본 발명의 일실시형태에 관한 타이핑의 알고리즘을 설명하기 위한 플로우챠트이다.
도 25는, 본 발명의 일실시형태에 관한 타이핑의 알고리즘을 설명하기 위한 플로우챠트이다.
도 26은, 본 발명의 일실시형태에 관한 Lyee 요건분석기의 동적 구조를 설명하기 위한 기능 블록 겸 플로우챠트이다.
[발명의 개요]
본 발명의 기본이 되는 사고는, Lyee로 불리는 개발방법론이며, 이것에 대해서는, 상기의 특허문헌 1 내지 특허문헌 6 등에 개시되어 있는 것이다.
소프트웨어 시스템의 연구와 개발의 과정에서 가장 문제가 많은 태스크의 하나는 요건을 충분히 이해하여 그것을 올바르게 그들을 코드로 바꾸는 것이다. 이러한 문제를 해결하기 위해서, Lyee 방법론에서는, 요건으로부터 프로그램을 발생시키는 간단한 방법이 제안되어 있다.
Lyee 방법론의 배경에 있는 철학적인 원칙에 대해서는 상기의 문헌에 의한 것으로 하고, 이하에서는, 도면·표를 참조하여, 이 방법론을 사용함으로써 소프트웨어를 쓰는 방법과 그 방법에 따라 요건으로부터 자동적으로 생성된 코드를 어떻게 볼 것인지를 이해하기 위해서 도움이 되는 몇가지 실용적인 아이디어에만 초점을 맞추어 설명한다.
① Lyee 요건
Lyee 방법론에서는, 요건은, 복수의 선언(文)(statements)의 집합으로서 선언적 방법으로 주어진다. 선언은, 단어, 거기에 동반한 단어의 정의, 계산조건과 속성(인풋/아웃풋, 타입, 시큐러티 속성 등)을 포함하고 있다.
단순화를 위해서, 본 명세서에서는, 각 선언은 다음의 1)로부터 5)의 정보를 포함한다고 간주한다.
1) 단어(Word)
단어의 식별자
2) 정의(Definition) : 단어를 정의하는 식. 단순화를 위해서, 식이란 이하의 어느 하나일 수 있다고 생각한다.
상기에 나타낸 식 Exp의 정의는 이하와 같다.
·Exp
식 「Exp」(식), 값「val」, 식별자「Id」, 괄호가 붙은 식「(Exp )」, 뒤로 식이 계속되는 단항 연산자「op Exp」(예를 들면 -2, -(a+b)), 혹은, 다른 식을 수반하는 2항연산자가 계속되는 식 「Exp op Exp」이다.
·val
값「val」은, 수치「num」, 부동소수점치「num.num」(수치.수치), 혹은 불치(진위치)「bool」이다.
·num
수치「num」는, 숫자(degit)나, 또 하나의 수치가 뒤로 계속되는 수치「num. num」이다.
·bool
부울치는, 참(true), 혹은 거짓(false)이다.
·id
식별자 「id」는 문자, 문자 뒤에 수치가 계속되는 「id num」, 혹은 식별자 뒤로 식별자가 계속 되는 「id id」이다.
·op
연산자는 +, -, *, or, and, <, <=, =, <>, >, >= 또는 not이다.
2) 조건(Condition)
조건이란, 단어의 계산 조건으로, 부울연산자로 보여지는 식 Exp이다. 만약 조건이 없는(즉 조건이 항상 참)라면, 이 항목은 공란인 채로 해 둔다.
3) IO
이 항목은 정의된 단어가 입력단어, 출력단어 혹은 중간단어(intermediate word)인 것을 명시하기 위해서 할당한다. 만약 단어가 입력으로서, 그것이 파일로부터의 입력이라면, 이 항목은 값 IF가 되어, 만약 단어가 화면으로부터의 입력이라면 IS가 된다. 마찬가지로 만약 단어가 출력이라면, 이 란은 값 OF(파일에의 출력의 경우) 또는 OS(화면에의 출력의 경우)가 된다. 그러나, 만약 단어가 중간단어라면, 이 란을 공란인 채로 해 둔다. 중간 단어란, 입력이 아니고, 또한, 정의의 식에 의해서 생성된 값은 출력되지 않고, 생성된 값이 다른 출력 단어의 값의 생성에만 기여하는 단어이다.
4) 타입(Type)
이 항목은 단어의 타입을 지정하기 위해서 할당하여, 정수「int」, 부동 소수점수 「float」 혹은 부울치 「bool」중의 어느 하나의 값을 취한다.
5) 시큐러티(Security)
이 항목은, 정의된 단어의 시큐러티 레벨을 결정하기 위해서 할당하여, 공개 「public」 혹은 비공개 「secret」중의 어느 하나의 값을 취한다. 만약 정의된 단어가 입력되지 않으면, 항목「타입」과 「시큐러티」는 공란이어도 좋다. 마찬가지로, 다른 종류의 타입과 다른 종류의 시큐러티레벨은 용이하게 확장하여, 진정한 Lyee 요건을 정확하게 만족시킬 수 있다.
표 1은 Lyee 요건의 예를 나타낸다.
(표 1)
Lyee 요건
본 명세서에서는, 이후, 선언(statement)이라 함은, 요건표의 1행을 의미한다.
예를 들면, 표 1에서 단어 a를 정의하고 있는 선언(이것을 Sa라고 적는다)은, 표 2에 기술된 바와 같다.
(표 2)
단어 a의 선언
본 명세서에서는, 이후, 만약 S가 선언이라면, 다음의 정의는 이하와 같은 의미로 이용한다.
1) Word(s)란, 선언의 항목「단어」를 의미한다.
2) Definition(s)란, 선언의 항목「정의」를 의미한다.
3) Condition(s)란, 선언의 항목「조건」을 의미한다.
4) IO(s)이란, 선언의 항목「I0」을 의미한다.
5) Type(s)이란, 선언의 항목 「타입」을 의미한다.
6) Security(s)란, 선언의 항목 「시큐러티」를 의미한다.
② Lyee 프로그램의 코드 생성
Sw를, 단어 w를 정의하는 선언으로 한다. 전통적인 프로그램 언어에서는, 표 1에서 주어지는 요건은, 표 3에서 주어지고 있는 코드에 대응한다. Lyee 방법론중에서는, 사용자는 이들 정의가 실행되는 순서(제어 논리)를 지정할 필요는 없다. 표 1에서는, 단어 a가 단어 b를 사용하여 정의되고 있다고 하는 사실에도 불구하고, 선언 Sb가 선언 Sa의 뒤에 주어지고 있다. Lyee 방법론에 있어서는, 소프트웨어의 논리 부분인 제어 논리가 자동적으로 생성되는 결과, 프로그래밍 에러와 프로그램 시간이 극적으로 단축된다.
(표 3)
표 1의 요건으로부터, 우리는 a와 b의 값을 계산하는 프로그램을 자동적으로 생성하여, 그들을 출력할 수 있다. 여기서 도 1은, 요건이 실행에 반영되는 모습을 코드열로서 표현한 개념도이다. 동 도면에 나타낸 바와 같이, 프로그램은, 어느 일정한 포인트에 도달할 때까지, 이들 지시를 단순하게 반복하는 것인, 즉, 어떠한 반복에 의해서, 도 1에 나타나는 어떠한 단어의 값도 변화하지 않는다.
게다가, 표 3에서 주어지고 있는 선언에 관련지을 수 있는 코드에 관한 순서를 바꾸어도, 프로그램의 의미가 결코 변화하지 않는, 즉, 언제나 정확한 값을 단어에 관련짓는다.
이어서, Lyee에 의해서 요건으로부터 자동적으로 생성되는 프로그램의 구조와 내용에 관해서 보다 상세하게 설명한다. Lyee방법론중에서는, 1세트의 선언의 실행(표 1에서 주어지고 있는 것)은 독특한 방법으로 실행된다. Lyee는 선언에 관련지을 수 있는 코드를, 도 2에 나타나는, Lyee용어로 팔레트(W02, W03, 및 W04)로 불리는 3개의 영역상에 분배한다.
동 도면에 나타낸 바와 같이, W02 팔레트는 입력 단어를 취급한다, 그리고, W03 팔레트는 단어의 계산 조건을 산출하고, 그 결과는 몇가지의 변수(값으로서 부울치를 취한다) 내에 격납된다. 예를 들면, 단어 a의 정의중에서 사용된 「b*e>2」라고 하는 조건은 W03 팔레트으로 계산되어 참/거짓이라고 하는 그 결과는「a_cond」와 같은 다른 변수로 격납된다. 최종적으로, W04 팔레트는, 요건중에서 주어지고 있는 정의에 따라서 단어를 계산한다. 또한, 그것은 계산된 단어의 값을 출력한다.
Lyee에서는, W04 팔레트로부터 스타트하고, 일정 포인트에 이를 때까지, 모든 정의된 단어에 대해 그 값을 계산하고자 한다. W04에서는, 단어의 값에 대하여 더 이상의 진전이 없다고 하게 되면, 제어는 W02 팔레트로 옮겨간다. 자신의 차례가 도래하면, 이 2번째의 팔레트는, 일정 포인트(새롭게 들어갈 수 있는 입력을 얻을 수 없는 상태)에 도달할 때까지 빠진 단어를 입력하려고 반복하고, 이어서 제어를 W03 팔레트로 옮긴다. 최종적으로, W04 팔레트의 경우와 마찬가지로, 요건에 따라서, 일정 포인트에 도달할 때까지, W03 팔레트는 단어의 계산조건을 산출하고자 한다.
도 3에 나타낸 바와 같이, 전체의 안정 상태에 도달할 때까지 이 전체의 과정(W04→W02→W03)은 반복되고, 이 단위는 기본 구조(Scenario Function 시나리오 함수)로 불린다. 도 1에 나타난 프로그램의 실행의 결과가, 도 2에 나타낸 프로그램의 실행 결과와 같아지는 것은 용이하게 고찰할 수 있다.
또한 Lyee는, 생성되어야 할 코드의 구조를 요건 내용과는 관계없이 일정하게 하는 고정 구조를 가진 간결한 기준 프로그램(Lyee 용어로 「기저 논리(Predicate Vector)」로 불린다)을 확립하였다. 전체를 포괄하는 글로벌·프로그램(global program)은 술부 벡터 (predicate vector)를 단순히 호출하는 것이다. 도 4는 이러한 술부 벡터의 구조를 나타내는 도면이다.
동 도면에 나타낸 바와 같이, 술부 벡터의 목적으로 하는 바는, 팔레트에 의해서 변한다. 예를 들면, W04 팔레트에서 최초의 목적은 그 계산정의에 따라서, 단어에 값을 부여하는 것이다. 예를 들면 도 2에 나타나는 예에 관해서는, 단어 a와 단어 b의 계산에 관련지을 수 있는 술부 벡터는 도 5에 나타내는 바와 같다. 한편, 도 4 및 5의 각 스텝에 대한 상세한 설명은 상기 특허문헌 1 내지 6의 해당 개소에 의한 것으로 하고, 여기에서는 생략한다.
해당 단어의 계산에 관해서 더 이상의 진전이 없게 되면, Lyee에 의해서 생성된 코드는, 다음의 목적인 단어의 출력을 시도한다. 값의 출력을 목적으로 하는 술부 벡터는 출력 벡터(output vector)로 불린다. W02 팔레트에서는, 입력 단어에 값을 관련짓는 것을 목적으로 하는 2개의 술부 벡터가 있다. 설명을 간결하게 하기 위해서, 입력, 출력, 및 메모리의 초기화를 취급하는 술부 벡터에 대해서는 다른 상세한 설명중에서는 생략한다. 최종적으로, W03 팔레트에서는, 술부 벡터의 목적은 도 6에 나타낸 바와 같이, 요건 중에서 지정된 전제 조건을 판정하는 것이다. 여기서는, 동 도면의 각 스텝에 대한 상세한 설명은 상기 특허문헌 1 내지 6의 해당 부분에 따른 것으로 하고, 생략한다.
최종적으로, 표 1에서 주어지고 있는 요건에 관련지을 수 있는 Lyee프로그램은 표 3에 나타나게 된다.
③ 처리경로도
전(前) 섹션에서 제시된 기본 구조(Scenario Function 시나리오 함수)는, 임의의 요건의 간단한 케이스, 특히, 모든 입력 단어 및 출력 단어가 동일한 화면에 속하고, 데이터 베이스를 사용하지 않는 경우에는, 그 자체로 완전한 프로그램일 수 있다. 그러나, 데이터 베이스, 또는, 서로 연결을 가진 다른 화면에 속하는 단어를 입출력할 필요가 있을 때는, 상황이 조금 복잡해질 수 있다. 설명을 간결하게 하기 위해서, 이하에서는 화면이 다수 있는 경우만을 취급한다. 예를 들면, 도 7에 나타내는 서로 연결된 3개의 화면이 있다고 보고, 사용자는 하나의 화면으로부터 다른 화면으로 천이하여, 이들중 어느 것에 있어서나 사용자는, 복수의 단어를 입력하고, 계산하여, 출력할 수 있는 것으로 가정한다. 따라서 사용자는, 사양서에 있어서, 이들 화면이 어떻게 결합되는지를 알려줄 필요가 있다.
(표 4)
게다가, 모든 화면상에서 정의되는 모든 단어를 계산하기 위해서는, 1개의 기본 구조(시나리오 함수)만을 정의하는 것만으로는 사정이 좋지 않다. 실제로, 화면중에는, 프로그램의 임의의 실행에 있어서는 실행되지 않는 화면이 있을지도 모르고, 그 경우에는, 그들 화면의 단어의 값을 계산하는 것은 시간이 낭비되어 버린다. 이러한 이유로부터, Lyee는, 각 화면을, 그 화면이 실행되는 경우에만 실행되는 담당 기본 구조와 관련짓고 있다. 화면에 관련지을 수 있는 기본 구조는 서로 접속되어, 언제 화면의 하나로부터 다른 화면으로까지 옮기는지를 나타낸다. Lyee 용어로 말하면, 서로 접속된 다수의 기본 구조가 모여 도 8에 나타낸 바와 같은 처리경로도(process route diagrams)를 만든다.
정리하면, Lyee 방법론에서는, 프로그램은 통상 많은 처리경로도를 포함하고 있다. 그들 처리경로도는, 각각이 1세트의 내부 연결된 기본 구조군이며, 그리고, 각각의 기본 구조는 내부 연결된 3개의 팔레트, W02 팔레트, W03팔레트, 및 W04 팔레트를 포함하고 있다.
④ Lyee 방법론의 개선점
Lyee 방법론의 간결함과, Lyee 방법론이 소프트웨어 개발 사이클의 모든 스텝에 부여하는 몇가지 긍정적인 영향에도 불구하고, Lyee 방법론은, 생성된 코드의 용량에 관해서 중요한 개선점이 있다. 실제로, 요건중에서 주어진 각 단어의 각각 대해서 Lyee는, 몇가지 메모리 영역을 할당한다. 메모리로서 소비된 정확한 용량의 상세한 내용에 대해서는, 상기의 비특허문헌 6 및 7을 참조하기 바란다.
이후에, 정적분석의 테크닉에 의해서, 얼마나 Lyee프로그램을, 보다 빠르게 움직여, 또한 메모리스페이스 소비가 보다 적은 등에 의해 우수한 품질을 가진 프로그램에 개선하는지를 나타낸다.
[발명의 최선의 실시형태]
이하, 도면을 참조하여 Lyee 요건에 관한 정적분석에 관한 본 발명의 실시형태를 설명한다.
소프트웨어의 정적분석(비특허문헌 1 및 4 참조)은, 프로그램의 코드에 대한 검증을 실제로 프로그램을 실행시키지 않고 행하는 것을 일반적으로 의미한다. 경험이 나타내는 바에 따르면, 정적분석의 테크닉에 의해서 사양서와 코드중의 많은 질적 속성을 제어하여, 개량할 수 있다. 특히, 정적 분석의 테크닉에 의하면, 보다 빠르게 움직여, 메모리 스페이스의 소비가 보다 적은 프로그램을 만들 수 있고, 프로그램의 버그를 발견할 수도 있다. 정적 분석을 요건에 대하여 적용하면, 코드생성전에 논리적 오류와 결함부분을 찾아내는 것이 가능하고, 그 결과 사용자는 개발 및 테스트를 위한 귀중한 시간을 절약할 수 있게 된다.
본 명세서에서는 Lyee 요건과 그 생성 코드열의 품질을 개량할 수 있는 몇가지 정적 분석의 테크닉을 나타낸다.
일반적으로, 프로그램의 최적화란, 일련의 변경을 가함으로써, 코드열의 사이즈, 그 실행시간, 소비 메모리 등을 축소하는 것이다. 소요의 코드열의 최적화가 최대의 목적인 것은 분명하지만, 어떠한 경우에도, 초기 프로그램의 의미론을 변경해서는 안된다.
1. 고전적인 최적화
본 섹션에서는, 몇가지 고전적인 최적화의 테크닉(비특허문헌 3 및 8 참조)과 이들 최적화가 메모리 소비량 및 Lyee프로그램의 실행시간에 대해서 부여하는 큰 효과를 설명한다.
(1-1) 상수 전파 해석(Constant Progagation)
이 간단한 테크닉은 프로그램에 있어서의 상수를 검출하여, 그것들을 사용하는 식에 따라서 그들 상수의 값을 전파시켜, 최종적으로는 이러한 상수를 없애 나가는 것이다. 예를 들면, 표 1의 예에서는, 상수전파전의 요건에 있어서는, 단어 a의 정의에 상수 5가 주어지고 있다. 단어 b의 정의에 있어서는, a+3*5이므로, a=5를 대입하는 것으로 상수 전파를 실시하면, 단어 b의 정의는 상수 20이 된다. 단어 d의 정의는 e+b*a이므로, a=5, b=20을 대입하여 상수전파하면, 그 정의식은 e+100이 된다. 이러한 상수전파의 결과, 초기 요건은, 표 5의 「상수전파 해석후」와 같아진다. 정의가 상수인 선언은, 값을 생성할 필요가 없기 때문에, 요건으로부터 제외되고 있다.
(표 5)
(1-2) 패턴검출
패턴은 프로그램중에서 몇번이나 반복되는 준(準)식이다. 이것은, 각각의 준식이 몇번이나 계산되는 것을 의미한다. 따라서, 패턴이 요건에 존재하고 있다면, 일반적으로, 이 패턴의 각각을, 준식이 1회만 계산되는 일시적인 변수로 바꿔 놓는 것에 의해서, 그들 관련코드의 실행 시간을 감소시킬 수 있다. 표 6은 준식 「b*c」가 패턴인 예를 보여준다.
(표 6)
그런데, 이들 간단하고 고전적인 최적화의 테크닉의 사용이 Lyee에 의해서 생성되는 코드의 메모리 스페이스와 실행시간을 어떻게 개량할 수 있을지에 대하여 설명한다. 이들 최적화의 테크닉이 거의 모든 이용 가능한 컴파일러로 주어지는 것은, 잘 알려져 있는 사실이다. 게다가, Lyee가 일반적으로 COBOL 등의 고레벨 프로그래밍언어에 의해서 코드를 생성하므로, 사람에 따라서는, Lyee의 고레벨의 코드가 일단 생성되면, 저레벨의 코드를 작성하는데 사용되는 컴파일러가 이들 최적화를 하는 것일까하고 결론을 내릴지도 모른다. 그러나, 이 문제를 깊게 연구하면, 이 결론이 완전하게 참이라고는 할 수 없음이 나타난다. 실제, Lyee가 코드 생성에 이용하는 방법은, 이들 고전적인 최적화를 탐색할 때의 컴파일러의 작업을 복잡하게 할지도 모른다.
그것을 확인하기 위해서, 우리는 C언어를 이용하여, 간단한 요건을 실행하는 2개의 프로그램을 썼다. 우리는 이들 1개에 Lyee All(등록상표) 툴로 생성한 것과 같은 구조를, 2번째의 것에 통상의 구조를 각각 부여하였다. 2개의 프로그램에 대해서, 컴파일러에 의해서 이러한 최적화 편집을 행한 후에, 우리는, Lyee구조를 가진 프로그램에 있어서는 컴파일러가 상수전파 테크닉을 적용할 수 없었던 한편, 2번째의 프로그램중에서는 이 최적화가 순조롭게 이루어진 것을 발견하였다. 즉, 일단 요건이 사용자에 따라서 주어지면, Lyee 방법론중에서는 코드생성전에 이들 최적화의 테크닉을 사용하는 것이 보다 유익하고 보다 간단하다고, 우리는 결론을 내렸다.
2. Lyee 요건 정적분석에 있어서의 기본해석
이 섹션에서는, 본 명세서에서 분명히 하는 정적분석 테크닉의 대부분의 설명을 단순화하는데 매우 유익한 몇가지 기본적 해석을 정의한다.
(2-1) Def/Use해석
(2-1-1) Def/Use 해석의 비형식적 정의
임의의 Lyee 요건에 있어서의 각 선언 s는, 새로운 단어를 정의하기 위해서, 정의식, 혹은 조건식 중에서 몇가지 단어를 사용한다. 정의식 혹은 조건식에서 사용되는 단어의 집합을 Use(s)라고 부르며, 새롭게 정의된 단어를 Def(s)라고 부른다.
표 7은 Def/Use 개념의 구체적인 예이다.
(표 7)
Def/Use의 개념의 구체적인 예
(2-1-2) Def/Use의 형식적 정의
s가 선언(wrd, Def, Cond, io, type, SecType )이라고 한다. Def(s)에 의해서 표시되는 선언 s의 Def는, 단순히 wrd이다. 그리고, Use(s)로 표시되는 선언 s의 Use는, 다음과 같이 정의된다.
상기의 정의는 다음과 같은 의미이다.
1) 선언의 Use
Use(s)=Use(Def)∪Use(Cond) : 선언 S의 정의 및 조건으로 사용되는 단어(Use(s))는, 그 정의의 정의와 조건으로 사용되는 단어(Use(Def)), 및, 그 조건의 정의와 조건으로 사용되는 단어(Use(Cond))의 합집합이다. 정의와 조건은 양쪽 모두가 식이므로, 즉 임의의 선언의 Use의 정의를 완료하려면, 식의 Use를 정의하는 것만으로 된다. 그 때문에, 식의 각 종류에 대해서, 그 Use를 명확하게 해야 한다.
2) 식의 Use
·Use(val) = 0 :
식이 값(val)이라면, 그 Use는 공란이다. 즉, 정의 및 조건으로 사용되고
있는 단어는 없다.
·Use(Id) = {Id}:
식이 식별자(Id)라면, 그 Use는 식별자 그 자신이다.
·Use(Op Exp) = Use(Exp) :
식이 「Op Exp」(식(Exp)을 후에 수반하는 단항 연산자(Op))의 형식이라
면, 그 Use는 식(Exp)에 동일하다.
·Use(Exp1 Op Exp2) = Use(Exp1) ∪ Use(Exp2) :
식이 「Exp1 Op Exp2」라면, 그 Use는 식 1(Exp1)의 Use와 식 2 (Exp2)의
Use의 합집합이다.
(2-2) 직접 및 간접 Use
전항에서 설명한 바와 같이, 요건의 각 선언 s는, 단어의 집합 Use(s)에 의해서 정의된 바와 같은, 몇가지 단어를 사용하는 경우가 있다. 이 단어의 집합을 선언 s의 직접 Use라고 부른다. 실제, Use(s)에 속하는 각 단어는, 그 정의식 혹은 조건식의 선언 S로 직접 사용되고 있기 때문이다.
직접 Use의 단어 이외에, 선언 s는 다른 단어를 간접적으로 사용하는 경우도 있다.
예를 들면, 만약 선언 S가 단어 「a」를 직접 사용하고, 그리고 단어 「a」를 정의하는 선언이 단어 「b」를 사용한다면, 그 때, 선언 s는 단어 b를 간접적으로 사용하고 있다고 할 수 있다. 또한, 만약 단어 b를 정의하고 있는 선언이 단어 c를 사용한다면, 마찬가지로 선언 s는 단어 c를 간접적으로 사용한다고 할 수 있다.
간접 Use의 개념을 명확하게 하기 위한 구체적인 예를 표 8에 나타낸다.
(표 8)
간접 Use의 개념의 구체예
표 8의 예에 있어서, 단어 e는 입력 단어이므로, 그 Use (직접 Use. 이하, 직접 Use는 간단히 「Use」라고 기재한다)는 공란이고, 따라서 간접 Use도 공란이다. 단어 I는, 그 Use인 단어 e가 입력 단어로서 그 정의 및 조건이 공란이므로, 간접 Use는 공란이다. 단어 b는, 그 Use인 단어 i의 Use가 단어이므로, 간접 Use는 단어 e이다. 단어 c는, 그 Use인 단어 b의 Use가 단어 i 및 그 간접 Use가 단어 e이므로, 단어 c의 간접 Use는, 단어 e 및 단어 I이다. 단어 a는, 그 Use인 단어 b의 Use가 단어 i 그리고 간접 Use가 단어 e, 그리고 또 하나의 Use인 단어 c의 Use가 단어 b 그리고 간접 Use가 단어 e와 단어 i이므로, 따라서 단어 a의 간접 Use는, 단어 e 및 단어 i이다(단어 b는 직접 Use이므로, 간접 Use에는 가하지 않는다).
아래와 같은 함수 UseDirectAndIndirect(s, S)의 알고리즘에 의해서, 임의의 Lyee 요건 s(선언의 집합) 중의 임의의 하나의 선언 s의 Use와 간접 Use의 양쪽 모두를 취득할 수 있다.
상기의 함수 UseDirectAndlndirect(s, S)의 알고리즘의 의미는 이하와 같다.
s는 선언, S는 요건인 선언의 집합이다. 변수 W_Old와 변수 W_New는 단어의 집합이다.
<개시>
변수 W_Old에, Use(s)[선언 s의 직접 Use인 단어(군)]를 기록
변수 W_Old에, 변수 W_Old의 값을 기록한다
변수 Fix_Point에, 값 False를 기록한다
<While문 개시>변수 Fix_Point의 값이 False인 동안에는 하기를 실행한다
<For문 개시>모든 단어 a에 대해서, 요건 S에 속하는 선언 s의 Use 인
경우 이하를 실행한다.
변수 W_New에, 변수 W_New에 기록된 단어(군), 및 요건 S에 속하는 단
어 a의 선언의 Use인 단어(군)를 기록한다.
<For문 종료>
<If문 개시> 만약, 변수 W_New의 값이 변수 W_Old의 값과 동일하면,
변수 Fix_Point에 값 True를 기록한다.
그렇지 않으면, 변수 W_Old에 변수 W_New의 값을 기록한다.
<If문 종료>
<While문 종료>
<종료>
상기 알고리즘에서, 함수 Statement(a, S)는, Lyee 요건 S중의 단어 a를 정의하는 선언을 되돌리는 함수이다. 즉, Def(sa)={a}(단어 a의 선언 sa의 Def는 단어 a인것을 나타낸다)인 선언 sa∈S (요건 S에 포함되는 단어 a의 선언 sa)를 되돌린다.
상기 함수 UseDirectAndIndirect(s,S)의 알고리즘을 플로우차트에 나타내면 도 9와 같아진다. 도 9의 처리 스텝을 순서대로 설명하면, 다음과 같다. 변수 W_Old의 영역에 Use(s)[선언 S의 직접 Use인 단어(군)]의 결과를 기록하고(스텝 101), 변수 W_New의 영역에 W_Old의 값을 복사(스텝 102)한다. 다음에 영역 Fix_Point에「거짓(false)」를 기록한다(스텝 103).
스텝 104의 조건 판정에 의해, Fix_Point의 값이 거짓이면 스텝 105로 진행된다.
스텝 105에서, 「Use(s)의 결과와 Word(S)의 결과의 합[선언 s의 Use와 요건 S의 전체선언의 단어]인 단어의 집합중에, 스텝 106의 처리가 미실행의 단어 a가 있는지의 여부」의 판정에 있어서, 결과가 참이면 스텝 106으로 진행된다. 스텝 106에서는, 변수 W_New의 영역에, 변수 W_New의 값과 Use(Statement(a, S))[단어 a의 선언의 Use]의 값을 기록한다.
스텝 106이 종료한 후, 스텝 105로 되돌아와 다시 판정을 실행한다. 스텝 105의 판정 결과가 참인 한, 스텝 105로부터 스텝 106의 제 1 재기처리(111)를 반복한다.
스텝 105의 판정에 있어서, 결과가 거짓이 되었을 때, 즉, Use(s)의 결과와 Word(S)의 결과의 합[선언 s의 Use와 요건 S의 전체선언의 단어]인 단어의 집합중에, 아직 실행되어 있지 않은 단어 a가 없어졌을 때, 스텝 107로 진행된다. 스텝 107에서, 「변수 W_New의 값이 변수 W_Old에 동일한지의 여부」의 판정에 있어서, 결과가 거짓인 경우는 스텝 108으로 진행되어 변수 W_Old의 영역에 변수 W_New의 값을 복사하여, 결과가 참인 경우는 스텝 109로 진행되어 영역 Fix_Point에 참을 기록한다. 스텝 108또는 스텝 109 종료후, 스텝 104로 되돌아와 다시 판정을 행한다. 스텝 104의 판정 결과가 참인 한, 스텝 104로부터 스텝 109의 제 2 재기처리(112)를 반복한다.
Fix_Point의 값이 참이 되어 스텝 104의 판정 결과가 거짓이 되었을 때, 스텝 104로부터 스텝 110로 진행되어, 함수 UseDirectAndlndirect(s, S)의 결과로서, 변수 W_New의 값을 되돌려준다.
3. 요건 디버그
(3-1) 비활성선언(Dead Statements)
어느 선언이 결코 실행되지 않는다면, 그 선언은 죽어있다고 생각할 수 있다. 죽어있는 선언은 많은 원인에 의해서 일어날 수 있다. 알려져 있는 원인이 많은 하나는, 선언중의 호환없는 전제 조건의 존재이다. 실제, 주어진 선언에 관련지을 수 있는 전제 조건이 언제나 잘못되어 있다면 이 선언은 의미를 가질 수 없고, 결과적으로, 거기에 관련지을 수 있는 술부 벡터(precIdate vectors)는 완전하게 실행되는 경우는 결코 없다. 이것은, 일반적으로 사양의 오류에 유래하므로, 이것은 사용자에게 전달되어야만 한다. 이러한 종류의 죽어 있는 코드를 검출하기 위해서는, 선언에 관련지을 수 있는 전제 조건을 분석하는 것만으로도 된다. 주어진 선언에 관련지을 수 있었던 전제 조건이 항상 거짓이라고 정적으로 증명하는 것이 가능하면(평가를 하는 데에 있어서 전제 조건에 이용되고 있는 모든 단어의 값을 얻을 필요는 반드시 없는 것을 주의하기 바란다. 즉, 조건「Ф∧┑Ф」가, Ф의 값에 관계없이 항상 거짓이라면, 이 선언은 죽어있는 것이다. 또한 말하자면, 죽은 선언을 이용하고 있는 다른 선언은 모두, 결국은 죽어있다. 보다 형식적으로 표시한다면, 만약 선언 s가 죽어있다면, s's 이도록 하는 s'도 또한 죽어 있다고 하게 된다. (는, 좌변의 선언의 단어가 우변의 선언의 Use에 포함되어 있는 것을 표시한다.)
(3-2) 순환 선언(Cyclic Statements)
(3-2-1) 순환 선언의 비형식적 정의
임의의 선언의 단어의 직접 혹은 간접적 정의가, 그 단어 자신을 포함하고 있는 경우, 라고 하는 선언은 순환(cyclic)이다고 한다. 바꾸어 말하면, 임의의 단어 「a」의 정의에 단어 「a」가 필요하게 되어 있는 경우이다. 이하에, 몇가지 구체적인 예를 나타낸다.
표 9는, 단어 「a」가 그 자신을 사용하여 정의되어 있으며, 직접 순환의 예이다.
(표 9)
순환선언: 단어a
다음에 간접순환의 예를 나타낸다. 표 10에서는, 단어 「a」의 정의는 다른 단어 이외에 단어 「b」의 정의를 필요로 하고 있다. 그러나, 단어 「b」의 정의도 단어 「a」의 정의를 필요로 하고 있다. 따라서, 단어 「a」와 단어 「b」 는 간접순환에 빠진다.
(표 10)
순환선언: 단어a, 단어b
(3-2-2) 순환 선언의 형식적 정의
이하에, 순환 선언의 형식적 정의를 나타낸다. S를 선언의 집합으로 하면, 하기의 조건에 합치할 때, 선언 s ∈ S (요건 S에 속하는 선언 s)는 순환한다.
즉, Def(s)∈ UsedirectAndlndirect(s, S)는, 「선언 s의 Def가, 요건 S에 속하는 선언 s의 직접 및 간접 Use에 포함되는」것을 형식적으로 나타내고 있다.
하기의 함수 CyclicStatements(S)의 알고리즘에 의해서, 임의의 Lyee 요건 S중의 순환 선언을 검출할 수 있다.
상기의 함수 CyclicStatements(S)의 알고리즘의 의미는 이하와 같다.
S는 요건인 선언의 집합이다. 변수 CyclicSet는 선언의 집합이다.
<개시>
변수 CyclicSet에 「0」을 기록한다.
<For문 개시> 선언의 집합 S에 속하는 모든 선언 s에 대해서, 이하를 실행한다.
<If문 개시>만약, Def(s)[선언 S의 단어]가, UseDirectAndIndirect(s)[선
언 s의 직접 및 간접 Use]에 포함된다면,
변수 CyclicSet에, 변수 CyclicSet의 값과{s}[선언 s]를 기록한다.
<If문 종료>
<For문 종료>
변수 CyclicSet의 값을 되돌린다.
<종료>
도 10은, 이 함수 CyclicStatements(S)의 알고리즘을 플로우챠트에 나타낸 것이다. 도 10의 처리 스텝을 순서대로 설명하면, 다음과 같다. 먼저, 변수 Cyclicset의 영역에 「0」을 기록하고(스텝 201), 「선언의 집합 S중에 스텝 202의 처리가 미실행된 선언 s가 있는지의 여부」를 판정한다(스텝 202). 판정이 참인 경우는, 「Def(s)[선언 s의 단어]가 UseDirectAndlndirect(s)[선언 s의 직접 및 간접 Use]에 속하는지의 여부」를 판정하고(스텝 203), 판정이 참인 경우는, 변수 CyclicSet의 영역에 CyclicSet의 값과 선언 s를 기록하고(스텝 204), 스텝 202의 판정으로 되돌아온다. 스텝 203의 판정이 거짓인 경우는, 직접 스텝 202의 판정으로 되돌아와 다시 실행한다. 스텝 202의 판정이 참인 한, 스텝 202로부터 204의 재기처리(206)를 반복한다.
스텝 202의 판정 결과가 거짓이 되었을 때, 스텝 205로 진행되어, 함수 CyclicStatement의 결과로서, 변수 CyclisSet의 값(선언의 집합)을 되돌린다.
순환 선언의 검증은, 선언뒤에 이루어져야 할 최초의 정적 분석이 아니면 안된다는 점은 중요하다. 따라서, 본 명세서에서 이 이후에 설명하는 정적 분석은, 분석 결과에 순환이 없다는 것을 전제한다.
(3-3) 불완전 선언(Incomplete Statements)
(3-3-1) 불완전 선언의 비형식적 정의
선언 s의 집합(Lyee 요건)은, 만약 그것이, S중에서 직접적 혹은 간접적으로 정의되어 있지 않은 단어를 하나 이상 사용한 선언 s를, 적어도 하나 포함한다면, 불완전하다고 할 수 있다. 상기 정의는, 「모든 사용되는 단어는 정의되지 않으면 안된다」고 하는 원칙을 파악하고 있다.
표 11은 불완전 선언의 구체적인 예이다. 여기서, 단어 「a」는 단어 「i」 를 사용하고 있지만, 단어 i는 아직 정의되어 있지 않다.
불완전선언
(표 11)
불완전 선언의 개념의 설명을 용이하게 하기 위해서, 최초로 다음의 표기법을 도입한다. Defined(S) :
임의의 선언의 집합 S(요건 S)가 있었을 때, 함수 Defined(S)는 S 중에서 정의가 완료된 단어의 집합을 되돌려준다. 보다 형식적으로는 하기와 같은 표기가 된다.
상기는, 함수 Defined(S)는, 「요건 S에 속하는 모든 선언 s의 Def의 결과인 단어의 전체 집합」인 것을 표시한다. 다만, 정의가 완료된 상태일 때에는, 해당 단어의 선언이 존재하는 것으로서, 선언의 모든 항목의 필요 정보가 만족하고 있다고는 할 수 없다. 예를 들어, 출력 단어임에도 불구하고, 정의식이나 조건식이 미정의인 경우도 있다. 그러한 선언은, Use(s)={ }가 된다. 불완전 선언에는, 정의가 완료된 상태라 하더라도 정의식 및 조건식이 미정의의 입력이 아닌 단어의 선언도 포함된다.
아래와 같은 도면을 이용하여 불완전 선언의 정의를 설명한다.
X는, 요건 S의 모든 선언 s의 직접 및 간접 Use인 단어의 집합이다. Y는, 요건 S중에서 정의가 완료된 단어의 집합이다. Z는 X와 Y의 교집합, 즉, 요건 S의 몇가지 선언에서 사용되고 있으며, 또한, 정의가 완료된 상태인 단어의 집합이다. W는, 요건 S의 선언에서 사용되고 있는 단어 가운데, 요건 S로 미정의된 단어의 집합이다. Q는, 「요건 S의 몇가지 선언에서 사용되고 있으며, 정의가 완료된 상태인 단어의 집합인」 Z 중에서, 선언의 정의식 및 조건식이 미정의된 입력이 아닌 단어이다.
따라서, 불완전 선언은, 「요건 S의 선언에서 사용되고 있는 단어 가운데, 요건 S로 미정의된 단어의 집합 」W의 선언과, 「요건 S의 몇가지 선언으로 사용되고 있으며, 또한, 정의가 완료된 상태인 단어의 집합 」 Z중 정의식 및 조건식이 미정의된 입력이 아닌 단어의 집합 Q의 선언의 합이다.
도 11은, 불완전 선언을 추출하기 위한 처리를 플로우챠트로 표시한 것이다. 먼저, 변수 IncompleteSet, 변수 X, 변수 q의 각각 값「0」을 기록(스텝 301). 다음에, 스텝 302에서 「요건 S 중에 스텝 303의 처리를 미실행의 선언 s가 있는지의 여부」를 판정한다. 판정 결과가 참이면, 스텝 303로 진행되어, 변수 X에 변수 X의 값과 UseDirectAndeIndirect(s, S)의 값을 기록한다. 스텝 303이 종료한 후, 스텝 302로 되돌아와 다시 실행한다. 스텝 302의 판정이 참인 한, 스텝 302로부터 스텝 303의 제 1 재기 처리(311)를 반복한다.
스텝 302의 판정 결과가 거짓이 되었을 때, 스텝 304로 진행되어, 변수 Y에 함수 Definded(S)[요건 S의 정의가 완료된 단어의 집합을 되돌려준다] 결과를 기록하고, 변수 Z에 X∩Y [요건 S의 선언에서 사용되고 있는 단어이며, 또한, 요건 S로 정의가 완료된 상태인 단어의 집합]을 기록하며, 변수 W에 X-Z [요건 S의 선언에서 사용되고 있는 단어의 집합으로부터 Z의 단어의 집합을 제외한 것. 즉, 요건 S의 선언에서 사용되고 있는 단어이지만, 요건 S로 미정의된 단어의 집합]을 기록한다.
이어서, 스텝 305에서 「요건 S중에 스텝 306의 처리를 미실행의 단어 a가 있는지의 여부」를 판정한다. 판정결과가 참이면, 스텝 306에서「IO(Statement(a, S))≠IS or IF[단어 a는 입력이 아님], 또한, Use(Statement(a,S))={ }[단어 a의 선언의 직접 Use가 빈, 즉, 단어 a의 정의식 및 조건식이 미정의]인지의 여부」를 판정한다. 판정결과가 참이면, 스텝 307으로 변수 q에 변수 q의 값과 단어 a를 기록하고, 스텝 305로 돌아와 다시 실행한다. 스텝 305의 판정이 참인 한, 스텝 305로부터 스텝 307의 제 2 재기 처리(310)를 반복한다.
스텝 305의 판정이 거짓이 되었을 때, 스텝 308로 진행되고, 변수 Q에 Z∩q[요건 S의 선언에서 사용되고 있으며 또한 정의가 완료된 단어이며(=Z), 또한, 정의식 및 조건식이 미정의된 입력이 아닌 단어(=q)]의 값을 기록하고, 변수 ImcompleteSet에 W∪Q[요건 S의 선언에서 사용되고 있지만 미정의된 단어(=W)와, 상기 Q의 단어]의 단어 모든 선언을 기록한다. 마지막으로, 요건 S중의 불완전 선언으로서 변수 IncompleteSet 의 값을 되돌려주어(스텝 309), 처리를 종료한다.
(3-4) 불요 선언(Superfluous Statements)
(3-4-1) 불요 선언의 비형식적 정의
임의의 Lyee 요건 S중의 선언 s가, 만약 S의 어떤 출력 단어의 정의에도 직접 또는 간접에 공헌하지 않는다면, 그 선언 s는 불필요하다고 생각할 수 있다. 이 정의는, 「각 정의가 완료된 단어는 사용되지 않으면 안된다」고 하는 원칙을 파악하고 있다. 「사용」이란 「출력 단어의 정의에 직접적 또는 간접적으로 공헌한」것을 의미한다. 불요의 정의와 불완전의 정의를 합하면 다음의 원칙을 파악하고 있다: 정의한 것은 모두 사용되지 않으면 안되고, 사용하는 것은 모두 정의되지 않으면 안된다.
표 12는 불요 선언의 구체적인 예이다. 여기서, 단어 j는 어떤 출력 단어의 정의에도 직접적 혹은 간접적으로 공헌하지 않는다. 따라서, 단어 j는 프로그램의 실행에 부정적 효과를 가져오지 않고 요건으로부터 없앨 수 있다.
(표 12)
불요선언
불요 선언의 개념을 형식적으로 정의하기 위해서, 다음의 개념을 도입한다.
OutputStatements (S) :
임의의 선의 집합 S가 있을 때, 함수 OutputStatements(S)는, S중에서, OS 혹은 OF를 입력/출력 속성으로서 가진 선언을 되돌려준다. 형식적 표기에서는 이하와 같이 정의된다.
상기의 형식적 표현은, 함수 OutputStatements(S)의 결과는, 「선언의 집합 S에 속하는 선언 s으로서, 그 선언 s는, 그 IO(입출력 속성) 항목의 값이 OS(화면에의 출력) 또는 OF(파일에의 출력)인 선언」인 것을 의미하고 있다.
하기의 함수 OutputStatements(S)의 알고리즘에 의해서, 임의의 Lyee 요건 S중에서, 입력/출력 속성이 출력(OS 또는 OF)인 선언 OutputStatements를 도출할 수 있다.
상기의 함수 OutputStatements(S)의 알고리즘의 의미는 이하와 같다.
S는 요건인 선언의 집합이다. 변수 OutputSet는 선언의 집합이다.
<개시>
변수 OutpuSet의 영역에 「0」을 기록한다.
<For문 개시>선언의 집합 S에 속하는 모든 선언 s에 대해서, 이하의 처리
를 실시한다.
<If문 개시>만약, 선언 s의 IO[입출력 속성]이, OS[화면에의 출력]
또는 OF[파일에의 출력]인 경우는,
변수 OutputSet의 영역에, 변수 OutpuSet의 값과 선언 s를 기록한다.
<If문 종료>
<For문 종료>
함수 OutputStatements(S)의 결과로서, OutputSet의 값(선언의 집합)을
되돌려준다.
이상의 정의에 의해서, 다음의 섹션에 나타낸 바와 같은 불요 선언의 형식적 정의가 용이해진다.
도 12는, 이 함수 OutputStatements(S)의 알고리즘을 플로우챠트에 나타낸 것이다. 도 12의 처리를 설명하면 이하와 같아진다. 먼저, 변수 OutputSet의 영역에 「0」을 기록한다(스텝 401). 다음에, 스텝 402에서 「선언의 집합 S중에, 스텝 403의 처리가 미실행된 선언 s가 있는지의 여부」를 판정한다. 스텝 402의 판정 결과가 참인 경우, 스텝 403으로 진행되어, 「선언 s의 IO[입출력 속성]이 OS[화면에의 출력], 또는, OF[파일에의 출력]인지의 여부」를 판정한다. 스텝 403의 판정 결과가 참인 경우에는, 변수 OutputSet의 영역에 변수 OutputSet의 값과 선언 s를 기록하고, 스텝 402로 되돌아온다. 스텝 403의 판정 결과가 거짓인 경우는, 직접 스텝 402로 되돌아와 다시 실행한다. 스텝 402의 판정 결과가 참인 한, 스텝 402로부터 404의 재기 처리(406)를 반복한다.
스텝 402의 결과가 거짓이 되면, 함수 OutputStatement의 결과로서, OutputSet의 값(선언의 집합)을 되돌려준다.
(3-4-2) 불요 선언의 형식적 정의
불요 선언의 형식적 정의에 대하여 설명한다. S를 선언의 집합이라고 하면, s중의 불요 선언은, Superfluous Statements(S)에 의해서 나타나고, 형식적으로는 다음과 같이 정의된다.
상기의 형식적 표기는, 함수 Superfluous Statements(S)의 결과는, 「선언의 집합 S로부터, S에 속하는 모든 선언 s의 직접 및 간접 Use에 속하는 모든 단어의 선언의 집합이며, S의 출력 단어의 선언이 되도록 하는 선언의 집합을 제외한 결과인 선언의 집합 」인 것을 의미한다.
아래와 같은 함수 Superfluous Statements(S)의 알고리즘에 의해서, 임의의 Lyee 요건 S중의 불요 선언을 검출할 수 있다.
상기의 함수 Superfluous Statements(S)의 알고리즘의 의미는 이하와 같다.
S요건인 선언의 집합이다. 변수 Superfluous StatSet, 변수 ImportantStatSet, 변수 OutputStatSet는 선언의 집합이다.
<개시>
변수 OutputStatSet의 영역에 함수 OutputStatements(S)[요건 S에 속하는
모든 출력의 선언]의 결과를 기록한다.
변수 ImportantStatset에 「0」을 기록한다.
<For문 개시> OutputStatSet에 속하는 모든 선언 s에 대해 이하의 처리를
실행한다.
<For문 개시> UseDirectAndlndirect(s, S)[요건 S중의 선언 s의 직접 및
간접 Use]에 속하는 모든 단어 a에 대해 이하의 처리를 실행한다.
변수 ImportantStatSet의 영역에, 변수 ImportantStatSet의 값과 단어 a
의 선언을 기록한다.
<For문 종료>
<For문 종료>
변수 SuperfluousSet의 영역에, 요건 S로부터 변수 ImportantStatSet 의
값을 제외하고 선언의 집합을 기록한다.
결과적으로, 변수 SuperfluouSet의 값을 되돌려준다.
<종료>
도 13은, 이 함수 SuperfluousStatements(S)의 알고리즘을 플로우챠트에 나타낸 것이다. 도 13의 처리를 설명하면 이하와 같아진다. 먼저, 변수 OutputStatSet의 영역에 함수 OutputStatements(S)[요건 S에 속하는 모든 출력의 선언]의 결과를 기록하고, 변수 ImportantStatset에 「0」을 기록한다(스텝 501). 다음에, 「변수 OutputStatSet중에 스텝 503을 미실행의 선언 s가 있는지의 여부」를 판정한다(스텝 502). 스텝 502의 결과가 참인 경우는, 스텝 503의 판정 「UseDirectAndlndirect(s, S)[선언 s의 직접 및 간접 Use]에 중에서 스텝 504가 미실행된 단어 a가 있는지의 여부」를 행한다. 스텝 503의 결과가 참인 경우는, 스텝 504로 진행되어, 변수 ImportantStatSet의 영역에, 변수 ImportantStatSet 의 값과 Statement(a,S)[단어 a의 선언]의 결과를 기록한다. 스텝 504가 종료한 후, 스텝 503으로 되돌아와 다시 실행한다. 스텝 503의 판정 결과가 참인 한, 스텝 503에서 504의 제 1 재기처리를 반복한다.
스텝 503의 결과가 거짓이 되었을 때, 스텝 502로 되돌아와 다시 실행한다. 스텝 503의 결과가 거짓인 한, 스텝 502로부터 스텝 504의 제 2 재기처리를 반복한다.
스텝 503의 결과가 거짓이 되었을 때, 스텝 505로 진행되어, 변수 SuperfluousSet의 영역에, 요건 S로부터 변수 ImportantStatSet의 값을 제외한 선언의 집합을 기록하고, 스텝 506에 있어서 함수 Superfouousstatements(S)의 결과로서 변수 SuperfluousSet의 값을 되돌린다.
4.선언열의 최적순서매김
(4-1) 술부 벡터의 순서매김에 의한 최적화
상술한 바와 같이, Lyee 방법론중에서는 사용자가 자신의 요건의 선언을 입력하는 순서는, 그것들에 관련지을 수 있는 프로그램의 의미론(실행의 결과)에 어떤 영향도 주지 않는다. 그리고, 이 사실은 이 방법론의 큰 공헌의 하나이다. 그럼에도 불구하고, 우리가 이들 선언에 관련지을 수 있는 술부 벡터를 작성하는 순서는 생성되는 코드의 효율(실행 시간)에 상당한 영향력을 가지고 있을 가능성이 있다. 구체적인 예로 이 문제에 대해 더욱 더 설명한다. 표 13과 같은 초기 요건이 주어졌을 경우를 가정한다.
(표 13)
또한, 이들 각 선언에 관련지어져 생성된 W04 팔레트의 술부 벡터가 표 14의 (a)에 나타낸 바와 같은 순번이라고 가정한다.
(예를 들면, L4a는, 단어 a의 술부 벡터이다.)
(표 14)
표 14의 (a)의 프로그램이 필요로 하는 실행시간에 대해서 간결하게 설명하면 이하와 같아진다. 초기화 벡터(S4)가 일단 실행된 후, 최초의 반복에서는, 프로그램은 L4a를 실행하여 단어 a에 값을 부여할 수 있도록 시도하지만, 값을 얻는 것에 실패한다. 왜냐하면, 단어 a 의 계산은, 아직 값이 계산되어 있지 않은 단어 b를 필요로 하기 때문이다. 따라서, 이 1번째의 반복에서는, 단어 d를 제외하고, 임의의 단어에 값을 부여하는 시도는 실패한다. 2번째의 반복에서는, 프로그램은 단어 c에 값을 할당하는 것에 성공한다. 3번째의 반복에 있어서는, 단어 b의 값이 계산되어 최종적으로 4번째의 반복에 있어서 단어 a의 값이 산출된다. 요컨대, 이 프로그램은, 모든 단어의 값을 산출하기 위해서 4회의 반복을 필요로 한다.
그러나, 표 7의 (a)의 프로그램을, 표 7의 (b)의 프로그램에 의해서 치환하면, 모든 단어에 값을 부여하는데 필요한 반복의 수는 발본적으로 감소하게 된다. 사실상, 단 1회의 반복만으로, 프로그램은, 모든 지정된 단어에 대해 값을 계산할 수 있다. 이러한 것으로부터, 술부 벡터의 실행순서가 프로그램의 실행 시간에 깊은 효과를 준다고 결론 붙일 수 있다. 결과적으로, Lyee요건으로부터 코드를 생성하는 툴(예를 들어 Lyee All)에 대해서, 실행 시간을 감소시키도록 술부 벡터를 나열하도록 지시하는 것은 유익할 것이다. 다행히, 술부 벡터의 최적 순열은 자동적이고 정적으로 생성할 수 있다. 즉, Lyee요건의 선언열에 대해서, 최적순열에의 바꾸어 나열을 행하는 것이다.
(4-2) 최적 순서매김의 비형식적 정의
이하에, 최적 순서매김된 선언열의 의미를, 비형식적으로 정의한다. 선언열 S는, 만약 각 단어의 정의가 선언열 S중에서 자신의 사용전에 나타난다면, 최적순서라고 할 수 있다. 선언의 조건은, 임의의 단어를 정의하고 있는 선언은, 선언열 S중에서, 그 선언을 사용하고 있는 모든 선언보다 전에 나타나지 않으면 안된다고 하는 것이다.
표 15는 순서매김되어 있지 않은 선언열의 구체적인 예이다.
(표 15)
순서매김되어 있지 않은 선언
한편, 표 16은 순서매김된 후의 선언열이다.
(표 16)
순서매김된 선언
순서매김의 개념을 형식적으로 정의하기 위해서, 다음의 함수의 개념을 도입한다.
1) First
임의의 선언의 순열<s1…, sn>가 있을 때, 함수 First는 이 순열의 최초의 요소인 s1을 되돌린다.
2) AddFirst
임의의 선언의 순열<s1…, sn>과 선언 s0이 있었을 때, 함수 AddFirst는 <s0, s1…, sn>를 되돌리고, 즉, 그것은 최초의 순열의 선두에 s0을 더하는 것이다.
3) Remove
임의의 선언의 순열 S와 선언 s가 있었을 때, 함수 Remove 는 S로부터, s와 동일한 선언을 제거한다(S는 몇번이나 동일한 선언문을 포함하지 않았다고 가정한다).
4) Lower
임의의 2개의 선언 s와 s'가 있었을 때, 만약 Def(s)∈Use(s')라면, Lower(s,s')는 참이다. 아래와 같은 함수 Lower(s, s')의 알고리즘이 이 Lower의 정의를 파악하고 있다.
상기의 함수 Lower(s, s')의 알고리즘의 의미는 이하와 같다.
<개시>
<If문 개시>만약, Def(s)[선언 s의 단어]가 Use(s')[선언의 s'의 Use] 에
속한다면, 참(true)을 되돌려준다
그렇지 않으면, 거짓(false)를 되돌려준다.
<If문 종료>
<종료>
도 14는, 이 함수 Lower(s, s')의 알고리즘을 플로우챠트에 나타낸 것이다. 도 14의 처리를 설명하면 이하와 같다. 먼저, 스텝 601의 판정 「Def(s)[선언 s의 단어]가 Use(s')[선언의 s'의 Use]에 속하는지의 여부」를 행한다. 판정결과가 참인 경우는, 함수의 결과로서 「참 true」을 되돌려준다(스텝 602). 판정 결과가 거짓인 경우는, 함수의 결과로서 「거짓 false」를 되돌려준다(스텝 603).
5) Min
임의의 선언의 순열 s가 있을 때, 함수 Min은, S중의 선언 s로서, Lower(s', s)가 참이 되도록 하는 다른 선언 s'를 S중에 가지지 않는 선언 s를 되돌려준다. 하기의 함수 Min(S)의 알고리즘이 이 정의를 파악하고 있다.
상기의 함수 Min(S)의 알고리즘의 의미는 이하와 같다.
S는 공집합이 아닌 선언열이다. 변수 s는 1개의 선언이다.
<개시>
함수 First(S)[선언열의 선두의 선언을 되돌려준다]의 결과를 변수 s에 기
록한다.
<For문 개시>선언열 S로부터 변수 s의 값(선언)을 제외한 선언열에 속하는
모든 선언 s'에 대하여 이하를 실행한다.
<If문 개시>만약, 함수 Lower(s', s)가 참[선언 s'의 단어는 변수 s의 선
언의 정의에 사용된다]이라면, 변수 s에 선언 s'를 기록한다.
<If문 종료>
<For문 종료>
변수 s의 값을 되돌려준다.
<종료>
도 15는, 이 함수 Min(S)의 알고리즘을 플로우챠트에 나타낸 것이다. 도 15를 설명하면 이하와 같아진다. 먼저, 함수 First(S)[선언열의 선두의 선언을 되돌려준다] 결과를 변수 s에 기록한다(스텝 701). 다음에, 스텝 702에서 「선언열 S로부터 변수 s의 값(선언)을 제외한 선언열 중에서, 스텝 703이 미실행된 선언이 있는지의 여부」 를 판정한다. 판정결과가 참인 경우는, 스텝 703로 진행되어, 「함수 Lower(s', s)가 참인[선언 s'의 단어는 변수 s의 선언의 정의에 사용되는]지의 여부」를 판정하여, 결과가 참이라면 변수 s에 선언 s'를 기록하고(스텝 704), 스텝 702로 되돌아온다. 스텝 703의 결과가 거짓이라면 직접 스텝 702로 되돌아온다. 스텝 702의 결과가 참인 한, 스텝 702로부터 704의 재기 처리(706)를 반복한다.
스텝 702의 결과가 거짓이 되면, 스텝705에 진행되어, 함수 Min(S)의 결과로서 변수 s의 값을 돌려준다.
이상의 정의에 의해서, 선언열의 최적순서매김을 형식적으로 정의하는 것이 용이해진다.
(4-3) 최적 순서매김의 형식적 정의
선언열의 최적 순서매김을 형식적으로 정의한다. S가 선언열이라고 하면, StatementOrdering(S)에 의해서 나타난 S에 속하는 선언열의 순서매김된 순열은, 형식적으로는 아래와 같이 정의된다.
상기의 형식적 정의는, 함수 StatemetnsOrdering(S)의 결과는, 「선언의 순열 S가 비어있으면, 비어있음. 그렇지 않으면,
AddFirst(Min(S), StatementOrdering(Remove(S, Min(S))))의 결과」인 것을 의미하고 있다. AddFirst(Min(S), StatementOrdering(Remove(S, Min(S))))의 의미에 대해서는, 후술하는 함수 StatementsOrdering(S)의 플로우챠트의 설명에 의해서 상세히 설명한다.
하기의 함수 StatementsOrdering(S)의 알고리즘에 의해서, 선언열 S의 최적 순서매김이 가능하다.
상기의 함수 StatementsOrdering(S)의 알고리즘의 의미는 이하와 같다.
S는 선언열이다. 변수 min는 하나의 선언이다.
<개시>
<If문 개시> 선언열 S가 공집합이라면, 공을 되돌려주고,
그렇지 않으면, Min(S)[선언열S 중에서, 그 정의에 다른 어느 선언도 사용
하고 있지 않는 선언을 되돌려준다] 결과의 선언을 변수 min에 기록하고,
함수 AddFirst(min, StatementOrdering(Remove(S, min)))의 값을 돌려준다
<If문 종료>
<종료>
함수 AddFirst(min, StatementOrdering(Remove(S, min)))에 대해서는, 이하의 플로우챠트의 설명으로 상세하게 서술한다.
도 16은, 이 함수 StatementsOrdering(S)의 알고리즘을 플로우챠트에 나타낸 것이다. 도 16의 설명은 다음과 같다. 먼저, 스텝 801의 「요건의 선언열 S는 공집합인지의 여부」를 판정하여, 판정결과가 참이면 함수 StatementsOrdering(S)의 결과로서 공(空)을 돌려주고 처리를 종료한다.
스텝 801의 판정 결과가 거짓이면, 스텝 802로 진행되고, 변수 min의 영역에 함수 Min(S)[선언열 S중에서, 그 정의에 다른 어느 선언도 사용하고 있지 않는 선언을 되돌려준다]의 결과를 기록하고, 스텝 803로 진행된다. 스텝 803에서 함수 Remove(S, min)[선언열 S로부터 변수 min의 값의 선언을 제외한다]를 실행하여, 스텝 804가 진행된다. 스텝 804에서 「함수 Remove(S, min)의 결과인 S'가 고정치인지의 여부」를 판정하고, 판정 결과가 거짓이면 스텝 803으로 되돌아와 다시 실행한다. 스텝 804의 결과가 거짓인 한, 스텝 803으로부터 804의 제 1 재기처리(811)를 반복한다.
스텝 804의 판정 결과가 참이 되었을 때, 스텝 805로 진행된다.
스텝 805에서 함수 StatementOrdering(S')를 실행하고, 스텝 806로 진행된다. 스텝 806에서 「함수 StatementOrdering(S')의 결과 S"가 고정치인지의 여부」를 판정하고, 판정 결과가 거짓이면, 스텝 801로 되돌아와 스텝 801을 다시 실행한다. 스텝 806의 결과가 거짓인 한, 스텝 801로부터 스텝 806의 제 2 재기처리(812)를 반복한다.
스텝 806의 결과가 참이 되었을 때, 스텝 807로 진행되어, 함수AddFirst (min, S")를 실행하고, 다음에 스텝 808로 진행된다. 스텝 808에서는, 「함수 AddFirst(min, S")의 결과 S'''가 고정치에 도달했는지의 여부」를 판정하여, 판정 결과가 거짓이면 스텝 807로 되돌아와 다시 실행한다. 스텝 808의 결과가 거짓인 한, 스텝 807로부터 808의 제 3 재기처리(813)를 반복한다.
스텝 808의 판정 결과가 참이 되었을 때, 스텝 809로 진행되어, 함수 StatementOrdering(S)의 결과로서 선언열 S'''의 값을 되돌려, 함수 처리를 종료한다.
5. 슬라이싱(Slicing)
프로그램의 슬라이싱·테크닉은 비특허문헌 12로 거슬러 올라간다. 슬라이싱은, 프로그램을 특정의 계산에 관련되어 있는 선언에 축소시킨다고 하는 프로그램의 추출로서 생각할 수 있다. 전통적인 프로그램 언어중에서, 슬라이싱은, 프로그램 독해와 디버그를 「분할하여 지배하는」어프로치(보다 작은 프로그램군, 즉, 슬라이스군은, 큰 프로그램보다 이해하기 쉽다)로서 장시간 사용되어 왔다. 또한, 많은 어플리케이션의 분석에도 순조롭게 사용되어 오고 있으며, 그 목적은 여러 가지이다. 예를 들어, 결합도의 판정, 알고리즘의 디버그, 리버스엔지니어링, 컴퍼넌트 재사용, 자동병행화, 프로그램 통합, 및 보조 검증이 포함된다.
Lyee요건에 있어서는, 슬라이싱은, 다른 관점으로부터 요건을 분석하기 위해서 도움이 될 수 있다. 특히 슬라이싱에 의하면, 이하의 관점으로부터 분석할 수 있게 된다.
1.임의의 단어의 정의에 직접적 또는 간접적으로 공헌하는 선언은 어떤 것인지?
2.병행하여 실행시킬 수 있는 서브 프로그램군을 생성할 수 있는 요건중에서, 독립하고 있는 부분은 어떤 것인지?
자동 툴을 사용하여, 상기의 제 1 관점으로부터 분석을 행하는 것은, Lyee소프트웨어(요건)를 이해하고, 유지하기 위해서 매우 도움이 된다. 실제로, 요건으로 주어지고 있는 선언의 수가 중대할 때(수백개), 전체를 간파하여 소프트웨어를 이해하고, 유지하기 위해서는, 어떠한 정의가 어느 것에 의존하는지를 조사해 나가는 것은, 신중히 이루어지지 않는 한, 힘든 작업이며 잘못이 일어나기 쉽다.
(5-1) 단일 슬라이스
(5-1-1) 단일 슬라이스의 비형식적 정의
임의의 단어 a와 선언의 집합 S가 있었을 때, Slice(a, S)는, 직접적 또는 간접적으로 단어 a의 정의에 공헌하는 S중에 있는 모든 선언이다. 슬라이스의 개념을 명확하게 하기 위해서 구체적인 예를 올린다.
표 17은 선언의 집합인 Lyee 요건이다.
(표 17)
Lyee 요건
S가 표 17에서 주어진 선언의 집합이라면, 단어 a의 슬라이스Slice(a, S)는 표 1 8에 나타나는 것이 된다.
(표 18)
단어 a의 슬라이스 Slice(a,S)
슬라이스 그 자체가 요건의 완전한 집합이다고 하는 것은 중요한 점이다. 이 슬라이스의 개념은, 이른바 「분할하여 정복하는」테크닉이라고 생각할 수 있고, Lyee 요건을 이해, 혹은 유지하기 위해서, 특히 그들이 선언을 대량으로 포함한 경우에 매우 유용하다.
(5-1-2) 단일 슬라이스의 형식적 정의
임의의 단어 a와 선언의 집합 S가 있었을 때, S중의 단어 a에 관한 슬라이스는, Slice(a, S)에 의해서 나타나고, 다음과 같이 정의된다.
상기의 형식적 정의는, 함수 Slice(a, S)의 결과는, 「선언의 집합 S에 속하는 단어 a의 선언과 그 단어 a의 선언의 직접 및 간접 Use에 속하는 모든 단어 b의 선언의 집합의 합집합」인 것을 의미한다.
하기의 함수 Slice(a, S)의 알고리즘에 의해서, Lyee 요건(선언의 집합) 중의 임의의 단어에 관한 슬라이스를 생성할 수 있다.
상기의 함수 Slice(a, S)의 알고리즘의 의미는 이하와 같다. a는 단어, S는 요건인 선언의 집합이다. 변수 slice_s는 선언의 집합, 변수 s는 1개의 선언이다.
<개시>
변수 s에 함수 Statement(a, S)[요건 S에 속하는 단어 a의 선언을 되돌려준
다]의 결과를 기록한다.
변수 slice_s에, 변수 s의 값을 기록한다.
<For문 개시>함수 UseDirectAndlndirect(s, S))[요건 S에 속하는 선언 s의
직접 및 간접 Use를 되돌려준다]의 결과에 속하는 모든 단어 b에 대해 이하
를 실행한다.
변수 slice_s에, 변수 slice_s의 값과 함수 Statement(b, S)[선언 s에 속하
는 단어 b의 선언을 돌려주는] 결과를 기록한다.
<For문 종료>
변수 slice_s의 값을 되돌려준다
<종료>
도 17은, 이 함수 Slice(a, S)의 알고리즘을 플로우챠트로 나타낸 것이다. 도 17을 설명하면 이하와 같다. 먼저, 스텝 901에서, 변수 s에 함수 Statement(a, S)[요건 S에 속하는 단어 a의 선언을 되돌려준다] 결과를 기록하고, 함수 Statement(a, S)[요건 S에 속하는 단어 a의 선언을 되돌려준다] 결과를 기록한다. 다음에, 스텝 902로 진행되어, 「함수 UseDirectAndlndirect(s, S)[요건 S에 속하는 선언 s의 직접 및 간접 Use 를 되돌려준다] 결과중에 미실행 단어 b가 있는지 아닌지」를 판정한다. 판정 결과가 참이면, 스텝 903로 진행되어, 변수 slice_s에 변수 slice_s의 값과 함수 Statement(b, S)[요건 S에 속하는 단어 b의 선언을 되돌려준다] 결과의 선언을 기록, 스텝 902로 되돌아와 다시 실행한다. 스텝 902가 참인 한, 스텝 902로부터 스텝 903의 재기처리(905)를 반복한다.
스텝 902의 판정 결과가 거짓이 되었을 때, 스텝 904로 진행되어, 함수 slice(a, S)의 결과로서, 변수 slice_s의 값을 되돌려준다.
가장 중요한 슬라이스는 일반적으로 출력 단어에 관한 슬라이스이다. 하기의 함수 AllOutputSlice(S)의 알고리즘에 의해서, 임의의 Lyee 요건중의 각 출력 단어에 관한 슬라이스를 생성할 수 있다.
상기의 함수 AllOutputSlice(S)의 알고리즘의 의미는 이하와 같다.
S는 요건인 선언의 집합이다. 변수 sliceSet는 슬라이스의 집합이다.
<개시>
변수 sliceSet의 영역에 「0」을 기록한다.
<For문 개시>
함수 OutputStatements(S)[요건 S에의 모든 출력 단어의 선언을 되돌려준
다]에 속하는 모든 선언 s에 대해 이하를 실행한다.
변수 sliceSet에, 변수 sliceSet의 값과 함수 Slice(Word(s), S)[요건 S 에
속하는 선언 s의 단어의 슬라이스를 되돌려준다] 결과를 기록한다.
<For문 종료>
변수 sliceSet의 값을 되돌려준다.
<종료>
도 18은, 이 함수 AllOutputSlice(S)의 알고리즘을 플로우챠트로 나타낸 것이다. 도 18을 설명하면 이하와 같다. 먼저, 변수 sliceSet의 영역에 값「0」을 기록한다(스텝 1001). 다음에, 스텝 1002로, 「함수 OutputStatements(S)[요건 S에의 모든 출력 단어의 선언을 되돌려준다] 중에서 미실행의 선언 s가 있는지의 여부」를 판정한다. 판정 결과가 참이면 스텝 1003로 진행되고, 변수 sliceSet의 영역에 변수 sliceSet의 값과 함수 Slice(Word(s), S)[요건 S에 속하는 선언 s의 단어의 슬라이스를 되돌려주는]의 결과를 기록한다. 스텝 1003 종료후, 스텝 1002로 되돌아와 다시 실행한다. 스텝 1002의 결과가 참인 한, 스텝 1002로부터 1003의 재기처리(1005)를 반복한다.
스텝 1002의 결과가 거짓이 되었을 때, 스텝 1004로 진행되어 변수 sliceSet의 값을 되돌려준다.
(5-2) 독립 슬라이스(Independent Slices)
슬라이싱의 테크닉은, 요건의 중에서 독립부분을 알기 위해서도 용이하게 이용할 수 있다. 임의의 요건의 독립부분을 찾는 것은, 또 하나의 「분할하여 정복하는」테크닉으로서 프로그램의 이해와 자동적 병행화(parallelization)에 유용한 방법이다.
(5-2-1) 독립 슬라이스의 비형식적 정의
2개의 슬라이스 집합 S1과 S2는, 만약 S1과 S2의 양쪽 모두에 관계되어 있는 선언이 없으면, 독립적이라고 할 수 있다. 독립된 슬라이스의 구체적인 예를 나타낸다. S가 표 17에 나타난 선언의 집합일 때, Slice(d, S)는 표 19와 같이 나타난다.
(표 19)
단어 d의 슬라이스 Slice(d,S)
이 때, 표 18의 Slice(a, S), 및 표 19의 Slice(d, S)의 양쪽에 관계하고 있는 선언은 없다. 따라서, 2개의 슬라이스 Slice(a, S)와 Slice(d, S)는 독립하고 있으며, 그리고 병렬로 실행할 수 있다고 결론지을 수 있다.
(5-2-2) 독립 슬라이스의 형식적 정의
만약, 이하의 조건이 성립하면, 2개의 슬라이스 집합 S1과 S2는 독립하고 있다.
S1 ∩ S2 = Ø
상기는, S1의 요소이고 또한 S2의 요소인 슬라이스(선언의 집합)가 없는 것을 나타내고 있다.
1개의 슬라이스 집합이 있고, 어느 슬라이스가 바깥으로부터 독립한 슬라이스의 부분 집합인지를 파악하고자 했을 경우를 생각해 본다. 예를 들면, 우리가 각각의 출력 단어에 관한 슬라이스를 생성하여, 이들 슬라이스의 독립부분을 검출하고자 하는 경우이다. 먼저, 슬라이스의 독립된 부분 집합의 개념을 이해하는 도움이 되는 몇가지 정의를 소개한다.
2개의 독립된 슬라이스 집합:
S1와 S2를 2개의 슬라이스 집합으로 한다. 슬라이스 S1∈S1 (슬라이스 집합 S1에 속하는 슬라이스 S1)과 슬라이스 S2∈S2 (슬라이스 집합 S2에 속하는 슬라이스 S2)가 독립되어 있다면, 슬라이스 집합 S1와 S2는 독립하고 있다.
최적 슬라이스 집합:
S를 슬라이스 집합으로 한다. S1≠0 또한 S2≠0인, S1⊂S(슬라이스 S1이 슬라이스 집합 S에 속한다)인 모든 S1, 또한, S2⊂S (슬라이스 S2가 슬라이스 집합 S에 속한다)인 모든 S2에 있어서, S1과 S2가 독립하고 있지 않으면, S는 최적 슬라이스 집합이다.
최적이고 독립한 슬라이스 집합:
S1…Sn을 n개의 슬라이스 집합으로 한다. 만약, i가 1≤i≤n인 모든 S1이 최적 슬라이스 집합으로, j가 1≤j≤n 이며 또한 i≠j 이도록 하는 Sj가 있었을 때, 모든 Si과 Sj가 독립 슬라이스 집합이라면, S1…Sn는 최적이고 독립된 슬라이스 집합이다.
하기의 함수 IndependentSetOfSlice(S)의 알고리즘에 의해서, 출력 단어의 슬라이스를 추출하여, 그것들을 최적이고 독립한 슬라이스 집합으로 분리할 수 있다.
상기의 함수 IndependentSetOfSlice(S)의 알고리즘의 의미는 이하와 같다.
S는 요건인 선언의 집합이다. 변수 sliceMultiSet는 슬라이스 집합의 집합이다. 변수 sliceSet는 슬라이스의 집합이다. 변수 OutputWords, 변수 NotTreatedWords는 단어의 집합이다.
<개시>
변수 sliceSet의 영역에 값「0」을 기록한다.
변수 OutputWords의 영역에 함수 Word(OutputStatements(S)) [요건 S의
전체출력단어의 선언의 단어를 되돌려준다]의 결과를 기록한다.
<For문 개시> 변수 OutputWords의 값에 속하는 모든 단어 a에 대해 이하를
실행한다.
변수 sliceSet에 함수 Slice(a, S)[요건 S에 속하는 단어 a의 슬라이스를
되돌려준다]의 결과를 기록한다.
변수 OutpuWords의 영역에, 변수 OutputWords의 값으로부터 단어 a를 제
외한 단어의 집합을 기록한다.
변수 NotTreatedWords의 영역에 변수 OutputWords의 값을 기록한다.
<For문 개시>변수 NotTreatedWords에 속하는 모든 단어 b에 대해 이하를
실행한다.
<If문 개시> 만약, 함수 UseDirectAndIndirect(Slice(b, S))[단어 b의
슬라이스[단어 b의 정의에 사용되고 있는 단어의 선언의 집합]의 직접 및
간접 Use]와 단어 b의 합집합과
함수 UseDirectAndIndirect(Slice(a, S))[단어 b의 슬라이스[단어 a의 정
의에 사용되고 있는 단어의 선언의 집합]의 직접 및 간접 Use]와 단어 a
의 합집합의, 2개의 집합의 곱집합이 공(空)이 아니면, 즉 2개의 집합에
모두 속하는 단어가 있으면,
변수 sliceSet의 영역에, 변수 sliceSet의 값과 함수 Slice(b, S)를 기록
하고,
변수 NotTreatedWords의 영역에, 변수 NotTreatedWords의 값으로부터
단어 b를 제외한 단어의 집합을 기록한다.
<If문 종료>
<For문 종료>
변수 sliceMultiSet의 영역에, 변수 sliceSet의 값을 기록한다.
<For문 종료>
변수 sliceMultiSet의 값을 되돌려준다.
<종료>
도 19는, 이 함수 IndependentSetOfSlice(S)의 알고리즘을 플로우챠트에 나타낸 것이다. 도 19를 설명하면 다음과 같다. 먼저, 변수 sliceSet의 영역에 값「0」을, 변수 OutputWords의 영역에 함수 Word(OutputStatements(S))[요건 S의 전체출력 단어의 선언의 단어를 되돌려준다]의 결과를 기록한다(스텝 1101). 다음에, 스텝 1102에서 「변수 OutputWords의 값중에서 미실행된 단어 a가 있는지의 여부」를 판정하여, 판정 결과가 참이면 스텝 1103으로 진행된다. 스텝 1103에서는, 변수 sliceSet에 함수 Slice(a, S)[요건 S에 속하는 단어 a의 슬라이스를 되돌려준다]의 결과를 기록, 변수 OutpuWords의 영역에 변수 OutputWords의 값으로부터 단어 a를 제외한 단어의 집합을 기록, 변수 NotTreatedWords의 영역에 변수 OutputWords의 값을 기록한다.
다음에, 스텝 1104에서 「변수 NotTreatedWords의 값중에 미실행의 단어 b가 있는지의 여부」를 판정하여, 결과가 참이면, 스텝 1105로 진행된다.
스텝 1105에서는, 「함수 UseDirectAndIndirect(Slice(b, S))[단어 b의 슬라이스[단어 b의 정의에 사용되고 있는 단어의 선언의 집합]의 직접 및 간접 Use]와 단어 b의 합집합과, 함수 UseDirectAndlndirect(Slice(a, S))[단어 b의 슬라이스[단어 a의 정의에 사용되고 있는 단어의 선언의 집합]의 직접 및 간접 Use]와 단어 a의 합집합의, 2개의 집합의 교집합이 존재하는지의 여부(즉 2개의 집합에 모두 속하는 단어가 있는지의 여부)」를 판정한다. 판정 결과가 참이면, 스텝 1106로 진행되어, 변수 sliceSet의 영역에 변수 sliceSet의 값과 함수 Slice(b, S)를 기록하고, 변수 NotTreatedWords의 영역에 변수 NotTreatedWords의 값으로부터 단어 b를 제외한 단어의 집합을 기록한다. 스텝 1106이 종료한 후에는 스텝 1104로 되돌아와 다시 실행한다. 스텝 1104의 판정이 참인 한, 스텝 1104에서 1106의 제 1 재기처리(1109)를 반복한다.
스텝 1104의 판정이 거짓이 되었을 때는, 스텝 1107로 진행되어, 변수 sliceMultiSet의 영역에, 변수 sliceSet의 값을 기록한다. 스텝 1107이 종료한 후에는, 스텝 1102로 되돌아와 재차 실행한다. 스텝 1102의 판정 결과가 참인 한, 스텝 1102에서 1107의 제 2 재기처리(1110)를 반복한다.
스텝 1102의 판정 결과가 거짓이 되었을 때는, 스텝 1108로 진행되고, 함수 IndependentSetOfSlice(S)의 결과로서 변수 sliceMultiSet 의 값을 되돌려준다.
(5-2-3) 최적 독립 슬라이스 집합의 예
최적이고 독립된 슬라이스 집합의 구체적인 예를 나타낸다. 표 20은, S로 나타나는 선언의 집합이다.
(표 20)
요건
(1) 출력 단어의 슬라이스
S에 의해서 나타나는, S의 출력 단어에 대응하고 있는 슬라이스의 집합은, 이하와 같다.
그리고, 이러한 슬라이스는 이하의 표와 같다.
(표 21)
단어 b의 슬라이스 Slice(b,S)
(표 22)
단어 c의 슬라이스 Slice (c,S)
(표 23)
단어 f의 슬라이스 Slice (f,S)
(표 24)
단어 g의 슬라이스 Slice (g,S)
(표 25)
단어 h의 슬라이스 Slice(h,S)
(2) 최적이고 독립된 슬라이스 집합
S로부터 추출할 수 있는 최적이고 독립된 슬라이스 집합은 아래와 같다.
6. 타이핑(Typing)
타이핑(비특허문헌 2 및 11 참조)은 프로그램의 몇가지 동적인 좋은 행동의 특성을 정적으로 보증하기 위해서 주로 사용되고 있다. 타이핑을 행하면, 프로그램의 실행시에 빈번히 일어나는 에러를, 컴파일시에 검출할 수 있다. 또한, 타이핑 기술은, 개발된 소프트웨어가 어떠한 시큐러티 문제에 대처하는 것을 확실하게 하는 데에 성공적으로 사용되어 왔다(비특허문헌 11 참조).
이 섹션에서는, Lyee요건의 단어의 타입에 관련된 잘못을 검출하기 위한 분석과 Lyee요건 간소화(출력 단어의 타입을 지정하지 않아도, 입력된 것의 타입으로부터, 중간 단어와 출력 단어의 타입을 자동적으로 생성한다)를 위해서, 어떻게 타이핑 기술을 사용할 수 있는지를 나타낸다. 또한 소프트웨어 개발에 관련된 시큐러티 문제(예를 들면 어떠한 기밀 정보가 소프트웨어의 원인에 의해 누설되어서는 안된다)를 취급하기 위해서, 얼마나 용이하게 Lyee 방법론을 확장할 수 있는지를 나타낸다.
타이핑의 목적은, 타입의 올바르지 않은 취급에 의한 에러를 검출하는 것이다. 타이핑에 의해, 가능한 경우는, 타입의 수정이나, 빠져 있는 타입을 생성할 수 있다. 예를 들면, 사용자가 입력 단어의 타입의 지정만이 가능할 때에, 그것만으로 모든 단어의 타입을 자동적으로 생성할 수 있다. 타입의 에러 검출이나, 잘못되어 있는 타입을 정정하는 것, 혹은 빠져 있는 타입을 생성하기 위해서는, 제일 먼저, 포함되어 있는 연산 대상(operand)의 타입을 명확하게 정의하는 것이 필요하다. 임의의 Lyee 요건의 타이핑이, 본섹션 이전에 설명한 각종 최적화나 분석 뒤에 이루어지면 매우 유익하다고 하는 것은 중요한 점이다. 바꾸어 말하면, 임의의 Lyee요건에 순환선언, 불요선언, 비활성선언이 포함되지 않은 것을, 타이핑을 시작하기 전에, 확인해야 한다.
(6-1) 타이핑 규칙
타이핑의 테크닉은, 일반적으로 다음의 요소의 사용을 포함한다.
(6-1-1) 기본의 타입
이 항에서는, 임의의 Lyee 요건에 포함되는 단어, 상수, 연산자에 속하는 타입의, 다른 종류를 정의한다.
<값의 타입>
단순화를 위해서, 단어와 상수의 타입은, 부울형(boolean)이나 정수형, 혹은 플로트(부동 소수점수)형이라고 한다. 편의를 위해서, 이들 타입을 다음과 같이 재편한다.
상기의 정의는 다음과 같이 읽을 수 있다: Tval(값의 타입)이라 함은, Tnum (수치의 타입) 또는 Tbool(부울값의 타입)이다. Tnum는 정수형 혹은 플로트형이다. 마지막으로, Tbool는 부울형에 대응한다.
<연산자의 타입>
마찬가지로, 임의의 Lyee 요건에 포함되는, 불 및 산술연산자의 타입을 명확하게 해야 한다. 각 연산자에 관해서, 그 오퍼랜드(연산 대상)의 타입과 그 결과의 타입에 대해서 정확하지 않으면 안 된다. 임의의 연산자의 타입은 일반적으로, T1→T2의 형식을 취한다. 직감적으로 알 수 있듯이, 이것은, 연산자는, 입력으로서 타입 T1의 요소를 취하고, 그리고 타입 T2의 요소를 되돌리는 함수로 생각되는 것을 의미한다.
물론, 몇가지 연산자는 하나 이상의 오퍼랜드를 가진다.
따라서, 만약, 하나의 타입은 그 자신이 2개의 타입의 셋트인 경우도 있다고 생각하면, 이 사실을 고려하는 것은 용이하다. 정리하면, 어느 타입은, Tval(값의 타입), 2개의 타입의 조 T1×T2 혹은 T1→T2이다. 보다 형식적으로 나타내면, 다음과 같이 쓸 수 있다.
상기의 형식적 표기는, 「임의의 타입 T는, Tval(값의 타입), 2개의 타입의 조 T1×T2, 혹은 T1→T2이다」를 의미하고 있다.
(6-1-2) 상수 타이핑(Constant Typing)
Lyee 요건의 타이핑에 있어서, 선언중에 포함되는 상수에 허용되는 타입은 다음과 같다.
상기의 표기는, true 또는 false(진위값)의 타입은 bool(부울형)이며, num(수치)의 타입은 int(정수형)이며, num.num(부동 소수점수치)의 타입은 float (플로트형)인 것을 의미하고 있다.
보다 정확하게는, 후술하는 바와 같이, 임의의 상수에 1개의 타입을 관련짓기 위해서, 아래와 같은 함수가 사용된다.
상기의 함수 TypeOfCst(cst)의 의미는 이하와 같다.
함수의 인수 cst는, 상수이다.
<개시>
함수 Switch(cst)의 실행
인수(引數)의 상수 cst가, true 또는 false (진위값)일 때, 값 bool(부울
형)를 되돌린다.
인수의 상수 cst가, num(수치)일 때, 값 int(상수형)를 되돌린다. 인수
의 상수 cst가, num.num (부동소수점수치)일 때, 값 float(플로트형)을
되돌린다.
함수 Switch의 종료
<종료>
상수 타이핑은 다음의 규칙에 의해서 형식화할 수 있다.
상기 형식적 기술에 의한 상수의 타이핑 규칙은, 「임의의 Lyee 요건 ε에 속하는 상수 c의 타입은, 전제조건없이, 단순히 함수 TypeOfCst(c)에 의해서 되돌린 값인」것을 나타내고 있다.(이 이전의 설명에서는 Lyee 요건을 나타내는 기호로서 S를 이용했지만, 타이핑 테크닉에서는, 관습적으로 E가 사용되므로 E를 이용한다.)
(6-1-3) 단어의 타이핑(Word Typing)
어떤 입력 단어에 대해서도, 사용자는 그 타입에 대해서 절대로 정확하지 않으면 안된다. 입력단어 이외의 단어에 대해서는, 그들 타입은 자동적으로 산출되고, 그리고 이들 단어를 정의하고 있는 선언의 「타입」영역에 보존된다. 이미 알고 있는 단어가 있는 경우에, 그 타입을 되돌리는 함수 TypeOfWrd를 하기와 같이 정의한다:
상기의 함수 TypeOfWrd(w,ε)의 의미는 이하와 같다. 함수의 인수 w는, 선언의 리스트 E에 속하는 단어이다.
<개시>
단어 w의 선언을 산출하고(Statement(w,ε)), 산출한 선언 (Statement(w,ε)의 결과를 s로 둔다)의 타입을 되돌린다(Type(s)).
<종료>
단어의 타이핑은 다음의 규칙에 의해서 형식화할 수 있다.
상기 형식적 기술이 나타내는 단어의 타이핑 규칙은, 「임의의 Lyee요건 ε을 타이핑의 환경으로 하는 단어 w의 타입은, 전제조건없이, 단순히 함수 WypeOfWrd(w, ε)에 의해서 되돌리는 값인」것을 나타내고 있다.
(6-1-4) 연산자의 타이핑(Operator Typing)
프로그램에서 사용할 수 있는 각 연산자의 타입에 대해서는, 보다 엄격함이 필요하다. 실제로, 연산자가 있는 것은 부울형의 인수를 필요로 하여 부울형의 결과를 되돌렸지만, 다른 연산자는 다른 타입의 인수를 필요로 하고, 다른 타입의 결과를 되돌린다고 하는 경우가 있기 때문이다. Lyee 요건에 관여하는 각 연산자보다 엄격한 타입은, 이하와 같이 형식화할 수 있다:
상기의 형식적 정의는, 다음과 같은 의미이다. 1)과 2)의 연산자는, 입력으로서 1개의 값을 취하고, 1개의 값을 되돌려주지만, 3)으로부터 6)의 연산자는, 결과적으로 1개의 값을 되돌려주기 위해서 입력으로서 2개의 값을 필요로 한다.
1) -u
단항 연산자-u의 타입은, Tnum(수치의 타입)을 부여하면 Tnum(수치의 타입)를 돌려주는 함수이다.
2) not
부울형 연산자의 하나의 not(논리 부정의 연산자)의 타입은, 부울형(bool)을 부여하면 부울형(bool)를 되돌려주는 함수이다. 예를 들어, 연산자 not에 true(부울형)를 주면, 「not true」의 결과는 false(부울형)이며, false(부울형)가 부여되면, 「not false」의 결과는 true(부울형)이다.
3) +, -b, *
연산자 +(덧셈), -b(뺄셈), *(곱셈)의 타입은, Tnum(수치의 타입)와 Tnum(수치의 타입)의 셋트를 부여하면, 1개의 Tnum(수치의 타입)을 되돌리는 함수이다.
4) <, <=, >=, >
연산자 <(좌변이 우변보다 작다), <=(좌변이 우변보다 작거나, 또는 동일하다), >=(좌변이 우변보다 큰, 또는 동일하다), >(좌변이 우변보다 크다)의 타입은, Tnum(수치의 타입)과 Tnum(수치의 타입)의 조를 부여하면, 1개의 Tnum(수치의 타입)을 되돌리는 함수이다.
5) or, and
부울형 연산자인 or(논리합의 연산자)와 and(논리곱의 연산자)의 타입은, bool(부울형)와 bool(부울형)의 셋트를 부여하면, 1개의 bool(부울형)를 되돌리는 함수이다. 예를 들어, 논리합의 불연산자 or에 true(부울형)와 true(부울형)를 주면, 「true or true」의 결과는 true(부울형)이다.
6) =, <>
연산자=(좌변은 우변과 동일하다), <>(좌변은 우변과 다르다)는, Tval (값의 타입)와 Tval(값의 타입)의 셋트를 부여하면, 1개의 bool(부울형)을 되돌리는 함수이다.
보다 구체적으로는, 임의의 연산자의 타입을 돌려주는 함수 TypeOfOp는, 아래와 같이 정의할 수 있다.
상기의 함수 TypeOfOp(Op)의 의미는 이하와 같다.
인수 op는, 연산자이다.
<개시>
함수 Switch(op)의 실행
인수의 연산자 op가 -u(단항 연산자)일 때, Tnum→Tnum(수치의 타입을 취하고,
수치의 타입을 돌려주는 함수형)을 되돌린다.
인수의 연산자 op가 not(논리 연산자)일 때, bool→bool(부울형을 취하고,
부울형을 돌려주는 함수형)를 되돌린다.
인수의 연산자 op가 + 또는 -b일 때, Tnum×Tnum→Tnum(2개의 수치의 타입의
셋트를 취하고, 수치의 타입을 되돌리는 함수형)를 되돌린다.
인수의 연산자 op가 <, <=, >=, > 일 때,Tnum×Tnum→bool(2개의 수치의 타입
의 셋트를 취하고, 부울형을 되돌리는 함수형)을 되돌린다.
인수의 연산자 op가 bool×bool→bool(2개의 부울형의 셋트를 취하고, 부울
형을 되돌리는 함수형)
인수의 연산자 op가 Tval×Tval→Tval(2개의 값의 타입의 셋트를 취하고, 값의
타입을 되돌리는 함수형)을 되돌린다.
함수 Switch의 종료
<종료>
연산자 타이핑은 다음의 규칙에 의해서 형식화할 수 있다:
상기 형식적 기술이 나타내는 규칙은, 임의의 Lyee요건 ε를 타이핑의 환경으로 하는 연산자 Op의 타입은, 전제조건 없이, 항상 단순히 함수 TypeOfOp(Op)에 의해서 되돌려지는 값인 것을 나타내고 있다.
(6-1-5) 식의 타이핑(Expression Typing)
각 종류의 식의 타입을 판정하는 방법을 나타낸다. 식의 타이핑의 설명을 단순화하기 위해서, 이하에 나타내는 바와 같이, 로 나타나는 타입간의 반순서 관계를 도입할 필요가 있다.
여기서, true(참)false(거짓)과 falsetrue의 양쪽이 성립할 때는, true=false를 의미하는 것에 유의하기 바란다.
상기의 순서관계를 사용하여, 2개의 타입의 상위의 것(sup)을 이하와 같이 정의할 수 있다.
상기의 기술은, 「T1과 T2 중 상위의 타입은(Sup(T1, T2)), T1 T2일 때는 T2, T2 T1 일 때는 T1인」것을 의미한다.
식 Exp는, 이하의 정의로 나타내는, 「val (값)」, 「id(식별자)」, 「(Exp) (괄호가 붙은 식)」, 「op Exp(연산자식)」, 「Exp op Exp(식 연산자 식)」중의 어느 하나이므로,
다음의 함수에 의해서, 식의 종류 마다 하나의 타입을 관련지을 수 있다.
상기의 함수 TypeOfExp(e, ε)의 의미는 이하와 같다. 함수의 인수 e는, 선언의 리스트 ε에 속하는 식이다.
<개시>
함수 Switch(e)의 실행
인수 e가 c(상수)일 때, TypeOfCst(c)의 값을 되돌린다.
인수 e가 w(단어)일 때, TypeOfWrd(w)의 값을 되돌린다.
인수 e가 「e1」형(식)의 식일 때, TypeOfExp(e1, ε)의 값을 되돌리는
인수 e가 「op e1」형(단항 연산자식)의 식일 때,
TypeOfOp(op)의 값을(T1,T2)에, TypeOfExp(e1,ε)의 값을 T'에 기록한다.
<If처리 개시> 만약, T'T1 (T'보다 T1가 보다 크다)의 관계라
면, T1을 되돌린다.
그렇지 않으면, 에러 메세지(ErrMsg)를 인쇄하여, TypErr를 되 돌린다.
<If처리 종료>
인수 e가 「e1 op e2」형(식 2항연산자 식)일 때,
TypeOfOp(op)의 값을 (T1,T2,T3)에, TypeOfExp(e1,ε)의 값을 T'1에 기록, TypeOfExp(e2, ε)의 값을 T'2에 기록한다.
<If처리 개시> 만약, T'1 T1(T'1보다 T1가 보다 크고, 또한 T'2 T2 (T'2보다 T2가 보다 크다)의 관계라면,
<If처리 개시> 그리고, 만약 T3가 부울형이 아니면, Sup(T'1,T'2)를 되돌린다.
그렇지 않으면, bool을 되돌린다.
<If처리 종료>
그렇지 않으면, 에러 메세지(ErrMsg)를 인쇄하고, 「TypErr」를 되돌린다
<If처리 종료>
함수 Switch 종료.
<종료>
도 20은, 이 함수 TypeOfExp(e, ε)를 플로우챠트에 나타낸 것이다. 도 20을 설명하면 다음과 같다. 먼저,「식 e가 상수인지의 여부」를 판정하여(스텝 1201), 결과가 참이면, 함수 TypeOfCst(c)[상수 c의 타입을 되돌린다]의 결과를 되돌리고(스텝 1202), 처리를 종료한다.
스텝 1201의 결과가 거짓이면, 스텝 1203으로 진행되어, 「식 e가 단어인지의 여부」를 판정하고, 판정 결과가 참이면, 함수 TypeOfWord(w)[단어 w의 타입을 되돌린다]의 결과를 되돌리고(스텝 1204), 처리를 종료한다.
스텝 1203의 결과가 거짓이면, 스텝 1205로 진행되어, 「식 e가 「e1」형(식)의 식인지의 여부」를 판정하고, 결과가 참이면, 함수 TypeOfExp(e1, ε)[선언의 리스트 ε에 속하는 식 e1의 타입을 되돌린다]의 결과를 되돌리고(스텝 1206), 처리를 종료한다.
스텝 1205의 결과가 거짓이면, 스텝 1207로 진행되어, 「식 e가 「op e1」형(단항 연산자식)의 식인지의 여부」를 판정하고, 판정 결과가 참이면, 함수 TypeOfOp(op)[연산자 op의 타입을 되돌린다]의 값을(T1, T2)에, 함수 TypeOfExp(e1, ε) [선언의 리스트 ε에 속하는 식 e1의 타입을 되돌린다]의 값을 T'에 기록한다(스텝 1208). 스텝 1208이 종료한 후, 스텝 1209에서 「T'T1[T'의 타입보다 T1의 타입이 큰] 것이 참인지의 여부」를 판정하여, 참이면 스텝 1210에서 T1의 값을 되돌려, 처리를 종료한다. 스텝 1209의 판정 결과가 거짓이면 스텝 1211에서 에러 메세지(ErrMsg) 출력하여 「TypErr」를 되돌리고, 처리를 종료한다.
스텝 1207의 판정 결과가 거짓이면, 스텝 1212로 진행된다. 스텝 1212에서는, 「식 e가 「e1 op e2」형(식 2항연산자 식)의 식인지의 여부」를 판정하고, 판정결과가 참이면, 스텝 1213에서, 함수 TypeOfOp(op)[연연산자 op의 타입을 되돌린다]의 값을 (T1, T2, T3)에, 함수 TypeOfExp(e1, ε) [선언의 리스트 ε에 속하는 식 e1의 타입을 되돌린다]의 값을 T'1에 기록, 함수 TypeOfExp(e2, ε))[선언의 리스트 ε에 속하는 식 e2의 타입을 되돌린다]의 값을 T'2에 기록한다. 스텝 1213이 종료한 후, 스텝 1214에서 「T'1 T1(T'1의 타입보다 T1의 타입이 보다 크다), 또한, T'2 T2(T'2의 타입보다 T2의 타입이 보다 크다)인지의 여부」를 판정한다. 판정 결과가 참이라면, 스텝 1215로 진행되어 「T'3 타입은 부울형이 아니지만 참인지의 여부」를 판정하여, 판정 결과가 참이라면 스텝 1216에서 Sup(T'1, T'2)[ T'1와 T'2의 2개의 타입중의 가장 상위인 타입을 되돌린다] 반환(스텝 1216), 처리를 종료한다. 스텝 1215의 결과가 거짓이었을 때는, 스텝 1217에서 부울형을 돌려주어 처리를 종료한다. 스텝 1214의 결과가 거짓이었을 때는, 스텝 1218에서 에러 메세지(ErrMsg) 출력하여 「TypErr」를 되돌려, 처리를 종료한다.
스텝 1212의 결과가 거짓이면, 처리를 종료한다.
이 함수가 어떻게 기능하는지, 구체적인 예를 들어 설명한다.
식이 「a+b」이고, 「a」와 「b」는 타입이 정수형(int)인 입력 단어라고 하면, 이 식은 「e1 op e2 (식 1 연산자 식 2)」라고 하는 형태를 가지며, 이 식의 경우 「e1 = a」, 「op = +」, 「e2 = b」가 된다.
따라서,
TypeOfop(+)= Tnum×Tnum→Tnum(연산자 +의 타입은, 2개의 수치의 타입의 셋트를 취하여, 수치의 타입을 되돌리는 함수형)이기 때문에,
(T1, T2, T3) = (Tnum, Tnum, Tnum)이 되고
TypeOfExp(a)=TypeOfExp(b)=int (식 a , 식 b도 타입이 정수형 int인 단어이기 때문에, TypeOfExp(a) = TypeOfWrd(a) = int, TypeOfExp(b) = TypeOfWrd(b) = int가 되므로)이기 때문에, T'1=int, T'2 =int가 되어,
상술의 타입의 반순서정의에 의해,
intTnum (수치의 타입은, 정수형보다 상위)를 이끌어 낼 수 있으므로, T'1 T1(T'1=int, T1=Tnum) 또한 T'2 T2 (T'2=int, T2=Tnum)의 조건이 성립하고,
T3= Tnum이기 때문에 T3≠bool도 성립한다.
따라서, 함수 TypeOfExp(a+b)의 최종 결과적으로 되돌리는 Sup (T'1, T'2)는 Sup(int, int)=int(정수형과 정수형중의 가장 큰 타입은 정수형)가 되므로, 다음과 같은 최종 결과가 유도된다.
TypeOfExp(a+b)=int(식 a+b의 타입은, 정수형 int)
또 하나의 예로서 만약 「a」의 타입이 플로트(부동 소수점수) 형인 경우는, 그 때는 식 「a+ b」의 타입은 플로트형이다.
왜냐하면,
TypeOfExp(a+b)에 있어서, a=float, b=int의 경우,
(T1, T2, T3)=(Tnum, Tnum, Tnum)이 되고,
TypeOfExP(a)=float, TypeOfExp(b)=int (식 a는 타입이 플로트형 float의 단어, 식 b는 타입이 정수형 int의 단어이기 때문에, TypeOfExp(a)=TypeOfWrd(a)= float, TypeOfExp(b)=TypeOfWrd(b)=int가 되므로)이기 때문에, T'1 =float, T'2=int가 되고,
상술의 타입의 반순서정의에 의해,
intfloat 또한 floatTnum(수치의 타입은, 정수형보다 상위)이기 때문에, T'1 T1(T'1=float, T1=Tnum) 또한 T'2 T2(T'2=int, T2=Tnum)의 조건이 성립하고, T3=Tnum이기 때문에 T3≠bool도 성립한다.
따라서, 함수 TypeOfExp(a+b)의 최종 결과적으로 되돌리는 Sup (T'1, T'2)는, Sup(float, int)=float(플로트형과 정수형중의 상위의 타입은 플로트형)가 된다.
보다 형식적으로 나타내면, 식의 타입은 이하의 타이핑 규칙에 의해서 파악할 수 있다:
상기 형식적 기술이 나타내는 규칙은, 이하와 같다.
(Cst) 식이 상수인 경우의 규칙:
임의의 Lyee요건 ε를 타이핑의 환경으로 하는 상수 c의 타입은, 전제조건 없이, 함수 TypeOfCst(c)가 되돌리는 값이다.
(Wrd) 식이 단어인 경우의 규칙:
임의의 Lyee요건 ε을 타이핑의 환경으로 하는 단어 w의 타입은, 전제조건 없이, 함수 TypeOfWrd(w,ε)가 되돌리는 값이다.
(Op) 식이 연산자인 경우의 규칙:
임의의 Lyee요건 ε을 타이핑의 환경으로 하는 연산자 Op의 타입은, 전제조건 없이, 함수 TypeOfOp(Op)가 되돌리는 값이다.
(ExpP) 식이 괄호 식의 경우의 규칙:
임의의 Lyee요건 ε을 타이핑의 환경으로 하는 식(Exp)의 타입은, 전제조건 「임의의 Lyee요건 ε을 타이핑의 환경으로 하는 식 Exp의 타입이 T」가 성립할 때, T이다.
(Expu) 식이 「op Exp」의 경우의 규칙:
전제조건 「임의의 Lyee요건 ε을 타이핑의 환경으로 하는, 연산자 op의 타입이 T1→T2이며, 식 Exp의 타입이 T'1로서, T'1 T1일 때의 타입이 T」가 성립할 때, 임의의 Lyee 요건 ε을 타이핑의 환경으로 하는 식 op Exp의 타입은, T'1이다.
(ExpBA) 식이 「Exp op Exp」로, 연산 결과가 부울형이 아닌 경우의 규칙:
전제 조건 「임의의 Lyee요건 ε을 타이핑의 환경으로 하는, 연산자 op의 타입이 T1×T2 T3로서, 식 Exp1의 타입이 T'1이며, 식 Exp2의 타입이 T'2이며, T'1 T1 또한 T'2 T2 또한 T3≠bool이다」가 성립할 때, 임의의 Lyee요건 ε을 타이핑의 환경으로 하는 식 Exp1 op Exp2의 타입은, Sup(T'1, T'2)이다.
(ExpBB) 식이 「Exp op Exp」로, 연산 결과가 부울형의 경우의 규칙:
전제 조건 「임의의 Lyee요건 ε을 타이핑의 환경으로 하는, 연산자 op의 타입이 T1×T2 bool로서, 식 Exp1의 타입이 T'1이며, 식 Exp2의 타입이 T'2이며, T'1 T1 또한 T'2 T2」가 성립할 때, 임의의 Lyee요건 ε을 타이핑의 환경으로 하는 식 Exp1 op Exp2의 타입은, bool이다.
(6-1-6) 선언의 타이핑
식의 타입 판정 방법을 알 수 있으면, Lyee 요건의 임의의 선언의 타이핑을 실시하는 것은 매우 용이하다. 다음의 함수는 Lyee 요건 ε에 있어서의 임의의 선언 s의 타입을 판정한다.
상기 함수 TypOfStat((Id, Exp, Cond, io, T, Tsec), ε)의 의미는 이하대로이다. 함수의 인수(Id, Exp, Cond, io, T, Tsec)는, 임의의 Lyee 요건인 선언의 리스트 ε를 타이핑의 환경으로 하는 임의의 선언을 구성하는 항목의 값(id=단어의 식별자, Exp=정의식, Cond=정의식 실행 조건식, io=입출력 속성, T=단어의 값의 타입, Tsec=단어의 값 시큐러티 레벨을 나타내는 타입)이다.
<개시>
<If처리 개시>
만약, oi=If 또는 io=IS 한편 T가 공(空)이라면[즉, 선언이 입력 단어의
것으로 타입 정보가 없으면], 에러 메시지를 인쇄하고,「0」을 되돌린다
[즉, 타입 판정은 불가능].
그렇지 않으면[즉, 선언이 출력 단어의 것이라면],
<If처리 개시>만약, 함수 TypeOfExp(Exp)[정의식 Exp의 타입을 되돌린 다]의 결과가 TypErr[정의식의 타입이 TypErr, 즉 타입이 판정 불가] 이며, 또한, 함수 TypeOfExp(Cond)[조건식 Cond의 타입을 되돌린다]의 값이 부울형이라면,
결과적으로 (Id, Exp, Cond, io, TypeOfExp(Exp), Tsec)를 되돌린다. <If처리 종료>
<If처리 종료>
<종료>
도 21은, 이 함수 TypeOfStat((Id, Exp, Cond, io, T, Tsec), ε)를 플로우챠트에 나타낸 것이다. 도 21을 설명하면 이하와 같다. 먼저, 「선언의 io항목이 IF[파일에의 입력] 또는 IS[화면에의 입력], 또한 항목 T가 공[타입 정보가 없는]지 아닌지」를 판정한다(스텝 1301). 판정의 결과가 참이라면, 스텝 1302로 진행되고, 에러 메세지(ErrMsg)를 인쇄하여 「0」을 되돌리고, 처리를 종료한다.
판정 결과가 거짓이라면, 스텝 1303로 진행되어, 「함수 TypeOfExp(Exp)[정의식 Exp의 타입을 되돌린다]의 결과가 TypErr[즉 타입이 판정 불가]이며, 또한, 함수 TypeOfExp(Cond)[조건식 Cond의 타입을 되돌린다]의 값이 부울형인지의 여부」를 판정한다. 판정 결과가 참이라면, 스텝 1304에서 (Id, Exp, Cond, io, TypeOfExp(Exp), Tsec)의 값을 되돌려, 처리를 종료한다. 판정 결과가 거짓이라면, 처리를 종료한다.
형식적으로 표기하면, 이 함수의 타이핑 규칙은 이하와 같다.
상기 형식적 기술이 나타내는 규칙은, 「전제 조건 『임의의 Lyee요건인 선언의 리스트 ε를 타이핑의 환경으로 하는, 정의식 Exp의 타입이 T1, 마찬가지로 정의식 실행 조건식의 타입이 부울형으로, 입출력 속성이 IS 및 IF가 아니다』가 성립할 때, 선언의 리스트 ε를 타이핑의 환경으로 하는 선언(Id, Exp, Cond, io, T, Tsec)의 타입은, (Id, Exp, Cond, io, T1, Tsec)이다.」
(6-1-7) Lyee요건의 타이핑
임의의 선언의 순서매김된 리스트 ε가 있을 때, 그 리스트의 타입 판정은 이하와 같다.
상기의 함수 TypeOfLyee(<S1,…, Sn>)의 의미는 이하와 같다.
인수 <S1,…, Sn>는 Lyee요건인 선언의 리스트, 변수 ε0은 선언의 리스트이다.
<개시>
변수 ε0의 영역에, 선언의 리스트<s1,…, sn>를 기록한다
<For처리개시> i에 1로부터 n까지를 대입하고, 하기를 실행한다.
s'i에, TypeOfStat(sii-1)의 결과를 기록한다
εi에는, εi-1의 결과를 기록한다.
εi의 i번째의 요소를, s'i로 치환한다.
<For 처리종료>
εn의 값을 되돌린다.
<종료>
예를 들어, n=3이도록 하는 함수 TypeofLyee(<s1, s2, s3>)은 이하와 같다.
변수 ε0의 영역에, 선언의 리스트 <s1, s2, s3>을 기록한다.
<For 처리 개시> i=1일 때,
s'1에, TypeOfStat(s1, ε0)의 결과를 기록한다
ε1에는, ε0의 결과를 기록한다.
ε1의 1번째의 요소 s1을, s'1의 값으로 치환한다.
i=2일 때,
s'2, TypeOfStat(s2, ε1)의 결과를 기록한다.
ε2에는, ε1의 결과를 기록한다.
ε2의 2번째의 요소 s2를, s'2의 값으로 치환한다.
i=3일 때,
s'3에, TypeOfStat(s3, ε2)의 결과를 기록한다
ε3에는, ε2의 결과를 기록한다.
ε3의 3번째의 요소 s3을, s'3의 값으로 치환한다.
<For 처리 종료>
결과로서 ε3의 값 <s'1, s'2, s'3>을 되돌린다.
<종료>
도 22는, 이 함수 TypeOfLyee(<s1, …, sn>)를 플로우챠트에 나타낸 것이다. 도 22를 설명하면 다음과 같다. 우선, 변수 ε0의 영역에, 선언의 리스트 <s1, …, sn>를 기록한다(스텝 1401). 다음에, i에 1을 가산(스텝 1402)하여, 스텝 1403로 진행된다. 스텝 1403에서 「i의 값이 n인지의 여부」를 판정하여, 결과가 거짓이면, s'i에 TypeOfStat(si, εi-1)의 결과를 기록, εi에 εi-1의 결과를 기록하고, εi의 i번째의 요소를 s'i로 치환한다(스텝 1404).스텝 1404가 종료한 후, 스텝 1402로 되돌아와 다시 실행한다. 스텝 1403의 결과가 거짓인 한, 스텝 1402로부터 스텝 1404의 재기처리(1406)를 반복한다.
스텝 1403의 결과가 참이 되었을 때, 스텝 1405에서 εn의 값을 되돌려 처리를 종료한다. 이 때, εn의 값은 <s'1, …, s'n>이 되어 있다.
형식적으로 나타내면, 이 함수에 관련지어진 타이핑 규칙은 다음과 같다.
상기 형식적 기술이 나타내는 규칙은, 「전제 조건 『Lyee 요건인 선언의 리스트 ε를 타이핑 환경으로 하는 선언 s1의 타입이 s'1, s1에 대입된 후의 선언의 리스트 ε를 타이핑 환경으로 하는 <s2, …, s'n>의 타입이 <s'2, …, s'n>이다』가 성립할 때, Lyee요건인 선언의 리스트 ε를 타이핑 환경으로 하는 선언의 리스트 <s1, …, sn>의 타입은, <s'1, …, s'n>이다」인 것을 의미하고 있다.
최종적으로, 순서매김된 Lyee 요건에 관련지어진 타입 판정의 완전한 시스템은 다음과 같다.
상기 형식적 기술이 나타내는 규칙은, 이하와 같다.
(Cst) 식이 상수인 경우의 규칙:
Lyee요건인 선언의 리스트 ε를 타이핑 환경으로 하는 상수 c의 타입은, 전 제조건 없이, 함수 TypeOfCst(c)가 되돌리는 값이다.
(Wrd) 식이 단어인 경우의 규칙:
Lyee요건인 선언의 리스트 ε를 타이핑 환경으로 하는 단어 w의 타입은, 전 제조건 없이, 함수 TypeOfWrd(w, ε)가 되돌리는 값이다.
(Op) 식이 연산자인 경우의 규칙:
Lyee요건인 선언의 리스트 ε를 타이핑 환경으로 하는 연산자 Op의 타입은, 전제조건 없이, 함수 TypeOfOp(Op)가 되돌리는 값이다.
(Expp) 식이 괄호식인 경우의 규칙:
Lyee요건인 선언의 리스트 ε를 타이핑 환경으로 하는 식 (Exp)의 타입은, 전제 조건 『Lyee 요건인 선언의 리스트 ε를 타이핑 환경으로 하는 식 Exp 의 타입이 T』가 성립할 때, T이다.
(ExpU) 식이「op Exp」인 경우의 규칙:
전제 조건 『Lyee 요건인 선언의 리스트 ε를 타이핑 환경으로 하는, 연산자 op의 타입이 T1→T2로서, 식 Exp의 타입이 T'1이며, T'1 T1 이다』가 성립할 때, Lyee요건인 선언의 리스트 ε를 타이핑 환경으로 하는 식 op Exp의 타입 은, T'1이다.
(ExpBA) 식이 「Exp op Exp」로, 연산 결과가 부울형이 아닌 경우의 규칙:
전제 조건 『Lyee 요건인 선언의 리스트 ε를 타이핑 환경으로 하는, 연산자 op의 타입이 T1×T2→T3로서, 식 Exp1의 타입이 T'1이며, 식 Exp2의 타입이 T'2 이며, T'1 T1 또한 T'2 T2 또한 T3≠bool이다』가 성립할 때, Lyee요건인 선언 의 리스트 ε를 타이핑 환경으로 하는 식 Exp1 op Exp2의 타입은, Sup(T'1, T'2)이다.
(ExpBB) 식이 「Exp op Exp」로, 연산 결과가 부울형인 경우의 규칙:
전제 조건『Lyee 요건인 선언의 리스트 ε를 타이핑 환경으로 하는, 연산자 op의 타입이 T1×T2→bool로서, 식 Exp1의 타입이 T'1이며, 식 Exp2의 타입이 T'2이며, T'1 T1 또한 T'2 T2』가 성립할 때, Lyee요건인 선언의 리스트 ε를 타이핑 환경으로 하는 식 Exp1 op Exp2의 타입은, bool이다.
(6-2) 케이스 스터디
이하에, Lyee 요건에 타입 체크를 적용하는 것의 중요성을 나타내는 2개의 예를 제시한다. 1번째의 예는, 타이핑 시스템이, 어떻게 올바르게 타입 위반에 관한 에러를 검출하는지를 나타낸다. 2번째의 예는, 타이핑 시스템에 의한 타입의 자동적인 생성을 나타낸다.
<예 1>
표 26과 같은 초기 요건이 주어지고 있다. 상기에서 설명한 바와 같이, 타입의 검증 전에, 먼저 선언의 최적 순서매김이 필요하다. 따라서, 타입의 검증은 표 27에 나타난 요건의 순서지어진 버젼에 대해서 이루어진다.
(표 26)
초기요건
(표 27)
순서매김후의 요건
표 27의 순서매김된 요건에 대해서 타이핑 분석을 실시하면, 되돌려지는 결과는, 요건에 이하와 같은 타입 에러가 있는 것을 나타낸다.
·선언 d의 에러 : 식(true)은 수치(int 혹은 float)는 아니다.
·선언 c에 대한 경고 : 타입(int)은 (bool)로 수정되어 있다.
·선언 g에 대한 경고 : 타입(int)은 (bool)로 수정되어 있다.
·선언 f에 대한 경고 : 타입(float)은 (bool)로 수정되어 있다.
·선언 h에 대한 경고 : 타입(int)은 (bool)로 수정되어 있다.
타이핑에 의해서 올바른 타입이 신생 이루어진 요건은, 표 28에 나타난 바와 같다.
(표 28)
타이핑후의 요건
<예 Ⅱ>
상술한 바와 같이, 타입 시스템은, 입력단어 이외의, 모든 단어의 타입을 자동적으로 생성하는 것도 가능하다. 이것을 이하에 구체적인 예로 나타낸다.
표 29의 요건에 나타낸 바와 같이, 주어진 타입은 입력 단어의 타입뿐이다. 이 요건의 순서매김을 한 후의 요건(표 30)에 타입 체크의 시스템을 적용하면, 표 31과 같은 결과가 된다.
(표 29)
초기요건
(표 30)
순서매김후의 요건
(표 31)
타이핑후의 요건
7. 시큐러티·타이핑
다음에, 우리는 Lyee 방법론이 시큐러티 등, 소포트웨어 개발 외의 많은 국면을 취급하는데 얼마나 적당한지를 나타낸다. 실제, 프로그램이 적대적 환경에서 실행될 때, 생성된 코드가 데이터 기밀성이나 보전성 등의 어떠한 시큐러티 방침을 만족하는 것을 증명하기 위해서, 위에 제시한 타이핑 기술을 용이하게 확대 적용시킬 수 있다. 그 주목적은, 사용자가 시큐러티 요건을 표시하는 시큐러티라벨(「공개」, 및, 「비공개 」등)을, 시큐러티 방침(예를 들면, 비공개의 단어의 값을 공개의 단어에 저장할 수 없는, 등)과 함께, 각각의 정의된 단어에 명확하게 부여하는 것을 가능하게 하는 것이다. 이들 주어진 정보로부터, 시큐러티 위반을 발생시키는 여지가 있는 미묘한 설계상의 결함을 분명히 하기 위해서, 자동적 프로그램 검증용 타입 체크 기술을 사용할 수 있다.
예를 들면, 표 32에서 주어지고 있는 선언중에 나타나는 시큐러티 라벨에 의해서 요건을 확장한다고 한다.
(표 32)
시큐러티 방침이, 비공개의 단어의 값을 공개의 것에 영향시키는 것을 금지하는 것이라고 한다. 또한, 비공개의 값을 다른 값(비공개의, 또는, 공개의 것)에 첨가한 결과도 비공개라고 생각하지 않으면 안된다고 하자. 따라서, 그 중에 공개의 단어 a가 비공개의 값을 받고 있으므로, 표 32에서 나타낸 요건은 시큐러티 방침을 준수하지 않는다고 하는 것이 분명하다.
(7-1) 시큐러티·타이핑 규칙
타이핑의 검증과 마찬가지로, 시큐러티의 검증도 하기의 요소를 이용한다. 이 섹션에서는, 임의의 Lyee 요건에 나타나는 단어, 상수, 연산자에 속하는, 다른 타입을 정의한다.
(7-1-1) 기본적인 시큐러티·타입
<값의 시큐러티·타입>
단순화를 위해서, 단어와 상수의 시큐러티·타입은, public(공개), 또는 secret (비공개)라고 한다.
상기 정의는, 「값의 시큐러티·타입(TSval)은, public(공개) 또는 secret(비공개)인」것을 의미하고 있다.
<연산자의 시큐러티·타입>
마찬가지로 Lyee 요건에 관여할 수 있는 불 연산자 및 산술 연산자의 시큐러티·타입을 명확하게 해야 한다. 각 연산자에 대해서, 그 연산수의 시큐러티·타입과 그 결과의 타입에 대해 명확하게 할 필요가 있다. 임의의 연산자의 시큐러티·타입은, 통상 TS1→TS2의 형식을 취한다.
직감적으로 알 수 있듯이, 이 형식적 기술은, 1개의 연산자란, 입력으로서 시큐러티·타입 TS1을 취했을 때에 시큐러티·타입 TS2을 되돌리는 함수인 것으로 볼 수 있는 것을 의미하고 있다. 물론, 몇가지 연산자는 1개 이상의 오퍼랜드를 취한다. 따라서, 시큐러티·타입은 그 자신이 1쌍의 시큐러티·타입의 경우도 있다고 보면, 이러한 케이스를 설명하는 것은 용이하다.
정리하면, 시큐러티·타입은 TSval(1개의 값의 시큐러티·타입), 1쌍의 시큐러티·타입 TS1×TS2, 혹은 TS1→TS2이다.
보다 형식적으로 나타내면 다음과 같이 쓸 수 있다.
상기 형식적 기술은, 「시큐러티·타입(Ts)은, TSval, 또는 TS1×TS2, 또는 TS1→TS2」인 것을 의미하고 있다.
(7-1-2) 상수의 시큐러티·타이핑
Lyee 요건의 시큐러티 체크하는 경우, 선언중에 발견되는 상수의 시류러티·타입은, 하기에 나타낸 바와 같이 단순하게 public이다.
즉, 상수가, true(참) 또는 false(거짓)의 경우도, num(수치)의 경우도, num.num(부동 소수점수치)의 경우도, 시큐러티·타입은 public(공개)이다. 타이핑의 검증과 마찬가지로, 다음의 함수에 의해서 임의의 상수의 시큐러티·타입을 판정할 수 있다.
상기 함수 SecTypeOfCst(cst)의 의미는 하기와 같다.
함수의 인수 cst는 상수를 의미한다.
<개시>
값 public를 되돌린다.
<종료>
상수의 시큐러티·타이핑은, 다음의 규칙에 의해서 형식화할 수 있다:
상기 형식적 기술은, 「Lyee 요건인 선언의 리스트 ε를 시큐러티·타이핑 환경으로 하는 상수 c의 시큐러티·타입은, 전제조건 없이, SecTypeOfCst(c)의 결과의 값」인 것을 의미하고 있다.
(7-1-3) 단어의 시큐러티·타이핑
어떤 입력 단어라도, 사용자는 그 시큐러티·타입에 대해 절대로 정확해야만 한다. 그 외의 단어에 대해서는, 시큐러티·타입은 자동적으로 산출되어, 이들 단어를 정의하고 있는 선언의 영역 「시큐러티」에 기록된다. 이미 알고 있는 단어가 있을 때, 단어의 시큐러티·타입을 되돌리는 함수 SecTypeOfWrd를 이하와 같이 정의한다.
상기 함수 SecTypeOfWord(w, ε)의 의미는 아래와 같다.
함수의 인수 w는, 요건 ε에 속하는 임의의 단어를 의미한다.
<개시>
요건 ε에 속하는 단어 w의 선언(Statement(w, ε))의, 시큐러티·타입의 값(Security(*), *는 Statement(w, ε)로 요구한 선언)을 되돌린다
<종료>
단어의 시큐러티·타이핑은, 다음의 규칙에 의해서 형식화할 수 있다.
상기 형식적 기술은, 「Lyee 요건인 선언의 리스트 ε를 시큐러티·타이핑 환경으로 하는 단어 w의 시큐러티·타입은, 전제조건 없이, SecTypeOfWrd(w, ε)의 결과의 값인」것을 의미하고 있다.
(7-1-4) 식의 시큐러티·타이핑
이하에, 각 종류의 식의 시큐러티·타입을 판정하는 방법을 나타낸다.
식의 시큐러티·타이핑의 설명을 단순화하기 위해서, 시큐러티·타입의 사이의 S로 나타나는 반순서관계를 최초로 도입할 필요가 있다.
상기의 반순서관계를 사용하여, 2개의 시큐러티·타입중의 상위의 것을 이하와 같이 정의할 수 있다.
상기의 기술은, 「TS1와 TS2 중의 상위의 타입이(Sup(TS1, TS2)), TS1 STS2일때는 TS1,TS2 STS1일 때는 TS2인」것을 의미한다.
식은 이하중의 하나, 즉, val(값), 또는 id(단어의 식별자), 또는 (Exp) (괄호가 붙은 식), 또는 op Exp(연산자 식), 또는 Exp op Exp(식 연산자 식)이기 때문에,
다음의 함수에 의해서, 식의 각종류 마다 시큐러티·타입을 관련지을 수 있다.
상기 함수 SecTypOfExp(e, ε)의 의미는 이하와 같다. 함수의 인수 e는, 요건 ε에 속하는 임의의 식이다.
<개시>
함수 Switch(ε)의 실행
인수 e가 c(상수)의 경우, SecTypeOfcst(c)의 결과의 값을 되돌린다.
인수 e가 w(단어)의 경우, SecTypeOfWrd(w)의 결과의 값을 되돌린다.
인수 e가 e1(식)의 경우, SecTypeOfExp(e1, ε)의 결과의 값을 되돌린다.
인수 e가 op e1(연산자식)의 경우, SecTypeOfExp(e1)의 결과의 값을 되돌
린다.
인수 e가 e1 op e2(식 연산자 식) 경우,
TS1에 SecTypeOfExp(e1, ε)를 기록
TS2에 SecTypeOfExp(e2, ε)를 기록
SecSup(TS1, TS2)를 되돌린다
함수 Switch 종료
<종료>
도 23은, 이 함수 SecTypeOfExp(e,ε)를 플로우챠트에 나타낸 것이다. 도 23을 설명하면 다음과 같다. 먼저, 「식 e가 상수인지의 여부」를 판정하고(스텝 1501), 결과가 참이면, 함수 SecTypeOfcst(c)[상수 c의 시큐러티·타입을 되돌린다]의 결과를 되돌려(스텝 1502), 처리를 종료한다.
스텝 1501의 결과가 거짓이면, 스텝 1503으로 진행되고, 「식 e가 단어인지의 여부」를 판정하고, 판정 결과가 참이면, 함수 SecTypeOfWord(w)[단어 w의 시큐러티·타입을 되돌린다]의 결과를 돌려주어(스텝 1504), 처리를 종료한다.
스텝 1503의 결과가 거짓이면, 스텝 1505로 진행되어, 「식 e가 「e1」형(식)의 식인지의 여부」를 판정하고, 결과가 참이면, 함수 SecTypeOfExp(e1, ε)[선언의 리스트 ε에 속하는 식 e1의 시큐러티·타입을 되돌린다]의 결과를 되돌려(스텝 1506), 처리를 종료한다.
스텝 1505의 결과가 거짓이면, 스텝 1507로 진행되어, 「식 e가 「op e1」형(단항 연산자 식)의 식인지의 여부」를 판정하고, 판정결과가 참이면, 함수 SecTypeOfExp(e1)[식 e1의 시큐러티·타입을 되돌린다]의 결과를 되돌린다(스텝 1508).
스텝 1507의 판정 결과가 거짓이면, 스텝 1509로 진행된다.
스텝 1509에서는, 「식 e가 「e1 op e2」형(식 2항연산자 식)의 식인지의 여부」를 판정하고, 판정결과가 참이면, 스텝 1510에서, TS1에 SecTypeOfExp(e1, ε)을 기록, TS2에 SecTypeOfExp(e2, ε)를 기록, 그리고 SecSup(Ts1, Ts2)를 되돌려, 처리를 종료한다.
스텝 1509의 결과가 거짓이면, 처리를 종료한다.
보다 형식적으로 나타내면, 식의 시큐러티·타이핑은 다음의 규칙에 의해서 파악할 수 있다.
상기 형식적 기술이 나타내는 규칙은, 이하와 같다.
(Cst) 식이 상수인 경우의 규칙:
Lyee요건인 선언의 리스트 ε를 시큐러티·타이핑 환경으로 하는 상수 C의
타입은, 전제조건 없이, 함수 SecTypeOfCst(c)가 되돌리는 값이다.
(Wrd) 식이 단어인 경우의 규칙:
Lyee요건인 선언의 리스트 ε를 시큐러티·타이핑 환경으로 하는 단어 w의
타입은, 전제 조건 없이, 함수 SecTypeOfWrd(w, ε)가 되돌리는 값이다.
(Expp) 식이 괄호가 붙은 식인 경우의 규칙:
Lyee요건인 선언의 리스트 ε를 시큐러티·타이핑 환경으로 하는 식(Exp)의
타입은, 전제 조건 「Lyee요건인 선언의 리스트 ε를 시큐러티·타이핑 환경
으로 하는 식 Exp의 타입이 TS」가 성립할 때, TS이다.
(ExpU) 식이 「op Exp」인 경우의 규칙:
전제 조건 『Lyee 요건인 선언의 리스트 ε를 시큐러티·타이핑 환경으로 하
는 Exp(식)의 타입이 Ts이다』가 성립할 때, Lyee요건인 선언의 리스트 ε를
시큐러티·타이핑 환경으로 하는 Op Exp(연산자식)의 타입은, Ts이다.
(ExpB) 식이 「Exp op Exp」의 경우의 규칙:
전제 조건 『Lyee 요건인 선언의 리스트 ε를 시큐러티·타이핑 환경으로 하
는, 식 Exp1의 타입이 TS1이고, 식 Exp2의 타입이 TS2이다』가 성립할 때,
Lyee요건인 선언의 리스트 ε를 시큐러티·타이핑 환경으로 하는 식 Exp1 Op
Exp2의 타입은, Sup(TS1, TS2)이다.
(7-1-5) 선언의 시큐러티·타이핑
다음의 함수는, Lyee 요건 ε중의 임의의 선언 s에 시큐러티·타입을 관련짓는다.
상기 함수 SecTypOfStat((Id, Exp, Cond, io, T, Tsec),ε)의 의미는 이하와 같다. 함수의 인수(Id, Exp, Cond, io, T, Tsec)는, Lyee 요건 ε에 속하는 임의의 선언을 구성하는 항목의 값(Id=단어의 식별자, Exp=정의식, Cond=정의식 실행 조건, io=입출력 속성, T=단어의 값의 타입, Tsec=단어의 시큐러티레벨을 나타내는 타입)이다.
<개시>
<If문 개시> 만약, io=IF 또는 io=IS, 한편 Tsec가 공(空)이면[즉, 입출력 속성 io가 입력으로 시큐러티·타입의 정보가 주어지지 않으면], ErrMsg를 인쇄하고, 「0」을 되돌린다[시큐러티·타입의 판정을 할 수 없기 때문에, 에러 메세지를 인쇄하고, 0을 되돌린다]
그렇지 않으면,
<If문 개시> 만약, SecTypeOeExp(Exp)STsec[선언의 시큐러티·타입이 정의식의 시큐러티·타입보다 상위]이고, 또한, oi≠OS 또한 oi≠OF인 [io가 출력이 아닌, 즉 입력]이라면, (Id, Exp, Cond, io, T, Tsec)를 되돌린다
<If처리 종료>
<If문 개시> 만약, SecTypeOfExp(Exp)STsec≠secret[선언의 시큐러티
·타입(secret가 아니다)이 정의식의 시큐러티·타입보다 상위]이고, 또한, io=OS 또는 io≠OF[io가 화면에의 출력, 또는 파일에의 출력]이 라면, (Id, Exp, Cond, io, T, Tsec)를 되돌린다.
그렇지 않으면, ErrMsg(에러 메세지)를 되돌린다
<If처리 종료>
<If처리 종료>
<종료>
도 24는, 이 함수 SecTypeOfStat((Id, Exp, Cond, io, T, Tsec), ε)를 플로우챠트에 나타낸 것이다. 도 24를 설명하면 이하와 같다. 먼저, 「선언의 io항목이 IF[파일에의 입력]또는 IS[화면에의 입력], 또한 항목 T가 공(空)[타입 정보가 없는]지의 여부」를 판정한다(스텝 1601). 판정의 결과가 참이라면, 스텝 1602로 진행되어, 에러 메세지(ErrMsg)를 인쇄하여 「0」을 되돌려, 처리를 종료한다.
판정결과가 거짓이라면, 스텝 1503로 진행되어, 「SecTypeOfExp(Exp)sTsec 선언의 시큐러티·타입이 정의식의 시큐러티·타입보다 상위]이고, 또한, oi≠OS 또한 oi≠OF인[io가 출력이 아닌, 즉 입력]지의 여부」를 판정한다. 판정 결과가 참이라면, 스텝 1504라면, (Id, Exp, Cond, io, T, Tsec)를 되돌려, 처리를 종료한다.
스텝 1503의 판정 결과가 거짓이라면, 스텝 1505로 진행되어, 「 SecTypeOfExp(Exp)STsec≠secret[선언의 시큐러티·타입(secret가 아니다)가 정의식의 시큐러티·타입보다 상위]이고, 또한, io=OS 또는 io≠OF[io가 화면에의 출력, 또는 파일에의 출력]지의 여부」를 판정한다. 결과가 참이라면, 스텝 1506에서 (Id, Exp, Cond, io, T, Tsec)의 값을 되돌려, 처리를 종료한다.
스텝 1505의 결과가 거짓이라면, 에러 메시지(ErrMsg)를 되돌려(스텝 1507), 처리를 종료한다.
형식적으로 기술하면, 이 함수에 관련지어진 타이핑 규칙은 이하와 같다.
즉, 상기 형식적 기술은, 다음의 의미이다.
(Stat1) 출력 단어가 빠져 있는 시큐러티·타입 정보를 생성하는 경우:
전제 조건 『Lyee요건인 선언의 리스트 ε를 시큐러티·타이핑 환경으로 하는 정의식 Exp의 타입이 TS1로서, 선언의 입출력 속성이 입력이 아닌(io≠IS 또한 io≠IF)』가 성립할 때, Lyee요건인 선언의 리스트 ε를 시큐러티·타이핑 환경으로 하는 선언(Id, Exp, Cond, io, T, "")의 타입은, (Id, Exp, Cond, io, T, TS1)이다.
(Stat2) 출력 단어의 시큐러티·타입 정보를 체크, 정정하는 경우:
전제 조건 『Lyee 요건인 선언의 리스트 ε를 시큐러티·타이핑 환경으로 하는, 정의식 Exp의 타입이 TS1로서, 그 TS1가 선언의 시큐러티·타입의 값Tsec보다 상위이며(TS1 STsec), 입출력 속성이 입력이 아닌(io≠IS 또한 io≠IF)』가 성립할 때, Lyee요건인 선언의 리스트 ε를 시큐러티·타이핑.환경으로 하는 선언(Id, Exp, Cond, io, T, Tsec)의 타입은, (Id, Exp, Cond, io, T, Ts1)이다.
(7-1-6) Lyee 요건의 시큐러티·타이핑
순서매김된 선언의 리스트 ε가 있었을 때, 하기의 함수에 의해서, 그 선언의 각각에 시큐러티·타입을 관련지을 수 있다.
상기의 함수 SecTypeOfLyee(<s1, …, sn))의 의미는 이하와 같다.
함수의 인수<s1, …, sn>는, 임의의 선언의 리스트이다. 변수 ε0의 값은 선언의 리스트이다.
<개시>
ε0에 선언의 리스트<s1,…, sn>를 기록한다.
i는 1로부터 n을 취할 때, 하기를 실행한다
s'i에, SecTypeOfStat(si, εi-1)의 값을 기록한다
εi에는, εi-1의 값을 기록한다.
εi의 i번째의 요소를, s'i로 치환한다.
<For 처리 종료>
εn을 되돌린다
<종료>
도 25는, 이 함수 SecTypeOfLyee(<s1,…, sn>)를 플로우챠트에 나타낸 것이다. 도 25를 설명하면 다음과 같다. 우선, 변수 ε0의 영역에, 선언의 리스트 <s1,…, sn>를 기록한다(스텝 1701). 다음에, i에 1을 가산하고(스텝 1702), 스텝 1703로 진행된다. 스텝 1403에서 「i의 값이 n인지의 여부」를 판정하여, 결과가 거짓이면, s'1에 SecTypeOfStat(si, εi-1)의 결과를 기록, εi에 εi-1의 결과를 기록하고, εi의 i번째의 요소를 s'1로 치환한다(스텝 1704). 스텝 1704 종료후, 스텝 1702로 되돌아와 다시 실행한다. 스텝 1403의 결과가 거짓인 한, 스텝 1702로부터 스텝 1704의 재기처리(1706)를 반복한다.
스텝 1703의 결과가 참로 되었을 때, 스텝 1705에서 εn의 값을 되돌려 처리를 종료한다. 이 때, εn의 값은 <s'1,…, s'n>가 되어 있다.
형식적으로 기술하면, 상기 함수의 시큐러티·타이핑 규칙은 이하와 같다.
상기 형식적 기술이 나타내는 규칙은, 「전제조건 『Lyee 요건인 선언의 리스트 ε를 시큐러티·타이핑 환경으로 하는 선언 s1의 시큐러티·타입이 s'1, s1에 s'1가 대입된 후의 선언의 리스트 ε를 시큐러티·타입의 환경으로 하는 <s2,…, s'n>의 시큐러티·타입이 <s'2,…, s'n>이다』가 성립할 때, Lyee요건인 선언의 리스트 ε를 시큐러티·타이핑 환경으로 하는 선언의 리스트 <s1,…, sn>의 시큐러티·타입은, <s'1, …, s'n>」것을 의미하고 있다.
마지막으로, 순서매김된 Lyee 요건에 관한 완전한 시큐러티·타입 시스템은 다음과 같다.
(Cst) 식이 상수인 경우의 식의 시큐러티·타입:
Lyee요건인 선언의 리스트 ε를 시큐러티·타이핑 환경으로 하는 상수 c의
타입은, 전제조건 없이, 함수 SecTypeOfCst(c)가 되돌리는 값이다.
(Wrd) 식이 단어인 경우의 식의 시큐러티·타입:
Lyee요건인 선언의 리스트 ε를 시큐러티·타이핑 환경으로 하는 단어 w의
타입은, 전제조건 없이, 함수 SecTypeOfWrd(w, ε)가 되돌리는 값이다.
(Expp) 식이 괄호가 붙은 식의 경우의 식의 시큐러티·타입:
Lyee요건인 선언의 리스트 ε를 시큐러티·타이핑 환경으로 하는 식(Exp)의
타입은, 전제 조건 『Lyee요건인 선언의 리스트 ε를 시큐러티·타이핑 환경
으로 하는 식 Exp의 타입이 TS』가 성립할 때, TS이다.
(ExpU) 식이 「Op Exp」인 경우의 식의 시큐러티·타입:
전제조건 「Lyee 요건인 선언의 리스트 ε를 시큐러티·타이핑 환경으로 하
는 Exp(식)의 타입이 Ts이다」가 성립할 때, Lyee요건인 선언의 리스트 ε를
시큐러티·타이핑 환경으로 하는 Op Exp(연산자 식)의 타입은, TS이다.
(ExpB) 식이 「Exp op Exp」인 경우의 식의 시큐러티·타입:
전제 조건 『Lyee 요건인 선언의 리스트 ε를 시큐러티·타이핑 환경으로 하
는, 식 Exp1의 타입이 TS1이며, 식 Exp2의 타입이 TS2이다』가 성립할 때,
Lyee요건인 선언의 리스트 ε를 시큐러티·타이핑 환경으로 하는 식 Exp1 Op
Exp2의 타입은, Sup(TS1, TS2)이다.
(Stat1) 출력단어가 빠져 있는 시큐러티·타입 정보를 생성하는 경우:
전제 조건 『Lyee 요건인 선언의 리스트 ε를 시큐러티·타이핑 환경으로 하
는 정의식 Exp의 타입이 TS1로서, 선언의 입출력 속성이 입력이 아니다(io≠
IS 또한 io≠IF)』가 성립할 때, Lyee요건인 선언의 리스트 ε를 시큐러티·
타이핑 환경으로 하는 선언(Id, Exp, Cond, io, T, "")의 타입은, (Id, Exp,
Cond, io, T, Ts1)이다.
(Stat2) 출력 단어의 시큐러티·타입 정보를 체크, 정정하는 경우:
전제 조건 『Lyee 요건인 선언의 리스트 ε를 시큐러티·타이핑 환경으로 하
는, 정의식 Exp의 타입이 TS1로서, 그 TS1가 선언의 시큐러티·타입의 값Tsec
보다 상위이며(Ts1 STsec), 입출력 속성이 입력이 아니다(io≠IS 또한 io≠
IF)』가 성립할 때, Lyee요건인 선언의 리스트 ε를 시큐러티·타이핑 환경
으로 하는 선언(Id, Exp, Cond, io, T, Tsec)의 타입은, (Id, Exp, Cond, io,
T, Ts1)이다.
(Req)순서매김된 Lyee 요건의 시큐러티·타입:
전제 조건 『Lyee 요건인 선언의 리스트 ε를 시큐러티·타이핑 환경으로 하
는 선언 s1의 시큐러티·타입이 s'1, s1에 s'1가 대입된 후의 선언의 리스트
ε를 시큐러티·타입의 환경으로 하는 <s2,…, s'n>의 시큐러티·타입이
<s'2,…, s'n>이다』가 성립할 때, Lyee요건인 선언의 리스트 ε를 시큐러티
·타이핑 환경으로 하는 선언의 리스트 <s1, …,sn>의 시큐러티·타입은,
<s'1,…, s'n>이다.
(7-2) 케이스 스터디
상술의 표 31의 Lyee요건에, 시큐러티·타이핑을 실시하면, 다음의 에러가 검출된다.
·선언 c의 에러: 단어 c의 타입은, public(공개)가 되어 있지만, 정의식은 secret(비공개)의 단어를 포함하고(정의식 a=6의 단어 a가 secret), 그 영향을 받으므로 모순된다.
·선언 b의 에러: 단어 b의 타입은, public(공개)가 되어 있지만, 정의식은 secret(비공개)의 단어를 간접적으로 포함하고(정의식 c의 단어 c의 정의식 a=6의 단어 a가 secret), 그 영향을 받으므로 모순된다.
·선언 d의 에러: 단어 d의 타입은, public(공개)가 되어 있지만, 정의식은 secret(비공개)의 단어를 포함하고(정의식 a+6의 단어 a가 secret), 그 영향을 받으므로 모순된다.
·선언 g의 에러: 단어 g의 타입은, public(공개)가 되어 있지만, 정의식은 secret(비공개)의 단어를 간접적으로 포함하여(정의식 d=9의 단어 d의 정의식 a+6의 단어 a가 secret), 그 영향을 받으므로 모순된다.
·선언 f의 에러: 단어 f의 타입은 secret(비공개)이지만, 단어 f는 출력의 하나이므로 모순된다(시큐러티·타입이 secret인 값은 출력하지 않는 방침이기 때문에).
·선언 h의 에러: 단어 h의 타입은, public(공개)이 되어 있지만, 정의식은 secret (비공개)의 단어를 간접적으로 포함하고(정의식 f의 단어 f의 정의식이 g, 단어 g의 정의식이 d=9, 단어 d의 정의식이 a+6으로 단어 a가 secret), 그 영향을 받으므로 모순된다.
8. Lyee 요건분석기
Lyee 요건분석기는, 우리가 이전에 논의한 정적인 분석 기술을 부분적으로 실현되기 위해서 만들어진 원형이다. 그것은 입력으로서 Lyee 요건을 받아들여, Lyee All 툴로의 최적화 코드의 생성에 적절한 슬라이스와 순서가 정돈된 요건을 출력으로서 부여할 수 있다. 또한, 그것은 상수 전파 등의 다른 요건 최적화를 실행할 수 있다. 도 26에서 나타낸 바와 같이, 이 원형의 기본적인 구성요소는 이하와 같다:
● 어휘 및 구문의 분석기: 이 부분은 입력으로서 Lyee요건으로서 취하고, 출력으로서 일반적으로 중간적 표현으로 불리는 구문의 나무를 부여한다. 요건의 이 새로운 표현 방법은 우리가 실시하고자 바라고 있는 모든 정적인 분석 기술의 출발점이다. 게다가, Lyee요건을 분석할 때, 어휘, 또는, 구문상의 잘못을 검출하여 사용자에게 전하는 것이 가능하다.
● 플로우 베이스의 분석기: 플로우 베이스의 분석 요소는, 앞의 부분에서 이루어진 중간적 표현으로부터 시작해서, 1요건 포인트로부터 다른 1포인트까지 도달하는 데이터 플로우 제어의 순환에 관계있는 모든 정보를 낳는다. 이러한 분석의 결과는 제어 플로우도(Control Flow Graph: CFG) 및 데이터·플로우도(Data- Flow Graph: DFG)로 이루어진다.
● 최적화: 다른 것 중에서는, 이 요소는 상수전파기술을 실행하고, Lyee All 툴이, 보다 빠르게 실행성과 소비하는 메모리가 보다 적은 프로그램을 생성하는데 적합한, 규칙적이고 간이화된 선언의 계열을 생산한다.
● 슬라이서: 이 요소는 입력으로서, 플로우 베이스 분석요소 및 슬라이싱 평가 기준에 의해서 만들어지는 플로우에 관한(각 단어에 관련지어지는 Def/Use 등의) 정보를 받아들여, 이들 주어진 평가 기준에 대응하는 슬라이스를 출력으로서 준다.
9. 결론과 장래에의 전망
우리는 본고에서 Lyee요건에 대해서 정적분석기술을 이용하는 것으로 그 경우의 충격적 영향에 대해 보고했다. 먼저 제일 처음으로, 우리는 상수전파나 패턴 검출 등의 고전적인 최적화의 테크닉이 Lyee프로그램의 실행 시간을 얼마나 개량할 수 있는지를 제시하였다. 또한, 우리는, 어떻게 요건에 있어서의 오류(죽어 있는 정의, 주기적인 정의, 불완전 혹은 불필요한 정의)를 발견하는지를 나타내었다. 2번째로, 우리는 슬라이싱이라고 하는 테크닉이 Lyee시스템의 이해와 유지를 얼마나 개량할 수 있을지에 대하여 논의하였다. 그리고, 우리는, 이 슬라이싱 기술을 이용함으로써, 평행 실행 가능한 Lyee시스템중의 독립부분을 어떻게 찾아내는지를 나타내었다. 3번째로, 우리는 타이핑 오류를 발견하고 중간 개재물 및 출력 단어의 타입을 자동적으로 생성하는 것을 가능하게 하는 타입 시스템을 제안하였다. 4번째로, 우리는 Lyee 방법론이 어떻게 시큐러티 측면 등의 어떠한 확대에 적합한지를 예증하였다. 제시된 정적분석기술 중에는 현재, Lyee요건 분석기로 불리는 원형으로 실행되고 있는 것도 있다.
그리고 향후의 작업으로서 우리는 먼저, Lyee요건 분석 툴을 완성시켜, Lyee 방법론이 있는 다른 측면을 개량하기 위한 다른 정적 및 동적인 분석 기술을 조사하고 싶다.
10.
이상 상세하게 설명한 바와 같이, 본 실시형태에 관한 본 발명의 정적분석방법에 의하면, Lyee요건에 대해서 정적 분석 수법을 이용하므로, Lyye 요건과 Lyee에 의해서 생성되는 코드열의 쌍방의 품질을 개선할 수 있고, Lyee 방법론에 있어서의 보다 좋은 품질(보다 적은 메모리와 실행 시간의 소비)을 가진 코드 생성이 가능해진다.
(7) 발전 형태로서 상술한 정적분석방법 혹은 정적분석기를 Lyee요건(요구정의)에 대해서 이용하는 것으로, 보다 개선된 Lyee요건을 얻어, 이것을 상술의 「Lyee 발명의 개요」에서 설명한 방법에 의해, 혹은, 특허문헌 1, 2, 4 내지 6에 기재된 Lyee에 의한 소프트웨어 생성 방법에 의해, 또는, 특허문헌 3에 기재된 소프트웨어 생성 장치에 입력하는 것에 의해, 보다 적은 메모리 공간이나 처리시간으로 Lyee에 의해서 소망한 소프트웨어를 생성하는 방법 혹은 생성하는 생성 장치를 실현할 수 있다.
즉, Lyee에 의한 소프트웨어 생성의 상류 단계인 Lyee요건(요구정의) 단계에서 효율화를 실현하면, 그 이후의 처리를 기존의 Lyee방법론을 적용하는 것으로, 한층 더 고품질의 최종 제품인 소프트웨어를 얻을 수 있다.
이러한 Lyee요건(요구정의)을 얻은 후의 단계의 방법 혹은 장치의 상세한 설명에 대해서는, 상술의 「Lyee 발명의 개요」에서 설명한 내용, 혹은, 특허문헌 1 내지 6에 기재된 방법에 따른 것으로 하고, 여기서는 생략한다.
또한 본 발명에 의하면, 고전적인 정적 분석의 테크닉을 이용하는 것으로 Lyee 방법론을 더욱 증진시키는 것이 가능해진다.
또한 본 발명에 관한 Lyee 지향 소프트웨어에 관한 정적 분석기에 의하면, Lyee요건을 받아들여, Lyee All 툴에서의 최적화 코드의 생성에 적절한 슬라이스와 순서가 정돈된 요건을 출력으로서 부여할 수 있다. 또한, 그것은 상수전파 등의 다른 요건 최적화를 실행할 수 있다.
본 발명의 많은 특징 및 이점은 명세서의 상세한 설명으로부터 명백하다. 또한, 해당 기술 분야에 있어서의 통상의 지식을 가진 사람에게 있어서 수정 및 개변을 용이하게 많이 이룰 수 있으므로, 도시 및 기술된 것과 극소 다르지 않는 구성 및 동작에 본 발명을 한정하는 것은 바람직하지 않은 것이고, 따라서, 모든 적절한 개변체 및 등가체는 본 발명의 범위에 포함되는 것이라고 보여진다. 상술의 본 발명에 관한 실시형태의 설명 및 예시에 의해서 상세하게 기술되었지만, 첨부한 특허청구의 범위뿐만 아니라 본 발명에 관한 개시 사항 전체에 정의된 본 발명의 범위로부터 일탈하지 않고, 수정, 치환, 및, 변경이 수없이 가능하다.
또한, 본원에 관한 발명은, 그 적용에 있어서, 상기의 기술에 있어서 설명되거나, 혹은, 도면에 나타난 요소의 상세한 해석 및 조합에 한정되는 것은 아니다. 본 발명은, 다른 실시 형태가 가능하고, 여러가지 방법으로 실용 및 실시 가능하다. 또한, 여기서 이용된 어법 및 용어는 기술을 목적으로 하는 것이며, 한정적으로 작용하는 것으로 간주해서는 안된다.
따라서, 해당 기술 분야에 있어서의 통상의 지식을 가진 사람은, 본개시의 기조가 되는 개념은, 본 발명의 몇가지 목적을 실시하기 위한 다른 구조, 방법, 및, 시스템을 설계하기 위한 기초로서 용이하게 이용될 수 있음이 이해될 것이다. 따라서, 본 발명의 취지 및 범위로부터 일탈하지 않는 한, 본원의 특허청구의 범위에는 그러한 등가인 해석이 포함되는 것이라고 간주되는 것이다.
또한, 상기에서는 Lyee 방법론에 있어서의 소프트웨어의 정적 분석법 및 정적 분석기에 대해 주로 설명했지만, 본 발명에 관한 기술 사상은, 예를 들면 컴퓨터소프트웨어의 자동개발장치, 자동개발프로그램, 자동개발프로그램을 기록한 기록 매체, 전송 매체, 지면매체로서도, 또한, 자동개발프로그램을 게재한 컴퓨터·장치, 자동개발프로그램을 실행하는 클라이언트·서버 형식등과 같은 카테고리에 있어서도 실현, 이용 가능함은 물론이다.
또한, 본 발명은, 단일 프로세서, 단일 하드디스크 드라이브, 및, 단일 로컬 메모리를 구비한 컴퓨터시스템에 한정하지 않고, 해당 시스템의 옵션으로서 임의의 복수 또는 조합 프로세서 또는 기억 디바이스를 장비하는 데에도 적합하다. 컴퓨터 시스템은, 정교한 계산기, 수첩 타입 컴퓨터, 랩톱/노트북 컴퓨터, 미니 컴퓨터, 메인프레임 컴퓨터, 및, 슈퍼컴퓨터, 및, 이들 처리 시스템 네트워크 조합을 포함한다. 본 발명의 원리에 따라서 작동하는 임의의 적절한 처리 시스템에 의해서 대체될 수 있고, 또한, 이들과 조합하여 이용하는 것도 가능하다.
또한, 본 발명에 관한 기술 사상은, 본래 모든 종류의 프로그래밍언어에 대응 가능하다. 또한 본 발명에 관한 기술 사상은, 모든 종류·기능의 어플리케이션 소프트웨어에 대해서도 적용 가능하다.
그리고 또한 본원 발명은, 그 기술 사상의 동일 및 등가에 이르는 범위에 대해 여러가지로 변형, 추가, 치환, 확대, 축소 등을 허용하는 것이다. 또한, 본원 발명을 이용하여 생산되는 소프트웨어가, 그 2차적 생산품에 게재되어 상품화되었을 경우여도, 본원 발명의 가치가 그렇게 줄어드는 것은 아니다.
본 발명에서는, Lyee요건에 대해서 정적분석수법을 이용하므로, Lyye요건과 Lyee에 의해서 생성되는 코드열의 쌍방의 품질을 개선할 수 있고, Lyee 방법론에 있어서의 보다 좋은 품질(보다 적은 메모리와 실행 시간의 소비)을 가진 코드생성을 가능하게 하므로, 소프트웨어 생산의 대폭적인 효율 향상, 생산성 향상, 품질 향상 등, 소프트웨어 산업상에 큰 효과를 가져온다.

Claims (9)

  1. Lyee 방법론에 준거하여 소프트웨어를 생산하기 위해 단어마다의 정의식을 포함하는 요구정의(要求定義)를 얻는 스텝과,
    상기 얻어진 요구정의를 단어를 키(key)로 하여 상수를 검출하는 스텝과,
    상기 검출된 상수를 사용하는 정의식(定義式)에 따라서 그 상수를 전파(傳播)시키는 스텝을 구비하는 것을 특징으로 하는 Lyee 지향 소프트웨어에 관한 정적(靜的) 분석방법.
  2. Lyee 방법론에 준거하여 소프트웨어를 생산하기 위해 단어마다의 정의식을 포함하는 요구정의를 얻는 스텝과,
    상기 얻어진 요구정의중의 정의식으로부터 패턴을 검출하는 스텝과,
    상기 요구정의를 그 검출된 패턴을 치환식으로 하는 표현으로 바꾸는 스텝을 구비하는 것을 특징으로 하는 Lyee 지향 소프트웨어에 관한 정적분석방법.
  3. Lyee 방법론에 준거하여 소프트웨어를 생산하기 위해 단어마다의 정의식 및 전제조건을 포함하는 요구정의를 얻는 스텝과,
    상기 요구정의에 기초하여, 적어도 상기 단어에 관한 식별자(識別子), 상기 정의식 및 전제조건을 BNF 문법을 준수하여 기술한 선언(宣言)을 얻는 스텝과,
    상기 얻어진 선언마다 Def/Use함수를 정의하는 스텝과,
    상기 정의된 Def/Use함수간의 순서관계로부터 상기 선언사이의 순서관계를 얻는 스텝을 구비하는 것을 특징으로 하는 Lyee 지향 소프트웨어에 관한 정적분석방법.
  4. Lyee 방법론에 준거하여 소프트웨어를 생산하기 위해 단어마다의 정의식 및 입출력 속성을 포함하는 요구정의를 얻는 스텝과,
    상기 요구정의에 기초하여, 적어도 상기 단어에 관한 식별자, 상기 정의식 및 입출력 속성을 기술한 선언을 얻는 스텝과,
    상기 얻어진 선언(제 1 선언)으로부터, 그 선언에 관한 단어의 정의에 공헌하는 다른 선언(제 2 선언)을 유도하고, 상기 제 1 및 제 2 선언을 동일 선언군으로 하는 슬라이스(slice) 함수를 해당하는 모든 선언에 대해서 실행하는 스텝과,
    상기 슬라이스 함수로부터 서로 독립된 슬라이스를 얻는 스텝을 구비하는 것을 특징으로 하는 Lyee 지향 소프트웨어에 관한 정적분석방법.
  5. Lyee 방법론에 준거하여 소프트웨어를 생산하기 위해 단어마다의 정의식 및 입출력 속성을 포함하는 요구정의를 얻는 스텝과,
    상기 요구정의에 기초하여, 적어도 상기 단어에 관한 식별자, 상기 정의식 및 입출력 속성을 기술한 선언을 얻는 스텝과,
    상기 얻어진 선언에 대한 소정의 분석에 기초하여 상기 요구정의중의 버그를 검출하는 스텝을 구비하는 것을 특징으로 하는 Lyee 지향 소프트웨어에 관한 정적분석방법.
  6. 제 5 항에 있어서, 상기 선언에 대한 소정의 분석은, 비활성 선언, 사이클릭 (cyclic)선언, 불완전 선언, 혹은 여분 선언중의 적어도 어느 하나를 특정하는 것에 의한 것을 특징으로 하는 Lyee 지향 소프트웨어에 관한 정적분석방법.
  7. Lyee 방법론에 준거하여 소프트웨어를 생산하기 위해 단어마다의 정의식 및 입출력 속성을 포함하는 요구정의를 얻는 스텝과,
    상기 요구정의에 기초하여, 적어도 상기 단어에 관한 식별자, 상기 정의식 및 입출력 속성을 기술한 선언을 얻는 스텝과,
    상기 얻어진 선언, 그 선언중의 연산자 및 데이터에 대해서 각각 타입 대수(代數)를 정의하는 스텝과,
    상기 정의된 타입 대수에 대해서 관련지어진 환경 및 소정의 타입 규칙을 이용하여 상기 요구정의중의 타입 오류를 발견하는 스텝을 구비하는 것을 특징으로 하는 Lyee 지향 소프트웨어에 관한 정적분석방법.
  8. Lyee 방법론에 준거하여 소프트웨어를 생산하기 위해 단어마다의 정의식 및 입출력 속성을 포함한 요구정의를 얻는 스텝과,
    상기 요구정의에 기초하여, 적어도 상기 단어에 관한 식별자, 상기 정의식 및 입출력 속성을 기술한 선언을 얻는 스텝과,
    상기 얻어진 선언, 그 선언중의 연산자 및 데이터에 대해서 각각 타입 대수를 정의하는 스텝과,
    상기 정의된 타입 대수를 바탕으로, 소정의 환경 및 타입 규칙을 이용하여, 상기 요구정의중의 입력 단어로부터 중간 개재물 및 출력 단어의 타입을 생성하는 스텝을 구비하는 것을 특징으로 하는 Lyee 지향 소프트웨어에 관한 정적분석방법.
  9. Lyee 방법론에 준거하여 소프트웨어를 생산하기 위해 단어마다의 정의식 및 입출력 속성을 포함하는 요구정의를 얻는 스텝과,
    상기 요구정의에 기초하여, 적어도 상기 단어에 관한 식별자, 상기 정의식, 입출력 속성 및 시큐러티 라벨(security label)을 기술한 선언을 얻는 스텝과,
    상기 얻어진 선언중의 시큐러티 라벨간의 관계를 나타내는 래티스(lattice)를 이용하여, 상기 단어의 값에 시큐러티 라벨을 관련짓는 라벨 함수를 정의하는 스텝과,
    상기 정의된 라벨 함수를 바탕으로, 소정의 시큐러티 방침을 이용하여, 규정의 시큐러티 방침을 준수하지 않는 프로그램을 판단하는 스텝을 구비하는 것을 특징으로 하는 Lyee 지향 소프트웨어에 관한 정적분석방법.
KR1020057016947A 2003-03-10 2003-09-25 Lyee지향 소프트웨어에 관한 정적(靜的)분석방법 KR20050118177A (ko)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
JPJP-P-2003-00064220 2003-03-10
JP2003064220 2003-03-10

Publications (1)

Publication Number Publication Date
KR20050118177A true KR20050118177A (ko) 2005-12-15

Family

ID=32984464

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020057016947A KR20050118177A (ko) 2003-03-10 2003-09-25 Lyee지향 소프트웨어에 관한 정적(靜的)분석방법

Country Status (8)

Country Link
US (1) US20070006194A1 (ko)
EP (1) EP1637990A1 (ko)
JP (1) JPWO2004081788A1 (ko)
KR (1) KR20050118177A (ko)
CN (1) CN1788254A (ko)
AU (1) AU2003272890A1 (ko)
CA (1) CA2518498A1 (ko)
WO (1) WO2004081788A1 (ko)

Families Citing this family (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2003088119A1 (en) * 2002-04-08 2003-10-23 Topcoder, Inc. System and method for soliciting proposals for software development services
CN1856769A (zh) * 2003-09-22 2006-11-01 珂特那株式会社 软件生成方法
US7661097B2 (en) * 2005-04-05 2010-02-09 Cisco Technology, Inc. Method and system for analyzing source code
US7975257B2 (en) 2006-06-13 2011-07-05 Microsoft Corporation Iterative static and dynamic software analysis
US20080307397A1 (en) * 2007-06-08 2008-12-11 Bill Angell Program Analysis by Partial Emulation
JP2009237762A (ja) * 2008-03-26 2009-10-15 Toshiba Corp プログラム解析装置、プログラム解析方法および解析プログラム
US8527965B2 (en) * 2008-04-14 2013-09-03 Oracle America, Inc. Layered static program analysis framework for software testing
US8875100B2 (en) 2011-06-17 2014-10-28 Microsoft Corporation Pattern analysis and performance accounting
US8984495B2 (en) 2013-01-03 2015-03-17 International Business Machines Corporation Enhanced string analysis that improves accuracy of static analysis
US9256512B1 (en) 2013-12-13 2016-02-09 Toyota Jidosha Kabushiki Kaisha Quality analysis for embedded software code
US10275333B2 (en) 2014-06-16 2019-04-30 Toyota Jidosha Kabushiki Kaisha Risk analysis of codebase using static analysis and performance data
US9535934B1 (en) * 2015-11-17 2017-01-03 International Business Machines Corporation Schema lifecycle manager
WO2018042520A1 (ja) * 2016-08-30 2018-03-08 三菱電機株式会社 プログラム編集装置、プログラム編集方法及びプログラム編集プログラム

Family Cites Families (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH07239788A (ja) * 1994-02-28 1995-09-12 Hokuriku Nippon Denki Software Kk 不要変数型宣言チェック機能付きコンパイラ
JP3650649B2 (ja) * 1995-06-16 2005-05-25 松下電器産業株式会社 最適化装置
JPH0950379A (ja) * 1995-08-09 1997-02-18 Atr Tsushin Syst Kenkyusho:Kk プログラム意味保存コード移動装置
US6532586B1 (en) * 1995-10-30 2003-03-11 Information System Development Institute Software producing method, processor, processing method and recording medium
EP0859313A4 (en) * 1995-10-30 1999-01-13 Fumio Negoro PROCESS, PROCESSOR AND RECORDING MEDIUM FOR THE PRODUCTION OF SOFTWARE
KR0179794B1 (ko) * 1995-12-28 1999-03-20 문정환 반도체 소자의 웰 형성방법
JPH10307727A (ja) * 1997-05-08 1998-11-17 Nec Corp ソフトウェア構築装置及び型チェック方法
CA2324455A1 (en) * 1998-03-20 1999-09-30 Information System Development Institute Apparatus for producing software and method for producing software
JP2001005651A (ja) * 1999-06-21 2001-01-12 Institute Of Computer Based Software Methodology & Technology ソフトウェアの決定方法、ソフトウェアの使用方法、記録媒体、処理装置、ソフトウェアの保守方法、ソフトウェアの移植方法、ソフトウェアの管理方法、処理経路図の作成方法、パレット関数の作成方法、パレットの領域の決定方法、パレット連鎖関数の作成方法、位相要素の作成方法、論理要素の作成方法、作用要素の作成方法、ソフトウェアの実装方法、ソフトウェア開発方法、データ構造の置換方法、データ値の置換方法、従来型プログラムの分析方法、ソフトウェア開発管理方法、ソフトウェアの運用管理方法、並列コンピュータ及び判断補助装置

Also Published As

Publication number Publication date
CA2518498A1 (en) 2004-09-23
WO2004081788A1 (ja) 2004-09-23
AU2003272890A8 (en) 2004-09-30
AU2003272890A1 (en) 2004-09-30
JPWO2004081788A1 (ja) 2006-06-15
US20070006194A1 (en) 2007-01-04
EP1637990A1 (en) 2006-03-22
CN1788254A (zh) 2006-06-14

Similar Documents

Publication Publication Date Title
Grune et al. Modern compiler design
Leung et al. Interactive parser synthesis by example
Meyerovich et al. Parallel schedule synthesis for attribute grammars
KR20050118177A (ko) Lyee지향 소프트웨어에 관한 정적(靜的)분석방법
Kameyama et al. Combinators for impure yet hygienic code generation
Mokhov et al. Selective applicative functors
Stanier et al. A study of irreducibility in C programs
Lubin et al. How statically-typed functional programmers write code
Cassano et al. A scalable and extensible approach to benchmarking nl2code for 18 programming languages
Mogensen Programming Language Design and Implementation
Metzger et al. Automatic algorithm recognition and replacement: a new approach to program optimization
Touati et al. On the decidability of phase ordering problem in optimizing compilation
Sauthoff Bellman's GAP: a 2nd generation language and system for algebraic dynamic programming
Hu et al. DeGPT: Optimizing Decompiler Output with LLM
Soltenborn et al. Towards test-driven semantics specification
Mejri et al. Static analysis on lyee-oriented software
Stanier Removing and restoring control flow with the value state dependence graph
Paszke et al. Tensors fitting perfectly
Pierce Type Systems and Programming Languages
H. Padmanabha et al. Advances in Automated Pedagogical Compile-time Error Repair
Li et al. Using GGNN to recommend log statement level
Skystedt A New Synthesis Tool for Agda
Mendoza Efficient SMT-based Verification of Software Programs
Hughes et al. Reasoning about programs via operational semantics: requirements for a support system
van Staden et al. Parsing Semi-structured Languages: A Crochet Pattern to Diagram Translation

Legal Events

Date Code Title Description
WITN Application deemed withdrawn, e.g. because no request for examination was filed or no examination fee was paid