Avatar billede chrizz Nybegynder
26. april 2002 - 09:55 Der er 3 kommentarer og
1 løsning

hvad er en kompiler??...

Hej eksperter!!

jeg har fået stillet opgaven:.....

Formål:
    Rapporten skal indeholde en beskrivelse, af kompilerefunktionen i C++ og Java.

-    Hvad er en kompiler?
-    Hvordan fungere den?
-    Hvorledes foregår en eksekvering af kompileren?



Rapporten vil tage udgangspunkt i kompiler beskrivelsen, ved en sammenligning af C++ og Java kompilerne.

er der nogen det kan hjælpe mig, ved at komme med nogle ideer til, eller besvarelser af nogle af problemstillingerne.

på forhånd tak!! fra Chrizz...
Avatar billede NanoQ Nybegynder
26. april 2002 - 10:15 #1
Forkert kategori - denne er alene til hjælp med udvikling af Eksperten :)
Avatar billede dmcn Praktikant
26. april 2002 - 11:11 #2
Spørgsmål flyttet til Programmering : Generelt.
- n0rmality, coadmin
Avatar billede tson Nybegynder
26. april 2002 - 23:49 #3
Det er jo et kæmpe spørgsmål og jeg kan jo ikke sidde her og skrive din rapport for dig, men jeg kan sagtens give dig et overblik!

1. Hvad er en kompiler
På dansk kaldes en compiler en oversætter. En compiler er et computerprogram som oversætter kildekode til kode der kan eksekveres af en maskine. Kildekode er et højere niveau sprog (som f.eks. C, C++. Java, C# etc), som programmøren udtrykker sit program i. Kildekoden kan ikke udføres direkte af en computer, men fordi det er udtrykt i et entydigt sprog kan et computerprogram oversætte det til noget maskinen direkte kan eksekvere.

2. Hvordan fungere den
En compiler er opbygget i adskillige trin. Typisk følgende:
1. Lexer
2. Parser
3. Optimizer
4. Backend (kode-generator)

Kildekode er normalt skrevet i normale tekst-filer. Altså en fil som indeholder en lang række af tegn, bogstaver, tal, special tegn og blanktegn som mellemrum. Lexer'en (forkortelse for lexikalsk analyse) bryder den lange streng af tegn (karakterer) op i "tokens" som keywords, literals og identifiers. Keywords er de ord i et sprog som har en særlig betydning, som f.eks. "class", "void", "return", "if" og "while". Literals er konstanter skrevet i koden, som f.eks streng-konstanter skrevet mellem anførselstegn, eller heltals eller kommatals konstanter. Nogle sprog har også literals  for regular expressions, lister, arrays, hashtabeller (eksempler på sådanne sprog er ruby, python og perl). Identifiers er navne som programmøren har tildelt funktioner, klasser eller variable.

Rækken af tokens som lexeren generere er input til næste trin i compileren, som er parseren. Parseren genererer en intern repræsentation af koden ud rækken af tokens og en grammatik for sproget. Hvis rækken af tokens ikke passer til grammatikken giver det en syntaks fejl. Den interne repræsentation er typisk nogle træstrukturer kaldet AST, for Abstract Syntax Trees.

Udfra den interne repræsentation kan der genereres kode, men ofte køres først et optimizer trin, som løber den interne repræsentation igennem og forsøger at finde overflødige ting som kan udelades, eller transforme dele, så de kan afvikles hurtigere.

udfra (den eventuelt optimerede) interne repræsentation kan en compiler backend afvikles, som generere eksekverbar kode. Hvis backenden generere eksekverbar kode til afvikling på en anden type computer end den compileren køre på kaldes det en cross-compiler eller en krydscompiler.

Java og C++ forskelle:
C++ (og C) har et trin skudt ind før lexeren, nemlig preprocesseren. Preprocessoren scanner kildefilen igennem og udfører visse substitutioner. Makroer ekspanderes og #include statements udskiftes med indholdet af de angivne (inkluderede filer). C++ compileren spytter object-kode ud. Object-kode er eksekverbar for en CPU, men kan ikke umiddelbart afvikles som et program. Før det kan afvikles som et program skal det en tur gennem en linker, som linker det sammen med (eventuelt) andre object-filer som programmøren har fået compileret fra andre kildefiler, og libraries og et lille stykke start-kode, som kalder start-funktionen (main) i programmørens kode. Det linkede program kan afvikles.

Java har ikke en preprocessor og outputtet fra compileren skal ikke linkes før det kan køres. Linkningen sker helt dynamisk når programmet køres. Outputtet fra java compileren er ikke eksekverbar kode i traditionel forstand da den ikke kan afvikles "native" af CPU'en. Der er tale om eksekverbar kode som kan afvikles af en virtuel maskine - et abstraktionslag mellem computeren og koden. Det er muligt at lave en fysisk computer så den eksekverbar kode kan afvikles direkte, men de er ikke udbredte.


Kompileren eksekveres ved at man giver compileren noget input i form af nogle "flag", som indikere eventuelle specielle settings (som f.eks. om der skal køres en optimizer, eller om der skal kryds-compileres, eller om der skal genereres speciel kode som bruger særlige kaldekonventioner, eller en liste af directories som include filer kan findes i) samt en liste af input-filer som indeholder source koden. Outputtet er en eller flere object-filer.

Typisk afvikles en compiler som et kommando-linie program (også selv om det køres via et IDE, så er det bare pakket væk, så man ikke ser det).

Håber det besvarer (ihvertfald lidt af) dit spørgsmål.

Thomas

C++ (tring 0: preprocessor)
Avatar billede chrizz Nybegynder
27. april 2002 - 08:42 #4
tusind tak for hjælpen Thomas!!! den var virkelig til stor nytte...
hilsen Christine...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester