至于经典的BC/TC/QB/MSC等,它们来做小程序是很好的,但是一些庞大一点的程序就不行了。我试过在BC++ 3.1下编写一个的图形界面程序,规模达到了Huge!编译以后,经常报错:Out of Memory!而且即使可以运行,程序也非常不稳定。
Gemini 解答
这是一篇关于 21 世纪初期 DOS 编程环境选型及其技术限制的讨论总结。针对帖子中提到的 DJGPP、Borland C++ (BC++)、Watcom C/C++ 以及内存管理等问题,从技术背景与实现机制角度补充如下解释。
1. 16 位与 32 位 DOS 开发的本质区别
pk4321 提到的 BC++ 3.1 编译大型程序出现 "Out of Memory" 或不稳定的现象,根源在于 16 位 x86 架构的分段内存模型(Segmented Memory Model)。
- 16 位开发(BC++ 3.1, TC, QB):这类工具链主要生成实模式程序,受限于 640KB 常规内存。即使使用
Huge内存模式,单一指针寻址仍受限于 1MB 空间,且跨段寻址会导致显著的性能开销和编程复杂性。- 32 位开发(DJGPP, Watcom C/C++):这些工具利用了 80386 及后续 CPU 的保护模式(Protected Mode)。通过 DPMI(DOS Protected Mode Interface)服务器(如 CWSDPMI),程序可以访问高达 4GB 的线性物理内存。这消除了 640KB 的束缚,使开发大型图形界面或处理复杂数据结构(如 XML 解析)成为可能。
2. DJGPP 的定位与技术特性
DJGPP 是 GCC(GNU Compiler Collection)在 DOS 平台上的移植版本,由 Delorie 软件公司维护。
- 开发环境与 IDE:针对帖中提到的易用性问题,DJGPP 本身是命令行工具链。RHIDE 是其最著名的集成开发环境,模仿了 Borland 的文本界面风格,极大地降低了习惯于 TC/BC 用户的使用门槛。
- C++ 支持与优化:针对 Post #21 的疑问,DJGPP 完全支持 C++(通过 g++ 编译器)。事实上,由于其基于 GCC,其标准库(STL)的兼容性在当时的 DOS 工具中是非常领先的。关于“内嵌汇编太难写”,是因为 GCC 使用的是 AT&T 汇编格式,与 Intel 汇编格式在操作数顺序和语法上有显著差异,这对习惯于 MASM/TASM 的开发者来说确实存在学习曲线。
3. Borland DOS Power Pack 与 DPMI16/32
Post #10 提到的 Borland DOS Power Pack 是 Borland C++ 4.x 时代的扩展组件。
- DPMI16:允许 16 位保护模式开发,使程序能够突破 640KB 进入扩展内存,但指针仍受 64KB 段限制。
- DPMI32:这是 Borland 尝试进入 32 位 DOS 开发的工具,支持 Win32 风格的部分 API。然而,由于 Borland 当时的战略重心正转向 Windows,其在 DOS 下的 32 位优化和社区支持远不及专攻此领域的 Watcom 或开源的 DJGPP。
4. 其它开发方案与替代品
- Watcom C/C++:它是当时 DOS 下商业 32 位开发的工业标准,著名的《毁灭战士》(DOOM) 和《雷神之锤》(Quake) 均使用 Watcom 开发。它的优化器在处理 386 指令集时性能极高,且其内嵌汇编支持 Intel 格式。
- Digital Mars C++:其前身是 Zortech C++ 和 Symantec C++。它在 DOS 下提供了极快的编译速度和良好的 DPMI 支持,但如帖子所述,其 IDE/调试器(IDDE)通常需要付费购买,导致其在中文社区的普及度较低。
- Delphi + WDOSX:Post #18 提到的方案利用了 32 位 Pascal 编译器配合 WDOSX 扩展器。WDOSX 能够将 Win32 控制台程序封装为 DOS 可执行文件,实现跨平台编译(在 Windows 下编写调试,在 DOS 下运行)。
5. 关于 EMM386 与栈异常
Post #20 提到的
emm386 #12 Stack exception是典型的保护模式冲突。EMM386 作为内存管理器,通过 V86 模式模拟 EMS 内存。当 16 位实模式程序由于递归过深或局部变量过大导致栈溢出,或者与 DPMI 服务器产生特权指令冲突时,EMM386 会拦截并报错。在这种情况下,迁移到 DJGPP 等原生的 32 位 DPMI 环境是根本的解决方法,因为 32 位环境下的栈管理更加成熟且空间充裕。6. 获取与文档建议
对于 DJGPP 的安装,由于其模块化程度极高(ZipPicker 是当年的官方推荐方式),用户只需下载核心文件(gcc, binutils, libc, cwsdpmi)即可运行,无需下载全站数百兆的文件。虽然当时的中文资料匮乏,但其配套的 Allegro 图形库拥有非常详细的示例代码,是当时 DOS 游戏开发的首选。




