21CTO导读:一款新型Pascal编译器——Quartex Pascal(简称 QTX)发布了新版本。
Quartex Pascal是一款基于 Object Pascal 语言的现代级开发系统,它包含集成开发环境(IDE)、编译器和运行时库(RTL),主要用于将 Pascal 代码高效转换为可在浏览器或 Node.js 中运行的高性能 JavaScript。
核心特点
连接两种语言:
允许开发者使用熟悉的 Object Pascal 语法来编写现代化的 Web、移动端以及服务端程序。
高性能 JavaScript 生成:
编译器能够将 Pascal 代码转换成高度优化的 JavaScript 代码,并可以直接与现有的第三方 JS 库或 HTML5/CSS 技术进行互动。
RAD(快速应用开发)模式:
为 Web 开发带来了类似传统 Delphi 或 Free Pascal 的可视化与事件驱动开发体验(支持传统事件及 JavaScript 原生委托对象)。
开源与教育免费:
该项目使用 Delphi 编写,目前针对教育和开源项目免费提供。
它依托 DWScript 完成语法解析,构建程序抽象符号模型,再交由代码生成器输出精简高效的 JavaScript。
这款自研的全新编译器融合了 DWScript 的众多优秀内核特性,同时补齐了过去长期缺失的关键能力:
完成上述改造后,项目达成所谓的编译器奇点:编译器已经具备编译自身源码的能力。
按照旧版路线图,QTX 编译器能够跑在浏览器与 Node.js 环境中,原本至少还需要两年,现在这一目标已经实现。
在 QTX 中,普通 Pascal 记录(等价于 C/C++ 的 struct 结构体)会被编译为标准 JavaScript 对象。
对于绝大多数 Web 应用,这套模型完全够用,可以轻松完成 JSON 序列化、与服务端交互,JSON 堪称 Web 世界的通用粘合剂。社区开发者也基于这套能力,产出大量组件与 Web 应用,比如 Ed Van Der Mark 开发的科学计算器组件。
但在移植原生语言项目时就会暴露出短板:如果业务需要把结构体原样写入数据流、内存缓冲区,JSON 方案就力不从心。
该团队近期把用于无线射频数据传输的项目 Reticulum(类似 Meshtastic、Meshcore)从 C 语言移植到 Object Pascal。这套系统通过 USB 串口和网状无线电设备通信,实现类似 TCP/IP 数据报的底层协议。为了和其他 Reticulum 节点互通,需要实现三套层层依赖的复杂协议,全部建立在记录结构体、位掩码、字段原生内存行为之上。
如果沿用旧方案在 QTX 上实现 Reticulum,工作量会十分恐怖:项目包含大约 60 个数据结构,每一个都要手动编写构造、读、写方法,光是数据处理就要手写 180 个样板函数。
而新编译器把二进制记录作为原生语法特性,从底层提供完整支持。
我们复用 Pascal 的 packed 关键字,用来标记二进制记录类型。一旦使用该修饰符,编译器会为实例自动生成缓冲区对象;读写记录字段时,会根据字段类型,自动调用缓冲区对应的读写接口,开发者几乎不用额外编码。
typeTMyMessage = packed recordrId: uInt32;rSize: UInt16;rX: uint8;rY: uint8;rlabel: string[255];end;
直接把二进制记录写入流、缓冲区将成为开箱即用的能力。
QTX 的运行时库本身已经具备完备的二进制处理类与工具方法,新增特性让 QTX 即便编译输出 JavaScript,也能拥有接近原生语言的底层能力。
泛型是本次更新影响力最大的特性,会显著改善代码可维护性。据官方评估,引入泛型之后,运行时库部分模块代码量最多可以缩减 60%。
以通用字典容器为例,泛型版本的写法如下:
typeTQTXDictionary= class( TObject ) privatefLUT: array[K] of T;publicproperty Count: int32 read ( fLut.Count );property Keys: array of K read ( fLut.Keys );property Items[const AKey: K]: Tread ( fLUT[k] )write ( fLUT[k] := Value) ;procedure Clear; virtual;end;
QTX 过去借助关联数组也能实现类似容器效果:typeTQTXDictionary = array[string] of TMyObject;
二者核心差异:
旧的关联数组写法必须写死为键、值的具体类型;而泛型类支持几乎所有基础类型作为键,绝大多数类型作为值。泛型的核心价值就是把业务逻辑抽离出来,不再被具体数据类型束缚。
下面几种实例化方式全部合法:
var dict := TQTXDictionary<string, TQTXLocalDisk>.Create;var dict := TQTXDictionary<int32, TQTXPixmap>.Create;var dict := TQTXDictionary.Create;
RTTI 运行时类型信息RTTI(运行时类型信息)允许程序在运行时读取数据类型元信息。在代码维护上有诸多用途,最典型场景就是对象持久化、序列化。
QTX 原有持久化方案依托基类 TQTXPersistent,提供 ReadObject、WriteObject、Assign 三个虚方法。受限于没有 RTTI,开发者必须手动重写方法,逐个处理需要序列化的字段,最终输出 JSON。同时 IDE 以外场景,并不支持窗体、组件设计文件的加载;项目会直接把界面布局转为源码,和窗体构造函数一起参与编译。
随着 RTTI 落地,继承自 TQTXPersistent 的类,就可以自动对发布属性做标准序列化。运行时库现有组件大多没有用到这套机制,因此实现对标 Delphi 的持久化能力成本很低。
后续 TQTXPersistent 会拥有接近 Delphi / Lazarus 的行为:自动枚举发布属性完成序列化。同时还会配套类似 TFiler 的机制,专门处理流、托管内存这类特殊复杂数据类型。
Quartex Pascal 目前正在高速迭代。
新编译器落地之后,团队称将彻底摆脱DWScript,未来版本亦正在评估接入 LLVM、生成本地二进制可执行文件的可能性;不过,现阶段开发重心仍然聚焦 Web 开发技术栈。
作者:场长
原文:
https://quartexdeveloper.com/2026/09/13/generics-rtti-a-new-compiler
本篇文章为 @ 场长 创作并授权 21CTO 发布,未经许可,请勿转载。
内容授权事宜请您联系 webmaster@21cto.com或关注 21CTO 微信公众号。
该文观点仅代表作者本人,21CTO 平台仅提供信息存储空间服务。
请扫描二维码,使用微信支付哦。