구현하지 않고 프로그래밍 언어를 지정할 수 있습니까?


11

구현이 존재하지 않는 프로그래밍 언어를 이론적으로 지정할 수 있습니까? 프로그래밍 언어는 기능을 정의하는 방법입니다. 구현은 해당 입력의 프로그램에 해당하는 함수의 출력에 대해 주어진 입력에서 해당 언어로 지정된 프로그램을 실행하는 방법을 의미합니다.

그러한 언어의 최소 요구 사항은 무엇입니까?


3
언어의 "구현"은 무엇입니까?
Raphael

@Raphael : "프로그래밍 언어"를 "언어"로 변경 한 것은 당신입니다. 편집하기 전에 언어 구현의 의미가 분명했습니다.
Ito Tsuyoshi

@TsuyoshiIto :별로; cstheory.SE에서 변경된 질문과 일치하도록 제목 만 수정했습니다. 다시 변경했지만 그 의미가 아직 명확하지 않습니다. 컴파일러? 통역사? 어쨌든, 거의 1 년 된 여기에서 질문을 마이그레이션하고 질문을 다시 한 번도 다시 방문하지 않은 사용자가 최선을 다해 조언을하지 않았습니다.
Raphael

@Raphael :“언어 구현이란 무엇입니까?” 모든 단서를 제거한 후에는 단순히 내 이해를 초월했습니다. 그러나 나는 그 질문이 처음부터 불분명하다는 것에 동의한다.
이토 쓰요시

"프로그래밍 언어"에 대한 당신의 추정 적 정의가 잘못 생각 된 것 같습니다. 최소한 "기능"을 "계산 가능한 기능"으로 대체하여 수정해야합니다. 그렇지 않으면 왜 언어를 "프로그래밍 언어"라고 부르는지 분명하지 않습니다. 일단 수정하면 "구현할 수없는 프로그래밍 언어"가 없기 때문에 문제는 의미가 없습니다.
Uday Reddy 2016 년

답변:


7

일반적으로 프로그래밍 언어를 구현하는 것은 최소한 Turing-complete 이하의 언어로 된 인터프리터 (또는 컴파일러를 언어로)를 제공하는 것입니다.

이 "정의"를 사용하여 다음과 같은 프로그래밍 언어를 지정할 수 있습니다.

  • 오직 하나의 가능한 프로그램이있다 HALT;

  • 사양 HALT: 정지 문제 를 해결하는 기능입니다 .

이 프로그래밍 언어를 구현하려면 구현에서 정지 문제를 해결해야합니다. (우리의 구현이 Turing 머신보다 강력하지 않아야하므로 불가능합니다).

사양은 논리를 처리하므로 더 많은 것을 요구할 수 있습니다. 구현이 불가능한 다른 사양은 "false"입니다. (또는 사양에서 모순되는 문장) 그러나 이것은 사양처럼 느껴지지 않으므로 중단 문제 예제를 사용했습니다.


1
일반화 : 결정 불가능한 문제를 해결하는 기능을 지정하는 언어는 구현할 수 없습니다.
edA-qa mort-ora-y

@ edA-qamort-ora-y 기술적으로 구현 될 수 있습니다. Halting Problem을 결정할 수는 없지만 TM은 다른 시스템을 시뮬레이션하고 해당 시스템이 중지 된 경우 수락 할 수 있습니다. 그러한 TM에 의해 허용되는 언어는 정지되는 기계의 언어와 정확히 동일 합니다. 그러나 실제적인 목적으로 우리는 일반적으로 프로그래밍 언어의 원시 작업이 종료되도록 보장합니다! (적어도 "민감한"입력에서)
Ben

1
예, 언어의 기능을보다 시간 복잡성을해야 :영형()
EDA-QA 모트 - ORA-Y

@ edA-qamort-ora-y 이것은 항상 사실이 아닙니다. 예를 들어, Haskell의 dentontional semantics에서 1/0 이므로 명백한 비용 모델에서 Ω ( ) 입니다. 실제로 모든 Haskell 구현은 예외와 분기를 구분하며 GHC에는 예외가 어떻게 작동해야하는지 설명하는 특정 작업 의미론이 있습니다. 그러나 0으로 나누면 영원히 반복되는 적합한 구현을 가질 수 있습니다! let loop = loop in loopΩ()
Philip JF

