최근의 CACM 기사 [1]에서, 저자는 단계별 기능에 대한 구현을 제시합니다 . 그들은 잘 알려진 것처럼이 용어를 사용하며, 어떤 언급도 명백한 소개처럼 보이지 않습니다.
그들은 짧은 설명을 제공합니다 (강조 광산과 참조 번호가 변경되었습니다. 원래는 22입니다)
프로그램 생성과 관련하여 Taha and Sheard [2]에 의해 확립 된 다단계 프로그래밍 (MSP, 짧게 스테이징) 은 프로그래머가 프로그램 표현의 평가를 후기 단계로 명시 적으로 지연시킬 수있게한다 (따라서, 스테이징). 현재 단계는 효과적으로 다음 단계의 프로그램을 구성하고 실행하는 코드 생성기로서 작용한다.
그러나 Taha와 Sheard는 다음과 같이 씁니다.
다단계 프로그램은 모두 동일한 프로세스 내에서 코드 생성, 컴파일 및 실행과 관련된 프로그램입니다. 다단계 언어는 다단계 프로그램을 표현합니다. 스테이징 및 결과적으로 다단계 프로그래밍은 런타임 해석 오버 헤드를 지불하지 않는 범용 솔루션의 필요성을 해결합니다.
스테이징이 효과적이라는 것을 보여주는 오래된 작업에 대한 몇 가지 언급보다 개념이 더 오래되었다는 것을 암시합니다. 용어 자체에 대한 참조는 제공하지 않습니다.
이러한 진술은 모순되지 않으면 직교하는 것처럼 보인다. 아마도 Rompf와 Odersky가 쓴 것은 Taha와 Sheard가 제안한 것을 적용한 것일지도 모르지만, 똑같은 다른 관점 일 수도 있습니다. 그들은 중요한 점은 프로그램이 런타임에 자신의 일부를 다시 작성한다는 점에 동의하는 것 같지만, 그것이 필요한 능력인지 충분한 능력인지는 모르겠습니다.
그래서, 무엇을한다 준비 이러한 맥락에서 준비의 해석은 각각입니까? 이 용어는 어디에서 유래합니까?
- 경량 모듈 형 스테이징 : T. Rompf와 M. Odersky (2012)의 런타임 코드 생성 및 컴파일 된 DSL 에 대한 실용적인 접근 방식
- W. Taha와 T. Sheard (2000)의 명시 적 주석 을 이용한 MetaML 및 다단계 프로그래밍
답변
내가 아는 한, 단계별 계산 이라는 용어 는 이 논문 에서 Bill Scherlis에 의해 처음 사용되었습니다 . 그 이전에는 ” 부분 평가 ” 라는 용어 가 거의 같은 개념으로 사용되었지만 단계적 계산의 아이디어는 미묘하게 다릅니다. 두 아이디어는 모두 Kleene의 Smn 정리 와 관련이 있습니다.
두 인수 의 함수 이 있지만 하나의 인수 인 m 을 알고 있다면 첫 번째 인수에 대한 지식을 사용하여 함수 계산을 바로 수행 할 수 있습니다. 그런 다음 남은 것은 계산이 두 번째 알 수없는 인수에만 의존 하는 함수 ϕ m ( n ) 입니다.
ϕ(m,n)m
ϕm(n)
ϕm(n)
ϕ
m
n
ϕ′
m
ϕm
n
ϕ′
m
ϕm
ϕm
ϕ
ϕ′
- 단계별 함수를 정의하는 방법?
- 단계적 함수를 정의하기 위해 어떤 프로그래밍 언어 및 유형 시스템을 사용해야합니까?
- 그러한 언어의 의미는 무엇입니까?
- 단계별 기능의 일관성과 정확성을 어떻게 보장합니까?
- 단계별 함수를 자동 또는 반자동으로 구성하는 데 유용한 기술은 무엇입니까?
- 우리는 그러한 기술의 정확성을 어떻게 증명합니까?
단계별 계산은 실제로 매우 중요합니다. 실제로 모든 컴파일러는 실제로 단계적 계산입니다. 소스 프로그램이 주어지면 변환되고 최적화 된 대상 프로그램을 구성하여 실제 입력을 취하고 결과를 계산할 수 있습니다. 우리는 여러 단계를 저글링하고 올바른 시간에 올바른 작업을 수행해야하기 때문에 실제로 단계적 계산 프로그램을 작성하는 것은 어렵습니다. 컴파일러를 작성한 모든 사람들은 그러한 문제로 어려움을 겪었습니다. 다른 프로그램을 작성하는 프로그램을 작성하는 것도 어렵습니다. 기계 언어 프로그램 (컴파일러), SQL 쿼리 (데이터베이스 조작) 또는 HTML / 서버 페이지 / 자바 스크립트 코드 (웹 응용 프로그램) 및 수많은 다른 응용 프로그램 일 수 있습니다.
답변
다른 답변은 기술적으로 정확하지만 컴퓨터 과학자가 단계적 기능에 관심을 갖는 이유를 정확하게 이해하지 못한다고 생각합니다.
단계적 기능을 작성하여 프로그램을 생성하는 프로그램을 정의합니다. 현대의 실제 언어 이론의 큰 목표 중 하나는 잠재적 재사용을 최대화하는 것입니다. 우리는 유용한 함수와 객체 일뿐만 아니라 고차원의 건축 구조를 제공함으로써 프로그래머를 돕는 라이브러리를 작성할 수 있기를 원합니다.
모든 상용구 코드를 제거 할 수 있다면 좋을 것입니다. 사양 언어를 최소화 할 수 있어야합니다. 예를 들어, 주어진 스레드 디자인으로 다른 디스패처와 통신하는 이벤트 중심 디스패처를 원한다면,이를 컴팩트하게 지정할 수 있어야하며 모든 IO 리스너와 큐 오브젝트 및 스레드 연결을 해당 스펙에서 빌드 할 수 있어야합니다.
도메인 언어는 우리가 찾고있는 간결한 표현 인 경향이 있습니다. 사람들이 도메인에서 한동안 일할 때, 그들이 사용하는 언어는 대부분의 정보 중복을 없애고 단순한 사양이되는 경향이 있습니다. 따라서이 준비 이론은 도메인 언어에서 실행 언어로의 번역 시스템이되는 경향이 있습니다.
컴파일러는 기술적으로는 단계적이지만 목표가 없습니다. 현대 스테이징의 목표는 재사용을 극대화하고 가능한 경우 프로그램 구성을 자동화하는 프로그램을 구축하는 프로그램을 구축하는 것입니다. 프로그램의 기능 요구 사항이 프로그램이라면 그것은 좋을 것입니다.
Czarnecki와 Eisenecker (ISBN-13 : 978-0201309775)의 “Generative Programming”을 참조하십시오.
답변
문제는 기사 [1]에 대한 기술적 인 관점에서 제공됩니다. 고려중인 문제는 일반 코드와 특정 코드 사이의 긴장 영역입니다.
프로그램은 범용 또는 특수 목적으로 작성 될 수 있습니다. 범용 코드는 다양한 상황에서 사용할 수 있다는 장점이 있지만, 특수 목적 코드는 실행 환경의 고유 한 특성을 활용하여 재사용 가능성으로 효율성을 얻는 방식으로 작성 될 수 있습니다.
물론 우리는 이러한 긴장을 해결하고자합니다. 그것은 일반적인 코드 와 구체적인 구현입니다.
우리는 다음과 같은 질문을 할 수 있습니다 : 일반적인 목적을 위해 코드를 작성하는 것이 가능한가? 그러나 실행 중에 현재 상황에 자동으로 특화되도록합니까?
이것은 (일반) 프로그램이 특정 상황에 맞게 런타임에 스스로 작성 (재)되도록하는 아이디어를 낳았습니다.
결과적으로 중요한 연구 방향은 프로그래머가 범용 코드를 작성한 다음 런타임시 고성능 특수 코드로 정확하고 효율적으로 전환 할 수있는 언어 및 컴파일러 기술에 대한 검색입니다.
Java의 JIT가 좋은 예라고 생각합니다. 한 가지 특별한 아이디어는 다단계 프로그래밍이며 Lee는 다음과 같이 설명합니다.
이 연구 라인에서 핵심 아이디어 중 하나는 준비 개념입니다. 우리는 일련의 단계로 진행되는 프로그램의 실행을 상상합니다. 각 단계는 이후 단계에서 사용되는 값을 계산합니다. 그러므로 우리가 찾는 것은 프로그램 코드를 작성하여 어떻게 든 이러한 단계가 명확 해 지도록하는 것입니다. 이것이 달성되면, 우리는 후기 단계 코드가 초기 단계의 계산 결과에 대해 최적화되는 코드 생성기로 컴파일되도록 배열 할 수 있습니다.
즉, “스테이징 (staging)”은 계산 / 실행에서 위상을 식별하는 적절한 기능 / 코드를 보는 방법으로, 이전 위상의 결과를 알면 단순화 될 수 있습니다. 문제의 첫 번째 인용문에서와 같이 “지연”계산은 단계를 올바르게 분리하기 위해 필요한 부작용 일 수 있지만 요점이 아닙니다.
Rompf와 Odersky는 빠른 푸리에 변환 을 예로들 수 있습니다.
- 여우와 고슴도치 : Peter Lee의 기술적 관점 (2012)