Skip to content

常见问题解答 ​


FreeBASIC 问题:

FreeBASIC 入门问题

FreeBASIC 高级问题

参见

返回目录


FreeBASIC 问题 ​

FreeBASIC 是什么? ​

FreeBASIC 是一款免费的 BASIC 编译器,支持 Windows(32 位和 64 位)、32 位保护模式 DOS(COFF 可执行文件,类似 DJGPP)以及 Linux(x86、x86_64 和 ARM)。它最初的目标是创建一个与 Microsoft QuickBASIC 代码兼容的免费替代品,但很快发展成为一款强大的开发工具,默认安装即包含对 Allegro、SDL、OpenGL 等众多库的支持。

除了拥有与 QuickBASIC 高度兼容的语法外,FreeBASIC 还为这门古老的语言引入了多项新特性,包括变量和函数的指针、无符号数据类型等。

FreeBASIC 编译器是自托管的——由 FreeBASIC 本身编写,但其运行库是用 C 语言编写的。

返回顶部

谁负责 FreeBASIC 项目? ​

FreeBASIC 的最初版本完全由 V1ctor 独自开发。后续版本得到了许多人的贡献,包括开发了 Linux 移植版和图形库的 Lillo,以及开发了 DOS 移植版的 DrV。

请参阅 FreeBASIC 致谢 页面。

返回顶部

为什么要用 FreeBASIC 而不是 QBasic? ​

FreeBASIC 相比 QBasic、QuickBASIC、PDS 和 Visual Basic for DOS 拥有无数优势。

  • 它支持 32 位和 64 位处理器,而 QBasic 是为 16 位 CPU 设计的。
  • 它支持现代操作系统,有 Windows、Linux 和 32 位 DOS 的移植版本。
  • 它支持现代 API,如 SDL、Direct2D、DirectX、Win32 和 OpenGL。
  • 它以 GPL 协议发布,意味着它可以免费合法使用,不像大多数 QuickBASIC / 其他 BASIC 的副本。
  • 其运行库以附加例外的 LGPL 协议发布,意味着你可以对你编译的程序做任何事情,包括出售它们。
  • FreeBASIC 比 QuickBASIC / 其他 BASIC 快很多倍。
  • FreeBASIC 支持许多 QuickBASIC / 其他 BASIC 不具备的特性,如指针和内联汇编。
  • QuickBASIC 只支持 DOS。Windows 对 DOS 仿真(以及 QuickBASIC)的支持在每个新版本中都在减弱。Vista 不支持 DOS 应用程序的图形或全屏文本模式。

返回顶部

为什么要用 FreeBASIC 而不是其他更新的 BASIC? ​

FreeBASIC 有许多特质使其比大多数其他 BASIC 语言实现更具吸引力:

  • FreeBASIC 严格遵循标准 BASIC 语法,使其更易使用。
  • FreeBASIC 编译为实际程序(可执行文件),而非字节码。
  • FreeBASIC 拥有庞大而专注的社区,积极参与 FreeBASIC 的开发。
  • FreeBASIC 使用标准方法访问常见的 C 库。例如 SDL 就是标准的 C SDL,而非一套新的内置命令。
  • FreeBASIC 有 Windows、Linux 和 32 位 DOS 的移植版本,并在三个平台之间保持一致的语法。

返回顶部

FreeBASIC 的速度有多快? ​

社区运行的大多数测试表明,FreeBASIC 明显比 QuickBASIC 更快,比大多数其他 GPL 或商业 BASIC 更快,且速度经常接近 GCC。

独立测试团队计算机语言性能测试游戏给出的结果是,Linux 版 FreeBASIC 的速度比 GNU g++ 慢 1.8 倍。测试内容涵盖控制台程序的计算、内存和磁盘访问速度,未测试图形能力。考虑到 FreeBASIC 尚非优化编译器,这个结果并不差。

一个明显的速度不足之处在于 32 位控制台模式。虽然 FreeBASIC 在 32 位控制台模式应用中的速度始终与其他同类应用相当,但 32 位控制台模式操作比 QuickBASIC 等的 16 位控制台操作慢得多。在 DOS 版本中,从 16 位 BASIC 迁移到 FB 后,某些 I/O 操作可能会变慢——优化代码可以恢复速度。

