Tại sao các chương trình không được phân phối ở định dạng biên dịch?


32

Nhưng họ đưa ra hướng dẫn như

cd downloaded_program
./configure
make install

Điều này tạo ELF cần thiết và có thể là một số tệp .so.

Tại sao không đặt những thứ đó trong một tệp zip để tải xuống, như với các ứng dụng windows? Có bất kỳ lý do tại sao họ cần phải được biên dịch bởi người dùng?


18
đó là cách mã nguồn được phân phối. bạn đã gắn thẻ này với ubfox - bạn đã thử aptcông cụ này chưa?
mikeerv

11
Ubuntu: 40.000 chương trình phổ biến nhất : $ sudo apt-get install [name]. Phần mềm hiếm hơn: Một số phần mềm phải được xây dựng từ nguồn với {cmake .. && make, ./cool && make, waf, scons, v.v. ~ 10 tùy chọn xây dựng}.
Knud Larsen

6
Bạn có ba phiên bản Windows © và ~ 100 phiên bản "Linux OS". Không thể duy trì và lưu trữ nhiều hơn (40.000) chương trình phổ biến nhất.
Knud Larsen

35
Câu hỏi này chỉ sai. hầu hết các phần mềm IS được phân phối ở định dạng nhị phân, thường là trong .rpmhoặc .debhoặc .tgzgói. Nguồn cũng được phân phối cho những người muốn tự biên dịch nó hoặc kiểm tra nó hoặc sửa đổi nó, hoặc gói nó cho một hoặc nhiều bản phân phối. Không ai sử dụng .zipđể phân phối nhị phân trên linux vì các tệp .zip không hỗ trợ thông tin cần thiết như người dùng, nhóm và quyền cho các tệp mà chúng chứa.
cas

2
Tôi vẫn chưa cần phải biên dịch bất kỳ chương trình Linux nào mà tôi muốn chạy. Thực thi luôn luôn có sẵn ... cho đến nay.
dùng2338816

Câu trả lời:


34

Hãy phân tích các yếu tố ...

Phân tích :

PHỤ LỤC THEO QUY HOẠCH : Có một số vấn đề phát sinh trong môi trường nơi các nhà phát triển đang tạo và duy trì một số biến thể kiến ​​trúc cụ thể của một ứng dụng:

  • Mã nguồn khác nhau được yêu cầu cho các biến thể khác nhau - Các hệ điều hành dựa trên UNIX khác nhau có thể sử dụng các chức năng khác nhau để thực hiện cùng một tác vụ (ví dụ: strchr (3) so với chỉ mục (3)). Tương tự như vậy, có thể cần bao gồm các tệp tiêu đề khác nhau cho các biến thể khác nhau (ví dụ: string.h so với String.h).

  • Các quy trình xây dựng khác nhau được yêu cầu cho các biến thể khác nhau - Quy trình xây dựng cho các nền tảng khác nhau khác nhau. Sự khác biệt có thể liên quan đến các chi tiết như vị trí trình biên dịch, tùy chọn trình biên dịch và thư viện.

  • Các bản dựng cho các biến thể khác nhau phải được giữ riêng biệt - Vì có một cây nguồn duy nhất, phải cẩn thận để đảm bảo rằng các mô-đun đối tượng và các tệp thực thi cho một kiến ​​trúc không bị nhầm lẫn với các kiến ​​trúc khác. Ví dụ, trình soạn thảo liên kết không được cố gắng tạo một tệp thực thi IRIX 5 bằng cách sử dụng một mô-đun đối tượng được xây dựng cho SunOS tựa 4.

  • Mỗi hệ điều hành có sơ đồ quản lý liên kết riêng và phải chuẩn bị tệp ELF (Định dạng thực thi và liên kết) khi cần.

  • Trình biên dịch sẽ tạo ra một bản dựng là một chuỗi các lệnh và các kiến ​​trúc riêng biệt có nghĩa là các tập lệnh khác nhau ( So sánh các Kiến trúc của Tập lệnh ). Vì vậy, đầu ra của trình biên dịch là khác biệt cho từng kiến ​​trúc (Ví dụ: x86, x86-64, ARM, ARM64, IBM Power ISA, PowerPC, 6800, MOS T 6502 của Motorola và rất nhiều kiến ​​trúc khác )

BẢO MẬT :

  • Nếu bạn tải xuống tệp nhị phân, bạn không thể chắc chắn liệu nó có làm như vậy hay không, nhưng bạn có thể thử kiểm tra mã nguồn và sử dụng tệp nhị phân tự biên dịch trong hệ thống của mình. Mặc dù vậy, người dùng Techmag đã đưa ra một quan điểm tốt trong nhận xét của mình, việc kiểm tra mã yêu cầu các lập trình viên có kiến ​​thức và có thẩm quyền để đánh giá mã và không phải là một đảm bảo an toàn.

