Udførelse af Java-programmer

"A really great talent finds its happiness in execution"

Johann Wolfgang von Goethe

Et "rigtig" program

Når man begynder at undervise en ny klasse i Java slår det aldrig fejl — på et tidspunkt er der én, der spørger: "... og hvordan kan man så oversætte det til et rigtig program, der kan køre uden for <indsæt navn på udviklingsmiljø>?". Det er ikke et uinteressant spørgsmål, for Java er noget speciel på det punkt!
Laver ikke exe-filer Det korte svar er, at Java-programmer bliver fortolket af en virtuelle maskine, og at man derfor ikke laver en exe-file. Men hvorfor så det? Da Java først kom frem var (og er) konceptet omkring udførelse (eng. execution), at programmerne skal være platforms-uafhængige, og at de derfor ikke skal oversættes til maskinkode, da det vil knytte dem til en bestemt CPU, og dermed platform.
Compilere Det er en af de idéer ved Java, der nok mest er til besvær; hvis man ikke har brug for at være platforms-uafhængig. I de første år betød det at Java var temlig langsom, og af samme grund var der også flere, der begyndte at lave compilere til Java, som kunne lave eksekverbar filer. Det var noget rodet noget, der aldrig helt slog an.
Just In Time I stedet slog en anden idé igennem. Idéen var at lave en virtuel maskine, der fortolkede byte-koden (den kode som Java oversættes til), men løbende oversatte den til maskinkode. Dette skete efterhånden som fortolkeren mente at det kunne betale sig (i.e. hvis den pågældende kode blev kørt igen og igen). Disse compilere kaldes JIT-compilere, hvor JIT står for Just In Time. Mao. blev programmet oversat til maskinkode, men dette skete på selv platformen, når programmet blev udført. Det bibeholdt det platforms-uafhængige, idet man kunne distribuere class-filerne med deres byte-kode, til enhver computer der havde den virtuelle maskine installeret. Den virtuelle maskine kunne så om nødvendigt, og hvis den overhovedet var i stand til det (i.e. den havde en JIT-compiler), oversætte det til maskinkode på den pågældende platform.
Lige hurtige Hvis man i dag laver en sammenligning mellem Java og C# (der oversættes til maskinkode) mht. udførselstid, står de reelt lige. Der kan være visse forskelle omkring specielle ting, men Java's virtuelle maskiner har med JIT-compileren indhentet den eksekverbare kode.
Vi vil i det følgende se lidt nærmere på Java, udenfor udviklingsmiljøet — populært sagt: "Java med Notepad".
0. Forberedelse
Notepad og Command Prompt Inden vi kan komme igang, er der en række ting, der skal på plads. For det første skal vi bruge Notepad og Command Prompts. Det er måske ikke noget man bruger så ofte, men de kan begge findes under: Start > All Programs > Accesories (eller hvad det nu måtte hedde på den version af Windows man bruger). Det kan være nyttigt at have shortcuts til disse.
Det næste vi skal bruge er lidt mere kompliceret. Vi skal have inkluderet Java i Path'en. Det er min erfaring at det normalt ikke er gjort, selvom det må synes at være en oplagt opgave for installationen af Java. Hvorfor det ikke gøres automatisk er uvist. Den største udfordring mht. at inkludere Java i Path'en er at finde rundt. Vi skal bruge stien til Java SDK's bin-directory. På min PC er den i skrivende stund:
C:\Program Files\Java\jdk1.7.0_01\bin
Denne sti afhænger af hvilken version af Java man har installeret (og hvor), og man skal derfor selv finde den.
Finde "My Computer" Dernæst skal vi have adgang til at ændre i Path, der er en såkaldt environment variabel. Det er lidt forskelligt hvordan man finder frem til det sted, hvor man kan gøre dét — afhængig af hvilken version af Windows man bruger. Kort sagt drejer det sig om at: 1. Finde "My Computer", 2. Højre-klikke og vælge "Properties", 3. Vælge "Advanced" , 4. Vælge "Environment Variables". Det første, med at finde "My Computer" er lidt forskelligt. Man kan muligvis finde den på desktop'en (Windows Vista, Windows 7), eller under: Start-menuen (Windows XP), eller man kan gå via: Start > Control Panel (Windows XP), og vælge System > Advanced.
Vær forsigtig! Når man (endelig) finder "Environment Variables", går man ned under "System Variables", markerer "Path", og trykker "Edit". Man skal nu være forsigtig! Hvis man kommer til at slette hele eller dele af Path, kan man få betydelige problemer med de programmer der er installeret på ens PC — men passer man på, sker der ikke noget! (Man kan bruge "Cancel", hvis man er i tvivl, om man har gjort noget forkert). Placer nu cursoren i "Variable value", og tryk på End-knappen, så cursoren bliver placeret for enden af linien. Indsæt derefter et semi-kolon, og dernæst stien til Java's bin-directory (det er nemmest at paste den ind fra et sted man har skrevet stien). Tryk dernæst OK, hele vejen ud.
Bemærk, at Path nu vil være ændret for alle Command Prompts, der efterfølgende åbnes. Allerede åbne Command Prompts vil ikke få ændret deres Path (det er med andre ord noget der sættes ved åbning af Command Prompts).
1. Oversættelse af Java-programmer
Før vi kan udføre et Java-program, skal det oversættes!
Notepad Lav et directory på din PC, som vi kan bruge til at eksperimentere med. Det kunne f.eks. være: "C:\java_rod". Start Notepad og indtast (i.e. kopier) følgende kildetekst ind i notepad:
Source 1:
Minimalt program
Main.java
public class Main {

