Derleyiciler neden genellikle yalnızca kuruldukları platform için yürütülebilir dosyalar üretir?


10

Ben bir C ++ geliştiricisiyim ve platformlar arası gelişimi daha iyi anlamak için, derleyicilerin bazı uygulama ayrıntılarını ve tam olarak işletim sistemine özgü ikili dosyaları nasıl oluşturduklarını daha iyi anlamaya çalışıyorum. Çalışmamın ortasında, en azından bir süreliğine, belirli bir platform için indirdiğiniz çoğu derleyicinin yalnızca bu platform için ikili dosyaları derlediğini fark ettim. Bu nedenle, Windows için bir derleyici exe ile gelen bir IDE indirdiyseniz, bu derleyici programınızı Linux veya Mac uygulamaları için değil, yalnızca x86-x64 windows uygulamaları için derleyebilir.

Şimdi farklı platformların farklı ikili biçimler gerektirdiğini anlıyorum, ancak Windows'daki görsel C ++ derleyicisinin bir linux ikili yürütülebilir dosya oluşturmasını zorlaştıran şey nedir? Çalıştırdığınız CPU ve işletim sistemine özel kütüphaneler için montaj talimatlarına sahip olduğunuz sürece, herhangi bir makinedeki herhangi bir platform için exectuable'ları derleyememeniz gerekir mi?


5
Birçok çapraz derleyici var: Çapraz derlemenin neden nadir olduğunu düşündüğünüzden emin değilim. Visual C ++, Microsoft'un Windows kilitlenmesini istediği mantıklıdır, ancak VS2017'de Android derleyici araçları bile sağlarlar.

Pek çok başka site, çapraz derleme derleyicisinin uygulanması çok zor ve sadece yakın zamana kadar yayılmış daha fazla çapraz platform derleyicisine sahip gibi görünüyor. Bu doğruysa, sadece belirli CPU montaj talimatlarına ve yerel sistem çağrılarına karşılık gelen işletim sistemine ihtiyacınız varsa çapraz derlemeyi zorlaştıracak olanı merak ediyorum
Jason

Sanırım burada kafa karıştırıcı olabilecek bir terminoloji anlama probleminiz var. "Çapraz derleyici" ve "çapraz platform derleyicisini" dönüşümlü olarak kullanıyorsunuz, ancak bunlar farklı şeyler (ilişkili olsalar da): çapraz derleyici, kullandığınız platformdan farklı bir platform için derleyicidir, Bir platformlar arası derleyici, kullanılabilmesi için kaynak dilin işleme ve optimizasyonunu platforma özel kod oluşturma işleminden ayırmak için bir ara adım kullanan bir derleyicidir. ..
Jules

... minimum değişiklikle birden fazla hedef platform için kod derlemek için. Bu tür şeyler daha yeni bir yenilik ve çok daha karmaşık.
Jules

Yanıtlar:


18

ne windows görsel C ++ derleyici bir linux ikili yürütülebilir dosya oluşturmak için zorlaştırır?

Microsoft'un bunu yapmaya isteksizliği dışında kesinlikle hiçbir şey. Engeller teknik değil.

Geliştirme araç zincirleri sadece girdi alan ve çıktı üreten programlardır. Visual C ++, x86 derleme üretir ve sonra bir COFF nesne dosyasına dönüştürmek için bir derleyici kullanır. Microsoft bunun yerine ELF üretmesini istiyorsa, sadece kod: montaj gelir, ELF söner. Nesne dosyaları veya kütüphanelerde sihir yoktur; bunlar sadece iyi anlaşılmış bir formatta veri yığınlarıdır.

Taş devrinde, çapraz derleme çok daha zordu çünkü daha sık olmamasından, çalışacağı platform için montajda hedef platformunuz için takım zincirini yazardınız. Bu, eğer dünyadaki her şey VAX, M68K ve Alpha mimarileri olsaydı, tam bir çapraz derleyici paketinin dokuz tanesini, çoğunlukla sıfırdan yazmayı gerektireceği anlamına geliyordu. (VAX-VAX, VAX-M68K, VAX-Alfa, M68K-VAX, M68K-M68K, vb.) VAX derleyicisinin bazı bölümleri yeniden kullanılabileceğinden ve her bir hedef için kod oluşturuculara eklenir (ör. VAX, M68K ve Alpha, her biri VAX için yazılmıştır.)

Belirli bir işlemciye bağlı olmayan bir dilde derleyiciler yazmaya başladığımızda bu sorun ortadan kalktı, böyle bir C. Bu rotaya gitmek, tüm araç zincirini C'ye bir kez yazmanız ve yerel bir platform için yazdığınız anlamına gelir C derleyicisi oluşturmak için. (Derleyiciyi genellikle yerel platformun derleyicisine önyüklendikten sonra yeniden derlemek için kullanırsınız, ancak bu başka bir tartışmadır.) Bunun sonucu, çapraz derleyici oluşturmanın, yerel platform. Tek önemli fark, oluşturma sürecinde bir yerde, mantıksal seçim olan yerel platform için olan yerine, platformunuz için kod oluşturucuda derlemesini söylemiş olmanızdır.

Derleyicilerin mimarisi geliştikçe, tüm kod üreticilerini ürüne dahil etmek ve oluşturmak ve çalışma zamanında hangisinin kullanılacağını seçmek uygun hale geldi. Clang / LLVM bunu yapıyor ve eminim başkaları da var.

