왜 일부 프로그래밍 언어 튜링이 완료되었지만 다른 언어의 능력이 부족합니까?


42

외부 프로그램 / 함수에 연결 해야하는 인터프리터를 작성할 때 이상한 문제가 발생했습니다 .'C '및'C ++ '의 함수가변성 함수를 연결할 수 없습니다 . 예를 들어'printf ' 정확히 동일한 인수를 사용하고 대신 variadic 객체를 취하는 대체 버전을 호출해야합니다. 익명 후크를 보유한 객체를 만들 수 있기 때문에 이것은 매우 문제가됩니다.

따라서 Forth , JavaScript 및 기타 언어가 어셈블리 언어 / 기계 코드에 의존하지 않고도 매우 쉽게 수행 할 수 있기 때문에 이것이 이상하다고 생각했습니다 . 다른 언어도 그렇게 쉽게 할 수 있기 때문에, 각각의 프로그래밍 언어가 해결할 수있는 문제의 클래스는 실제로 언어에 따라 달라 지지만, 이러한 언어가 모두 튜링 완료 입니까?


33
타르타르 타르트를 살펴 봐야 합니다. 그들은 의도적으로 가능한 한 적은 수의 작업을 수행하면서도 여전히 완전한 작업을 수행하는 매혹적인 유형의 프로그래밍 언어입니다. 그들 대부분은 기본 데이터 유형, 함수, 변수 선언과 같은 간단한 것조차 부족합니다. 개인적으로, 나는 당신이 당신의 안락 지대에서 당신이 불필요하게 어려운 것을 시도하도록 강요하기 때문에 그것들의 코딩은 큰 즐거움이라고 생각합니다.
DJMcMayhem

8
튜링 머신의 기능을 살펴보면 "튜링-완료"가 매우 낮은 장애물이라는 것을 알 수 있습니다. 기본 산술을 지원하면서 '읽기', '쓰기'및 '점프'할 수있는 것은 Turing-complete입니다. 그것은 당신이보고있는 언어 기능의 수준보다 훨씬 낮습니다.
aroth

2
더 이상하게 말하면 x86 프로세서의 MOV 명령은 Turing-complete입니다. 자세한 내용은 cl.cam.ac.uk/~sd601/papers/mov.pdf 를 참조 하십시오.
Gareth McCaughan

3
카드 게임 Magic : The Gathering조차 튜링이 완성되었습니다. 튜링 완성도는 언어의 특징과 거의 관련이 없습니다.
Mast

2
BTW는 검증 체커와 같이 완전하지 않은 매우 복잡한 프로그래밍 언어도 있습니다.
盛安安

답변:


68

NkN

λ

튜링 완성도는 유형, 내장 배열 / 정수 / 사전, 입력 / 출력 기능, 네트워크 액세스, 멀티 스레딩, 동적 할당 등에 대해 아무 것도 말하지 않습니다.

Java에 기능 X (예 : 매크로, 상위 유형 또는 종속 유형)가 없기 때문에 갑자기 튜링 완료를 중단하지 않습니다.

튜링 완전성과 언어 표현은 두 가지 다른 개념입니다.


42
Idris의 디자이너 인 Edwin Brady는 (반만) "Tetris-complete"라는 용어를 농담으로 사용합니다. "자연수에 대한 계산 가능한 함수 계산"과 "Can 환경과 상호 작용하는 사소한 프로그램을 작성하는 데 사용됩니다 ".
Jörg W Mittag

12
또한 C / C ++에서 그런 것들을 가질 수 있다고 언급 할 수도 있습니다. 코드가 C / C ++ 코드에서 문자열을 컴파일하는 다른 언어를 위해 C / C ++에서 컴파일러 역할을하는 일부 코드를 작성해야합니다. 그런 다음 C 파일 내에서 Java와 같은 프로그래밍을 할 수 있습니다. 이것은 모두 많은 작업이 될 수 있지만 가능합니다 (아마도 C / C ++이 Turing Complete이기 때문에 가능합니다).
Shufflepants

