실제로 Turing이 아닌 '유용한'프로그래밍 언어를 가질 수 있습니까?


37

언어가 튜링 완성이어야한다고 인정되는 경우, 실제로 튜링 완성이 아닌 '유용한'프로그래밍 언어를 가질 수 있습니까?

나는 이것이 마크 업이나 쿼리 언어가 아니라 전통적인 의미의 '프로그래밍'언어에 관한 것임을 분명히 명심해야한다.


3
@PhonicUK SQL이 처음에 완료되지 않았습니다
Ryathal

4
@Ryathal SQL은 프로그래밍 언어가 아니라 쿼리 언어입니다.
yannis

2
@PhonicUK 귀하의 질문에 대한 의견은 실제로 가치가 있습니다. 게시 된 질문을 그 것으로 바꾸십시오. 실제로 유용한 튜링이 ​​아닌 완전한 언어가 있으며 자세한 내용을 듣고 싶습니다.
Jimmy Hoffa

5
정규식은 아직 완료되지 않았지만 널리 사용됩니다
ratchet freak

3
@DavidHammen 실제 구현은 물리적 우주의 한계로 인해 제한적입니다 (유한 한 메모리 만 빌드 할 수 있으며 오작동하기 전에 제한된 시간 동안 만 머신을 실행할 수 있음). 그렇다고 언어가 제한되어있는 것은 아닙니다. IOW turing complete language의 스펙 프로그램에 그러한 제한을 두는 구현을 요구하지 않지만 , 비 TC 언어는 예를 들어 종료 증명이 필요합니다.

답변:


48

Coq , Agda , HOLACL2 는 Turing-complete가 아니지만 매우 유용하고 매우 강력한 언어입니다.

튜링 완료가 아닌 일반적인 기능은 종료를 증명할 수 있다는 사실입니다. 매우 간단한 제한으로 충분합니다. 재귀 호출은 구조적으로 더 작은 용어에서만 허용됩니다. 따라서 Turing-complete language 또는 언어 자체에 대한 인터프리터를 구현할 수는 없지만 인증 된 C 컴파일러 와 같은 다른 유용한 기능이 여전히 많이 있습니다 .


2
해당 언어에 익숙하지 않은 사람들을 위해 잃어버린 내용에 대해 더 자세히 설명 할 수 있습니까?
PhonicUK

8
@PhonicUK : C 컴파일러는 C 구현 이 아닙니다 . 한 언어 (C)의 코드를 다른 언어 (일반적으로 기계 코드)로 변환하는 도구입니다. 즉 않습니다 하지 것을 의미하는 C 컴파일러 자체는 어떤 임의의 C 프로그램에 해당합니다.
Joachim Sauer

9
@PhonicUK, 튜링 완료 언어가 아닌 튜링 완료 언어에 대한 통역사를 구현할 수 없습니다. 그러나 튜링 완료 CPU가 실제 평가를 수행하기 때문에 물론 컴파일러를 구현할 수 있습니다.
SK-logic

11
@ SK-logic : "물론?" C에 대해서만 가능합니다. C는 매우 간단한 언어이기 때문입니다. 컴파일러는 템플릿 코드 (컴파일시 Turing-complete)를 해석해야하므로 C ++에서는 불가능합니다.
MSalters

11
@MSalters 그렇습니다. 언어 컴파일이 완료된 경우 컴파일러는 완전한 언어로 작성해야합니다. 어느 것도 명백합니다 (인체를 말하지 않는). 그러나 C ++ 표준은 템플릿 인스턴스화의 최대 평가 깊이와 같은 입력 프로그램에 대한 제한을 허용합니다 (기존 구현에는 이러한 자유가 필요함). 내가 실수하지 않으면 이것은 튜링이 아닌 완전한 C ++ 컴파일러가 가능하다는 것을 의미합니다 (물론 관련없는 문제는 제외).

12

Yegge의 용어 "mini-language"는 언어가 과제를 완수하기 위해 튜링 완성이 필요하지 않은 특정 문제에 대해 언어를 사용하는 것이 종종 유용하다는 사실을 의미한다고 생각합니다. 완전한 언어를 사용하는 것이 유용 할 수 있습니다. https://sites.google.com/site/steveyegge2/language-grubbing

Wikipedia는 내 직감이 말한 것과 정확하게 일치합니다. 먼저 순수한 수학을 생각하고 나서 정규 표현식을 기억했으며 Wikipedia에는 ​​'순수 수학'정맥에 있다고 생각되는 Epigram이 나와 있습니다.

http://en.wikipedia.org/wiki/Turing_completeness#Non-Turing-complete_languages

비 투어 언어

