Fullständig BASIC

Full BASIC , ibland känd som Standard BASIC eller ANSI BASIC , är en internationell standard som definierar en dialekt av BASIC-programmeringsspråket . Den har utvecklats av American National Standards Institute (ANSI) X3.60-gruppen i samarbete med Europeiska ECMA . Den beskriver en avancerad version av BASIC med många funktioner inklusive strukturerad programmering , matrismatte , input/output för filhantering och många andra alternativ.

ANSI:s BASIC-standardisering var en process i två steg. Det första, som genomfördes som Minimal BASIC med start 1974, var ett försök att tydligt definiera och standardisera det ursprungliga Dartmouth BASIC- språket så att det kunde implementeras korrekt på olika plattformar. Efter lanseringen i slutet av 1977 vände uppmärksamheten mot Full BASIC som skulle baseras på den mer kraftfulla Structured BASIC som utvecklas vid Dartmouth College . Komplexiteten i systemet och de många tilläggen som främjades av medlemmarna i standardkommittén ledde till att ansträngningen körde fast och det första utkastet till standard var inte klart förrän 1986, fyra år försenat.

Standarden ratificerades den 26 juni 1986 som ECMA-116 och januari 1987 som ANSI X3.113-1987 . Det ignorerades helt; mikrodatorrevolutionen hade inträffat medan specifikationen diskuterades, och i början av 1980-talet hade Microsoft BASIC som kördes på tiotals miljoner hemdatorer redan kommit och gått. Dartmouth-deltagarna såg processen dra ut på tiden för att producera True BASIC baserat på delar av standarden, men det var ingen nytta. De facto- standarder som Microsofts dominerade marknaden och utgjorde grunden för nyare språk som Microsoft Visual Basic som inkorporerade liknande koncept. [ citat behövs ]

Historia

Minimal BASIC

Introduktionen av Dartmouth BASIC 1964 kombinerade ett antal framväxande koncept inom datorområdet, inklusive tidsdelning och direkt interaktion med användaren, känt på den tiden som ett "konversationsgränssnitt". General Electric , som levererade GE 235 stordator den körde på, använde en modifierad version av Dartmouths system för att starta en servicebyrå som så småningom skulle utvecklas till GEnie onlinetjänst . Många andra företag, Tymshare och CompuServe anmärkningsvärda bland dem, introducerade snabbt sina egna BASIC-tjänster, enligt Dartmouth-modellen.

1968 introducerade Hewlett-Packard (HP) HP 2000 -seriens minidatorer , som erbjöd samma funktioner som de tidigare stordatorsystemen i ett rackmonterat system som kunde konfigureras i en komplett form för cirka 100 000 USD (motsvarande 779 234 USD 2021) . Deras HP Time-Shared BASIC hade ett antal skillnader från Dartmouth, och dessa kopierades snart av andra minileverantörer som Data General . En hållout var Digital Equipment Corporation (DEC), som inte introducerade en BASIC av sin egen design förrän 1972. Denna version, BASIC-PLUS skilde sig från antingen HP- eller Dartmouth-dialekterna. I början av 1970-talet var tre stora dialekter och dussintals mindre variationer som användes på marknaden.

I januari 1974 bildades en ny grupp under ANSI-paraplyet för att definiera en enda standard BASIC. Dartmouth-teamet utgjorde en central del av gruppen. Dartmouth arbetade på en kraftigt utökad version av BASIC känd som Structured BASIC (SBASIC) som blev grunden för ANSI. På den tiden var det få andra dialekter som stödde dess många nya funktioner. Gruppen beslutade att en komplett standard baserad på SBASIC skulle ta lite tid att komma överens om, så ANSI BASIC-satsningen delades upp i två milstolpar. Den första, Minimal BASIC , skulle producera en standard som endast inkluderade de mest grundläggande funktionerna som skulle krävas för en implementering. Även funktioner från Dartmouth som under lång tid stöds, som matrismatte, skulle utelämnas. Utkastet till standard för Minimal BASIC släpptes i januari 1976, det slutliga utkastet i juli 1977, och det ratificerades i december. Arthur Luehrmann, en fysiker från Dartmouth College som var en förespråkare för BASIC och en del av ANSI-gruppen sa senare:

