FreeBASIC

**FreeBASIC** — Sintaksisi boʻyicha QuickBASICga eng yaqin boʻlgan yuqori darajadagi dasturlash tili, shuningdek uning uchun kompilyator (FreeBASIC Compiler). Boshida kompilyator Microsoft QuickBasicning erkin alternativasi sifatida yaratilayotgan edi, lekin tez fursatda yangi imkoniyatlarga ega boʻldi va kuchli dasturlash vositasiga aylandi. Garchi birinchi versiyalari Visual Basicda yozilgan boʻlsada, endi u oʻzini oʻzi kompilyatsiya qila oladi.

## Kompilyator
QBasic va FreeBASIC kodni 32 va 64-bit Win32, DOS (himoyalangan rejimda) va Linux x86 modullariga kompilyatsiya qiladi.

Assemblerlash va tarkiblash GNU Binutils yordamida amalga oshiriladi.

Kompilyator GNU GPL shartlari tarqatiladi, standart biblioteka esa — GNU LGPLda.

Bir nechta dasturlash muhiti mavjud, tuzatgich sifatida GNU Debuggerni ishlatish mumkin (shuningdek gprof ham qoʻllanadi).

## Til
Kompilyator QuickBasic bilan mos kelishiga qaramasdan, zamonaviy talablarga, standartlarga mos kelishi uchun hamda C/C++da yozilgan biblioteka va APIga mos kelishi uchun FreeBASIC tiliga koʻp kengaytma va imkoniyatlar qoʻshilgan. 0.17 versiyasida boshlab foydalanuvchi kompilyatsiya qilishning uchta tartibdan birini tanlashi mumkin (-lang sozlanmasi): QuickBASIC (qb) bilan, FreeBASICning eski versiyalari bilan  (deprecated) moslik tartibi va barcha oxirgi oʻzgarishlar va imkoniyatlarni oʻz ichiga oluvchi standart tartib (fb).

### Yangi imkoniyatlar va kengaytmalar
* Yunikodni qoʻllanishi.
* Oʻzgaruvchilarning koʻpchilik oʻrnatilgan turlari (Byte, UByte, Short, UShort, Integer, UInteger, LongInt, ULongInt, Single, Double, Boolean, String, ZString, WString).
* Foydalanuvchi tomonidan aniqlanadigan maʼlumotlar turi (cheksiz solinish, Union, maydon turi (array, function, bit fields)).
* Nomfazolar.
* Sanaladigan tur (Enum).
* Massivlar bilan ishlashda yangi imkoniyatlar (2 GB oʻlchamgacha, Redim Preserve).
* Koʻrsatkichlar (ixtiyoriy maʼlumotlar turiga koʻrsatkichlar, cheksiz bilvosita murojaat qilish).
* Funksiya va operatorlarni qayta yuklash.
* Funksiyalarning majburiy boʻlmagan argumentlari.
* Oʻrnatilgan assembler (dastur manba kodida assembler instruksiyalari).
* Preprotsessorlar.
* Typedefs.
* Sinflarning konstruktor va destruktorlari.
* Kengaytirilgan grafik bibliotekasi.

### Amaliy dasturlash funksiyalari bibliotekalarini qoʻllab-quvvatlashi
* Interfeyslar yaratish: GTK, FLTK, IUP, WINAPI va b.
* Muntazam ifodalar: PCRE
* IE va Microsoft Office avtomatizatsiyasi: Disphelper
* Ovoz: BASS, fbsound, FMOD va b.
* Grafika: Сairo, FreeType, Allegro, DevIL, FreeImage, DISLIN va b.
* PDF yaratish: CD, LibHaru 
* Maʼlumotlar bazasi: mysql, sqlite, postgresql
* Tarmoq: Curl va b.
* Arxivlar: Zlib, libzip va b.

### Dasturlar misollari

#### Hello, World!
FreeBASICning oʻrnatilgan bibliotekasini ishlatgan holda:

```freebasic
Print "Hello, World!"
```


C standart bibliotekasini ishlatgan holda:

```freebasic
#Include "crt.bi"

puts(!"Hello, World!\n")
```


Windows APIni ishlatgan holda:

```freebasic
#Include "windows.bi"

MessageBox(Null, "Hello, World!", "Message", MB_OK)
```


### Obyektga moʻljallangan dasturlash

```freebasic
' Vektor sinfi
Type Vector
	W As Integer
	H As Integer
	Declare Constructor(nW As Integer, nH As Integer)
End Type
 
Constructor Vector(nW As Integer, nH As Integer)
	W = nW
	H = nH
End Constructor
 
' Obyekt yaratish uchun sinf
Type AObject
	Private:
		X As Integer
		Y As Integer
		Movement As Vector Pointer
	Public:
		' Tashqarida koʻrinadigan metodlar, konstruktor va destruktor bilan birga
		Declare Constructor(nX As Integer, nY As Integer)
		Declare Destructor()
		Declare Sub SetMotion (Motion As Vector Pointer)
		Declare Sub Move()
		Declare Property GetX As Integer
End Type
 
' Boshlangʻich qiymatlarni oʻrnatish
Constructor AObject(nX As Integer, nY As Integer)
	X = nX
	Y = nY
End Constructor
 
' Xotirani boʻshatish
Destructor AObject()
	Delete Movement
End Destructor
 
' Vektorni oʻrnatish
Sub AObject.SetMotion(Motion As Vector Pointer)
	Movement = Motion
End Sub
 
' Obyektni vektor boʻyicha koʻchirish
Sub AObject.Move()
	X += Movement->W
	Y += Movement->H
End Sub
 
' Tashqaridan ruxsat berilmagan X koordinatasini qaytaradi
Property AObject.GetX As Integer
	Return X
End Property
 
' Dasturning haqiqiy boshlanish joyi 
 
' Sinf nusxasini koordinatalar (100, 100) bilan yaratish
Dim Player As AObject = Type<AObject>(100, 100)
 
' Vektorni boshlangʻich qiymatlar bilan yaratish (-10, 5) va obyekt oʻrnini koʻchirish
Player.SetMotion(New Vector(-10, 5))
 
' Obyektni koʻchirish
Player.Move()
 
' X koordinatasini olamiz va konsolga chiqaramiz
Print Player.GetX
 
' «Player» obyekti destruktori, qachonki obyekt koʻrinish zonasini tark etganda chaqiriladi
' «Player» mahalliy oʻzgaruvchi boʻlgani uchun destruktor avtomatik chaqiriladi

'Ixtiyoriy tugmacha bosilishini kutamiz
Sleep
```


## Izoh

## Yana qarang
* QB64

## Manbalar
* FreeBASIC Manual

## Havolalar
* 
* Rus tilidagi sayt 
* Rus tilidagi forum

;IDE
* FBIde — FreeBASIC uchun IDE
* FbEdit — FreeBasic uchun yana bir IDE
* WinFBE - Windows uchun zamonaviy FreeBASIC IDE
* VisualFBEditor — FreeBASIC uchun IDE