Mesajlarını aradığınız kullanıcı: NX (5)

konu: İşletim Sistemlerinde Çalıştırılabilir Dosyalar  ; forum:: Diğer Konular
NX #1
Ü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.
konu: Dlang Tour Çeviri  ; forum:: Duyurular
NX #2
Üye Ağu 2016 tarihinden beri · 5 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 12205
Bi bak istersen: https://github.com/NightmareX1337/turkish/tree/master/welc…
konu: Dlang Tour Çeviri  ; forum:: Duyurular
NX #3
Üye Ağu 2016 tarihinden beri · 5 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 12203
İngilizcem oldukça iyidir istersen çevirileri ben yapabilirim sen de düzeltme ve bazı yerlerde daha iyi alternatifler sunarak yardımcı olabilirsin çünkü ikimiz de çeviri yapınca otomatikmen birbirimizle çakışacağız ve ikimiz de kendi çevirimiz olmasını istiyoruz. Ama yok ben senin çevirini beğenmem diyorsan... Yapcak bişeyim yok :)
konu: Dlang Tour Çeviri  ; forum:: Duyurular
NX #4
Üye Ağu 2016 tarihinden beri · 5 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 12200
Aslında ben çoktan ilk iki sayfayı çevirdim ama henüz yaptıklarımı GitHub'a senkronize etmiş değilim: https://github.com/NightmareX1337/turkish
İsteyen repo yu takip edebilir.

Sorun şu ki ben aslında teknik kaynakları Türkçe okumaktan nefret ederim. Çoğu kelimenin Türkçe karşılığını kullanmak garip oluyor ve kimi kelimelerin tam karşılığı da bulunmuyor zaten. Hele bir de teknik terimlerin türkçesini yazınca bildiğin anlamıyorum okuduğumu. O yüzden çeviri yerine içeriği kendime göre ingilizce-türkçe karıştırarak baştan yazmayı tercih ederdim ama ingilizcesiyle farklı içeriğe sahip bi çeviri de pek hoş olmayacağından yapmıyorum tabi. Genelde kendini otomatik türkçe yapan program ve siteleri de ingilizce ayarlayıp kullanırım. Ama ingilizcesi yeterli olmayan birçok insan türkçe çeviri arıyor (ingilizce öğrenmek yerine) bu yüzden yardımcı olmak için yapıyoruz işte...
Dlang-tour u çevirirken birçok terimi türkçe parantez içinde yanına yazdım. Bazı cümleleri kendime göre çeviriyorum anlatılmak isteneni bozmadan.
Bakalım nasıl olcak : D
konu: İşletim Sistemlerinde Çalıştırılabilir Dosyalar  ; forum:: Diğer Konular
NX #5
Üye Ağu 2016 tarihinden beri · 5 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 12179
Çok fazla soru işareti var, onları açıklayıcı bi şekilde halledelim.

İbrahim on 2016-08-06, 06: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, 06: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, 06: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, 06: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, 06: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.
Özel Karakterler:
Özel sorgulamalar

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-11-19, 08:14:50 (UTC -08:00)