Mengapa program tidak didistribusikan dalam format yang dikompilasi?

32

Tetapi mereka memberikan instruksi seperti

cd downloaded_program
./configure
make install

Ini menciptakan ELF yang diperlukan, dan mungkin beberapa file .so.

Mengapa tidak meletakkannya di dalam file zip untuk diunduh, seperti pada aplikasi windows? Apakah ada alasan mengapa mereka perlu dikompilasi oleh pengguna?

kucing
sumber
18
itulah cara kode sumber didistribusikan. Anda menandai ini dengan ubuntu - sudahkah Anda mencoba aptbarangnya?
mikeserv
11
Ubuntu: 40.000 program yang paling umum: $ sudo apt-get install [name]. Perangkat lunak yang lebih langka: Beberapa harus dibangun dari sumber dengan {cmake .. && make, ./configure && make, waf, scon, dll. ~ 10 opsi bangun}.
Knud Larsen
6
Anda memiliki tiga versi Windows ©, dan ~ 100 versi "Linux OS". Tidak mungkin memelihara dan menyimpan lebih dari (40.000) program yang paling umum.
Knud Larsen
35
pertanyaan ini salah. perangkat lunak yang paling IS didistribusikan dalam format biner, biasanya dalam .rpmatau .debatau .tgzpaket. Sumber juga didistribusikan bagi mereka yang ingin mengkompilasinya sendiri atau memeriksanya atau memodifikasinya, atau mengemasnya untuk satu atau lebih distro. Tidak ada yang menggunakan .zipuntuk mendistribusikan binari di linux karena file .zip tidak mendukung informasi penting seperti pengguna, grup, dan izin untuk file yang dikandungnya.
cas
2
Saya belum perlu mengkompilasi program Linux apa pun yang ingin saya jalankan. Executables selalu tersedia ... sejauh ini.
user2338816

Jawaban:

34

Mari kita menganalisis faktor-faktor ...

Analisis :

DEPENDENSI MENURUT PLATFORM : Ada beberapa masalah yang muncul di lingkungan di mana pengembang membuat dan memelihara beberapa varian arsitektur khusus aplikasi:

  • Diperlukan kode sumber yang berbeda untuk varian yang berbeda - Sistem operasi berbasis UNIX yang berbeda dapat menggunakan fungsi yang berbeda untuk mengimplementasikan tugas yang sama (misalnya, strchr (3) vs indeks (3)). Demikian juga, mungkin perlu untuk memasukkan file header yang berbeda untuk varian yang berbeda (misalnya, string.h vs strings.h).

  • Prosedur pembuatan yang berbeda diperlukan untuk varian yang berbeda - Prosedur pembuatan untuk platform yang berbeda juga bervariasi. Perbedaannya mungkin melibatkan keterangan tertentu seperti lokasi penyusun, opsi penyusun, dan pustaka.

  • Build untuk varian yang berbeda harus tetap terpisah - Karena ada pohon sumber tunggal, perawatan harus dilakukan untuk memastikan bahwa modul objek dan executable untuk satu arsitektur tidak menjadi bingung dengan yang untuk arsitektur lain. Sebagai contoh, editor tautan tidak boleh mencoba membuat IRIX – 5 yang dapat dieksekusi menggunakan modul objek yang dibangun untuk SunOS – 4.

  • Setiap sistem operasi memiliki skema manajemen penautan sendiri dan harus menyiapkan file ELF (Executable and Linking Format) sesuai kebutuhan.

  • Compiler akan menghasilkan build yang merupakan urutan instruksi , dan arsitektur yang berbeda berarti kumpulan instruksi yang berbeda ( Perbandingan Arsitektur Instruksi Set ). Jadi, output dari kompiler berbeda untuk setiap arsitektur (Contoh: x86, x86-64, ARM, ARM64, IBM Power ISA, PowerPC, Motorola 6800, MOS T 6502, dan banyak lainnya )

KEAMANAN :

  • Jika Anda mengunduh biner, Anda tidak dapat memastikan apakah ia melakukan apa yang dikatakannya, tetapi Anda dapat mencoba mengaudit kode sumber dan menggunakan biner yang dikompilasi sendiri di sistem Anda. Meskipun demikian, pengguna Techmag membuat poin yang baik dalam komentarnya, mengaudit kode membutuhkan coders yang berpengetahuan dan kompeten untuk menilai kode dan bukan jaminan keamanan.

