단계적 기능 (개념적으로)이란 무엇입니까?


24

최근의 CACM 기사 [1]에서, 저자는 단계별 기능에 대한 구현을 제시합니다 . 그들은 잘 알려진 것처럼이 용어를 사용하며, 어떤 언급도 명백한 소개처럼 보이지 않습니다.

그들은 짧은 설명을 제공합니다 (강조 광산과 참조 번호가 변경되었습니다. 원래는 22입니다)

프로그램 생성과 관련하여 Taha and Sheard [2]에 의해 확립 된 다단계 프로그래밍 (MSP, 짧게 스테이징) 은 프로그래머가 프로그램 표현의 평가를 후기 단계로 명시 적으로 지연시킬 수있게한다 (따라서, 스테이징). 현재 단계는 효과적으로 다음 단계의 프로그램을 구성하고 실행하는 코드 생성기로서 작용한다.

그러나 Taha와 Sheard는 다음과 같이 씁니다.

다단계 프로그램은 모두 동일한 프로세스 내에서 코드 생성, 컴파일 및 실행과 관련된 프로그램입니다. 다단계 언어는 다단계 프로그램을 표현합니다. 스테이징 및 결과적으로 다단계 프로그래밍은 런타임 해석 오버 헤드를 지불하지 않는 범용 솔루션의 필요성을 해결합니다.

스테이징이 효과적이라는 것을 보여주는 오래된 작업에 대한 몇 가지 언급보다 개념이 더 오래되었다는 것을 암시합니다. 용어 자체에 대한 참조는 제공하지 않습니다.

이러한 진술은 모순되지 않으면 직교하는 것처럼 보인다. 아마도 Rompf와 Odersky가 쓴 것은 Taha와 Sheard가 제안한 것을 적용한 것일지도 모르지만, 똑같은 다른 관점 일 수도 있습니다. 그들은 중요한 점은 프로그램이 런타임에 자신의 일부를 다시 작성한다는 점에 동의하는 것 같지만, 그것이 필요한 능력인지 충분한 능력인지는 모르겠습니다.

그래서, 무엇을한다 준비 이러한 맥락에서 준비의 해석은 각각입니까? 이 용어는 어디에서 유래합니까?


  1. 경량 모듈 형 스테이징 : T. Rompf와 M. Odersky (2012)의 런타임 코드 생성 및 컴파일 된 DSL대한 실용적인 접근 방식
  2. W. Taha와 T. Sheard (2000)의 명시 적 주석이용한 MetaML 및 다단계 프로그래밍

두 진술 사이에 어떤 모순이 있습니까? 나에게 그들은 다른 것을 강조하면서 같은 것에 대해 이야기하는 것처럼 보입니다.
Gilles 'SO- 악한 중지'

@Gilles 나는 무언가의 평가를 지연시키기 위해 런타임 코드 생성 / 컴파일이 필요하지 않습니다 (연속 참조). 그것은 단지 또 다른 강조 일 것입니다 (질문에서 그 옵션을 인정합니다). 그러나 나는 실제로 말할 수 없습니다.
라파엘

다음 사이트에서 Julia 프로그래밍 언어 구현 및 메타 프로그래밍 설명서를 확인할 수 있습니다 @generated function. julia.readthedocs.org/en/latest/manual/metaprogramming/…
SalchiPapa

답변:


21

내가 아는 한, 단계별 계산 이라는 용어 는 이 논문 에서 Bill Scherlis에 의해 처음 사용되었습니다 . 그 이전에는 " 부분 평가 " 라는 용어 가 거의 같은 개념으로 사용되었지만 단계적 계산의 아이디어는 미묘하게 다릅니다. 두 아이디어는 모두 Kleene의 Smn 정리 와 관련이 있습니다.

두 인수 의 함수 이 있지만 하나의 인수 인 m 을 알고 있다면 첫 번째 인수에 대한 지식을 사용하여 함수 계산을 바로 수행 할 수 있습니다. 그런 다음 남은 것은 계산이 두 번째 알 수없는 인수에만 의존 하는 함수 ϕ m ( n ) 입니다.ϕ(m,n)mϕm(n)

ϕm(n) ϕmnϕmϕmn

ϕmϕmϕm

