图灵机可以模拟的类似于C的小型语言


11

我正在寻找一种小语言来帮助“说服”学生,图灵机是一种足够通用的计算模型。也就是说,一种语言看起来像它们惯用的语言,但也很容易在图灵机上模拟。

Papadimitriou使用RAM机器来完成这项工作,但我担心将奇怪的事物(作为图灵机)与另一个奇怪的事物(基本上是汇编语言)进行比较,对于许多学生而言,这太令人信服了。

任何建议都将受到欢迎(特别是如果它们带有一些推荐的文献)


7
最初使用汇编语言对计算机进行编程是有原因的……编写编译器或解释器并不容易。为图灵机编写编译器或解释器可能更加困难。
彼得·索尔

必须与PS有所不同,TM编译器并不比将分解实例转换为SAT或其他接近本科的练习难得多。另请参阅网上的顶级图灵机模拟器。这是一个用红宝石编写的图灵机编译器的示例,其中带有示例源代码(用于高级语言)。las,似乎没有更多可用的方法。这将是一个伟大的开源项目。
vzn

2
@OmarShehab,编辑将问题抽至第一页。如果修改不能显着改善问题,请不要编辑旧问题。此外,编辑大量不在首页上的问题也不是一件好事,因为它会将新问题推出首页。谢谢。
卡夫

@kaveh明白。
奥马尔·谢哈卜

Answers:


15
  • 如果您的学生完成了任何函数式编程,那么我所知道的最好的方法是从无类型的lambda微积分开始,然后使用方括号抽象定理将其转换为SKI组合器。然后,你可以用ü 牛逼定理表明,图灵机形成局部组合子代数,所以可以解释SKI组合子。sñüŤ

    我怀疑这是最简单的方法,但是我喜欢它基于可计算性的一些最基本定理(您可能会希望出于其他原因对此加以介绍)。

    似乎几个月前,Andrej Bauer在Mathoverflow上回答了类似的问题

  • 如果您使用的是类似C的语言,则您的路径会更加粗糙,因为它们具有相当复杂的语义-您需要

    1. 证明图灵机可以同时模拟堆栈和堆,并且
    2. 展示如何使用堆栈实现变量,以及
    3. 证明可以使用堆栈来实现过程调用。

    老实说,这是编译器类的许多内容。


7

我的本科生Comp理论教授从证明单带图灵机可以实现多带图灵机开始。它可以处理变量声明:如果一个程序有六个变量声明,则可以很容易地在七带图灵机上实现(每个变量有一个磁带,而“注册”磁带则可以帮助执行诸如算术和相等检查之类的任务)磁带)。然后,他展示了如何实现基本的FOR和WHILE循环,到那时,我们有了基本的图灵完备的类似C语言。无论如何,我都感到满意。


6

我现在正在考虑如何让自己相信图灵机是一种通用的计算模型。我同意在某些标准教科书(例如Sipser)中对Church-Turing论文的标准处理不是很完整。这是我可能会从图灵机转到更易识别的编程语言的草图。

考虑具有ifwhile语句的块结构化编程语言,具有非递归定义的函数和子例程,具有命名的布尔型随机变量和通用布尔型表达式,以及具有可递增或递减tape[n]的整数数组指针的单个无界布尔数组nn++或者n--。指针n最初为零,数组tape最初全部为零。因此,这种计算机语言可以是C语言或Python语言,但是其数据类型非常有限。实际上,它们是如此有限,以至于我们甚至没有办法n在布尔表达式中使用指针。假如说tape仅在右边无限,如果n为负,则可以声明指针下溢“系统错误” 。同样,我们的语言有一个exit带有一个参数的语句,用于输出布尔值答案。

那么第一点是,该编程语言是图灵机的一种良好规范语言。您可以轻松地看到,除了磁带数组之外,该代码仅具有有限的许多可能状态:所有声明的变量的状态,当前执行的行及其子例程堆栈。后者仅具有有限数量的状态,因为不允许使用递归函数。您可以想象有一个“编译器”可以通过这种类型的代码创建“实际的”图灵机,但是其细节并不重要。关键是我们拥有一种具有相当不错的语法但非常原始的数据类型的编程语言。

