4 Aralık 2004

Neden Java?

Java'ya geçeli tam üç sene oluyor. Bu yazıya o zaman başlamıştım, ancak tamamladım.

Otuz dört senedir program yazıyorum. Bu süre içinde 50 kadar işletim sistemi ve bir o kadar programlama dili kullandım. Çeşitli düzeylerde programlama eğitimi verdim. Doktora çalışmam da dahil, ilk on iki sene sadece Fortran ile yazdım. Sonra Pascal’a geçip yirmi sene boyunca çeşitli Pascal derleyicilerinde ustalaştım. Elbette bu arada Cobol’dan APL’e, Prolog’dan SQL’e kadar bir çok dili öğrendim, ama yaptığım işlerde sadece Fortran ve Pascal ön planda kalmıştı. 2001 yılının son günlerinde Java öğrenmeye başladım. İlk izlenimlerim o kadar iyi oldu ki, hemen köklü bir karar vererek diğer derleyicileri sildim ve sadece Java kullanmaya başladım.

Bu yazıda, Java kullanımında karşılaştığım sürprizleri anlatmak istiyorum. Programlama bilenlerin ilgisini çekmek için araya bazı kod örnekleri serpiştirdim. Programcılıkla ilgilenmeyen okuyucum, bu örnekleri okumadan geçebilir.

İlk sürprizi String sınıfında yaşadım: Java karakter dizileri 32 bit ile modellendiğinden 4Gbyte ile sınırlı. Bu pratik olarak sınırsız demek. Pascal ile programlama öğretirken 255 byte limitini hatırladım. Metin dosyalarını okuturken her satırın bir diziye sığacağını bile garanti edemiyorduk. Dosyada uzun satırlar varsa karakterleri tek tek okumak gerekiyordu. Daha sonra C'de 16 bitlik karakter dizilerine izin verilince bu sınır 64K'ya çıkmıştı. Artık Java programlama öğretirken farklı bir yöntem kullanıyoruz: Bütün dosyayı bir byte dizisine okuyup işlemleri ana bellekte yapıyoruz.
InputStream in = new FileInputStream(f);
byte[] b = new byte[in.available()];
in.read(b); //read the whole file into b
String s = new String(b); //convert b to s


Java’ya geçme kararını verdiğim günlerde “Text Processing” dersini veriyor ve dosya sıkıştırma (file compression) yöntemlerini öğretiyordum. Bu arada Java’da zip dosyalarını okuyup yazan bir format olduğunu farkettim. Çok basit bir iki komutla WinZip ayarında ve hızında sıkıştırma yapabiliyorduk.

Resim dosyalarını açmak için özel bir gayret gerekmiyor. Java’nın tanıdığı resim formatları içinde jpeg, gif ve png bulunuyor. Bütün yapmamız gereken dosyanın adını verip bir JLabel içine atmak. Dosyayı açıp resmi göstermek Java Virtual Machine (JVM) denilen sistemin sorumluluğu. Açılan resmin boyu sadece bellek ile sınırlı.
Icon i = new ImageIcon(f.toURL());
JLabel x = new JLabel(i);


Otomatik çöp toplama (garbage collection) çok ilginç bir özellik. Pascal’da en büyük sorun bellekten dinamik olarak kazandığımız yerlerin geri kazanılması idi. Bunu programcı her dinamik değişken için elle yapmak zorunda idi. Bu hem programları uzatıyor hem de en küçük bir programcı hatası bellek sızıntılarına (memory leak) yol açıyordu. Şimdi programcılar bu işi JVM’ye devrettiler. Sadece “new” demesini biliyoruz, “dispose” işlemi tarihe karıştı. Kullanılmayan bellek sihirli bir şekilde geri kazanılıyor. Böyle bir çöp kutusu evlerde de çok yararlı olurdu: Siz çöpe atın kendi kendine boşalsın!

İlk Java programlarımı yazarken bir soru hep aklıma takılıyordu: “Bu programları nasıl exe dosyasına çevireceğim?” Altı ay bu sorunun cevabını bulamadım. Daha sonra jar formatını öğrenince sorunun yanlış olduğunu farkettim. Java programları exe olarak değil jar olarak dağıtılıyor. Jar dosyaları aslında zip dosyalarına eşdeğer. Aynı format kullanılıyor. Yani WinZip gibi yaygın programlar ile açılabiliyor. Bir programda geliştirilen bütün sınıflar ve ilgili diğer dosyalar bir jar dosyasında toplanıyor. Hem dosyalar “paketlenmiş” oluyor, hem de “java -jar” komutu ile bir exe programı gibi çalıştırmak mümkün. Java kurulumu doğru yapıldıysa, jar dosyalarını tek tıklama ile açabiliyoruz.

GUI uygulamalarında Java çok yetenekli. Swing library içindeki yüzlerce sınıf ile hemen her türlü ekran tasarımı mümkün. Önce JList sınıfı ile ekranda binlerce satırlık listeleri çok hızlı olarak gösterip seçim yaptırmayı öğrendim. Satır sayısı hızı hiç etkilemiyordu. Daha önceki programlama tecrübemde bir kaç yüz satırdan sonra ekrana yazmanın ne kadar yavaşladığını hatırladım. Sonra JTree sınıfı ile hiyerarşik listeler yapmayı öğrendim. Windows Gezgininde olduğu gibi disk yapısını böyle bir ağaç içinde gösterip klasörleri açıp kapamak çok zor değil. Gene binlerce satır açınca ekranda yavaşlama ya da titreme gözlenmiyor.

Kendi programlarımı ve çalıştığım bölümün eğitim dilini Java'ya taşımak güzel sonuçlar getiriyor.

__MAE