의도적 프로그래밍
Intentional programming![]() |
프로그래밍 패러다임 |
---|
컴퓨터 프로그래밍에서 의도적 프로그래밍은 Charles Simonyi에 의해 개발된 프로그래밍 패러다임으로 프로그래머(또는 사용자)가 작업을 구상할 때 염두에 둔 정확한 의도를 소프트웨어 소스 코드로 인코딩합니다.프로그래머가 생각하는 적절한 수준의 추상화를 사용함으로써 컴퓨터 프로그램의 작성과 유지보수가 쉬워집니다.의도에 대한 우려와 그 조작 방법을 분리함으로써 소프트웨어는 보다 모듈화되어 보다 재사용 가능한 소프트웨어 코드가 가능해집니다.
의도적 프로그래밍은 마이크로소프트 리서치 팀을 이끈 마이크로소프트의 전 수석 설계자 찰스 시모니에 의해 개발되었습니다.이 팀은 패러다임을 개발하고 이 패러다임을 나타내는 IP(Integrated Programming)라고 불리는 통합 개발 환경(IDE)을 구축했습니다.Microsoft는 2000년대 초에 C#과 를 롤아웃하고 있었기 때문에 의도적인 프로그래밍 패러다임을 제품화하지 않기로 결정했습니다.Java 채택에 [1]대응하기 위한 NET.Charles Simonyi는 마이크로소프트의 승인을 받아 마이크로소프트에서 아이디어를 꺼내 직접 상용화하기로 결정했습니다.그는 이를 위해 Intentional Software라는 회사를 설립했습니다.Microsoft는 Simonyi가 Microsoft에 있을 때 취득한 의도적 프로그래밍 특허를 의도적 소프트웨어에 라이선스했습니다.
Microsoft Research에서 개발된 의도적 프로그래밍의 개요는 Generative Programming 11장에 나와 있습니다. 메서드, 도구 및 응용 프로그램.[2]
개발 주기
Simonyi가 구상한 대로 의도적 프로그래밍 패러다임을 통한 새로운 애플리케이션 개발은 다음과 같습니다.프로그래머는 주어진 문제 영역(생산성 애플리케이션이나 생명 보험 등)에 대한 비즈니스 지식의 스키마 및 표기법을 지원하는 WYSIWYG와 같은 환경을 구축합니다.그런 다음 사용자는 이 환경을 사용하여 자신의 의도를 캡처하고 높은 수준의 추상화로 기록합니다.환경은 이러한 목적에 따라 작동할 수 있으며 사용자가 스프레드시트와 유사하게 처리 및 실행할 수 있는 의미론적으로 더 풍부한 문서를 작성할 수 있도록 지원합니다.기록된 지식은 평가자에 의해 실행되거나 최종 프로그램을 생성하기 위해 컴파일됩니다.연속적인 변경은 WYSIWYG 레벨에서만 이루어집니다.워드프로세서, 스프레드시트 또는 프레젠테이션 소프트웨어와 달리 의도적인 환경은 표현해야 할 의도의 구조와 의미에 대해 더 많은 지원을 제공하며 사용자가 달성하려고 하는 것을 보다 풍부하게 캡처하는 대화형 문서를 작성할 수 있습니다.특별한 경우는, 컨텐츠가 프로그램 코드이며,[3] 환경이 인텔리전트 IDE가 되는 경우입니다.
소스 코드 저장 및 프레젠테이션 분리
의도적 프로그래밍의 장점은 의도를 포착하는 도메인 코드가 소스 코드 텍스트 파일에 저장되지 않고 트리 기반 스토리지(바이너리 또는 XML일 수 있음)에 저장된다는 것입니다.스토리지 형식과 환경을 긴밀하게 통합하면 소스 코드에 대한 데이터베이스 정규화의 몇 가지 뛰어난 기능이 제공됩니다.각 정의에 고유한 ID를 지정하고 변수와 연산자의 이름을 정확히 한 곳에 저장함으로써 중복성이 제거됩니다.이것에 의해, 선언과 참조를 본질적으로 구별하는 것이 용이하게 되어, 환경에 의해서 다른 표시가 가능하게 됩니다.
프로그램의 공백도 소스 코드의 일부로 저장되지 않으며 프로젝트에서 작업하는 각 프로그래머는 소스의 들여쓰기 표시를 선택할 수 있습니다.보다 급진적인 시각화에는 문 목록을 중첩 상자로 표시하거나, 조건식을 논리 게이트로 편집하거나 중국어로 이름을 다시 렌더링하는 작업이 포함됩니다.
이 시스템은 C++나 Java와 같은 일반적인 언어에 정규화된 언어를 사용하며, 환경 사용자는 이러한 언어를 에펠이나 다른 언어의 아이디어와 혼합하여 사용할 수 있습니다.도메인 고유의 언어를 통한 언어 지향 프로그래밍 및 측면 지향 프로그래밍과 같은 맥락에서 자주 언급되는 IP는 생성 프로그래밍에서 획기적인 발전을 제공하는 것을 주장합니다.이러한 기술을 통해 개발자는 새로운 언어를 위한 완전한 컴파일러 및 에디터 작성에 투자하지 않고도 언어 환경을 확장하여 도메인별 구성을 캡처할 수 있습니다.
프로그래밍 예시
1 ~ 10 의 숫자를 써넣는 Java 프로그램은, 다음과 같습니다.
위해서 (인트 i = 1; i <=> 10; i++) { 시스템..나가..인쇄("번호는 " 입니다. + i); }
위의 코드는 대부분의 프로그래밍 언어의 공통 구조인 bounded loop을 포함하고 있습니다. 이 경우, 이 코드는for
건설하다.이 코드는 컴파일, 링크, 실행 시 10회 반복되며 출력 후 매번 i 값이 증가합니다.
그러나 이 코드는 프로그래머의 의도, 즉 "숫자 1~10"을 인쇄하는 의도를 담고 있지 않습니다.이 간단한 경우, 프로그래머가 코드를 유지하도록 요청하면 그것이 무엇을 의도하는지 알 수 있지만, 항상 그렇게 쉬운 것은 아닙니다.여러 줄 또는 페이지에 걸쳐 있는 루프는 특히 원래 프로그래머가 불분명한 라벨을 사용하는 경우 이해하기 어려울 수 있습니다.전통적으로 코드의 의도를 나타내는 유일한 방법은 소스 코드 코멘트를 추가하는 것이었지만 코멘트가 추가되지 않거나 불분명하거나 원래 설명한 소스 코드와 동기화되지 않는 경우가 많습니다.
의도적인 프로그래밍 시스템에서는 위의 루프가 어떤 수준에서는 다음과 같은 명백한 것으로 표현될 수 있습니다.print the numbers 1 to 10
". 그러면 시스템은 소스 코드를 생성하기 위한 의도를 사용합니다. 이는 위의 코드와 매우 유사한 것일 수 있습니다.중요한 차이점은 의도적인 프로그래밍 시스템이 소스 코드가 결여된 의미 수준을 유지하고 더 큰 프로그램에서 가독성을 크게 완화시킬 수 있다는 것입니다.
대부분의 언어에는 특정 종류의 추상화를 캡처하는 메커니즘이 포함되어 있지만, 리스프 어족과 같이 IP는 완전히 새로운 메커니즘을 추가할 수 있습니다.따라서 개발자가 C와 같은 언어로 시작한다면 컴파일러 개발자가 추가하기를 기다리지 않고 C++와 같은 기능으로 언어를 확장할 수 있습니다.유추하자면, 프로그래머들은 단순한 클래스와 프로시저보다 훨씬 더 강력한 표현 메커니즘을 사용할 수 있다.
신원
IP는 아이덴티티 개념에 초점을 맞춥니다.대부분의 프로그래밍 언어는 소스 코드를 일반 텍스트로 나타내기 때문에 오브젝트는 이름으로 정의되며 그 고유성은 컴파일러에 의해 추론되어야 합니다.예를 들어, 동일한 기호 이름을 사용하여 다른 변수, 프로시저 또는 유형의 이름을 지정할 수 있습니다.여러 페이지에 걸쳐 있는 코드(글로벌하게 볼 수 있는 이름의 경우, 여러 파일의 경우)에서는 어떤 기호가 실제 개체를 가리키는지 구별하기가 매우 어렵습니다.이름이 변경된 경우 사용되는 코드를 주의 깊게 검토해야 합니다.
반면 IP 시스템에서는 모든 정의가 심볼 이름뿐만 아니라 개체에 고유한 개인 식별자를 할당합니다.즉, IP 개발 환경에서는 변수 또는 프로시저에 대한 모든 참조가 단순한 이름이 아니라 원래 엔티티에 대한 링크임을 의미합니다.
이것의 주요 장점은 엔티티의 이름이 변경되어도 프로그램에서 엔티티에 대한 모든 참조가 유효하다는 것입니다(참조 무결성이라고 합니다).이것은, 다른 네임스페이스의 일의의 정의에 같은 이름을 사용하는 경우(예를 들면 「」.to_string()
" )는 이름이 같지만 ID가 다른 참조는 현재 편집기에서 검색/바꾸기가 발생할 수 있으므로 이름이 변경되지 않습니다.또한 이 기능을 통해 프로그램의 다국어 버전을 쉽게 만들 수 있습니다. 모든 정의에 대한 영어 이름 집합과 일본어 이름 집합을 자유롭게 스왑할 수 있습니다.
프로그램의 정의된 모든 오브젝트에 대해 고유한 ID를 가지면 버전 관리 시스템에서 코드 체크인을 단순화할 뿐만 아니라 자동화된 리팩터링 작업을 쉽게 수행할 수 있습니다.예를 들어, 많은 현재의 코드 콜라보레이션 시스템(예를 들어 Git)에서, 두 프로그래머가 충돌하는 변경을 할 때(즉, 한 프로그래머가 함수의 행 중 하나를 변경하는 동안 다른 프로그래머가 오래된 함수를 수정하는 동안 다른 프로그래머는 새로운 함수를 만들었다고 생각할 것이다.IP 버전 관리 시스템에서는 한 프로그래머는 이름만 바꾸고 다른 프로그래머는 코드를 변경했다는 것을 알 수 있습니다.
상세 수준
IP 시스템은 또한 프로그래머가 "확대"하거나 "축소"할 수 있도록 여러 수준의 세부 정보를 제공합니다.위의 예에서 프로그래머는 다음과 같은 레벨을 얻기 위해 축소할 수 있습니다.
<<번호 1~10을 인쇄합니다>>
따라서 IP 시스템은 크게 자기 문서화되어 프로그래머가 프로그램 전체의 높은 수준의 그림을 유지할 수 있습니다.
유사 작품
유사한 아이디어를 활용하여 더 높은 수준의 추상화를 가진 코드를 만드는 프로젝트가 있습니다.그 중 하나는 다음과 같습니다.
- 개념 프로그래밍
- 언어 지향 프로그래밍(LOP)
- 도메인 고유 언어(DSL)
- 프로그램 변환
- 의미 지향 프로그래밍(SOP)
- 리터럴 프로그래밍
- 모델 주도 아키텍처(MDA)
- 소프트웨어 팩토리
- 메타프로그래밍
- 리스프(프로그래밍 언어)
「 」를 참조해 주세요.
레퍼런스
- ^ 「Simonyi씨는, 「Microsoft가 로 큰 발전을 하고 있었을 때는, 그것은 비실용적이었습니다.가까운 장래에, 같은 조직으로부터 「이렇게 하면 안 된다.이러한 방법으로 일을 하면 어떻게 될까?」(「Anything You Can Do, I Can Do Meta」의 인용, 2007년 1월 9일(화) Scott Rosenberg, 테크놀로지 리뷰).2020년 9월 20일 아카이브에서 아카이브 완료.오늘)
- ^ 생성 프로그래밍: Krzystof Chzarnecki와 Ulrich Eisenecker, Addison-Wesley, Reading, MA, USA, 2000년 6월.
- ^ Scott Rosenberg: "네가 할 수 있는 것은 무엇이든, 나는 메타를 할 수 있다."테크놀로지 리뷰, 2007년1월 8일2020년 9월 20일 아카이브에서 아카이브 완료.
외부 링크
- 의도적인 소프트웨어 - Charles Simonyi의 회사
- 컴퓨터 언어의 죽음, 의도적인 프로그래밍의 탄생, Charles Simonyi의 기술 보고서(1995)
- 의도적 프로그래밍 - 레거시 시대의 혁신, Charles Simonyi(1996)의 강연
- Edge.org Charles Simonyi 인터뷰 (참조자: John Brockman)
- 언어 워크벤치: 도메인 고유의 언어를 위한 Killer-App? - 의도적인 프로그래밍을 예로 든 일반적인 도구 클래스에 대한 Martin Fowler의 기사.
- "Anything You Can Do, I Can Do Meta" 2007년 1월 9일 화요일 Scott Rosenberg, Technology Review
- 모두가 소프트웨어를 쓸 날을 기다리다, 뉴욕타임스, 2007년 1월 28일
- 프로그래밍은 암호화의 한 형태인가? Charles Simonyi(2005)
- Charles Simonyi(2005)의 적절한 추상화 수준
- Charles Simonyi(2005)의 프로그램 정보 내용
- Charles Simonyi(2005)에 의해 유해하다고 생각되는 기능 X
- 표기법과 프로그래밍 언어, Charles Simonyi(2005)
- Mark Edel(2005)에 의한 개발자로부터의 개인적인 관찰
- Microsoft Research의 의도적 프로그래밍 시스템을 소개하는 교육 비디오(ASF 형식, 1998년 경, 20메가바이트)