home *** CD-ROM | disk | FTP | other *** search
/ RUN Flagazine: Run 11 / run11.zip / LES11GWB.ASC < prev    next >
Text File  |  1994-01-18  |  22KB  |  280 lines

  1.                             GW/QBasic Les 11                            
  2.                                 Compilers                               
  3.  
  4. Iedereen die deze vervolgcursus op de voet en actief heeft gevolgd, kan
  5. nu programmeren in GWBasic. Tijdens het verloop van deze lessen is de
  6. opvolger van GWBasic boven de horizon verschenen: QBasic. Microsoft
  7. levert QBasic standaard mee met DOS 5.0 en hoger. Het verschil tussen
  8. beide Basic-talen is heel groot en tegelijk ook heel klein.
  9.  
  10. U herinnert zich waarschijnlijk de eerste lessen waarin is uitgelegd dat
  11. GWBasic een interpreter is. Een interpreter is een programma dat
  12. ingevoerde programeeropdrachten in min of meer gewone (Engelse) taal
  13. vertaalt naar de machinetaal van nullen en enen die de processor (de
  14. machine) verstaat.
  15. Bij GWBasic vindt deze vertaalslag TIJDENS de run of programma-uitvoe-  
  16. ring plaats.
  17. Het nadeel van deze werkwijze is dat een geïnterpreteerd programma traag
  18. is. De interpreter verdoet de meeste tijd met uit te zoeken WAT hij moet
  19. doen in plaats van het ook daadwerkelijk te doen.
  20. Nog een nadeel van een GWBasic-programma is dat andere gebruikers het-
  21. zelfde interpreter-programma (GWBASIC.EXE of BASICA.EXE) èn de source-
  22. of de broncode (het .BAS programma) nodig hebben om de toepassing te
  23. kunnen gebruiken.
  24.  
  25. Het verschil                                                            
  26.  
  27. Een compiler werkt heel anders. Alle programeertalen als Algol, ADA,
  28. C++, Pascal, Lisp, Prolog en natuurlijk ook Basic hebben compilers (en
  29. soms ook interpreters). Compilers zijn ook vertaalprogramma's maar ze
  30. doen hun werk niet tijdens de run maar van tevoren. De programmeur
  31. schrijft, test en debugt zijn programma eerst in samenwerking met de
  32. compiler of de interpreter. Als hij daarmee klaar is laat hij zijn
  33. broncode definitief compileren naar machinecode. Het eindresultaat is
  34. dan een .EXE programma dat de gebruiker direct vanaf de DOS-prompt kan
  35. activeren. Als zodanig loopt een gecompileerd Basic-programma vele malen
  36. sneller dan geïnterpreteerde broncode. Bovendien blijft de bron of
  37. source een zaak van de programmeur en is dus niet voor jan en alleman
  38. toegankelijk.
  39.  
  40. QBasic                                                                  
  41.  
  42. Microsoft prijst QBasic aan als een compiler. Dit is helaas niet meer   
  43. dan de helft van de waarheid. Eerlijker zou het zijn als QBasic een
  44. semi-compiler werd genoemd want dat is het ook.
  45. QBasic accepteert Basic-taal in twee versies: 'ouderwets' GWBasic met
  46. regelnummers en Basic-nieuwe-stijl: gestructureerde programmablokken
  47. zonder regelnummers (en... bij voorkeur zonder GOTO's!).
  48. Het onderstaande stukje GWBasic kan iedere cursist lezen:
  49.  
  50. 100 REM                                                                 
  51. 110 INPUT "Geef een getal kleiner dan 100";A                            
  52. 111 IF A>=100 THEN BEEP:GOTO 110                                        
  53. 120 CLS:KEY OFF                                                         
  54. 130 FOR I=1 TO A                                                        
  55. 140 PRINT I*A;                                                          
  56. 160 NEXT I                                                              
  57. 170 END                                                                 
  58.  
  59. In een moderne (op Pascal geïnspireerd) compiler-Basic als TurboBasic,
  60. QuickBasic of PowerBasic ziet hetzelfde programmaatje er heel anders
  61. uit:
  62. ┌──────────────────────────────────────────────────────────────────────┐
  63.                                                                       
  64.                 CLS                                                   
  65.                 DEFINT A                                              
  66.                WHILE B = 0:     ' B is de testcase                   
  67.                  PRINT  "Geef een postief getal < 100"               
  68.                  INPUT A                                             
  69.                 SELECT CASE A                                       
  70.                   CASE 1 TO 99                                      
  71.                   B=A:         'B wordt A en daarmee < 100          
  72.                 EXIT SELECT                                         
  73.                   CASE ELSE                                         
  74.                   B=0          'B is <> 1 - 99                      
  75.                   BEEP                                              
  76.                 END SELECT                                          
  77.                WEND                                                  
  78.                                                                       
  79.                 CLS                                                   
  80.               ┌ DO UNTIL I=A                                          
  81.               │   INCR I                                              
  82.               │   PRINT I*A;                                          
  83.               └ LOOP                                                  
  84.                 END                                                   
  85.                                                                       
  86. └──────────────────────────────────────────────────────────────────────┘
  87.  
  88. Over op QBasic?                                                         
  89.  
  90. Er zijn veel Basic-programmeurs die Qbasic wel hebben maar de 'nieuwe
  91. taal' links laten liggen. Ze gaan gewoon door met GWBasic. Zijn ze tegen
  92. het aanleren van gestructureerd en regelnummerloos programmeren?
  93. Nee, ze kijken QBasic niet aan omdat deze taal in feite vlees noch vis
  94. is. QBasic is niet meer dan een uitgeklede QuickBasic compiler. QBasic
  95. wordt door Microsoft weggegeven als smaakmakertje voor de echte compi-
  96. ler. Zodoende hebben de concurrerende Basic-compilers TurboBasic en
  97. PowerBasic minder kans.
  98. Wat is dan het verschil tussen QBasic een QuickBasic? Met QBasic kun je
  99. prachtige, regelnummerloze broncode schrijven, editen, debuggen, uit-
  100. breiden, RUNnen en op schijf opslaan. GeRUNned lopen deze programma's
  101. meestal merkbaar sneller dan hun equivalenten in GWBasic.
  102. Alleen... en nu komt de grote maar... je kunt QBasic-broncode alleen
  103. maar compileren naar het geheugen. Dat wil zeggen dat je er geen EXE-be-
  104. standen van kunt maken. Wie dat wil (en wie wil dat niet?) moet de
  105. QUICK-Basic-compiler van Microsoft kopen voor enkele honderden guldens.
  106.  
  107.    QBasic wordt aangeprezen als het 'snelle alternatief' voor GWBasic.  
  108.    Maar... is QBasic wel zo snel? Op deze distributiediskette vindt u   
  109.    het Basic-programma QBOFGW.BAS. Het laat het bord van Galton zien    
  110.    en is geprogrammeerd door F.M. Kragten.                              
  111.    In de praktijk blijkt dat GWBasic dit programma VEEL SNELLER draait  
  112.    dan QBasic.                                                          
  113.    Als u over GWBASIC.EXE en QBASIC.EXE beschikt kunt u het zelf verge- 
  114.    lijken. Waarschijnlijk laat u QBasic dan voortaan ook links liggen!  
  115.  
  116. Echte compilers                                                         
  117.  
  118. Wie GWBasic ontgroeit, is rijp voor een compiler. Welke? QuickBasic
  119. (QB), TurboBasic (TB), PowerBasic (PB) of VisualBasic (VB)? Een kort    
  120. overzicht van deze verschillende produkten:
  121. QB is een veelzijdig en goed onderhouden compiler. Er zijn al verschei-
  122. dene versies van uitgebracht. 
  123. TB is een bekend alternatief voor QB. De meeste EXE-programma's van TB
  124. 1.1 zijn sneller dan die van QB. Alle RUN Flagazines tot en met nr. 9
  125. zijn met TB geprogrammeerd.
  126. PB is de voortzetting van TB. Beide zijn van verschillende uitgevers
  127. maar van dezelfde maker: Bob Zale. De nieuwste versies 3.x van PB zijn
  128. aanzienlijk veelzijdiger dan TB en QB. PB is een werkomgeving voor de
  129. ervaren hobbyist en de (semi) professional.
  130. VB is de grafische programeeromgeving van Microsoft voor Windows-toepas-
  131. singen. De taal is nieuw en heeft nog slechts een vage verwantschap met
  132. Basic.
  133.  
  134.                                 ╔═════╗                                 
  135. ╔═══════════════════════════════╣ TIP ╠═════════════════════════════╗   
  136. ║                               ╚═════╝                             ║   
  137. ║ Wilt u vrijblijvend kennismaken met de nieuwe PowerBasic-compiler?   
  138.  Dat kan op twee manieren:                                            
  139.  1. Download uit TeleRUN het programma: TRYPB3.ARJ                    
  140.     en download tegelijk LOADER32.ARJ                                 
  141.  2. Als u geen modem heeft vraag deze programma's dan aan via de      
  142.     RUN LezersService (zie elders in dit Flagazine).                  
  143.                                                                       
  144.  TRYPB3.ARJ bevat de volledige PB-compiler maar is in zoverre be-     
  145.  perkt dat u niet naar schijf kunt schrijven of vanaf schijf kunt     
  146.  lezen.                                                               
  147.  Daar hebben we LOADER32.ARJ op gevonden: een hulpprogramma dat,      
  148.  zij het nogal traag toch Basic-broncode van schijf in de werkom-     
  149.  geving van PB kan halen.                                             
  150. ╠═══════════════════════════════════════════════════════════════════╣   
  151.  PB bevat een zeer uitgebreide Help-functie waardoor u zonder hand-   
  152.  leiding toch de geheimen van deze proefcompiler kunt doordringen.    
  153. ╚═══════════════════════════════════════════════════════════════════╝   
  154.  
  155. Anders programmeren                                                     
  156.  
  157. Elke compiler, ook QBasic, heeft een editor of tekstverwerker voor het
  158. schrijven, aanpassen en uibreiden van de broncode. Deze editors zijn
  159. veel handiger in het gebruik dan de primitieve line editor van GWBasic.
  160. De geschreven broncode kan direct worden gecompileerd in het geheugen en
  161. onmiddellijk worden gecorrigeerd bij overmijdelijk opduikende bugs. Een
  162. bijkomend voordeel van de compiler is dat in screen 12 (VGA) kan worden
  163. gewerkt; GWBasic reikt niet verder dan screen 9 (EGA).
  164. PB is bovendien nog uitgerust met een Integrated Debugger waarmee moei-
  165. lijk te vinden fouten beter en sneller kunnen worden opgespoord.
  166. Het is toegestaan 'op z'n GWBasics', dus met regelnummers te programme-
  167. ren maar dat is niet de bedoeling en ook niet wenselijk.
  168. In feite is de probleembenadering ook anders. De meeste GWBasic-program-
  169. meurs hebben al:
  170.  
  171. 100 CLS:KEY OFF:DEFINT A-Z                                              
  172.  
  173. getypt als ze nog niet of maar half weten wat ze van plan zijn. In de
  174. compileromgeving is de aanpak gestructureerd. Dat wil zeggen dat het
  175. probleem in stukken of modules wordt opgedeeld. Het probleem is in feite
  176. al opgelost in de fase van de probleemstelling/analyse. Het coderen/de-
  177. buggen is eigenlijk bijzaak.
  178. Gestructureerd programmeren betekent dan veel wordt gewerkt met sub-
  179. routines en functies die vanuit een hoofdmodule worden aangeroepen.
  180. U kent de subroutine uit vorige lessen en in de compiler-omgeving mogen
  181. ze ook worden gebruikt. Toch zal de ervaren programmeur in plaats van
  182. subroutines SUBPROGRAMMA'S of kortweg 'Subs' gebruiken. Het verschil
  183. tussen die twee is belangrijk.
  184. Bij een subroutine worden variabelen gebruikt die door het hele program-
  185. ma hun waarden behouden en daardoor menig debuggend programmeur voor
  186. raadsels heeft geplaatst. Een Sub daarentegen is een geisoleerd program-
  187. ma in het hoofdprogramma. De variabelen daarin kunnen dezelde namen
  188. hebben als in het hoofdprogramma maar ze laten elkaar onaangetast. Voor-
  189. beeld:
  190. ┌─────────────────────────────────┐    In dit voorbeeld wordt eerst het 
  191. │  CLS                                scherm gewist en de RANDOMIZER   
  192.   RANDOMIZE TIMER                    op de timer ingesteld.           
  193.                                      Dan volgt een SUB met een loop.  
  194.   SUB SchoonScherm                   Deze SUB wordt afgesloten met    
  195.   FOR A%=1 TO 25                     END SUB.                         
  196.     LOCATE A%,1                      Als dit programma wordt gestart  
  197.     PRINT SPACE$(80);                worden CLS en RANDOMIZE TIMER    
  198.   NEXT A%                            uitgevoerd maar de SUB wordt     
  199.   END SUB                            overgeslagen. SUB's mogen overal 
  200.                                      in het programma staan zonder    
  201.   WHILE C%<10000                     dat hun integriteit kan worden   
  202.     A%=RND*24+1                      aangetast.                       
  203.     B%=RND*79+1                      Dan begint het programma en      
  204.     INCR C%                          springt in de WHILE/WEND-loop.   
  205.     LOCATE A%,B%                     Daar zit een IF/THEN in die kijkt
  206.     PRINT CHR$(219);                 of op de Esc-toets wordt gedrukt.
  207.     IF INKEY$=CHR$(27) THEN          Als dat zo is wordt met CALL de  
  208.       CALL SchoonScherm              het SUBprogramma met de naam:    
  209.       C%=0                           SchoonScherm aangeroepen en uit- 
  210.     END IF                           gevoerd. Na uitvoering keert de  
  211.   WEND                               afwerking (net als bij de SUBROU-
  212.   END                                tine) terug na het aanroeppunt.  
  213.                                      Daar wordt C% op nul gezet en de 
  214. └─────────────────────────────────┘    WHILE/WEND gaat vrolijk verder.  
  215. Als u over QBasic, QB, TB, PB of TRYPB beschikt kunt u dit programmaatje
  216. overnemen om te zien wat het doet.
  217.  
  218. Het nut van QBasic                                                      
  219.  
  220. QBasic komt er hier niet zo best vanaf maar toch kan dit programma van
  221. groot nut zijn als u afscheid wilt nemen van GWBasic en regelnummerloos
  222. en gestructureerd (GOTO-loos) wilt leren programmeren.
  223. Er zijn genoeg boeken over dit onderwerp geschreven die u daarbij de weg
  224. wijzen. Tegen de tijd dat u de grote voordelen van gestructureerd pro-
  225. grammeren ontdekt en er wat bedreven in wordt, kunt u een echte Basic-
  226. compiler aanschaffen: Quick, Turbo of Power.
  227. Het voordeel van gestructureerd programmeren is dat u geen spaghetti-
  228. programma's meer zult maken. U weet dat wanneer een GWBasic-programma
  229. een complexe opbouw krijgt, u door uw eigen bomen het bos niet meer kunt
  230. zien. Dat zal verleden tijd zijn bij netjes en gestructureerd programme-
  231. ren. U zou dan ook over professionele toepassingen kunnen nadenken.
  232. Een ander groot voordeel (vooral van Power) is dat uw gereedschapskist
  233. wordt uitgebreid met gereedschappen die u tot nu toe nooit hebt gekend.
  234. In de voorbeelden zag u er al enkele:
  235.  
  236. SELECT CASE                                                             
  237. DO .... LOOP UNTIL                                                      
  238. DO .... LOOP WHILE                                                      
  239. SUB .... END SUB                                                        
  240.  
  241. en zo zijn er nog veel meer.
  242. U vindt ze in vrijwel elke Basic-compiler. De een heeft wat meer dan de
  243. ander maar waar het op aankomt is uiteindelijk de snelheid en de veel-
  244. zijdigheid. Wat dat betreft gaat mijn persoonlijke voorkeur naar PB 3.x.
  245. hoewel ik QuickBasic zeker niet wil kleineren.
  246. Jammer is alleen dat er tussen Quick en Power nogal wat incompatibili-
  247. teiten bestaan. Het is vaak een heel gedoe om een mooi programma in
  248. Quick voor RUN Flagazine te moeten aanpassen naar Power.
  249.  
  250.                                   ┌─────┐                               
  251. ┌─────────────────────────────────┤ TIP ├──────────────────────────────┐
  252. │                                 └─────┘                              │
  253. │  Nog een tip. Om een idee te krijgen van de snelheidsverschillen tus-
  254.   sen GWBasic, QBasic, QuickBasic, TurboBasic en PowerBasic staat in  
  255.   TeleRUN het programma: VLGPOWER.ARJ.                                
  256.   Hierin wordt in grafieken het verschil in snelheid aangegeven, geba-
  257.   seerd op het GWBasic-programma PENTOMINO.BAS: de schuifpuzzel die   
  258.   zowel op het scherm als rekenend zeer intensief bezig is.           
  259. └──────────────────────────────────────────────────────────────────────┘
  260.                                                                         
  261. Er zijn nog meer voordelen. Met een compiler kunt u stukken broncode
  262. apart zetten op schijf en met INCLUDE in het compileerproces betrekken.
  263. Zo kunt u zelf uw eigen library van handige routines aanleggen. PB werkt
  264. nu ook met UNITS die ook in een library worden ondergebracht en waarin
  265. gecompileerd programmadelen staan die met het hoofdprogramma kunnen wor-
  266. den geLINKt.
  267.  
  268. Na dit uitstapje naar Basic-compilers gaan we in de volgende les weer
  269. hands-on aan het werk en behandelen we onder andere de zelfgemaakte
  270. functies die met DEF FN worden aangemaakt en met FN worden aangeroepen.
  271.  
  272.  
  273.  
  274.  
  275.  
  276.  
  277.  
  278.                                                                         
  279.  
  280.