구현이 존재하지 않는 프로그래밍 언어를 이론적으로 지정할 수 있습니까? 프로그래밍 언어는 기능을 정의하는 방법입니다. 구현은 해당 입력의 프로그램에 해당하는 함수의 출력에 대해 주어진 입력에서 해당 언어로 지정된 프로그램을 실행하는 방법을 의미합니다.
그러한 언어의 최소 요구 사항은 무엇입니까?
구현이 존재하지 않는 프로그래밍 언어를 이론적으로 지정할 수 있습니까? 프로그래밍 언어는 기능을 정의하는 방법입니다. 구현은 해당 입력의 프로그램에 해당하는 함수의 출력에 대해 주어진 입력에서 해당 언어로 지정된 프로그램을 실행하는 방법을 의미합니다.
그러한 언어의 최소 요구 사항은 무엇입니까?
답변:
일반적으로 프로그래밍 언어를 구현하는 것은 최소한 Turing-complete 이하의 언어로 된 인터프리터 (또는 컴파일러를 언어로)를 제공하는 것입니다.
이 "정의"를 사용하여 다음과 같은 프로그래밍 언어를 지정할 수 있습니다.
오직 하나의 가능한 프로그램이있다 HALT
;
사양 HALT
: 정지 문제 를 해결하는 기능입니다 .
이 프로그래밍 언어를 구현하려면 구현에서 정지 문제를 해결해야합니다. (우리의 구현이 Turing 머신보다 강력하지 않아야하므로 불가능합니다).
사양은 논리를 처리하므로 더 많은 것을 요구할 수 있습니다. 구현이 불가능한 다른 사양은 "false"입니다. (또는 사양에서 모순되는 문장) 그러나 이것은 사양처럼 느껴지지 않으므로 중단 문제 예제를 사용했습니다.
1/0
이므로 명백한 비용 모델에서 Ω ( ∞ ) 입니다. 실제로 모든 Haskell 구현은 예외와 분기를 구분하며 GHC에는 예외가 어떻게 작동해야하는지 설명하는 특정 작업 의미론이 있습니다. 그러나 0으로 나누면 영원히 반복되는 적합한 구현을 가질 수 있습니다! let loop = loop in loop
그냥 호기심 사이드 참고 : C ++ 템플릿 엔진은 튜링 완료
정리 1 : 인스턴스화 경계가 없으면 C ++ 템플릿은 Turing-complete입니다.
결론 1 : 인스턴스화 제한이 없으면 주어진 프로그램을 컴파일 할 때 C ++ 컴파일러가 중지되는지 여부를 결정할 수 없습니다.
... 그래서 C ++ 자체는 "구현"이 존재하지 않는 프로그래밍 언어로 간주 될 수 있습니다 ... :-D
"프로그래밍 언어"와 "언어 구현"의 의미가 무엇인지 확실하지 않습니다. 답을 얻으려면이 두 가지에 대한 엄격한 정의를 제공해야합니다.
그러나 이것은 사람들이 "프로그래밍 언어"라는 문구를 사용할 때 의미하는 종류의 사양 언어가 아닙니다. 프로그래밍 언어는 일반적으로 계산 가능한 기능을 표현하는 (프로세스, ...)과 기계에 지시 사항을 전달하고, 따라서 이들의 프로그램과 출력 결과를 시뮬레이션 할 수있는 TM이하는 언어가 될하기위한 것입니다. 따라서 구현할 수없는 프로그래밍 언어를 갖는 의미는 의미가 없습니다.
(제 생각에는 프로그래밍 언어 를 사양 언어 또는 공식 언어 와 혼동하는 것 같습니다 . 어쨌든 계산할 수없는 언어를 정의 할 수 있습니다.)