200 likes | 348 Vues
Oversættelse af Java-programmer. Java. Bytecode. javac. Normalt oversættes Java-programmer til bytecode, som fortolkes af en JVM (Java Virtual Machine). Java kan (ligesom alle andre sprog) også oversættes til maskinkode. Normalt vil oversættelse af Java være via bytecode
E N D
Oversættelse af Java-programmer Java Bytecode javac • Normalt oversættes Java-programmer til bytecode, • som fortolkes af en JVM (Java Virtual Machine). • Java kan (ligesom alle andre sprog) også • oversættes til maskinkode. • Normalt vil oversættelse af Java være via bytecode • og i form af JIT-kompilering (Just-In-Time). Java Bytecode Maskinsprog javac jit- oversætter
Håndoversættelse fra Javatil Lippiatt++ Java Lippiatt++ hånd- kraft • Krav om korrekt håndtering af: • addition • ram/cpu dataoverførsel • løkke • procedurekald • Ikke krav om håndtering af • klasser/objekter • i/o
Maskinprogram = sekvens af maskininstruktioner, der udføres 1 ad gangen start CPU-cyklus = 1. Hent instruktion. 2. Udfør instruktion. • Anbring næste • instruktion i IR • Inkrementer IP • Udfør • instruktion i IR stop Stop?
Syntaks af maskininstruktioner(Lippiatt++) 0001001110000001
Maskininstruktion = operationskode + operander 000100111000 0001 Op-kode # Operand Operand 0001rrrrmmmmmmmm
Symbolsk maskinsprog(assembler-sprog) STORERM • - er den symbolske maskininstruktion, der svarer til • (den "rigtige") maskininstruktion 0001001110000001 • Op-kode erstattet af symbolsk navn på operationen. • Register-numre erstattet af variable R0,R1,.. • RAM-adresser erstattet af vilkårlige variable M,X,Y,.. • Assembleren oversætter assemblerinstruktioner til • maskininstruktioner 1-til-1. • Semantik af assembler- og maskininstruktioner • kan derfor behandles under et.
Relevante tolkninger(jf. Lippiatts "klassifikation")af binære data • Alphanumerisk information: • tegn, f.eks. A=01000001 • Numerisk information: • det binære talsystem: 01000001=65 • Kontekstafhængig information: • brug af bits til at repræsentere en persons køn etc. • (måske bedre at bruge String sex = female etc.)
Semantik (effekt af udførelse) STORERM /0001001110000001 Effekten af at udføre STORE R M er at kopiere indholdet af RAM-adressen M til registeret med nummeret R. Kan også skrives: [M] <- [R] Den variable M oversættes af assembleren til f.eks. 10000001. Den variable R oversættes af assembleren til f.eks. 0011.
Instruktionssættet i Lippiatt++ • CPU/RAM dataoverførsel • LOAD M R • STORE R M • Intra cpu dataoverførsel • MOVE R R' • LOADCONST [R] Const • Aritmetik • ADD R R' • SUBTRACT R R' • Control flow • JUMP M • JUMP_POS0 R M • CALL M • RETURN
Symboler i flowdiagram start stop Instruktion (alm) LOAD, ADD etc. Pil til næste instruktion JUMP_POS0 betinget hop-instruktion
Flowdiagram for Count start Initia- lisering i < .. stop process_record() i=i+1
Oversættelse af i=i+1 ADD R0 R1 • Forudsætning: • R0 indeholder i. • R1 indeholder konstanten 1.
Oversættelse af N=N+X(jf. Lippiatt s. 23-25) LOAD N R1 ADD R1 R0 STORE R1 N • Register R0 indeholder en værdi (nemlig X) vi vil lægge til • indholdet af memoryadresse N • Kun få af instrutionerne er egentlige aritmetiske • eller logiske operationer, de fleste er dataoverførsler. • Operander skal være i cpu-registre.
Oversættelse af i=i+1 Nu uden forudsætning om at i og 1 allerede er overført til cpu-registre !! LOAD I R0 LOADCONST R1 1 ADD R0 R1 STORE R0 I
Oversættelse af løkkens betingelse(i < .. ?) MOVE R0 R3 SUBTRACT R3 R2 JUMP_POS0 R3 A2 • Forudsætninger • R0 indeholder i. • R2 indeholder værdien af Integer.ParseInt(args[0]) • A2 er adressen på den instruktion, der skal udføres hvis vi • skal ud af løkken • Ide: • Testen (i < [R3]) omformuleres til (i - [R3]>= 0). • Kun hop hvis vi skal ud af løkken.
Oversættelse af procedurekald CALL PR .. PR: .. RETURN • Virker fordi • RETURN bruger SP-registret til at hente adressen på den instruktion, der skal fortsættes med efter procedurekaldet. • Den er nemlig gemt pga. CALL • Bemærk at vi i symbolsk assembler også har etiketter/labels.
Implementation af CALL og RETURN uden brug af SP CALL PR .. PR: .. RETURN [Q] <- [PC] [PC] <- PR [PC] <- [Q] Denne løsning kan ikke håndtere indlejrede ("nestede") procedurekald !
Implementation af CALL og RETURN(med rekursion) [[SP]] <- [PC] [SP] <- [SP]-1 [PC] <- PR [SP] <- [SP]+1 [PC] <- [SP] CALL PR .. PR: .. RETURN • Retur-adresser for mere end et procedurekald gemmes • på stakken. • Indholdet af SP-registret er adressen på toppen af stakken.
Vinkel: Operativsystemet skaber et antal "virtuelle maskiner"(jf. Tanenbaum 1.4.3) Applikations- programmer Systemprogrammer (andre end OS) Øvrige operativsystem Skedulatordel af operativsystem Maskinsprog Maskine
Monolitisk kerne vs.mikro-kerne Monolitisk kerne 1 stort program Uoverskueligt (måske) Alt kører i kerne-mode, dvs. risikabelt Linux, Windows 95/98 Tanenbaum: "Linux is obselete.." Mikro-kerne Modulopdeling Kun det mest nødvendige kører i kerne-mode Pris i form af tid til kontekstskift Windows NT/2000