Forum: Diğer Konular RSS
İşletim Sistemlerinde Çalıştırılabilir Dosyalar
İbrahim #1
Üye Eki 2015 tarihinden beri · 126 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: İşletim Sistemlerinde Çalıştırılabilir Dosyalar
Selamün Aleyküm;

İşletim sistemlerinde çalıştırılabilir dosyalar olan uygulamalar (Windows'ta .exe dosyaları mesela) nasıl bu şekilde işletim sisteminde çalıştırılabilir hale getiriliyor? Yani ben C, C++, Pascal vs. derlemeli dillerde kod yazıp derlediğimde arka planda nasıl bir işlem oluyor? Aslında asıl öğrenmek istediğim durum şu: Android'de yazılan uygulamalar Dalvik veya ART üzerinde çalışıyor. Aslında Android 4.4'den beri Dalvik emülatörünü bırakıp ART kullanmaya başladı ve bildiğim kadarıyla da bu ART direk kodları donanımla bağdaştırıyor. Yani Linux, Windows. Mac OS gibi işletim sistemlerinde bildiğimiz derleme gibi oluyor bildiğim kadarıyla. Sanırım ART'ye derleyici demek doğru olabilir bu durumda. bkz: https://source.android.com/devices/tech/dalvik/.

Benim anlamadığım olay ise biz C kodu yazdığımızda bir C derleyicisi ile ya da bir C++ kodunu C++ derleyicisi ile derleyerek Windows, Linux, Mac OS gibi bir sistemde direk program olarak çalıştırıyoruz. Lakin Android işletim sistemine baktığımızda derleyiciler yazdığımız Android uygulamasını ART kullanmadan çalıştıramıyor. Halbuki Linux, Windows gibi sistemlerde sadece o dile ait bir derleyici olması yetiyor. Sormak istediğim asıl soruysa ben C, C++, Pascal, Rust veya D ile yazdığım kodu bu dillere ait bir derleyiciyle derleyip ART olup olmamasına bakmadan direk olarak sistem üzerinde çalıştırabilir miyim?

Yani merak ediyorum da niçin Windows, Linux gibi sistemlerde kodları makine koduna derleyip direk olarak çalıştırabiliyoruz da Android gibi işletim sistemlerinde ART gibi araçlara maruz kalıyoruz? Halbuki Linux da, Windows da, Android de, iOS de birer işletim sistemi. Qt C++ kullandığı halde Android'e bir C++ kodu yazıp derleyip APK halinde getirip sonra da apk decompiler araçlarla bu Qt - C++ ile yazılan apk'yı çözdüğümde içerisinde Java kodları oluyor, C++ değil. Buradan da anlaşılan o ki ister Qt C++'da yaz, ister Xamarin C# ile yaz, ister React Native Javascript ile yaz, oluşan apk dosyası çözüldüğünde kodların Java olarak karşımıza çıkması ART vb. sistemlere maruz kaldığını gösteriyor.

Demem o ki Linux, Windows, Mac OS gibi sistemlerde nasıl C++ kodunu bir derleyici ile derleyip direk olarak çalıştırıyorsak Android'de de bu şekilde direk olarak makine koduna dönüştürebilir miyiz?

Teşekkürler!
kerdemdemir #2
Üye Eyl 2013 tarihinden beri · 53 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Merhaba İbrahim Aleyküm Selam,

Ben bir kaç coursera ve kitap hariç hiç Android ile uğraşmadım ama sorunun cevabını biliyorum galiba.

Android 'de iki opsiyonumuz oluyor. İlk yol java kullanmak.
İkinci yol ise Native kütüphaneleri kullanarak C/C++ kullanmak. Çok uğraşmak istemiyorsan ilk yolu kullanmanı öneririm. Aşağıda android'in design resmini görebilirsin. Java'nın daha üst seviyede olduğunu görebilirsin.

[Resim: http://4.bp.blogspot.com/-5KiCKsc9NjQ/UCXugyn4TCI/AAAAAAAAAEE/nzxBy6-kxFk/s320/646px-Diagram_android.png]

Senin sorunun cevabının ben javanın çalışma mantığında olduğunu düşüyünüyorum. Javanın derlenebilmesi için JVM(java virtual machine) lazımdır. Eğer java kodunun derlenmesi isteniyorsa o makinede mutlaka bir çeşit jvm olması lazımdır. Yazılan java kodu derleyiceler tarafından .class dosyalarına
dönüştürülür ve JVM bu .class dosyarını alır belleğe yüklenip çalıştırır. JVM olmadan java kodu hiç bir şey ifade etmez işletim sistemi için.

Android'de bizim Oracle'in JVM'i direk kullanılmamıştır bunun sebebi Android'in tablet, telefon gibi daha kısıtlı ortamlarda çalışması. İşte Darlik, Art yok efendim Lollipop bilmemne sadece özelleştirilmiş JVM implementasyonlarıdır.

Günümüzde hızlı ürün geliştirme önemli olduğundan Android java'yı ön plana çıkartmıştır fakat native dil desteğide hala var. Native kütüphaneleri kullanarak C/C++ kodu kullanmak mümkün. Fakat daha yorucu.
NDK(native development kit) öğrenmek istersen şu linke bakabilirsin
https://developer.android.com/ndk/guides/index.html
Ayrıca D ile de native kod yazmak mümkün şu linke bakabilirsin https://wiki.dlang.org/Build_DMD_for_Android

Bu arada direk geliştirmeye girmeden mutlaka Service,Activitity konuları teorik anlatan kitaplara bir bakmanı öneririm.
İbrahim #3
Üye Eki 2015 tarihinden beri · 126 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
@kerdemdemir cevabınız için teşekkür ederim.
Aslında şöyle sormalıyım: Android'de zaten JVM kullanılmamış onun yerine ART, Dalvik sistemleri yazılmış. Ama Linux, Windows, Mac OS gibi işletim sistemlerinde böyle sistemler yok, sadece C, C++, Rust, D, Pascal vb. derlenen dillerin derleyicileri ile o platforma direk makine kodu üretebiliyoruz. Lakin niçin Android'de böyle bir mantık izlenmemiş? Çünkü zaten yazdığımız Android SDK kodları yalnızca Android'de çalışıyor, başka bir işletim sisteminde çalışmıyor ki JVM tarzı bir ara katmana ihtiyaç duyalım. Madem Android'e farklı dil ve araçlarla, iOS'e farklı dil ve araçlarla vs. uygulama geliştiriyoruz o zaman direk makine kodu üretmek daha mantıklı değil mi?

Ben GCC ile Android'e C, C++, D kodlarını derleyebilir miyim? Yani daha sonra decompiler ile apk'yı çözdüğümde Java dosyaları karşıma çıkmaz değil mi? Çünkü bildiğimiz gibi Java kodunu çözdüğümüzde elde edilen kod bytecode'dur, .NET kodunu çözdüğümüzde elde ettiğimiz kod MSIL'dir ama C, C++, Rust, D, Pascal vs. dillerle yazılan uygulamaları çözdüğümüzde karşımıza makine kodları (aslında Assembly) çıkıyor. İşte Android'de de bu şekilde olamaz mı? C kodunu derlerim ve sonra çözdüğümde elde etmem gerek kodlar assembly olmalı. Bu mümkün mü? Yoksa zaten her mobil platforma ayrı ayrı araçlarla kod yazıyorlar, ne gerek var ART, Dalvik vs. sistemlere? Direk olarak makine kodu üretilmesi daha mantıklı değil mi? Bu şekilde yapılabilir mi?
Teşekkürler.
kerdemdemir #4
Üye Eyl 2013 tarihinden beri · 53 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Aslında ilk cevabımın tekrarı olucak biraz,

1 - Ben GCC ile Android'e C, C++, D kodlarını derleyebilir miyim?

Evet.

Native kütüphaneleri kullanarak C/C++ kodu kullanmak mümkün. Fakat daha yorucu.
NDK(native development kit) öğrenmek istersen şu linke bakabilirsin
https://developer.android.com/ndk/guides/index.html
Ayrıca D ile de native kod yazmak mümkün şu linke bakabilirsin https://wiki.dlang.org/Build_DMD_for_Android


GCC için şu linkte bahsedilen ayarları yapsan yeterli olur diye düşünüyorum.

http://stackoverflow.com/questions/11852187/how-to-compile…

2 -  Android'de zaten JVM kullanılmamış onun yerine ART, Dalvik sistemleri yazılmış.

Android'de bizim Oracle'in JVM'i direk kullanılmamıştır bunun sebebi Android'in tablet, telefon gibi daha kısıtlı ortamlarda çalışması. İşte Dalvik, Art yok efendim Lollipop bilmemne sadece özelleştirilmiş JVM implementasyonlarıdır.

3-  Ne gerek var ART, Dalvik vs. sistemlere?

Günümüzde hızlı ürün geliştirme önemli olduğundan Android java'yı ön plana çıkartmıştır

Bunun daha acarsak sebepler , javayı daha çok kişinin bilmesi , daha üst seviyede bir dil olması filan olabilir.
NX #5
Üye Ağu 2016 tarihinden beri · 5 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #1
Çok fazla soru işareti var, onları açıklayıcı bi şekilde halledelim.

İbrahim on 2016-08-06, 05:25:
İşletim sistemlerinde çalıştırılabilir dosyalar olan uygulamalar (Windows'ta .exe dosyaları mesela) nasıl bu şekilde işletim sisteminde çalıştırılabilir hale getiriliyor? Yani ben C, C++, Pascal vs. derlemeli dillerde kod yazıp derlediğimde arka planda nasıl bir işlem oluyor?
Öncelikle, çeşitli işletim sistemlerinin kendine özgü "executable/çalıştırılabilir" dosya formatı vardır. Örneğin Windows'ta bu PE, Linux'ta (ve Unix benzeri çoğu sistemde) ELF ve Mac OSX'te de Mach-O olmakta.
Derleyicinin işini nasıl yaptığı biraz karışık ve aslında standart kesin bir yolu da yok. Ama genel itibariyle şunları söyleyebiliriz:
Derleyiciler genelde 'front-end' ve 'back-end' modülünden oluşmakta. Front-end kodu okuyup syntatic (yazım) ve semantic (anlam) açıdan doğruladıktan sonra back-end'in kendine özgü düşük seviyeli kod formatına (LLVM IR gibi) çevirir. Back-end bu kodu alıp üzerinde gerekli optimizasyon vb. işlemler uygulayıp "sembolik makine dili / assembly language" ne çevirir. Ardından sembolik yani okunabilir text şeklindeki bu kod da tam anlamıyla CPU'nun okuyabileceği "binary code / machine instructions" a dönüştürülür. Burada çeşitli dillerin çeşitli derleyicilerinin bazı şeyleri farklı yaptığını bilmekte fayda var.
Misal, C/C++ dili derlenirken her dosya tek tek okunup hepsi için birer "object file" (.obj) oluşturulur. Bu dosyalar binary makine kodlarıyla birlikte diğer dosyalarda bulunan semboller için referanslar barındırır. Örneğin çağrılacak bir fonksiyon başka dosyada bulunuyorsa o fonksiyonun kodları değil de fonksiyonun ismini içerir (ki bu da onun referansı olmakta). Linker (bağlayıcı) ise bütün obj dosyalarını birleştirir: referanslar gerçek adreslerle değiştirilir; makine kodları, statik veriler gibi bir çok şey istenen çalıştırılabilir dosya formatına göre düzenlenip ortaya çalışan bir program çıkarılır.
D diline baktığımızdaysa derleyici kaynak kodun tamamının tek seferde üzerinden geçerek sembolleri çeşitli özellikleriyle birlikte aklında tutarak her dosya için obj oluşturma ve bunları birleştirmek için gereksiz harcanan vakit ve elektriği sağ olsun önlüyor. Emin olmamakla birlikte derleyicinin bütün programı tek obj dosyasına derlediğini tahmin ediyorum. Hatta DMD'nin assembly kodu yada obj dosyası bile oluşturmakla uğraşmayıp bellekte işini bitiriverdiğini okumuştum [citation needed].
Aslında Java ve C# gibi hemen her modern dil de bu tarz iki-geçişli derleme yöntemini kullanmakta. Yani sembollerin fonksiyon içleri vs. kodlar okunmadan mantıksal ağacını oluşturarak ikinci geçişte referanslar anında çözümlenerek (linker'ın uğraştığı olay) kodun derlemesi yapılıyor.
Java ve C# daki ciddi farklılık ise back-end'in kodu "doğal makine dili / native machine language / assembly language" e çevirmek yerine Dalvik / ART (Java), CLR (C#) gibi interpreter'in (yorumlayıcı) anlayabileceği byte-code denen kodlara dönüştürmesi. Böylece farklı işlemcili sistemlerde bile tekrar derleme olmadan aynı dosyanın çalıştırılabilmesi mümkün hale geliyor - gerekli interpreter sistemde kurulu olmak şartıyla.
C#'ı Java'dan ayıran bir özellik söz konusu o da Java'da byte-code'lar sürekli yorumlanarak çalışırken C# 'JIT Compiler' (Just In Time) denen bir sistemle byte-code'ları yorumlarken bi yandan da üzerinde çalıştığı makine koduna dönüştürmesi. Bu da kodların gayet hızlı çalışmasını mümkün kılıyor.

İbrahim on 2016-08-06, 05:25:
Aslında asıl öğrenmek istediğim durum şu: Android'de yazılan uygulamalar Dalvik veya ART üzerinde çalışıyor. Aslında Android 4.4'den beri Dalvik emülatörünü bırakıp ART kullanmaya başladı ve bildiğim kadarıyla da bu ART direk kodları donanımla bağdaştırıyor. Yani Linux, Windows. Mac OS gibi işletim sistemlerinde bildiğimiz derleme gibi oluyor bildiğim kadarıyla. Sanırım ART'ye derleyici demek doğru olabilir bu durumda. bkz: https://source.android.com/devices/tech/dalvik/.
ART, Dalvik'ten farklı olarak Android'de kurulan uygulamayı üzerinde bulunduğu cihazın işlemcisine göre makine diline çeviriyor böylece hem Java'nın portability'sinden (taşınabilirlik) ödün verilmemiş oluyor (telefonların ne kadar çeşitli işlemcilere sahip olduğunu düşünürsek bu oldukça önemli) hem de ciddi anlamda performans artışı sağlanıyor. Ama bu hemen her şeyin mümkün olduğu C/C++/D gibi native dillere göre hala çok yavaş kalmakta.

İbrahim on 2016-08-06, 05:25:
Benim anlamadığım olay ise biz C kodu yazdığımızda bir C derleyicisi ile ya da bir C++ kodunu C++ derleyicisi ile derleyerek Windows, Linux, Mac OS gibi bir sistemde direk program olarak çalıştırıyoruz. Lakin Android işletim sistemine baktığımızda derleyiciler yazdığımız Android uygulamasını ART kullanmadan çalıştıramıyor. Halbuki Linux, Windows gibi sistemlerde sadece o dile ait bir derleyici olması yetiyor. Sormak istediğim asıl soruysa ben C, C++, Pascal, Rust veya D ile yazdığım kodu bu dillere ait bir derleyiciyle derleyip ART olup olmamasına bakmadan direk olarak sistem üzerinde çalıştırabilir miyim?
Android tasarımı gereği tamamen Java'yı temel alacak şekilde geliştirildiği için bütün build tool ve compiler ayarları öntanımlı olarak Java tabanlı apk oluşturmaya çalışır. Her ne kadar kodları C++'la yazıp native derleseniz de aslında builder'ın yaptığı C++'la yazılan kodu Java kodlarından çağırıp başlatacak şekilde apk'ya gömmektir. Yani çakmak gazını C++ oluşturuyor ama kıvılcımı veren çakmak taşı Java oluyor.
Her şeye rağmen Android Linux tabanlı bir sistem olduğundan tabi ki %100 native ELF formatındaki executable dosya da aslında çalıştırılabilir. Ancak buna pek gerek duyacağını sanmıyorum.

İbrahim on 2016-08-06, 05:25:
Yani merak ediyorum da niçin Windows, Linux gibi sistemlerde kodları makine koduna derleyip direk olarak çalıştırabiliyoruz da Android gibi işletim sistemlerinde ART gibi araçlara maruz kalıyoruz? Halbuki Linux da, Windows da, Android de, iOS de birer işletim sistemi. Qt C++ kullandığı halde Android'e bir C++ kodu yazıp derleyip APK halinde getirip sonra da apk decompiler araçlarla bu Qt - C++ ile yazılan apk'yı çözdüğümde içerisinde Java kodları oluyor, C++ değil. Buradan da anlaşılan o ki ister Qt C++'da yaz, ister Xamarin C# ile yaz, ister React Native Javascript ile yaz, oluşan apk dosyası çözüldüğünde kodların Java olarak karşımıza çıkması ART vb. sistemlere maruz kaldığını gösteriyor.
Önceki paragrafta da dediğim gibi Android'de saf executable çalıştırmak mümkün ama Android, uygulamaların Java üzerinden çalışacağı varsayılarak tasarlanmış bir sistem. Başka bi deyişle Android uygulama kurucusu uygulamadan Java koduyla giriş yapmasını bekliyor, ondan sonra JNI kullanarak native kodları çağırmak sana kalmış.
C++ vs. dillerde kod yazıp da kodların Java çıkması gibi bi saçmalık söz konusu değil. Ne kadar diğer dillerde de yazılsa apk uygulamayı başlatmaya yarayan minimum Java koduna sahip olmak zorundadır. Yani apk çözüldüğünde çıkan kodlar C++'la yazılan kodun Java'ya çevrilmiş hali değil, sadece C++ kodunu başlatmak için köprü görevi gören kodlardır.
Xamarin/C# (ve tahminimce Javascript) iOS'ta çalışabilmek için native makine koduna derleniyor (bkz: Ahead Of Time compilation) ama bu runtime-reflection gibi bazı özelliklerin kullanılmasını engelliyor. Android'de ise tıpkı bilgisayardaki gibi JIT Compiler C# byte-code'larını çalıştırmakta - bunu da muhtemelen JIT Compiler'ı apk'ya gömerek yaptıklarını düşünüyorum.

İbrahim on 2016-08-06, 05:25:
Demem o ki Linux, Windows, Mac OS gibi sistemlerde nasıl C++ kodunu bir derleyici ile derleyip direk olarak çalıştırıyorsak Android'de de bu şekilde direk olarak makine koduna dönüştürebilir miyiz?
Uzun lafın kısası, C++ zaten direk makine koduna dönüştürülüyor, gel gör ki Android'in canı Java sevdiği için C/C++/D/Pascal/Assembly dilinden derlenen makine kodları Java kodlarının içine gömülerek çalıştırılıyor.
acehreli (Moderatör) #6
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4389 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
NX:
D diline baktığımızdaysa derleyici kaynak kodun tamamının tek seferde üzerinden geçerek sembolleri çeşitli özellikleriyle birlikte aklında tutarak her dosya için obj oluşturma ve bunları birleştirmek için gereksiz harcanan vakit ve elektriği sağ olsun önlüyor.

D de C ve C++'ta olduğu gibi her modülü ayrı ayrı ve hatta işlevlerin içeriklerini görmeden derleyebiliyor. Bildirim (declaration) kavramı D de var ama şablonların ve auto işlevlerin tanımlarının görülmesi şart.

Ancak, hemen her modül bütün işlemleri zaten içerdiğinden çoğu durumda söylediğin gibi oluyor.

Ali
İbrahim #7
Üye Eki 2015 tarihinden beri · 126 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #5
NX on 2016-08-20, 17:07:
Önceki paragrafta da dediğim gibi Android'de saf executable çalıştırmak mümkün ama Android, uygulamaların Java üzerinden çalışacağı varsayılarak tasarlanmış bir sistem. Başka bi deyişle Android uygulama kurucusu uygulamadan Java koduyla giriş yapmasını bekliyor, ondan sonra JNI kullanarak native kodları çağırmak sana kalmış.
C++ vs. dillerde kod yazıp da kodların Java çıkması gibi bi saçmalık söz konusu değil. Ne kadar diğer dillerde de yazılsa apk uygulamayı başlatmaya yarayan minimum Java koduna sahip olmak zorundadır. Yani apk çözüldüğünde çıkan kodlar C++'la yazılan kodun Java'ya çevrilmiş hali değil, sadece C++ kodunu başlatmak için köprü görevi gören kodlardır.

Cevabınız için teşekkür ederim. Peki C++ + Qt ile yazılan bir Android uygulamasında C++ ile yazılmış Qt bileşenleri native araçları mı kullanıyor yoksa Qt kendi bileşenlerini mobile göre mi hazırlamış? Yani misal olarak QPushButton Android'deki Button özelliğini mi kullanıyor? Çünkü Qt'daki QWidget sınıfı ile Android'deki Activity sınıfını bağdaştırabiliyoruz (bkz: http://doc.qt.io/qt-5/qtandroid.html#androidActivity).
Teşekkürler.
NX #8
Üye Ağu 2016 tarihinden beri · 5 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
İbrahim:
Cevabınız için teşekkür ederim. Peki C++ & Qt ile yazılan bir Android uygulamasında C++ ile yazılmış Qt bileşenleri native araçları mı kullanıyor yoksa Qt kendi bileşenlerini mobile göre mi hazırlamış? Yani misal olarak QPushButton Android'deki Button özelliğini mi kullanıyor? Çünkü Qt'daki QWidget sınıfı ile Android'deki Activity sınıfını bağdaştırabiliyoruz (bkz: http://doc.qt.io/qt-5/qtandroid.html#androidActivity).
Teşekkürler.

Qt, wxWidgets benzeri GUI kütüphaneleri gibi işletim sistemlerinin sağladığı arayüzü kullanmak yerine grafiksel çizim, event sistemi vs. kendi ayarlar. Yani Qt Android-Java kütüphanesindeki grafiksel arayüzü taklit eder sadece. Buna emulation da diyebilirsin. Bu yöntemin kendine göre artı ve eksileri var, örneğin Qt'nin MessageBox'unda html kullanabilirken bi yandan da Mac OS X'in native TextBox'undaki yazım denetimini kullanamaman gibi.
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-03-22, 15:17:57 (UTC -07:00)