"X3J2:s första år ägnades (i efterhand, vissa kanske säger "bortkastade") på att standardisera vad som motsvarar den ursprungliga 1964 Dartmouth Basic... Minimal Basic var mer en leksak än ett faktiskt språk."

Fullständig BASIC

Gruppen vände sedan uppmärksamheten mot Full BASIC. Vid denna tidpunkt mikrodatorrevolutionen i full fart och miljontals maskiner som körde Microsoft BASIC eller en liknande BASIC kom in på marknaden. Trots detta var ingen av deltagarna mikrodatorförsäljare eller leverantörer. Istället förblev deltagarna stordatorleverantörer som IBM , Control Data och General Electric , minidatorleverantörer som Digital Equipment Corporation (DEC), Data General och Wang Laboratories och andra mycket stora företag som 3M , American Express och Kodak .

Ansträngningen slog omedelbart emot den andra systemets effekt när varje medlem började lägga till sin egen lista över "måste ha" funktioner. Vissa ville att språket skulle fortsätta traditionen att vara inriktat på pedagogiska användningar som körs på små maskiner och önskade ett enkelt språk med endast rudimentärt filstöd och liknande funktioner. Andra var stordatoranvändare som ville stödja laddningsbara modulära program och andra expansiva programmeringsfunktioner för att konkurrera med språk som COBOL eller FORTRAN och samtidigt erbjuda bättre strängmanipulation . En tredje grupp var främst intresserad av affärsapplikationer, särskilt europeiska användare där BASIC hade blivit ett primärt affärsspråk, och de krävde att systemet skulle innehålla omfattande filhantering och decimalmatematik som inte led av avrundningsproblem.

John G. Kemeny och Thomas E. Kurtz , de ursprungliga formgivarna av BASIC och medlemmar av ANSI-gruppen, var kritiska till processen. I en artikel från 1982 skrev Kurtz om hur även till synes små frågor hade förvandlats till stora kontroverser. Han använde exemplet med OPTION BASE -satsen. När arrayer först lades till BASIC började de vid index 1, så att DIM A(3) gjorde en array med tre platser, 1, 2 och 3. I vissa fall är ett index 0 mer naturligt, så OPTION BASE 0 var lades till i senare versioner av Dartmouth-koden så att samma definition skulle ha fyra luckor, 0 till 3. Under Minimal pågick en kontinuerlig debatt om vad standardbasen skulle vara, och 0 valdes slutligen. Fem år senare, under Full-ansträngningarna, bestämdes det att arrayer kunde definiera vilken nedre gräns som helst med hjälp av ny syntax, DIM YEAR(1970 TO 1990) . Detta eliminerade kravet på OPTION BASE 0 och beslutet togs att ändra standard till 1 igen.

Ursprungligen siktade X3.60-gruppen på ett sommardatum 1982 för den första tekniska recensionsexemplaren, som skulle skickas till ANSI X3-kommittén under hösten. Under denna period skulle den föreslagna standarden skickas ut och kommentarer från allmänheten skulle accepteras. Det slutliga utkastet skulle skickas tillbaka till X3 1983 för ratificering det året. Detta visade sig vara ganska optimistiskt. Det första utkastet släpptes inte förrän i januari 1985 och det slutliga utkastet 1986 för ratificering i januari 1987. Under denna tid växte standarden så stor att den slutligen delades upp i en kärnmodul och fem valfria tillägg, som inkluderade komplexa filer hantering, datorstöd i realtid, fast decimal matematik, valfria redigeringskommandon och till och med en plattformsoberoende grafikmodul.

Resultatet kritiserades under den offentliga kommentarsperioden. En recensent noterade att det hade vuxit sig så stort att "det resulterande språket konkurrerar med alla nuvarande programmeringsspråk i komplexitet" och att "att överensstämma med hela standarden skulle jämföras med de mest betydande kompilatorprojekt som någonsin försökts". Den fortsätter med att beskriva, till exempel, hur det finns inte mindre än fem olika sätt att beskriva en subrutin, tre för att definiera en strängs maximala längd och två sätt att definiera en array. Med hänvisning till frågan om array-gränser noteras det att kommittén var överens om att den antagna lösningen var "oacceptabel" och planerade att fixa den "senare".

