BASIC compatibility
- FreeBASIC is not a "new" BASIC language. You don't need to learn much new if you are familiar with any Microsoft-BASIC variant. You can use either "-lang qb" for compatibility, or (default) "-lang fb" for some of the new features, but it also brings some restrictions and some similarity with the "C" programming language. See also CompilerDialects.
- FreeBASIC is case-insensitive; explicit "main" procedure is not required; most of the graphic and console statements and procedures found in Microsoft QuickBASIC are implemented, et cetera.
- Only with "-lang qb": scalar variables don't need to be dimensioned and suffixes can be used; line numbers are supported; GoSub supported.
Clean syntax
- Only a small number of keywords have been added. All procedures are implemented as libraries, so for the most part, there are no new intrinsic routines, and therefore there is a low chance of having name duplication with old code.
Thin bindings (header files) to existing C libraries and APIs
- No wrappers or helpers are necessary, just a ported header file, making usage of external C libraries very easy
- The official distribution comes with several bindings to existing C libraries already, see External Libraries TOC for a complete up-to-date list
Multi-platform
- FreeBASIC supports native or cross-target builds for DOS, Windows, Windows CE, Linux, Android, JavaScript/Emscripten, Darwin/macOS, Cygwin, BSD systems, Haiku, Solaris/illumos, NuttX, RISC OS, AROS, Wii homebrew, and the original Xbox. See -target for the current target identifiers and limits.
- The compiler and runtime support x86, x86-64, ARM, AArch64, PowerPC, RISC-V, s390x, LoongArch64, m68k, and MIPS families where the selected operating-system target provides a working toolchain and runtime layer.
- The runtime library was written with portability in mind. Target-specific compiler, runtime, graphics, and sound work is kept in platform directories. The compiler is self-hosting, and the build system can emit bootstrap sources for targets that cannot run the build-host compiler.
Unicode support
- Besides ASCII files with Unicode escape sequences (\u), FreeBASIC can parse UTF-8, UTF-16LE, UTF-16BE, UTF-32LE and UTF-32BE source (.bas) or header (.bi) files, they can be freely mixed with other sources/headers in the same project (also with other ASCII files).
- Literal strings can be typed in the original non-Latin alphabet, just use a text-editor that supports some of the Unicode formats listed above.
- The WString type holds wide-characters, all string procedures (like Left, Trim, etc) will work with wide-strings too.
- Open was extended to support UTF-8, UTF-16LE and UTF-32LE files with the Encoding specifier. Input # and Line Input #, as well as Print # and Write # can be used normally, and any conversion between Unicode to ASCII is done automatically if necessary.
- Print also supports Unicode output (see Requirements).
A large number of built-in data types
- Integer: Byte, UByte, Short, UShort, Integer, UInteger, Long, ULong, LongInt, ULongInt
- Floating-point: Single, Double
- String: fixed, variable-length or null-terminated (ZString), up to 2GB long
- Unicode strings (WString), like ZString, but with support for wide characters. Use the Windows Unicode API procedures directly, etc.
User-defined types (UDTs)
- Unlimited nesting.
- BASIC's Type statement is supported, along with the new Union statement (including anonymous nested unions).
- Array fields utilizing up to eight dimensions can be used.
- Procedure pointer fields.
- Bit fields.
Enumerations (enums)
- Easily declare a list of constants with sequential values with Enum.
Arrays
- Fixed- and variable- length arrays are supported, up to 2 GB in size.
- Up to eight dimensions, including arrays with unknown dimensions.
- Any lower and upper boundaries.
- Element data can be preserved during a re-size of variable-length arrays with ReDim using the new Preserve specifier.
Pointers
- Pointers to any of the data types listed above, including string characters, array elements and UDT's.
- Uses the same syntax as C.
- Unlimited indirection levels (e.g., pointer to pointer to ...).
- Procedure pointers.
- Indexing []'s (including string indexing).
- Type casting.
Variable, object and array initialization
- For static, module-level or local variables, arrays and UDT's.
Default procedure parameter values
- For numeric, string and UDT parameter types.
Procedure overloading
- Including procedures with default parameter values.
In-line assembly
- Intel syntax.
- Reference variables directly by name; no "trick code" needed.
Traditional preprocessor support
- Same syntax as in C.
- Single-line macros supported with the #define command, including parameters.
- Multi-line macros supported with the #macro command.
Type aliases
- Supporting forward referencing as in C, including UDT and procedure pointer types.
C-like escape sequences for string literals
- Same as in C (except numbers are interpreted as decimal, not octal).
Debugging support
- Full debugging support with GDB (the GNU debugger) or Insight (a GDB GUI frontend).
- Array bounds checking (only enabled by the -exx command-line option).
- Null pointer checking (same as above).
Create OBJ's, LIB's, DLL's, and console or GUI EXE's
- You are in no way locked to an IDE or editor of any kind.
- You can create static and dynamic/shared libraries adding just one command-line option (-lib or -dylib/-dll).
Capacity and native word sizes
- Native integer and pointer sizes follow the selected target. Both 32-bit and 64-bit targets are supported, and cross compilation must use headers and libraries built for the same ABI.
- Source size, symbol count, generated output, and link capacity are bounded by available address space, memory, filesystem limits, and the selected backend and toolchain. Large programs are better built with a 64-bit host compiler when one is available.
Optimized code generation
- FreeBASIC performs language-level and backend-specific optimizations. The GCC and clang C backends can use the target compiler's optimizer across the wider architecture set; the native GAS and GAS64 backends retain specialized x86 and x86-64 code generation.
Built-in graphics, sound, and networking
- gfxlib2 provides the portable graphics command set. The optional gfxlib3 runtime adds render-threaded Vulkan/OpenGL/OpenGL ES operation on its supported hosts.
- sfxlib provides generated sound, PLAY strings, samples, music, MIDI, device selection, and capture through platform audio backends.
- Open Tcp and Open Tcp Server provide portable stream networking, with optional serial, wire-format, GPIO, and browser WebSocket headers for their supported targets.
Completely free
- All third-party tools are also free. No piece of abandoned or copyrighted software is used (except GoRC on Win32). The assembler, linker, librarian/archiver, and other command-line applications come from the GNU binutils programming tools.