4
@Shufflepants 그러나 "다른 언어를 해석 할 수 있기 때문에 C ++로 할 수있다"고 말하는 것이 정말 유용한 지 궁금합니다. 이 토큰으로 Java, ML, C ++는 동일합니다. syscall (I / O)을위한 오라클이 포함 된 TM도 동일합니다. 나는 이러한 추론에 의해 사실상 모든 언어가 똑같이 표현 적이라고 두려워한다. 그렇다면 언어를 비교하는 것은 유용한 개념이 아닙니다.
chi

9
@chi 당신은 맞습니다, 그들은 동등합니다. 그것이 Turing Complete라는 의미입니다. 하나의 Turing Complete 시스템으로 수행 할 수있는 모든 작업은 다른 Turing Complete 시스템에서 수행 할 수 있습니다. 특정 시스템에서 수행하는 것이 편리하지 않을 수 있습니다. 다양한 일을하는 것의 편리함은 다른 프로그래밍 언어를 비교하는 기본 방법입니다. 그러나 그것은 질문이 요구 한 것이 아닙니다.
Shufflepants

5
@Rhymoid C가 메모리 액세스 이유로 인해 완전하지 않거나 임의의 신호를 임의로 큰 저장 장치가있는 연결된 장치로 보낼 수없는 경우 실제 언어 나 장치가 Turing Complete라고 주장 할 수 없습니다 . 그러나 나는 그것이 매우 생산적인 추론이라고 생각하지 않습니다.
Shufflepants

47

튜링 완성도는 계산 성의 추상 개념입니다. 언어가 Turing 완료 인 경우 다른 Turing 완료 언어가 수행 할 수있는 계산을 수행 할 수 있습니다.

그러나 이것이 그렇게 편리한 방법은 아닙니다. 디자인 선택으로 인해 일부 언어에서는 쉬운 일부 기능이 다른 언어에서는 매우 어려울 수 있습니다. 튜링 완성도 는 계산 을 할 있다고 말합니다 . 극단적 인 예로서, C ++에서 varadic 함수를 연결하는 것이 어려울 수 있지만, v ++ 함수를 연결할 수있는 C ++로 JavaScript 인터프리터를 작성할 수 있습니다.

언어 디자인은 꽤 흥미로운 예술입니다. 수행해야 할 주요 단계 중 하나는 언어의 중추를 형성하려는 행동을 식별하는 것입니다. 이러한 행동은 1 층에 내장되어 있기 때문에 귀하의 언어로하기 쉬운 것입니다. 모든 언어에 포함 할 기능에 대한 디자인 결정을 내립니다.

특정 예에서 C가 개발되었을 때, 오늘날의 어셈블리 언어가 작동하는 방식에 매우 가깝게 작동하도록 설계되었습니다. Variadic 함수는 형식 안전성이 거의없는 인수를 스택에 푸시했습니다. 이러한 가변성 기능의 구현은 최대 이식성을 보장하기 위해 컴파일러에 맡겨졌습니다. 따라서 하드웨어 기능에 대한 가정은 거의 없었습니다. JavaScript가 등장 할 당시에는 상황이 바뀌 었습니다. 이미 가상 머신에서 통역 언어로 작동하기 때문에 균형이 편의를 향해 이동합니다. 가변 기능의 연결을 허용하는 것이 합리적이됩니다. Just In Time Compiled 인 JavaScript의 경우에도 컴파일러는 yore의 C 컴파일러가 저장하고자하는 것보다 인수에 대한 추가 정보를 기꺼이 저장하려고합니다.


1
@Wildcard 나는 (가상적으로) 모든 컴파일러를 이것을 소리없는 것으로 간주합니다. 대부분의 언어는 튜링이 완료되었지만 결국 어셈블리에 의해 해석 / 컴파일되어야합니다. 그러나 이것은 물리적으로 필요한 한계입니다. 하드웨어는 결코 강력하지 않습니다. 그럼에도 불구하고 계산 기능은 실제 의미에서 실제 컴퓨터에 "적용"하는 많은 유용한 개념을 제공합니다.
chi

