apa yang membuatnya sulit untuk mengatakan kompiler visual C ++ di windows untuk menghasilkan file executable biner linux?
Selain keengganan untuk melakukan itu di pihak Microsoft, sama sekali tidak ada. Rintangannya tidak teknis.
Toolchain pengembangan hanyalah program yang mengambil input dan menghasilkan output. Visual C ++ menghasilkan perakitan x86 dan kemudian menggunakan assembler untuk mengonversinya menjadi file objek COFF. Jika Microsoft ingin membuatnya menghasilkan ELF, itu hanya kode: perakitan masuk, ELF padam. Tidak ada keajaiban tentang file objek atau pustaka; mereka hanya kumpulan data dalam format yang dipahami dengan baik.
Jauh di zaman batu, kompilasi silang jauh lebih sulit karena lebih sering daripada tidak, Anda akan menulis rantai alat untuk platform target Anda dalam perakitan untuk platform di mana ia akan berjalan. Ini berarti bahwa jika semua yang ada di dunia adalah arsitektur VAX, M68K, dan Alpha, satu set lengkap cross-compiler akan memerlukan penulisan sembilan dari mereka, sebagian besar dari awal. (VAX-to-VAX, VAX-to-M68K, VAX-to-Alpha, M68K-to-VAX, M68K-to-M68K, dll.) Itu sedikit berlebihan karena sebagian dari kompiler VAX dapat digunakan kembali dan terlampir pada generator kode untuk setiap target (mis., VAX, M68K dan Alpha, masing-masing ditulis untuk VAX.)
Masalah itu hilang ketika kami mulai menulis kompiler dalam bahasa yang tidak terikat pada prosesor tertentu, seperti C. Pergi dengan rute itu berarti Anda menulis seluruh rantai alat sekali dalam C dan menggunakan platform tertulis-untuk-lokal- C compiler untuk membangunnya. (Anda sering menggunakan kompiler untuk mengkompilasi ulang sendiri setelah bootstrap di kompiler platform lokal, tapi itu diskusi lain.) Hasilnya adalah membangun cross-compiler pada dasarnya sama dengan upaya membangun kompiler asli di platform lokal. Satu-satunya perbedaan signifikan adalah bahwa di suatu tempat dalam proses pembuatan, Anda mengatakannya untuk mengkompilasi dalam generator kode untuk platform target Anda, bukan yang untuk platform lokal, yang akan menjadi pilihan logis.
Ketika arsitektur kompiler berevolusi, menjadi nyaman untuk hanya memasukkan dan membangun semua generator kode dengan produk dan memilih mana yang akan digunakan saat runtime. Dentang / LLVM melakukan ini, dan saya yakin ada yang lain.
Setelah Anda memiliki toolchain yang berfungsi (compiler, assembler, linker), pustaka dibangun dari sumber dan akhirnya Anda mendapatkan semua yang Anda butuhkan untuk menghasilkan file yang dapat dieksekusi untuk beberapa platform lain.