Obsah
4. Yabasic (Yet Another BASIC)
8. Komplexní vývojové prostředí Gambas
1. bwBASIC (Bywater BASIC)
V předchozích částech tohoto seriálu jsme si stručně popsali historii programovacího jazyka BASIC na osmibitových domácích mikropočítačích i na osobních počítačích kompatibilních s IBM PC. Ovšem programovací jazyk BASIC se v některých případech používá i v současnosti. Nejedná se již ovšem o „klasický“ BASIC s čísly řádků, nestrukturovanými příkazy GOTO, ON GOTO ani s automaticky deklarovanými globálními proměnnými, ale o jazyk, který se svou syntaxí, sémantikou i podporovanými datovými typy mnohem více podobá běžným strukturovaným programovacím jazykům. V dnešní části seriálu si některé současné interpretry a překladače tohoto jazyka popíšeme. Bude se jednat jak o velmi jednoduché interpretry s řádkovým editorem (bwBASIC), tak i o dialekty BASICu vybavené integrovaným vývojovým prostředím (Basic-256, SdlBasic, Yabasic) a taktéž o skriptovací jazyk použitý pro tvorbu maker a modulů známého aplikačního balíku OpenOffice.org.
Obrázek 1: V SdlBasicu popsaném v dalších kapitolách lze mj. volat i funkce grafické knihovny OpenGL.
Nejjednodušší dialekt programovacího jazyka BASIC, který si dnes popíšeme, se nazývá Bywater BASIC, zkráceně bwBASIC. Tento dialekt založený na ANSI BASICu, který lze používat jak v Linuxu, tak i v mnoha dalších operačních systémech, dokáže buď interpretovat programy uložené v externím souboru, podobně jako BASH či mnoho dalších nástrojů a interpretrů, nebo může s uživatelem komunikovat interaktivně, ovšem pouze s využitím (jedno)řádkového vstupního editoru, což je vlastně krok zpět za těmi BASICy, které byly dostupné již v dobách MS-DOSu. Podobným způsobem jako bwBASIC pracuje například i Python či Perl v interaktivním režimu. O bwBASICu se v tomto článku zmiňuji především z toho důvodu, že se pyšní jednou vlastností, kterou u prakticky žádného dalšího dialektu BASICu nenajdeme – dokáže přímo spouštět příkazy shellu, takže lze tento jazyk použít namísto klasických shellscriptů, což by možná mohlo být pro zaryté bejzikáře (pokud ještě nějací existují :-) docela zajímavé.
Obrázek 2: Jednoduše ovladatelné vývojové prostředí Basicu-256.
Z repertoáru poměrně velkého množství příkazů a funkcí definovaných v ANSI normě BASICu je možné v bwBASICu použít následující příkazy (text uvedený v hranatých závorkách je samozřejmě nepovinný):
| Příkaz/funkce |
|---|
| ABS( number ) |
| ASC( string$ ) |
| ATN( number ) |
| CALL subroutine-name |
| CASE ELSE | IF partial-expression | constant |
| CHAIN [MERGE] file-name [, line-number] [, ALL] |
| CHDIR pathname |
| CHR$( number ) |
| CINT( number ) |
| CLEAR |
| CLOSE [[#]file-number]… |
| CLS |
| COMMON variable [, variable…] |
| COS( number ) |
| CSNG( number ) |
| CVD( string$ ) |
| CVI( string$ ) |
| CVS( string$ ) |
| DATA constant[,constant]… |
| DATE$ |
| DEF FNname(arg…)] = expression |
| DEFDBL letter[-letter](, letter[-letter])… |
| DEFINT letter[-letter](, letter[-letter])… |
| DEFSNG letter[-letter](, letter[-letter])… |
| DEFSTR letter[-letter](, letter[-letter])… |
| DELETE line[-line] |
| DIM variable(elements…)[variable(elements…)]… |
| DO NUM|UNNUM |
| DO [WHILE expression] |
| EDIT |
| ELSE |
| ELSEIF |
| END IF | FUNCTION | SELECT | SUB |
| ENVIRON variable-string = string |
| ENVIRON$( variable-string ) |
| EOF( device-number ) |
| ERASE variable[, variable]… |
| ERL |
| ERR |
| ERROR number |
| EXP( number ) |
| FIELD [#] device-number, number AS string-variable |
| FILES filespec$ |
| FUNCTION |
| FOR counter = start TO finish [STEP increment] |
| GET [#] device-number [, record-number] |
| GOSUB line | label |
| GOTO line | label |
| HEX$( number ) |
| IF expression THEN [statement [ELSE statement]] |
| INKEY$ |
| INPUT [# device-number]|[;][„prompt string“;]list of variables |
| INSTR( [start-position,] string-searched$, string-pattern$ ) |
| INT( number ) |
| KILL file-name |
| LEFT$( string$, number-of-spaces ) |
| LEN( string$ ) |
| LET variable = expression |
| LINE INPUT [[#] device-number,][„prompt string“;] string-variable$ |
| LIST line[-line] |
| LOAD file-name |
| LOC( device-number ) |
| LOCATE line, column |
| LOF( device-number ) |
| LOG( number ) |
| LOOP [UNTIL expression] |
| LSET string-variable$ = expression |
| MERGE file-name |
| MID$( string$, start-position-in-string[, number-of-spaces ] ) |
| MKD$( number ) |
| MKDIR pathname |
| MKI$( number ) |
| MKS$( number ) |
| NAME old-file-name AS new-file-name |
| NEW |
| NEXT [counter] |
| OCT$( number ) |
| ON variable GOTO|GOSUB line[,line,line,…] |
| ON ERROR GOSUB line |
| OPEN „O“|„I“|„R“, [#], file-name [,record length] |
| OPEN file-name FOR INPUT|OUTPUT|APPEND AS [#]device-number [LEN = record-length] |
| OPTION BASE number |
| POS |
| PRINT [# device-number,][USING format-string$;] expressions… |
| PUT [#] device-number [, record-number] |
| QUIT |
| RANDOMIZE number |
| READ variable[, variable]… |
| REM string |
| RESTORE line |
| RETURN |
| RIGHT$( string$, number-of-spaces ) |
| RMDIR pathname |
| RND( number ) |
| RSET string-variable$ = expression |
| RUN [line][file-name] |
| SAVE file-name |
| SELECT CASE expression |
| SGN( number ) |
| SIN( number ) |
| SPACE$( number ) |
| SPC( number ) |
| SQR( number ) |
| STOP |
| STR$( number ) |
| STRING$( number, ascii-value|string$ ) |
| SUB subroutine-name |
| SWAP variable, variable |
| SYSTEM |
| TAB( number ) |
| TAN( number ) |
| TIME$ |
| TIMER |
| TROFF |
| TRON |
| VAL( string$ ) |
| WEND |
| WHILE expression |
| WIDTH [# device-number,] number |
| WRITE [# device-number,] element [, element ]… |
Obrázek 3: Grafický demonstrační příklad naprogramovaný a interpretovaný SdlBasicem.
2. Basic-256
Zatímco výše popsaný bwBASIC se svou filozofií i možnostmi blížil prvním interpretrům BASICu používaných na minipočítačích, Basic-256 se již od klasické školy BASICu v mnoha ohledech odklání. Jedná se o interpret doplněný o vývojové prostředí s grafickým uživatelským rozhraním, který byl navržen s ohledem na to, aby se tento dialekt mohl použít při výuce programování, především na středních školách. Tomu odpovídá jak jednoduchost a přehlednost vlastního vývojového prostředí, tak i sémantika jazyka, která samozřejmě podporuje strukturované programování. Na Internetu je dostupná cca 300stránková učebnice programování, v níž jsou použity příklady naprogramované právě v Basicu-256. Nejedná se však v žádném případě o učebnici, která by pouze popisovala syntaxi tohoto jazyka, právě naopak – ukázána je například práce se základními datovými strukturami (seznamy, zásobníkem, frontou) spolu s vysvětlením, jak jsou tyto datové struktury a operace nad nimi interně implementovány. Kromě toho lze v této učebnici najít i mnohé základní algoritmy, například řazení prvků v posloupnosti.
Obrázek 4: Grafické vývojové prostředí Basicu-256 po jeho spuštění v Linuxu s Fluxboxem.
Kromě strukturovaných řídicích konstrukcí lze v Basicu-256 používat i (nechvalně) známé absolutní skoky, tj. příkazy typu GOTO a GOSUB), ovšem čísla řádků jsou nahrazena mnohem čitelnějšími textovými návěštími (label). Čísla řádků jsou považována za speciální typ návěští a jejich použití je doporučováno pouze při převodu starších programů do Basicu-256. Vývojové prostředí Basicu-256 obsahuje kromě velmi jednoduchého textového editoru i možnost zobrazení okna s hodnotami proměnných a taktéž grafickou oblast, do níž je možné provádět vykreslování. Ostatně právě možnost práce s grafikou, i když jsou k dispozici pouze základní grafické příkazy, je pro jazyk určený pro výuku programování nedocenitelná. Pro ukázku, jak vypadá zdrojový kód psaný v dialektu Basicu-256, jsem vybral část jednoduché hry Star Trek, která je odvozená od legendárního Star Treku hraného ještě na mainframech. Povšimněte si použití strukturovaných smyček (WHILE, END WHILE) a podmíněných bloků, ale i příkazu GOTO, za nímž následuje namísto čísla řádku textové návěští:
print "Your mission begins with the Enterprise in quadrant ";
print " (" + (egx+1) + "," + (egy+1) + ")."
while true
# update ship's condidion
condition = 0
if shields < 200 then
condition = 1
print "Shields are dangerously low."
end if
if nklingonsector > 0 then
condition = 2
print "Red Alert - Combat Area"
end if
if energy + shields < 500 then
condition = 2
print "Total ship energy is dangerously low."
end if
if energy + shields < 100 then
condition = 2
print "You have insufficient energy to maneuver the ship in space."
print " You are dead in the water."
goto badends
end if
# get orders
input "Captian, your orders? ", orders$
orders$ = upper(left(orders$,3))
if orders$ = "NAV" then gosub NAV
if orders$ = "SRS" then gosub SRS
if orders$ = "LRS" then gosub LRS
if orders$ = "CHA" then gosub CHA
if orders$ = "PHA" then gosub PHA
if orders$ = "TOR" then gosub TOR
if orders$ = "SHE" then gosub SHE
if orders$ = "DAM" then gosub DAM
if orders$ = "DOC" then gosub DOC
if orders$ = "AWA" then gosub AWA
if orders$ = "COM" then gosub COM
if orders$ = "XXX" then gosub XXX
if orders$ = "HEL" then gosub HEL
end while
Obrázek 5: Struktura integrovaného vývojového prostředí Basicu-256.
Odkazy na stránky související s Basicem-256:
- Basic-256 home page
http://www.basic256.org/index_en - Basic-256 Language Documentation
http://doc.basic256.org/doku.php - Basic-256 Art Gallery
http://www.basic256.org/artgallery - Basic-256 Tutorial
http://www.basic256.org/tutorials - Why BASIC?
http://www.basic256.org/whybasic - A book to teach ANYBODY how to program a computer (using BASIC)
http://www.basicbook.org/
Obrázek 6: Jednoduchý program pro vykreslení Mandelbrotovy množiny spuštěný z vývojového prostředí Basicu-256. Na tomto screenshotu můžeme vidět jak využití grafické oblasti, tak i sledování hodnot proměnných při běhu programu.
3. SdlBasic
Třetím dialektem programovacího jazyka BASIC, kterému se v dnešním článku budeme alespoň ve stručnosti věnovat, je SdlBasic. Jedná se o poměrně známý dialekt založený na wxBasicu, který je doplněný o vývojové prostředí s grafickým uživatelským rozhraním a taktéž o poměrně velké množství příkazů a funkcí, pomocí nichž je možné pracovat s knihovnou SDL (Simple DirectMedia Layer). Právě díky dostupnosti SDL bylo v tomto dialektu BASICu naprogramováno poměrně velké množství různých her a grafických dem. SdlBasic byl dokonce portován i na Sony Playstation Portable, což mj. znamená, že většinu programů odladěných v tomto jazyku na osobním počítači (PC) je možné přenést na PSP a tam spustit (pro vývoj lze použít emulátor PSP). Ze syntaktického hlediska se SdlBasic, podobně jako i další dnes popisované dialekty, přibližuje dalším moderním interpretrům a překladačům BASICu, tj. jedná se o plnohodnotný strukturovaný programovací jazyk.
Obrázek 7: Integrované vývojové prostředí SdlBasicu, z něhož byl spuštěný jednoduchý demonstrační příklad.
Jednou z poněkud netypických vlastností, která by mohla programátory při přechodu na SdlBasic překvapit, je to, že u příkazu next se neuvádí jméno řídicí proměnné smyčky (počitadla), tak, jako je tomu u mnoha dalších interpretrů programovacího jazyka BASIC – viz též obrázek číslo 8 se zobrazeným chybovým oknem.
Obrázek 8: SdlBasic při výskytu syntaktické chyby přeruší běh programu a umožní chybnou část kódu opravit.
Podobně jako u dalších dialektů BASICu, i zde si na krátkých programech ukážeme syntaxi SdlBasicu.
Program použitý na obrázku číslo 7, v němž je nejprve otevřeno okno s grafickou plochou o rozměrech 256×256 pixelů a bitovou hloubkou 32bpp, do něhož je prováděno vykreslování po jednotlivých pixelech, tj. na nejnižší úrovni abstrakce:
setdisplay(256,256,32,1)
paper(0xFFFFFF)
ink(0x000000)
pen(0x000000)
cls
for y=0 to 256
for x=0 to 256
ink(x+y*256)
putpixel(x,y)
next
next
waitkey
Ukázka využití operátoru + pro spojování řetězců a taktéž toho, že číselné proměnné není zapotřebí deklarovat:
setdisplay(320,240,32,1)
paper(8^8-1)
ink(0)
pen(0)
cls
mousehide
for a=1 to 15
b=rnd(10)
c=rnd(10)
if not (b>c) then
prints(str$(b)+","+str$(c)+": b is not greater than c")
end if
next
waitkey
Odkazy na stránky související se SdlBasicem:
- SdlBasic home page
http://www.sdlbasic.altervista.org/main/ - SdlBasic examples
http://nitrofurano.linuxkafe.com/sdlbasic/ - SdlBasic na Wikipedii
http://en.wikipedia.org/wiki/SdlBasic - Simple DirectMedia Layer
http://en.wikipedia.org/wiki/Simple_DirectMedia_Layer - SDLBASIC – The high-level interpreter for all?
http://openbytes.wordpress.com/2008/11/08/sdlbasic-the-high-level-interpreter-for-all/
Obrázek 9: Díky velkému množství knihoven, procedur a funkcí, které je možné spolu se SdlBasicem použít, lze relativně jednoduše implementovat například i prohlížečku souborů SVG (Scalable Vector Graphics).
4. Yabasic (Yet Another BASIC)
Čtvrtým dialektem BASICu, s nímž se dnes seznámíme, je Yabasic neboli Yet Another BASIC. Jedná se o dialekt BASICu, který již má za sebou poměrně dlouhý vývoj, neboť jeho první verze vznikla již v roce 1995 a v následujících letech došlo k portaci Yabasicu na další platformy, včetně operačních systémů Microsoft Windows a taktéž Sony PlayStation 2 (což znamená, že je možné pro tuto platformu poměrně snadno vyvíjet například jednodušší hry). Yabasic byl původně interpret ovládaný z příkazového řádku, ovšem dnes je ho možné používat i spolu s poměrně jednoduchým vývojovým prostředím. Ze syntaktického hlediska se jedná o strukturovaný programovací jazyk podporující uživatelské funkce a procedury s parametry, lokální proměnné, strukturované programové smyčky atd. Kromě základních řídicích příkazů, matematických, řetězcových aj. funkcí jsou uživatelům dostupné i příkazy pro práci s grafikou. Pro tvorbu programů s plnohodnotným grafickým uživatelským rozhraním lze využít například GTK-Server popsaný v následující kapitole.
Obrázek 10: Společenská hra Scrabble naprogramovaná v Yabasicu.
Následuje ukázka uživatelské funkce s parametry a lokálními proměnnými, v níž je využita jak počítaná smyčka typu FOR, tak i strukturovaná smyčka typu REPEAT-UNTIL s podmínkou vyhodnocovanou na konci smyčky (jedná se o funkci použitou v jednoduché hře):
sub placebombs(w, h, b)
local n, rx, ry
for n = 1 to b
repeat
rx = int(ran(w + 1))
ry = int(ran(h + 1))
until(grid$(rx, ry) = "" and rx > 0 and ry > 0 and rx <= w and ry <= h)
grid$(rx, ry) = "x"
next n
return
end sub
Obrázek 11: Grafické demo spuštěné v Yabasicu emulujícího PlayStation 2.
Odkazy na stránky související se Yabasicem:
- Yabasic home page
http://www.yabasic.de/ - Yabasic A free BASIC interpreter
http://yabasic.basicprogramming.org/ - Yabasic documentation
http://www.yabasic.de/yabasic.htm - Yabasic na Wikipedii
http://en.wikipedia.org/wiki/Yabasic - Programs Written for the YaBasic compiler/interpreter
http://web.ukonline.co.uk/mws.g/yabasic/index.html - GTK-Server
http://www.gtk-server.org/ - GTK-server na Wikipedii
http://en.wikipedia.org/wiki/GTK-server
5. Yabasic a GTK-Server
Již v předchozí kapitole jsme se zmínili o tom, že aplikace s plnohodnotným grafickým uživatelským rozhraním bylo možné v Yabasicu vytvářet za použití velmi šikovného a poněkud neprávem opomíjeného nástroje: GTK-Serveru. GTK-Server, který je dostupný jak pro mnoho unixových systémů, tak i pro Microsoft Windows, může být spuštěn jako samostatný proces, který se stará o vytváření oken a taktéž všech prvků grafického uživatelského rozhraní zobrazeného v těchto oknech. Aplikace napsaná například v Yabasicu, ale i v BASHi, Forthu, 4th (dialekt Forthu), LISPu či Erlangu, může s GTK-Serverem obousměrně komunikovat několika způsoby – pomocí posílání zpráv přes standardní vstup a výstup, využitím obousměrné roury, použitím dvojice pojmenovaných rour (pipes), přes TCP port (potvrzované spojení) nebo přes protokol UDP (nepotvrzované spojení, při lokálním použití prakticky nehrozí ztráta dat a komunikace je rychlejší než při použití TCP spojení).
Obrázek 12: Program naprogramovaný v Yabasicu, který využívá GTK-Server, spuštěný na Linuxu.
Aplikace, která má svým uživatelům nabídnout plnohodnotné grafické uživatelské rozhraní, musí nejprve spustit GTK-Server, navázat obousměrné spojení se spuštěným procesem a následně posílat příkazy odpovídající voláním funkcí přes aplikační programové rozhraní knihovny GTK. GTK-Server naopak posílá zpět zprávy v případě, že dojde k nějaké události, například ke stlačení tlačítka ve formuláři, výběru položky z list-boxu atd. Pro vytvoření dvojice rour, z nichž jedna je použita pro čtení a druhá pro zápis při komunikaci s GTK-Serverem (což je jedna z pěti možností popsaných v předchozím odstavci), je možné použít následující úryvek kódu napsaného v Yabasicu. Po zavolání procedury SETUP lze v programu používat dvojici „souborů“, k nimž je možné přistupovat pod čísly 1 a 2. Yabasic totiž, jako ostatně velké množství dalších dialektů BASICu, podporuje ve vstupně-výstupních příkazech nepovinná čísla souborů zapisovaná za křížek: PRINT #1, „Hello world“, INPUT #2, A$ atd.
REM Setup pipes
SUB SETUP()
os$ = PEEK$("os")
IF (os$ = "unix") THEN
SYSTEM("gtk-server fifo /tmp/yab.pipe &")
ELSE
SYSTEM("start gtk-server.exe fifo")
SLEEP 0.5
OPEN "\\\\.\\pipe\\out" FOR WRITING AS 1
SLEEP 0.5
OPEN "\\\\.\\pipe\\in" FOR READING AS 2
END IF
SLEEP 1
END SUB
Obrázek 13: Tentýž program, jaký je zobrazený na předchozím obrázku, jenž je spuštěný v operačním systému Microsoft Windows.
6. OpenOffice.org Basic
Jeden z dialektů programovacího jazyka BASIC je použit i ve známém aplikačním balíčku OpenOffice.org, v němž se používá pro programování maker nebo různých rozšíření jednotlivých aplikací v OpenOffice.org, například textového či tabulkového procesoru. Kromě BASICu, který se zde nazývá OpenOffice.org Basic, lze v aplikacích OpenOffice.org používat i další skriptovací jazyky, především BeanShell a JavaScript, popř. lze přes aplikační programové rozhraní využít i Python či Javu. OpenOffice.org Basic se v mnoha ohledech podobá například VBA (Visual Basic for Application) z dílny firmy Microsoft, ale i některým dalším (starším) interpretrům a překladačům Microsoftu, například QBasicu nebo QuickBasicu. Jedná se o dialekt, v němž se nepoužívají čísla řádků ani příkazy pro skok na konkrétní řádky (GOTO, ON GOTO, GOSUB, ON GOSUB); namísto toho jsou použity strukturované příkazy IF-THEN-ELSE a strukturované programové smyčky.
Obrázek 14: Dialog pro výběr, spuštění, smazání či úpravu Basicových maker zobrazený v jedné z aplikací OpenOffice.org.
V OpenOffice.org BASICu jsou samozřejmě podporovány i uživatelské funkce a procedury (subrutiny), deklarace proměnných (která může být vynucena pomocí příkazu OPTION EXPLICIT), základní typy dat (Integer, Long Integer, Float, Single, Double, Currency, String, Boolean) a v neposlední řadě i jednorozměrná a vícerozměrná pole. Poměrně zajímavé je, že maximální délka řetězců může být jen 65535 znaků, což poněkud omezuje možnosti použití BASICu například při konverzi dat z tabulkových procesorů (jedním z možných řešení je rozdělit data po jednotlivých řádcích do jednorozměrného pole). U polí je možné zadat jak jejich horní mez, tak i mez dolní, přičemž při nezadání dolní meze má první prvek index roven 0, zatímco u některých dalších dialektů BASICu je to 1.
Obrázek 15: Program napsaný v OpenOffice.org Basicu, který je editován přímo v prostředí OpenOffice.org.
Podobně jako při popisu předchozích dialektů jazyka BASIC, i zde si uvedeme alespoň krátký demonstrační příklad. V tomto příkladu si povšimněte použití lokálních proměnných, počítané smyčky FOR (kde se navíc v čase běhu aplikace zjišťuje délka pole), smyčky typu WHILE-WEND a taktéž strukturovaného příkazu IF-THEN:
Sub GetTableMetaData()
Dim iType as Long
Dim m as Integer
Dim Found as Boolean
Dim i as Integer
Dim sFieldName as String
Dim n as Integer
Dim WidthIndex as Integer
Dim oField as Object
MaxIndex = Ubound(DialogModel.lstSelFields.StringItemList())
Dim ColumnMap(MaxIndex)as Integer
FieldNames() = DialogModel.lstSelFields.StringItemList()
' Build a structure which maps the position of a selected field (within the selection) to the the column position within
' the table. So we ensure that the controls are placed in the same order the according fields are selected.
For i = 0 To Ubound(FieldNames())
sFieldName = FieldNames(i)
Found = False
n = 0
While (n< MaxIndex And (Not Found))
If (FieldNames(n) = sFieldName) Then
Found = True
ColumnMap(n) = i
End If
n = n + 1
Wend
Next i
For n = 0 to MaxIndex
sFieldname = FieldNames(n)
oField = oColumns.GetByName(sFieldName)
iType = oField.Type
FieldMetaValues(n,0) = oField.Type
FieldMetaValues(n,1) = AssignFieldLength(oField.Precision)
FieldMetaValues(n,2) = GetValueoutofList(iType, WidthList(),1, WidthIndex)
FieldMetaValues(n,3) = WidthList(WidthIndex,3)
FieldMetaValues(n,4) = oField.FormatKey
FieldMetaValues(n,5) = oField.DefaultValue
FieldMetaValues(n,6) = oField.IsCurrency
FieldMetaValues(n,7) = oField.Scale
' If oField.Description <> "" Then
'' Todo: What's wrong with this line?
' Msgbox oField.Helptext
' End If
FieldMetaValues(n,8) = oField.Description
Next
ReDim oDBShapeList(MaxIndex) as Object
ReDim oTCShapeList(MaxIndex) as Object
ReDim oDBModelList(MaxIndex) as Object
ReDim oGroupShapeList(MaxIndex) as Object
End Sub
Obrázek 16: Zdrojový kód jedné pomocné aplikace dodávané s OpenOffice.org – instalátor fontů.
7. FreeBASIC
Jedním z nejlépe podporovaných open source dialektů BASICu je s velkou pravděpodobností FreeBASIC. Syntaxe tohoto jazyka byla zvolena s ohledem na to, aby se programátoři znající QBasic nebo Quick Basic nemuseli učit nový programovací jazyk a taktéž z toho důvodu, aby bylo možné převádět postarší DOSovské aplikace psané v BASICu na modernější operační systémy. FreeBASIC obsahuje překladač, pomocí něhož lze vytvářet jak spustitelné aplikace pracující s příkazovým řádkem či grafickým uživatelským rozhraním, tak i statické či dynamické knihovny a objektové soubory (.o, .obj), které lze slinkovat například s céčkovými programy. Samotný programovací jazyk byl (i přes zachování zpětné kompatibility) rozšířen snad ve všech směrech – do jazyka je například implementován preprocesor, lze používat ukazatele na data i ukazatele na funkce, používat inline assembler, programovat multivláknové aplikace, používat pole a řetězce s maximálním rozsahem až 2 GB atd. Přímo v jazyku je zabudována grafická knihovna kompatibilní s QBasicem (právě díky ní byla portována hra Gorilly), ovšem navíc podporující práci se sprity, průhlednost atd.
Obrázek 17: Screenshot ze hry The Griffon Legend naprogramované ve FreeBASICu.
Ukázka práce s ukazateli:
TYPE Node
PreviousNode AS Node POINTER
NextNode AS Node POINTER
END TYPE
DIM CurrentNode AS Node POINTER
CurrentNode->NextNode = NULL
DIM A AS SHORT POINTER, B AS SHORT POINTER, C AS SHORT POINTER POINTER
*A = *B \ **C
Použití preprocesoru pro vytvoření maker:
#DEFINE bar(x,y) ((x) * (y)) #DEFINE foo(x,y) bar(x-y,y-x) a = foo(b, c)
Obrázek 18: Další screenshot ze hry The Griffon Legend.
Spolu s FreeBasicem je možné použít poměrně velké množství různých knihoven, z nichž ty nejznámější jsou vypsány v následující tabulce:
| Název knihovny | Stručný popis |
|---|---|
| Allegro a SDL | knihovny používané především při vývoji her (grafika, zvuky, hudba, animace) |
| BIG_INT a GMP | práce s čísly s libovolným rozsahem |
| cgi-util a fastCGI | podpora pro psaní CGI skriptů pro prakticky libovolný webový server |
| DevIL | práce s různými grafickými formáty |
| fmod | podpora pro hudební formáty, mezi jinými pro MODy, MP3, OGG vorbis atd. |
| GD | vytváření obrázků, rendering |
| GLUT | OpenGL Utility Toolkit |
| GTK+ a wx-c | podpora pro vytváření GUI |
| LibXML a Mini-XML | zpracování XML |
| MySQL | rozhraní pro známou open source relační databázi |
| PDFlib | vytváření PDF souborů |
Obrázek 19: Raytracer napsaný ve FreeBASICu.
Odkazy na stránky související s FreeBASICem:
- FreeBASIC home page
http://www.freebasic.net/ - FreeBASIC Wiki
http://www.freebasic.net/wiki/wikka.php?wakka=FBWiki - FreeBASIC Manual
http://www.freebasic.net/wiki/wikka.php?wakka=DocToc - FreeBASIC (Wikipedia CZ)
http://cs.wikipedia.org/wiki/FreeBASIC - The Griffon Legend
http://syn9.thingie.net/?table=griffonlegend
8. Komplexní vývojové prostředí Gambas
Poměrně vyspělý dialekt programovacího jazyka BASIC je použit i ve vývojovém prostředí Gambas, ovšem s ohledem na velké možnosti, které toto prostředí svým uživatelům nabízí (a také kvůli tomu, že byl několikanásobně překročen průměrný rozsah článku), se mu budeme věnovat v paralelně běžícím seriálu, v němž se zabýváme programovacími jazyky i aplikacemi určenými pro výuku programování – Jazyky pro výuku programování.
9. Odkazy na Internetu
- Basic-256 home page
http://www.basic256.org/index_en - Basic-256 Language Documentation
http://doc.basic256.org/doku.php - Basic-256 Art Gallery
http://www.basic256.org/artgallery - Basic-256 Tutorial
http://www.basic256.org/tutorials - Why BASIC?
http://www.basic256.org/whybasic - A book to teach ANYBODY how to program a computer (using BASIC)
http://www.basicbook.org/ - SdlBasic home page
http://www.sdlbasic.altervista.org/main/ - SdlBasic examples
http://nitrofurano.linuxkafe.com/sdlbasic/ - SdlBasic na Wikipedii
http://en.wikipedia.org/wiki/SdlBasic - Simple DirectMedia Layer
http://en.wikipedia.org/wiki/Simple_DirectMedia_Layer - SDLBASIC – The high-level interpreter for all?
http://openbytes.wordpress.com/2008/11/08/sdlbasic-the-high-level-interpreter-for-all/ - Yabasic home page
http://www.yabasic.de/ - Yabasic A free BASIC interpreter
http://yabasic.basicprogramming.org/ - Yabasic documentation
http://www.yabasic.de/yabasic.htm - Yabasic na Wikipedii
http://en.wikipedia.org/wiki/Yabasic - Programs Written for the YaBasic compiler/interpreter
http://web.ukonline.co.uk/mws.g/yabasic/index.html - GTK-Server
http://www.gtk-server.org/ - GTK-server na Wikipedii
http://en.wikipedia.org/wiki/GTK-server - GWBASIC User's Manual
http://www.antonis.de/qbebooks/gwbasman/index2.html - GFA-BASIC
http://sites.google.com/site/gfabasic16/ - E-mail od tvůrce GW-Basicu
http://www.classiccmp.org/pipermail/cctech/2005-April/042999.html - Mystery House
http://en.wikipedia.org/wiki/Mystery_House - Mystery House Taken Over
http://turbulence.org/Works/mystery/ - Ultima I: The First Age of Darkness
http://en.wikipedia.org/wiki/Ultima_I - The Original BASIC
http://www.truebasic.com/ - BASIC – Beginners All-purpose Symbolic Instruction Code
http://hopl.murdoch.edu.au/showlanguage.prx?exp=176 - FreeBASIC home page
http://www.freebasic.net/ - FreeBASIC Wiki
http://www.freebasic.net/wiki/wikka.php?wakka=FBWiki - FreeBASIC Manual
http://www.freebasic.net/wiki/wikka.php?wakka=DocToc - FreeBASIC (Wikipedia CZ)
http://cs.wikipedia.org/wiki/FreeBASIC - The Griffon Legend
http://syn9.thingie.net/?table=griffonlegend - QBasicJedi
http://www.freewebs.com/qbasicjedi/ - QBasic/QuickBasic Downloads
http://www.freewebs.com/qbasicjedi/qbdownloads.html - QuickBASIC (Wikipedia CZ)
http://cs.wikipedia.org/wiki/QuickBASIC - QBasic.com
http://www.qbasic.com/ - QBasic (Wikipedia)
http://cs.wikipedia.org/wiki/QBasic - Dialling with QBASIC
http://www.mysundial.ca/tsp/qbasic.html - Visual Basic .NET (česky)
http://www.vbnet.cz/ - BASIC (Wikipedia EN)
http://en.wikipedia.org/wiki/BASIC - BASIC (Wikipedia CZ)
http://cs.wikipedia.org/wiki/BASIC - Turbo BASIC (Wikipedia CZ)
http://cs.wikipedia.org/wiki/Turbo_BASIC - More BASIC Computer Games
http://www.atariarchives.org/morebasicgames/ - How to build an interpreter in Java, Part 1: The BASICs
http://www.javaworld.com/jw-05–1997/jw-05-indepth.html - Apple I
http://applemuseum.bott.org/sections/computers/a1.html - The Apple 1 history
http://apple2history.org/history/ah02.html - The Apple 2 history
http://apple2history.org/history/ah03.html - INTEGER BASIC Reference
http://www.landsnail.com/a2ref2.htm - APPLESOFT Reference
http://www.landsnail.com/a2ref.htm - Apple II Programming
http://home.swbell.net/rubywand/csa2pfaq.html - Applesoft Lite: Applesoft BASIC for the Replica-1
http://cowgod.org/replica1/applesoft/ - Simons' BASIC
http://en.wikipedia.org/wiki/Simons'_BASIC - Simon's Basic
http://www.lemon64.com/?mainurl=http%3Awww.lemon64.com/museum/list.php%3Flineoffset%3D54%26genre%3Dmanualmisc - BASIC
<a href=„http:www.c64-wiki.com/index.php/BASIC“>http://www.c64-wiki.com/index.php/BASIC - C64 Wiki: Simons Basic
http://www.c64-wiki.de/index.php/Simons_Basic - Simons' Basic (evaluation)
http://www.atarimagazines.com/creative/v9n11/60_Simons_Basic.php - Bill Gates' Personal Easter Eggs in 8 Bit BASIC http://www.pagetable.com/?p=43
- Kladivo na programy (je tam třeba popsán způsob nahrávání a ochran programů protí kopírování a crackování)
http://www.grandjihlava.cz/tmp/kladivo.pdf - Didaktik Gama návod k obsluze
http://www.grandjihlava.cz/tmp/navod.pdf - Můj přítel Didaktik Gama
http://www.grandjihlava.cz/tmp/priteldidaktik.pdf - Tip & trip pro Didaktik
http://www.grandjihlava.cz/tmp/tiptrikdidaktik.pdf - Muzeum československých mikropočítačů
http://cs-pocitace.ic.cz/ - Popis modulů a aplikací pro IQ-151
http://cs.felk.cvut.cz/~bily/iq151/ - IQ 151
http://osmi.tarbik.com/cssr/iq151.html - „Domácí počítače“ nedávné minulosti
http://www.fi.muni.cz/usr/jkucera/pv109/xkrejcir.htm - ZPA: IQ-151
http://www.homecomputer.de/pages/easteurope_cz.html#iq151 - Zrození IQ-151
http://www.iq151.net/index.htm - Stručná historie počítače IQ150/IQ151
http://www.iq151.net/history.htm - Old Computers – IQ 151
http://www.old-computers.com/MUSEUM/computer.asp?st=1&c=1045 - Wikipedia EN: IQ 151
http://en.wikipedia.org/wiki/IQ151 - Wikipedia CZ: IQ 151
http://cs.wikipedia.org/wiki/IQ151 - ZX-Spectrum Child
http://www.dotkam.com/2008/11/19/zx-spectrum-child/ - Speccy.cz
http://www.speccy.cz/ - Planet Sinclair
http://www.nvg.ntnu.no/sinclair/ - World of Spectrum
http://www.worldofspectrum.org/ - Sinclair BASIC Reference
http://www.worldofspectrum.org/faq/reference/BASICReference.htm - ZX Basic Manual
http://www.worldofspectrum.org/ZXBasicManual/ - ZX81 BASIC Programming
http://www.worldofspectrum.org/ZX81BasicProgramming/ - Sinclair BASIC History
http://scratchpad.wikia.com/wiki/Sinclair_BASIC_History - Sinclair BASIC (Wikipedia CZ)
http://cs.wikipedia.org/wiki/Sinclair_BASIC - Sinclair BASIC (Wikipedia EN)
http://en.wikipedia.org/wiki/Sinclair_BASIC - Beta BASIC (Wikipedia EN)
http://en.wikipedia.org/wiki/Beta_BASIC - Beta BASIC (Wikipedia CZ)
http://cs.wikipedia.org/wiki/Beta_BASIC - BETA BASIC NEWSLETTER No 8
http://spectrum128.ru/help/BetaBasicNewsletter8.pdf - R. T. RUSSELL: The home of BBC BASIC
http://www.rtrussell.co.uk/ - R. T. RUSSELL: A History of BBC BASIC
http://www.cix.co.uk/~rrussell/bbcbasic/history.html - SuperBASIC (Wikipedia EN)
http://en.wikipedia.org/wiki/SuperBASIC - SuperBASIC (Wikipedia CZ)
http://en.wikipedia.org/wiki/SuperBASIC - Laser Basic/Laser Compiler
http://www.sincuser.f9.co.uk/049/laser.htm - Laser BASIC (Wikipedia CZ)
http://cs.wikipedia.org/wiki/Laser_BASIC - BBC BASIC
http://www.bbcbasic.co.uk/bbcbasic.html - BBC BASIC
http://mdfs.net/Software/BBCBasic/ - BBC BASIC (Z80) for the ZX Spectrum
http://mdfs.net/Software/BBCBasic/Spectrum/ - BBC BASIC (Wikipedia CZ)
http://en.wikipedia.org/wiki/BBC_BASIC - BeebWiki – 8-bit Acorn Computer Wiky
http://beebwiki.jonripley.com/Main_Page - Porovnání osmibitů
http://porovnani8bitu.spaces.live.com/ - Rosetta Code – Main Page
http://rosettacode.org/wiki/Main_Page - Rosetta Code – Category Basic
http://rosettacode.org/wiki/Category:BASIC - Dartmouth College Computation Center. 1964.-The original Dartmouth BASIC manual
http://www.bitsavers.org/pdf/dartmouth/BASIC_Oct64.pdf