3
@Wildcard 그 사소한 의미에서. 어셈블리 (및 C)에는 제한된 크기의 메모리 만 처리 할 수있는 고정 크기 포인터가 있습니다. 이론적으로 말하면 포인터가 무한한 어셈블리를 정의 할 수는 있지만 더 이상 "어셈블리"라고 부르지 않을 것입니다. URM 또는 이와 유사한 것을 호출합니다. 실제로 우리는 단순히 물리적 경계가 프로그램을 실행할 수있을만큼 충분히 크다고 가정합니다. 따라서 컴퓨터가 유한 상태 기계 (예를 들어 추가를 수행 할 수 없음을 의미 함) 인 경우에도 튜링 기계 (Turing Machine)라고 생각합니다. 따라서 추가가 가능합니다).
chi

4
@chi 그것은 정확하지 않습니다. 우선, 사실상 모든 사람은 C가 튜링 완료라고 생각합니다. 일반적으로 "충분한 메모리가 있습니다"라는 가정에 대한 문구를 할당하기 때문입니다. 그러한 가정이 유효하지 않은 더 엄격한 문구에 대해 걱정해야하는 소수의 사람들에게 C는 포인터의 크기를 지정하지 않으며, 얼마나 많은 메모리를 처리 할 수 ​​있는지에 대한 경계를 지정하지 않습니다. 따라서 "Turing complete"라는 절대 엄격한 의미에서도 C는 실제로 Turing complete입니다.
Cort Ammon

3
@CortAmmon 동의하지 않습니다. C의 의미를 공식화하고 "충분한 메모리"가정을 포함하려고 시도 sizeof(void *)하면 ISO C 표준에 따라 무언가를 평가해야 하므로 실패 합니다. 이로 인해 특정 프로그램의 메모리 양을 큰 것으로 제한하지만 여전히 바운드로 묶습니다. 예를 들어, 시맨틱이 임의의 자연을 추가하는 프로그램을 작성할 수 없습니다. TM은 테이프와 같은 파일을 사용하여 I / O를 통해 튜링을 강력하게 만들 수 있습니다 (위의 @Hurkyl이 지적한 것처럼). 나는 이것이 실제로 문제가 아닌 것에 동의합니다.
chi

7
재귀 또는 힙 할당을 통해 너무 많은 메모리가 할당되는 경우를 제외하고 프로그램이 중단되고 sizeof (void *) 및 sizeof (size_t)에 대해 더 큰 값으로 다시 컴파일되는 경우를 제외하고는 정확히 C와 같은 새로운 언어 C-inf를 제안합니다. 시작부터 다시 시작합니다.
gnasher729

26

프로그래밍 언어를 자전거, 자동차, 호버 카, 기차와 같은 다른 육상 차량으로 생각하십시오.

Turing Completeness는 "이 차량은 다른 차량이 갈 수있는 곳이면 어디든 갈 수 있습니다"라고 말합니다. 즉, 동일한 기능을 모두 계산할 수 있습니다. 출력을 입력하고 종료합니다.

그러나 그 진술은 당신이 어떻게 가는지에 대해서는 아무 것도 말하지 않습니다 . 철도에있을 수도 있고, 도로에있을 수도 있고, 공중에있을 수도 있습니다. 같은 방식으로 Turing Completeness는 함수 계산 방법대해서는 아무 것도 말하지 않습니다 . 재귀, 반복 또는 이상한 셀룰러 오토마타를 사용할 수 있습니다. 유형을 사용하거나 사용하지 않고 동적 또는 정적 기술을 사용할 수 있습니다. 그러나 Turing Complete를 사용하는 한 계산할 수있는 함수 (또는 세트 / 공식 언어) 만 고려한다면 이러한 기능은 동일한 기능을 제공합니다.


4
이것은 훌륭한 비유입니다. 그것은 또한 내가 튜링 기계를 능가하는 계산의 다른 모델이있을 수 있는지 여부로,이 사이트에 다른 곳에서 본 적이 질문에 친절하게 확장이 비유에서, 비행기와 우주선은 보다 완벽한 튜링 및 쾌속정은 또 다른입니다 기계의 유형. :)
와일드 카드

2
가벼운 여행보다 빠른 것은 아마도 슈퍼 투어링 계산에 더 나은 유추입니다. 이 할 수 있지만, 대부분의 사람들은 그렇지 않은 것 같아요.
jmite

