함수형 프로그래밍의 이점을 설명하는 많은 기사에서 Haskell, ML, Scala 또는 Clojure와 같은 함수형 프로그래밍 언어를 C / C ++ / C # / Java와 같은 명령형 언어와 구별되는 "선언적 언어"라고합니다. 제 질문은 기능적 프로그래밍 언어를 명령형이 아닌 선언적으로 만드는 것입니다.
선언적 프로그래밍과 명령 적 프로그래밍의 차이점을 설명하는 자주 설명되는 설명은 명령형 프로그래밍에서 선언적 언어의 "무엇을해야하는지"와 반대로 "어떻게해야하는지"라고 컴퓨터에 알려주는 것입니다. 이 설명에서 내가 가진 문제는 모든 프로그래밍 언어로 끊임없이 두 가지를하고 있다는 것입니다. 가장 낮은 수준의 어셈블리로 내려가도 컴퓨터에 "무엇을해야하는지"라고 말하고 CPU에 두 개의 숫자를 추가하라고 지시하면 추가 방법을 지시하지 않습니다. Haskell과 같은 고급 순수 기능 언어 인 스펙트럼의 다른 쪽 끝으로 가면 실제로 컴퓨터에 특정 작업을 수행하는 방법을 알려주는 것입니다. 그것은 컴퓨터가 혼자서 달성하는 방법을 모르는 특정 작업을 수행하기 위해 프로그램이 일련의 명령입니다. Haskell, Clojure 등과 같은 언어는 분명히 C / C ++ / C # / Java보다 높은 수준이며 게으른 평가, 변경 불가능한 데이터 구조, 익명 함수, 카레, 영구 데이터 구조 등과 같은 기능을 제공합니다. 함수형 프로그래밍은 가능하고 효율적이지만 선언적 언어로 분류하지는 않습니다.
나를위한 순수한 선언적 언어는 선언으로 만 구성된 언어 일 것입니다. 이러한 언어의 예는 CSS입니다 (예 : CSS는 기술적으로 프로그래밍 언어가 아닙니다). CSS에는 페이지의 HTML 및 Javascript에서 사용되는 스타일 선언 만 포함되어 있습니다. CSS는 선언을 만드는 것 외에는 아무것도 할 수 없으며 클래스 함수를 만들 수 없습니다. 예를 들어 일부 매개 변수를 기반으로 표시 할 스타일을 결정하는 함수, CSS 스크립트를 실행할 수 없습니다 등. 선언적 언어를 설명합니다. 프로그래밍 언어).
최신 정보:
나는 최근에 Prolog를 가지고 놀았으며, Prolog는 완전히 선언적인 프로그래밍 언어가 아니라면 완전히 선언적인 언어 (적어도 내 의견으로는)에 가장 가까운 프로그래밍 언어입니다. Prolog에서 프로그래밍을 정교하게하려면 사실 (특정 입력에 대해 true를 리턴하는 술어 함수) 또는 규칙 (입력에 따라 주어진 조건 / 패턴에 대해 true를 리턴하는 술어 함수), 규칙을 선언하여 선언을 수행합니다. 패턴 매칭 기술을 사용하여 정의됩니다. 프롤로그에서 작업을 수행하려면 하나 이상의 술어 입력을 변수로 대체하여 지식 기반 데이터베이스에 쿼리하고 프롤로그는 술어가 성공한 변수의 값을 찾으려고 시도합니다.
내 요점은 프롤로그에 명령 지침이 없다는 것입니다. 기본적으로 컴퓨터에 알고있는 것을 말하고 지식에 대해 묻습니다. 함수형 프로그래밍 언어에서는 메모리 위치를 직접 조작하거나 단계별로 계산을 작성하지 않더라도 여전히 명령을 내립니다. 즉, 값을 가져오고 함수 X를 호출하여 1을 추가하는 등의 작업을 수행합니다. 하스켈, ML, 스칼라 또는 클로저에서의 프로그래밍이 이런 의미에서 선언적이라고 말하고 싶지는 않습니다. 위에서 설명한 의미에서 적절하고 진실하며 순수한 함수형 프로그래밍입니다.
(let [x 1] (let [x (+ x 2)] (let [x (* x x)] x)))
없어도이 작업을 수행 할 수 있습니다 (Choju 이해했습니다. 내 원래의 질문은 이것이 int와 다른 점입니다 x = 1; x += 2; x *= x; return x;
. 내 의견으로는 대부분 동일합니다.