2006-06-20

Zalazak izvršnog koda

Svi znamo kako je tekao razvoj programiranja i programskih jezika, od mašinskog koda, preko asemblera pa do današnjih viših programskih jezika. Svaka generacija se naslanjala na prethodnu i svodila je na najmanju moguću meru.

Danas prisustujemo još jednoj smeni. Jezici čiji se kod kompajlira u izvršni polako bivaju skrajnuti. Na TIOBE listi od 10 prvoplasiranih jezika samo 3 su klasična. Pri tom je moguće da delphi sklizne sa top 10 liste, a java već godinama vodi.

Šta je uzrok tome? Sve je u parama prost je odgovor. A pravi odgovor je malo složeniji. Glavni razlog je sniženje troškova razvoja i održavanja. Da bi jezik bio produktivniji mora da se izdigne iznad mašine, da postvi debeo izolacioni sloj. Pri tom taj izolacioni sloj dovodi do još jednog efekta a to je lako postizanje platformske nezavisnosti što su neki jezici postvili kao cilj (npr. java) a drugi su bili pragmatični pa su se poveli onom: sve može, a i ne mora, kao u pythonu. Zato se već godinama nije pojavio novi jezik a da je prevodio kod u izvršni (native code) osim projekta jezika D.

Pošto je ovaj razlog stalno prisutan mora da ima još nešto. Rad programera je sve skuplji, a mašina je sve jeftinija. I ne samo to, mašine su sada dovoljno snažne da ne moraju direktno koristiti izvršni kod. Količina biblioteka i softvera napisanog u klasičnim jezicima je dovela do toga da se programiranje u većini slučajeva svodi na pozivanje tog koda koji je već isprogramiran i preveden u izvršni. Npr. PHP je mnogo sporiji od C-a. Ipak za web se programira u PHP-u jer najveći deo obrade nekog web zateva izvršava baza koja je pisana u C-u. PHP samo poziva kod baze i to je par procenata ukupnog vremena a za tih par procenata niko neće da se bakće C-om.

I sami interpreteri koriste kod od ranije i ubrzavaju izvršenje za razliku od starih interpretera. Klasična je priča o upređivanje javine i C implementacije Linpack algoritma. Pokazuje se da nema razlike u brzini, što i ne čudi obzirom na to da se najveći rad u algoritmu svodi na numerička izračunavanja a oba jezika za to koriste istu BLAS biblioteku programiranu u FORTRAN-u :)

Moderni jezici ne koriste priglupe interpretere koji su izvršavali liniju po liniju izvornog koda. Danas se često izvorni kod prevodi na međujezik, imamo inteligentne virtelne mašine koje analiziraju kod, pronalaze uska grla i optimizuju ga, odlučuju da li da objekat alociraju na heap-u ili stacku, primenjuju različite algoritme sakupljanja smeća zavisno od situacije...

Došlo se do novih otkrića i rešenja kod VM. Tu su nove arhitekture, primena niti, novi algoritmi za optimizaciju. To je dovelo do toga da se sad new operator u javi izvrši u nekoliko taktova brže nego najbrža implementacija malloc funkcije u C-u a pri tom JVM uz alokaciju radi i inicijalizaciju memorije.

Šta se danas događa kod jezika sa VM? Primetno je stremljenje ka razdvajanju jezika i VM. Sad je situacija da se jedan jezik izvršava na više VM i da jedna VM može da pokrene više jezika. Za to je potrebno napisati mini interpreter. Pokušava se sve više da se olakša pisanje tih mini interpretera kako bi VM mogla da podrži više jezika. Npr. u JVM 1.6 se to znatno olakšava i samo je potrebno napisati određen pllugin, a plugin za JavaScript se dobija uz JVM.

Postoje i pokušaji da se naprave zajedničke VM za nekoliko jezika. Za Perl, Python i PHP se radi jedna takva mašina. MS se otvorio ka raznim jezicima. Najnovija je podrška pythonu preko IronPython-a. To omogućava da se koriste standardne i druge biblioteke nekog drugog jezika samim izvršavanjem u VM tog jezika. Npr. da se iz pythona koristi SWING i Hibernate. I više od toga: da se python kod prevede u javin bajtod i korsti iz jave ili bilo kog jezika na JVM. Moguće je i odbratno da se bibiliteke u drugom jeziku prilagode VM preko omotavanja, tj. dekorator obrasca. Npr. u pythonu je moguće koristiti QT GUI biblioteku programiranu u C++ preko PyQT omotača.