THỊ TRƯỜNG : Trong phần này có rất nhiều yếu tố, nhưng tôi sẽ cố gắng tiếp tục nó:

  • Không phải mọi công ty đều nhắm đến việc tiếp cận tất cả các nền tảng, nó phụ thuộc vào thị trường và mức độ phổ biến của nền tảng và những gì họ muốn bán.

  • Phần mềm miễn phí có tinh thần làm cho phần mềm có sẵn rộng rãi nhất có thể, nhưng điều đó không ngụ ý rằng phần mềm được thiết kế cho mọi nền tảng, nó phụ thuộc vào cộng đồng hỗ trợ.

Kết luận :

Không phải mọi phần mềm đều được thiết kế cho mọi nền tảng. Cung cấp nhị phân cho tất cả các kiến ​​trúc và nền tảng ngụ ý để biên dịch nó, kiểm tra nó và duy trì nó cho tất cả các nền tảng. Đó là nhiều công việc đôi khi quá đắt và có thể tránh được nếu người dùng biên dịch nó trong nền tảng riêng của mình. Ngoài ra, người dùng sẽ nhận thức được những gì anh ta đang thực hiện.


1
Tôi nghĩ rằng câu trả lời này sẽ được cải thiện bằng cách rõ ràng hơn một chút về sự khác biệt của mô hình bộ xử lý - và cách đây 10 năm, mỗi biến thể Unix về cơ bản đều có cái riêng. Linux không phải là ảnh hưởng phổ biến như ngày nay.
Sobrique

@Sobrique: Hoặc thậm chí đề cập đến sự khác biệt về mô hình bộ xử lý mỗi lần - 10 năm trước đây có nhiều hơn 2 loại chúng ta có ngày nay và Linux chạy trên hầu hết tất cả chúng (bản thân tôi đã chạy Linux trên PowerPC). Ngày nay nó vẫn còn liên quan một phần với x86, AMD64 (còn được gọi là x86-64) và ARM. MIPS ngày nay vẫn còn khá phổ biến trong số những người có thể tự sản xuất chip vì hiện tại nó hoàn toàn không có bằng sáng chế.
slebetman

Xin lỗi về sự chậm trễ! Cảm ơn cả hai người! Tôi đã thêm một số tài liệu tham khảo đến kiến ​​trúc cpu, tôi cũng đã thêm một liên kết đến một danh sách so sánh. Tôi không muốn câu trả lời quá lớn. Nhưng vâng, nó rất phù hợp!
Facundo Victor

1
Nhận xét bảo mật ngụ ý rằng người đọc / trình cài đặt biết cách đọc và hiểu mã. Cho rằng lỗ hổng shellshock tồn tại hàng thập kỷ mà không được chú ý, tôi trân trọng đề nghị đó là một niềm tin có phần sai lầm. Nó không cho phép các lập trình viên có kiến ​​thức và có thẩm quyền khẳng định mã có, nhưng nó không phải là một công cụ ngăn chặn bảo mật thực sự như quảng cáo. Nó thực sự có thể có tác dụng ngược lại. Các tin tặc được tài trợ bởi tội phạm có tổ chức và nhà nước có khả năng đóng góp mã cho tất cả các trang web của các thư viện / dự án nguồn mở trong những ngày này với hy vọng sẽ mở được
vỏ sò

Bạn đúng rồi! Tôi đã sửa đổi câu trả lời để phản ánh điều đó. Tôi đã cố gắng để không mất tập trung vào mục tiêu chính của câu trả lời. Cảm ơn bạn Techmag!
Facundo Victor

10

Có rất nhiều nền tảng và môi trường phần mềm cả * nix và khác , phần mềm có thể chạy được, cho phép bạn xây dựng một ứng dụng (hoặc thư viện để sử dụng với các ứng dụng) là cách duy nhất thực tế để hỗ trợ như nhiều sự kết hợp của các thành phần đó như là một mục phần mềm "tốt". Tất nhiên, giấy phép như GPL yêu cầu mã nguồn để có sẵn - vì vậy ngay cả khi phần mềm không hoạt động đúng nó thường là có thể (mặc dù nó có thể là khó khăn để hiểu những gì là sai và làm thế nào để sửa chữa nó) cho người sử dụng hoặc một số bên thứ ba để bổ sung và sửa lỗi ngay cả khi người tạo sẽ không / không thể / không còn tồn tại để làm như vậy.