其余的构造是通过有限的库函数和预编译阶段列表将其转换为更实用的编程语言。我们可以进行如下操作:

  1. 使用预编译器,我们可以将布尔数据类型扩展为更大的但有限的符号字母,例如ASCII。我们可以假设该tape值采用更大的字母。我们可以在磁带的开头保留一个标记以防止指针下溢,并在磁带的末端保留一个可移动的标记以防止TM意外滑到磁带上的无穷大。我们可以在符号之间实现任意二进制运算,并可以将for ifwhilestatement 转换为boolean 。(实际上,if也可以用while不可用的方法来实现。)

  2. ķķ一世一世ķ

  3. 我们将一个磁带指定为符号值的“内存”,将其他磁带指定为无符号的整数值的“寄存器”或“变量”。我们将整数存储在带有终止标记的little-endian二进制中。我们首先实现寄存器的副本和寄存器的二进制减量。结合内存指针的递增和递减,我们可以实现符号存储器的随机访问查找。我们还可以编写函数来计算整数的二进制加法和乘法。编写带有按位运算的二进制加法函数和编写左移乘以2的函数并不难。(或者,实际上是右移,因为它是低位字节序。)有了这些原语,我们可以编写一个使用长乘法算法将两个寄存器相乘的函数。

  4. 我们可以使用公式将存储带从一维符号阵列重组为symbol[n]二维符号阵列。现在,我们可以使用内存的每一行来表示带有终止符号的二进制无符号整数,以获得一维,随机存取,整数值的内存。我们可以实现从存储器读取到整数寄存器,以及从寄存器写入到存储器。现在可以使用以下功能实现许多功能:有符号和浮点算术,符号字符串等。symbol[x,y]n = (x+y)*(x+y) + ymemory[x]

  5. 只有另外一种基本功能严格要求预编译器,即递归函数。这可以通过广泛用于实现解释语言的技术来完成。我们为每个高级递归函数分配一个名称字符串,然后将低级代码组织到一个大while循环中,该循环使用常规参数维护调用堆栈:调用点,被调用函数和参数列表。

在这一点上,构造具有高级编程语言的足够功能,以至于进一步的功能更多地是编程语言和编译器的主题,而不是CS理论。用这种开发的语言编写图灵机模拟器已经很容易了。为该语言编写自编译器并非易事,但绝对是标准的。当然,您需要一个外部编译器来使用类似C或类似Python的语言从代码创建外部TM,但这可以在任何计算机语言中完成。

请注意,此草绘的实现不仅支持逻辑函数的递归函数类的Church-Turing命题,而且支持扩展的(即多项式)Church-Turing命题,因为它适用于确定性计算。换句话说,它具有多项式开销。实际上,如果为我们提供了RAM机器或(我个人最喜欢的)树形磁带TM,则可以将其减少为用于RAM存储器的串行计算的多对数开销。


5

LLVM编译器允许人们相当直接地“插入”新架构。他们称此为新的后端,并提供了详细的说明和示例。我怀疑如果您不希望针对RAM Turing机器,您将不得不跳过一些有关随机存取内存的问题,但这绝对是可行的,因为我已经看到许多导致LLVM生成的项目VHDL或其他非常不同的机器语言。

使用最先进的优化编译器(在许多方面LLVM比GCC更先进)为Turing机器生成代码,将会产生有趣的效果。


1

我不是CS理论的专家,但是我有一些有用的知识。我采取了另一种方法。我设计了一个简单的处理器,可以直接用一小部分C语言进行编程。没有汇编代码,只有类似C的代码。您可以使用与我相同的工具,并修改该处理器来设计您的Turing机器模拟器。我花了4天的时间设计,仿真和测试该处理器,还有一些说明!我使用的工具甚至使我能够生成真正的VHDL可合成代码。这是一个真正的工作处理器。

程序如下所示: C类汇编程序示例

这是使用这些工具的处理器的图片: 处理器电路

工具“ Novakod Studio”使用高级语言硬件描述语言。例如,这是程序计数器的代码: psC-并行和同步C-代码示例 足够的交谈,如果有人感兴趣,请与以下公共信息联系我:https : //repertoire.uqac.ca/Fiche.aspx?id=JjstNzsH0&link=1

卢克


存储器寻址是否使用固定的位数来定位地址?
vzn

是的,但它是简单的变存储器大小(INT DataMemory值[SIZE]该语言支持可变长度的整数(INT:。10)但是,因为它的目标FPGA,阵列是静态的,尺寸恒定
吕克莫林

1

在这里采用用户GMB表示的想法如何(将一盘磁带的图灵机通过将N条磁带交织到一条磁带上,并一次跳过N个位置来读取其中任何一个磁带,就可以模拟一盘N磁带的图灵机。使用N盘磁带的计算机可以实现...)并编写实现简单RAM机的图灵机程序。RAM计算机实际上可能是具有可用LLVM或GCC后端的一些简单,真实的CPU。然后,可以将GCC / LLVM用于该CPU的C程序和图灵机程序的交叉编译,该程序模拟RAM机,通过让模拟的RAM机执行GCC / LLVM输出来运行RAM机仿真。Turing机器的实现可能是一些非常简单的C代码,适合一个小的C文件。

关于RAM机器,则存在一个演示项目,其中一个8位微控制器模拟了32位CPU,并且模拟的32位CPU启动Linux。慢得要命,但据作者德米特里·格林伯格说,它行得通。对于可仿真的RAM机器,也许Zylin CPU (GitHub用户zylin)可能是可行的选择。另一个RAМ机器候选人可能是Niklaus Wirth的ProjectOberon dot com 。

(我的文字中的“点”和“ com”是由于我刚刚2015_10_21在cstheory.stackexchange上注册了我的帐户,尽管事实上,我的网络应用程序不允许新用户使用超过2个链接他们可以从我的其他stackexchange帐户中自动看到我可能是愚蠢的,但我不是巨魔。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.