의도적 프로그래밍
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
의도적 프로그래밍은 프로그래머가 애플리케이션의 의도를 높은 수준으로 표현하고, 시스템이 이를 처리하여 실행 가능한 코드를 생성하는 프로그래밍 패러다임이다. 개발 과정은 문제 영역에 특화된 환경을 구축하고, 사용자의 의도를 포착하여, 자동화된 시스템으로 최종 프로그램을 생성하는 방식으로 진행된다. 이 방식은 소스 코드의 저장 및 표현 방식을 분리하여, 코드의 가독성과 유지 보수성을 향상시키며, 고유한 식별자를 통해 참조 무결성을 보장한다. 의도적 프로그래밍은 자동 문서화 및 다양한 수준의 상세 정보를 제공하며, 개념 프로그래밍, 언어 지향 프로그래밍, 도메인 특화 언어 등과 유사한 기술과 연관되어 있다.
더 읽어볼만한 페이지
의도적 프로그래밍 | |
---|---|
개요 | |
유형 | 프로그래밍 패러다임 |
특징 | 프로그래머의 의도를 명확하게 표현 |
목표 | 추상화 수준 향상 코드 재사용성 증대 개발 생산성 향상 |
관련 개념 | 메타 프로그래밍 생성적 프로그래밍 도메인 특화 언어 (DSL) |
상세 내용 | |
설명 | 의도적 프로그래밍은 프로그래머가 원하는 결과나 목표를 명시적으로 표현하고, 시스템이 이를 달성하기 위한 최적의 방법을 자동으로 생성하거나 선택하도록 하는 프로그래밍 패러다임이다. |
장점 | 코드의 가독성 및 유지보수성 향상 복잡한 문제에 대한 추상화 수준 향상 다양한 환경에 대한 코드 재사용성 증대 |
단점 | 시스템 복잡성 증가 가능성 자동 생성 또는 최적화 과정에 대한 이해 필요 기존 프로그래밍 방식과의 호환성 문제 발생 가능성 |
활용 분야 | |
예시 | 소프트웨어 생성 시스템 자동화된 코드 최적화 도메인 특화 언어 (DSL) 개발 |
참고 자료 | |
관련 서적 | 생성적 프로그래밍: 방법, 도구 및 응용 |
관련 기사 | 무엇이든 할 수 있어: 메타 프로그래밍의 약속 |
2. 개발 과정
찰스 시모니가 구상한 의도적 프로그래밍 개발 방식은 특정 문제 영역(예: 생명 보험)에 대한 비즈니스 지식을 바탕으로 WYSIWYG와 유사한 환경을 구축하는 것에서 시작한다.[3] 이후 해당 영역 전문가와 프로그래머가 협력하여 애플리케이션 작동 방식을 기술하고, 이를 바탕으로 자동화 시스템이 최종 프로그램을 생성한다.[6]
2. 1. 도메인 특화 환경 구축
프로그래머는 주어진 문제 영역(예: 생명 보험)에 대한 비즈니스 지식의 스키마와 표기법을 지원하는 WYSIWYG와 유사한 환경을 구축한다. 사용자는 이 환경을 사용하여 의도를 포착하며, 이는 높은 수준의 추상화로 기록된다. 이 환경은 이러한 의도를 처리하고 사용자가 스프레드시트와 유사하게 처리하고 실행할 수 있는 의미적으로 더 풍부한 문서를 만드는 데 도움을 줄 수 있다.[3]기록된 지식은 평가자에 의해 실행되거나 최종 프로그램을 생성하기 위해 컴파일된다. 후속 변경 사항은 WYSIWYG 수준에서만 수행된다. 워드 프로세서, 스프레드시트 또는 프레젠테이션 소프트웨어와 달리, 의도적 환경은 표현하려는 의도의 구조와 의미에 대한 더 많은 지원을 제공하며, 사용자가 달성하려는 바를 더 풍부하게 포착하는 대화형 문서를 만들 수 있다. 내용이 프로그램 코드일 경우, 환경은 지능형 IDE가 된다.[3]
시모니의 구상에 따르면, 프로그래머는 먼저 문제의 대상 영역(예: 생명 보험 등)에 특화된 툴 박스를 구축한다. 이후 해당 영역의 전문가가 프로그래머와 협력하여 WYSIWYG 방식으로 애플리케이션이 어떻게 동작해야 하는지를 기술한다. 마지막으로 해당 프로그램에 관한 기술과 툴 박스를 사용하여 자동화 시스템이 최종적인 프로그램을 생성한다. 그 이후의 변경은 WYSIWYG 레벨에서만 이루어지며, "도메인 워크벤치"라고 불리는 시스템을 이용한다.[6]
2. 2. 사용자 의도 포착
프로그래머는 주어진 문제 영역(생산성 애플리케이션 또는 생명 보험 등)에 대한 비즈니스 지식의 스키마와 표기법을 지원하는 WYSIWYG와 유사한 환경을 구축한다. 그런 다음 사용자는 이 환경을 사용하여 의도를 포착하며, 이는 높은 수준의 추상화로 기록된다. 이 환경은 이러한 의도를 처리하고 사용자가 스프레드시트와 유사하게 처리하고 실행할 수 있는 의미적으로 더 풍부한 문서를 만드는 데 도움을 줄 수 있다.[3] 기록된 지식은 평가자에 의해 실행되거나 최종 프로그램을 생성하기 위해 컴파일된다. 후속 변경 사항은 WYSIWYG 수준에서만 수행된다.[3][6]2. 3. 자동화된 프로그램 생성
기록된 지식은 평가자에 의해 실행되거나 최종 프로그램을 생성하기 위해 컴파일된다. 이후 변경은 WYSIWYG 수준에서만 수행된다.[3] 시모니의 구상에 따르면, 의도적 프로그래밍의 패러다임을 사용한 애플리케이션 개발은 WYSIWYG 방식(What You See Is What You Get)으로 이루어지며, 이후의 변경은 "도메인 워크벤치"라고 불리는 시스템을 이용한다.[6]3. 소스 코드 저장 및 표현 방식의 분리
의도적 프로그래밍(IP)은 소스 코드를 텍스트 파일이 아닌 트리 기반 저장소(이진 또는 XML)에 저장하여 데이터베이스 정규화와 유사한 이점을 제공한다.
IP는 C++, Java 등 널리 사용되는 언어에 대해 정규화된 언어를 사용하며, Eiffel 등 다른 언어의 아이디어를 혼합하여 사용할 수 있게 한다. 도메인 특화 언어를 통한 언어 지향 프로그래밍 및 관점 지향 프로그래밍과 같은 맥락에서 IP는 생성적 프로그래밍의 발전을 가져온다고 주장한다. 개발자는 새로운 언어를 위한 컴파일러 및 편집기를 작성하지 않고도 언어 환경을 확장하여 도메인별 구문을 캡처할 수 있다.
3. 1. 고유 식별자 부여
의도적 프로그래밍은 각 정의에 고유한 정체성을 부여하고, 변수와 연산자의 이름을 한 곳에만 저장하여 중복을 제거한다. 이를 통해 선언과 참조를 쉽게 구별할 수 있으며, 환경은 이를 다르게 표시할 수 있다. 이는 관계 정규화가 이루어진 것으로 볼 수 있다.[1]3. 2. 유연한 표현 방식
프로그램의 공백 문자는 소스 코드의 일부로 저장되지 않으며, 프로젝트에 참여하는 각 프로그래머는 소스의 들여쓰기 스타일 표시를 선택할 수 있다. 더 급진적인 시각화에는 구문 목록을 중첩된 상자로 표시하거나, 조건식을 논리 게이트로 편집하거나, 이름을 중국어로 다시 렌더링하는 것이 포함된다.[1]3. 3. 참조 무결성 보장
의도적 프로그래밍에서 소스 코드는 단순한 텍스트 파일이 아닌 고유한 메타 구조를 가진다. 이는 XML과 유사하게 코드의 각 부분에 특별한 구문 분석이 필요하지 않으며, 이들이 모여 프로그램을 형성하게 한다. 에디터와 소스 코드 구조가 밀접하게 관련되어 소스 코드에 일종의 관계 정규화가 이루어지며, 동일성 개념에 의해 정의나 변수명, 연산자 등은 항상 하나만 존재하도록 저장되어 중복성이 배제된다. 따라서 선언과 참조는 본질적으로 구별되며, 보기에도 명확하게 표시된다. 이러한 특성 덕분에 엔티티의 이름이 변경되어도 프로그램 내의 모든 참조는 유효하게 유지된다.4. 프로그래밍 예시
의도적 프로그래밍(IP)은 프로그래머의 의도를 코드에 명확하게 반영하여 가독성과 유지보수성을 높이는 것을 목표로 한다.
기존 코드는 프로그래머의 의도를 명확하게 담고 있지 않지만, IP에서는 "1부터 10까지의 숫자를 출력"과 같이 의도를 명확하게 표현하고, 시스템은 이 의도를 사용하여 소스 코드를 생성한다.
IP는 대부분의 프로그래밍 언어가 제공하는 추상화 메커니즘 외에, Lisp 계열 언어처럼 완전히 새로운 메커니즘을 추가할 수 있게 해준다.
4. 1. 기존 코드의 한계
다음은 1부터 10까지의 숫자를 출력하는 자바 프로그램 예시이다.```java
for (int i = 1; i <= 10; i++) {
System.out.println("the number is " + i);
}
```
위 코드는 대부분의 프로그래밍 언어에서 흔히 사용되는 제한된 반복문(
for
구문)으로 표현된다. 이 코드는 컴파일, 링크 및 실행되면 10번 반복되며, 출력한 후 매번 ''i''의 값을 증가시킨다.그러나 이 코드는 프로그래머의 "의도", 즉 "1부터 10까지의 숫자를 출력"하는 것을 명확하게 나타내지 못한다. 이 간단한 예시에서는 코드를 유지보수하는 프로그래머가 이 코드가 무엇을 하려는지 파악할 수 있지만, 항상 쉬운 것은 아니다. 여러 줄 또는 페이지에 걸쳐 확장되는 반복문은 특히 원래 프로그래머가 모호한 레이블을 사용하는 경우 이해하기 매우 어려워질 수 있다.
전통적으로 코드의 의도를 나타내는 유일한 방법은 소스 코드 주석을 추가하는 것이었지만, 주석이 추가되지 않거나, 모호하거나, 원래 설명했던 소스 코드와 동기화되지 않는 경우가 많다.
4. 2. 인텐셔널 프로그래밍의 접근 방식
의도적 프로그래밍 시스템에서는 반복문을 "1부터 10까지의 숫자를 출력"과 같이 명확하게 표현할 수 있다. 그러면 시스템은 의도를 사용하여 소스 코드를 생성하며, 이는 자바 등에서 사용되는 `for` 구문과 매우 유사한 형태를 가질 것이다. 핵심적인 차이점은 의도적 프로그래밍 시스템이 소스 코드에는 없는 의미적 수준을 유지하며, 이는 더 큰 프로그램에서 가독성을 극적으로 향상시킬 수 있다는 것이다.대부분의 프로그래밍 언어는 특정 종류의 추상화를 포착하는 메커니즘을 포함하고 있지만, 인텐셔널 프로그래밍(IP)은 Lisp 계열 언어처럼 완전히 새로운 메커니즘을 추가할 수 있다. 따라서 개발자가 C와 같은 언어로 시작한 경우, 컴파일러 개발자가 기능을 추가할 때까지 기다리지 않고 C++와 같은 기능을 언어에 추가할 수 있다. 이는 프로그래머가 단순한 클래스 및 프로시저보다 훨씬 강력한 표현 메커니즘을 사용할 수 있게 됨을 의미한다.
5. 동일성 (Identity)
의도적 프로그래밍(IP)은 객체의 동일성 개념에 중점을 둔다. 대부분의 프로그래밍 언어는 소스 코드를 일반 텍스트로 표현하므로, 객체는 이름으로 정의되며 고유성은 컴파일러가 추론해야 한다. 예를 들어, 동일한 기호 이름을 사용하여 다른 변수, 프로시저, 유형을 명명할 수 있다. 여러 페이지에 걸쳐 있거나 전역적으로 보이는 이름의 경우, 어떤 기호가 어떤 실제 객체를 참조하는지 파악하기가 매우 어려워질 수 있다. 이름이 변경되면 해당 이름을 사용하는 코드를 주의 깊게 검사해야 한다.[1]
반면 IP 시스템에서는 모든 정의에 기호 이름뿐만 아니라 객체에 고유한 식별자를 할당한다.
5. 1. 이름 변경 및 참조 관리
IP 시스템에서는 모든 정의에 기호 이름뿐만 아니라 객체에 고유한 개인 식별자를 할당한다. 즉, IP 개발 환경에서 변수나 프로시저에 대한 모든 참조는 단순한 이름이 아니라 원래 엔티티에 대한 링크이다.[1]이는 엔티티의 이름이 변경되더라도 프로그램 내에서 해당 엔티티에 대한 모든 참조가 유효하게 유지된다는 주요 장점을 가진다(참조 무결성).[1] 또한, 다른 네임스페이스 (예: "
.to_string()
")에서 고유한 정의에 동일한 이름을 사용하더라도, 현재 편집기에서 검색/바꾸기를 수행할 때와 같이 동일한 이름을 가지면서 다른 정체성을 가진 참조는 이름이 변경되지 않는다.[1] 이 기능은 프로그램의 다국어 버전을 쉽게 만들 수 있게 해준다.[1] 예를 들어, 모든 정의에 대한 영어 이름 집합과 필요에 따라 교체할 수 있는 일본어 이름 집합을 가질 수 있다.[1]프로그램에서 정의된 모든 객체에 고유한 정체성을 갖는 것은 자동화된 리팩토링 작업을 수행하고, 버전 관리 시스템에서 코드 체크인을 단순화하는 데에도 도움이 된다.[1] 예를 들어, Git과 같은 코드 협업 시스템에서 두 명의 프로그래머가 충돌하는 변경 사항을 커밋하는 경우(한 프로그래머가 함수의 이름을 바꾸고 다른 프로그래머가 해당 함수 내의 한 줄을 변경하는 경우), 버전 관리 시스템은 한 프로그래머가 새 함수를 만들고 다른 프로그래머가 이전 함수를 수정한 것으로 간주할 수 있다.[1] 그러나 IP 버전 관리 시스템에서는 한 프로그래머가 단순히 이름을 변경하고 다른 프로그래머가 코드를 변경한 것으로 정확하게 인식한다.[1]
5. 2. 다국어 지원
IP 시스템에서는 모든 정의에 기호 이름을 부여할 뿐만 아니라, 객체에 고유한 식별자를 부여한다. 이를 통해 프로그램의 다국어 버전을 쉽게 만들 수 있다. 예를 들어, 모든 정의에 대해 영어 이름 집합과 일본어 이름 집합을 만들어 필요에 따라 전환할 수 있다.[1]5. 3. 버전 관리 시스템과의 호환성
IP 시스템에서는 모든 정의에 기호 이름을 부여할 뿐만 아니라, 객체에 고유한 식별자를 할당한다. IP 개발 환경에서 변수나 프로시저를 참조할 때는 단순한 이름이 아니라, 원래 엔티티에 대한 링크를 사용한다.프로그램에서 정의된 모든 객체에 고유한 정체성을 부여하면 버전 관리 시스템에서 코드 체크인을 단순화할 수 있다. 예를 들어, Git과 같은 코드 협업 시스템에서는 두 명의 프로그래머가 충돌하는 변경 사항을 커밋하는 경우가 있다. 한 프로그래머가 함수의 이름을 변경하고, 다른 프로그래머가 해당 함수 내의 한 줄을 변경하는 경우, 버전 관리 시스템은 이를 한 프로그래머가 새 함수를 만들고 다른 프로그래머가 이전 함수를 수정한 것으로 잘못 해석할 수 있다. 그러나 IP 버전 관리 시스템에서는 한 프로그래머가 단순히 이름을 변경하고 다른 프로그래머가 코드를 변경한 것으로 정확하게 인식한다.
6. 상세 수준 (Levels of Detail)
인텐셔널 프로그래밍에서는 상세 수준을 여러 단계로 제공하여 프로그래머가 "줌 인(확대)"하거나 "줌 아웃(축소)"할 수 있다. 예를 들어, 위의 예에서는 줌 아웃하면 다음과 같은 표시가 된다.[1]
6. 1. 자동 문서화
IP 시스템은 여러 수준의 상세 정보를 제공하여 프로그래머가 "확대"하거나 축소할 수 있도록 한다. 예를 들어, 프로그래머는 축소하여 다음과 같은 수준을 얻을 수 있다.```text
<<1부터 10까지 숫자를 출력>>
```
따라서 IP 시스템은 상당 부분 자기 문서화되어 프로그래머가 프로그램 전체의 좋은 고수준 그림을 유지할 수 있도록 한다.[1]
7. 유사한 연구 및 기술
의도적 프로그래밍과 유사한 아이디어를 활용하여 더 높은 수준의 추상화를 가진 코드를 생성하는 프로젝트들이 있다.
- 개념 프로그래밍
- 언어 지향 프로그래밍 (LOP)
- 도메인 특화 언어 (DSL)
- 프로그램 변환
- 의미 지향 프로그래밍 (SOP)
- 문헌 프로그래밍
- 모델 기반 아키텍처 (MDA)
- 소프트웨어 팩토리
- 메타 프로그래밍
- Lisp (프로그래밍 언어)
7. 1. 개념 프로그래밍
비슷한 아이디어를 활용하여 더 높은 수준의 추상화를 가진 코드를 생성하는 프로젝트들이 있다. 그중에는 다음이 있다.- 개념 프로그래밍
- 언어 지향 프로그래밍 (LOP)
- 도메인 특화 언어 (DSL)
- 프로그램 변환
- 의미 지향 프로그래밍 (SOP)
- 문헌 프로그래밍
- 모델 기반 아키텍처 (MDA)
- 소프트웨어 팩토리
- 메타 프로그래밍
- Lisp (프로그래밍 언어)
7. 2. 언어 지향 프로그래밍 (LOP)
도메인 특화 언어 등과 같은 언어 지향 프로그래밍이나 관점 지향 프로그래밍과 같은 맥락에서 자주 언급된다. 인텐셔널 프로그래밍은 생성적 프로그래밍에 일종의 돌파구를 가져오려는 의도를 가지고 있다. 이러한 기법을 통해 개발자는 언어 환경을 확장하여 영역 고유의 구성 요소를 파악할 수 있으며, 이때 새로운 언어를 위한 컴파일러나 에디터를 처음부터 만들 필요가 없다.[1]7. 3. 도메인 특화 언어 (DSL)
도메인 특화 언어 (DSL)는 더 높은 수준의 추상화를 가진 코드를 생성하는 프로젝트 중 하나로, 의도적 프로그래밍과 비슷한 아이디어를 활용한다.[1]이는 C++나 Java와 같은 일반적인 언어에 XML 스키마적인 표준화를 한 것과 유사하며, Eiffel이나 다른 언어의 아이디어를 결합하여 이용할 수 있게 한다.[1] 도메인 특화 언어는 언어 지향 프로그래밍이나 관점 지향 프로그래밍과 같은 맥락에서 자주 언급된다.[1]
7. 4. 프로그램 변환
- 개념 프로그래밍
- 언어 지향 프로그래밍 (LOP)
- 도메인 특화 언어 (DSL)
- 프로그램 변환
- 의미 지향 프로그래밍 (SOP)
- 문헌 프로그래밍
- 모델 기반 아키텍처 (MDA)
- 소프트웨어 팩토리
- 메타 프로그래밍
- Lisp (프로그래밍 언어)
7. 5. 의미 지향 프로그래밍 (SOP)
의미 지향 프로그래밍(SOP)은 개념 프로그래밍, 언어 지향 프로그래밍(LOP), 도메인 특화 언어(DSL), 프로그램 변환, 문헌 프로그래밍, 모델 기반 아키텍처(MDA), 소프트웨어 팩토리, 메타 프로그래밍, Lisp 프로그래밍 언어 등과 함께 의도적 프로그래밍과 비슷한 아이디어를 활용하여 더 높은 수준의 추상화를 가진 코드를 생성하는 프로젝트 중 하나이다.7. 6. 문헌 프로그래밍
의도적 프로그래밍과 비슷한 아이디어를 활용하여 더 높은 수준의 추상화를 가진 코드를 생성하는 프로젝트들은 다음과 같다.- 개념 프로그래밍
- 언어 지향 프로그래밍 (LOP)
- 도메인 특화 언어 (DSL)
- 프로그램 변환
- 의미 지향 프로그래밍 (SOP)
- 모델 기반 아키텍처 (MDA)
- 소프트웨어 팩토리
- 메타 프로그래밍
- Lisp (프로그래밍 언어)
7. 7. 모델 기반 아키텍처 (MDA)
모델 기반 아키텍처 (MDA)7. 8. 소프트웨어 팩토리
다음은 의도적 프로그래밍과 비슷한 아이디어를 활용하여 더 높은 수준의 추상화를 가진 코드를 생성하는 프로젝트들이다.- 개념 프로그래밍
- 언어 지향 프로그래밍 (LOP)
- 도메인 특화 언어 (DSL)
- 프로그램 변환
- 의미 지향 프로그래밍 (SOP)
- 문헌 프로그래밍
- 모델 기반 아키텍처 (MDA)
- 메타 프로그래밍
- Lisp (프로그래밍 언어)
7. 9. 메타 프로그래밍
개념 프로그래밍, 언어 지향 프로그래밍(LOP), 도메인 특화 언어(DSL), 프로그램 변환, 의미 지향 프로그래밍(SOP), 문헌 프로그래밍, 모델 기반 아키텍처(MDA), 소프트웨어 팩토리, 메타 프로그래밍, Lisp (프로그래밍 언어) 등은 더 높은 수준의 추상화를 가진 코드를 생성하는 프로젝트들이다.7. 10. Lisp (프로그래밍 언어)
Lisp는 최초의 구현 중 하나에서 매크로 시스템을 통해 제한된 형태의 의도적 프로그래밍을 지원했다.[1]참조
[1]
뉴스
Anything You Can Do, I Can Do Meta
https://www.technolo[...]
Technology Review
2007-01-09
[2]
서적
Generative Programming: Methods, Tools, and Applications
Addison-Wesley
2000-06-01
[3]
뉴스
Anything You Can Do, I Can Do Meta
https://www.technolo[...]
Technology Review
2007-01-08
[4]
뉴스
Part II: Anything You Can Do, I Can Do Meta: Space tourist and billionaire programmer Charles Simonyi designed Microsoft Office. Now he wants to reprogram software.
http://www.technolog[...]
Technology Review
2007-01-09
[5]
서적
Generative Programming: Methods, Tools, and Applications
アジソンウェスレイ社
2000-06-01
[6]
뉴스
Anything You Can Do, I Can Do Meta
http://www.technolog[...]
Technology Review
2007-01-08
[7]
뉴스
Anything You Can Do, I Can Do Meta
https://www.technolo[...]
Technology Review
2007-01-09
[8]
서적
Generative Programming: Methods, Tools, and Applications
Addison-Wesley
2000-06-01
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com