Phân phối phần mềm dưới dạng mã nguồn cũng cho phép xác minh độc lập rằng phần mềm thực hiện những gì nó tuyên bố và không làm điều gì khó chịu thay vì hoặc cũng vậy - điều này mặc dù làm giảm mức độ tin cậy mà người ta phải có đối với người tạo, thực sự giúp tăng cường nó!


8

Đầu tiên, câu hỏi của bạn dựa trên một tiền đề thiếu sót. Các chương trình được phân phối ở định dạng biên dịch!

Cách thông thường để cài đặt phần mềm trên Ubuntu, giống như trên hầu hết các bản phân phối Linux khác, và nói chung hơn trên hầu hết các biến thể Unix, là cài đặt một gói. Trên Ubuntu, bạn mở trung tâm phần mềm hoặc một số trình quản lý gói khác và duyệt phần mềm có sẵn. Khi bạn chọn gói để cài đặt, các tệp nhị phân (nếu gói chứa chương trình) sẽ được tải xuống và cài đặt trên máy của bạn.

Theo mặc định, trình quản lý gói cung cấp cho bạn các gói được thực hiện bởi các nhà duy trì phân phối. Bạn cũng có thể tìm thấy các nguồn gói của bên thứ ba; Ubuntu cung cấp PPA như một cách tiêu chuẩn hóa để các bên thứ ba cung cấp các gói.

Tải xuống phần mềm từ tác giả ở dạng biên dịch là giải pháp cuối cùng. Bạn chỉ cần làm điều đó nếu phần mềm không đủ phổ biến để được đóng gói hoặc nếu bạn thực sự cần phiên bản mới nhất chưa được đóng gói. Hầu hết mọi người không bao giờ cần phải làm điều này.

Khi phần mềm không được đóng gói để phân phối, phần mềm thường được phân phối ở dạng nguồn thay vì ở dạng nhị phân. Có hai lý do chính tại sao điều này xảy ra thường xuyên trong thế giới Linux, nhưng hiếm khi trong thế giới Windows. Một lý do là tỷ lệ các chương trình nguồn mở trên Linux cao hơn nhiều. Rõ ràng, nếu mã nguồn của chương trình không có sẵn, hình thức phân phối duy nhất là nhị phân. Lý do khác là thế giới Linux đa dạng hơn nhiều. Các tệp nhị phân khác nhau là cần thiết cho mỗi bộ phiên bản thư viện không tương thích, thường có nghĩa là các tệp nhị phân khác nhau cho mỗi phiên bản của mỗi bản phân phối. Windows có thể giải quyết vấn đề này bằng cách mỗi tác giả gói phân phối các thư viện họ sử dụng cùng với chương trình (hệ quả: máy tính của bạn lưu trữ nhiều bản sao của mỗi thư viện, mỗi chương trình sử dụng nó; nếu một lỗi được sửa trong thư viện, mỗi chương trình sử dụng nó phải gửi một bản cập nhật) và bằng cách phát hành một phiên bản mới của hệ điều hành chỉ sau mỗi ba năm hoặc lâu hơn. Unix có sự đa dạng hơn nhiều và thói quen sửa lỗi kịp thời hơn nhiều và giải quyết các vấn đề phân phối thư viện bằng cách xây dựng các nhị phân khác nhau cho các bản phân phối khác nhau.


5

Linux chạy trên nhiều nền tảng CPU cụ thể. Nếu bạn phân phối các tệp ELF (hoặc bất kỳ loại thực thi thô nào khác), sẽ có khả năng một số phiên bản Linux không thể chạy phần mềm. Trên tinh thần làm cho phần mềm có sẵn rộng rãi nhất có thể, sử dụng mã nguồn được ưu tiên. Ví dụ: Linux chạy trên Sparc, Intel, AMD, ARM và các loại bộ xử lý khác.

Ví dụ, nếu tệp ELF nhắm mục tiêu cụ thể vào bộ xử lý Intel, thì các loại phần cứng khác không thể chạy phần mềm. ELF là độc lập với nền tảng, nhưng mã mà nó lưu trữ cần phải tuân theo mã máy của nền tảng. Bạn sẽ nhận thấy có bao nhiêu bản phân phối có các gói tương tự (ví dụ: gói _386 và _586 khi nó hỗ trợ các bộ xử lý khác nhau) - bạn phải cài đặt tệp ELF chính xác để có thao tác chính xác.

