언어가 튜링 완성이어야한다고 인정되는 경우, 실제로 튜링 완성이 아닌 '유용한'프로그래밍 언어를 가질 수 있습니까?
나는 이것이 마크 업이나 쿼리 언어가 아니라 전통적인 의미의 '프로그래밍'언어에 관한 것임을 분명히 명심해야한다.
언어가 튜링 완성이어야한다고 인정되는 경우, 실제로 튜링 완성이 아닌 '유용한'프로그래밍 언어를 가질 수 있습니까?
나는 이것이 마크 업이나 쿼리 언어가 아니라 전통적인 의미의 '프로그래밍'언어에 관한 것임을 분명히 명심해야한다.
답변:
Coq , Agda , HOL 및 ACL2 는 Turing-complete가 아니지만 매우 유용하고 매우 강력한 언어입니다.
튜링 완료가 아닌 일반적인 기능은 종료를 증명할 수 있다는 사실입니다. 매우 간단한 제한으로 충분합니다. 재귀 호출은 구조적으로 더 작은 용어에서만 허용됩니다. 따라서 Turing-complete language 또는 언어 자체에 대한 인터프리터를 구현할 수는 없지만 인증 된 C 컴파일러 와 같은 다른 유용한 기능이 여전히 많이 있습니다 .
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은 아마도 집계를 지정하지 않습니다.
나는 SQL이 비즈니스 유형 사이에서 매우 인기가 있음을 이해합니다
언어가 범용 언어로 사용 되려면 튜링 완성도가 필요 합니다. 그러나 충분 하지 않습니다 . 즉 튜링이 완료 되었기 때문에 모든 문제 영역에 적합하지는 않습니다.
반대로 DSL 은 튜링의 완전성 없이도 설계된 문제 영역에 적합합니다.
* IIRC CSS 애니메이션을 사용하는 HTML은이를 사용하여 Conway의 Game of Life를 다양한 확인란으로 구현함으로써 튜링 완료된 것으로 입증되었습니다. 그러나 CSS 애니메이션을 지원하지 않는 브라우저에서도 HTML의 유용성이 유지됩니다.
실제로 "효율적인"프로그램 만 작성할 수있는 프로그래밍 언어가 있습니다. 이러한 의미에서 효율적인 것은 그러한 언어로 작성된 모든 프로그램이의 언어를 나타냄을 의미합니다 P
. Bellantoni, Niggl 및 Schwichtenberg 는 이러한 언어를 여기에 설명합니다 .
C 전처리가 (설계) 완전한 - 튜링되지 않으며, 아직이 여전히 통역 구현할 수있는 언어에 대한 되는 문서에 설명 된대로 전체 (주문 - 더 - 언어를 튜링를 기본적으로 그냥 실행-의-the-입니다 순전히 기능적인 ML / Scheme 유형을 밀링하고, 비정상적인 구현에 적합하지 않은 경우 사용하기에 상당히 좋을 것입니다.
그 뒤에 숨어있는 트릭은 유한 물리 세계에서 튜링 머신을 구현하는 것에 대한 위의 주장과 비슷합니다 .C 전처리 기는 언어에 무한한 단계 또는 데이터 셀을 제공 할 수 없지만 다음과 같이 할 수 있습니다.
제공 부당 큰 동적 번호 (기본적으로 2 ^ 64 정도), 기하 급수적으로 팽창 처리 (사용하는 대부분의 현실적인 문제점을 해결하기위한 충분한 중얼 중얼 유니버스의 수명 중얼을 ).
사용하는 임의의 단계의 수는 일부 한정된 수 있어야합니다 동안에 위의 숫자, 즉 정적 캡을, 당신은 특정 캡 인터프리터 엔진의 정적 설정을 변경하여 "컴파일"- 시간에 무엇을 변경할 수 있습니다. 이 캡의 실제 값에는 (이론) 제한이 없기 때문에, (이론적으로)을 위해 필요한 공간에 맞도록 확장 될 수 있는 종단 프로그램.
Order가 반드시 그 자체로 "유용"하거나 CPP 구현 엔진이 될 것이라고 주장하는 것은 아니지만 흥미로운 개념 증명입니다. 또한 동적으로 입력 된 것으로 추정 되며이 영역에서는 드문 경우입니다.
그렇습니다. 실제로 튜링이 아닌 유용한 언어를 사용하는 것이 가능합니다. 여기를 참조하십시오 : http://tkatchev.bitbucket.org/tab/examples.html
유용한 Turing 불완전한 언어의 또 다른 예는 SQL입니다. (또 다른 하나는 실제로 프로그래밍 언어가 아니지만 Gnumeric 또는 Excel과 같은 스프레드 시트입니다.)
왜 튜링 완전하지 않은 언어를 원할까요? 런타임 동작에 대해 강력한 보장을 할 수 있기 때문입니다.
튜링 완성도는 분명히 재귀 용량을 의미합니다. 재귀가 있다는 것은 메모리에 무한한 구조를 갖는 것을 의미합니다. 실제 메모리는 무한하지 않기 때문에 튜링 완성도에는 메모리 관리 및 / 또는 가비지 수집이 필요합니다.
재귀 금지는 리소스 관리에서 실제로 어려운 문제를 피하는 좋은 방법입니다.
노 타네! 튜링이 불완전하다고해서 프로그램이 반드시 종료되는 것은 아닙니다. 튜링 언어가 불완전하면 무한 게으른 목록을 평가할 수 있습니다.
하나의 흥미로운 "서브 튜닝 프로그래밍 언어"는 지금까지 언급되지 않았으므로 추가하겠습니다.
그것은라고 "크레마" . 자체를 다음과 같이 설명합니다.
Crema는 튜링 완료 공간에서 구체적으로 실행하는 것을 목표로하는 LLVM 프런트 엔드입니다. 배우기 쉽고, 필요한 대부분의 프로그래밍 작업에 실용적으로 설계된 Crema는 프로그램의 계산 복잡성을 보안 향상에 필요한 최소한으로 제한 할 수 있습니다.
매우 미니멀하고 다소 낮은 수준입니다.
C 개발자에게는 친숙하게 보일 것입니다.
처음에는 DARPA (Defense Advanced Research Projects Agency)에서 자금을 지원 받았지만 지금은 유지 보수가 거의되지 않은 것으로 보입니다. 그럼에도 불구하고 누군가 관심이있을 수 있습니다.