@jmite 물론 우리의 두뇌가 컴퓨터를 과도하게 사용하고 있다는 증거는 아직 없습니다. 비 투어링 머신을 고려할 수없는 우리의 (명백한) 능력은 그로부터 비롯 될 수 있지만 반드시 극복 할 수없는 장벽은 아닙니다. 비행기는 실제로 아주 좋은 비유입니다. 두 지점 사이를 똑바로 이동하여 지형을 무시합니다. 시공간 자체의 토폴로지를 무시할 수 있다면 빛보다 빠르게 비행 할 수 있습니다. 시공간의 토폴로지를 무시할 있다고 말하는 것이 아닙니다. :)
Luaan

1
@Luaan 맞습니다. 그러나 우리의 두뇌가 슈퍼 튜링 컴퓨터를 이해하기 위해 반드시 슈퍼 튜링 일 필요는 없습니다. TM 및 해당 상태를 가져 와서 다음 상태로 스테핑하는 함수를 작성하여 Simply Typed Lambda Calculus와 같이 약한 종료 언어를 사용하여 튜링 머신의 의미를 설명 할 수 있습니다. 실제로 해당 언어로 컴퓨터를 실행할 수는 없지만 (무한 단계가 필요할 수 있기 때문에) 각 단계의 모양을 작성할 수 있습니다.
jmite

@Luaan은 "우리의 두뇌가 컴퓨터를 과도하게 튜링하고 있다는 증거는 아직 없다"고 생각하지만 인간의 마음이 단지 튜링 머신 이라는 것을 암시하는 증거는 없다 . 아이디어를 추적 할 수없는 어느 곳을 지적 할 수있는 튜링 기계가 없기 때문에 인간에 의해 유래 마음이 있음을 구별 아직 인생을시작된 아이디어를, 기계적 고안은 할 수 없습니다가. 그러나 계산 모델의 경우 , 튜링 머신은 합리적으로 "계산", 아이디어 및 꿈이라고 할 수있는 모든 것을 포괄한다고 생각합니다.
와일드 카드

17

당신이 본질적 대해 요구하는 것은 사이의 차이 연산 능력 과 어떤 일반적이라고 표현력 (또는 표현 (계산 또는 시스템)) 언어의를.

계산력

연산 능력은 문제의 종류의 언어가 계산할 수있는 일을 의미합니다. 가장 잘 알려진 계산 능력은 Universal Turing Machine 과 동일합니다 . Random Access Machines , λ-calculus , SK combinator calculus , µ-recursive 함수 , WHILE프로그램 및 기타와 같은 다른 계산 시스템이 많이 있습니다. 그리고이 모든 것이 서로를 시뮬레이션 할 수 있으며, 이는 모두 같은 계산 능력을 가지고 있음을 의미합니다.

이것은 교회 튜링 논문 ( λ-calculus를 만든 Alonzo Church 와 Universal Turing Machine을 만든 Alan Turing의 이름을 따서 지어 짐) 을 일으킨다 . Church-Turing-Thesis는 다음 두 가지 측면에서 계산 가능성에 대한 가설입니다.

  1. 일반 계산이 가능한 모든 컴퓨팅 시스템은 똑같이 강력하며
  2. 알고리즘을 따르는 사람은 Turing Machine (및 기타 시스템)이 계산할 수있는 기능을 정확하게 계산할 수 있습니다.

두 번째는 컴퓨터 과학보다 마음의 철학 분야에서 더 중요합니다.

그러나 Church-Turing-Thesis 말하지 않은 두 가지 사항이 있습니다.

  1. 다양한 시뮬레이션이 얼마나 효율적 인지
  2. 문제의 인코딩이 얼마나 편리한 지 .

(1)의 간단한 예 : Random Access Machine에서 어레이를 복사하는 데는 어레이 길이에 비례하는 시간이 걸립니다. 그러나 Turing Machine에서는 배열 길이의 제곱 에 비례하는 시간이 걸립니다 . Turing Machine은 임의의 메모리 액세스가 없기 때문에 한 번에 한 셀 씩만 테이프를 가로 질러 이동할 수 있습니다. 따라서 배열 의 n 개 요소를 n 번 이동하여 복사해야합니다. 따라서 구현 세부 사항에서 추상화하려고 시도하는 점근 적 경우에도 계산 모델마다 성능 특성이 다를 수 있습니다.

