[an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive]
 
[an error occurred while processing this directive] [an error occurred while processing this directive]
Skåne Sjælland Linux User Group - http://www.sslug.dk Home   Subscribe   Mail Archive   Forum   Calendar   Search
MhonArc Date: [Date Prev] [Date Index] [Date Next]   Thread: [Date Prev] [Thread Index] [Date Next]   MhonArc
 

Re: [CPROG] Hvordan skrives en compiler ?



"Bjørn Houdorf" wrote:

> Hej SSLUG?er!
>
> Et lille spørgsmål:
> Når man nu kan skrive en  applikation i højnivau-sprog, i hvilket slags
> "programmeringssprog", skriver man så de elementer eller "byggesten" der
> skal bruges til at skabe et programmeringssprog ?
>
> Hvordan skriver man f.eks. en compiler for et programmeringssprog som
> endnu ikke findes til Linux ?
> Skrives en sådan compiler i maskinkode, assembler eller et højniveau-sprog
> som f.eks. C++ ??
>
> Findes der mon noget information om det på internettet ?
>
> Det er sikkert alt for svært for mig nu, men det ville da være interessant
> at vide noget om.
>
> ______________________________________________________
> Get Your Private, Free Email at http://www.hotmail.com

Det er faktisk et rigtig godt spørgsmål!

En oversætter er et program, der som inddata tager et program (kildetekst) i
et source-sprog S, og generer et tilsvarende program, i et target-sprog T.
Oversætteren selv kodes naturligvis også i et programmeringssprog P. I din
situation bør du vælge P således, at du har en P-oversætter i forvejen - dvs
en oversætter fra P til udførbar kode (maskin-kode) skrevet i udførbar kode.
Andre i tråden har allerede beskrevet de problemer, der ligger i at få den
første oversætter (boot strapping)

Du bør nok vælge P som C/C++, men hvis du kender ML, så er dette et rigtig
godt værktøj til denne opgave (mit foretrukne valg).

Ligesom alle andre programmer kan oversættere opbygges på mange forskellige
måder.  Der er dog udviklet nogle værktøjer, der gør opgaven meget mere
overkommelig.

Værktøjet lex/flex anvendes til lave en såkaldt leksikalsk analysator. Man
laver en specifikationsfil, der angive hvilke tokens/terminaler, der er i
sproget. I C++ er følgende tokens: while, void, ; og for.

Desuden kan regulære udtryk anvendes til at beskrive tokens. Ud fra
specifikationsfilen genererer lex et program (i eksempel vis C eller ML), der
kan læse en fil og generere en sekvens af tokens.

Denne sekvens af tokens kan danne inddata for parseren. En parser kan laves
ved hjælp af yacc/bison. Igen skal man bruge en inddata-fil. Inddata-filen
skal her indeholde en kontekstfri grammatik for sproget (der er dog visse
begrænsninger for hvilke kontekstfrie grammatikker, der er tilladt). En
kontekstfri grammatik er en slags definition af programmeringssproget, man
ønsker at oversætte.

For hver regel i den kontekstfrie grammatik kan man lave nogle linier kode,
der vil blive udført hver gang reglen benyttes. På den måde kan man
eksempelvis opbygge en midlertidig datastruktur, som repræsentere
inddata-programmet. Ud fra denne kan man så generere kode (oversættelse),
eller fortolke programmet (fortolkning).

Uddata fra yacc er altså igen et program i C++ eller ML der forsøger at
matche en strøm at tokens mod grammatikken, og hver gang en regel benyttes,
udføres en kodestump.

Dette var en meget hurtig gennemgang, af noget af det stof man bruger cirka
et halvt semester på, på DIKUs førstedel.

Jeg håber, at dette giver dig en ide om hvad der skal til. Ellers så kan du
altid spørge igen.


Venlig hilsen
   Anders Nielsen



 
Home   Subscribe   Mail Archive   Index   Calendar   Search

 
 
Questions about the web-pages to <www_admin>. Last modified 2005-08-10, 20:07 CEST [an error occurred while processing this directive]
This page is maintained by [an error occurred while processing this directive]MHonArc [an error occurred while processing this directive] # [an error occurred while processing this directive] *