Nemají ty screenshoty být takhle? ;-)
http://img24.imageshack.us/img24/252/worldrv.png
Pro udělání screenshotu stačí pravé tlačítko myši na ploše a vybrat export… > PNG file, zbavíš se dekorace okna.
Neuvažovals nad tím věnovat jeden díl tohoto seriálu i zmíněnému Selfu?
Ahoj, upravit třídu SmallInteger tak, aby vracela ‚správný‘ výsledek, je jednoduché, ale bohužel násobení optimalizuje přímo interpret, takže i potom je vracen ‚špatný‘ výsledek, protože se metoda pro násobení vůbec nevolá. Volá se jen pokud je kód simulovaný (např. při ladění nebo přímo pomocí ContextPart runSimulated: [6*9]). To by pak k dokonalému efektu vyžadovalo upravit metodu evaluateSelection ;-)
To bych snad ani nerikal nahlas, ze je nasobeni integeru ve Smalltalku optimalizovane :-) Vzdyt kdyz se v Jave zavadely primitivni datove typy (IMHO strasna blbost), tak se argumentovalo prave tim, ze kdyby se jednalo o objekty, ze by vse bylo pomalejsi a vice narocnejsi na pamet. Me to teda neprislo, proste by se treba 42 chovala jako konstanta tam, kde to ma smysl a objekt jinde.
A ne snad? Objektově orientované programování je z principu méně efektivní pro počítač. Čím více se vzdaluje programovací jazyk od stroje a blíží se k představám vnuceným člověkem, tím neefektivnější. Navíc to není jediné – např. otáčení oken v Morphicu je taky optimalizované – okna zobrazená normálně (tj. neotočená) se obsluhují jinak, než okna natočená o nenulový úhel. A je toho ještě víc – prostě co vypadá krásně teoreticky, obvykle vychází příšerně neefektivně prakticky.
Nakonec se objektově-primitivní datové typy (takový dualismus :-) do Javy stejně dostaly díky autoboxingu. Samotný překladač v takovém případě rozhoduje, jak kterou konstrukci přeložit, navíc jsou některé „malé“ integerové konstanty optimalizovány i díky použitému bajtkódu.
Ovšem zajímavé je, že překladač například u Integerů skutečně pracuje s objekty a nezjistí si například, že se využívají jen jako nositelé konstant:
public class Test
{
static {
Integer a1=6;
Integer b1=7;
Integer c1=a1*b1;
int a2=6;
int b2=7;
int c2=a2*b2;
}
}
Se přeloží do tohoto bajtkódu, kde je vidět (v první části) unboxing a autoboxing, kdežto v části druhé jde o přímé operace nad primitivním datovým typem:
static {};
Code:
0: bipush 6
2: invokestatic #2; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
5: astore_0
6: bipush 7
8: invokestatic #2; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
11: astore_1
12: aload_0
13: invokevirtual #3; //Method java/lang/Integer.intValue:()I
16: aload_1
17: invokevirtual #3; //Method java/lang/Integer.intValue:()I
20: imul
21: invokestatic #2; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
24: astore_2
25: bipush 6
27: istore_3
28: bipush 7
30: istore 4
32: iload_3
33: iload 4
35: imul
36: istore 5
38: return
}