PASAR : Di bagian ini ada banyak faktor, tetapi saya akan mencoba untuk melanjutkannya:

  • Tidak setiap perusahaan bertujuan untuk mencapai semua platform, itu tergantung pada pasar dan popularitas platform dan apa yang ingin mereka jual.

  • Perangkat lunak bebas memiliki semangat membuat perangkat lunak tersedia seluas mungkin, tetapi itu tidak berarti bahwa perangkat lunak tersebut dirancang untuk setiap platform, itu tergantung pada komunitas yang mendukungnya.

Kesimpulan :

Tidak setiap perangkat lunak dirancang untuk setiap platform. Menyediakan binari untuk semua arsitektur dan platform menyiratkan untuk mengkompilasinya, mengujinya, dan memeliharanya untuk semua platform. Itu lebih banyak pekerjaan yang kadang-kadang terlalu mahal, dan dapat dihindari jika pengguna mengkompilasinya di platform sendiri. Selain itu, pengguna akan mengetahui apa yang sedang dieksekusi.

Facundo Victor
sumber
1
Saya pikir jawaban ini akan ditingkatkan dengan menjadi sedikit lebih eksplisit tentang perbedaan model prosesor - dan bagaimana ~ 10 tahun yang lalu, setiap varian Unix pada dasarnya memiliki mereka sendiri. Linux bukan pengaruh luas seperti sekarang ini.
Sobrique
@Obrique: Atau bahkan menyebutkan perbedaan model prosesor per se - 10 tahun yang lalu ada lebih dari 2 jenis yang kita miliki saat ini dan Linux berjalan pada hampir semua dari mereka (saya sendiri menjalankan Linux pada PowerPC). Ini sebagian masih relevan hari ini dengan x86, AMD64 (atau dikenal sebagai x86-64) dan ARM. MIPS masih cukup populer saat ini di antara orang-orang yang dapat memproduksi chip mereka sendiri karena benar-benar bebas paten sekarang.
Slebetman
Maaf atas keterlambatannya! Terima kasih semuanya! Saya menambahkan beberapa referensi ke arsitektur cpu, juga saya menambahkan tautan ke daftar perbandingan. Saya tidak ingin jawabannya terlalu besar. Tapi ya, ini sangat relevan!
Facundo Victor
1
Komentar keamanan menyiratkan bahwa pembaca / penginstal tahu cara membaca dan memahami kode. Mengingat bahwa kerentanan shellshock bertahan beberapa dekade tanpa diketahui, saya akan dengan hormat menyarankan bahwa itu adalah kepercayaan yang agak keliru. Itu memang memungkinkan bagi para pembuat kode yang kompeten dan kompeten untuk menilai kode ya, tetapi itu bukan penghalang keamanan nyata seperti yang diiklankan. Ini mungkin sebenarnya memiliki efek sebaliknya. Peretas yang didanai oleh negara dan kejahatan terorganisir kemungkinan mengkontribusikan kode untuk semua manor perpustakaan / proyek open source hari ini dengan harapan menanam pembukaan kerang berikutnya ...
Techmag
Kamu benar! Saya memodifikasi jawaban untuk mencerminkan itu. Saya berusaha untuk tidak kehilangan fokus pada tujuan utama dari jawabannya. Terima kasih Techmag!
Facundo Victor
10

Ada beragam platform dan lingkungan perangkat lunak baik * nix dan lainnya , sehingga perangkat lunak dapat dijalankan, yang memungkinkan Anda membangun aplikasi (atau pustaka untuk digunakan dengan aplikasi) adalah satu-satunya cara realistis untuk mendukung banyak kombinasi dari komponen-komponen itu sebagai item perangkat lunak "baik". Tentu saja, lisensi seperti GPL memerlukan kode sumber yang akan tersedia - jadi bahkan jika perangkat lunak tidak berfungsi dengan benar biasanya mungkin (meskipun mungkin sulit untuk memahami apa yang salah dan bagaimana cara memperbaikinya) untuk pengguna atau pihak ketiga untuk menyelam dan memperbaikinya bahkan jika pencipta tidak / tidak bisa / tidak ada lagi untuk melakukannya.

