두 가지 다른 점을 묻는 것 같습니다.
- 프로그래밍 언어가 모든 프로그램을 데이터로 표현할 수있는 능력.
- 프로그램을 데이터로 추론.
분석 목적으로 그것들을 분리하는 것이 유용합니다. 나는 전자에 집중할 것이다.
데이터가 메타 프로그래밍 또는
호모 닉 과 같은 용어에 따라 프로그램을 표현, 조작 (및 실행) 할 수있는 프로그래밍 언어의 능력 .
(어색한) 모든 잘 알려진 프로그래밍 언어는 문자열에 외부 프로그램 (컴파일러, 링커 등)을 호출하는 기능과 함께 문자열 데이터 유형을 사용하여 메타 프로그래밍을 수행 할 수 있습니다 (예 : 파일에 파일을 작성) 시스템 우선). 그러나 그것은 아마도 당신이 의미하는 것이 아닙니다. 아마도 좋은 구문을 염두에두고있을 것입니다. 거의 모든 문자열이 프로그램을 나타내지 않기 때문에 문자열은 프로그램 표현을위한 좋은 구문이 아닙니다. 즉, 문자열 표현 데이터 형식은 프로그램 표현 메커니즘으로 볼 때 많은 '정크'를 포함합니다. 설상가상으로, 문자열 연산의 대수는 본질적으로 프로그램 구성의 대수와 관련이 없습니다.
아마 당신이 생각하는 것은 훨씬 더 좋은 것입니다. 예를 들어, 가 프로그램 인 경우 는 이지만 조작 및 분석을위한 데이터입니다. 이것을 종종 인용 이라고 합니다. 실제로 인용은 융통성이 없기 때문에 우리 는 대신 인용 부호를 사용합니다. 이것은 인용 부호에 '구멍'을 가질 수있는 프로그램을 실행할 수있는 '구멍'이있을 수있는 인용의 일반화입니다. 예를 들어 는 조건 대신 구멍이있는 조건을 나타내는 준 인용 부호입니다.피P ⟨ I F⟨ P⟩피[ ⋅ ] M ⟨ X > 0 ⟩ ⟨ I F
⟨ I F[ ⋅ ]t h e n7e l s e8 + 9 ⟩
[ ⋅ ] . 프로그램 이 데이터 되면, 인용 부호 는 데이터
미디엄⟨ X > 0 ⟩⟨ I F⟨ I F[ M]t h e n7e l s e8 + 9 ⟩
⟨ I Fx > 0t h e n7e l s e8 + 9 ⟩ .
( 은 인용 된 프로그램, 즉 데이터를 프로그램으로 반환하는 일반 프로그램 (데이터가 아닌 프로그램)입니다.)이 작업을 수행하려면 프로그램을 나타내는 데이터 유형이 필요합니다. 일반적으로 해당 데이터 유형을 AST (추상 구문 트리)라고하며 AST의 약어 메커니즘으로 (준수)를 볼 수 있습니다.미디엄
몇몇 프로그래밍 언어는 준 따옴표와 메타 프로그래밍을위한 다른 기능을 제공합니다. 프로그램을 데이터로 취급하는이 기능을 개척 한 것은 매크로 기능을 갖춘 Lisp입니다. 불행히도 Lisp 기반 매크로의 힘은 Lisp의 최소한의 구문에 크게 영향을 미쳤습니다. MetaML (1)이 되어서야 현대적이고 문법적으로 풍부한 언어가 메타 프로그래밍이 가능한 것으로 나타났습니다. 그 이후로 MetaOCaml (2) (MetaML의 자손으로, 프로그램을 데이터로 입력하는 방법의 문제를 해결하기 위해 계속 진행중인 퀘스트에서 획기적인 발전을 위해 중요 함), Template Haskell (3) 및 Converge (4) (첫 번째 언어) 필자의 의견으로는 모든 주요 메타 프로그래밍 기능을 얻을 수 있음)은 다양한 현대 프로그래밍 언어가 메타 프로그래밍을 수용 할 수 있음을 보여주었습니다. 우리가 취할 수 있다는 것을 아는 것이 중요합니다어떤 프로그래밍 언어 과 메타 프로그래밍 언어로 돌려
이다 데이터로 자신의 프로그램을 대표하는 (및 평가)의 기능과 함께.엘엘m p엘
데이터로 제공된 프로그램 실행 결과를 나타내는 것은 프로그램 (데이터로 제공됨)을 입력으로 받아서 실행 하는 함수를 추가하여 달성 됩니다. 결과를 반환합니다. 예 :이 경우 17과 평가 프로그램입니다 의 (준) 인용 버전 즉, 데이터로, 다음 도 17은 모든 종류가있다 반환 내가 질문을 여기에 같은 무시하고있어 것을 여기에 미묘한 때e v a l (⋅)피⟨ P⟩피피E V L에게 (⟨P⟩ )메타 프로그래밍 된 프로그램이 평가되고 있습니다 (컴파일 타임과 런타임 메타 프로그래밍의 차이를 일으킴). 유형과 관련된 작업 또는 평가 실패, 에서 진행되는 과정에서 변수를 바인딩하고 해제하는 작업 또는 그 반대.피⟨ P⟩
두 번째 차원에 관해서는 데이터로 주어진 프로그램에 대한 추론. 프로그램을 데이터로 변환 할 수있게되면 프로그램은 '정상적인'데이터이며 데이터로 추론 될 수 있습니다. Joshua가 지적한 것처럼 모든 유형의 검증 기술 (예 : 종속 유형 또는 계약 또는 대화식 정리 프로 버 또는 자동화 된 도구)을 사용할 수 있습니다. 그러나 추론 과정에서 언어의 의미론을 나타내야합니다. 만약 당신이 필요로하는 언어가 메타-프로그래밍 능력을 가지고 있다면, 상황이 조금 까다로워 질 수 있고,이 방향으로 많은 작업이 이루어지지 않았으며, (5)이 목적을위한 유일한 프로그램 논리입니다. 메타 프로그래밍에 대한 추론에 대한 Curry-Howard 기반 작업도 있습니다 (6, 7, 8). 이러한 논리 기반 접근 방식은 그리고 타입-기반 접근법 (2)은 미래의 모든 메타 프로그래밍 단계를위한 속성을 실제로 표현할 수있다. (2)를 제외하고는 그러한 논문 중 어느 것도 시행되지 않았다.
요약하면 : 당신이 요청한 것은 구현되었지만 꽤 미묘하며, 특히 유형 및 간소화 된 추론과 관련하여 여전히 공개적인 질문이 있습니다.
타하 다단계 프로그래밍 : 이론 및 응용 프로그램 .
W. Taha와 MF Nielsen. 환경 분류기 .
T. Sheard와 S. Peyton Jones. Haskell을위한 템플릿 메타 프로그래밍 .
L. Tratt. 동적으로 형식화 된 OO 언어로 컴파일 타임 메타 프로그래밍 .
M. Berger, L. Tratt, 동종 메타 프로그래밍을위한 프로그램 로직 .
R. Davies, F. Pfenning, 단계별 계산의 모달 분석 .
R. Davies, 바인딩 시간 분석에 대한 시간적 논리 접근법 .
T. Tsukada, A. Igarashi. 환경 분류기의 논리적 기반 .