본문 바로가기

Book

제너레이티브 프로그래밍 단상.

Generative Programming

전부 다 읽은뒤 정리하고 싶지만 , 보면서 느낀 지적쾌감을 미리 메모하는 측면에서 쓰는글.
(책이 일본어라 일본어적인 표현이 있을수있음)

제너레이티브 프로그래밍의 정의

제너레이티브 프로그래밍은 , 소프트웨어 시스템 패밀리 의 모델링에 기반으로 소프트웨어 공학의 패러다임입니다.
 부여된 특정한 요구사양을 기초로 , 구성의 지식을 만들어 내고 , 재이용가능한 기본부분을 사용해서 , 커스터마이징화하는 한편 최적화된 중간또는 최종제품을 자동적으로 생성합니다.

*일본어로 어색하게 번역되어있군요. 영문을 보고싶네요.

제너레이티브 도메인 모델(generative domain model)

문제공간(問題空間)
 - 도메인 고유의 개념
 - 피쳐 (feature) (특징)

구성의 지식(構成の知識)
 - 피쳐의 부적절한 조합 : 선루프가 없는 모델에 선루프를 옵션으로하는일들
 - 디폴트 설정             : 선루프를 선택하면 옵션에서 사라짐
 - 디폴트 의존관계       : DC엔진의 전기자동차는 기어변속기가없음
 - 구축룰
 - 최적화                   : 엔진의 퍼포먼스를 최적화한다.

해결공간(解決空間)
 - 기본컴포턴트
 - 조합의 최대화
 - 용장성의 최소화(쓸때없는 부분을 줄임)

기본적인 개념은 문제공간 -> 구성지식 -> 해결공간 의 프로세스를 거쳐 제품을 생산하는데있다.

------------------------------------------------------------------------------------
문제공간을 정의하기 위해서는 도메인을 분석해야하는데 이때 도메인공학을 이용할수 있습니다.
도메인공학
도메인공학은 , 특정의 도메인시스템또는 시스템의 일부의 구축에관한 과거의 경험을 재사용가능한자산으로서 모은뒤,정리하고,축적하는것입니다. 또, 새로운 시스템을 구축할때 축적된 자산을 재이용하는 단계로도 있습니다.
도메인공학은 도메인분석 -> 도메인 설계 -> 도메인 실장(구현)의 단계를 거칩니다.
이것은 어플리케이션공학의 요구분석->생산 컨피규레이션 -> 결합및테스트 의 순서와 매칭됩니다.

부연하여 설명하자면

도메인분석->요구분석 ,
도메인설계 와 구현 + (커스텀설계 , 커스텀구현) -> 생산컨피규레이션 ,결합테스트

*이부분은 아직 제 이해가 부족하여 틀릴수도 있습니다.
------------------------------------------------------------------------------------------

도메인공학과 오브젝트지향분석설계방법(OOAD)과의 관계

도메인공학은 OOAD와 밀접한 관계를 맺고있는데 , 특히 도메인공학의 분석은 OOAD에서
분석 , 설계를 보완하는 역활을 합니다.
------------------------------------------------------------------------------------------

제너레이터를 개발하는 기술

1. stand alone프로그램으로서 제너레이터를 개발
   프로그램내부에서 프로그램을 분석하여 프로그램을 생산하는방식.
  예를들면 미리 지정된 룰로서 표현된 소스코드를 lexer,parser를 이용 분석하고 새로운 코드를 생산합니다.
 
2. 프로그래밍언어로 내장된 메타프로그래밍능력을 사용하여 제너레이터를 개발한다.
    예, C++ 템플릿메타프로그래밍 , 자바 제너릭 etc..

3. 제너레이터의 인프라를 사용 제너레이터를 개발한다.
    이것은 이해가 부족하기에 원문을 옮깁니다.
    제너레이터를개발하는 가장 타당한 어프로치는 , 제너레이타를 개발하기위해 기본적인 기능이 모두 준비된 공통의 인프라를 사용하는것입니다. 이것은 공통의 내부소스표현과 이 표현을 부호화하고 변형하기위한 표준의 조작방법을 갖고있습니다. 이상적으로는 제너레이터는 (최적화와 소스to소스 변형을 포함)임의의 변형을 개발가능하는 기능을 서포트해야합니다. 이런 기능을 갖고변형시스템에 관해 9.7절에서 설명합니다.

그리고 , 이 인프라는 입출력을 적절히 생성하는 (예를들면 파서/언파서,혹은 입출력을 직접 편집가능)기능과 제너레이터가 구현한 복수의 표기법을 디버그하는 기능등을 서포트해야합니다. 또 이 인프라는 제너레이터를 개발하는 작업도 적절히 서포트해야합니다.
예를들면 메타코드를 디버그하는 기능이 준비된 편이 좋습니다.
인텐션프로그래밍시스템은 이런 인프라의 일예입니다. 이것에 관해서는 1장에서 검토합니다.

*이것도 영어번역을 직역한듯. 인텐션프로그래밍(의도적프로그래밍, 이클립스의 자동완성기능 같은것을의미하는듯.)
------------------------------------------------------------------------------------------

단상.

프로그래밍을 자동화하기 위해서 다른 분야에서 이미 정립화되어있는 프로세스(예 자동차)를
모방하여 발전시켜나가고 있는듯하다.

앞으로
1. 도메인을 분석하고 분류하는 지식과
2. 도메인의 제약조건에 관련된 지식
3. 그리고 1과2를 이용하여 생산하는 지식

위의 3가지가  축적되어가면 자동화는 멀지않은것처럼 보인다.(가정형이다!)