Mendistribusikan perangkat lunak sebagai kode sumber juga memungkinkan verifikasi independen bahwa perangkat lunak itu melakukan apa yang diklaimnya dan tidak melakukan sesuatu yang jahat, bukannya atau juga - yang meskipun mengurangi tingkat kepercayaan yang harus dimiliki seseorang terhadap pencipta, sebenarnya meningkatkannya!

SlySven
sumber
8

Pertama, pertanyaan Anda didasarkan pada premis yang cacat. Program yang didistribusikan dalam format disusun!

Cara normal untuk menginstal perangkat lunak pada Ubuntu, seperti pada kebanyakan distribusi Linux lainnya, dan lebih umum pada sebagian besar varian Unix, adalah dengan menginstal sebuah paket. Di Ubuntu, Anda membuka pusat perangkat lunak atau pengelola paket lain dan meramban perangkat lunak yang tersedia. Ketika Anda memilih paket untuk instalasi, binari (jika paket berisi program) diunduh dan diinstal pada mesin Anda.

Secara default, manajer paket menawarkan Anda paket yang dibuat oleh pengelola distribusi. Anda juga dapat menemukan sumber paket pihak ketiga; Ubuntu menawarkan PPA sebagai cara standar bagi pihak ketiga untuk menawarkan paket.

Mengunduh perangkat lunak dari penulis dalam bentuk yang dikompilasi adalah pilihan terakhir. Anda hanya perlu melakukan itu jika perangkat lunak tidak cukup populer untuk dikemas, atau jika Anda benar-benar membutuhkan versi terbaru yang belum dikemas. Kebanyakan orang tidak perlu melakukan ini.

Ketika perangkat lunak tidak dikemas untuk distribusi, sering didistribusikan dalam bentuk sumber daripada dalam bentuk biner. Ada dua alasan utama mengapa ini sering terjadi di dunia Linux, tetapi jarang di dunia Windows. Salah satu alasannya adalah bahwa proporsi program open source di Linux jauh lebih tinggi. Jelas, jika kode sumber program tidak tersedia, satu-satunya bentuk distribusi adalah biner. Alasan lainnya adalah dunia Linux jauh lebih beragam. Binari yang berbeda diperlukan untuk setiap set versi pustaka yang tidak kompatibel, yang sering berarti binari yang berbeda untuk setiap versi dari setiap distribusi. Windows "memecahkan" ini dengan meminta setiap pembuat paket mendistribusikan pustaka yang mereka gunakan bersama dengan program (konsekuensi: komputer Anda menyimpan banyak salinan dari masing-masing pustaka, satu per program yang menggunakannya; jika bug diperbaiki di perpustakaan, setiap program yang menggunakannya harus mengirimkan pembaruan), dan dengan merilis versi baru sistem operasi hanya setiap tiga tahun atau lebih. Unix memiliki lebih banyak keragaman dan kebiasaan memperbaiki bug yang lebih tepat waktu, dan menyelesaikan masalah distribusi perpustakaan dengan membangun biner yang berbeda untuk distribusi yang berbeda.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
5

Linux berjalan pada lebih dari satu platform CPU tertentu. Jika Anda mendistribusikan file ELF (atau segala jenis eksekusi mentah lainnya), ada kemungkinan beberapa versi Linux tidak dapat menjalankan perangkat lunak. Dengan semangat membuat perangkat lunak tersedia seluas mungkin, menggunakan kode sumber lebih disukai. Sebagai contoh, Linux berjalan pada Sparc, Intel, AMD, ARM, dan jenis prosesor lainnya.

Jika file ELF ditargetkan secara spesifik prosesor Intel, misalnya, maka jenis perangkat keras lain tidak dapat menjalankan perangkat lunak. ELF adalah platform independen, tetapi kode yang dihostingnya harus sesuai dengan kode mesin platform. Anda akan melihat berapa banyak distribusi yang memiliki paket serupa (mis. Paket _386 dan _586 ketika mendukung prosesor yang berbeda) - Anda harus menginstal file ELF yang benar untuk mendapatkan operasi yang benar.

Demikian pula, jika saya memutuskan untuk membangun versi Linux khusus yang menggunakan berbagai interupsi, tautan, dll, maka saya masih memerlukan kode sumber untuk mengkompilasi kode. Bahkan jika kode sumber tidak memiliki instruksi pembangunan khusus platform, setiap platform berbeda dan mungkin tidak menjalankan ELF dari sistem yang berbeda.