返回顶部

FreeBASIC 与 QuickBASIC 的兼容性如何? ​

FreeBASIC 内置图形库模拟了最常用的 QB 图形模式(模式 7、12、13),并实现了 QB 中所有绘图基本操作。

大多数兼容性问题来源于旧 QB 程序中使用的 8086-DOS 硬件特定的底层技术。VGA 端口编程、DOS 中断、内存段切换、直接写入屏幕内存或使用 PC 扬声器播放音乐等功能不被直接支持,但可以通过外部库来支持/模拟。

迁移旧 QB 程序时的其他问题,如变量名与新 FB 关键字冲突、变量名是 QB 关键字加类型后缀、FB 中默认整数大小为 32 位等,可以通过在命令行使用 -lang qb 开关来解决。

参见 FreeBASIC 与 QuickBASIC 的区别。

返回顶部

FreeBASIC 与 Windows、DOS、Linux 的兼容性如何? ​

FreeBASIC 与 Windows、MS-DOS、FreeDOS 和 Linux 完全兼容。但在计划为三个平台创建程序时,请注意 API 的可用性——例如,使用 OpenGL 的代码可以在 Windows 和 Linux 上运行,但不能在 DOS 上运行,因为 DOS 没有 OpenGL。

返回顶部

FreeBASIC 支持面向对象编程吗? ​

FreeBASIC 支持带成员函数(方法)的类(用户定义类型)、静态方法、静态成员变量、构造函数、析构函数、属性、运算符重载、单继承、虚方法和抽象方法(多态)以及运行时类型信息(RTTI)。关于 OOP 功能的未来计划包括添加多重继承和/或接口支持。更多信息请参见:类型对象初学者指南。

返回顶部

FB 的未来计划 / 待办事项列表是什么? ​

你可以直接查看 fbc 的 todo.txt 来了解未来版本的计划。

返回顶部

我可以用 FB 编写 GUI 应用程序吗? ​

可以。各自版本中都提供了调用 Windows 和 Linux GUI API 的头文件,但这样做出的程序不可移植。

有一些 API 包装器和实验性 RAD 应用程序可以为 Windows 生成不可移植的 GUI 代码。

要进行可移植编程,可以使用 GTK 或 wx-Widgets 等跨平台 GUI 包装库。FB 附带了 GTK 头文件,但 FB 目前可用的 OOP 功能阻止了 wx-Widgets 的使用。使用这些库创建的程序可能需要用户在其系统上安装相应的包装库。

对于游戏和小型图形应用程序,有一些 FB 专用库可以在图形屏幕内绘制和管理按钮、编辑框等简单控件,使用这些库制作的程序完全可移植。

返回顶部

FB 适合复杂/大型应用程序吗? ​

FB 编译器是自托管的,它本身就是用 FB 编写的。这意味着目前已有超过 120,000 行代码,是一个相当复杂的应用程序。

返回顶部

我可以在 FreeBASIC 应用程序中使用非拉丁字符集吗? ​

FreeBASIC 拥有各平台 C 运行时库所提供的 Unicode 支持。这意味着 FB DOS 不支持 Unicode。在其他平台上,你可以使用 Wstring 来支持任何所需的字符集。文件 OPEN 关键字有一个附加的 Encoding 参数,允许使用不同的编码。由于 FreeBASIC 本身就是用 FB 编写的,这意味着你可以在 Unicode 编辑器中编写源代码,注释和字符串字面量可以使用任何字符集(但关键字、标签以及变量和过程的名称必须保持在 ASCII 字符集内)。

对于屏幕输出,控制台模式和图形模式的支持有所不同。在控制台模式下,如果控制台字体支持,则支持非拉丁字符集的 wstring 打印。图形模式使用内部 CP437 字符集(旧的 DOS 字符集)字体,因此非拉丁字符输出需要自定义的光栅字体,并使用 DRAW STRING 关键字。已有第三方工具可以获取外部字体并将其转换为 DRAW STRING 格式。

