# FreeBASIC

FreeBASIC is een gratis en open source BASIC compiler. De syntaxis van FreeBASIC lijkt zo veel mogelijk op andere vormen van BASIC maar is vooral gebaseerd op de syntaxis van QBasic. Op het moment kan FreeBASIC programma's compileren voor DOS, Xbox, Windows en Linux. Men is momenteel bezig om FreeBASIC naar nog meer platformen over te zetten. Voorlopig bestaat de compiler uit bijna 90.000 regels code, helemaal geschreven in FreeBASIC zelf.

## Compiler eigenschappen

Het back-end van de FreeBASIC compiler maakt gebruik van de GNU Binutils om bron-code om te zetten in console en GUI applicaties. Het is mogelijk om zowel statisch en/of dynamisch gelinkte C (programmeertaal) bibliotheken te creëren en te linken. FreeBASIC geeft in beperkte mate ook ondersteuning tot het linken van C++ bibliotheken. De compiler is beschikbaar in zowel een 32 bit als een 64 bit uitvoering.
De code die gegenereerd wordt door FreeBASIC kan daardoor in veel andere programmeeromgevingen ingezet worden. Verder ondersteunt FreeBASIC een pre-processor in C (programmeertaal) stijl met ondersteuning voor inline macro’s, conditioneel compileren en het includeren van bestanden.
Door enkele compilervlaggen te gebruiken is het mogelijk om verschillende back-end compilers in te zetten. Er is een mogelijkheid om een Assembleertaal, GNU Compiler Collection C compiler en LLVM back-end te kiezen. De gehele FreeBASIC standaard bibliotheek is op alle back-end opties beschikbaar, echter de uiteindelijke code prestaties en het formaat van het gegenereerde uitvoerbare bestand kunnen hierdoor verschillen.
Assembleertaal ondersteuning is in FreeBASIC beschikbaar wanneer men een statement-blok opent met een ASM statement.
Function add_five(Byval number As Integer) As Integer
Asm
mov EAX, [number]
add EAX, 5
mov [FUNCTION], EAX
End Asm
End Function
Ongeacht de gekozen backendcompiler dient de assembleertaal in de Intelsyntaxis geschreven te worden. FreeBASIC zal deze omzetten naar de juiste assembleertaal voor de betreffende backend.

## Syntaxis

In eerste instantie was FreeBASIC opgezet als direct syntaxisequivalent aan QuickBasic (QBasic [een interpreter] in DOS5), echter in de loop der tijd is de compiler uitgebreid met verscheidene moderne functies. Enkele van deze functies zijn:
* objects (veel object georiënteerde elementen zijn geïmplementeerd)
* methods
* constructors
* dynamic memory allocation
* properties
* operator overloading
* function overloading
* namespaces
* pointers
Verder mogen er net als in QuickBasic meerdere statements op een lijn geschreven worden mits ze gescheiden worden met een dubbelepunt. Do : a += 1 : If a > 10 Then : a = -10 : Loop

## FreeBASIC Dialecten

Om toch een zekere compatibiliteit te behouden met de originele QuickBasic- en vroege FreeBASICdialecten is er een optie ingebouwd om te schakelen tussen 3 dialecten. De moderne compiler uitbreidingen die toen nog niet beschikbaar waren zijn in veel gevallen wel gewoon te gebruiken, maar dan intermixt met een oudere syntaxis.
* Standaard dialect: (moderne dialect met alle moderne functies beschikbaar, verouderde syntaxiselementen zijn hier niet toegestaan)
* FB-lite dialect: (bijna alle moderne objectgeoriënteerde opties zijn beschikbaar, echter zijn in dit dialect verouderde BASIC statements zoals GOSUB / RETURN ondersteund en genummerde lijnlabels)
* QB dialect: (probeert zo goed mogelijk de volledige Q(uick)Basicfunctionaliteit na te bootsen in een moderne omgeving. oude MS-DOS QuickBasic bron-code zal vaak zonder aanpassingen compileren)

## Grafische bibliotheek

FreeBASIC heeft een ingebouwde grafische bibliotheek genaamd FBgfx. FBgfx heeft alle functies die ook aanwezig waren in QuickBasic, echter uitgebreid met kleurdiepte-ondersteuning tot 32-bit (24-, 16-, 8-Bit zijn ook beschikbaar).
De bibliotheek heeft ook een aantal moderne functies om beter met de hogere kleurdiepte, page-flipping, window management en andere randapparatuur (keyboard, joystick en muis) om te gaan. Back-end van de bibliotheek kan communiceren met zowel GDI, OpenGL (Linux) en Microsoft DirectX. De bibliotheek is niet hardware versneld.