(2)에 대한 예는 풍부합니다. λ- 미적분과 파이썬 은 모두 Turing-complete입니다. 그러나 파이썬이나 λ- 미적분으로 프로그램을 작성 하시겠습니까?

제가 지금까지 주름을 잡은 세 번째 주름도 있습니다. 모든 원래 시스템은 컴퓨터 과학자가 아닌 논리 학자, 철학자 또는 수학자에 의해 설계되었습니다. 단순히 컴퓨터와 컴퓨터 과학이 존재하지 않았기 때문입니다. Konrad Zuse첫 번째 실험 (프로그래밍 및 / 또는 Turing-complete가 아니 었음) 이전에도이 모든 것은 1930 년대 초로 거슬러 올라갑니다 . 그들은 "자연수에 대한 계산 가능한 기능"에 대해서만 이야기합니다.

이제 밝혀진 바와 같이, 자연수에 대한 함수로 표현할 수 있는 것이 많이 있습니다. 결국 현대 컴퓨터는 그보다 훨씬 적은 수를 얻습니다 (기본적으로 숫자 0과 1에 대한 3-4 개의 함수, 그게 전부입니다) 예를 들어 운영 체제는 어떤 기능을 계산합니까?

환경과 상호 작용하는 부작용 인 I / O의 개념은 "자연수에 대한 함수"라는 개념에 의해 포착되지 않습니다. 그럼에도 불구하고, 그것으로, 이후 어떤 중요한 것입니다 사이먼 페이튼 존스가 한 번 넣어 "뜨거운 당신의 CPU를 만들 것입니다 않습니다 어떠한 부작용으로 모두에게 순수한 기능을" 청중 대답하는에, 그, 실제로 " 입니다 측면이 -효과도! "

Idris 의 디자이너 인 Edwin Brady (반만)는 "Tetris-complete"라는 용어를 농담으로 사용합니다. 환경과 상호 작용하는 사소한 프로그램을 작성하는 데 사용됩니다 ". 더 아이러니하게도, 그는 Idris에서 Space Invaders 클론을 구현함으로써 이것을 증명 하지만, Tetris가 Space Invaders로 줄어든다고 확신합니다.

지적해야 할 또 다른 사항은 Turing-equivalence 가 실제로 "유용한"프로그램 작성에 대해 이야기하기에 충분 하지 않을뿐만 아니라 OTOH도 필요 하지 않을 수도 있다는 것 입니다. 예를 들어 SQL은 ANSI SQL : 1999에서만 Turing과 동일 해졌 지만 그 전에는 여전히 유용했습니다. 실제로 일부 사람들은 튜링과 동등하게 만드는 것이 그 유용성에 전혀 추가되지 않았다고 주장 할 수도 있습니다. 튜링과 동등하지 않은 많은 도메인 특정 언어가 있습니다. 데이터 설명 언어는 일반적으로 사용되지 않아야합니다. 전체 언어는 분명히 튜링과 동일 할 수는 없지만 여전히 이벤트 루프, 웹 서버 또는 운영 체제를 작성할 수 있습니다. 튜링과 동등한 언어이지만 실제로는 실수로 간주되는 언어도 있습니다.

따라서 프로그램을 정적으로 분석하지 않는 한 Turing-equivalence는 전혀 흥미롭지 않습니다.

표현력

우리의 계산 시스템이 우리의 문제를 전혀 해결할 수 없을 정도로 계산적으로 강력하다고 가정 할 때, 우리가해야 할 일은 그 문제를 해결하기위한 알고리즘을 해당 시스템에 대한 공식적인 표기법으로 표현하는 것입니다. 다시 말해, 우리는 컴퓨터 언어로 프로그램을 작성해야합니다. 그것이 표현 의 개념이 나오는 곳입니다.

본질적으로 특정 프로그래밍 언어로 프로그램을 작성하는 것이 얼마나 "쉬운"또는 "즐거운"것인지를 말합니다. 보시다시피, 개념은 기술보다 상당히 모호하고 주관적이며 심리적입니다.

