在 TeX 中实现 C 编译器?

在 TeX 中实现 C 编译器?

看到已经用 TeX 完成的很多事情,我想知道是否有人在 TeX 中实现了 C(或 C++)编译器。作为一个实验,这似乎并不太牵强。我不指望它有很好的性能。

我还对 Lisp 解释器或 Java 编译器的实验感兴趣。

答案1

Andrew Greene 多年前用 TeX 写了一个 Basic 解释器;请看一下拖船文章

答案2

这似乎根本不是一个好主意。编译器使用高度特定的数据结构(如抽象语法树、字典、控制流图、寄存器传输列表),我不敢相信你会想在 TeX 中构建和使用这些数据结构。是的,TeX 是可编程的,但它是一种用于排版的特定领域语言,而不是通用语言。

我假设您提到了 C(和 C++)作为示例,但我也相信您低估了这些语言的复杂性。但即使您想实现 Pascal 编译器,我也不想鼓励您。您可能想先尝试 lambda 演算的解释器、图灵机或计算器。

答案3

另一件可能令人感兴趣的事是 Alan Jeffrey 的lazylist包裹相关TUGboat文章关于在 TeX 中执行 lambda 演算:

让我惊讶的是,这个实现只有大约 80 行 TeX 代码,对于任何使用过函数式编程语言的人来说都应该非常容易理解。本文的结果是使用惰性求值的插入排序的实现。

答案4

这虽然极其困难,但原则上并非不可能。

正如 Christian Lindig 所提到的,树和字典是必需的,但在 TeX 中无法非常高效地编码它们。但是,可以简单地实现字典

\def\newdictionary#1{%
    \expandafter\def\csname dict@#1\endcsname##1{%
        \csname dict@#1@##1\endcsname}}
\def\putkeyvalue#1#2#3{%
    \expandafter\def\csname dict@#1@#2\endcsname{#3}}

可以在包中找到更好的(更节省内存的)实现,即属性列表expl3。对于树,我猜最简单的方法是将每个节点表示为一个控制序列,其中包含其子节点的列表,以及一个包含材料的控制序列。

不过,不编译程序就运行程序可能更容易。我知道它对pgf面向对象编程有一定的支持。

顺便提一下,我应该提到我曾经用 TeX 编写了一个整数表达式的解析器(基本上与的语法相同\numexpr),用户可以在其中定义新函数,但要正确实现它相当棘手。

相关内容