튜링이 완료되지 않은 많은 계산 언어가 존재합니다. 그러한 예 중 하나는 유한 오토마타에 의해 생성되는 가장 일반적인 정규식 인 정규 언어 세트입니다. 유한 오토마타의 더 강력하지만 여전히 튜링-완전 확장은 푸시 다운 오토마타 및 컨텍스트 프리 문법의 범주로, 프로그램 컴파일의 초기 단계에서 구문 분석 트리를 생성하는 데 일반적으로 사용됩니다. 추가 예제에는 Direct3D 및 OpenGL 확장에 포함 된 초기 버전의 픽셀 셰이더 언어 또는 사이클이없는 스프레드 시트의 일련의 수학 공식이 포함됩니다. [인용 필요] 전체 기능 프로그래밍 언어에서 모든 기능은 총계이므로 반드시 자선 및 에피 그램과 같은 종료. 자선 단체는 유형 시스템을 사용하고 범주 이론을 기반으로 한 구성을 제어합니다.

데이터 언어

Turing-completeness의 개념은 XML, JSON, YAML 및 S- 표현식과 같은 언어에는 적용되지 않습니다. 일반적으로 계산을 설명하지 않고 구조화 된 데이터를 나타내는 데 사용되기 때문입니다. 이들은 종종 마크 업 언어 또는 "데이터 설명 언어"라고도합니다.

또한 데이터 구조 표현은 언어가 아니라고 언급하지만 XSLT는 계산 표현으로 계산해야한다고 생각할 것입니다. XPath는 Yannis가 SQL이 쿼리 언어이고 계산 언어가 아니라는 것에 대해 위에서 언급 한 내용을 기반으로하지 않을 것입니다. 아마도 T-SQL 또는 PL / SQL은 계산 언어로 계산되지만 집계를 사용하여 많은 계산을 수행 할 수 있기 때문에 일반화 된 형식의 SQL은 아마도 집계를 지정하지 않습니다.


8

나는 SQL이 비즈니스 유형 사이에서 매우 인기가 있음을 이해합니다


3
SQL은 프로그래밍 언어가 아닌 쿼리 언어입니다.
PhonicUK

4
@PhonicUK : 쿼리 언어와 프로그래밍 언어의 차이점은 정확히 무엇입니까?
Joachim Sauer

8
@PhonicUK-Tex는 텍스트 마크 업 언어이며 튜링 완료입니다
Martin Beckett

3
내가 아는 한 최신 SQL 구현은 완전히 완료되었습니다.
shabunc

6
저장 프로 시저 만있는 @shabunc IIRC 논쟁은 약간 원형이다. 튜링이 완료되지 않으면 프로그래밍 언어가 아니다. 따라서 모든 "프로그래밍"언어는 TC이다.
Martin Beckett

5

언어가 범용 언어로 사용 되려면 튜링 완성도가 필요 합니다. 그러나 충분 하지 않습니다 . 즉 튜링이 완료 되었기 때문에 모든 문제 영역에 적합하지는 않습니다.

  • 공백은 튜링 완료된 것으로 입증되었지만 프로그래머 엔터테인먼트 이외의 문제 영역에는 적합하지 않습니다.
  • C ++ 템플릿은 Turing이 완성 된 것으로 입증되었지만 실제로는 전체 프로그램을 작성하지는 않습니다.

반대로 DSL 은 튜링의 완전성 없이도 설계된 문제 영역에 적합합니다.

  • HTML * 은 DOM 트리를 설명하는 간결한 방법을 제공합니다. JavaScript는 튜링이 완전하고 동일하게 사용할 수 있지만 훨씬 시끄럽고 불분명합니다.
  • XPath 및 기타 쿼리 언어, 임베디드 코드가없는 PCRE 등은 단일 작업을위한 강력한 도구입니다.

* IIRC CSS 애니메이션을 사용하는 HTML은이를 사용하여 Conway의 Game of Life를 다양한 확인란으로 구현함으로써 튜링 완료된 것으로 입증되었습니다. 그러나 CSS 애니메이션을 지원하지 않는 브라우저에서도 HTML의 유용성이 유지됩니다.


2
CSS로 구현 된 Conway 's Life에 대한 링크가 있습니까?
RBerteig

CSS의 CGOL 구현에 대해서는 모르지만 규칙 110이 구현되었음을 알고 있습니다. 찾을 수없는 것 같습니다. 이동 한 것 같습니다.
Christian Mann


-1 매우 흥미롭지 만 질문 된 내용을 다루지 않습니다
mattnz