返回顶部

我可以在 FB 中使用串口/COM 和硬件/CPU 端口吗? ​

可以,FB 内置了访问串口/COM 和硬件/CPU 端口的函数,无需外部库。有关详情,请参阅操作系统特定 FAQ,以及 Open Com、INP 和 OUT。

返回顶部


FreeBASIC 入门问题 ​

在哪里可以找到更多关于 FreeBASIC 的信息? ​

FreeBASIC Wiki 是使用 FreeBASIC 的最新手册,可在此处访问。

活跃的 FreeBASIC 相关论坛,除了官方论坛外,还可以在 qbasicnews、Pete's QB Site、FB 游戏目录 或 freebasic-portal.de(德语) 找到。

定期发表 FreeBASIC 相关文章的活跃杂志有 QB Express 和 QBXL Magazine。这些杂志一直在寻找新文章,如果你有关于 FreeBASIC 的好文章创意,欢迎投稿!

返回顶部

为什么启动 FreeBASIC 时不打开 QB 的图形界面? ​

QB 有一个集成开发环境(IDE)。FreeBASIC 没有。

FreeBASIC 只是一个编译器,而不是完整的 QuickBASIC 克隆。它是一个控制台模式应用程序。它接受命令行中的 BAS 文件,并输出一个 EXE 文件。

你可以用操作系统中最简单的纯文本编辑器(记事本、EDIT、nano 等)创建 BAS 文件,然后运行编译器。

如果你离不开语法高亮、错误提示、多文件管理、集成调试器、上下文帮助或其他功能,你需要一个 IDE。请参阅操作系统特定 FAQ 了解可用的 IDE 和编辑器。

返回顶部

我可以获取离线版本的文档吗? ​

这个在线 Wiki 是 FB 的官方文档,通常与 FB 开发版本的最新改进保持同步。

此 Wiki 的离线版本(CHM、HTML 及其他格式)可从 SourceForge 上 fbc 下载站点的文档目录 获取。

返回顶部

FB 方言的用意是什么? ​

其用意是在保持与 QB 代码向后兼容的同时,允许语言不断改进。QB 语法的特性与 OOP 所要求的更严格风格并不兼容。新的 FB 关键字常常与旧 QB 程序中的变量名冲突。QB 允许在不是 UDT 的变量名和过程中自由使用点号。

三种方言(-lang fb、-lang qb、-lang fblite)可以将两者的优点结合起来。

  • lang fb 提供了 OOP 编程所需的框架。其他方言不能访问 OOP 功能。
  • lang qb 将允许开发者持续提高与 QB 程序的兼容性。FB 中较新的关键字可以通过在其前面加两个下划线来使用。例如,Getmouse 可以通过使用 __Getmouse 来调用。
  • lang fblite 提供 FreeBASIC 语言兼容性,采用更接近 QBASIC 的编码风格。

详情请参见编译器方言。

返回顶部

为什么我定义一个超过 xx 大小的数组时程序会崩溃? ​

这通常是因为你定义了一个过大的 自动 固定长度数组,它正在破坏程序栈。你有几种选择:

  • 如果可能,缩小 自动 数组的大小
  • 创建一个可变长度数组
  • 使用编译时的 -t 命令行选项 为程序栈保留更多内存。默认值为 -t 1024(千字节)或 -t 2048(千字节)。注意:在这里使用非常大的值是个坏主意。
  • 使用 Static 而不是 Dim 来定义数组,创建一个 静态 数组(仅局部可见,但全局保留)
  • 使用 Dim 加 Shared 访问来定义数组(这使数组完全全局化)
  • 使用指针和内存函数(如 Allocate 和 Deallocate)自行管理内存——这是存储大型缓冲区的推荐方式,但不适合初学者。

静态 和 可变长度 数组不使用程序栈来存储其元素数据,因此不存在与 自动 固定长度数组相关的问题。更多信息请参见存储类。请注意,将大型缓冲区存储为 静态 或将栈大小增加到远超默认值并不是个好主意,因为这会增加加载和启动程序所需的固定内存量,即使大部分内存后来并未使用,也可能导致性能下降,甚至导致程序完全无法加载。