ϕϕ

  • 단계별 함수를 정의하는 방법?
  • 단계적 함수를 정의하기 위해 어떤 프로그래밍 언어 및 유형 시스템을 사용해야합니까?
  • 그러한 언어의 의미는 무엇입니까?
  • 단계별 기능의 일관성과 정확성을 어떻게 보장합니까?
  • 단계별 함수를 자동 또는 반자동으로 구성하는 데 유용한 기술은 무엇입니까?
  • 우리는 그러한 기술의 정확성을 어떻게 증명합니까?

단계별 계산은 실제로 매우 중요합니다. 실제로 모든 컴파일러는 실제로 단계적 계산입니다. 소스 프로그램이 주어지면 변환되고 최적화 된 대상 프로그램을 구성하여 실제 입력을 취하고 결과를 계산할 수 있습니다. 우리는 여러 단계를 저글링하고 올바른 시간에 올바른 작업을 수행해야하기 때문에 실제로 단계적 계산 프로그램을 작성하는 것은 어렵습니다. 컴파일러를 작성한 모든 사람들은 그러한 문제로 어려움을 겪었습니다. 다른 프로그램을 작성하는 프로그램을 작성하는 것도 어렵습니다. 기계 언어 프로그램 (컴파일러), SQL 쿼리 (데이터베이스 조작) 또는 HTML / 서버 페이지 / 자바 스크립트 코드 (웹 응용 프로그램) 및 수많은 다른 응용 프로그램 일 수 있습니다.


ϕϕ

즉, 부분 평가는 다단계 프로그래밍에 대한 추상화입니다. 즉, 부분 평가는 다단계 프로그래밍을 의미하지 않지만 다단계 프로그래밍은 부분 평가를 의미합니다. 기능 언어로 카레를 수행 할 때 반드시 여러 단계가 필요하지 않으며 런타임에 코드를 생성 할 필요가 없기 때문에 부분 평가는 하나 또는 여러 단계에서 수행 될 수 있습니까?
denis631

1
정확히. 부분 평가 기는 일반 프로그램을 2 단계 프로그램으로 컴파일 한 다음 첫 번째 단계를 실행합니다. 단계별 프로그래밍에서는 다단계 프로그램을 직접 작성하십시오.
Uday Reddy

9

다른 답변은 기술적으로 정확하지만 컴퓨터 과학자가 단계적 기능에 관심을 갖는 이유를 정확하게 이해하지 못한다고 생각합니다.

단계적 기능을 작성하여 프로그램을 생성하는 프로그램을 정의합니다. 현대의 실제 언어 이론의 큰 목표 중 하나는 잠재적 재사용을 최대화하는 것입니다. 우리는 유용한 함수와 객체 일뿐만 아니라 고차원의 건축 구조를 제공함으로써 프로그래머를 돕는 라이브러리를 작성할 수 있기를 원합니다.

모든 상용구 코드를 제거 할 수 있다면 좋을 것입니다. 사양 언어를 최소화 할 수 있어야합니다. 예를 들어, 주어진 스레드 디자인으로 다른 디스패처와 통신하는 이벤트 중심 디스패처를 원한다면,이를 컴팩트하게 지정할 수 있어야하며 모든 IO 리스너와 큐 오브젝트 및 스레드 연결을 해당 스펙에서 빌드 할 수 있어야합니다.

도메인 언어는 우리가 찾고있는 간결한 표현 인 경향이 있습니다. 사람들이 도메인에서 한동안 일할 때, 그들이 사용하는 언어는 대부분의 정보 중복을 없애고 단순한 사양이되는 경향이 있습니다. 따라서이 준비 이론은 도메인 언어에서 실행 언어로의 번역 시스템이되는 경향이 있습니다.

컴파일러는 기술적으로는 단계적이지만 목표가 없습니다. 현대 스테이징의 목표는 재사용을 극대화하고 가능한 경우 프로그램 구성을 자동화하는 프로그램을 구축하는 프로그램을 구축하는 것입니다. 프로그램의 기능 요구 사항이 프로그램이라면 그것은 좋을 것입니다.

Czarnecki와 Eisenecker (ISBN-13 : 978-0201309775)의 "Generative Programming"을 참조하십시오.


@Raphael : 다음은 도메인과 재사용에 대한 기본 사항이 포함 된 3 장 입니다. 언급 한 최적화도 살펴보십시오. FFT는 더 빨리 실행되도록 스테이징하지 않습니다. 프로그래머가 매번 손으로 값 테이블을 계산하지 않고 프로그램에 복사하고 큰 목록을 만들 필요가 없도록합니다. 완료된 작업을 최소화하고 기본 단계를 다시 사용합니다. 루프 언 롤링과 동일합니다. 손으로하는 것은 정보를 반복하며 재사용 할 수 없습니다.
ex0du5

