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 ComINPOUT

返回顶部


FreeBASIC 入门问题

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

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

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

定期发表 FreeBASIC 相关文章的活跃杂志有 QB ExpressQBXL 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 来定义数组,创建一个 静态 数组(仅局部可见,但全局保留)
  • 使用 DimShared 访问来定义数组(这使数组完全全局化)
  • 使用指针内存函数(如 AllocateDeallocate)自行管理内存——这是存储大型缓冲区的推荐方式,但不适合初学者。

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

返回顶部

为什么我的程序编译失败,提示"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 是开源项目,与微软公司无隶属关系