Žƒ ƒ Ž Ž ˆ ƒ ƒ ƒ Žƒ ƒ Ž ˆ Œ ŽŽ ƒ Backcode Jonathan Crusoe TDP019 Projekt: Datorspråk Linköpings universitet
Innehållsförteckning 12-05-29 Inledning... 3 Användarhandledningen... 4 Klasser... 4 Metoder... 4 Main-klass och main-metod... 6 Objekt... 6 Deklaration av en objekt i en metod... 6 Deklaration av objekt i klass... 6 Tilldela värde av objekt... 6 Funktionsanrop hos objekt... 6 Metodanrop... 8 Uttryck... 8 If-satser... 8 While-loop... 9 For-loopen... 9 Exempel: Hello World... 10 Hello World till Ruby... 10 Exempel: Klasser... 11 Systemdokumentation... 12 BNF-Grammatik... 12 Parserregler... 13 Systemet... 13 Programkoden... 13 Syntaxträd... 18 Klasser för språket... 18 Reflektion... 25 Appendix 1: Fortsatt utveckling... 26 Appendix 2: Exempel program... 26 Klass Test... 26 While loop... 27 If sats... 27 For loop... 29 Litet Spel... 29 Appendix 3: Kod... 34
Inledning När man lär sig ett programmeringsspråk kan man tycka att det är enkelt och borde inte vara en alltför stor utmaning. Något man lärt sig snabbt genom åren som datoranvändare och programmerare är att även de lättaste sakerna kan vara väldigt svåra att förstå och genomföra. Backcode är ett programmeringsspråk utvecklat av mig, och som arbetades med under våren 2012. Språket är väldigt lätt och har inte alltför många avancerade funktionaliteter. Eftersom jag översätter min kod till Ruby, kan du använda många klasser och funktioner som det språket använder. Backcode är objektorienterat. Tanken är att nybörjare ska finna språket lätt även om installation och uppstart av det kan vara lite svårare. Det här är ett projekt på IP-programmet, i kursen TDP019 Projekt: datorspråk. 3
Användarhandledningen Vi kommer anta att du redan från början har Ruby installerat på din dator och vet hur man skriver och kompilerar Rubykod. Kodfil namngivningen ska följa standarden hos operativsystemet utan några speciall tecken och ett fil slut på.bs. Om du inte vet vart du kan få tag på Ruby kan du följa denna länk för mer infromation: ruby-lang.org Starta Ruby och ladda in filen Parser.rb. Därefter skriver du BackCode.new.RunFile filens namn för att köra kodfilen. Om du gjort allt rätt kommer den konvertera och evaluera koden utan felmeddelanden. Texter skrivna efter // är kommentarer i koden och kommer inte köras när du kör koden. En kommentar gäller endast till radslut. Nyckelord kommer vara skrivna i fet stil. Klasser Klasser har följade syntax: class name begin //Funktioner, Variabler end name; Name i början och slut måste vara densamma, annars kommer du få ett felmeddelande. Innanför begin och end skriver du funktion- och variabeldeklarationer. Notera att klassen avslutas med ; och räknas som ett nyckelord. Metoder Metoder har följande syntax: access function typ Name ([parametrar,...]) begin //Funktionsanrop, Variabel deklarationer, return och mera. end; Access kan vara public, private, protected, vilka alla tre är nyckelord. I denna version är access endast en dekoration som senare kommer bära funktionalitet. function måste skrivas med små bokstäver. Typ är den klasstyp du tänker returnera och skriv void fall inget värde ska returneras. I denna version används return som en kom ihåg-plats och har i slutändan ingen påverkan på koden. Om returtypen ej är void ska du ha return i metoden och returnera ett värde. Typ kontroll sker ej. Name är namnet på funktionen. Du kommer använda det när du vill anropa funktionen. ([parametrar,...]) är olika parametrar som du ger till funktionen. Om du inte ska ge in några argument skriver du (). Om du vill att metoden ska ta emot argument med någon data kan man skriva (Integer i) för en eller (Integer i, String j,, Integer x) för flera. Just nu är typen före namnet på variabeln bara där för kosmetiskt utseende men kommer bära funktion i framtiden. Men viktigt är att du skriver ditt typen annars kommer det inte kompilera. Mellan begin och end; så skriver du kod. Notera att metoden avslutas med ;. return variabel; 4
return metodanrop; Returns syntax. Först nyckelordet return sen variabel eller metodanrop. 5
Main-klass och main-metod Main-klassen och main-funktionen är grundkrav för att du ens ska kunna köra ett program i det här språket. Viktigt att du kommer ihåg det! Main är ett nyckelord. Syntax: class Main begin public function void Main () begin //Kod end; end Main; Objekt Skriv @ före objekt alias för att nå klassvariabler. I objekt alias får det ej förekomma siffror. Deklaration av en objekt i en metod (argument) to klass i; (argument) kan vara från () till (argument,, x) men antalet parametrar ska stämma överens med antalet i funktionen som anropas, skriven i klassen man deklarerar objekt av. Initialize ska skrivas som en helt vanlig funktion, men den körs varje gång du skapar en ny instans av en klass. Deklaration av objekt i klass access typ namn; Skillnaden mellan klass- och metoddeklaration av variabel är rätt stor. I klass tilldelar du aldrig något värde till variabeln, utan du säger bara att den finns. Om du vill använda den i någon funktion kom ihåg att skriva @ före namnet på variabeln. access kan vara public, private och protected men är nu bara kosmetiskt. typ är klassen av variabeln. namn är namnet på variabeln du skapar. Tilldela värde av objekt (x) to i; Värde x tilldelas till objekt i. I andra språk så som c++ kan det här efterliknas med i = x. Funktionsanrop hos objekt (parametrar) metod i; (parametrar) kan vara från () till (parametrar,, x) beroende på hur initialize är skriven i klassen man deklarerar objekt av. metod är namnet på metoden du vill använda och i är objektet du använder den på. 6
Metodanrop ( Hello ) out IO; //Skriver ut Hello i terminalen. (x) in IO; //Läser in ett värde från användaren till x. (5) to Integer x; // x är nu en Integer med värdet 5. (5) add x; //Lägger till fem på x. x = 10 (2) sub x; //Drar bort 2 på x. x = 8 (4) mul x; //Multiplicerar 4 på x. x = 32 (2) div x; //Dividerar x med 2. x = 16 (((5) add 4) sub 5 ) add x; // (x + (5 (4 + 5))). x = 12 () funk x; //Anropar metod funk hos x; () funk @x; //Anropar metod funk hos klassvariabel x; Några avancerade metodanrop och exempel. Uttryck 0 == x //returnerar falskt. true && true //returnerar sant. x!= 13 //returnerar sant. x <= 5 //returnerar falskt. x >= 5 //returnerar sant. x < 100 //returnerar sant. x > 100 //returnerar falskt. false && true //returnerar alltid falskt. Exempel på några relationsuttryck. Sen förut har x värdet 12. If-satser If-satser har lite mer komplex syntax än de tidigare kodstycken vi arbetat med. if ( relationsuttryck ) begin //kod end; if ska skrivas med små bokstäver och är själva starten av satsen. Mellan parenteserna skriver du ett relationsuttryck som kan vara just det eller ett metodanrop som returnerar ett sanningsvärde. Sen begin, en massa kod och till sist end med ; efter sig för att vissa att du avslutar satsen. if ( relationsuttryck ) begin //kod end else begin //kod end; If-else satsen börjar som en if-sats men om relationsuttryck returnerar falskt kommer koden efter else att köras. Notera att else har end före sig och begin efter sig. if ( relationsuttryck 1 ) begin //Block 1 7
end elsif ( relationsuttryck 2) begin //Block 2 end; Relationsuttryck 1 Relationsuttryck 2 Block som körs FALSKT SANT BLOCK 2 SANT - BLOCK 1 FALSKT FALSKT -* * Har du en else efter så kommer dens block köras. If-elsif satsen börjar som en if-sats. Men har elsif istället för att avslutas. Notera även här att elsif har end och begin efter sig och avslutas med ;. Man kan även upprepa flera elsif efter varandra. if ( relationsuttryck 1 ) begin //Block 1 end elsif ( relationsuttryck 2 ) begin //Block 2 end elsif ( relationsuttryck x ) begin //Block x end; Exempel på en lång gående else-if-sats. Mer exempel kan du hitta i del 2 av billagan. While-loop while ( relationsuttryck ) begin //kod end; While-loopen kommer köra koden mellan begin och end tills relationsuttrycket, som kan vara just det eller ett metodanrop som returnerar ett sanningsvärde, returnerar falskt. Exempel på while-loopen kan hittas i del 2 av billagan. For-loopen for(funk1; funk2; funk3) begin //kod end; For-loopen är en mer komplex form av while-loopen. funk1 körs innan loopen startas. funk2 är ett relationsuttryck och så länge det returnerar sant så fortsätter loopen köras. funk3 körs i slutet av varje loopvarv. Koden mellan begin och end körs tills funk2 returnerar falskt. Exempel på for-loopen kan hittas i del 2 av billagan. 8
Exempel: Hello World BackCode-kod class Main begin public function void Main () begin ( Hello World\n ) out IO; end; end Main; Rubykod Žƒ ƒ ˆƒ ŽŽ Ž ƒ ƒ ƒ ƒ Simpelt Hello World program. Till vänster har du kod ur detta språk och till höger har du koden konverterad till Rubykod. Hello World till Ruby Jag använder mig utav BackCode-koden ovan. Efter att jag skrivit koden och startat konverteringen. Är det första steget att blocka ut tockens. Tockensen som blir från koden är: class, Main, begin, public, function, void, Main, (, ), begin, (, Hello World\n, ), out, IO, ;, end, ;, end, Main, ; De i fet still görs om till symboler i Ruby. Tokensen parsar jag igenom med de regler jag skrivit för språket och börjar arbeta ihop ett syntaxträd från botten och upp. Första träffen jag får är på regeln för hur en klass(text i kursiv stil är fördjupad regel): Class, Main, Klass Block, Main, ;. Punkterna är tokens emellan. Main och Main. Nästa träff är regeln för klass block: begin, Klass deklarationer, end, ; Den ända klass deklarationen som hittas är en funktions definition: public, function, void Main, (,), block I block hittar vi ett metodanrop: (, Hello World\n,),out,IO, ;. Nu bygger jag ihop en träd via objekt där det finns ett klass för nästan varje regel som pekar på sina barn. Klass Klass block Klass deklarationer Funktions definition Block Metodanrop. Jag kallar på To_Ruby hos Klass objektet och då startas en rekursiv event där jag omvandlar objektens betydelse till Ruby kod i en sträng och till sists lägger jag på: main = Main.new main.main Det rekursiva börjar i det objekt som är längst ner till säga metodanropen. 9
Exempel: Klasser BackCode-kod Žƒ ƒ Ž ˆ ƒž œ š ƒ Ž ˆ ƒ ƒ ƒ ƒ ƒ ƒ Žƒ ƒ Ž ˆ ƒž œ Ž ˆ ƒ ŽŽ ƒ ƒ Ž ˆ ƒ Rubykod Žƒ ƒ ˆ ƒž œ ˆƒ ŽŽ Žˆ ƒ ƒ ˆ Žƒ ƒ ˆ ƒž œ ƒ š ˆ ƒ ƒ ƒ ƒ ƒ ƒ ƒ ƒ ƒ Notera att ordningen på klasserna blir omvänd så att main körs först. 10
Systemdokumentation I min kompilator så konverterar jag min kod till Ruby för att sedan köra den. Sluttanken är att man lätt ska kunna lägga in fler metoder så att språket kan översättas till andra språk. Just nu hanterar kompilatorn endast Backcode till Ruby med inga former av fel kontroller. När jag konverterar mitt språk till Ruby så börjar längst ner och plockar sedan ihop alltihop till en sträng som jag sedan evaluerar med Ruby. Men mer om det längre ner. BNF-Grammatik Nyckelord kommer vara skriva i halv fet stil. ƒ Žƒ ˆ ƒ Žƒ ˆ Žƒ ˆ Žƒ ˆ Žƒ Ž ˆ Žƒ Ž Žƒ Ž ƒ Žƒ Ž ƒ ˆ ˆ Žƒ Ž ƒ ƒ ˆ Žƒ Ž ƒ ƒ ˆ ˆ ˆ ˆ ˆ ƒ ˆ ˆ ƒ ƒ Ž ƒ ˆ ˆ Ž ƒ ƒ ˆ ƒ ƒ ˆ ƒ ƒ ˆ ˆ ƒ ƒ ˆ ƒ Ž ƒ Ž ƒ ƒ ƒ ƒžž ƒ ƒžž ƒ ƒžž ƒ ˆ ƒ Š Ž ˆ ˆ ƒžž ˆ ƒ ˆ ˆ ƒžž Ž Ž ˆ ƒ ˆ ˆ ƒžž Ž Ž ˆ ƒ Ž Ž Ž ˆ ˆ ƒžž Ž Ž ˆ ƒ Ž ˆ ˆ ƒžž Ž Š Ž Š Ž ˆ ƒžž Ž ˆ ˆ ˆ ƒžž ˆ ƒžž ˆ ƒžž Ž ˆ ƒžž ˆƒ ˆ ˆ ƒžž ˆ ˆƒ ˆ ˆ ˆƒ ˆ ˆƒ ˆƒ ˆƒ ˆƒ ˆƒ ˆƒ ˆƒ ˆ ˆ ƒ ˆˆ ƒ ƒ ƒ Ž Œ ŽŽ ƒ ƒ ˆ ƒ Žƒ ß Œƒ Š Ž ƒ ŽŽ ŽŽƒ ŽŽŠß ƒž 11
Parserregler Systemet Jag börjar med att ta ut tokens ur källkoden där jag förvandlar vissa direkt till nyckelords klasser och andra till rena strängar. Jag tar bort alla mellanrum och radbrytningar. Sedan skickas listan med token till parsen, som bygger upp det till ett syntaxträd och via trädet så översätter jag mitt språks kod till Ruby. Sist så lägger jag till skapelse av Main klassen och anrop av dess metod Main och sen evaluerar jag Ruby koden. Jag följer helt enkelt: tokens reguljära uttryck parserregler BNF körning av to_ruby eval av sträng. Programkoden Ž ƒ ˆ ˆ Š Ž Š Ž ˆƒŽ ˆƒŽ Žƒ Žƒ Ž Ž Ž ˆ Ž ˆ ˆ ˆ ˆ ˆ Ž 12
13 ƒ ƒ ƒ Š Žƒ ˆ ƒ Žƒ Žƒ ƒ Žƒ Žƒ ƒ Š Žƒ ˆ Žƒ ƒ Žƒ Žƒ Ž Žƒ ˆ ƒ Š Žƒ ˆƒ Žƒ Ž ˆƒ Ž Ž Žƒ Ž ƒ Ž Žƒ Ž ƒ Š Žƒ Ž Ž ƒ Š Žƒ Ž ƒ Ž Žƒ Ž Ž Ž Žƒ Ž ƒ ƒ Š ˆ ˆ Ž Žƒ Ž ƒ ˆ ˆ š ˆ ƒ Š ƒ ˆƒ ˆƒ Ž Žƒ Ž ƒ ƒ ƒ Žƒ ƒ ƒ Ž ƒ ƒ ƒ Š ƒ ˆƒ ˆƒ Ž ƒ ƒ Žƒ ƒ ƒ Ž ƒ ƒ ƒ Š ˆ ˆ Ž ˆ ˆ Ž ˆ ˆ ƒ Š ƒ ˆ ˆ ƒ ƒ Ž ƒ ƒ ƒ Ž ˆ ƒ ƒ ƒ Ž ƒ Š ƒ ˆ ˆ Ž ƒ Ž ˆ ƒ Ž Ž Ž ƒ ƒ ƒ Š ˆ ƒ ƒ ƒ ƒ ƒ ƒ ƒ Š ƒ ƒ Ž ˆ ƒ ƒ ƒ Š ˆ ƒ ƒ ƒ Š ˆ ƒ ƒ ƒ ˆƒ ˆ ƒ ƒ ƒ ƒ ƒ ƒ ƒ ƒ Ž ƒ ƒ Š Ž ƒ Š ƒ ƒ Š Ž Ž ƒ Š ƒ ƒ Ž ƒ ƒ Š Ž
Ž ƒ ƒ Š ƒ ƒžž ƒ ƒ ƒž ƒ ƒ ƒž ƒ Š ƒžž ƒ ƒž ƒ ƒž Ž ƒžž ƒ ƒ Š ˆ ƒ ƒ ƒ ƒ Š Š Ž ƒ ƒ ƒ Š ˆ ƒ ƒ ƒ Š ˆ ƒžž ƒ ƒ ƒ Š ƒž ƒ Ž ƒž ƒ Š ƒ Š ˆƒŽ ˆƒŽ ƒ Š ˆƒ ƒ Š ˆ ƒžž Ž ˆ ƒ ƒ Š ˆ ˆ ƒžž Ž Ž ˆ ƒ Ž š ˆ ƒ ˆ Ž š ƒ Š ˆ ˆ ƒžž Ž Ž ˆ ƒ ˆ Ž Ž Ž Ž ˆ ƒ ƒ Š Ž Ž Ž ˆ ƒ Ž Ž Ž Ž ƒ Š Ž ˆ ˆ ƒžž Ž Ž ˆ ƒ Ž š ˆ ƒ Ž ˆ Ž š ƒ Š Ž ˆ ˆ ƒžž Ž Ž ˆ ƒ Ž ˆ Ž Ž Ž Š Ž ƒ Š Š Ž ˆ ƒžž Ž Ž Š Ž ƒ Ž Ž ˆ ƒ Š ˆ ˆ ƒžž ˆ ƒžž ˆ ƒžž Ž ˆ Ž Ž ƒ ˆ Ž Ž Ž ˆ ƒžž ƒ Š ˆƒ ˆ ƒ ƒžž ƒ ƒ Š ˆƒ ˆ ƒ ƒžž ƒ ƒ Š ˆƒ ˆƒ ƒ ƒžž ƒ ƒ Š ˆ ƒžž ˆ 14
ƒ ƒžž ƒ ƒ Š ˆ ƒžž ˆ ƒ ƒžž ƒ ƒ Š ˆƒ ƒ ƒžž ƒ ƒ Š ˆƒ ƒ ƒžž ƒ ƒ Š ˆ ƒžž ƒ ƒžž ƒ ƒ Š ƒ ˆ ƒ Š ˆƒ ƒ ˆ ƒ ƒžž ƒ ƒ ƒ Š ˆƒ ˆ ƒ ƒžž ƒ ƒ Š ˆƒ ˆ ƒ ƒžž ƒ ƒ Š ˆƒ Ž ˆ ƒ ƒžž ƒ Ž Žˆ ƒ Š ˆƒ Ž ˆƒ ƒ Ž š ƒžž ƒ Ž š ƒ ƒ ˆ ƒžž ƒ Žƒ ƒ Š ˆƒ ˆ ˆ ƒ ƒ ˆ ƒžž ƒ ƒ ˆ ƒ Š ˆƒ ˆ ƒ ƒ ˆ ƒžž ƒ ƒ ˆ Ž ƒ ƒ Ž ƒ Š ˆ Ž ˆƒ ƒ Š ˆƒ ƒ ƒ ƒ Š Ž ˆƒ ƒ Š ˆƒ ƒ ˆƒ ƒ ƒ ƒ ƒ ƒ Š ˆƒ ƒ ƒ Ž ˆƒ ƒ Š ˆ ƒ Š ƒ Š ƒ Š Ž ƒ Ž ƒ Š Ž ƒ Ž ƒ 15
ƒ Š ƒ ƒ Ž ƒ Š Ž ˆ ƒ Š Syntaxträd Pilarna ska föreställa flöde upp mot program. Klasser för språket Žƒ ˆ ˆ ƒž œ ƒ ƒ ƒ
17 ˆƒ ƒ Žƒ ƒ ˆ ƒž œ Žƒ ƒ ƒ Ž ˆ ƒž œ Žƒ ƒ ˆ Žƒ ƒ Žƒ ƒ ˆ ˆ ƒž ˆŽƒ ƒ Žƒ ƒ ˆ ˆ ˆ ˆ ƒž ƒž ƒž ˆƒŽ ƒž Žƒ Ž ˆ ƒž œ Ž Ž Ž ˆ Ž Žƒ Žƒ ˆ ƒž œ Ž ˆ Š Žƒ ƒ ƒ ƒ Š ƒ Žƒ ƒ Ž Ž
Ž Žƒ ƒ Žƒ ƒ ƒ ˆ ƒž œ ƒ Ž ƒ ƒ š ˆ š Ž ƒ ƒ š Žƒ ˆ ˆ ƒž œ ƒ ƒž ƒ ƒ ƒ Ž Ž ƒ ƒ ƒž ƒž ƒ ƒ ƒ ƒ ƒ ƒ Ž Ž š ˆ š ˆ š Ž Š š Žƒ ƒ ƒ Ž š ˆ ƒ ƒ Ž ƒ ƒ Ž Ž ˆ ƒ ˆ š Ž š 18
19 Žƒ Žƒ ƒ ƒ Ž ˆ ƒž œ ƒ ƒ Ž ƒ ƒ ƒ ƒ š ˆ š ˆ š Ž Š š Žƒ ƒ ƒ Ž š ƒ ˆ š Ž š Žƒ Žƒ Ž ˆ ƒž œ ˆ ˆ ˆ ˆ Ž Žƒ Ž ˆ ƒž œ
ƒ ƒ Ž ƒ ˆ ˆ ˆ ˆ ƒ ƒ ƒ Ž ˆ Ž Žƒ ƒ ˆ ƒž œ Ž š ˆ š Ž š Žƒ ˆ ƒ ˆ ƒž œ ƒ Ž ƒ Ž Ž ƒ ƒ Ž ƒ Ž ƒ Ž Ž š Ž ˆ Ž ƒ Žƒ š Ž 20
21 Ž ˆ ƒ ˆ ˆ š Ž ˆ Ž ƒ Ž Ž ˆ Ž ƒ Ž š Ž ˆ ƒ Ž ˆ ˆ š Ž Ž ˆ Ž ƒ Ž Ž Ž ˆ Ž ƒ Ž š Žƒ Š Ž ƒ ˆ ƒž œ Ž ƒ Ž Ž ƒ Ž ƒ Ž Ž Š Ž Ž ƒ Ž Žƒ ƒ ˆ ƒž œ ˆ Ž Ž ˆ ˆ Ž Ž Ž Ž ˆ Š Ž Ž Ž Žƒ ˆ ƒž œ ƒž ƒž ƒž ƒž Žƒ ƒžž ˆ ƒž œ ƒž ˆ ƒ ƒž ƒž
22 ˆ ˆ ƒ ƒ ˆ š Ž š ˆ Ž ˆ ƒ ˆ ˆ ƒž Ž ˆ ˆ ƒž ˆ ˆ ƒžž ƒ Žƒ ˆ ƒž ƒ ƒ ƒž ˆ ƒ ƒž Ž ƒ ƒž ˆ ˆ ƒ ƒ ƒ ƒž Ž ˆ ˆ ƒ ƒ ƒž Ž ˆ ˆ ƒ ƒ ƒž Ž ˆ ˆ Ž ƒ ƒ ƒž ˆ ˆ ƒž ƒ Ž ˆ ˆ ƒž ƒ Ž ˆ ˆ ƒž ƒ Ž ˆ ˆ ƒž ƒ Ž ˆ ˆ
ƒž ƒ Ž ˆ ˆ ƒž ƒ ˆ ƒ Žˆ ˆ ƒž ƒ ˆ ƒž Žƒ ƒ ˆ ƒž œ Žƒ ƒ ˆ Žƒ Žƒ ˆ Žƒ Ž ˆ š Žƒ š Reflektion Att göra ett eget programmeringsspråk var inte lika lätt som jag trott från början och jag har förstått några av de svårigheter man kan stöta på när man utvecklar ett språk. Störst var att parsningen blandade ihop flera olika regler så jag vart tvungen att tänka om på några grammatiska regler, som visade sig bli en riktigt utmaning. Den lättaste utmaningen var att få ner allt till kod och test köra det och var även den roligaste biten. Jag önskar jag hade haft mer tid på att arbeta på språken innan inlämning för en del saker behöver finslipas och göras bättre så som public, private och protected delarna. Projektet i sig har varit väldigt lärande och något jag känner att jag kommer kunna använda i framtiden speciellt när man ska ta fram lite mer avancerade skript till spel/program man utvecklar. 23
Appendix 1: Fortsatt utveckling Flera delar fungerar just nu bara som kosmetiska utseenden. De jag syftar på är i funktions definitionen där parametrarna kan ta in vad som helst fast de bara borde kunna ta in angiven typ. Public, private och protected är också bara kosmetiska och behöver tas in i koden så att de kan ge någon viktigt. Första utvecklingen från nu blir att lägga in felsökning av programmet via det syntaxträd som bygds upp och sedan lägga in så att public, private och protected bär något värde. Även om arv inte ännu finns så kan det i alla fall vara bra om man har en fungerande grund för kommande utveckling. Appendix 2: Exempel program Klass Test BackCode-kod Žƒ ƒ Ž Ž ˆ ƒ ƒ ƒ Žƒ ƒ Ž ˆ Œ ŽŽ ƒ Ruby-kod Žƒ ƒ ˆ Œ ŽŽ Žƒ ƒ ˆƒ ƒ ƒ ƒ ƒ ƒ 24
25 While loop BackCode-kod Žƒ ƒ Ž ˆ ƒ Š Ž ŽŽ ƒ Š ƒ Ruby-kod Žƒ ƒ ˆƒ Š Ž ŽŽ Š ƒ ƒ ƒ ƒ If sats BackCode Žƒ ƒ Ž ˆ ƒ ˆ
26 Ž ˆ Ž ˆ Ž ˆ Š Ž Š Ž ƒ Ruby-kod Žƒ ƒ ˆƒ ˆ Ž ˆ Ž ˆ Ž ˆ Š Ž Š Ž ƒ ƒ ƒ ƒ
For loop BackCode-kod Žƒ ƒ Ž ˆ ƒ ˆ ƒ ŽŽ ƒ Ruby-kod Žƒ ƒ ˆƒ Š Ž ŽŽ ƒ ƒ ƒ ƒ Litet Spel BackCode-kod Žƒ ƒ Ž ˆ ƒ Žƒ ƒ Š ƒ ƒ ƒ ƒ ƒ Š Ž Ž ŽŽ Žƒ ˆƒ ƒ ƒ ƒ ƒ ƒ 27
ƒ ƒ Š ƒ Š Š Š Š ˆ Š ƒ ƒ ƒ ˆ Š ƒ ƒ ƒ ƒ Žƒ Žƒ Ž Š Ž ˆ ƒž œ Š Ž ˆ Ž Ž ˆ Š Ž ˆƒŽ Ž ˆ ˆƒ Šƒ Š Š Ž ˆ Ž ˆ ƒ ƒ Š Žƒ Žƒ ƒ Ž ˆ ƒ Œ ˆ Œ ƒ Š 28
Ž ˆ Œ š Ž ˆ Œ š Ž ˆ Œ š ƒ Ruby-kod Žƒ ƒ ˆ ƒ Œ ˆŒ ƒ Š Ž ˆŒ š Ž ˆŒ š Ž ˆŒ š Žƒ Žƒ Š ˆ ƒž œ Š ˆ Ž ˆ Š Ž ˆƒŽ ˆ ˆƒ Šƒ Š Š Ž ˆ ˆƒ ƒ Š Š 29
30 Žƒ ƒ ˆƒ Žƒ ƒ Š ƒ ƒ ƒ ƒ ƒ Š Ž Ž ŽŽ Žƒ ˆƒ ƒ ƒ ƒ ƒ ƒ ƒ ƒ Š ƒ Š Š Š Š ˆ Š ƒ ƒ ƒ ˆ Š ƒ ƒ
ƒ ƒ ƒ ƒ 31
Appendix 3: Kod ˆ Š ˆ Ž ˆ Š ƒ ˆ Š ŠŠƒ Ž ˆƒŽ ƒž ƒ ƒ Šƒ ƒ ƒ ƒ ˆ ƒ ˆˆ ƒ Ž Žƒ Ž Ž ƒ Š Š Š Ž Š ˆ Š ƒ Žƒ Ž Š Ž ƒ Š ƒ ƒ ƒ Š ƒ ƒ ƒ Š ƒ Š ƒ Ž ˆ ƒž œ ƒ ƒ Ž ƒ Ž Š ƒ ˆ Š š Š Ž ƒ Š ƒ ƒ Š ƒ Ž ƒ š Š Š ƒ ˆ Š ƒ Š Œ ƒ ƒ Š Š Ž ƒ ƒ ƒ Š ˆ ƒ Š Ž ƒ Š ƒ ƒ Š š Š Ž ƒ Š šƒ Ž ƒ Š ƒ ƒ Š ƒ ƒ Š Š ˆ Š š ˆ ƒ Š ƒ Ž ƒ Š ƒ Š ƒ Ž ˆ Š ƒ Ž ˆ Š ƒ Š Ž ˆ ˆ ƒ ƒ ƒ Š ˆ Ž ƒ Š ƒ Š Ž ƒ Š ƒ Š ˆ ƒ Ž ˆ ƒ Š ˆ ƒ ˆ ƒ Š Ž ƒ Š ƒ Š Ž ˆ ƒ Š Ž Ž Ž Ž ƒ Š Ž ƒ Š ƒ Š Ž ƒ Š Ž ˆ Ž Ž ƒ Š Ž Ž 32
ƒ ƒžž ƒ Š ƒ ˆ Š Ž ˆ ƒ Š ƒ Š Ž Ž ƒ Š Ž Ž ƒ Š Š ˆ Š ƒ ƒ ƒ ƒ Š ƒ Š ƒ Š Ž ƒ Ž ƒ ƒ Žƒ Ž Ž ˆ ƒž ƒ š Ž Ž Ž ƒ Š Š Š ƒ ˆ Š ƒ Š Š ƒ š ƒ Š ƒ ƒ Š Š š š ˆ Š ƒ ƒ Š Ž ˆ ƒ Š Ž ƒ ƒ ˆ ƒ Ž Ž ƒ Ž ƒ ˆ Ž Žƒ Ž Ž Ž ƒ Ž ƒ Š ƒ ƒ Š ƒ š Ž Š Š ƒ ƒ ˆƒ Ž Š Ž ƒ š ˆ Ž ˆ Ž ƒ Š Ž ƒ Š ƒ Š ƒ ƒ ƒ Š ƒ Ž ƒ ƒ Š ƒ Ž ƒ Š ƒ ƒ ˆ Ž ƒ ƒ Ž Ž Ž ƒ ˆ Ž ˆ ƒ Š Ž ƒ Š Ž ƒ Š Ž ƒžž Ž Ž ƒ Š Ž Ž Ž ƒ ƒ ƒ ƒ Š ƒ ƒ ƒ ƒ Š Ž Ž ƒ Š Ž Ž ƒ Ž ˆ Š Ž ƒ Š Š Ž ƒ Š ƒ ˆ Š Žƒ ƒ Š 33
34 ƒ ƒ ƒ Š Ž Žƒ ƒ ƒ ƒ ƒ ƒ Ž Ž Žƒ ƒ ˆ ƒž œ Žƒ ƒ ƒ Ž Ž Ž š Ž ƒ Ž Žƒ ƒ ƒ Žƒ ƒ ƒ ƒ ƒž Ž œ Š ƒžž ˆ œ Ž Ž Ž ƒ ˆ Š ƒž ˆ Žƒ ƒ ƒ Š ˆ š ˆ ˆƒ Ž Šƒ š ƒ ƒ ƒ Ž Ž š Ž Ž š ƒ ƒ Š ƒ ƒ Š Š Žƒ š ˆƒ Šƒ ƒ Š Š ˆ ˆ ƒ Š Ž ƒ Š Ž ƒž ƒ Š š Š Ž ƒ ƒ Š Š Ž ƒžž ƒ Š ˆ Ž Š ƒ Šƒ Š Š ˆ Š ƒ Š ƒ Š Ž Š ƒ ƒ Š Š š ˆƒŽ ˆ ƒ Ž ˆ ƒ Ž Š ƒ Š ˆ ƒ ƒ ƒžž Šƒ ƒ ƒ œ Š ƒ ƒ Ž ƒ ƒ Š ˆ Š ƒž ˆ
35 ƒ Š ƒ ƒš š ƒ ƒ ƒž ƒ Š Ž ƒ ƒ ˆ Š ƒ ƒ š ƒ ƒž ˆ œ ƒ ƒ ƒ š š Œ ˆ ƒš Ž ˆ š Š š Š ˆ š š ˆ ƒš ƒš š ˆ š ˆ ƒš š Ž Ž ˆ ƒ ˆ Žƒ ƒ ƒ ƒ š ƒ Ž ˆ ƒ Ž Ž š š š ƒ Ž ˆ ƒ ƒ Ž Ž ƒ Ž ƒ Ž ƒ ˆ Ž ƒ Ž Ž Ž ƒ Žˆ Ž ƒ Ž ƒ ƒž Ž Ž Ž ˆ ƒ Š ƒ Ž Ž ƒ Š ƒ Ž
36 Žƒ ˆ ˆ ƒž œ ƒ ƒ ƒ ˆƒ ƒ Žƒ ƒ ˆ ƒž œ Žƒ ƒ ƒ Ž ˆ ƒž œ Žƒ ƒ ˆ Žƒ ƒ Žƒ ƒ ˆ ˆ ƒž ˆŽƒ ƒ Žƒ ƒ ˆ ˆ ˆ ˆ ƒž ƒž ƒž ˆƒŽ ƒž Žƒ Ž ˆ ƒž œ Ž Ž Ž ˆ Ž Žƒ Žƒ
37 ˆ ƒž œ Ž ˆ Š Žƒ ƒ ƒ ƒ Š ƒ Žƒ ƒ Ž Ž Ž Žƒ ƒ Žƒ ƒ ƒ ˆ ƒž œ ƒ Ž ƒ ƒ š ˆ š Ž ƒ ƒ š Žƒ ˆ ˆ ƒž œ ƒ ƒž ƒ ƒ ƒ Ž Ž ƒ ƒ ƒž ƒž ƒ ƒ ƒ ƒ ƒ ƒ Ž Ž š ˆ š ˆ š Ž Š š Žƒ ƒ ƒ Ž š ˆ ƒ ƒ Ž ƒ ƒ Ž
38 Ž ˆ ƒ ˆ š Ž š Žƒ Žƒ ƒ ƒ Ž ˆ ƒž œ ƒ ƒ Ž ƒ ƒ ƒ ƒ š ˆ š ˆ š Ž Š š Žƒ ƒ ƒ Ž š ƒ ˆ š Ž š Žƒ Žƒ Ž ˆ ƒž œ ˆ ˆ ˆ
39 ˆ Ž Žƒ Ž ˆ ƒž œ ƒ ƒ Ž ƒ ˆ ˆ ˆ ˆ ƒ ƒ ƒ Ž ˆ Ž Žƒ ƒ ˆ ƒž œ Ž š ˆ š Ž š Žƒ ˆ ƒ ˆ ƒž œ ƒ Ž ƒ Ž Ž
40 ƒ ƒ Ž ƒ Ž ƒ Ž Ž š Ž ˆ Ž ƒ Žƒ š Ž Ž ˆ ƒ ˆ ˆ š Ž ˆ Ž ƒ Ž Ž ˆ Ž ƒ Ž š Ž ˆ ƒ Ž ˆ ˆ š Ž Ž ˆ Ž ƒ Ž Ž Ž ˆ Ž ƒ Ž š Žƒ Š Ž ƒ ˆ ƒž œ Ž ƒ Ž Ž ƒ Ž ƒ Ž Ž Š Ž Ž ƒ Ž Žƒ ƒ ˆ ƒž œ ˆ Ž Ž ˆ ˆ Ž Ž Ž Ž ˆ Š Ž Ž Ž Žƒ ˆ ƒž œ ƒž ƒž ƒž
41 ƒž Žƒ ƒžž ˆ ƒž œ ƒž ˆ ƒ ƒž ƒž ˆ ˆ ƒ ƒ ˆ š Ž š ˆ Ž ˆ ƒ ˆ ˆ ƒž Ž ˆ ˆ ƒž ˆ ˆ ƒžž ƒ Žƒ ˆ ƒž ƒ ƒ ƒž ˆ ƒ ƒž Ž ƒ ƒž ˆ ˆ ƒ ƒ ƒ ƒž Ž ˆ ˆ ƒ ƒ ƒž Ž ˆ ˆ ƒ ƒ ƒž Ž ˆ ˆ Ž ƒ ƒ ƒž
42 ˆ ˆ ƒž ƒ Ž ˆ ˆ ƒž ƒ Ž ˆ ˆ ƒž ƒ Ž ˆ ˆ ƒž ƒ Ž ˆ ˆ ƒž ƒ Ž ˆ ˆ ƒž ƒ ˆ ƒ Žˆ ˆ ƒž ƒ ˆ ƒž Žƒ ƒ ˆ ƒž œ Žƒ ƒ ˆ Žƒ Žƒ ˆ Žƒ Ž ˆ š Žƒ š Žƒ ƒ ˆ ƒž œ
43 ƒ ƒ ƒ ƒ ƒ Ž ƒ ˆ ˆ Š Ž Š Ž ˆƒŽ ˆƒŽ Žƒ Žƒ Ž Ž Ž ˆ Ž ˆ ˆ ˆ ˆ ˆ Ž ˆ ƒ ƒ ƒ Š Žƒ ˆ ƒ Žƒ Žƒ ƒ Žƒ Žƒ ƒ Š Žƒ ˆ Žƒ ƒ Žƒ Žƒ Ž Žƒ ˆ ƒ Š Žƒ ˆƒ Žƒ Ž ˆƒ Ž Ž Žƒ Ž ƒ Ž Žƒ Ž ƒ Š Žƒ Ž Ž ƒ Š Žƒ Ž ƒ Ž Žƒ Ž Ž Ž Žƒ Ž ƒ ƒ Š ˆ ˆ Ž Žƒ Ž ƒ ˆ ˆ š ˆ ƒ Š ƒ ˆƒ ˆƒ Ž Žƒ Ž ƒ ƒ ƒ Žƒ ƒ ƒ Ž ƒ ƒ ƒ Š ƒ ˆƒ ˆƒ Ž ƒ ƒ Žƒ ƒ ƒ Ž ƒ ƒ ƒ Š ˆ ˆ Ž ˆ ˆ Ž ˆ ˆ
ƒ Š ƒ ˆ ˆ ƒ ƒ Ž ƒ ƒ ƒ Ž ˆ ƒ ƒ ƒ Ž ƒ Š ƒ ˆ ˆ Ž ƒ Ž ˆ ƒ Ž Ž Ž ƒ ƒ ƒ Š ˆ ƒ ƒ ƒ ƒ ƒ ƒ ƒ Š ƒ ƒ Ž ˆ ƒ ƒ ƒ Š ˆ ƒ ƒ ƒ Š ˆ ƒ ƒ ƒ ˆƒ ˆ ƒ ƒ ƒ ƒ ƒ ƒ ƒ ƒ Ž ƒ ƒ Š Ž ƒ Š ƒ ƒ Š Ž Ž ƒ Š ƒ ƒ Ž ƒ ƒ Š Ž Ž ƒ ƒ Š ƒ ƒžž ƒ ƒ ƒž ƒ ƒ ƒž ƒ Š ƒžž ƒ ƒž ƒ ƒž Ž ƒžž ƒ ƒ Š ˆ ƒ ƒ ƒ ƒ Š Š Ž ƒ ƒ ƒ Š ˆ ƒ ƒ ƒ Š ˆ ƒžž ƒ ƒ ƒ Š ƒž ƒ Ž ƒž ƒ Š ƒ Š ˆƒŽ ˆƒŽ ƒ Š ˆƒ ƒ Š ˆ ƒžž Ž ˆ ƒ ƒ Š ˆ ˆ ƒžž Ž Ž ˆ ƒ Ž š ˆ ƒ ˆ Ž š ƒ Š ˆ ˆ ƒžž Ž Ž ˆ ƒ ˆ Ž Ž Ž Ž ˆ ƒ ƒ Š Ž Ž Ž ˆ ƒ Ž Ž Ž Ž 44
ƒ Š Ž ˆ ˆ ƒžž Ž Ž ˆ ƒ Ž š ˆ ƒ Ž ˆ Ž š ƒ Š Ž ˆ ˆ ƒžž Ž Ž ˆ ƒ Ž ˆ Ž Ž Ž Š Ž ƒ Š Š Ž ˆ ƒžž Ž Ž Š Ž ƒ Ž Ž ˆ ƒ Š ˆ ˆ ƒžž ˆ ƒžž ˆ ƒžž Ž ˆ Ž Ž ƒ ˆ Ž Ž Ž ˆ ƒžž ƒ Š ˆƒ ˆ ƒ ƒžž ƒ ƒ Š ˆƒ ˆ ƒ ƒžž ƒ ƒ Š ˆƒ ˆƒ ƒ ƒžž ƒ ƒ Š ˆ ƒžž ˆ ƒ ƒžž ƒ ƒ Š ˆ ƒžž ˆ ƒ ƒžž ƒ ƒ Š ˆƒ ƒ ƒžž ƒ ƒ Š ˆƒ ƒ ƒžž ƒ ƒ Š ˆ ƒžž ƒ ƒžž ƒ ƒ Š ƒ ˆ ƒ Š ˆƒ ƒ ˆ ƒ ƒžž ƒ ƒ ƒ Š ˆƒ ˆ ƒ ƒžž ƒ ƒ Š ˆƒ ˆ ƒ ƒžž ƒ ƒ Š ˆƒ Ž ˆ ƒ ƒžž ƒ Ž Žˆ ƒ Š ˆƒ Ž ˆƒ ƒ Ž š ƒžž ƒ Ž š ƒ ƒ ˆ ƒžž ƒ Žƒ ƒ Š ˆƒ ˆ ˆ ƒ ƒ ˆ ƒžž ƒ ƒ ˆ ƒ Š ˆƒ ˆ ƒ ƒ ˆ ƒžž ƒ ƒ ˆ 45
Ž ƒ ƒ Ž ƒ Š ˆ Ž ˆƒ ƒ Š ˆƒ ƒ ƒ ƒ Š Ž ˆƒ ƒ Š ˆƒ ƒ ˆƒ ƒ ƒ ƒ ƒ ƒ Š ˆƒ ƒ ƒ Ž ˆƒ ƒ Š ˆ ƒ Š ƒ Š ƒ Š Ž ƒ Ž ƒ Š Ž ƒ Ž ƒ ƒ Š ƒ ƒ Ž ƒ Š Ž ˆ ƒ Š ˆ š Ž Š ˆ Ž ˆ Ž Ž ˆ Ž ˆ Ž Š Ž Ž ˆ Ž Ž ƒ ƒ ƒ ƒ ƒ ƒ ƒ 46
ƒž ˆŽ ƒ ˆ ƒ ƒ Ž Ž Ž Ž ƒ Ž Ž Ž ƒ Ž ŽŽ Ž 47