sobota, lipca 18, 2020

strictfp sierota po x87 ;-)

Jest taki zespół 3 słów kluczowych w Java'ie które są używane tak rzadko, że prawie nikt nie wie do czego służą.
To volatile, transient i strictfp.
Dwa pierwsze jeszcze nie są takie całkowicie niezwykłe do użycia, czasem może się zdarzyć, że chcemy mieć zmienną trzymaną w pamięci głównej komputera,  a nie w cache'u, tak by wszystkie wątki/cpu widziały tą samą wartość (volatile to zrobi), i czasem jak używamy serializacji (nie powinno się, ale i tak to robimy ;-)) to są pola których nie chcemy serializować.
Ale strictfp to chyba najrzadziej używane słowo kluczowe w Java'ie (nawet goto jest częściej używane, bo co prawda my go w kodzie nie możemy użyć, ale kompilator może i czasem jak ktoś robi dekompilację kodu to dekompilator potrafi co najwyżej użyć goto w tłumaczeniu ;-)).

Najzabawniejsza jest jednak historia strictfp ;-)

Weszło do Java'y w wersji 1.2 czyli w 1998 roku. Tej wersji Java'y zawdzięczamy kolekcje (czyli od wtedy używanie Vector i Hashtable jest passe ;-)), oraz IntelliJ ;-) bo w Java 1.2 wszedł Swing, a w co trudno uwierzyć IntelliJ jest napisany w Java'ie z użyciem Swinga...

Java gdy była tworzona przyjęła używanie liczb zmiennoprzecinkowych w formacie IEEE 754, co było i jest nadal standardem (choć pokręconym). 
Jednak w tamtym czasie x87 (czyli koprocesory x86) nie zawsze były w pełni zgodne z IEEE 754, niby formalnie były, ale pewne sekwencje operacji mogły być wykonywane tak, że wyniki się trochę różniły między tym co zwracał x86/x87 a co zwróciłoby IEEE 754.
Z tego też powodu Java zawsze dbała o to by obliczenia zmiennoprzecinkowe były zgodne z IEEE 754.
Ale to oznaczało, że obliczenia były wolniejsze i programiści nie byli zachwyceni.
Dlatego Sun postanowił zmienić specyfikację JVM, tak że JVM nie wymaga tak ścisłego przestrzegania IEEE 754.... do czasu gdy metoda (sama, albo przez klasę czy interfejs) nie zostanie oznaczona jako strictfp, wtedy wszystkie operacje w takich metodach muszą być zgodne z IEEE 754.
Oczywiście Intel dość szybko zauważył, że jego procesory mogą tu powodować pewne problemy i wprowadził w nich zmiany, które sprawiły, że obecnie arytmetyka z strictfp i bez daje takie same rezultaty (przynajmniej zwykle ;-)).

Ja wiem, że w swoim kodzie nigdy nie użyłem strictfp, jak mi się wydaje nie pracowałem też nigdzie z kodem który używałby strictfp.
W samym JDK Java'y strictfp jest użyte w 2 plikach ;-) w FdLibm.java i w StrictMath.java, łącznie w 6 metodach :-)




Podobne postybeta
Goto Go ;-)
Refleksje i serializacja w Java'ie - podstawy i obalanie mitów ;-)
GCJ mnie przerosło ;-)
Moc obliczeniowa
Java na Raspberry Pi zaskakuje ;-)

Brak komentarzy:

Publikowanie komentarza