명령형 언어는 기능적 언어와 어떻게 다른가요?


17

나는 Simon Peyton Jones의 The Functional Programming Languages의 구현을 읽고 있는데, 나를 놀라게 한 한 가지 진술이 있습니다 (39 페이지).

명령형 언어의 경우보다 훨씬 더 많은 기능적 언어는 의미 론적 차이가 거의없는 서로의 구문 상 변형입니다.

이제이 내용은 1987 년에 작성되었으며이 주제에 대한 나의 생각은 당시에 널리 사용되지 않았거나 인기가없는보다 현대적인 프로그래밍 언어의 영향을받을 수 있습니다. 그러나 나는 이것을 조금 믿기 어렵다. 예를 들어, 설명 된 Miranda 프로그래밍 언어 (Haskell의 초기 전임)는 C가 Pascal에 있거나 C가 smalltalk해야한다고 말하는 것보다 ML과 같은 엄격한 언어에 비해 훨씬 더 다른 의미를 가지고 있다고 생각합니다. C ++은 그의 요점에 대한 검증을 제공합니다 :-).

그러나 다시, 나는 이것을 직관적 인 이해에 기초하고 있습니다. Simon Peyton Jones가이 말을하는 데 크게 맞습니까?

답변:


19

시몬은 기본적으로 확장 관점에서 정확합니다. 우리는 현대 기능 언어의 의미가 무엇인지 잘 알고 있으며, 실제로 서로에 대해 상대적으로 작은 변형입니다. 각각은 모나드 금속 언어로 약간 다른 번역을 나타냅니다. Scheme과 같은 언어 (일류 제어를 사용하는 동적 형식의 고차원 명령 언어)조차도 ML 및 Haskell과 매우 유사한 의미를 갖습니다.

V

그러나 현대적인 유형의 기능 언어를 해석하기에 적합한 범주에 도달하려면 상황이 상당히 무섭습니다. 기본적으로,이 영역에 대해 초고도-풍부한 부분 동등성 범주를 구성하게됩니다. (예를 들어, Birkedal, Stovring 및 Thamsborg의 "파라 메트릭 다형성, 일반 참조 및 재귀 유형의 재분석 가능성 의미론"을 참조하십시오.) 운영 의미론을 선호하는 사람들은이 항목을 단계별 색인 논리 관계로 알고 있습니다. 예를 들어 Ahmed, Dreyer 및 Rossberg의 "국가 별 표현 독립성"을 참조하십시오. 어느 쪽이든, 사용 된 기술은 비교적 새롭습니다.

a -> b()a

방정식 이론이 진행되는 한, 이들 언어는 같은 언어의 약간 다른 부분 집합으로의 번역에 의해 설명 될 수 있기 때문에, 그것들을 서로의 구문 변형이라고 부르는 것은 전적으로 공평합니다.

ML과 Haskell의 느낌 차이는 실제로 두 언어의 강렬한 속성, 즉 실행 시간과 메모리 소비에서 발생합니다. ML은 이름 별 실제 언어와 같이 구성 성능 모델 (즉, 프로그램의 시간 / 공간 비용을 하위 용어의 시간 / 공간 비용에서 계산할 수 있음)을 가지고 있습니다. 실제 Haskell은 필요에 따라 호출 방식으로 구현되며 결과적으로 성능이 구성되지 않습니다. 변수에 바인딩 된 표현식이 평가하는 데 걸리는 시간은 이전에 사용되었는지 여부에 따라 다릅니다. 이것은 위에서 언급 한 의미론에서 모델링되지 않았습니다.

강렬한 속성을 더 심각하게 받아들이려면 ML과 Haskell이 더 심각한 차이점을 보이기 시작합니다. 아마도 그것들에 대한 일반적인 금속 언어를 고안하는 것이 가능할 수도 있지만, 유형에 대한 해석은 초점 에 대한 증명 이론적 아이디어와 관련하여 훨씬 체계적인 방식으로 다를 것입니다 . 이것에 대해 배우기에 좋은 곳은 Noam Zeilberger의 PhD 논문입니다.


10

SPJ는 순전히 기능적인 언어, 즉 참조 적으로 투명한 언어를 언급하고 있습니다. 여기에는 Haskell, Miranda, Clean은 포함되지만 ML은 포함되지 않습니다. 순전히 기능적인 언어를 갖게되면 일반적으로 상당히 깨끗하고 명확하게 정의 된 표기 의미론을 제공 할 수 있습니다. 이 의미론은 일반적으로 람다 미적분학에 대한 것과 같으며 여기 저기 약간의 조정이 있습니다. 일반적으로 시스템 F의 변형과 비슷한 것으로 설탕을 제거하는 유형 시스템이 있습니다. 어떤 측면에서는 더 강력하고 다른 측면에서는 더 제한적입니다. 이것이 Haskell, O'Caml 등으로의 코드 추출 / 컴파일이 Agda와 같은 정교한 종속 형식 교정 어시스턴트에서 비교적 간단한 이유입니다.