그러나보다 정확한 정의가 시도됩니다. 가장 유명한 것 (그리고 내가 알고있는 것 중 가장 엄격한 것)은 Matthias Felleisen 이 그의 논문 에서 프로그래밍 언어의 표현력에 관한 것입니다 (처음 두 페이지는 온화한 소개를 포함하고 나머지는 더 고기입니다).

다른 언어로 언어에서 프로그램을 번역 할 때, 당신이해야 할 몇 가지 변화가 로컬 (예 : 예 : 전환으로 포함되어 있습니다 : 메인 직관이 있습니다 FOR에 루프를 WHILE루프 또는 조건부로 루프 GOTO들), 일부는 세계에 대한 변경이 필요 프로그램의 구조.

로컬 변환만으로 한 언어의 한 기능을 다른 언어의 다른 기능으로 대체 할 수있는 경우 이러한 기능은 표현력에 영향을 미치지 않는다고합니다. 이것을 구문 설탕 이라고 합니다.

반면, 프로그램의 전체 구조를 변경해야하는 경우 번역하려는 언어가 기능을 표현할 수 없다고합니다. 그리고 당신이 번역하는 언어는 (이 기능과 관련하여) 더 표현력 이 있다고합니다 .

이것은 표현의 객관적으로 측정 가능한 정의를 제공합니다. 또한 개념은 기능에 따라 상황에 따라 달라지며 비교됩니다. 따라서 언어 A의 모든 프로그램을 로컬 변경만으로 언어 B 로 변환 할 수 있고 로컬 B 만 변경 하여 A 로 변환 할 수 없는 언어 B의 프로그램이 하나 이상 있으면 언어 B 가 언어보다 엄격하게 표현됩니다 에이. 그러나 두 가지 언어로 된 많은 프로그램을 앞뒤로 번역 할 수 있지만 두 언어로 된 일부 프로그램은 다른 언어로 번역 할 수 없습니다. 이는 어느 언어도 다른 언어보다 엄격하게 표현하지 않으며, 다른 프로그램을 다른 방식으로 표현할 수있는 다른 기능을 가지고 있음을 의미합니다.

이것은 "보다 표현력이있다"는 것이 무엇을 의미하는지에 대한 공식적인 정의를 제공하지만, 현상의 심리적 개념을 여전히 포착하지는 못한다. 예를 들어,이 모델에 따르면 구문 설탕은 언어의 표현력을 향상시키지 않습니다. 언어의 로컬 힘만 사용하여 번역 할 수 있기 때문입니다. 그러나 우리가 경험에서 알고 가지고 FOR,이 WHILE, 그리고 IF그들이 조건부 단지 문법 설탕 경우에도 가능한 GOTO우리의 의도를 표현하는 차종 쉽게가 .

사실, 언어마다 다른 기능을 사용하여 문제에 대한 다른 사고 방식을 더 쉽고 어렵게 표현할 수 있습니다. 그리고 어떤 사람들은 자신의 의도를 더 쉽게 표현하는 한 가지 방법을 찾고 다른 사람들은 다른 방법을 찾을 수도 있습니다.

StackOverflow의 Ruby 태그에서 찾은 예 : Ruby 태그를 따르는 많은 사용자는 루프가 재귀보다 이해하기 쉽고 재귀는 고급 기능 프로그래머에게만 해당하며 루프는 초보자에게는 더 직관적이라고 주장하지만 다음과 같이 코드를 직관적으로 작성하는 완전한 신규 이민자 :

def rock_paper_scissors
  get_user_input
  determine_outcome
  print_winner
  rock_paper_scissors # start from the top
end

어떤 사람들은 일반적으로 "이것이 작동하지 않습니다"와 "그들이 잘못하고 있습니다"라고 "정확한 방법"이라고 말합니다.

def rock_paper_scissors
  loop do
    get_user_input
    determine_outcome
    print_winner
  end
end

따라서 꼬리 재귀가 루프 구성보다 "루핑"의 개념을 표현하는 더 자연스러운 방법 인 사람들이 있습니다.

요약

두 언어가 튜링과 동등하다는 사실은 똑같이 정확히 한 가지를 말합니다. 튜링 머신처럼 자연수에서 동일한 함수 세트를 계산할 수 있다는 것입니다. 그게 다야.

