Mengapa kompiler biasanya hanya menghasilkan executable untuk platform tempat mereka diinstal?

10

Saya seorang pengembang C ++ dan dalam upaya untuk lebih memahami pengembangan lintas-platform, saya mencoba untuk mendapatkan pemahaman yang lebih baik tentang beberapa detail implementasi kompiler dan bagaimana tepatnya mereka membuat binari OS spesifik. Di tengah studi saya, saya menyadari bahwa, setidaknya untuk sementara waktu, sebagian besar kompiler yang Anda unduh untuk platform tertentu hanya mengkompilasi binari untuk platform itu. Jadi jika Anda mengunduh IDE yang datang dengan exiler kompiler untuk Windows, maka kompiler itu hanya akan dapat mengkompilasi program Anda untuk aplikasi windows x86-x64 dan bukan aplikasi Linux atau Mac.

Sekarang saya mengerti bahwa platform yang berbeda membutuhkan format biner yang berbeda, tetapi apa yang membuatnya sulit untuk mengatakan kompiler C ++ visual pada windows untuk menghasilkan file biner linux yang dapat dieksekusi? Selama Anda memiliki instruksi perakitan untuk CPU yang Anda jalankan, serta pustaka spesifik OS, tidakkah Anda bisa mengkompilasi exectuables untuk platform apa pun pada mesin apa pun?

Jason
sumber
5
Ada banyak kompiler silang: Saya tidak yakin mengapa Anda berpikir kompilasi silang jarang terjadi. Visual C ++ masuk akal mengingat Microsoft menginginkan penguncian Windows, tetapi mereka bahkan menyediakan alat kompiler Android di VS2017.
Yah banyak situs lain yang sepertinya keluar seperti kompilasi silang kompilasi yang sangat sulit diimplementasikan dan hanya sampai saat ini lebih banyak kompiler lintas-platform bermunculan. Jika ini benar maka saya hanya ingin tahu apa yang akan membuat kompilasi silang menjadi sulit jika Anda hanya memerlukan instruksi perakitan CPU tertentu dan sistem asli memerlukan OS yang sesuai
Jason
Saya pikir Anda memiliki masalah pengertian terminologi di sini yang mungkin membingungkan. Anda menggunakan "cross compiler 'dan" cross-platform compiler "secara bergantian, tetapi semuanya berbeda (meskipun terkait): kompiler silang adalah kompiler untuk platform yang berbeda dengan yang Anda gunakan, dan hal-hal seperti itu telah tersedia selama kompiler memilikinya. Kompiler lintas platform adalah kompiler yang menggunakan langkah menengah untuk memisahkan pemrosesan dan optimalisasi bahasa sumber dari pembuatan kode spesifik platform sehingga dapat digunakan. ..
Jules
... untuk mengkompilasi kode untuk beberapa platform target dengan perubahan minimal. Hal-hal seperti itu adalah inovasi yang lebih baru dan jauh lebih kompleks.
Jules

Jawaban:

18

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.

Blrfl
sumber
Ini sekarang jawaban terbaik dan paling mendalam. Saya pikir sejarah sangat membantu untuk memahami konteksnya.
Jason
3
@Jason Terkadang lebih baik menjadi tua. :-)
Blrfl
4
"Selain keengganan untuk melakukan itu di pihak Microsoft, sama sekali tidak ada." - Saya tidak akan menyebutnya "keengganan". Microsoft adalah bisnis berorientasi laba yang diperdagangkan untuk umum; mereka memiliki tanggung jawab tertentu kepada pemegang saham dan pemangku kepentingan mereka. Mereka perlu merekrut, melatih, dan membayar pengembang untuk Linux backend, mereka perlu merekrut, melatih, dan membayar penguji untuk Linux backend, mereka perlu merekrut, melatih, dan membayar staf pendukung yang akrab dengan Linux backend, mereka perlu merancang, mengembangkan, memelihara, mendukung, dan memperluas kode, semuanya untuk platform yang…
Jörg W Mittag
... di luar bisnis inti mereka. Dan semua itu hanya untuk menambahkan kompiler n +1 ke kompiler n yang sudah ada yang bisa Anda gunakan juga. Apa manfaat bisnis bagi Microsoft untuk bersaing dengan GCC, Dentang, ICC (Intel), xlc (IBM), Digital Mars, tcc, pcc, TenDRA, Metrowerks, PathScale, ...? Secara pribadi, saya tidak berpikir ada.
Jörg W Mittag
3
@ JörgWMittag What would be the business benefit ... I don't think there is any.- Kedengarannya itu alasan yang bagus untuk tidak mau melakukannya.
Blrfl
8