그 틀 안에는 놀이의 여지가 많이 있습니다. 확실히, 엄격하지 않은 언어와 엄격한 언어 사이에는 여전히 차이가 있습니다. 그러나 부작용이없는 경우, 유일한 차이점은 엄격하지 않은 언어에는 바닥을 나타내지 않는 더 많은 표현이 포함된다는 것입니다.

시몬의 진술은 또한 매우 중요한 역사적 맥락에 부합합니다. Haskell (1987)이 태어 났을 때, Miranda뿐만 아니라 Lazy ML, Orwell, Clean 및 기타 여러 언어가 아닌 엄밀한 기능 언어가 만연했습니다. 특정한 구문상의 변형을 제외하고는 모두 거의 같은 언어였습니다. 바로 하스켈위원회가 형성 한 동기였습니다. 이에 대한 자세한 내용은 "하스켈의 역사 : 클래스에 게으르다"를 참조하십시오 : http://research.microsoft.com/en-us/um/people/simonpj/papers/history-of-haskell/ .


5

SPJ가 핵심 의미론에 대해 이것을 말하는 것이 맞다고 생각합니다.

앞에서 언급했듯이 엄격하거나 게으른 평가로 기본 설정하는 것과 같이 지적 할 수있는 많은 고급 미묘함이 있지만 유형 시스템의 세부 사항 또는 더 큰 코드 단위 (모듈, 구조) 구성 방법은 프로그램의 정신 모델입니다. 기능적 언어에서 매우 유사합니다.

특정 기능을 선택하고 비교하는 모든 언어로 작성하십시오. 추상화 수준, 선택한 데이터 구조, 기타 구현 수준을 포함하여 서로 다른 구현의 구조와 의미가 매우 유사하다는 것을 알게 될 것입니다. 모든 가비지 수집 등을 가정합니다.

반대로, 동일한 기능의 C 구현과 스몰 토크 구현은 서로 다른 구조 (함수 및 저수준 데이터 구조와 객체)를 가질 것이며, 다른 세부 수준 (예 : 수동 메모리 관리 대 가비지 수집)에 초점을 맞출 것입니다 ) 및 다른 수준의 추상화에서 작동합니다.

기능적 언어 설계 공간의 세계관은 어셈블리, C, 스몰 토크, Forth 및 수십 개의 다른 근본적으로 다른 언어를 하나의 포괄 범주로 묶는 "제국 프로그래밍"공간보다 더 구체적이고 일관성이 있습니다.


4

Simon PJ의 인용문은 실제로 약간의 발언이라고 생각합니다.

언어 간의 유사성은 연구자와 언어 디자이너 커뮤니티에서 어떤 합의가 생성되었는지에 따라 결정됩니다. 함수형 프로그래밍 커뮤니티에서 명령형 프로그래밍 커뮤니티보다 높은 수준의 합의가 있다는 데는 의문의 여지가 없습니다. 그러나 함수형 프로그래밍 언어는 대부분 실무자보다는 연구원이 설계 한 경우도 있습니다. 따라서 그러한 합의가 나타나는 것이 당연합니다.

거의 모든 기능적 언어는 가비지 수집 메모리 관리 및 재귀 데이터 구조 (Lisp에서 시작)를 사용하고, 대부분 "대수"데이터 유형 및 패턴 일치 (희망에서 시작)를 사용하며, 대부분은 고차 함수 및 다형성 함수 ( ML로 시작). 그 외에도 합의가 사라집니다. 사용되는 모듈 시스템, 상태 변경 작업 및 기타 계산 효과 처리 방법 및 평가 순서 (이름 별 호출 대 값별) 등이 다릅니다.

명령형 프로그래밍 언어는 일반적으로 중첩 제어 구조 (Algol 60으로 시작) 및 유형 시스템 (Algol 60으로 시작되었지만 Algol 68로 통합)을 사용합니다. 그것들은 일반적으로 성가신 표면 구문 (Algol 60으로 돌아가는)을 가지고, 고차 함수 및 다형성 유형을 처리하기 위해 반쯤 노력하고 블록 구조 및 모듈 시스템에 대한 지원이 다릅니다. 60 년대 이후에는 이름 별 통화가 본질적으로 명령형 언어에서 사라졌기 때문에 평가 순서에 더 균일 성이있을 것입니다.

따라서 두 클래스의 언어 간 통일성이 다르다는 것이 분명하지 않습니다.

함수형 프로그래밍의 깨끗하고 균일 한 표기법을 명령형 프로그래밍 언어로 가져 오는 것이 실제로 가치가 있습니다. 스칼라는 그 방향으로 시작했다는 것을 알았습니다. 추세가 계속 될지 여부는 여전히 남아 있습니다.


왜 "대수"데이터 유형에 겁 먹은 따옴표를 사용했는지 궁금합니다.
Steven Shaw
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.