그것들이 얼마나 빨리 그 함수들을 계산하는지에 대해서는 아무 말도하지 않습니다. 이러한 기능을 쉽게 표현할 수 있다는 말은 없습니다. 그리고 자연수에 대한 계산 기능 외에도 (C 라이브러리에 연결, 사용자의 입력 읽기, 화면에 출력 쓰기) 다른 기능을 수행하지 않습니다.

이것은 각 프로그래밍 언어가 완전히 해결할 수있는 문제의 클래스가 언어에 따라 다양하다는 것을 의미합니까?

예.

  1. 화면에 인쇄하는 것과 같이 "Turing-complete"라는 용어 (자연수에 대한 컴퓨팅 기능에만 관련됨)라는 용어로 다루지 않는 문제가 있습니다. 두 언어는 튜링이 완료 될 수 있지만 하나는 화면에 인쇄 할 수 있고 다른 하나는 인쇄 할 수 없습니다.
  2. 두 언어가 모두 같은 문제를 해결할 수 있더라도 인코딩이 얼마나 복잡한 지,이 인코딩을 표현하는 것이 얼마나 쉬운 지에 대해서는 아무 말도하지 않습니다. 예를 들어 C는 Haskell 인터프리터를 C로 작성하여 Haskell이 할 수있는 모든 문제를 해결할 수 있습니다… 그러나 이런 식으로 문제를 해결하려면 Haskell 인터프리터를 먼저 작성해야합니다!

7

모든 Turing 완전한 프로그래밍 언어는 동일한 알고리즘 세트를 구현할 수 있습니다. 따라서 특정 알고리즘으로 구현하기가 매우 어려운 알고리즘이 있다고해서 이것이 불가능하다는 의미는 아닙니다.

언어는 구문과 의미로 구성됩니다. 때로는 일부 언어에 속하는 단어 집합이 튜링 완료로 간주되는 것이 최소가 아닙니다. 일을 더 쉽게 만들어주는 기능있습니다 ( 그러므로 기능 이라고 합니다 ). 이러한 기능을 사용하면 언어는 여전히 튜링 완료입니다.

이 중 일부는 관심이있을 수 있습니다.


5

튜링 완료 언어는 모두 같은 것을 계산할 수 있습니다.

현대 언어를 구현하려고하면 대부분의 기능이 계산 기능을 추가 하지 않는다는 것을 알 수 있습니다. 이러한 기능 중 다수는 동일한 언어로 이미 존재하는 간단한 기능으로 낮출 수 있습니다.

여기 몇 가지 예가 있어요.

  • 열거 형이 없으면 정수를 사용할 수 있습니다.
  • 크기를 알고있는 버퍼가없는 경우 크기와 크기를 모르는 버퍼를 포함하는 유형을 만들 수 있습니다.
  • 버퍼에 대한 경계 검사가없는 경우 사용할 때마다 인덱스를 확인할 수 있습니다.
  • variadic 함수가없는 경우 크기를 알고있는 버퍼를 가져 와서 공식 인수에서 얻은 것과 동일한 정보를 해당 버퍼에서 읽는 함수를 작성할 수 있습니다.
  • 연산자가 없으면 함수를 사용할 수 있습니다.
  • 서로 상속 할 수있는 유형이없는 경우 서로를 포함하는 유형을 만들고 추가 간접 수준을 통해 해당 유형에 액세스 할 수 있습니다. 하위 유형 지정은 단순히 핸들에서 전체 유형으로 포함 된 핸들.
  • 대리자는 없지만 함수 포인터가있는 경우 참조 객체와 함수 포인터가 포함 된 유형을 만들 수 있습니다.
  • 델리게이트가 없지만 인터페이스가있는 경우 원하는 서명이있는 단일 메소드가 포함 된 인터페이스를 선언 할 수 있습니다.
  • 일반 유형이없는 경우 관심있는 상한 또는 하한 만 가정하는 일반적인 유형이 아닌 유형을 사용할 수 있습니다 (컴파일러를 만족시키기 위해 사용 지점에서 적절한 캐스트를 수행 할 수도 있음).
  • 선형 / 병렬 유형 시스템이없는 경우 변수를 두 번 이상 사용하지 않아도됩니다.
  • ...등등.

