At lave sin egen maskinekode/interpreter/compiler

Tags:    programmering

<< < 12 > >>
Hej Udvikleren.

Jeg har igennem flere år drømt om at rode med maskine kode og lave mit eget sprog.

Fordelen ved at kunne lave maskine kode, er jo at man kan tage alle slags maskine afviklende apperarter og kode, som man har lyst.

Derfor søger jeg lidt hjælp til at komme igang med bare at forsøge at lave mit eget Scripting Language eller min egen interpreter/compiler.

Jeg har nogle grundlæggende idé'er om hvordan det skal laves og bruges, men, alligevel er jeg en smuuuuule lost omkring hvordan jeg skal starte op.

Sådan rent basalt, skal den vel kunne nogenlunde det som det script sprog jeg bruger til hverdag (PHP), jeg har vel bare nogle idé'er til at lave om på det, og nogle forslag til forbedringer.

Dog vil jeg skære det ned til en start, den skal bestå af blandt andet funktionen print som fortæller at det er noget der skal vises på skærmen og ikke bare køre i baggrunden, også skal der være mulighed for at lave if sætninger, og fortælle hvornår en variabel er en variabel, og ikke mindst hvilken type variabel det er.

Det er det jeg vil starte med, så må resten komme hen af vejen som man får øvet sig på sit eget sprog.

Nogen der kan hjælpe mig med at komme igang med at lave det?
Eventuelt noget grundlæggende, på måske Dansk?

Vigtigst af alt, er at mit Engelsk er begyndt at gå i stå, så jeg forstår ikke så meget af det jeg læser, mere det jeg snakker.

På forhånd tak.



Det er noget af en opgave du har sat for dig selv.

Start med et meget minimalistisk syntaks/features i dit sprog så du ikke går i stå.

Du skal kigge på parsers der tager en kildefil i dit eget sprog og laver om til en datastruktur du kan bruge til at generere resulterende kode fra.

I stedet for at compile direkte til maskinkode, hvertfald første gang, så compile det til C-kode i stedet og så compile C-koden bagefter.



Hej Søren.

Jeg har tænkt lidt over det siden jeg postede den første post i denne tråd, og jeg er stadigvæk i tvivl om hvordan jeg skal komme igang.

Det jeg skal er vel egentligt at lave en simpel kode, der kan forstås af en C kode, også compile?
Men, det var vel også det du sagde?



Hvis dit sprog f.eks. ser sådan her ud (læg mærke til der ikke er faste typer på, ligesom php):

Fold kodeboks ind/udKode 



Så skal du parse dette til en eller anden data struktur. Fra den kan du så generere noget C-kode f.eks.:

Fold kodeboks ind/udKode 


Men det er ikke nogen nem eller lille opgave.

Du bliver nok nød til at læse nogle bøger (på engelsk).



Indlæg senest redigeret d. 20.02.2011 11:38 af Bruger #14645
Det er en meget klassisk opgave (eller var det) på datalogi-studiet. Måske kunne du finde nogle lærebøger derfra om emnet?



Jeg har lige kigget den her serie igennem, og selvom den er på engelsk, ser den meget lovende ud.

http://compilers.iecc.com/crenshaw/



Måden du spørger antyder, at du ikke er klar til denne type opgaver. Det er utroligt komplekst, at lave sin egen parser/oversætter/fortolker. Men hvis du mener det, så læs evt. "Domain Specific Languages" (http://www.amazon.com/Domain-Specific-Languages-Addison-Wesley-Signature-Fowler/dp/0321712943 ), som er én af de bedre på området.

Start med simplere sprog, som konfigurations filer og lignende...matematiske udtryk. Det er rimeligt overkommeligt.



Indlæg senest redigeret d. 20.02.2011 16:55 af Bruger #2695
Hej alle sammen.

Robert: Hmm, så inten rode med en del conf's eller læse bogen? Det er dit forslag?

Emil: Kiggede lige hurtigt på linket, men, det gav nok ikke helt så meget mening endnu.

Søren: Tak for kodeforslaget, det ser simpelt ud, kan bare ikke helt se hvordan den skal forstå det forskellige.. :-/



Jeg har lavet mange af disse projekter. Det seneste, jeg lavede, var et 'matematiksprog,' der var utrolig nyttigt til at lave matematik.

Syntaksen var som følger:

n = 9
skaf_kvadratrod(x) = x^0.5 // eller = sqrt(x), sqrt var en af flere indbyggede funktioner
@skaf_kvadratrod(n) // udskrev 3

Det er dog ikke helt det samme, eftersom det ikke generede og kompilerede kode, men blot eksekverede 'programmet' direkte. Men jeg har lavet lignende i C#, hvor syntaksen blev oversat til MSIL og den kode blev så kompileret med ILASM.EXE. Det er egentlig ikke skide indviklet, og det er super sjovt og spændende. Her er et tip: start med at lave et sprog, hvor alle instrukser hverisær optager én linje. Så kan du løbe alle linjer igennem, og hver gang, du evt. når til 'tal = 3' opretter du en variabel i hukommelsen ved navn tal med værdien 3. Så kan du også indbygge nogle 'iboende' funktioner, eksempelvis print, og kode deres formål. Som sagt vælger jeg normalt C# til dette, selvom C nok er en anelse bedre egnet til formålet. Det kommer an på, hvordan man ser på sagen.

Et eksempel (C#) på, hvordan du kan gemme 'variabler' oprettet i dit sprog:

struct Variable {
string Name;
object Value;
string Type;
}

List<Variable> _vars = new List<Variable>();

.. og inde i parseren (ultra-simpelt eksempel):

if (kode == "x=7") {
Variable v = new Variable();
v.Name = "x";
v.Value = 7;
v.Type = "integer";
_vars.Add(v);
}

Det skal naturligvis ikke hard-codes på den måde, men blot et eksempel. Dog skal det lige nævnes, at jeg tror, det er en større udfordring at lave et script-sprog end et... øhh... 'rigtigt' programmeringssprog, eftersom du ikke kun skal have den til at forstå syntaksen, men også have den til at spille sammen med serveren og sende det rigtige output tilbage til klienten.

Held og lykke med det!



Robert: Hmm, så inten rode med en del conf's eller læse bogen? Det er dit forslag?


Ja, at starte med at bygge et sprog som skal oversættes til maskinkode er et enormt spring...du skal også sætte dig ind i et filformat som er eksekverbart (PE/ELF/a.out/whatever), eller operativ system funktioner til at ændre permissions på hukommelse, hvis du vil eksekvere den genererede maskinkode direkte. Det er meget komplekst.

Start med at parse noget i denne stil:
Fold kodeboks ind/udKode 


Når du kan det, så find ud af, hvordan du vil understøtte anførselstegn i tekst strenge (måske med escapes).
Når det fungerer, kan du så udvidde med lidt simpel processering:

Fold kodeboks ind/udKode 


...og så videre.

Det er en god øvelse, men hvis du tager det store spring, så falder du nok for hårdt. Når du kan parse ovenstående, så læs bogen og lav noget mere avanceret.



Jeg har aldrig været skør nok til at bruge disse:

http://dinosaur.compilertools.net/

Men været uheldig nok til at skulle gennemlæse en fortolker skrevet i dem.

Det kan varmt anbefale ikke at gøre det, men er ret sikker på at du kan skrive en oversætter/fortolker, der kan hvad du vil.



<< < 12 > >>
t