Det finns inga bevis för att någon av deltagarna faktiskt byggde en överensstämmande version efter lanseringen av standarden och allt omnämnande av pågående ansträngningar försvinner omedelbart. Från 1987 är det enda som nämns i standarden att den existerar och att True BASIC omfattade några av dess funktioner. Dessutom, med miljontals mikro som kör en viss variation av MS:s defacto-standard vid det här laget, sågs den nya ANSI-standarden som den icke-standardiserade lösningen. Mycket av BASICs ursprungliga framgång på mikroplattformarna var att det tillät program att skrivas in från tryckt källkod , men i mitten av 1980-talet hade detta ersatts av shrinkwrap -applikationer och behovet av BASIC som distributionssystem hade bleknat. På sidan med stora system ersattes den ursprungliga användningen som undervisningsspråk i allt högre grad av Pascal , eftersom de externa problem som BASIC syftade till att lösa, som interaktivitet och onlineredigering, nu var tillgängliga i de flesta system.

Riktigt BASIC

Standardprocessen var så långsam att till och med författaren till Structured BASIC gav upp den. Stephen Garland ombads att förbereda en serie College Board- tester för gymnasieelever och skrev dem i Pascal istället. Detta var något kontroversiellt med tanke på att många datorer i stor användning, som Commodore 64 och TRS-80, inte hade en fullständig implementering av Pascal. Luehrmann, var kritisk till insatsen och föreslog en mer allmän kurs som skulle kunna tillämpas på fler studenter.

Det blev tydligt för Dartmouth-deltagarna i ANSI-gruppen att insatsen inte hade något hopp om att slutföras inom någon rimlig tidsperiod. De lämnade arbetet och startade ett nytt företag för att få ut sin version av språket på marknaden som True BASIC . True BASIC kombinerade många av funktionerna i kärnstandarden men gjorde också ett antal egna ändringar. Bland de mest anmärkningsvärda var att radnumrering nu var valfritt. Språket togs inte emot väl, med många recensioner som uttryckte samma oro för funktionsuppsvällning som hade tagits upp om Full BASIC-standarden. Jerry Pournelle hånade det som "galenskap" och John Dvorak avfärdade det som "tråkigt" och "dömt att misslyckas".

Beskrivning

Programredigering

Liksom tidigare versioner av BASIC har Full BASIC utformats för att fungera i en radredigeringsmiljö och använder således radnummer för att indikera enskilda rader eller rader som ska redigeras eller tas bort. Radnummer kan variera från 1 till 50 000, i motsats till Minimal som var 0 till 9999. Detta innebar att giltiga Minimal-program som använder rad 0 var ogiltiga i sin helhet. Logiska rader var minst 132 tecken långa. Logiska linjer skulle kunna förlängas över flera fysiska linjer med hjälp av "fortsättningstecknet", et-tecken. Tyvärr valdes et-tecken också som strängsammansättningsoperator, vilket komplicerade analysen.

Ytterligare redigeringskommandon inkluderade RENUMBER och DELETE , som vid den här tiden var vanliga på nyare mikrodatordialekter. Ett nytt koncept var EXTRACT , som kopierade en rad rader till en ny fil och raderade dem från det ursprungliga programmet, så att de kunde extraheras till ett underprogram. Dessa kan sedan anropas med kommandot CHAIN . CHAIN ​​kan också inkludera en valfri WITH följt av en lista med parametrar, i vilket fall den förväntades returnera ett värde i en variabel med samma namn som programmet (se funktioner nedan).

Grundläggande funktionalitet

Många av de vanligaste sökorden som finns i Minimal eller andra dialekter fanns kvar; PRINT , INPUT , DATA och READ till exempel. Det gjordes många mindre ändringar av dessa kommandon. Till exempel, vid redigeringstillfället kan nyckelord skrivas med versaler eller gemener, eller valfri blandning. Som tidigare visades de normalt med versaler, medan en ny konvention var att använda ormskiftläge för variabelnamn med flera tecken.

