如果人们接受某种语言必须是图灵完备才能有任何好处,那么实际上有可能使用一种不是图灵完备的“有用”编程语言吗?
我需要澄清的是,这是专门针对传统意义上的“编程”语言,而不是标记或查询语言。
如果人们接受某种语言必须是图灵完备才能有任何好处,那么实际上有可能使用一种不是图灵完备的“有用”编程语言吗?
我需要澄清的是,这是专门针对传统意义上的“编程”语言,而不是标记或查询语言。
Answers:
Coq,Agda,HOL和ACL2是非常有用且功能非常强大的语言,尽管它们不是图灵完备的。
使它们不具有图灵完备性的一个共同特征是,总是有可能证明终止。一个非常简单的限制就足够了:仅以可证明的结构较小的条件允许递归调用。因此,尽管不可能为图灵完备的语言甚至语言本身实现解释器,但仍有许多其他有用的东西,例如经过认证的C编译器。
我认为Yegge的“迷你语言”一词指的是这样的事实:对于一种特定的问题,使用一种语言通常会很有用,因为该语言不需要图灵完整性即可完成任务,而这正是非语言的核心。 -完善的语言可能很有用。https://sites.google.com/site/steveyegge2/language-grubbing
Wikipedia很好地回答了这个问题,这与我的直觉相吻合。首先,我想到的是纯数学,然后想起了regexp,维基百科列出了Epigram,我相信它将属于“纯数学”范畴。
http://en.wikipedia.org/wiki/Turing_completeness#Non-Turing-complete_languages
非图灵完备的语言
存在许多图灵不完整的计算语言。这样的例子就是一组由有限自动机生成的正则语言,最常见的是正则表达式。下推自动机和上下文无关文法的类别是有限自动机的更强大但仍不是图灵完备的扩展,它们通常在程序编译的初始阶段用于生成解析树。进一步的示例包括Direct3D和OpenGL扩展中嵌入的某些像素着色器语言的早期版本,或电子表格中无循环的一系列数学公式。[需要引用]在全部函数式编程语言中,所有函数都是合计的,并且必须终止,例如慈善和Epigram。慈善机构使用类型系统和基于类别理论的控制结构,
资料语言
图灵完整性的概念不适用于XML,JSON,YAML和S表达式之类的语言,因为它们通常用于表示结构化数据,而不是描述计算。这些有时称为标记语言,或更恰当地称为“数据描述语言”。
它还提到数据结构表示不是语言,但是我认为XSLT应该算作计算的表示,XPath可能不是基于Yannis上面所说的关于SQL是查询语言而不是计算语言的说法。也许T-SQL或PL / SQL可以算作计算语言,因为您可以使用它们的聚合来进行大量计算,而SQL的广义形式可能没有指定聚合。
我了解SQL在各种业务类型中都非常流行
图灵完整性对于使一种语言适合用作通用语言是必要的。但这还不够,也就是说,仅因为它是图灵完整的,它并不适合每个问题领域:
相反,即使没有图灵完整性,DSL也适用于它设计用于的问题域(假设它实际上是经过合理设计的):
* IIRC已证明,具有CSS动画的HTML通过使用它们在一系列复选框上实现Conway的“生命游戏”,已经完成了Turing。但是,即使在不支持CSS动画的浏览器中,HTML仍然有用。
实际上确实存在编程语言,您只能在其中编写“高效”程序。在这种意义上高效意味着用这种语言编写的每个程序都用P
。贝兰托尼(Bantantoni),尼格(Niggl)和史威登伯格(Schwichtenberg)在这里描述了这种语言。
C预处理器不是图灵完整的(设计),但它仍然可以实现的解释应该是一个语言是图灵完整的(订单的语言,如文档中所描述的,基本上是一个运行的-the-可以处理纯功能性的ML / Scheme类型的东西,并且如果不是用于非常规实现的话,则相对来说并不明显-可能很好用-)。
它背后的技巧类似于上面的关于在有限的物理世界中实现任何Turing机器的论点:C预处理器无法为语言提供无限数量的步骤或数据单元,但是它可以:
提供一个不合理的大动态数(默认2 ^ 64左右),足够大的用于解决使用指数扩展处理(最现实的问题喃喃喃喃宇宙的寿命喃喃)。
对上述数字使用任意的静态上限,即,虽然步数必须是某个有限数,但是可以通过更改解释器引擎的静态设置来更改“编译”时特定上限的大小。由于此上限的实际值没有(理论上)限制,因此可以(理论上)扩展它以适合任何终止程序的空间要求。
并不是说Order本身本身就一定是“有用的”,也不是说任何CPP实现的引擎都会有用,但这是一个有趣的概念证明。据说它也是动态输入的,这在该区域是不常见的。
是的,确实有可能使用图灵不完整的有用语言。参见此处:http : //tkatchev.bitbucket.org/tab/examples.html
有用的图灵不完整语言的另一个示例是SQL。(还有另一种电子表格,例如Gnumeric或Excel,尽管它们并不是真正的编程语言。)
至于为什么您想要的图灵语言不完整:为什么这样可以使您对运行时行为做出一些有力保证。
坦白地说,图灵完整性意味着具有递归能力。具有递归意味着在内存中具有潜在的无界结构。由于在现实世界中内存不是无限的,因此图灵完整性需要内存管理和/或垃圾回收。
禁止递归是避免真正非常困难的资源管理问题的好方法。
诺娜·贝恩!图灵不完整并不一定意味着任何程序都必须终止。图灵不完整的语言可能允许评估无限的惰性列表。
到目前为止,还没有提到一种有趣的“ sub-Turing编程语言”,因此我将其添加。
它称为“ Crema”。它描述为:
Crema是LLVM前端,旨在专门在Sub Turing Complete空间中执行。Crema的设计易于学习,并且可满足大多数所需的编程任务,因此可以将程序的计算复杂性限制在提高安全性所需的最低水平。
这是非常简约的,相当低的水平。
对于C开发人员来说应该看起来很熟悉。
它最初是由美国国防高级研究计划局(DARPA)资助的,但是在撰写本文时看起来并没有得到维护。但是也许有人仍然对此感兴趣。