返回顶部

为什么我的程序编译失败,提示"cannot find -llibname"? ​

这是链接器产生的错误。程序应该链接到一个外部库,该库在程序代码中通过 #Inclib 或在编译器命令行中通过 -l 指定。但是,链接器在所有库路径中都找不到匹配的文件。请查看你要链接的库的主页以了解如何下载,或查看 ExtLibTOC 看是否能找到该库的相关信息。有关库以及如何使用它们的一般信息,请参见使用预编译库及其相关页面。

返回顶部


FreeBASIC 高级问题 ​

如何链接到 C 库? ​

在 FreeBASIC 中设置 C 库的方式与在 C 中大致相同。FreeBASIC 附带的每个库都有一个名为"库名.bi"的基本包含文件,该文件使用 #INCLIB 元命令来包含库,并使用 Declare 语句来声明库中的函数。FreeBASIC 包含数百个 BI 文件,完整的库头文件列表请参见此处。

返回顶部

我可以使用调试器吗? ​

FreeBASIC 最好使用与 GNU GDB 兼容的调试器。

  • Win32:Insight 是 GDB 的一个用户友好包装器,请参见 Win32 相关 FAQ。
  • DOS:请注意 DOS 也有一个名为"Insight"的产品,但它是一个实模式调试器,不能与 FreeBASIC 配合使用,请使用 GDB 或至少某个 DPMI32 调试器。
  • Linux:使用 GDB。

有关你的操作系统的详细信息,请参阅操作系统特定 FAQ。

返回顶部

FB 附带的 AR.EXE、AS.EXE 和 LD.EXE 文件的用途是什么? ​

AS.EXE 是 GAS,即"GNU 汇编器",始终参与编译过程。LD.EXE 是"GNU 链接器",参与创建可执行文件。AR.EXE 是"GNU 归档器",实际上是一个库管理员,用于创建 .A 库文件。

返回顶部

源文件的大小有限制吗? ​

有,由于 FreeBASIC 是一款完整的 32 位编译器,理论上它可以处理最大 4GB 或 4,294,967,296 字节的源文件,但你的 RAM 容量应该明显大于源文件大小,否则编译将无法完成,或至少会非常缓慢。

返回顶部

我可以用 FreeBASIC 编写操作系统吗? ​

可以,也不可以。如果你确实坚持要编写操作系统并涉及 FB,那么答案是可以。但如果问题是,即使是初学者,现在是否应该使用 FB 开始编写操作系统,那答案是否定的。存在几个陷阱:

  • 操作系统开发很困难,参见 http://www.osdev.org/wiki/Getting_Started。
  • FB 不会帮你绕过处理汇编的需求,C 语言也几乎无法避免。
  • 你将无法使用大多数可信赖的 FB 特性,如图形、文件 I/O、线程、内存管理,甚至控制台 I/O……只有控制流、数学和逻辑可以使用。如果你需要那些库函数,你必须自己重新实现它们。

FreeBASIC 依赖于 GCC,关于用 C 开发操作系统的可用信息同样适用于 FreeBASIC。FB 对你的帮助既不会比 GCC 多,也不会比 GCC 少。

返回顶部

我正在开发一个操作系统,FreeBASIC 可以移植到我的操作系统吗? ​

这取决于情况。如果你的操作系统至少能与带有 DPMI32 的 DOS 功能相当(控制台 I/O(寻址、多文件打开……)、文件 I/O、内存管理),并且有 GCC 的移植版本,那么答案是可以。如果你至少有另一个功能大致相符的 C 编译器和相关库,也可能可以实现。例如,你不能合理地将 FB 移植到一个只能以单个数据块加载或保存文件的操作系统,或者 16 位操作系统上。

返回顶部

FreeBASIC 支持像 C++ 那样从函数返回引用吗? ​

是的,这个功能已经存在。过程现在可以使用 byref as datatype 作为返回类型来返回引用。

返回顶部

参见 ​

以及

返回目录

基于 FreeBASIC 官方文档翻译 如有侵权请联系我们删除
FreeBASIC 是开源项目,与微软公司无隶属关系