phyrfox
sumber
Itulah mengapa Anda mungkin menjalankan firefox 32 bit seperti banyak program lain pada OS windows "64 bit" sedangkan linux 64 bit biasanya menjalankan aplikasi 64 bit.
mchid
5

Alasan asli untuk distribusi sebagai sumber tentu saja adalah keragaman platform; komunitas Linux telah melanjutkan metodologi itu untuk itu dan untuk alasan baru, sebagian politis.

Tidak seperti misalnya Windows, Linux secara historis tidak pernah repot untuk menjaga ABI (aplikasi binary interface) stabil dalam jangka waktu yang lama - menjaga kemungkinan untuk berinovasi pada aspek-aspek seperti format yang dapat dieksekusi, API perpustakaan, dan dukungan untuk platform perangkat keras baru / dianggap lebih penting.

Sistem operasi komersial mencapai kompatibilitas aplikasi jangka panjang dengan menjadi sangat disiplin tentang inovasi; antarmuka fitur / perangkat lunak baru selalu perlu ditambahkan TAMBAH dengan yang lama - membutuhkan dua hal untuk dipertahankan, dan harga perubahan apa pun setelah rilis perlu dianggap sangat tinggi. Atau, Anda dapat merangkul fakta keusangan aplikasi yang direncanakan bersama-sama dengan siapa pun yang menulis perangkat lunak untuk OS Anda (ini tidak mengisyaratkan MS tetapi vendor OS lain).

Mencapai platform stabil jangka panjang untuk perangkat lunak yang didistribusikan dalam bentuk biner saja (di luar distribusi Linux yang diberikan) bahkan akan dianggap tidak diinginkan oleh beberapa elemen komunitas Linux. Sebagai pengguna yang tidak menyesal dari kedua platform, saya tidak mengatakan itu baik atau buruk; itu seperti itu.

pemeras
sumber
4

Dalam banyak kasus (setidaknya di dunia * nix), kode sumber adalah versi perangkat lunak yang paling portabel. Memiliki sumber menjamin bahwa perangkat lunak yang dibagikan akan bekerja pada setiap platform yang mungkin dapat mendukungnya (yang dalam banyak kasus berarti POSIX-compliant). Melepaskan binari hanya menjamin kompatibilitas dengan platform (baik perangkat lunak dan perangkat keras) yang dirilis untuk binari tersebut.

Pertimbangkan bahwa di windows, binari adalah bentuk yang paling nyaman dan portabel untuk berbagi perangkat lunak. Karena mengkompilasi sumber bukan bagian dari model distribusi perangkat lunak windows yang biasa, Microsoft telah berusaha keras selama bertahun-tahun untuk memastikan binari bekerja di beberapa versi OS mereka: http://www.joelonsoftware.com/articles/APIWar.html

zje
sumber
5
Windows juga tergantung pada arsitektur yang mendasarinya. Aplikasi Windows yang mendukung ARM tidak berjalan di laptop / desktop biasa, dan sebagainya. Itulah alasan utama mengapa Linux memiliki dukungan perangkat keras yang jauh lebih baik - karena kode ditulis untuk dikompilasi pada platform apa pun yang memiliki implementasi Linux yang waras, sementara Windows bergantung pada jenis perangkat keras yang dikenal yang ada.
phyrfox
Jika Anda membangun Windows / x86 maka Anda menutupi 95% dari kompatibilitas biner. Cukup bagus. Sementara Linux / x86 semakin umum, kami datang dari dunia di mana Anda memiliki berbagai nama besar dengan arsitektur prosesor khusus mereka sendiri dan varian Unix - yang tidak kompatibel biner.
Sobrique
@Sobrique Dari mana Anda mendapatkan angka 95% itu? Terakhir kali saya melihat ada 4 CPU ARM untuk setiap 1 x86. Ini beberapa tahun yang lalu, sebelum semua orang mulai menggunakan ponsel pintar dengan prosesor ARM. Jadi jika kita asumsikan bahwa tidak ada prosesor lain yaitu 20%.
ctrl-alt-delor
3

Sebagian besar perangkat lunak Linux adalah perangkat lunak gratis. Dengan mendistribusikan kode sumber dengan beberapa instruksi kompilasi daripada binari, Anda memiliki kesempatan untuk meninjau atau bahkan mengedit kode sumber sebelum mengkompilasinya. Dengan cara ini, Anda bisa sangat yakin apa yang sebenarnya dilakukan oleh program dan tidak berbahaya.