2
@ mattnz : 잘못되었습니다. 유용하지 않은 튜링이 완료되지 않은 언어에 대한 구체적인 예를 제공합니다. "튜링이 완료되지 않은 '유용한'프로그래밍 언어를 실제로 사용할 수 있습니까?"에 대한 적절한 답변이라고 생각 합니다.
back2dos

3

실제로 "효율적인"프로그램 만 작성할 수있는 프로그래밍 언어가 있습니다. 이러한 의미에서 효율적인 것은 그러한 언어로 작성된 모든 프로그램이의 언어를 나타냄을 의미합니다 P. Bellantoni, Niggl 및 Schwichtenberg 는 이러한 언어를 여기에 설명합니다 .


1

C 전처리가 (설계) 완전한 - 튜링되지 않으며, 아직이 여전히 통역 구현할 수있는 언어에 대한 되는 문서에 설명 된대로 전체 (주문 - 더 - 언어를 튜링를 기본적으로 그냥 실행-의-the-입니다 순전히 기능적인 ML / Scheme 유형을 밀링하고, 비정상적인 구현에 적합하지 않은 경우 사용하기에 상당히 좋을 것입니다.

그 뒤에 숨어있는 트릭은 유한 물리 세계에서 튜링 머신을 구현하는 것에 대한 위의 주장과 비슷합니다 .C 전처리 기는 언어에 무한한 단계 또는 데이터 셀을 제공 할 수 없지만 다음과 같이 할 수 있습니다.

  1. 제공 부당 큰 동적 번호 (기본적으로 2 ^ 64 정도), 기하 급수적으로 팽창 처리 (사용하는 대부분의 현실적인 문제점을 해결하기위한 충분한 중얼 중얼 유니버스의 수명 중얼을 ).

  2. 사용하는 임의의 단계의 수는 일부 한정된 수 있어야합니다 동안에 위의 숫자, 즉 정적 캡을, 당신은 특정 캡 인터프리터 엔진의 정적 설정을 변경하여 "컴파일"- 시간에 무엇을 변경할 수 있습니다. 이 캡의 실제 값에는 (이론) 제한이 없기 때문에, (이론적으로)을 위해 필요한 공간에 맞도록 확장 될 수 있는 종단 프로그램.

Order가 반드시 그 자체로 "유용"하거나 CPP 구현 엔진이 될 것이라고 주장하는 것은 아니지만 흥미로운 개념 증명입니다. 또한 동적으로 입력 된 것으로 추정 되며이 영역에서는 드문 경우입니다.


강의 중간에 중얼 거림에 대한 찬성
jpaugh

-1

그렇습니다. 실제로 튜링이 아닌 유용한 언어를 사용하는 것이 가능합니다. 여기를 참조하십시오 : http://tkatchev.bitbucket.org/tab/examples.html

유용한 Turing 불완전한 언어의 또 다른 예는 SQL입니다. (또 다른 하나는 실제로 프로그래밍 언어가 아니지만 Gnumeric 또는 Excel과 같은 스프레드 시트입니다.)

왜 튜링 완전하지 않은 언어를 원할까요? 런타임 동작에 대해 강력한 보장을 할 수 있기 때문입니다.

튜링 완성도는 분명히 재귀 용량을 의미합니다. 재귀가 있다는 것은 메모리에 무한한 구조를 갖는 것을 의미합니다. 실제 메모리는 무한하지 않기 때문에 튜링 완성도에는 메모리 관리 및 / 또는 가비지 수집이 필요합니다.

재귀 금지는 리소스 관리에서 실제로 어려운 문제를 피하는 좋은 방법입니다.

노 타네! 튜링이 불완전하다고해서 프로그램이 반드시 종료되는 것은 아닙니다. 튜링 언어가 불완전하면 무한 게으른 목록을 평가할 수 있습니다.


-1

하나의 흥미로운 "서브 튜닝 프로그래밍 언어"는 지금까지 언급되지 않았으므로 추가하겠습니다.

그것은라고 "크레마" . 자체를 다음과 같이 설명합니다.

Crema는 튜링 완료 공간에서 구체적으로 실행하는 것을 목표로하는 LLVM 프런트 엔드입니다. 배우기 쉽고, 필요한 대부분의 프로그래밍 작업에 실용적으로 설계된 Crema는 프로그램의 계산 복잡성을 보안 향상에 필요한 최소한으로 제한 할 수 있습니다.

매우 미니멀하고 다소 낮은 수준입니다.

C 개발자에게는 친숙하게 보일 것입니다.

처음에는 DARPA (Defense Advanced Research Projects Agency)에서 자금을 지원 받았지만 지금은 유지 보수가 거의되지 않은 것으로 보입니다. 그럼에도 불구하고 누군가 관심이있을 수 있습니다.

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