Revolucija u programerskom svetu, koju je svojim sjajnim osobinama izazvala Java nije mogla a da vrlo brzo ne odnese i prve žrtve. "Nastradali" su programeri koji održavaju ogromne bibilioteke koda napisanog u C-u. Kako sve to prevesti na Javu? | |
Zoran Budimlić |
|
Java je objektno orijentisan modularan jezik, sa bezbednim tipovima podataka, ugrađenim sistemom sigurnosti za izvršavanje preko Interneta, mehanizmom prekida i nedostatkom pokazivača i eksplicitne alokacije i dealokacije memorije, što olakšava traženje grešaka u programu. Iako je odluka o prevođenju iz C-a u Javu jedna od vrlo retkih (sa programerske tačke gledišta) pametnih odluka koje menadžeri donose, sam posao prebacivanja milijardi linija C koda (koliko autor slobodno procenjuje da se nalazi u svetu) nije nimalo lak. |
Na tri načina
Postoje tri načina pristupa ovom problemu. Prvi bi bio redizajniranje "od nule" i ponovo programiranje softvera koji je već napisan u C-u. Dugoročno, ovo je najbolje rešenje, jer omogućava najlakše održavanje i proširenje postojećeg softvera u budućnosti, naročito ako verujete da su Java programi lakši za održavanje i proširenje nego ekvivalentni C programi. Nažalost, ova opcija je preskupa - samo nekoliko kompanija i to na nekoliko (uglavnom manjih) projekata mogu sebi da priušte ovu opciju.
|
Pokazivači i reference
Teoretičari iz oblasti računarske tehnike mogu vas ubeđivati da je pomenuti problem rešen: Tjuring je odavno dokazao da se program napisan u bilo kojem računarskom jeziku (u ovom slučaju to je C), može konvertovati u bilo koji drugi jezik, ako ciljni jezik može da simulira Tjuringovu mašinu. Kako je to sa Javom očigledan slučaj (ja ne znam konkretno nijedan simulator za Tjuringovu mašinu u Javi, ali bi me jako začudilo da na Internetu ne postoji bar nekoliko takvih) - ako smatrate da bi taj pristup bio dovoljno dobar, možete slobodno preskočiti ostatak ovog teksta.
|
Blok Model
Jedan od najočiglednijih pristupa ovom problemu bi bio da se sve promenljive čija se adresa koristi u C-u "obaviju" u objekte u Javi. Definišemo klasu Block, koja će predstavljati osnovnu strukturu podataka koji se alociraju u memoriji. Podaci koji nas interesuju u C-u su skalarne promenljive (int, long, float, double) pokazivači i strukture. Za ove tipove podataka definišemo klase izvedene od Block: IntB, LongB, FloatB, DoubleB, PointerB i StructB. Ako sačuvamo parcijalno uređenje između blokova koje bi odgovaralo njihovom uređenju u memoriji koju C alocira, omogućićemo jednostavan pristup promenljivima, kao i mehanizam za aritmetiku pokazivača. Ovo se sve lepo vidi na primeru sa slike 1 i rezultujućeg Java programa sa slike 2.
|
Poziv po referenci
Jedna od jako čestih primena pokazivača u C-u je implementacija call-by-reference (poziv po referenci) pozivanja procedura i funkcija. Tako funkcija može da menja vrednost poslate promenljive. U Javi se po referenci pozivaju samo objekti i nizovi - ne postoji direktan način da se promenljive osnovnih tipova (int, float...) prenesu po referenci. Da bi se ovaj problem efikasno rešio, treba pronaći sve promenljive u programu kojima se uzima adresa i pretvoriti ih u objekte. U Javi već postoje klase koje opisuju objektnu verziju osnovnih tipova: Integer, Float... Na slici 4 je originalni C kod, a na slici 5 "prevod".
|
Konverzija nizova
Konverzija nizova je posebno značajna, pošto se u većini računski intenzivnih programa nizovi eksploatišu do maksimuma. Konvertor mora biti u stanju da prepozna upotrebu pokazivača u C-u za pristup nizovima i da to prevede u Java nizove. Da bismo dozvolili proizvoljan pristup elementima niza (kreiranje podnizova), uvodimo dodatnu strukturu podataka koja pored Java reference na niz sadrži i trenutnu vrednost indeksa niza, koja odgovara trenutnoj vrednosti pokazivača u C-u. Na slici 6 je originalni C program koji koristi podnizove, a na slici 7 njegov Java ekvivalent.
|