Tương tự, nếu tôi quyết định xây dựng một phiên bản Linux tùy chỉnh sử dụng các ngắt, liên kết khác nhau, v.v., thì tôi vẫn cần mã nguồn để biên dịch mã. Ngay cả khi mã nguồn không có hướng dẫn xây dựng dành riêng cho nền tảng, mỗi nền tảng là khác nhau và có thể không chạy ELF từ một hệ thống khác.


Đó chính xác là lý do tại sao bạn có thể chạy firefox 32 bit giống như nhiều chương trình khác trên HĐH windows "64 bit" trong khi linux 64 bit thường chạy ứng dụng 64 bit.
mchid

5

Lý do ban đầu để phân phối như nguồn chắc chắn là sự đa dạng nền tảng; cộng đồng Linux đã tiếp tục phương pháp đó cho cả lý do đó và vì những lý do mới, một phần chính trị.

Không giống như Windows, Linux trong lịch sử chưa bao giờ bận tâm đến việc giữ bất kỳ ABI (giao diện nhị phân ứng dụng) nào ổn định trong thời gian dài - giữ khả năng đổi mới trên các khía cạnh như định dạng thực thi, API thư viện và hỗ trợ cho các nền tảng phần cứng mới được / xem xét nhiều hơn quan trọng.

Hệ điều hành thương mại đạt được khả năng tương thích ứng dụng lâu dài bằng cách rất kỷ luật về đổi mới; một giao diện tính năng / phần mềm mới luôn cần được thêm vào BỔ SUNG cho một giao diện cũ - yêu cầu hai thứ phải được duy trì và giá thay đổi bất cứ thứ gì sau khi phát hành cần phải được xem xét rất cao. Ngoài ra, bạn có thể nắm bắt thực tế về sự lỗi thời của ứng dụng theo kế hoạch cùng với bất kỳ ai viết phần mềm cho HĐH của bạn (đây không phải là gợi ý tại MS mà là một nhà cung cấp HĐH khác).

Đạt được một nền tảng ổn định lâu dài cho phần mềm được phân phối ở dạng chỉ nhị phân (bên ngoài một bản phân phối Linux nhất định) thậm chí sẽ bị một số thành phần của cộng đồng Linux coi là không mong muốn. Là một người dùng không công bằng của cả hai nền tảng, tôi không nói rằng đó là tốt hay xấu; nó là như thế


4

Trong nhiều trường hợp (ít nhất là trong thế giới * nix), mã nguồn là phiên bản di động nhất của phần mềm. Có nguồn đảm bảo rằng phần mềm được chia sẻ sẽ hoạt động trên mọi nền tảng có thể hỗ trợ phần mềm (trong nhiều trường hợp đơn giản là tuân thủ POSIX). Phát hành nhị phân chỉ đảm bảo khả năng tương thích với các nền tảng (cả phần mềm và phần cứng) mà các tệp nhị phân đó được phát hành.

Hãy xem xét rằng trên windows, nhị phân là hình thức thuận tiện và di động nhất để chia sẻ phần mềm. Do nguồn biên dịch không phải là một phần của mô hình phân phối phần mềm windows thông thường, Microsoft đã nỗ lực rất nhiều trong nhiều năm để đảm bảo các tệp nhị phân hoạt động trên nhiều phiên bản HĐH của chúng: http://www.joelonsoftware.com/articles/APIWar.html


5
Windows cũng phụ thuộc vào kiến ​​trúc cơ bản. Các ứng dụng Windows hỗ trợ ARM không chạy trên máy tính xách tay / máy tính để bàn thông thường, v.v. Đó là lý do chính tại sao Linux có hỗ trợ phần cứng tốt hơn nhiều - bởi vì mã được viết để biên dịch trên bất kỳ nền tảng nào có triển khai Linux lành mạnh, trong khi Windows phụ thuộc vào các loại phần cứng đã biết hiện diện.
phyrfox

Nếu bạn xây dựng Windows / x86 thì bạn đảm bảo 95% khả năng tương thích nhị phân. Đó là khá tốt. Trong khi Linux / x86 ngày càng phổ biến, chúng tôi đến từ một thế giới nơi bạn có nhiều tên tuổi lớn với kiến ​​trúc bộ xử lý đặc biệt của riêng họ và biến thể Unix - không tương thích nhị phân.
Sobrique

@Sobrique Bạn lấy con số 95% đó từ đâu? Lần trước tôi nhìn có 4 CPU ARM cho mỗi 1 x86. Đây là một vài năm trước, trước khi mọi người bắt đầu sử dụng điện thoại thông minh với bộ xử lý ARM. Vì vậy, nếu chúng tôi giả định rằng không có bộ xử lý nào khác là 20%.
ctrl-alt-delor

3

