Sprog forvirring !!

greenspun.com : LUSENET : Grundlæggende Programmering E2000 : One Thread

Sprog forvirring efter foredrag med Bjarne og diskussion med c++'nørder !

Når man oversætter et java program, oversættes det til java bytecode. Java bytecode oversættes til maskinkode, når programmet eksekveres. Når man oversætter et c++ program, oversættes det direkte til maskinkode.

Er det rigtigt forstået ?

Vil det så sige, at et c++ program principelt kører hurtigere end et java program ?

Kan man i så tilfælde eksekvere c++ i et java program, til f.eks. at køre tunge algoritmer ? Er det muligt, at oversætter dele (tunge algoritmer) af et java program til maskinkode, og få et lige så hurtigt program ?

-- Martin Schiøtz (msc@it-c.dk), November 20, 2000

Answers

Som Niels skriver så oversættes Java til Java-bytekode (i *.class filer) som derefter udføres af et køretidssystem. Udf&olash;relsen er enten rent fortolket eller sker ved at bytekoden oversættes til maskinekode umiddelbart inden udførelsen (JIT-oversættelse).

Faktisk er der JIT-oversættelse i den Java-fortolker vi bruger. Prøv at skrive java -version, så får man noget i denne stil:

java version "1.3.0" Java(TM) 2 Runtime Environment, Standard Edition (build Blackdown-1.3.0-FCS) Java HotSpot(TM) Client VM (build Blackdown-1.3.0-FCS, mixed mode)

Java HotSpot er en JIT-oversætter. Den udgave af Java der ligger på CD-ROMmen er lidt anderledes, men har også JIT så vidt jeg husker.

-- Peter Sestoft (sestoft@dina.kvl.dk), November 21, 2000.


Den måde vi oversætter et Java program (Hello.java) på i GP sker ved først at generere en Hello.class fil med "kaffekoppen" eller javac (JavaCompiler). Hello.class er en bytecode fil, som kan udføres af programmen java. Programmet java _fortolker_ bytecodefilen, dvs. udfører hver instruktion en efter en. Dette går generelt langsommere end hvis man oversætter til maskinkode, hvor det er computerens CPU som direkte eksekverer instruktioner i ens program. En anden måde at se tingene på er, at der er et lag mere (java) når Hello.class fortolkes.

C++ og en _masse_ andre sprog bliver traditionelt oversat til maskinkode og udført af computerens cpu direkte - altså den hurtige måde. Dette kan man også gøre med Java programmer. Man kan f.eks. tage Hello.class og oversætte den til maskinekode - dette er hvad en jit-compiler gør (Just In Time compilation). Dvs. man modtager Hello.class, oversætter den til maskinkode som passer til den computer man kører på (X86, PA RISC, SUN, ARM, Power PC,...) og så kører maskinkodeprogrammet. Jeg har aldrig selv prøvet en Jit-oversætter, så jeg kan ikke give links til steder hvor man kan hente sådan en, men det vil undre mig, hvis man f.eks. ikke kan finde en hos SUN.

Hvorfor fortolkes Java programmer, hvis det går langsommere? Fordi bytecode-filerne er arkitekturuafhængige. Du kan køre et Java program på enhver maskine uafhængig af om det er en X86 eller Power PC. Det eneste der kræves er, at fortolkeren, dvs. programmet java, skal udvikles til hver maskintype -- derfor kan vi f.eks. have appletter som kører under alle maskintyper -- du kan ikke umiddelbart lave appletter med C++.

At appletter fortolkes er normalt ikke noget problem, men for store GUI-programmer eksempel vis har det vist sig at fortolkningen er for langsom. Derfor opfandt man Jit-oversætteren, altså den som omformer bytecode filer til maskinekode.

-- Niels Hallenberg (nh@it-c.dk), November 21, 2000.


Moderation questions? read the FAQ