Dartmouth BASIC introducerade REM -uttalandet för in-line-kommentarer och detta stöddes universellt i andra dialekter. Många dialekter har också lagt till en kortform, oftast med ett citat, ' , som ses i Microsoft BASIC. För Full valde de utropstecknet, ! för den här rollen, även om det inte verkar finnas någon anledning att inte använda det enda citattecken eftersom det inte används annars - strängar tillåter till exempel inte enstaka citattecken. En mer kontroversiell förändring var att LET nu krävdes för alla tilldelningar för att göra analysen enklare, medan LET var valfritt på alla andra dialekter. Detta inkluderade Minimal, så all Minimal-kod som använde denna genväg var inkompatibel med Full.

Utöver den relativt lilla uppsättningen med 23 nyckelord och 11 funktioner från Minimal, lade Full dussintals egna, för totalt 176 nyckelord (som definierar 161 separata begrepp), 38 matematiska funktioner och 14 strängfunktioner om alla tillägg inkluderades. En enkel lista med nyckelord, upplagd i tre kolumner, fyller två sidor i standarddokumentet.

Strukturera

Den största skillnaden mellan Full och Minimal var tillägget av blockorienterade strukturerade programmeringskonstruktioner. I Minimal, och de flesta BASIC-tolkar, bestod programmet logiskt sett av oberoende rader kod och man kunde börja köra när som helst genom att TILL vilket radnummer som helst. Det enda undantaget från denna regel var FOR...NEXT- loopen, där alla rader från FOR till NEXT logiskt sett ansågs vara ett enda kodblock. Att förgrena sig in i eller ut ur ett FOR-block skulle resultera i udda beteende, vanligtvis implementeringsberoende men i allmänhet någon form av "NÄSTA UTAN FÖR". I ANSI/ISO Full BASIC-standarden är det inte tillåtet att förgrena sig till ett FOR...NEXT-block.

I sin helhet utökades flera befintliga sökord och andra lades till för att tillhandahålla blockstrukturer. Anmärkningsvärt var multi-line IF...THEN...ELSE...END IF , som gjorde att flera rader kod kunde köras om villkoret uppfylldes eller misslyckades. SELECT...CASE...CASE ELSE...END SELECT lades till för att skapa beslutsträd, som tidigare skulle ha implementerats med hjälp av ON...GOTO eller flera IF för att välja en rad att köra. FÖR...NÄSTA loopar förblev som de var i Minimal, men en ny DO...LOOP lades till med topptestade DO WHILE...LOOP och bottentestade DO...LOOP TILL... varianter. Alla loopar kunde nu lämnas på ett säkert sätt med kommandona EXIT FOR och EXIT DO .

Eftersom åtgärden att förgrena sig in i ett block eller ut ur det utan EXIT var odefinierad, var det meningen att implementeringar skulle leta efter sådana åtgärder och inte tillåta dem. Detta innebar att man inte skulle kunna in i ett block, men det är svårt att leta efter sådan kod i en tolk som normalt granskar programmet rad för rad; Att leta efter förgreningar till ett block från annan kod i programmet skulle normalt kräva helprogramsanalys som en kompilator.

Utöver dessa ändringar av blockstrukturerna lade Full också till nyckelord för att definiera procedurer, funktioner och programblock. Program som helhet öppnades nu med det valfria PROGRAM följt av ett programnamn, och avslutades som tidigare med END . Rutiner kan konstrueras med SUB...END SUB och anropas med CALL-namn . Flerradsfunktioner skapades med FUNCTION...END FUNCTION och deklarerade ingen returtyp eftersom det var en del av namnet - strängfunktionsnamn slutade med dollartecknet. Returvärdet tillhandahölls genom att sätta en variabel till samma namn som funktionen, till exempel skulle en funktion med namnet "DOIT" innehålla en rad som LET DOIT=1 . Funktioner kunde kalla andra funktioner och sig själva, vilket betyder att språket var naturligt rekursivt . Full behöll också den tidigare stilen med enradsfunktionsdefinitioner med DEF , men tog bort kravet på att funktionsnamnet skulle börja med "FN". Till exempel DEF AVERAGE(X,Y)=(X+Y)/2 .