Çalışan bir araç zincirine (derleyici, montajcı, bağlayıcı) sahip olduğunuzda, kütüphaneler kaynaklardan oluşturulur ve sonunda başka bir platform için yürütülebilir bir dosya oluşturmak için ihtiyacınız olan her şeyle sonuçlanırsınız.


Bu şimdi en iyi, en derinlemesine cevap. Bence tarih gerçekten bağlamı anlamaya yardımcı oluyor.
Jason

3
@ Jason Bazen yaşlanmak için para ödüyor. :-)
Blrfl

4
"Microsoft'un bunu yapmaya isteksizliği dışında kesinlikle hiçbir şey." - Ben buna "isteksizlik" demezdim. Microsoft halka açık kâr amaçlı bir iştir; hissedarlarına ve paydaşlarına karşı belirli sorumlulukları vardır. Onlar işe gerekir, tren, ve ödeme geliştiriciler Linux arka uç için, onlar işe gerekir, tren, ve ödeme Linux arka uç için test, onlar işe gerekir, tren, ve ödeme Linux arka uç aşina destek personeli, kod tasarlamak, geliştirmek, sürdürmek, desteklemek ve genişletmek zorunda kalacaklar, hepsi bu kadar…
Jörg W Mittag

... esas işleri dışında. Ve tüm bunlar, halihazırda kullanabileceğiniz mevcut n derleyicilerine bir n + 1 derleyicisini eklemek için. Microsoft'un GCC, Clang, ICC (Intel), xlc (IBM), Digital Mars, tcc, pcc, TenDRA, Metrowerks, PathScale,… ile rekabet etmesinin faydası ne olacak ? Şahsen bende olduğunu sanmıyorum.
Jörg W Mittag

3
@ JörgWMittag What would be the business benefit ... I don't think there is any.- Bunu yapmak istememek için iyi bir neden gibi görünüyor.
Blrfl

8

Evet, hedef platformunuzla ilgili tüm bilgilere sahipseniz, aslında hangi platformda çalıştığınız önemli değildir.

Kırılma eğilimi gösteren iki sorun var:

  1. İnsanlar buna odaklanmıyor çünkü daha az yaygın bir senaryo. Genellikle derlediğiniz tek şey bir derleyicidir, böylece çapraz derlemeyi durdurabilirsiniz. Daha az odaklanma, daha kötü destek anlamına gelir.
  2. Önemsiz programlar koddan daha fazlasına ihtiyaç duyar. Üzerinde çalıştığınız platform için kütüphaneleriniz olduğunda kütüphane içerme / bağlantı ile uğraşmak biraz daha kolaylaşır. İyi bilinen bir yerde, iyi bilinen bir kodlamada olacaklar.

Bunlar elbette aşılamaz. Çoğunlukla, üzerinde çalıştıkları platformu hedefleyen derleyiciler alırsınız, çünkü insanların istediği budur.


Anlıyorum. Açıklama için teşekkürler. Şimdi kesinlikle benim için daha anlamlı.
Jason

Zekayı suçluyorum.
JeffO

2

Ben sizin öncülünüze katılmıyorum. Milyonlarca Android ve iOS geliştiricisi var. Ve hepsi tamamen farklı bir bilgisayar için kod üreten Windows veya Mac üzerinde çalışan kullanım derleyiciler.

Piyasa talebi yoksa çapraz derleyici almazsınız. Örneğin bir Linux masaüstü için kod geliştiren insanlar çoğunlukla bir Linux masaüstüne sahiptir ve Linux tabanlı bir derleyici kullanırlar - uygulamanızı doğrudan ağ üzerinden aktarılmadan derlendiği makinede çalıştırabilirseniz çok daha hızlı, çok daha kolay ve hızlı aynı makinede çalışan bir hata ayıklayıcı vb.

Öyleyse, derleyicileri Linux için de derlenirse Microsoft ne kadar para kazanırdı? Yaklaşık 0 dolar. Windows için daha ne kadar yazılım oluşturulur? Yok. Ne kadar daha fazla Linux yazılımı yaratılacak? Hiçbir fikrim yok, ama bu Microsoft'un önem verdiği bir şey değil. Maliyeti ne olur? Oldukça kayda değer. Derleyiciler hatasız olmalıdır. Test edilmelidir.

Başka bir sorun: Windows'ta bir derleyici yazıyorsanız, Windows yazılımının nasıl yazılacağını bilen birine ihtiyacınız vardır. Linux için bir derleyici yazarsanız, Linux yazılımının nasıl yazılacağını bilen birine ihtiyacınız vardır. Windows üzerinde çalışan Linux için bir derleyici yazarsanız, aniden hem Windows hem de Linux'u tanıyan çok daha nadir bir geliştirici ekmeğine ihtiyacınız vardır.


"Milyonlarca Android ve iOS geliştiricisi var. Hepsi Windows veya Mac üzerinde çalışan ve tamamen farklı bir bilgisayar için kod üreten derleyiciler kullanıyor." Hayır, değil. Birçok, birçok Android geliştiricisi Linux kullanıyor ve aslında StackExchange'in kendi anketine göre geliştiriciler için en popüler platform.
Miles Rout
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.