zvrba/ writings/ bergstra oslo 2005

Dana 2005-05-02. u Oslu je prof. Jan Bergstra sa Sveučilišta u Amsterdamu održao predavanje na temu algebre programa; njegov homepage se može naći na http://staff.science.uva.nl/~janb/

Predavanje je počelo kratkim osvrtom na SW patente te komentarom kako se ne može patentirati ono što nema čvrstu definiciju (dao je primjer pokušaja patentiranja operatora IsNot koji testira jesu li dva objekta identična).

U nastavku je dao kratak uvod u algebru programa i threadova u kojoj GOTO konstrukt zauzima ključno mjesto. Predavanje je bilo izuzetno zanimljivo, nimalo formalno i duhovito. Ovdje ću ukratko navesti ključne točke predavanja (što je program, goto te Java).

Program

Prof. Bergstra tvrdi da je program je "niz instrukcija". Pogrešno je program vezati uz računalo ili programski jezik. U njegovoj algebri postoje sljedeće primitivne instrukcije:

Osim ovih primitivnih instrukcija postoje sljedeće dvije operacije izgradnje većih programa:

goto

Kao što sam već napisao, GOTO zauzima kljućno mjesto u algebri programa. Gotovo svima je poznat Dijkstrin članak "GOTO considered harmful". Na tu temu je prof. Bergstra rekao da je GOTO prirodan način izražavanja i to potkrijepio primjerom nizozemske porezne prijave gdje svako polje ima neki broj i pored su upute kako se polje popunjava. Ima uvjetnih polja u stilu "ako nešto, nastavite ispunjavanje od točke X". Nakon toga je izjavio: "Za mene je bitnija činjenica da nizozemski porezni ured koristi GOTO nego što moj pokojni sunarodnjak misli o tome." Zatim je spomenuo dva teoretska rezultata:

  1. Programski jezik koji ima samo "strukturirane naredbe" (if/then/else i while/do) je slabiji od programskog jezika koji ukljucuje GOTO.
  2. Rezultat Cohena iz 1984. godine koji dokazuje da je problem utvrđivanja je li neki niz instrukcija virus ili ne neodlučiv.

Java

Prof. Bergstra u najmanju ruku nema visoko mišljenje o Javi (kao niti ja, pa su mi njegovi komentari bili izuzetno zabavni).

Izjavio je da je predavanje Jave postalo kraj njegove predavačke karijere... jer su se predavanja uglavnom svodila na beskrajno nabrajanje već gotovih klasa koje nešto rade.

Navodi kako je izuzetno teško predvidjeti sto će ispisati bilo koji Java program, a ako je još k tome multi-threaded, gotovo nemoguće. Naveo je primjer kako je pred studentima napisao Java program od 10 linija koda i nitko nije točno predvidio što će program ispisati (a ispisivao je "True").

Uspoređuje Java threadove sa procesima i kaže da se ne ponašaju kao procesi. Naime, za procese vrijedi komutativnost i asocijativnost paralelne kompozicije, no ne vrijedi za Javine threadove. Štoviše, izvršavanje Javinih threadova nije niti determinističko. Navodi kako je izuzetno teško za single-threaded Java program formalno dokazati da ne može deadlockati. Zaključuje kako je Javin threading model "incomprehensible", uz izjavu "everywhere Java execution is mysterious".

Daje zadatak za vježbu: isprogramirati deadlock u Javi i nabrojati sve faktore koji su doveli do deadlocka. Govori da u deadlocku veliku ulogu ima scheduler.

Zatim postavlja pitanje što zapravo znači "separate compilation" u Javi i kao još jednu lošu stvar navodi različit search order klasa kod kompajliranja i izvršavanja.

Jedna zabavna izjava je bila na temu object streamova u Javi: ako se malo igra sa parametrima da se dobiju ekstremno različiti rezultati.. uz komentar "Object streams.. are a marvelous piece of AI at work".

Kao lošu stranu je naveo i hrpu deprecated metoda koje, što je najgore, mnoge knjige objašnjavaju. Dao je primjer thread kill metode koja je postala deprecated odmah u početku.. i nije mu jasno kako je uopće usla u API kad svatko tko imalo zna nešto o threadovima zna da je "thread kill" jako loša stvar.

Te na kraju izjavljuje "C# is in many respects better than Java".