I tidigare BASICs fanns det inget omfattningsbegrepp och alla variabler var globala . Detta är inte tillräckligt för konstruktion av stora modulära program, eftersom en del av koden kan ha skrivits med vanliga variabelnamn som I och kan ändra värdet på den variabeln i annan kod. Ett nyckelbegrepp för strukturerad programmering är den lokala variabeln , som håller sitt värde separat från andra variabler med samma namn på andra platser i det sammansatta programmet. Eftersom BASIC inte hade konceptet omfattning, förlitade sig många program på att deras variabler var globala och använde dem för att skicka information in och ut ur subrutiner. För att tillåta båda begreppen i det nya språket lade Full BASIC till EXTERNAL , som när det lades till en funktion eller subrutin skapade alla variabler inom lokalt. Eftersom BASIC-program vanligtvis placerar subrutiner i slutet, DECLARE användas för framåtriktade deklarationer .

Datatyper och variabler

Full BASIC introducerade långa variabelnamn, som slutligen bröt sig loss från tidigare enbokstavs- eller bokstavssiffriga namn. Den satte den nya gränsen till 31 tecken. En mindre nackdel med denna förändring var att sökord måste ha mellanslag mellan sig, medan de flesta tidigare versioner tillät att mellanslagen utelämnades. Detta berodde på att med enbokstavsnamn kan en rad som FORS=1TOA tolkas som "FORS", vilket omöjligen kan vara en variabel i en tvåbokstavsvariation av BASIC. I sin helhet skulle detta behöva skrivas FÖR S=1 TILL A eftersom "FORS" är ett giltigt variabelnamn. Som var fallet i tidigare BASIC, betecknades datatyper i sin helhet med suffix på variabelnamnet. Minimal hade undvikit detta problem genom att bara ha numeriska variabler, men Full inkluderade också strängar, betecknade med dollartecknet, till exempel A$ .

Full BASIC krävs decimal matematik för standardimplementeringen av flyttalssystemet . Eftersom detta inte stöddes universellt i hårdvara, speciellt på minis och micros, lades också till OPTION ARITHMETIC NATIVE som indikerar att matematik bör utföras med hjälp av systemets förinställda flyttalsimplementering, vad det nu kan vara. Den kan återgå till BCD-läge med OPTION ARITHMETIC DECIMAL . Detta är utöver det matematiska alternativet med fast punkt, om det är installerat. Numeriska och strängvariabler fungerade annars som de i andra BASICs.

Ett nytt tillägg var den fasta matematiska tillägget, som gjorde det möjligt för variabler att ha specificerad noggrannhet. Detta aktiverades med kommandot OPTIONAL ARITHMETIC FIXED följt av en asterisk och en formatspecifikation, till exempel skulle OPTION ARITHMETIC FIXED*8.2 ställa in alla numeriska variabler att ha 8 siffror med noggrannhet och två decimaler. En sådan deklaration måste placeras före eventuell matematikkod i resten av programmet. Dessutom skulle vilken enskild variabel som helst kunna definieras individuellt med något som DECLARE NUMERIC*8.2 A, B .

De flesta BASIC stödde konstruktionen av arrayvariabler med DIM- nyckelordet, till exempel definierar DIM A(5), B(2,2) två arrayer, den endimensionella A och tvådimensionella (matris) B. I Full BASIC, den nedre gränsen för valfri array var normalt 1, så i det här fallet har variabeln A fem "slots", numrerade 1 till 5. Användning av OPTION BASE 0 ovanför denna deklaration skulle lägga till ytterligare en lucka vid index 0. Full lade också till ett nytt system för att direkt ange de nedre och övre gränserna med hjälp av nyckelordet TO , till exempel DIM A(100 TO 200) som gör en endimensionell 101-slots array. För att ytterligare förvirra saker DECLARE NUMERIC också användas för att skapa arrayer; samma mått som det senaste exemplet kunde skapas med DECLARE NUMERIC A(100 TO 200) .

Matematik, logik och matriser