Hầu hết các phần mềm Linux là phần mềm miễn phí. Bằng cách phân phối mã nguồn với một số hướng dẫn biên dịch thay vì nhị phân, bạn có cơ hội xem lại hoặc thậm chí chỉnh sửa mã nguồn trước khi biên dịch mã. Bằng cách này, bạn có thể rất chắc chắn những gì chương trình thực sự làm và nó không có hại.


0

Lý do chính mà cá nhân tôi không thích chỉ thực hiện một chương trình là vì trước tiên tôi muốn kiểm tra xem mã nguồn thực sự đang làm gì (chủ yếu là vì tôi chỉ thích nhìn vào mã của người khác) nhưng tôi biết một số người khác Ai cũng kiểm tra mã nguồn cho mã độc.


0

Rất nhiều câu trả lời đã nói rằng trong hầu hết các trường hợp, phần mềm được phân phối ở định dạng biên dịch. Tôi đồng ý với giả định này. Tuy nhiên, tôi thấy một trường hợp phân phối một phần mềm theo nguồn của nó tốt hơn là phân phối nó ở định dạng được biên dịch.

Tôi không chắc đó là sự thật, nhưng tôi tưởng tượng khi bắt đầu Internet, bởi vì băng thông mạng rất tệ, đôi khi có thể phân phối phần mềm theo nguồn của nó nhanh hơn ở định dạng được biên dịch. Vì nguồn mã chỉ là văn bản thuần túy, nó thường nhỏ hơn phần mềm ở định dạng được biên dịch. Vì vậy, phân phối một phần mềm với nguồn mã dường như là một cách tốt hơn để chia sẻ nó, miễn là người dùng có thể biên dịch nó.


0

Bên cạnh thực tế là có nhiều hệ thống unix chạy trên nhiều nền tảng khác nhau, chỉ cần xem xét các vấn đề mà phần mềm Windows gặp phải từ phương thức phân phối này, mặc dù chúng thực sự chỉ phải lo lắng về một phiên bản windows và một nền tảng (PC ).

Ngay cả khi chỉ cần PC lo lắng, vẫn có hai kiến ​​trúc: 32 bit và 64 bit. Nếu bạn để ý, phần lớn các phần mềm windows chỉ đơn giản là bỏ qua 64 bit và chỉ cung cấp phần mềm 32 bit, để lại cho bạn phần mềm tối ưu phụ nếu bạn có hệ thống 64 bit. Sau đó là thư viện. Một nhà cung cấp phần mềm không muốn bạn gặp lỗi lạ khi chạy chương trình của họ nếu bạn chưa cài đặt thư viện thích hợp, vì vậy họ chỉ bao gồm thư viện với chương trình của họ (làm cho tải xuống lớn hơn, ngay cả khi bạn đã có thư viện này ). Một chương trình thứ hai làm điều tương tự, nhưng với một phiên bản khác của thư viện. Trong trường hợp tốt nhất, chương trình B chứa phiên bản mới hơn của thư viện tương thích ngược, vì vậy nếu bạn cài đặt chương trình B sauchương trình A, mọi thứ hoạt động, nhưng cài đặt chúng theo thứ tự ngược lại khiến bạn có phiên bản cũ hơn của thư viện và do đó chương trình B bị hỏng. Tuy nhiên, thông thường, nhà cung cấp thư viện thực hiện các thay đổi không tương thích ngược và không bận tâm thay đổi tên của thư viện, do đó, bất kể bạn cài đặt hai chương trình theo thứ tự nào, lần đầu tiên sẽ bị hỏng. Điều này được gọi là "địa ngục dll".

Đáng buồn thay, để tránh điều này, hầu hết các phần mềm windows đã sử dụng để vận chuyển tất cả các thư viện của họ trong thư mục chương trình riêng thay vì thư mục dùng chung, vì vậy mỗi chương trình có tất cả các thư viện riêng và sẽ không bao giờ chia sẻ với nhau, điều này sẽ đánh bại toàn bộ điểm của dlls ở vị trí đầu tiên và cuối cùng bạn sử dụng nhiều ram và dung lượng đĩa hơn và thời gian tải xuống tất cả các thư viện trùng lặp.

Đây là lý do tại sao phần mềm nguồn mở được xuất bản ở dạng nguồn và các nhà cung cấp hệ điều hành đã đưa ra các trình quản lý gói giải quyết các vấn đề phụ thuộc và chỉ tải xuống các tệp nhị phân được biên dịch sẵn mà bạn thực sự cần, mà không cần sao chép thư viện khắp nơi. Điều này cũng liên quan đến thực tế là có nhiều hệ thống unix khác nhau chạy trên nhiều nền tảng khác nhau.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.