开发者用Turbo Pascal编写Turbo Pascal编译器
来源标题:Turbo Pascal Compiler Written in Turbo Pascal
开发者发布用Turbo Pascal编写的Turbo Pascal编译器TPC16,在源码和二进制层面都与Turbo Pascal 7完全兼容。TPC16展示了其他编译器没有的内部实现,可作为学习编译器构造的参考;另有基于Delphi 7的TPC32版本,采用新的符号表管理并支持长文件名。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
你可以自己做一个编译器。你可以扩展 Turbo Pascal 的功能,或者做一个全新的编译器。这个包最重要的特点是各种算法的实际实现,以及经过验证的数据结构。一个编译器能否成功实现,主要取决于所用的数据结构和算法。因此,TPC16 的源码可以作为灵感来源,帮你了解如何为自己的编译器实现复杂算法。不过,如果你想开发自己的编译器,最好从 TPC32 开始。TPC32 就是用 Delphi 7 编译的同一个编译器。TPC32 不再受 segment:offset 数据结构的限制。它采用了新的符号表管理方式,并且支持长文件名。 也有一些开源编译器可用。TPC16 和其他编译器有什么区别,为什么 TPC16 不免费?TPC16 在源码层面(它编译的文件)和二进制层面(它生成的文件)与 Turbo Pascal 7 100% 兼容。TPC16 展示了其他编译器中没有的编译器内部机制,是许多流行的编译器构建书籍的绝佳 companion。如果你认真想做一个自己的编译器,那你就应该拥有 TPC16。TPC16 的 exe 文件可以免费获取,可以在下面的演示版本中找到。TPC16 的源文件不免费提供,因为我投入了大量精力编写代码,也花了不少时间才让它工作起来,并在源码和二进制层面与 Borland Turbo Pascal 兼容。我开出的价格只是这些源文件价值的一小部分。如果你曾经尝试过写编译器,你大概知道我在说什么。考虑到 TPC16 揭示了一个完整、可工作的编译器,它是最便宜的关于编译器设计与实现的电子书。里面没有详细的教科书文本,你要做的就是检查源代码并跟随编译器的控制流。你会惊讶于复杂任务可以变得多么简单。TPC16 是关于实用编译器构建的最好的书。 Program TPC16; Uses Strings, Parser, Scanner, IOUtils, ResWords, CommVars; begin Writeln (GreetingString); CmdPtr := Ptr (PrefixSeg, $80); CmdPtr [Byte (CmdPtr [0]) + 1] := #0; CmdPtr [0] := ' '; CfgPtr := FileBuffer; Get_TPL_CFG_Directory; Read_TPC_CFG; CompilerModeOptions := [cmoCreateExeFile, cmoCompileToDisk]; LinkerOptions := []; CommandLineConditionalDefines := InitialConditionalDefines; StartOfSourceFileStructures := @FileStructure; ProcessCompilerParameters; StrCopy (TempStr, GlobalModuleData^.LibraryName); CurrentFileName := TempStr; FindFilePath (TempStr, Dir_TPL_CFG or Ext_Original); LoadLibrary; Case LastError of FileNotFound: Writeln ('Warning: ', TempStr, ' not found.'); NoError: else WriteCompilationErrorAndHalt; end; With GlobalModuleData^ do begin InitialEnvironmentFlags := EnvironmentFlags; InitialCompilerSwitches := CompilerSwitches; ModuleStack := Stack; ModuleHeapMin := HeapMin; ModuleHeapMax := HeapMax; end; CurrentFileName := MainFileName; FindFilePath (CurrentFileName, Dir_None or Ext_PAS); StartCounter := InterruptCounter; CompilationInProgress := True; Compile; CompilationInProgress := False; StopCounter := InterruptCounter; If LastError <> NoError then WriteCompilationErrorAndHalt; If cmoFindError in CompilerModeOptions then begin FindAndWriteSourceLine; WriteCompilationErrorAndHalt; end; WriteCompilationStatus; end. Turbo Pascal 下载 下面你可以下载 TPC16 编译器的演示版本,它包含除编译器单元源文件之外的所有文件。这样你可以检查完整版会得到什么。不过,大部分源文件已在 Turbo Pascal 网站上发布并讲解。 TPC16 是一个 DOS 应用程序,依赖 segment:offset 寻址。对某些算法来说这是优势,另一方面这也是缺点和限制因素。我也提供 TPC32,这是同一个 Turbo Pascal 编译器的 32 位版本,它用 Borland Delphi 控制台编译器编译,几乎去掉了 16 位版本的所有限制。TPC32 仍然生成 16 位 x86 代码,但由于采用了新的符号表管理方式,编译器更加灵活。TPC32 还被用作 Turbo51(面向 8051 单片机的 Pascal 编译器)的起点。 TPC32 的源代码比 TPC16 稍贵一些,因为其中投入了大量额外工作。不过,如果你已经购买了 TPC16 源代码,你可以再付一些费用获得 TPC32(联系我获取此升级的说明)。TPC32 拥有 TPC16 的所有功能,并增加了一些处理 32 位偏移而不是 segment:offset 地址的算法,以及一些额外改进。如果你想了解编译器的内部数据表示和架构,或者你只对编译器内部处理所用的各种算法和数据结构感兴趣,那么 TPC16 就是你需要的一切。如果你有兴趣用 Pascal 语言开发自己的编译器,那么选择 TPC32 会更合理。如果你购买 TPC32,你也会免费得到 TPC16 源代码。 在你决定为 TPC16 源代码付费之前,你可以在 Turbo Pascal 网站上查看它,并下载 TPC16 编译器的演示版本,它包含除编译器单元源文件之外的所有文件。这样你可以检查 TPC16 编译器,并将它与原始 Borland 编译器进行比较。如果你需要关于 TPC16 编译器的更多信息,或者对编译器构建有任何其他问题,请随时联系我。我很乐意帮助你。
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。