Listan över matematiska operatorer som stöds inkluderade alla de från Minimal, + , - , * , / och ^ . Den nya MOD- funktionen returnerar resten av en heltalsdivision. Listan med logiska operatorer utökades, AND , OR och NOT hade tagits bort från Minimal och nu lagts till igen, och de alternativa formerna av jämförelseoperatorer lades till, =< , => och >< .

Listan över primära inbyggda funktioner förblev liknande tidigare versioner av BASIC, inklusive vanliga exempel som SQR eller ABS . Trig-funktionerna utökades till att omfatta ASIN , ACOS , ATN , COT , CSC och SEC . Den nya ANGLE -funktionen returnerade vinkeln mellan origo och en given X,Y-punkt. BASIC beräknade normalt vinklar i radianer, men OPTION ANGLE DEGREES skulle omvandla alla parametrar och utdata till grader, och systemet exponerade PI- funktionen som användes i dessa konverteringar och på andra ställen.

Dartmouth BASIC hade introducerat matrisoperationer relativt tidigt i sin utveckling, och dessa var en del av Full. Dessa överbelastas de befintliga matematiska funktionerna, så man kan multiplicera två arrayer med MAT A=A*B eller multiplicera innehållet i en array med en skalär om B-parametern inte är en array. Systemet lägger också till flera array-only-funktioner, som bland annat inkluderar ZER o, INV ert och DET erminate. Tillägget av matrismatte kräver också modifiering av befintliga nyckelord som PRINT och INPUT , som matar ut eller matar in flera element efter behov för att fylla arrayparametern.

Matriser kan omdimensioneras som en del av en MAT INPUT genom att specificera de nya gränserna, som MAT INPUT A(3.3) . De nya dimensionerna måste ha ett totalt antal element lika med eller mindre än den ursprungliga DIM , så i det här exemplet om den ursprungliga definitionen var DIM A(2,2) skulle inmatningen orsaka ett fel.

Strängar

Tidiga versioner av Dartmouth BASIC inkluderade inte strängvariabler eller manipulation, de enda strängarna i ett program var konstanter som PRINT "HELLO, WORLD!" . Version 4, från 1968, lade till strängvariabler och en enda metod för att manipulera dem, CHANGE , som konverterade strängar till och från en array som innehåller ASCII -värdena för tecknen. ÄNDRA till exempel "HEJ VÄRLDEN!" TO A skulle producera en matris av värden i A, där A(0) var 72, det decimala ASCII-värdet för "H". Detta gjorde strängmanipulation ganska svårt, till exempel att extrahera "HELLO" från "HELLO, WORLD!", man skulle behöva:

 
   
    
    
 
  
     10  A$  =  "HEJ VÄRLDEN!"  20  DIM  A  (  25  ),  B  (  5  )  30  ÄNDRA  A$  TILL  A  40  FÖR  I  =  1  TILL  5  ​​50  B  (  I  )  =  A  (  I  )  60  NÄSTA  I  70  ÄNDRA  B  TILL  B$ 

Många dialekter av BASIC hade lagt till sina egna metoder för att utföra mer användbar strängmanipulation för att undvika sådan komplikation. För Full BASIC valde kommittén en variant av konceptet som introducerats av HP, "string slicing". Det här konceptet behandlar strängen som en array av tecken och kan komma åt dem med en arrayliknande specifikation som kallas "slice" . För att extrahera "HELLO" från "HELLO, WORLD" i sin helhet, skulle man använda B$=A$(1:5) . Konceptet liknar det för CHANGE , men den här metoden ger resultat som i sig är strängar, inte numeriska värden, och därför kan man UTSKRIVA B$ för att producera "HEJ". En betydande skillnad mellan Fulls tillvägagångssätt och tidigare som HP är att den använde en annan syntax för skivningen, medan de tidigare systemen använde arraysyntax. Till exempel, i HP är motsvarande linje B$=A$(1,5) . Eftersom detta är samma syntax som matrisåtkomster tillät HP (och liknande) i allmänhet inte strängmatriser, medan detta var tillåtet i sin helhet.