이 DSL 관점은 스테이징을 한 레벨 (프로그램 내부의 DSL 컴파일러)로 제한하는 것 같습니다.
라파엘

1
@Raphael : 그것은 실제로 당신의 관점에 달려 있습니다. 분명히이 개념은 단순히 소스-> 실행 가능한 번역으로 볼 때 계산 능력을 추가하지 않습니다. 우리는 단지 DS 언어를위한 컴파일러를 구축하고 완료 할 수 있습니다. 그것이 강점에서 오는 곳은 반복입니다. 향후 프로젝트에서 사용 및 확장 할 라이브러리를 구축 할 때 라이브러리 경계 안에 자연스런 단계가 나타납니다. 전체 직렬화를 위해 오브젝트 스펙을 소스로 변환하는 라이브러리와 일부 디스패치 스펙에 빌드 된 전송 계층을 빌드하는 다른 라이브러리가있을 수 있습니다.
ex0du5

1
@Raphael : 준비는 여러 단계로보다 자연스럽게 이루어질 수 있습니다. 하나의 코드가 시간이 지남에 따라 요구 사항이 많이 바뀌는 경우 (다른 레이어가 훨씬 더 안정적인 경우) "스테 이어링 레이어"로 인해 스테이징을보다 안정적인 인터페이스가있는 레이어로 분리하는 것이 적절할 수 있습니다. 그런 다음 변경 사항이있는 시스템에 영향을 미치지 않고 개방형 원칙의 준비 양식을 적용 할 수 있습니다. 그것들은 수학적 필요성이없는 실제적인 관심사이지만 모두 실용성에 기초합니다. 우리는 단일 컴파일러 언어를 원하지 않고 진화를 허용하고 싶습니다.
ex0du5

5

문제는 기사 [1]에 대한 기술적 인 관점에서 제공됩니다. 고려중인 문제는 일반 코드와 특정 코드 사이의 긴장 영역입니다.

프로그램은 범용 또는 특수 목적으로 작성 될 수 있습니다. 범용 코드는 다양한 상황에서 사용할 수 있다는 장점이 있지만, 특수 목적 코드는 실행 환경의 고유 한 특성을 활용하여 재사용 가능성으로 효율성을 얻는 방식으로 작성 될 수 있습니다.

물론 우리는 이러한 긴장을 해결하고자합니다. 그것은 일반적인 코드 구체적인 구현입니다.

우리는 다음과 같은 질문을 할 수 있습니다 : 일반적인 목적을 위해 코드를 작성하는 것이 가능한가? 그러나 실행 중에 현재 상황에 자동으로 특화되도록합니까?

이것은 (일반) 프로그램이 특정 상황에 맞게 런타임에 스스로 작성 (재)되도록하는 아이디어를 낳았습니다.

결과적으로 중요한 연구 방향은 프로그래머가 범용 코드를 작성한 다음 런타임시 고성능 특수 코드로 정확하고 효율적으로 전환 할 수있는 언어 및 컴파일러 기술에 대한 검색입니다.

Java의 JIT가 좋은 예라고 생각합니다. 한 가지 특별한 아이디어는 다단계 프로그래밍이며 Lee는 다음과 같이 설명합니다.

이 연구 라인에서 핵심 아이디어 중 하나는 준비 개념입니다. 우리는 일련의 단계로 진행되는 프로그램의 실행을 상상합니다. 각 단계는 이후 단계에서 사용되는 값을 계산합니다. 그러므로 우리가 찾는 것은 프로그램 코드를 작성하여 어떻게 든 이러한 단계가 명확 해 지도록하는 것입니다. 이것이 달성되면, 우리는 후기 단계 코드가 초기 단계의 계산 결과에 대해 최적화되는 코드 생성기로 컴파일되도록 배열 할 수 있습니다.

즉, "스테이징 (staging)"은 계산 / 실행에서 위상을 식별하는 적절한 기능 / 코드를 보는 방법으로, 이전 위상의 결과를 알면 단순화 될 수 있습니다. 문제의 첫 번째 인용문에서와 같이 "지연"계산은 단계를 올바르게 분리하기 위해 필요한 부작용 일 수 있지만 요점이 아닙니다.

Rompf와 Odersky는 빠른 푸리에 변환 을 예로들 수 있습니다.


  1. 여우와 고슴도치 : Peter Lee의 기술적 관점 (2012)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.