Rapti
sumber
0

Alasan utama yang secara pribadi saya tidak suka hanya dapat dieksekusi dari suatu program adalah karena saya ingin memeriksa dulu apa yang sebenarnya dilakukan oleh kode sumber (kebanyakan karena saya hanya menikmati melihat kode orang lain) tetapi saya tahu beberapa orang lain yang juga memeriksa kode sumber untuk kode berbahaya.

xempes
sumber
0

Banyak jawaban telah mengatakan bahwa dalam kebanyakan kasus, perangkat lunak yang didistribusikan dalam format disusun. Saya setuju dengan asumsi ini. Namun demikian saya melihat kasus di mana mendistribusikan perangkat lunak dengan sumbernya lebih baik daripada mendistribusikannya dalam format yang dikompilasi.

Saya tidak yakin itu benar, tetapi saya bayangkan di awal Internet, karena bandwidth jaringan buruk, kadang-kadang bisa lebih cepat untuk mendistribusikan perangkat lunak dengan sumbernya daripada dalam format yang dikompilasi. Karena sumber kode hanya teks biasa, seringkali lebih kecil daripada perangkat lunak dalam format yang dikompilasi. Jadi, mendistribusikan perangkat lunak dengan sumber kode tampaknya menjadi cara yang lebih baik untuk membagikannya, asalkan pengguna dapat mengompilasinya.

Nairolf21
sumber
0

Terlepas dari kenyataan bahwa ada banyak sistem unix yang berjalan pada banyak platform yang berbeda, pertimbangkan saja masalah yang dihadapi perangkat lunak Windows dari modal distribusi ini, meskipun mereka benar-benar hanya perlu khawatir tentang satu versi windows, dan satu platform (PC). ).

Bahkan hanya dengan PC yang perlu dikhawatirkan, masih ada dua arsitektur: 32 bit dan 64 bit. Jika Anda perhatikan, sebagian besar perangkat lunak windows mengabaikan 64 bit dan hanya mengirim perangkat lunak 32 bit, meninggalkan Anda dengan perangkat lunak yang kurang optimal jika Anda memiliki sistem 64 bit. Lalu ada perpustakaan. Satu vendor perangkat lunak tidak ingin Anda mendapatkan kesalahan aneh ketika mencoba menjalankan program mereka jika Anda belum menginstal pustaka yang sesuai, sehingga mereka hanya memasukkan pustaka dengan program mereka (membuat unduhan lebih besar, bahkan jika Anda sudah memiliki pustaka ini ). Program kedua melakukan hal yang sama, tetapi dengan versi perpustakaan yang berbeda. Dalam kasus terbaik, program B berisi versi perpustakaan yang lebih baru yang kompatibel ke belakang, jadi jika Anda menginstal program B sesudahnyaprogram A, semuanya berfungsi, tetapi menginstalnya dalam urutan terbalik membuat Anda memiliki versi perpustakaan yang lebih lama sehingga program B rusak. Namun sering kali, vendor perpustakaan membuat perubahan yang tidak kompatibel ke belakang dan tidak repot-repot mengubah nama perpustakaan, jadi tidak masalah di mana Anda menginstal kedua program, yang pertama akan rusak. Ini disebut "dll neraka".

Sayangnya, untuk menghindari hal ini, sebagian besar perangkat lunak windows telah menggunakan pengiriman semua perpustakaan mereka di direktori program mereka sendiri daripada direktori bersama, sehingga setiap program memiliki semua perpustakaan pribadi mereka sendiri dan tidak akan pernah berbagi satu sama lain, yang mengalahkan keseluruhan titik dll di tempat pertama dan Anda akhirnya menggunakan lebih banyak ram dan ruang disk dan waktu mengunduh semua perpustakaan duplikat.

Inilah sebabnya mengapa perangkat lunak open source diterbitkan dalam bentuk sumber, dan vendor OS telah datang dengan manajer paket yang memilah-milah masalah ketergantungan dan hanya mengunduh binari yang telah dikompilasi yang benar-benar Anda butuhkan, tanpa menduplikasi perpustakaan di semua tempat. Ini juga berkaitan dengan fakta bahwa ada banyak sistem unix berbeda yang berjalan pada banyak platform berbeda.

psusi
sumber