문제

"기능적 프로그래밍"이라는 완전히 새로운 패러다임이 있으며, 이는 절차 적 프로그래밍에 비해 완전히 사고 패턴의 변화가 필요합니다. 우리는 일반적으로 명령적이고 객체 지향 언어로는 보이지 않는 고차 기능, 순도, 모나드 등을 사용합니다.

내 질문은 구현 이 언어 중에는 메모리 관리 또는 포인터 등과 같은 내부와 관련하여 명령 적 또는 객체 지향 언어와 다릅니다.

JVM 위에 실행되는 기능적 언어가 있습니다. 이것은 이러한 언어가 JVM의 다른 언어처럼 내부적으로 작동한다는 것을 의미합니까?

도움이 되었습니까?

해결책

기능 프로그래밍 언어의 구현은 광범위한 구현 기술을 사용하고 있습니다. 계획 (LISP 방언)의 구현에 대한 훌륭한 소개 가이 책을 제공합니다. 작은 조각으로 lisp Christian Queinnec.

다른 팁

기능적 언어로 인한 코드는 비 기능적 언어로 볼 수있는 많은 기능을 사용합니다. 쓰레기 수거는 일반적인 사용으로 전달되었습니다. 꼬리 콜 최적화입니다 GCC 및 VC ++에서 수행됩니다.

그러나 폐쇄는 기능적 프로그래밍의 특징입니다. 당신은 하나가없는 것을 보지 못합니다. 순수한 기능 언어 만 참조하도록 "기능 언어"를 정의하는 경우 기능 프로그래밍을 지원하는 필수 언어 (예 : JavaScript 및 체계) (기능적으로 필수적이지만, 기능적 패러다임은 대부분의 것입니다. 사용된)). 폐쇄는 a 스파게티 스택 통화 스택의 경우 또는 스택 프레임을 종료 할 때 로컬 변수를 복사하거나 힙에 로컬 변수를 할당하고 쓰레기 수집을 처리하도록합니다.

클로저가 있으면 익명 기능이 비교적 쉽습니다 (통역사와 함께, 정말 쉽습니다). 컴파일러를 사용하면 기능이 컴파일 시간에 바이트 코드로 변환되며 바이트 코드 (진입 점의 주소)는 현재 환경과 런타임에 연결됩니다.

기능 구성은 익명 기능에 의존 할 수 있습니다. 컴파일러가 기능 구성 연산자가 발생할 때 f . g, 그것은 두 인수를 부르는 익명 함수를 만듭니다. f 그리고 g, 하나의 결과를 다른 사람에게 논쟁으로 전달합니다.

모나드는 OO 언어로 구현 될 수 있으며 순수한 기능 언어로 필요한만큼 필요하지 않습니다. I/O Monads는 너무 특별하지 않으며, 기본 플랫폼이 부작용을 허용한다는 사실에 의존합니다.

기능적 언어의 특별한 관심으로 이익이되는 많은 측면이 있다고 생각합니다.

기능적 언어는 재귀를 많이 사용합니다. 따라서 모든 구현은이 사례를 최적화하려고 시도해야합니다. 예를 들어 테일 리퍼션을 식별하고 내부적으로 루프로 변환합니다 (따라서 스택 저장 / 복원과 같은 기능 통화 오버 헤드). (http://en.wikipedia.org/wiki/tail_recursion)

Haskell과 같은 기능적 프로그래밍 언어의 구현은 종종 명령적인 언어와 매우 다릅니다. 한 가지 방법에 대해 읽을 수 있습니다 여기. 논문은 몇 살이지만 아이디어가 여전히 사용된다고 생각합니다.

가장 큰 차이점은 기능 언어가 소스 코드가 탈수 수학적으로 단순하고 강력한 중간 언어로. 이 언어에는 일반적으로 Lambda, 기능 호출, if/else, 기계 유형 등이 포함됩니다. let, 훨씬 더 이상은 아닙니다. 변형 된 코드는 깊이 중첩되고 장점이며 현실적으로 인간이 읽을 수 없습니다. 표면 구문이 버려집니다.

이와 같은 언어에 대한 컴파일러는 괜찮은 코드를 생성하기 위해 약간의 인라인 및 몇 가지 폐쇄 최적화를 수행해야합니다. (나 에게이 기준선 폐쇄 최적화는 사소한 것처럼 보이지만, 스케이프 분석 등이지만 친숙 함이 부족할 수 있습니다.)

모든 것이 동일한 프로세서 (따라서 동일한 어셈블리 지침)에서 실행되므로 충분히 깊이 들어가는 한 모든 것이 내부적으로 동일합니다.

@outis : 언어는 그것들을 지원할 수 있지만, 클로즈는 부작용과 같은 방식으로 함수의 수학적 개념과 충돌합니다. 동일한 인수와 다른 결과를 얻을 수 있습니다. 그것은 기능적보다는 폐쇄를 절차 적으로 만듭니다.

즉, 글로벌 (특히 컴파일러 구현의 맥락에서)보다 폐쇄를 선호하는 효율성 주장이 있습니다. [그러나 나는 "작업 alikes"를 구현할 수 있지만 직접 폐쇄를 제공하지 않는 기능적 언어를 알고 있습니다.

(그러나 카레는 폐쇄와 비슷 하며이 갈등을 겪지 않으며 실제로 기능적 언어로 일상적으로 존재합니다.)

어쨌든, 기능적 프로그래밍 언어는 수학적 기능인 것처럼 계산을 표현하기위한 큰 노력을 기울이는 언어입니다. 이는 최적화가 함수를 최적화 할 때 기울어 져 있음을 의미합니다.

가설 적으로, 적어도 기능적 언어는 기계가 순전히 절차 적 접근에 유용한 것보다 더 깊은 추상화에 대해 작동하도록 허용합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top