  public static void main( String[] argv ) {
    System.out.println( "Hello World!" );
  }
}
Main.java Gem dernæst filen i "C:\java_rod", under navnet "Main.java". Vær i den forbindelse opmærksom på, at Notepad ikke kommer til at gemme den som "Main.java.txt". Filen skal have extension ".java"!
Vi skal nu bruge en Command Prompt:
Figur 1:
Command Prompt, med kilde­tekst­file
Her har jeg brugt cd \java_rod til at komme ind i vores directory, og dernæst dir, for at se hvilke filer der er i dette directory. Man bemærker, at vores kildetekst-file: Main.java, (endnu) er den eneste file i directoriet.
Lad os oversætte vores program, og se hvilke filer der så er:
Figur 2:
Oversat til class-file
javac Først oversættes programmet med javac Main.java, hvor javac er java-compileren, der oversætter Main.java til byte-kode. Denne byte-kode bliver placeret i en ny file: Main.class (som det ses af den efterfølgende dir).
Hvis man ser nærmere på indholdet af Main.class, ser man at der er tale om en binær file — det er ikke en tekst-file!
Følgende er indholdet vist med Total Commander's list view:
Figur 3:
Byte-kode
Selvom der er tale om en binær file, bemærker man at der er indsat en del tekst i starten af filen. Havde programmet været større, havde det været tydeligere, at dette kun optræder i en lille del af class-filen. Teksten refererer til forskellige klasser fra java's standard-bibliotek, der anvendes i byte-koden (teksten indeholder også andre oplysninger). Selve byte-koden ses fra ca. 130 og fremefter.
Hvis vores program havde bestået af flere filer (i.e. flere klasser), havde man compileret det med: javac Main.java Class1.java Class2.java osv. Der havde resulteret i en tilsvarende række filer: Main.class, Class1.class, Class2.class osv.
2. Udførsel af Java-programmer
Vi kan udføre vores program med:
Figur 4:
Udførelse af program
Vi har her brugt: java Main, hvor Main er navnet på den class-file, der indeholder starten af programmet (i.e. public static void main...). Da der altid vil være tale om en class-file, er extension'en overflødig.
Hvad med javaw? javaw er fuldstændig som java, men med den ene forskel, at javaw ikke har nogen konsol, så vores udskrift forsvinder! Man bruger javaw når man ikke ønsker at der åbnes et konsol vindue (i.e. Command Prompt) i forbindelse med udførelse af programmet. Det er f.eks. tilfældet hvis vi har lavet et Java-program med en GUI.
Dette var en introduktion til oversættelse og udførelse af Java-programmer, men der er en del flere muligheder. F.eks. kan man samle class-filer etc. i en jar-file, der i hovedsagen er en zip-file med lidt ekstra filer. Men dette emne vil vi ikke inkludere her.