Detta tillvägagångssätt bör jämföras med den lösning som valts av DEC, användningen av funktioner som returnerar nya strängar, LEFT$ , MID$ och RIGHT$ . Detta var lösningen som Microsoft tog upp när de skrev sin BASIC på PDP-10 . Konvertering mellan de två kan vara felbenägen, för att utföra motsvarande RIGHT$(n) skulle Full använda DEF Right$(A$, n) = A$(Len(A$)-n+l) .

Ingång/utgång

Ett annat fokusområde för Full BASIC var input/output (I/O). Minimal BASIC:s enda I/O var INPUT- och PRINT- kommandona och möjligheten att hårdkoda data med hjälp av DATA -satserna och LÄSA dem. Nästan alla praktiska dialekter lade till OPEN och CLOSE för att skapa en "kanal" som sedan användes för att referera till just den filen eller enheten.

INPUT inkluderade nu en valfri PROMPT följt av en sträng, ett kolon och sedan indatavariablerna, till exempel INPUT PROMPT "What is your age?" : A . Vid det här laget inkluderade nästan alla BASICs en liknande funktion utan ordet PROMPT och med det befintliga utskriftsseparatorsemikolonet istället för kolon, till exempel i MS BASIC skulle samma rad vara INPUT "Vad är din ålder?"; A . Utöver detta har Full också lagt till de nya TIMEOUT- och ELAPSED -nyckelorden: INPUT TIMEOUT 30, ELAPSED T, PROMPT "What is your age? ": A , som kommer att fortsätta körningen efter 30 sekunder även om användaren inte anger något, och kommer att sätta tiden det tog, möjligen de 30 sekunderna, in i variabeln T. För system som saknade en klocka (vilket inte var ovanligt vid den tiden) skulle T alltid returnera -1.

PRINT ing utökades på liknande sätt med den valfria USING -satsen, som redan hade dykt upp på ett antal implementeringar. USING följdes normalt av en formatsträng med siffertecken, asterisker och procenttecken för att markera decimaler . Formatsträngen kan placeras i en strängvariabel och sedan hänvisas till, eller en valfri separat rad som innehåller en IMAGE : kan hänvisas till med radnummer. Full har också lagt till nya kommandon för att ställa in utskriftsområdet, SET MARGIN och SET ZONEWIDTH . De aktuella värdena för dessa olika inställningar (och andra) kan returneras med ASK . Till exempel, SET MARGIN 10 följt av ASK MARGIN J skulle sätta J till 30.

Fullständigt stödda filoperationer med OPEN och CLOSE och ett kanalnummer med ett nummertecken prefix, till exempel OPEN #3: NAME "file" . Data kan sedan skrivas med INPUT och PRINT eller READ och den nya WRITE . Ytterligare filhanteringskommandon inkluderade ERASE och REWRITE , och alla dessa kommandon hade många alternativ och lägen. Mycket av detta härrörde från de olika typerna av fysiska enheter som fortfarande var vanliga i slutet av 1970-talet, magnetband , till exempel, kunde endast nås sekventiellt så den nya standarden erbjöd alternativ för SEQUENTIAL eller STREAM , etc. Listan över alternativ och deras interaktioner och begränsningar täcker många sidor i standarden. Det är till exempel möjligt att SKRIVA UT till en fil av typen DISPLAY , men inte typen INTERN , som krävde WRITE .

Undantagshantering och felsökning

Liksom många BASICs av eran lade Full till kommandot TRACE ON som skulle skriva ut radnummer när programmet kördes. Det kan också omdirigera utskriften av radnumren till en annan enhet eller fil med TRACE ON TO #3 , där #3 var en tidigare öppnad kanal. Den lade också till DEBUG ON och relaterad BREAK- sats, varav den senare skulle orsaka ett undantag om felsökning tidigare hade aktiverats. Felsökningsstatus var begränsad till ett visst program, så det kunde till exempel slås på i ett program och stängas av i ett underprogram.

