PET 700 KOMPILATOR Innehåll Sid 1. Introduktion. 1 1.1 Tillgängliga versioner. 1 1.2 Handbokens syfte. 1 1.3 Använding av handboken. 2 1.4 De största fördelarna med PET 700 KOMPILATOR. 2 2. Installation. 4 2.1 Programpaketets innehåll. 4 2.2 Kompilatornyckeln. 4 2.3 Säkerhetskopiering. 4 3. Huvuddragen hos PET 700 KOMPILATOR 5 3.1 Behov. 5 3.2 Kompileringsprocessen. 5 3.3 Run-time biblioteket. 6 3.4 Kombinera Basic och maskinkod. 6 3.5 Utvidgad Basic. 7 3.6 Tillgängliga kommandon. 7 4. Användning av PET 700 KOMPILATOR. 8 4.1 Programstart. 8 4.2 Kompilerings alternativ. 8 4.3 Kontrolltangenter. 9 4.4 Kompilering. 9 4.5 Kompileringsstatistik. 10 4.6 Avslutningsalternativ. 10 4.7 Använding av kompilerade program. 11 4.8 Kopiering av kompilerade program. 11 4.9 Användningsfinesser. 11 4.10 Felhantering. 13 5. Att utnyttja PET 700 KOMPILATOR's möjligheter. 14 5.1 Hur man uppnår maximal exekveringstid. 14 5.2 Förbättrad programuppläggning. 15 6. Kompilatorinstruktioner. 16 6.1 Instruktionslista. 16 6.2 Heltalsomvandling 16 6.3 Speciella heltalsoperationer. 18 6.4 Bortkoppling av stopptangenten. 18 6.5 Hur varningsmeddelanden undvikes. 19 7. Programlänkning. 20 7.1 Länkning utan gemensamma variabler. 20 7.2 Länkning med gemensamma variabler. 20 8. Information för kombination av maskinkod med Basic. 22 8.1 Hur variabler, vektorer och fält representeras. 22 8.2 Minnesanvändning. 23 8.3 Basicutökningar som hanteras av kompilatorn. 23 9. Felhantering. 24 9.1 Pass 1 fel. 24 9.2 Pass 2 fel. 24 9.3 Run-time fel. 25 9.4 Varningar. 26 Bilagor. 27 A. Vad är en kompilator? 27 B. Felsökningskoder. 29 C. Tips frän användare 30 PET 700 KOMPILATOR -- KAPITEL 1 1. Introduktion. PET 700 KOMPILATOR är en Basic kompilator för CBM 700's olika persondatorer. Kompilatorns funktion är att omvandla ett program från sin ursprungliga form (d.v.s den form som den är skriven på) till en mer effektiv form, som kan "köras" mycket snabbare än originalet. PET 700 KOMPILATOR har blivit speciellt utvecklad för CBM 700. Förutom att den gör varje Basic program mycket snabbare så medför den även att programmen blir avsevärt mindre; med undantag av mycket små program. PET 700 KOMPILATOR är fullständigt kompatibel med Extended Basic 4.0 språket, använd på CBM 700 datorer, d.v.s den stödjer alla huvuddrag i språket (förutom de som har att göra med felsökning). Detta betyder att ett existerande Basicprogram kan kompileras, utan förändring, till ett program med samma egenskaper, som ändå är mycket snabbare och kräver mindre minneskapacitet och diskettutrymme än originalet. PET 700 KOMPILATOR är utvecklad så att den kan användas av människor utan programmeringskunskaper. Därtill är den utrustad med en mängd hjälpmedel, avsedda för mer erfarna användare som vill utnyttja CBM 700's fulla potential. Anmärkning: En mer detaljerad beskrivning av skillnader mellan en kompilator och en interpretator finns i bilaga A. 1.1 Tillgängliga versioner. För CBM 700 modellerna finns det 2 versioner: PET 700 KOMPILATOR v128 för 128k maskiner PET 700 KOMPILATOR v256 för 256k maskiner Program som är kompilerade på en version kan enbart användas på maskiner med korrekt minnesstorlek, så kan t.ex ett program kompilerat med v128 enbart köras på 128k maskiner. 1.2 Handbokens syfte. Denna handbok beskriver användning och drift av PET 700 KOMPILATOR. Vitsen är inte att lära ut Basic programmering eller att definiera Basic-språket. Användaren förutsätts behärska denna typ av programmering eller översätta redan färdigskrivna program med hjälp av kompilatorn. 1.3 Användning av handboken. Före utnyttjandet av kompilatorn bör användaren läsa kapitel 2,3 och 4 (dessa täcker installation, huvuddrag och användning). Är programmet som skall kompileras ensamt och enbart skrivet i standard Basic, d.v.s saknar maskinkodsdelar och inte länkat till andra programdelar, kan de följande kapitlen lämnas tillsvidare. Om två eller fler program är länkade till varandra bör kapitel 7 läsas före kompilering. Vidare gäller att om Basic-utökning, maskinkod eller på programkassett (s.k cartridge) baserade produkter är inblandade, måste kapitel 8 läsas. Kapitel 5 förklarar hur man optimalt utnyttjar PET 700 KOMPILATOR's möjligheter. Det är viktigt att man förstår att även om man kan vinna mycket i hastighet p& att kompilera ett program i vilken form det hava månde, så kan ännu mera vinnas genom vissa enkla omskrivningar av ursprungsprogrammet. Ofta innebär denna förändring endast av ett enkelt tillägg av ett kompilatorkommando i början av programmet. Skälen till detta finner du i kapitel 5 och 6, där också de speciella kommandona finns beskrivna. Med ett kompilatorkommando menar man en instruktion till kompilatorn som lagrats inom ursprungsprogrammet. Uppstår några fel under kompileringen eller under "körning" av kompilerade program, se kapitel 9. 1.4 De största fördelarna med PET 700 KOMPILATOR. * Kompilerade program kan under ideala förhållanden köras upp till 55 gånger snabbare - den normala hastighetsökningen ligger ungefär mellan 8-20 gånger snabbare. * Kompilerade program är till storleken ungefär 50 till 80 procent av ursprungsprogrammet. * Kompilerade program kan inte listas eller förändras. * Kompilatorn är helt kompatibel med alla de uttryck som CBM 700 Basic innehåller. Därmed förstås att ett Basicprogram kan kompileras utan någon omskrivning (med undantag för sådana satser som har att göra med felsökning). * Kompilatorn är utrustad med verklig heltalsaritmetik likväl som flyttalsaritmetik. * Det kompilerade programmet låter sig förenas med redan existerande maskinkoder inom ursprungsprogrammet, d.v.s kompileringen påverkar inte de maskinkodsavsnitt som utnyttjas av Basicprogrammet utan inlämmar dessa oförändrade i slutprodukten. * Kompilatorn kan kompilera program omfattande Basicutvidgningar; d.v.s där tilläggskommandon i Basic tillförts genom maskinkodsrutiner i ROM eller RAM. PET 700 KOMPILATOR -- KAPITEL 2 2. Installation. 2.1 Programpaketets innehåll. Din kopia av PET 700 KOMPILATOR skall bestå utav: - en programskiva - denna handbok - en kompilatornyckel 2.2 Kompilatornyckeln. Kompilatornyckeln är utvecklad för att skydda upphovsmannens copyright. Detta betyder att kompilatorn enbart fungerar om rätt nyckel är isatt i kassettportuttaget. Kompilatornyckeln som medföljer programpaketet måste sättas på plats uppåtvänd i kassettporten innan programmet kan startas. Uttaget är märkt "kassettport". Är nyckeln inte i eller felvänd och programskivan har startat, kommer bildskärmen åter att visa det ursprungliga meddelande du såg då du slog på strömmen. Kompilatornyckeln behövs inte till färdigkompilerade program, om du inte särskilt angivit detta (som skydd för dina program) under kompileringsprocessen. 2.3 Säkerhetskopiering. Innan du använder kompilatorn för första gången är det nödvändigt att göra åtminstone 2 kopior. Detta som en säkerhetsåtgärd ifall din programskiva av någon anledning skulle bli förstörd. För att göra en säkerhetskopiering, placera programskivan i fack 0 (den högra slitsen) och ny flexskiva i fack 1 (vänster slits) på skivminnet. Skriv följande kommando: BACKUP D0 TO D1 PET 700 KOMPILATOR -- KAPITEL 3 3. Huvuddragen hos PET 700 KOMPILATOR. 3.1 Behov. PET 700 KOMPILATOR kräver en CBM 700 maskin med rätt minneskapacitet och ett skivminne. Alla sorters skivminnen kan användas. Kompilatorn kan behöva en skrivare men en det är inte nödvändigt. Varken kompilator eller de kompilerade programmen utnyttjar en ROM-programkassett (cartridge) för att användaren skall få möjlighet att själv utnyttja kassettmjukvara ihop med sina kompilerade program. 3.2 Kompileringsprocessen. Kompilatorn bör ses som ett kompliment till datorns Basictolk (interpretatorn). Därmed menas att programmen först på ett bekvämt sätt kan utvecklas och felsökas med tolkens hjälp, för att till sist i fungerande skick kompileras så att de ger maximal hastighet och minimal programstorlek. Det är vanligt att innan kompilering kontrollera att programmet fungerar på interpretatorn. PET 700 KOMPILATOR gör noggranna felkontrolleringar både under kompileringsprocessen (d.v.s när programmet kompileras) och under körtiden (d.v.s när det kompilerade programmet "körs") men det är bekvämare att felsöka och korrigera fel medan progammet körs med tolken än i kompilerat skick. Kompilatorprocessen omfattar: - Laddning och igångkörning av kompilatorn; - Meddela kompilatorn namnet på källfilen; d.v.s den fil som innehåller programmet som skall kompileras; - Meddela kompilatorn namnet på objektfilen; d.v.s. filen som skall skapas av kompilatorn för det kompilerade programmet; - Kompileringen är en tvåstegsprocess; i det första skedet läses källfilen en rad i taget och en halvkompilerad version av programmet skrivs in i en arbetsfil. Under det andra skedet läses arbetsfilen, ytterligare information adderas och objektfilen (d.v.s det kompilerade programmet) skapas. Dessutom skapas variabellistan som sparas i en fil benämd VL-namn (där "namn" står för det kompilerade programmet). När kompileringen är genomförd utplånas arbetsfilen. Objektfilen kan sedan laddas och "köras". Man kan också forsätta att kompilera ytterligare program. Observera i.o.m att programmet aldrig i sin helhet sparas i datorns internminne, så finns det ingen gräns för hur stora program som kan kompileras. Alla de program som kan köras med hjälp av interpretatorn, t.o.m sådana som är för stora för att normalt rymmas okompilerade, är möjliga att kompilera. Vid behov kan kompilatorn producera en programlista och/eller en rapport av eventuella hittade fel. Utöver det kompilerade programmet producerar kompilatorn en fil LN-namn (där "namn" är namnet på det kompilerade programmet). Denna fil och LN (är en förkortning av line number) behövs inte för körningen av det kompilerade programmet utan är enbart avsedd att underlätta felsökning om program drabbas av fel under exekveringstiden. 3.3 "Run-time" biblioteket. Run-time biblioteket (fil RTL-128 på v128 och RTL-256 på v256) är en grupp av maskinkodrutiner som måste samexistera med programmet i minnet när detta skall köras efter kompilering. Det är inte nödvändigt för användaren att ladda denna fil eftersom varje gång som ett kompilerat program körs så kontrollerar detta först att run-time biblioteket finns med. Skulle så inte vara fallet, kommer programmet automatiskt att ladda denna fil. Detta kräver dock att den skiva varifrån det kompilerade programmet först laddas också måste innehålla en kopia av run-time biblioteket. Run-time biblioteket är litet över 8K i storlek och lagras i minnestoppen på programmet (bank 1 är den minnesbank som innehåller programmet). 3.4 Kombinera Basic och maskinkod. Många Basicprogram använder sig av maskinkodssubrutiner för att kunna genomföra saker som är svåra eller ogenomförbara att uttryckas i Basic. Med de stora möjligheter till förbättring som PET 700 KOMPILATOR ger, är det möjligt att ersätta många maskinkodrutiner med Basic-kod. Hur som helst, det kommer alltid att uppträda situationer där det är önskvärt med maskinkoder. PET 700 KOMPILATOR har därför utvecklats så att den i det stora flertalet maskinkodsfall, efter kompilering, tillåter dessa att fortsätta fungera med det ursprungliga Basicprogrammet, utan att många förändringar behöver vidtas. Detta är möjligt genom att kompilatorn bevarar det ursprungliga formatet för "zero page", variabellistorna, indexerade variabellistor och stränglagring etc. Detta betyder att maskinkod, som t.ex, söker igenom variabellistan för en särskild variabel eller sorterar en indexerad strängvariabel, fortfarande kommer att fungera med ett program kompilerat av PET 700 KOMPILATOR. Ytterligare detaljer ges i kapitel 8. 3.5 Utvidgad Basic. Ett mycket användbart drag hos CBM maskinerna är möjligheten till att kunna addera ytterligare egenskaper till Basic genom maskinkodsrutiner antingen i RAM eller i ROM (t.ex ROM i en plugg-in cartridge). PET 700 KOMPILATOR har egenskaper som möjliggör att program som använder sig av sådana utökningar kan kompileras och köras framgångsrikt även ifall kompilatorn inte känner till detaljerna i utvidgningen. Detta betyder att programmerare är fria till att använda Basic-utvidgning och trots detta erhålla alla kompilatorns fördelar. Detta möjliggörs av att kompilatorn vid syntaxkontrollen för en sats inte omedelbart slår larm om första tecknet i satsen är obekant. D.v.s att ordet inte utgör ett tillåtet, reserverat ord eller variabelnamn. Kompilatorn antar istället att uttrycket är giltigt i egenskap av en Basicutvidgning. Kompilatorn lagrar den utökade radens text i det kompilerade programmet, exakt i den form det förekommer i källprogrammet. Den inleder texten med en special kod som följs av ett SYS-anrop till run-time biblioteket. När programmet körs och run-time biblioteket avläser special koden, riktar den zeropage-pekarna mot den utökade raden och kopplar in interpretatorn som bearbetar texten. Interpretatorn bearbetar raden som om den fanns i ett normalt program och åberopar den extra maskinkoden för att genomföra uppgiften. När maskinkodsrutinen återvänder till interpretatorn utförs SYS-anropet och den återgår till run-time biblioteket. Processen kan fungera därför att maskinkoden hittar variabel och indexerade variabler, listor etc. exakt som den förväntar sig. Se kapitel 8 för vidare information om hur utvidgningar (och SYS-anrop med parametrar) hanteras. 3.6 Tillgängliga kommandon. Alla kommandon till Extended Basic 4.0 är tillgängliga, förutom de som relaterar till felsökning. Detta betyder att kommandon som TRAP, DISPOSE och RESUME och specialvariablerna ER och EL inte är tillgängliga. PET 700 KOMPILATOR -- KAPITEL 4 4. Användning av PET 700 KOMPILATOR. 4.1 Programstart. Försäkra dig först om att kompilatornyckeln sitter på plats i kassettuttaget. Placera kompilatorskivan i fack 0 och skivan som innehåller programmet som skall bli kompilerat i fack 1. Observera att ingen av skivorna skall vara skrivskyddad. Används ett enkelt skivminne (t.ex en hårddisk av typen Winchesterminne) så kopiera alla filerna från kompilatorskivan till skivan med kompileringsmaterialet. Ladda och kär programmet "PET KOMPILATOR": Tryck 4.2 Kompilerings alternativ. Kompilatorn kommer att visa följande lista av val source file ? : (källfilen) object file ? : (objektfilen) print source ? : n (utskrift av källfil) print errors ? : n (utskrift av fel) print slats ? : n (utskrift av statistik) run identity ? : (listrubriker) Plus en grupp kommandon valda av funktionstangenterna. Varje fält som blivit inskrivet skall avslutas med eller (funktionstangent 1). Skriv namnet på källfilen. Skriv namnet på objektfilen. Önskas ingen utskrift startas kompileringen med . Önskas utskrift så ändra de utskrivna "n" (no) till (yes). Vid val av "utskrift av källfil", kommer hela programmet att skrivas ut under kompileringen. Har man valt "utskrift av fel", skrivs även eventuella felmeddelanden ut. Vid val av "utskrift av statistik" kommer statistik, rörande de relativa storlekarna av käll- och objektfiler, att skrivas ut vid slutet av kompileringen. Har någon utskriftsform valts kommer innehållet i "listrubriker" att skrivas ut i början på listan som en identifikation, det kan t.ex vara bekvämt att skriva in datum eller tid etc. för att vid flertal utskrifter av samma program hålla reda på ordningen. Listrubrikfältet kan lämnas blankt ifall så önskas. I slutet på förberedelsevalen ingår också möjligheten att skydda sina kompilerade program genom att ange användning av kompilatornyckel vid programkörningen. Du kan därvid i aktuell position skriva annars ett , som anger att programmet kan köras oskyddat. 4.3 Funktionstangenter. används för att gå vidare från ett val till ett annat. När det inte finns några fler valmöjligheter och tangenten trycks ned kommer kompileringen att starta. Alternativt så snart som både käll- och objektfil fått namn kan användas för att starta en omedelbar kompilering. Kan användaren inte komma ihåg namnet på källfilen så använd för en visuell utskrift av alla programfiler på skivan. avslutar och omstartar valdelen, för ändring av eventuella felsvar. Om programmet som skall bli kompilerat finns på en annan skiva kan användas för att tillåta att skivan byts utan omladdning av kompilatorn. avbryt utan att kompilera. 4.4 Kompilering. När kompileringen har startat och i fall någon utskrift skall ske, kontrollerar kompilatorn att skrivaren är klar. Är den inte det kommer meddelandet **** FIX PRINTER **** att flimra upp på skärmen. Användaren kan antingen välja skrivaren eller trycka på mellanslagstangenten för att fortsätta utan utskrift. I skärmen kan man under kompilering se numret på den rad som bearbetas. Upptäcker kompilatorn några fel i källprogrammet kommer ett felmeddelande att visas antingen i skärmen eller på skrivaren. Upptäcks en mängd fel och skärmen blir full av felmeddelanden, kommer kompileringen tillfälligt avstanna, så att de rader som är fel kan observeras innan kompileringen fortsätter. Likaväl som felmeddelanden kan varningsmeddelanden visas. Dessa uppstår när kompilatorn tror sig ha funnit ett utvidgning av Basic men kan ha funnit ett syntaxfel istället. Anledningen till detta förklaras i sektion 9.4. Vid slutet av kompileringen räknas antalet fel och varningsmeddelanden samman för att tillsammans med kompileringsstatistiken skrivas ut i skärmen. 4.5 Kompileringsstatistik Kompilerings statistiken producerad vid slutet av kompileringen ger storleken av: - källprogrammet - objektprogrammet - VL-filen (filen som innehåller variabellistan) Storlekarna ges i termer av antal bytes, antal block och antal bytes i det senaste blocket (ett block är 256 bytes), t.ex SOURCE PROGRAM SIZE - 4253 (16,157) d.v.s 4253 bytes är det samma som 16 block plus 157 bytes (vilket kräver ett skivutrymme av 17 block). Programstorlekarna visar mängden av upptaget minne när programmet "körs". De två storlekarna kan jämföras för att ge ett begrepp om vilken storleksreduktion som uppnåtts. 4.6 Avslutnings alternativ. Upptäcks några fel under kompileringen så skapas inte objektfilen och källfilen måste redigeras för rättningen av felen innan den kan kompileras. Finns det inga fel har användaren tre möjligheter - tryck för att kompilera ett annat progra; - tryck för att ladda och "köra" programmet som blivit färdigkompilerat; - trycka vilken annan tangent som helst för att avsluta kompileringsprocessen. 4.7 Användning av kompilerade program. Användningen av kompilerade program är identisk med den för okompilerade program, d.v.s kompilerade program laddas och "körs" på samma sätt som okompilerade. Kompilerade program skall bete sig på exakt samma sätt som okompilerade - gör de inte det så referera till sektion 4.10. Första gången ett kompilerat program körs efter att CBM 700 har blivit påslagen kommer det att dröja en liten stund medan programmet laddar run-time biblioteket (från fil RTL-128 eller fil RTL-256). Varje påföljande gång som ett kompilerat program körs kommer det inte att bli en fördröjning i.o.m att programmet kommer att upptäcka att filen redan finns i minnet. Kommandot CONT kan inte användas med kompilerade program. SYS 239 bör användas istället för CONT. När ett kompilerat program stannas kan variabler och indexerade variabelelement skrivas på skärmen (för felsökning) precis som med interpreterade program. 4.8 Kopiering av kompilerade program. Kopior på kompilerade program kan göras genom att använda COPY-kommandot. Det går inte att använda DSAVE eller SAVE! Kopieras programmet till en annan skiva, glöm inte att kopiera VL-filen (döp inte om den!) 4.9 Användningsfinesser. Det finns två specialutvecklade egenskaper för att göra användandet av kompilatorn ändå lättare. Den första åberopas ifall de fyra sista bokstäverna på källfil-namnet är "-src". I detta fall kommer objektfilens namn att automatiskt bli genererad, t.ex om källfilens namn är "abcd-src" kommer kompilatorn att kalla objektfilen "abcd". Denna egenskap kan bäst utnyttjas genom att omdöpa alla källfiler så att de innefattar "-src"-suffixet, eftersom detta kommer att garantera att de kompilerade programmen kommer att ha det namn som användaren är van vid. Detta är speciellt värdefullt när programlänkning används (d.v.s när ett program "DLOAD"ar ett annat program) eftersom DLOAD-kommandot inom programmet annars måste förändras. Den andra specialegenskapen kan användas när ett antal program på samma skiva skall bli kompilerade. Istället för att kompilera varje program separat kan en kontrollfil användas för att ge kompilatorn en lista på de program som skall kompileras. Programmen kommer då att kompileras utan vidare inblandning av användaren. En kontrollfil är en normal fil vars namn slutar med de fyra sista tecknena "-con", t.ex "compile-con". En kontrollfil skapas och redigeras på samma sätt som en programfil och består endast av en lista på filnamn. Varje filnamn skall skrivas på en separat rad och det första tecknet på varje rad skall vara ett citationstecken ("). Det första filnamnet skall vara namnet på den första källfilen som skall kompileras och det andra filnamnet skall vara namnet på motsvarande objektfil. Nästa filnamn skall vara namnet på den andra källfilen som skall kompileras o.s.v... Är "-src" möjligheten använd utelämnas objektfilens namn. En typisk kontrollfil kan t.ex se ut på följande sätt: 10 "filnamn1" 20 "cfilnamn1" 30 "filnamn2" 40 "cfilnamn2" 50 "test-src" (det avslutande citationstecknet kan uteslutas.) I detta fall kommer tre kompileringar att uppstå, d.v.s "filnamn1" kommer att kompileras för att ge "cfilnamn1" "filnamn2" kommer att kompileras för att ge "cfilnamn2" "test-src" kommer att kompileras för att ge "test" För att starta kompileringen skall kontrollfilens namn anges istället för källfilens vid inmatning. Den valda utskriften kommer att gälla för alla kompileringar. Finns en skrivare tillgänglig rekommenderas att "utskrift av fel" väljs för att försäkra att några fel inte går förlorade. 4.10 Felhantering. Om ett kompilerat program inte förefaller att exekvera på exakt samma sätt som den interpreterade versionen är det troligt att s.k. specialheltals-mod måste användas. Detta görs genom SI-kommandot vilket förklaras mer i detalj i sektion 6.3. Skulle maskinen återgå till uppstartningsstatus när kompilatorn eller det kompilerade programmet körs, kontrollera att kompilatornyckeln sitter i på rätt sätt. Om ett kompilerat program omedelbart stannar med meddelandet "FILE NOT FOUND ERROR", kontrollera att VL-filen finns med på skivan. Kontrollera även att VL-filen inte har blivit omdöpt. Inga autostartande program går att kompilera. Däremot om programmet kompileras först kan man försöka anpassa autostartrutinen till det kompilerade programmet. Okompilerade program kan ladda kompilerade, men det är inte möjligt för ett kompilerat program att direkt ladda och köra ett okompilerat via DLOAD. Om ett program som har överförts från en annan CBM maskin inte fungerar korrekt när det är kompilerat så kontrollera att det inte finns några felaktiga POKE instruktioner. Eftersom zeropage-layouten skiljer sig på olika CBM maskiner så är det nästan helt säkert att existerande POKEs är felaktiga. Kompilerade program utnyttjar ett litet antal minnespositioner som inte används av interpretatorn (d.v.s minnesposition 239 till 255 decimalt); POKEs till dessa positioner kommer att störa kompilerade - men inte okompilerade program. PET 700 KOMPILATOR -- KAPITEL 5 5. Att utnyttja PET 700 KOMPILATOR's möjligheter. 5.1 Hur man uppnår maximal exekveringshastighet. Alla program som har kompilerats utan någon förändring av källfilen, exekverar märkbart snabbare än de gjorde med interpretatorn. Detta till trots finns det mycket att vinna på någon eller några enkla förändringar i källfilen. Orsaken titt detta är att kompilatorn möjliggör heltalsaritmetik likväl som flyttalsaritmetik. Heltalsoperationer utnyttjas i sådana sammanhang där de båda ingående operanderna är heltal. Detta gäller för all aritmetik, logiska och liknande operationer. Heltalsaritmetikens algoritmer kan exekveras många gånger snabbare än motsvarande flyttalsalgortimer. För att uppnå bästa möjliga resultat hos det kompilerade programmet, bör man använda så mycket som möjligt av heltalsoperationer inom källprogrammet. För den som använder sig utav Commodore Basictolk är det väsentligt att veta att denna tolk accepterar heltalsvariabler, dock utan att tillämpa heltalsaritmetik på dem. Alla heltal den mottager omvandlas till flyttal innan den företar någon typ av aritmetisk operation. Därför ser man relativt sällan några Basicprogram som utnyttjar heltalsvariabler (d.v.s sådana där variabelnamnet avslutas med ett procenttecken). Av det vi nu nämnt framgår dock att när nya program skrivs, avsedda att kompileras bör heltalsvariabler användas så mycket som möjligt. För att bespara kompilatoranvändaren besväret att arbeta genom och redigera om redan existerande program, i avsikt att ändra flyttalsvariabler till heltal, erbjuder vår kompilator en möjlighet till automatisk förändring av alla variabler till heltal (alternativt vissa specifika variabler). Detta åstadkommes med hjälp av kompilatorkommandona CS och CE, som vi ger en mer fullständig beskrivning av i nästa kapitel. Allt programanvändaren behöver göra är att läsa igenom programmet och bestämma sig för vilka av variablerna som bör vara flyttal. Sådana utgör t.ex variabler som kan tänkas få större värden än 32767 alternativt mindre än -32768, eller sådana som måste skrivas med decimaler och resultatet kan bli en dramatisk uppsnabbning av programmet. Den genomsnittliga hastighetsförbättringen som kan erhållas varierar avsevärt mellan olika program. Som en allmän regel gäller att stora program snabbas upp betydligt mer än de små. Dessutom gäller för program av samma storleksordning att hastighetsförbättringen varierar betydligt. Det finns tre huvudsakliga skäl till detta: - När program genomför inmatnings- eller utmatningsoperationer kan huvudparten av programtiden bestå av pauser, under vilka datorn inväntar aktiviteter hos någon periferienhet, exempelvis skivminnet eller skrivaren. Dessa väntetider kan vara så långa att även om satsexekveringstiden reducerats maximalt kommer ändå den genomsnittliga hastighetsökningen knappt att märkas. - Hur interpretatorn exekverar ett program beror till väldigt stor del på hur programmet skrivits. Så gäller exempelvis att en subrutin som placerats längst fram i ett stort program kan exekvera många gånger snabbare än om den hade placerats i slutet av programmet. Men när dessa program kompilerats spelar placeringen ingen roll. Rutinen kommer att ta samma tid oavsett var den placerades i programmet. Men den relativa hastighetsförbättringen och de båda ursprungliga programvarianterna kommer därigenom att skilja sig avsevärt. - Några program måste genomföra flyttalsaritmetik, t.ex statistiska program och sådana som i stor utsträckning använder trigonometriska funktioner (SIN, COS etc.). Sådana program kan inte utnyttja heltal i samma utsträckning som andra. Trots detta finns det alltid några variabler inom programmet som kan ges i heltalsform. T. ex sådana variabler som används som index i matriser eller vektorer, samt i "FOR NEXT"-slingor. 5.2 Förbättrad programuppläggning. En fördel med kompilatorn som inte omedelbart framgår är möjligheten att skriva mer lättbegripliga källprogram, vilket under lättar programförbättringar. Bakgrunden till detta är att interpreterade program som regel måste skrivas ostrukturerat för att ge kortast möjliga exekveringstid, vilket knappast bidrar till god programmeringsteknik. Av samma orsak utesluter man de tidsödande REM-satserna. Man återanvänder likaså samma variabler flera gånger för att reducera interpretatorns söktid i variabellistan. Man samlar flera instruktioner på samma rad för att minska den tid som åtgår för radgenomsökningen, samt placerar de mest utnyttjade subrutinerna i början på programmet. Dessa olika metoder, liksom många andra, kan öka exekveringstiden avsevärt hos ett program som interpreteras, men medför samtidigt att programmen blir mycket svårlästa och svårbegripliga. Om ett program skall kompileras behövs ingen av dessa uppsnabbnings- metoder utan programmeraren kan helt inrikta sig på att skriva sitt program välstrukturerat och lättbegripligt. Detta bidrar redan från början att minska programmeringstiden och skulle programmet senare behöva modifieras underlättas detta avsevärt när programmet är lättöverskådligt. PET 700 KOMPILATOR -- KAPITEL 6 6. Kompilatorinstruktioner. En kompilatorinstruktion är en instruktion till kompilatorn som är lagrad inom källfilen. Instruktionerna har givits formen av en REM-sats för att programmet som innehåller sådana instruktioner fortfarande skall kunna köras med interpretatorn. Formatet hos en sådan kompilatorinstruktion är REM ** Detta format har valts för att andra ingående satser inte skall misstolkas som som kompilatorinstruktioner. Med instruktionskod förstås en tvåbokstavig identifikationskod. Med instruktionstext förstås tilläggsinformation till instruktionen (inte alltid nödvändig) - se separata instruktionsbeskrivningar. De flesta instruktioner kan endast uppträda i början av programmet (d.v.s innan någon icke REM rad) och kommer om de skulle dyka upp någon annanstans att ignoreras av kompilatorn. Det finns dock vissa instruktioner som kan placeras godtyckligt inom programmet. Dessa har markerats med asterisk i nedanstående lista. 6.1 Instruktionslista. Instruktion Namn CS Konvertera utpekade variabler (Convert Specified) CE Konvertera ej utpekade variabler (Convert Excluding) SI Speciell heltalsmod (Special Integer) RO Huvudprogram för programlänkning (Root program) VN Variabelnamn-fil för programlänkning (Variable Name) DS* Bortkoppling av stopptangenten (Disable Stop) ES* Inkoppling av stopptangenten (Enable Stop) NW Förhindra varningsmeddelanden (No Warning) Instruktionerna RO och VN beskrivs i kapitel 7. 6.2 Heltalsomvandling. Dessa instruktioner används för att tala om för kompilatorn vilka flyttalsvariabler och indexerade variabler som skall behandlas som heltal. CS betyder omvandla alla specificerade variabler till heltal. CE betyder omvandla alla flyttalsvariabler till heltal förutom de som är listade efter instruktionskoden. CS eller CE skall följas av en variabelnamnlista inom parantes där namnen åtskiljes med kommatecken, t.ex REM ** CS (A1,ZZ,X2,X3) betyder konvertera alla referenser med namnen A1,ZZ,X2,X3 till heltal, d.v.s programmet kommer att bli kompilerat som om variablerna var A1%,ZZ%,X2%,X3%. REM ** CE (I1,I2,I3) betyder konvertera alla flyttalsvariabler till heltal med undantag av I1, I2 och I3. REM ** CE () betyder konvertera alla flyttalsvariabler utan undantag. Observera att både indexerade variabler och variabler konverteras som i det första exemplet, om det finns en variabel A1 och dessutom en indexerad variabel A1 så kommer båda att konverteras. Kompilatorn kommer att skriva ut ett felmeddelande om det redan existerar en heltalsvariabel med samma namn. I sådana fall är det möjligt att ange att variabelnamnet bör bytas ut under konverteringen, t.ex REM ** CS (X,Y = YY%,Z) kommer att konvertera X och Z till X% och Z% var för sig; men Y kommer att bli konverterad till YY%. REM ** CE (A,B = B1%,C) kommer att konvertera alla variabler förutom A och C; B kommer att bli konverterad till Bl%. Observera: - att när namnen ändras under konvertingen, måste det första tecknet i de två namnen vara lika; - CS och CE instruktionerna kan inte användas tillsammans i ett program; - Det kan få finnas fler än ett CS- eller CE-kommando i programmet, d.v.s flera REM-satser efter varandra, men det totala antalet uppräknade variabler får inte överstiga 128. Även när det gäller helt nyskrivna program kan behovet för användning av CS- eller CE-kommandona uppstå. Anledningen till detta är att interpretatorn inte accepterar användning av heltalsvariabler inom "FOR NEXT"-satser, trots att FOR-variablerna i de flesta program enbart berör heltal. Skulle det krävas felsökning av programmet med hjälp av interpretatorn måste flyttalsvariabler utnyttjas i alla "FOR NEXT"-satser. När programmet senare kompilerats kan CS- eller CE-kommandon utnyttjas för att göra om FOR-variabler till heltal. Härigenom erhålles kortast möjliga exekveringstid för slingor. 6.3 Speciella heltalsoperationer. Den speciella heltalsmoden väljs genom instruktionen REM ** SI Denna mod berör enbart resultat av division och exponentialfunktions- operationer med heltalsoperander. Orsaken till detta kommando är att kompilatorn inte kan avgöra vad programmeraren vill uppnå med dessa operationer ifallingående operander är heltal. Det normala resultatet då kompilatorn genomför en sådan heltalsoperation är ett nytt heltal varigenom (som vi tidigare har förklarat) operationstiden kan förkortas avsevärt jämfört med motsvarande flyttalsoperation. För de flesta heltalsoperationer heltalsoperationer av denna typ uppstår inga problem men då det gäller division eller exponentiering kan resultatet komma att innehålla decimaler. För att förstå följderna av detta titta på uttrycket: R% = B% / 2 * 4 Om B% = 3 och om en heltalsdivision används kommer svaret att bli 4, men om en flyttalsdivision används kommer svaret istället att bli 6. På interpretatorn kommer svaret att bli 6, i.o.m att alla operationer sker med flyttalsvariabler. För kompilerade program i normal heltalsmod kommer svaret att bli 4, därför att i de flesta situationer när heltal används förväntar sig programmeraren heltalsoperationer och de är mycket snabbare. Detta kan ibland orsaka att det kompilerade programmet arbetar annorlunda jämfört med det okompilerade. Vid sådana fall kommer användandet av heltals-moden att överbrygga problemet, d.v.s den kommer att tvinga kompilatorn att alltid använda flyttalsaritmetik för division och exponentiering. 6.4 Bortkoppling av stopptangenten. Instruktion REM ** DS kopplar bort stopptangenten, medan REM ** ES tillåter användning av stopptangenten. När ett program körs med RUN är stopptangenten från början aktiv. Man kan få program att gå något snabbare om stopptangenten kopplas från. Anledningen till detta är att interpretatorn testar ifall stopptangenten är nedtryckt innan den exekverar en sats. För att spara tid testas stopptangenten i kompilerade program enbart vid NEXT och IF-instruktioner. När ett program använder DLOAD eller LOAD för att länka in ett annat program, eller för att ladda in någon maskinkodsdel eller dylikt kan det vara motiverat att koppla ur stopptangenten under laddningsperioden. En nedtryckning av stopptangenten under en pågående laddning skulle nämligen innebära att programmet inte kan återuppstartas med SYS 239 (den kompilerade motsvarigheten till CONT-kommandot). 6.5 Hur varningsmeddelanden undvikes. När ett program använder Basicutvidgningar (se sektion 3.5) kommer kompilatorn varje gång den träffar på en sådan utvidgning att generera ett varningsmeddelande. Sådana varningar kan spärras genom användning av kommandot REM ** NW PET 700 KOMPILATOR -- KAPITEL 7 7. Programlänkning. Uttrycket länkning använder man för att beskriva sådana processer där ett program laddar in ett annat program i internminnet för att utvidga sig själv, alternativt ersätta sig själv. Denna länkning åstadkommes antingen genom kommandot DLOAD eller LOAD. Sedan laddningen av det nya programmet ägt rum återexekveras det nya programmet automatiskt. Om ett flertal samhörande program, som utnyttjar länkning, skall kompileras kan dessa bete sig på två olika sätt, programmen kan antingen kompileras för att utnyttja gemensamma variabler eller undvika sådana. Metoden med gemensamma variabler utnyttjas i de fall där ett program skrivs så att de skall kunna utnyttja resultat skapade av ett tidigare program, som de genom länkning har ersatt. D.v.s resultaten som finns sparade i variabler och matriser finns kvar i internminnet fast ursprungsprogrammet raderats eller förändrats. Somliga länkade program utnyttjar inte gemensamma variabler och i dessa fall brukar programmet normalt börja med en CLEAR-sats för att radera eventuella tidigare variabler. 7.1 Länkning utan gemensamma variabler. Detta kräver inga speciella åtgärder vid kompileringen. Varje program kompileras helt enkelt som vanligt och kommer att hålla sig med en egen VL-fil. 7.2 Länkning med gemensamma variabler. Skall programmen ha gemensamma variabler används instruktionerna RO och VN. Detta är nödvändigt eftersom det vid kompileringen av varje program måste klargöras för kompilatorn att de ingående variablerna kommer att utnyttjas av andra program. Det första programmet i länkningskedjan måste starta med instruktionen REM ** RO RO-kommandot upplyser kompilatorn om att den kompilerar länkningskedjans basprogram (eng. Root Program). Effekten av detta blir att en variabelnamnsfil skapas vid kompileringens slutskede. Denna kommer att innehålla alla de variabel- och fältnamn som har utnyttjats samt de läges adresser som reserverats för dessa i minnet. En vanlig VL-fil kommer också att skapas omfattande programmets variabellista. Namnet på VN-filen kommer att vara "VN-" där namn står för det namn som satts på basprogrammet. Samtliga de övriga programmen som ingår i länkningskedjan måste inledas med kompilatorkommandot REM ** VN "" där man med förstår den benämning som används på huvudprogrammet. VN-kommandots effekt blir att tvinga kompilatorn att läsa den utpekade VN-filen som omfattar gemensamma variabelnamn och adresserna. Skulle ett nytt program i länkningskedjan utnyttja några nya variabelnamn kommer efter kompileringen av detta program en ny VN-fil att skapas som omfattar även dessa. När huvudprogrammet körs laddas variablerna i VL-filen och placeras på de adresser som reserverats p.g.a. RO-instruktionen. Det ursprungliga programmet kan sedan överskrivas av andra program hur många gånger som helst, vart och ett av dessa kommer att utnyttja den ursprungliga variabellistan som lästes in av huvudprogrammet. Observera att det finns en restriktion för program som innehåller RO och VN-instruktioner, och det är att DIM-instruktionen måste existera för alla indexerade variabler som är dimensionerade i programmet, d.v.s indexerade variabler utan DIM kommer inte kommer inte att automatiskt dimensioneras till att ha 11 element. Kompilatorn kommer att ge ett felmeddelande för alla indexerade variabler som inte har deklarerats med en DIM-sats och som inte fanns med i VN-filen, när denna lästes vid början av kompileringen. För att summera, det första programmet i länken skall inkludera följande instruktion REM ** RO Alla andra program som kan bli länkade med gemensamma variabler, skall inkludera följande instruktion REM ** VN "MENU" Där "MENU" är huvudprogrammets namn. PET 700 KOMPILATOR -- KAPITEL 8 8. Information för kombination av maskinkod med Basic. Många Basic program utnyttjar sig av maskinkodssubrutiner. Maskinkoden kan finnas i RAM eller ROM (d.v.s det kan finnas med i form av en programkasett). Vanligtvis kommer en sådan maskinkod att fungera oförändrat med program som blivit kompilerade. Detta kapitels ändamål är att ge sådan information att en programmerare som vill utnyttja maskinkodsrutiner tillsammans med sitt Basic program, får detta att fungera på önskat sätt. Det finns flera olika sätt att placera maskinkod i minnet, t.ex - ladda från en fil till 1K av outnyttjat RAM i bank 15 i adresserna $0400-$07ff; - via en programkasett; - via POKE-instruktioner från kod som lagrats i datainstruktioner till ett minnesområde som ligger utanför programarean; - via POKE-instruktioner från kod lagrad i datainstruktioner till en area inom programmet (t.ex till en REM-instruktion); Av alla dessa metoder är det enbart den sista som kan tänkas skapa problem p.g.a att REM-instruktionerna tas bort av datorn under kompileringsprocessen. Maskinkoden måste därför lagras utanför programmet. 8.1 Hur variabler, vektorer och fält representeras. Många maskinkodsrutiner använder variabler och indexerade variabelfält för att förmedla data till och från ett Basic-program. PET 700 KOMPILATOR skapar listor med exakt samma format och använder samma pekare inom bank 15 som interpretatorn utnyttjar. Detta medför att de maskinkodsrutiner som förutsätter dessa pekaradresser och fältpositioner kommer att fungera utan modifikationsbehov. Det finns bara ett par punkter att se upp för. Den första är att det är möjligt att den inbördes ordningen mellan variablerna i listan skiljer sig från den ursprungliga ordningen mellan variablerna när programmet exekverades av kompilatorn. Variablerna kommer att uppträda i den ordning de skapades inom källkodsprogrammet snarare än den ordning i vilken de anropas under den slutgiltiga programkörningen. Den andra punkten berör listan av indexerade variabler. Även här gäller att den inbördes ordningen kan skilja sig och dessutom kommer det att finnas ytterligare en variabelvektor. Denna tilläggsvektor kommer att utgöra det första fältet inom listan och dess namn utgörs enbart av två NUL-koder för att få sökrutinen för någon speciell indexerad variabel att fungera korrekt. Denna extravektor utnyttjas av kompilatorn som administrativ karta över de återstående variabelfältens adresser och uppdateras allt eftersom dessa skapas (eftersom fältstorleken inte alltid är känd under kompileringsskedet). Den administrativa vektorn är uppbygd av en 4 bytes entré-pekare plus ytterligare 2 bytes för varje nytt fält som utnyttjas av programmet. 8.2 Minnesanvändning. Det kompilerade programmet reciderar i bank 1 precis som det okompilerade. Variabler, indexerade variabler och strängar lagras i samma bank som de gör då programmet körs av interpretatorn. Run-time biblioteket är inläst i bank 1 och reciderar i arean $D7E0 till $FA3F (arean ovan utnyttjas av CBM's operativsystem). Kompilerade program använder även arean $00EF till $00FF, d.v.s 239 till 255 decimalt, inom bank 15. Dessa minnespositioner utnyttjas inte normalt av Basic eller operativsystemet och får därför inte utnyttjas av några maskinkodssubrutiner avsedda att samarbeta med det kompilerade programmet. 8.3 Basic-utökningar som hanteras av kompilatorn. Det finns tre sätt för att få Basic-utvidgningar anknutna till ett Basic-program och samtliga fungerar efter kompilering. Metoderna är: - Tilläggskommandon som börjar med ett icke alfanumeriskt tecken; - Tilläggskommandon som börjar med ett outnyttjat reserverat ord (eng. token); - SYS-anrop med parametrar; d.v.s tilläggsparametrar som följer efter SYS-adressen, där de läses och bearbetas av den anropade maskinkodsrutinen. Den enda begränsningen vid användning av Basic-utvidgningar är att det inte får innehålla något kolontecken (:) annat än vid slutet på satsen. Likaså om en utvidgning som bygger på nya reserverade ord utnyttjas kommer programlistningar framställda av kompilatorn inte att innehålla dessa kommandon i korrekt form. PET 700 KOMPILATOR -- KAPITEL 9 9. Felhantering. Kompilatorn utför grundliga kontroller under kompileringen av ett program och rapporterar alla funna fel. Fel kan hittas både under Pass 1 och Pass 2. Till detta tillkommer ytterligare kontroller som görs när det kompilerade programmet körs för att uppdaga fel som inte kan hittas under kompileringen. Uppstår kompileringsfel kommer objektfilen att utplånas av kompilatorn för att försäkra att felen korrigeras innan det kompilerade programmet körs. Det finns tre olika typer av fel som kan uppstå - Pass 1 fel; - Pass 2 fel; - Run-time fel. Dessutom kan varningsmeddelanden förekomma under Pass 1. 9.1 Pass 1 fel. Pass 1 spårar upp de flesta felen i.o.m att den kontrollerar varje instruktions syntax. När ett fel upptäcks kommer ett felmeddelande att skrivas ut efter raden där felet upptäcktes. Meddelandet innehåller en felsökningskod och visar även felets position. Observera att felet kan finnas före den utpekade punkten. Detta p.g.a att fel inte alltid upptäcks omedelbart, t.ex i ett uttryck en saknad parantes inte att upptäckas förän i slutet på uttrycket. Bilaga B innehåller en komplett lista på felsökningskoder och deras betydelse. 9.2 Pass 2 fel. De huvudsakliga fel som kan upptäckas under Pass 2 är odefinierade radnummer; d.v.s ett GOTO eller GOSUB till ett radnummer som inte existerar. Felmeddelandet är helt enkelt radnummret med felet följt av ett "U" för att visa att ett odefinierat radnummer hänvisats från denna rad, t.ex 23510 U Därtill gäller i slutet på Pass 2 att ett fel av typ 41 kan påpekas om det visar sig att en indexerad variabel används i ett program som innehåller en VN- eller RO-instruktion för vilken ingen DIM-deklaration har gjorts (se sektion 7.2) 9.3 Run-time fel. När ett kompilerat program körs, kommer run-time biblioteket kontinuerligt att söka efter fel. Och följande fel kan tänkas uppkomma: - NEXT WITHOUT FOR - RETURN WITHOUT GOSUB - OUT OF DATA - ILLEGAL QUANTITY - OVERFLOW - OUT OF MEMORY - BAD SUBSCRIPT - REDIM'D ARRAY - DIVISION BY ZERO - STRING TOO LONG - FILE DATA Felmeddelandena ovan är de samma som interpretatorn använder. Interpretatorn upptäcker ytterligare fel som inte finns i listan ovan (t.ex syntaxfel) men kompilatorn kommer att hitta dessa fel under kompileringen. Ovanstående fels betydelse är exakt de samma som för interpretatorfelen. Referera därför till Commodore-handboken om betydelsen är oklar. Den enda skillnaden mellan run-time fel, fel vid kompilerade program och vid interpreterade program, är att det kompilerade programmet ger adressen till den instruktion som innehåller felet, snarare än till radnumret. Ett separat program som heter ERROR LOCATE finns tillgängligt för att möjliggöra att återfinna motsvarande radnummer i källfilen. Processen för att åstadkomma detta är: - anteckna den adress som anges i felmeddelandet; - ladda och kör programmet ERROR LOCATE; - När detta program begär information, knappa in programnamnet (d.v.s objektfilens namn) och därefter när den efterfrågas, den antecknade feladressen. ERROR LOCATE kommer då att visa de radnummer inom källfilen som omfattar felet. Observera att ovanstående procedur enbart kommer att fungera om LN-filen för det programmet existerar på skivan. D.v.s att denna fil inte har raderats före testkörningen. 9.4 Varningar. Varningsmeddelanden uppstår när kompilatorn har upptäckt en Basic-utökning (se sektion 3.5) för att uppmärksamma användaren att en sådan utvidgning har hittats i källprogrammet. Anledningen till detta är att eventuella syntaxfel som kan uppträda i början av en sats, av kompilatorn kommer att behandlas som Basic-utvidgningar snarare än som fel. Kompilatorn kan nämligen inte skilja mellan dessa två möjligheter. Skulle därför varningsmeddelanden uppträda inom satser där programmeraren inte vet sig ha utnyttjat några Basic-utvidgningar, representerar varningen ett fel. Varningsmeddelandet kan antingen skrivas ut på skärmen eller på skrivaren tillsammans med några felmeddelanden, och en sammanräkning av varningsmeddelandena skrivs ut vid slutet av kompileringen. Om ett program ofta använder utvidgad Basic kommer många varningar att uppträda och vid sådana fall kanske programmeraren inte finner de önskvärda. Varningsmeddelanden kan stängas av genom användning av NW-instruktionen vid början av programmet. I dessa fall kommer inga varningsmeddelanden att produceras men en sammanräkning kommer fortfarande att skapas (se sektion 6.7). PET 700 KOMPILATOR -- BILAGA A A. Vad är en kompilator? Denna bilaga försöker att ta upp de huvudsakliga skillnaderna mellan en kompilator och en interpretator. Det första man bör inse är att en kompilator och en interpretator försöker att nå samma mål, d.v.s bägge försöker tillhandahålla ett sätt att köra ett program. Båda måste utföra ett antal liknande uppgifter, skillnaden är att uppgifterna utförs vid olika tillfällen. Begrunda vad som måste göras för att köra ett program. Ett program består av en grupp instruktioner och varje instruktion är helt enkelt en sekvens av bokstäver. Programmet skall enligt programmeraren definiera en algoritm, d.v.s den definierar hur ett problem skall lösas eller hur en speciell uppgift skall utföras. Algoritmen är definierad i termer som är meningsfulla för programmeraren men inte speciellt för datorn, d.v.s termer som variabler, operatorer, funktioner och radnummer etc. De huvudsakliga uppgifter som måste utföras vid tolkningen av varje sats, innan programmet kan köras är: 1. instruktionstypen måste identifieras; 2. instruktionens syntax måste kontrolleras; 3. variabellistan måste genomsökas för varje variabelnamn som upptäcks, för att se ifall variabeln är tilldelad en adress, är den inte det måste en adress tilldelas; 4. vid varje referens till ett radnummer i en GOTO eller ett GOSUB-sats, måste motsvarande adress för raden fastställas; 5. för varje uttryck kommer operations- och prioriteringsreglerna att gälla och ta hänsyn till eventuella paranteser, för att bestämma i vilken ordning uttrycken skall värderas; 6. eventuella icke-exekverbara delar av programmet som t.ex mellanslag eller kommentarer (REM-satser i Basic) måste överhoppas eller nonchaleras; 7. slutligen måste instruktionen genomföras. Både kompilatorer och interpretatorer måste utföra alla ovannämda uppgifter (och andra); skillnaden ligger i utförandet av uppgifterna. Detta är viktigt därför att de flesta instruktioner i ett program utförs mer än en och ofta många gånger. En interpretator utför ovanstående uppgift varje gång som en instruktion utförs och detta betyder att samma slags arbete kan upprepas många gånger. Tydligt är att sådan repetition är bortkastad och kan vara väldigt tidskrävande, ett stort program kan t.ex ha flera hundra variabler så varje gång man refererar till en variabel krävs en lång sökningstid. En kompilator undviker sådana bortkastade upprepningar genom att bearbeta ett program och konvertera det till en annan form. På detta sätt kommer uppgifterna 1 till 6 att utföras enbart en gång för varje instruktion och enbart uppgift 7 behöver utföras flera gånger. Uppgift 1 till 6 utförs när programmet är kompilerat och endast uppgift 7 behöver utföras varje gång som programmet körs. Med en interpretator kommer programmet att existera i enbart en form, d.v.s texten som programmeraren har skrivit. Med en kompilator har programmet två former - text formen; ~ den konverterade formen; För att skilja de båda åt är normalt textformen kallad källkod och den konverterade formen objekt- (eller binär) kod. Objektkoden för en instruktion innehåller normalt adresser där källkoden har variabelnamn och/eller radnummer. På liknande sätt re-arrangeras uttrycken för operationsprioritering och paranteser etc. Dessutom förstörs all överflödig information såsom radmellanrum, REM-satser och radnummer etc. och komplexa, instruktioner bryts ned till ett antal enklare steg. Ur detta skall det framgå att genom att förbehandla (d.v.s kompilera) ett program kan en kompilator minska ned programmets körningstid, men tydligt är att kompileringsprocessen tar tid. Fördelen med en interpretator är att när ett program ofta ändras (t.ex när det felgenomsöks eller modifieras) kan källan enkelt redigeras och programmet återstartas. Med en kompilator måste programmet först omkompileras innan en ändring kan provas. De två metoderna är varandras komplement; men så snart ett program fungerar, är kompilatorn överlägsen i.o.m att den ger den snabbaste programexekveringen. PET 700 KOMPILATOR -- BILAGA B B. Felsökningskoder Felnummer Anledning till fel 1 syntax fel 2 fel operandtyp 3 otillåtet index 4 "TO" saknas 5 ")" saknas 6 "(" saknas 7 "," saknas 8 ";" saknas 9 "THEN" eller "GOTO" saknas 10 "GOTO" eller "GOSUB" saknas 11 "FN" saknas 12 konstant för stor (antingen >255 eller <0) 13 uttrycket för komplext (skall inte dyka upp ifall programmet är OK på interpretatorn) 14 syntaxfel i uttrycket 15 för många ")" 16 otillåten operator i stränguttryck 17 hopblandade variabler (type mismatch) 18 otillåten instruktionstyp (CONT eller LIST) 19 programmet är för stort (skall inte inträffa ifall programmet är OK på interpretatorn) 20 funktionsnamnet får ej vara heltal 22 FOR-variabeln får inte vara indexerad 23 fel antal index (wrong number of subscripts) 24 för stort heltal 25 talet får ej vara negativt 26 kan inte sätta ST,TI,DS eller DS$ 27 variabeln i en definierad funktion får ej vara heltal 28 funktion saknas 29 operator eller separator saknas 30 hopblandade variabler i en logisk operation (type missmatch in relational expression) 31 radnummer saknas 32 operand saknas 33 otillåten CS eller CE instruktion 34 parantes saknas i CS eller CE instruktion 35 för många konverterade variabler (> 128) 36 fel i CS eller CE; inget "," eller "=" efter namn 37 fel i CS eller CE; "%" saknas 38 ej åtskillda uttryck i CS eller i CE 40 "="-tecken saknas 41 omdimensionering i länkat program (default array found in overlay) PET 700 KOMPILATOR -- BILAGA C C. Tips från användare - Kompilatorn klarar inte upphöjt till (^), ersätt med en indexerad variabel enligt följande: 1) Läs t.ex in i UP(0)=1, UP(1)=2, UP(2)=4 ..... UP(7)=128 2) Ersätt 2^(x) med UP(x). "x" motsvarar det värde som 2 skall upphöjas till. Om någon annan bas används än 2, gäller formeln: b^v = INT(EXP(b)*v)) - Alla numeriska variabler i en SYS-instruktion måste vara flyttal vid heltalskompilering, t.ex: SYS 18294#1,A$,V V måste definieras som flyttal enl. 1 REM ** CE (V, andra variabler,...) - Denna rad konverterar alla variabler till heltalsvariabler utom de som specificeras inom parantes. Följande rad som sätter speciell heltals-mod, behövs för att flyttalsberäkningarna skall utföras korrekt: 2 REM ** SI - Ser en rad ut som följande: 10 DIM a$(mt) måste "mt" som motsvarar variabeln också specifieras som flyttal. - Tänk på att variabler som är större än 32768 måste göras om till flyttal! - Observera att man inte kan skriva: 10 IF X=Y THEN END : ELSE 100 Den riktiga utformningen ser ut som följande: 10 IF X=Y THEN END : ELSE GOTO 100 Anmärkning, glöm inte GOTO efter ELSE! - Radnumret som anges vid körning av ERROR LOCATE-programmet skall ses mer som en fingervisning, än en exakt angivelse. I.o.m att det exakta felet kan ligga både framför och bakom det angivna radnumret.