Sve to dovodi do snažne sinergije. Više nije bitno ko u čemu šta piše. Izbor postaje velik. Svako može da osmisli svoj jezik za neku specifičnu namenu (domain specific) i to implementira za neku VM. Ruše se ograde između jezika i između platformi.

2006-06-04

3 džepna linuxa

Juče sam se igrao sa 3 mala linuxa, ali moćna kao uvek:

  • Damn Small Linux verovatno najmanji i najmanje zahtevan linux uopšte. Iako je mali ima sve što mu treba. Automatski mi je prepoznao mrežnu karticu i konfigurisao mrežu. I ostala hardverska podešavanja je uradio automatski. Mana je što ne podrzava NTFS sistem ili bar meni nije pošlo za rukom da uradim mount. GUI je Fluxbox, što će reći da nije lepotica. Kernel je generacije 2.4.* Pozitivna stvar je i to što preko Knoppixa ima Debian korene a to znači da sa apt-getom nema problema. Veličina mu je samo 49 MB a autori tvrde da im je gornji limit 50 MB. Podiže se i na 486DX mašinama sa 16 MB RAM. Postoji i embedded izdanje koje pomoću QUEMU VM može da se vrti i na Win i na Linux OS i to sve radi jedna ista verzija! Što je još neverovatnije uspeli su da stave još jedan window manager JVM koji koristi i Puppy linux. Sledi slika DSL sa Fluxbox wm:

    DSL u akciji, Chupin blog :)


  • Austrumi 1.2: poslastica iz Letonije. Automatski je podesio sve osim mreže. A za to korsiti prilično bazične alatke u tekstualnom modu (netconfig). Trebate znati sve parametre mreže, a posle toga nema problema. GUI je E17 koji jos nije u finalnoj verziji ali je najvažnije da je izuzentno napredan i lep a pri tom lagan. Kernel svežiji nego kod novog Ubuntua. Jest mali ali nije zaostao. Automatski je mountovao ntfs particiju. Učitava se u potpunosti u RAM, čak izbaci CD iz drajva kad završi. Vidi se da je malo nedovršen, dosta je grešaka što u njemu što u E17, ali da ima potencijala da bude najpotpuniji mali linux. ISO fajl je 49,5 MB a za pokretanje traži 128 MB. Moguće je intalirati ga na hdd:

    Lepa Letonka, ali votka čini svoje


  • Puppy 1.09CE: Mnogo smara kod boota. Dok su prethodna 2 sve sama podesila ovaj samo zapitkuje u text modu. Ali to je prvi linux koji je zalajao na mene. Ako pri podešavanju zvukačujete AV nemojte se uplasiti, ne ujeda :) Koristi JWM kao GUI. Po lepoti je negde blizak Fluxboxu. Nije konfigurisao mrežu ali ima wizard koji sa par kliktanja sam pronalazi mrežu. Inače nisam nigde video toliko wizarda, ima čak i wizard za wizard (ne šalim se bukvalno tako piše). Puppy iso fajl ima 62 MB. Troši manje memorije nego Austrumi samim tim što ne mora da se sav učita u RAM, mada ta opcija postoji. Kernel je 2.4 generacije. Nisam uspeo da mountujem ntfs particiju.

    Lajavi linux


Damn Small i Puppy se mogu lako prilagoditi dodavanjem modula na CD. Imaju mogućnost da zapamte podešavanja na USB, a Puppy čak može sam sebe da doreže sa novim podešavanjima ako je CD u rezaču. Sva tri linuxa se mogu instalirati i na hard a Puppy i DSL i na USB, zipdrive, Compact Flash drive itd. Bilo kuda linux svuda! Problem sa mountovanjem dolazi iz činjenice da kernel verzija 2.4 ne podržava direktno NTFS, a i kad se podrška uključi ona je read only. Tako je sve do kernela 2.6.15 mada i tu postoje problemi sa fajlovima manjim od 512 B. Problem sa zatvorenim kodom jedne velike firme sitnih duša (pesničko nadahnuće :) ). Drugi uzrok je što imam novi hard SATA 2 (koji se kao uređaj u linuxu prijavljuju sa /dev/sda). Šteta što nisam imao FAT32 particiju na njemu čisto da vidim da li bi se i to mountovalo.

Prvo pa muško, pa se zove Persa :)

Svečano otvaram blog, nek nam je živ i zdrav!

Šta će svega na njemu biti, ko to zna. Važno je da se krenulo, pa će se stići vremenom.