Dessutom har Full lagt till sanna undantagshanterare, baserat på blocket WHEN EXCEPTION...END WHEN . Det fanns två sätt att använda detta, om kodblocket började med WHEN EXCEPTION IN följande kod exekverades som ett block och alla undantag inom det skulle få det att hoppa till USE -sektionen, som fungerar på samma sätt som en ELSE . Det kan också användas genom att definiera ett separat subrutinliknande block med hjälp av HANDLER-namnet som sedan skulle anropas med namn med NÄR UNDANTAG ANVÄNDER namn . Koden kunde testa vilket undantag som hade inträffat med hjälp av metavariablerna EXTYPE eller EXTEXT$ , som inte behövde en ASK . RETRY lämnade felhanteraren och återgick till felraden, medan CONTINUE kunde användas inom huvudlinjekoden för att ignorera fel även inom WHEN -block.

Grafik

Ungefär samtidigt som Full designades pågick en parallell ansträngning för att definiera Graphics Kernel System, eller GKS. Detta erbjöds som en av de valfria modulerna i sin helhet. Detta lade till dussintals speciella nyckelord som LINE STYLE och WINDOW med syntax som inte matchade den för de andra modulerna i standarden. Till exempel aktiverade CLIP- kommandot klippning till den aktuella visningsporten så att objekt ritade utanför dess gränser inte skulle vara synliga; detta tog ett strängvärde istället för ett booleskt, CLIP "On" . Flera vanliga bildändringskommandon lades till, SHIFT , SCALE , ROTATE och SHEAR .

Eftersom bilder ofta är uppbyggda av vanliga element lade Full till den nya PICTURE- blockstrukturen, som annars liknar en SUB och anropas med DRAW snarare än CALL . Skillnaden är att utdata från ett bildblock kan modifieras med ändringen med hjälp av WITH . Till exempel, om man definierade en BILDCIRKEL som producerade en cirkel med radie ett, skulle en mindre cirkel kunna ritas och flyttas åt sidan med DRAW CIRCLE WITH SHIFT(2) * SCALE(.4) .

Realtid

Fulls realtidsmodul lade till konceptet "parallella sektioner", genom nyckelordet PARACT . Dessa såg ut som subrutiner (och bilder) men hade ett antal ytterligare nyckelord som styrde deras anrop. Till exempel kan man definiera kod som skulle svara på en HÄNDELSE och sedan få den att köras genom att utfärda ett MEDDELANDE någon annanstans i koden. Meddelanden kan anropa flera hanterare med hjälp av DELADE portar.

Systemet tillät också att dessa block och objekt kopplas till extern kod som skulle skapa dessa meddelanden. Man skulle till exempel kunna ha kod som väntade på en enhet som med jämna mellanrum skapade textutdata, och då skulle lämplig hanterare automatiskt anropas när ny text var tillgänglig. Eftersom den faktiska datan från sådana enheter tenderar att vara flerdelad, inte något enkelt som en sträng eller ett nummer, lade realtidsbiblioteket också till möjligheten att definiera STRUKTURER som sedan kunde läsas eller skrivas som en atomenhet. Dessa lästes och skrevs sedan med IN FROM och OUT TO , eller om data delades , de annars liknande GET FROM och PUT TO .

Även om många realtidsprogram kan modelleras som ett system som helt enkelt svarar på externa händelser, är det också vanligt att själva programmet regelbundet postar dessa händelser. För detta lade Full till START- kommandot och tillhörande WAIT som skulle pausa körningen under en given FÖRDRÖJNING (ett antal sekunder) eller TID (en explicit tid på dagen) eller tills en HÄNDELSE sågs.

ECMA vs. ANSI

Standarden var så komplex och svår att implementera att ECMA delade upp den i två: ECMA BASIC-1 och ECMA BASIC-2. BASIC-1 inkluderade en del av filmanipuleringssystemet men saknade undantagshanteringen, medan BASIC-2 lade till hela uppsättningen filkommandon, fast decimal matematik och undantagshanteringssystemet. Dessutom, i BASIC-1 var alla grundläggande nyckelord som PRINT reserverade ord som förenklade tolken, medan de i BASIC-2 följde ANSI-mönstret och kunde användas inom användarskapade subrutiner och funktioner.

Anteckningar

Citat

Bibliografi

Vidare läsning

externa länkar

  • Decimal BASIC - en relativt komplett implementering av Full BASIC och dess grafikmoduler