3

그냥 호기심 사이드 참고 : C ++ 템플릿 엔진은 튜링 완료

정리 1 : 인스턴스화 경계가 없으면 C ++ 템플릿은 Turing-complete입니다.

결론 1 : 인스턴스화 제한이 없으면 주어진 프로그램을 컴파일 할 때 C ++ 컴파일러가 중지되는지 여부를 결정할 수 없습니다.

... 그래서 C ++ 자체는 "구현"이 존재하지 않는 프로그래밍 언어로 간주 될 수 있습니다 ... :-D


C "컴파일러"는 생성 된 코드에 신경 쓰지 않고 단순히 진단이 생성 된 경우 인터프리터로 사용될 수 있습니까?
supercat

예. 백서에 표시된 것처럼 컴파일러는 Turing 머신의 계산 기록 (및 최종 테이프 구성)과 일치하는 오류 목록과 함께 중지됩니다. 분명히 입력은 대화식 일 수 없습니다 (컴파일러를 실행하기 전에 소스 코드로 인코딩되어야합니다).
Vor

2

"프로그래밍 언어"와 "언어 구현"의 의미가 무엇인지 확실하지 않습니다. 답을 얻으려면이 두 가지에 대한 엄격한 정의를 제공해야합니다.

Σ2Σ

미디엄미디엄0

그러나 이것은 사람들이 "프로그래밍 언어"라는 문구를 사용할 때 의미하는 종류의 사양 언어가 아닙니다. 프로그래밍 언어는 일반적으로 계산 가능한 기능을 표현하는 (프로세스, ...)과 기계에 지시 사항을 전달하고, 따라서 이들의 프로그램과 출력 결과를 시뮬레이션 할 수있는 TM이하는 언어가 될하기위한 것입니다. 따라서 구현할 수없는 프로그래밍 언어를 갖는 의미는 의미가 없습니다.

(제 생각에는 프로그래밍 언어사양 언어 또는 공식 언어 와 혼동하는 것 같습니다 . 어쨌든 계산할 수없는 언어를 정의 할 수 있습니다.)


"프로그래밍 언어"는 우리가 일반적으로 사용하는 방식의 프로그래밍 언어를 의미한다고 확신합니다. "언어 구현"은 실제 컴퓨터에서 해당 언어로 프로그램을 실행하기위한 환경을 의미합니다. 질문은 공식화 되지 않았지만 확실하지 않은가? 새로운 프로그래밍 언어에 대한 사양을 쉽게 구현할 수 있습니다. 문제는 단순히 언어 구현할 수없는 방식으로 할 수 있는지 묻는 것입니다 .

@Ben, cstheory에서 원래 질문을 보면 제목에만 질문에 단어 프로그래밍이 없음을 알 수 있습니다. OP가 게시 한 질문은 분명합니다. 추신 : 나는 프로그래밍 언어가 무엇인지에 대한 엄격한 (정식 일 필요는 없음) 정의에 관심이 있습니다. 직감과 예제만으로 프로그래밍 언어에 대한 부정적인 결과를 입증 할 수는 없습니다. 정의에 대한 참조가 있으면 질문에 대한 편집 또는 의견으로 게시하십시오.
Kaveh

SE는 사용자가 마이그레이션 및 편집 한 지 9 시간 전에 답변했다고 주장하지만 충분합니다. 어쨌든 나는 원래의 질문에 기초하여 여전히 똑같은 해석을 할 것입니다. 프로그래밍 언어의 정의에 이르기까지, 나는 명백한 언어는 공식적인 문법에 더해 이해하기 쉬운 다른 계산 모델 (람다 미적분학, 튜링 머신 등) 또는 엄격한 작동 의미론에 대한 축소라고 말합니다. 축소 모델은이 질문에 대한 대답을 명백히 "아니오"로 만들 것입니다.

1

구현없이 많은 언어가 지정되었습니다. 예를 들어 Algol 60은 구현되지 않는 알고리즘 작성을위한 언어로 간주되었습니다. 많은 "재미있는"언어 중 일부는 구현이 시작되기 오래 전에 지정되었으므로 Intercal이 떠 오릅니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.