Pazartesi, Nisan 09, 2007

Cross-Platform Programlama 1



Cross-platform programming yada Multi Platform Programming ile Yazdığımız bir programı birden fazla işletim sistemin ve işlemci ile çalıştırmayı kastediyoruz.

Hem Linux Hem de Windows altında çalışan birkaç program yazdığımıza göre bu konuda ahkam kesebiliriz. Keseceğimiz Ahkam Bilgimizin deryalığından değil elimizdekini paylaşma arzusundandır.

Konuya başlamadan önce Programların çalıştırılma şekillerine göre bir sınıflandırma yapmak istiyorum.
- Derlenerek çalıştırılan programlar - Compiler-
- Yorumlanarak çalıştırılan programlar - Interpreter -
- Yarı Derlenip Yarı yorumlanarak çalıştırılan programlar
Derleyici ne yapar ? : Kaynak kodu (Source Code) makine koduna (Machine Code) çevirir Yani programımız derlenerek sonuçta O makinanın koduna (Intel yada Risc vb) ve İşletim sisteminin çalıştırılabilri dosya tipine (PE, Elf ...) çevrilir. derlenmiş programların avantajı -hız açısından- İşlemci tarafından direk olarak çalıştırabilmesidir. Bu tipteki Dillere örnek vermek istersek C, C++ Pascal,... Programın başka bir işletim sisteminde yada makinada çalışa bilmesi için O platformda derlenemesi -derlenebilmesi- gerekir. Bu da ancak cross-platform kütüphanelerle mümkün olabilir. Mesela : WxWidgets, FLTK, QT, GTK,...

Yorumlayıcı ne yapar peki ? : Kaynak kodu Kendisi çalıştırır. Bu durumda sizin programın çalıştığı platformla ilginiz kalmaz. Programınız Yorumlayıcının çalıştığı heryerde çalışır. Fakat Programınızı Kod olarak dağıtmanız gerekir. Yorumlanarak çalışması da yavaşlık getirir.

Yarı Derleme Yarı yorumlama diyerek kastettiğim Java ve .Net - Aslında Mono - dir. Şatafatlı pek çok tanımlamanın dışında benim anladığım kadarıyla Kaynak Kod Ara bir koda derleniyor. ve Bu ara kod değişik platformlarda yorumlayıcılar - Java Virtual Machine yada .Net framework - yardımıyla çalıştırılıyor. Bu nisbi derleme sayesinde -Derlenmiş programlar kadar olmasada - hızlı çalışan programlar üretebiliyorsunuz. Fakat Programınızın derlemiş olmanıza rağmen Decompiler ile çok rahat Kaynak koduna ulaşılabiliniyor.

Sonuç:
Aşırı hız bağımlısı bir program yazmıyorsanız 1, kolaylıkla değişik platformlarda çalıştırmak 2, Kısa yoldan ticari program yazmak 3 ve Az birazda kodunuz gizlemek istiyorsanız. 4 Üçüncü seçeneği size öneririm.

Java mı Mono mu Derseniz ?
Eğer Basic Yada Pascal biliyorsanız ve yeni bir dil öğrenmekle uğraşmak istemiyorsanız tavsiyem Mono. .Net'in bir avantajı bu zaten desteklenen pekçok dil var Mesela Pascal için oldukça iddialı bir ürün var Chrome 1 2 Eğer Ben bir Pascal programcısı olsam muhakak denerdim.
Eğer C++ biliyorsanız, Java da C# da c++'a yakın diller.

Yok kardeşim Derlemeyi hiç bir şeye değişmem derseniz bu konuda epey bir araştırma yapmanız lazım. Ben bir kaç örnek vermek istiyorum.
Basic için RealBasic , SmalBasic
Pascal için Lazarus

C++ için benim seçtiğim yol :
Cross-Platform bir IDE + Cross-Platform Kütüphaneler
...
devam edecek

1 Makina koduna çevrilmiş programa göre daha yavaştır
2 Taşınabilirliği için siz uğraşmazsınız yorumlayıcılar yapar
3 Pek çok kütüphane bu tipte kullanım için adapte edilmiş ve standartlaştırılmış halde önünüzde durur
4 Kodunuzu derlediğiniz için ancak decompilerla ancak kodunuza ulaşıla bilir

6 yorum:

Adsız dedi ki...

Selam,

Fakat Programınızın derlemiş olmanıza rağmen Decompiler ile çok rahat Kaynak koduna ulaşılabiliniyor.

Java için yazilmis ticari obfuscation tools(araçlari) mevcut. Her ne kadar kaynak kod decompile edilse bile kaynak koddan birsey çikarmak hemen hemen olanaksizlasiyor. Tekrardan compile etmek ise mümkün görünmüyor.

Bunun yaninda, bir classloader araciliğiyla sinifimizi sifreleyip, programin çalistirilmasi sirasinda desifreleme yapabiliriz.
http://www.javaworld.com/javaworld/javaqa/2003-05/01-qa-0509-jcrypt.html?page=1

Bunun sonucunda da jad ile *.class dosyamiz decompile edilemiyor. Ancak decompile edilmesi programin için yazilan classloader'dan daha kisa sürebilir. Classloader'in sifreleme mantiğini anlayarak.

Java'nin ilk zamanlarda fazla tutulmamasinin sebebi bilgisayarlarin Java uygulamalarini çalistiracak kadar gelistirilmis olmamasindan kaynaklaniyordu.(yavas çalisma) Ancak su an için, Java cep telefonlarindan, sunuculara kadar her yerde kullanilabilir duruma geldi.

bluekid dedi ki...

obfuscation'ı duydum fakat Makina koduna çevrilmiş Programlar bile ReverseEngineering'den kurtulamazken obfuscation'nın çok da başarılı olacağını zannetmiyorum. . Yinede ufak bir araştırma yaptım
http://www.cs.arizona.edu/~collberg/Research/Students/DouglasLow/obfuscation.html
pek de haksız olmadığıma inandım.
bakınız de-obfuscation.
ayni şeyler .Net içinde geçerli.
Bu arada denemesi bedava
Java Decompiler
http://programmerstools.org/taxonomy/term/41
.Net Decompiler
http://programmerstools.org/taxonomy/term/43

Adsız dedi ki...

merhabalar,

yazıyı ilgi ile okudum devamını da kendi adıma bekliyorum sabırsızlıkla, elbette benim gibi düşünenler vardır..

Bu arada .Net için de obfuscator ürünleri fazlasıyla mevcut. güvenlik seviyesi üst düzey bi proje de bir .net obfuscator kullanarak bazı şeyleri ispatlamak zorunda kalmıştık :) oradan biliyorum..

bluekid dedi ki...

Serinin devamıda yazıldı toplam 5 yazı oldu.
üstteki yorumumda linkini verdim .Net içinde epey bir decompiler var
obfuscation işi zorlaştıracağı açık ama çok da başarılı olacağını zannetmiyorum

Adsız dedi ki...

Merhaba elinizde cross-platform çalışan basit de olsa kolay bir program varmı?

bluekid dedi ki...

:)
Burda yayınladığımız ve C/C++ ile yazdığımız çoğu program cross-platformdur zaten