주류 언어의 디자인은 만드는 기능에 초점을 맞추고 쉽게 그리고 더 편리 이전 등 알 수없는 구성 요소, 메이크업 병렬 안전에 대한 프로그램을 우리의 실수를 인정, 우리가 더 빨리 일을 계산하기.

순전히 계산적인 것들이 오래 전에 쓰러졌습니다.


4

기존 답변은 Turing 완전성이 언어를 비교하는 좋은 방법이 아니라고 지적합니다. 실제로 거의 모든 언어가 튜링 완료되었습니다. 인크레더블의 말처럼 "모든 사람이 특별하다면 아무도 특별하지 않습니다."

그러나, 이다 수학 정밀 언어의 표현력을 비교할 수. Felleisen의 프로그래밍 언어의 표현력을 살펴보십시오 . 대략 다음과 같은 질문을하는 것이 좋습니다. 언어 A의 프로그램을 로컬 로만 변경 하여 언어 B의 프로그램으로 변환 할 수 있습니까 ? 다시 말해, Felleisen은 직감에 수학적으로 정확한 형태를 제공합니다.


2

다른 사람들의 대답 외에도 여기에 또 다른 비유가 있습니다.

옷을 씻으려면 물을 담는 저수지, 어떤 종류의 세제 및 교반 메커니즘이 필요합니다. 이것은 여러 가지 방법으로 실현 될 수 있습니다. 물통은 충분한 물 (예 : 욕조, 호수, 강)을 보유하고있는 것입니다. 교반 메커니즘은 기계 장치, 빨래판 또는 심지어 옷을 때리는 바위 일 수있다. 세제도 다양한 형태로 제공됩니다.

그렇다면 현대 컴퓨터 세탁기와 강 옆의 바위의 차이점은 무엇입니까?

효율성, 안전성 및 편의성의 세 가지로 요약됩니다. 일부 세탁 방법은 에너지를 덜 사용하고 환경을 더 적게 오염 시키며 물을 적게 사용하는 등의 방법을 사용합니다. 일부 세탁 방법은 덜 반복적 인 수동 활동 (부상으로 이어짐)이 필요하거나 악천후시 외부에 있어야합니다. 그리고 어떤 세척 방법은 사람이 프로세스를 보모 할 필요가 없습니다.

튜링 완료 프로그래밍 언어는 범용이므로 둘 이상의 작업에 적용됩니다. 그럼에도 불구하고, 주어진 작업에 대해 일부 프로그래밍 언어는 다른 프로그램보다 더 효율적이고 편리하며 안전합니다 (프로그램이 실제로 사용될 때 오류가 줄어든다는 의미에서).


2

다른 사람들은 많은 좋은 답변을 제공했지만 한 번 나에게 많은 혼란을 초래 한 한 가지주의 사항을 명시 적으로 언급하지는 않습니다. 튜링 완성도는 언어가 입력에서 출력까지 임의의 계산 가능한 기능을 표현할 수 있음을 의미하지는 않습니다. 더 약합니다. 계산 가능한 함수 세트의 도메인과 범위를 입력 및 출력으로 표시하는 방법 이 있어야합니다. 따라서 이러한 각 함수는 해당 입력을 해당 출력으로 표시하는 프로그램에 맵핑됩니다.

예를 들어 튜링 머신을 표현하는 언어를 생각해보십시오. 언어의 각 프로그램은 튜링 머신입니다.

이제 문자 a, b 및 공백 만 읽고 쓰는 모든 Turing 머신의 하위 언어를 고려하십시오. Turing 완료이지만 cs를 작성할 수 없으므로 모든 입력에서 c를 생성하는 프로그램을 표현할 수 없습니다. as 및 bs의 문자열로 인코딩 된 입력 및 출력에 대해 계산 가능한 모든 기능 만 표현할 수 있습니다.

따라서 모든 Turing-complete 언어가 잠재적 인 입력에서 잠재적 인 출력으로 계산 가능한 함수로 제한하지 않더라도 모든 Turing-complete 언어가 동일한 것을 계산할 수는 없습니다. 언어는 특정 방식으로 입력 및 출력을 인코딩하도록 요구할 수 있습니다.

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