我读到过 TeX 是图灵完备的。我想知道让 TeX 图灵完备是否会引起不良影响。
答案1
是的,有一个缺点:你不是“只”写论文,而是开始编写 LaTeX 软件包,如tikz-timing
、等等。如果它不是图灵完备的,这种情况就不会发生standalone
。svn-multi
拥有图灵完备性可以实现无限数量的添加,但在创建 TeX 时当然需要一些初始投资。我知道的所有 TeX 发行版都确保 TeX 的功能不会被用来伤害用户,例如默认情况下禁用或限制 shell 转义,并且您不能使用绝对或父文件夹覆盖文件等。这对用户来说没有真正的缺点,但有很多好处。
答案2
第一个缺点:难以分析
图灵完备的一大缺点是 TeX“程序”容易受到赖斯定理,这基本上意味着对于给定的文档d和 TeX 源文件F,一般来说,无法判定F生成d(或不)。
该定理有很多推论,但对于 TeX 而言,最重要的推论是,通常不可能找出 TeX 源代码的某个部分到底做了什么,尤其是使用另一个计算机程序时,除非使用 TeX 执行它。
这实际上解释了为什么 TeX 不可能转换成其他东西。除非“其他东西”只是 TeX 源的另一种语法变体,或者以某种方式与dvi
或同构,否则这在计算上根本不可能pdf
。
这延伸到看似简单的任务,即一般来说,它也是无法判定的,一段 TeX 源是否会在某个时间点生成字母“d”,是否会有未定义的标签,是否会输出彩色文本,是否会生成多个页面或您想要了解的文档的任何其他基本属性。
对于非图灵完备符号(如 RTF、HTML 或 FO)来说,这种情况完全不同。
缺点二:对发动机要求高
另一个后果是没有“几乎兼容”的 TeX 引擎。虽然支持 HTML 子集没有问题,因为很容易估计当部分形式不受支持时会发生什么,但对于 TeX 来说,即使与预期行为有丝毫偏差也会导致任意破坏性和意想不到的后果。
这意味着所有“替代” TeX 引擎要么没有正确完成文档生成的基本任务(如ant
或exTeX
),要么与原始 TeX 过于接近,以至于很难看出它们真正提供了什么替代方案(如 NTS)。
唯一有效的方法是从原始的 TeX 引擎并添加之前无法实现的功能,例如pdftex
,使用eTeX
、xetex
或LuaTeX
。
第三个缺点:容错能力低
图灵完备形式主义具有如此强大的表达能力,以至于很难优雅地处理错误。
如果我随机用乱码替换 HTML 文件的一半,那么浏览器仍然能够几乎正确地呈现那些看起来像 HTML 的部分。
对于有错误的“TeX 程序”,如果它不符合某些严格的“标记”语法标准(如 LaTeX),则如果整个计算失败,引擎将无法从正确的部分生成有意义的输出。
答案3
图灵的结果是,任何非平凡的编程语言本质上都是计算等效的。如果它有能力编码算术,它就可以做任何编程语言可以做的事情(粗略解释)。
因此,如果您想要一种可以进行算术运算的格式化语言,或者能够测量盒子并根据符合用户指定条件的长度做出不同的决定,那么图灵完备语言几乎是不可避免的。
答案4
图灵完备性意味着处理文档可能不会终止。显然,这是由循环代码引起的错误,但它完全有可能违背非程序员的直觉。就我个人而言,我愿意付出这个代价来换取它获得的功能,但这是图灵完备性的代价之一。
附录:图灵完备语言的停机问题的不可判定性进一步意味着 TeX 无法合并程序分析阶段来检测非终止代码。虽然可能,但它也没有实现启发式方法。
另一个后果是,如果不执行 LaTeX 代码,通常很难对其进行分析。这使得很难对其进行分析,尤其是针对安全问题,如果 LaTeX 作为在线服务提供,这将很有用。