Ya, jika Anda memiliki semua info tentang platform target Anda, tidak masalah platform apa yang Anda jalankan.

Ada dua masalah yang cenderung muncul:

  1. Orang tidak fokus pada itu karena ini adalah skenario yang kurang umum. Seringkali satu-satunya kompilasi silang Anda adalah kompiler sehingga Anda kemudian dapat berhenti kompilasi silang. Kurang fokus berarti dukungan yang lebih buruk.
  2. Program non-sepele membutuhkan lebih dari sekadar kode. Berurusan dengan penyertaan / keterkaitan perpustakaan menjadi sedikit lebih mudah ketika Anda memiliki perpustakaan untuk platform yang Anda jalankan. Mereka akan berada di lokasi yang terkenal, dalam penyandian yang terkenal.

Tentu saja itu tidak dapat diatasi. Sebagian besar, Anda mendapatkan kompiler yang menargetkan platform yang mereka jalankan karena itulah yang diinginkan orang.

Telastyn
sumber
Saya melihat. Terimakasih atas klarifikasinya. Jelas lebih masuk akal bagi saya sekarang.
Jason
Saya menyalahkan intellisense.
JeffO
2

Saya tidak setuju dengan premis Anda. Ada jutaan pengembang Android dan iOS. Dan mereka semua menggunakan kompiler yang berjalan di Windows atau Mac, menghasilkan kode untuk komputer yang sama sekali berbeda.

Anda tidak akan mendapatkan kompiler silang jika tidak ada permintaan pasar untuk itu. Orang-orang yang mengembangkan kode untuk desktop Linux misalnya sebagian besar memiliki desktop Linux yang tersedia dan akan menggunakan kompiler berbasis Linux - jauh lebih cepat jika Anda dapat menjalankan aplikasi Anda secara langsung pada mesin di mana ia dikompilasi tanpa memindahkannya melalui jaringan, lebih mudah dan lebih cepat untuk memiliki debugger yang berjalan di mesin yang sama dan seterusnya.

Jadi berapa banyak lagi uang yang akan dihasilkan Microsoft jika kompiler mereka juga akan membangun untuk Linux? Sekitar $ 0. Berapa banyak lagi perangkat lunak untuk Windows yang akan dibuat? Tidak ada Berapa banyak lagi perangkat lunak Linux yang akan dibuat? Tidak tahu, tapi itu bukan sesuatu yang Microsoft pedulikan. Berapa biayanya? Cukup banyak. Compiler harus bebas bug. Mereka harus diuji.

Masalah lain: Jika Anda menulis penulisan kompiler di Windows, Anda memerlukan seseorang yang tahu cara menulis perangkat lunak Windows. Jika Anda menulis kompiler untuk Linux, Anda memerlukan seseorang yang tahu cara menulis perangkat lunak Linux. Jika Anda menulis kompiler untuk Linux yang berjalan di Windows, tiba-tiba Anda membutuhkan roti pengembang yang jauh lebih langka yang mengenal Windows dan Linux.

gnasher729
sumber
"Ada jutaan pengembang Android dan iOS. Dan mereka semua menggunakan kompiler yang berjalan pada Windows atau Mac, menghasilkan kode untuk komputer yang sama sekali berbeda." Um tidak, bukan mereka. Banyak, banyak pengembang Android menggunakan Linux, dan pada kenyataannya itu adalah platform yang paling populer untuk para pengembang menurut survei StackExchange sendiri.
Miles Rout