从已有语言写出编译器
2004年9月,Andre Victor T. Vicentini 开始编写 FreeBASIC,最初使用 Visual Basic for DOS。项目要解决的是一项具体迁移问题:让熟悉微软 BASIC 方言的人,继续使用原有的语句和程序结构,同时为32位计算机环境生成程序。开发者并未要求使用者先学习一套完全不同的表面语法。
官方手册的项目年表记载,FreeBASIC 于10月22日在 SourceForge 登记,11月实现了编译自身,11月30日发布0.01版。能够自举意味着编译器自己的源代码已经可以交给 FreeBASIC 处理,开发工作由起初依靠旧工具,转向使用正在建设的新工具。
保留熟悉写法,改变运行条件
2004年12月的0.03 Beta 说明书将它称为与 QB 兼容的32位编译器:关键字不区分大小写,允许行号,普通标量变量可以不事先声明,也无需另设 MAIN 函数。这些安排降低了从 QBasic、QuickBASIC 等环境转来的门槛;数组、字符串、文件和控制流程仍保留大量熟悉的写法。
兼容并不等于旧程序可以不加检查地搬用。随包关键词表把已实现、尚待实现和不支持的功能分开列出。例如,DEF SEG 所依靠的分段地址方式不再适用于32位平坦地址空间;直接操作输入输出端口的旧语句也受到用户程序运行条件的限制。早期版本连部分传统绘图语句都还在待实现清单中。
一个窗口怎样从 BASIC 中出现
发行包中的 winhello 程序给出了连接新环境的实际做法。程序引入 kernel32、user32 和 gdi32 的接口声明,定义窗口过程,再登记窗口类、建立窗口。窗口需要重绘时,它在处理 WM_PAINT 消息的分支中取得绘图上下文,把问候文字画在客户区域中央;收到关闭消息后结束消息循环。
这段示例仍用 FUNCTION、SELECT CASE 和 WHILE 等 BASIC 结构组织逻辑,却直接调用 Windows 的应用程序接口。用户定义类型保存窗口属性,函数地址把窗口过程交给操作系统调用。FreeBASIC 由此把熟悉的语言语法与外部函数库接在一起,程序员需要理解窗口消息和接口声明,而不是只在设计器中摆放控件。
参考:[1]
命令行工具与网络协作
早期编译器并不绑定某个集成开发环境,可以生成目标文件、库以及控制台或图形界面可执行文件。汇编器、链接器等配套工具来自 MinGW32 项目;运行库则把依赖操作系统的部分分离,以便后来移植。编译器按 GNU 通用公共许可证第二版或后续版本提供源代码。
0.03版说明书的致谢显示,这项工作很快超出创始人个人范围。Blitz 提供早期演示和论坛空间,并协助发现错误;Marzec 移植 SDL 接口声明并编写演示程序;Rel 通过大量图形示例测试编译器,其他参与者整理文档、转换音频库接口、建设论坛。这里的主要协作场所是网络社区和代码发行渠道。
参考:[1]
发布后的修补与移植
最初几个版本的更新记录十分具体:0.02版修补整数转换时的寄存器处理、函数指针语法和字符串函数错误,0.03版继续修正文件路径影响入口名称等问题。公开发行因此也是扩大测试范围的起点,示例程序既展示能力,也把缺陷带回开发过程。
后续扩展有自己的时间顺序。官方年表将 Angelo Mottola 提供的 Linux 移植列在2004年12月31日的0.09版,将 Daniel R. Verkamp 的 DOS 移植列在2005年1月31日的0.11版。2004年11月的节点所标志的是公开发行及此前完成的自举,跨平台能力则在随后各版逐步加入。