Sự khác biệt giữa tệp nhị phân và thư viện là gì?


11

Tôi đang cố gắng để hiểu Tiêu chuẩn phân cấp hệ thống tập tin. Tôi đã tra cứu cả nhị phân và thư viện, và như tôi hiện đang hiểu nó:

nhị phân là các tệp mã có thể đọc được trên máy tính ở định dạng nhị phân, điều khiển CPU và bộ xử lý trực tiếp bằng bit.

các thư viện là các chức năng có thể sử dụng được bởi các chương trình khác nhau, vì mục đích thuận tiện - như khi bạn yêu cầu một mô-đun trong Javascript của PHP.

Sự hiểu biết này có đúng không? Nếu có, tại sao chúng ta vẫn tách các thư viện và nhị phân? Một số thư viện nhị phân, phải không? Và một số nhị phân (cat, less, date, rm, cp, v.v.) được sử dụng và sử dụng lại như thể chúng là thư viện ... Ai đó có thể giúp giải thích sự khác biệt và giúp tôi tìm định nghĩa tốt hơn cho hai từ này không? Cảm ơn bạn.

Câu trả lời:


10

Sự hiểu biết của bạn chủ yếu là chính xác, nhưng có một vài điều nữa cần xem xét:

  1. "Nhị phân" dùng để chỉ những thứ không thể đọc được của con người. Điều này thường đề cập đến mã máy, nhưng nhiều tệp khác cũng là tệp nhị phân theo nghĩa này, với hầu hết các định dạng đa phương tiện là một ví dụ tốt. Tuy nhiên, FHS có cách sử dụng cụ thể hơn cho thuật ngữ này.
  2. Thư viện có thể là mã nhị phân. Trong thực tế, hầu hết những thứ trong đó /libsẽ là các thư viện được biên dịch thành mã máy.
  3. Mặc dù những thứ như catđược sử dụng trong tập lệnh shell như các lệnh gọi mã trong các thư viện, chúng không phải là các thư viện theo nghĩa FHS vì chúng có thể tự chạy.

Do những điểm này, thuật ngữ phổ biến hơn trong số những người không viết tài liệu tiêu chuẩn là:

  • Các tệp đối tượng: Đây là các mã máy được biên dịch nguyên bản, nhưng thậm chí có thể không chạy hoặc có thể gọi được. Chúng thường có .ophần mở rộng trừ khi chúng thuộc một trong các loại khác và hầu như không bao giờ được nhìn thấy trên hầu hết các hệ thống trừ khi xây dựng phần mềm. Tôi đã liệt kê chúng ở đây vì chúng quan trọng để hiểu một số điều dưới đây.

  • Các tệp thực thi: Đây là các tệp bao gồm phần lớn mã tự chứa có thể chạy trực tiếp. Chúng có thể là các tệp đối tượng được định dạng đặc biệt có thể được tải trực tiếp bởi kernel (những thứ như cat, bashpythonđều là loại thực thi này) hoặc được giải thích bởi một số chương trình trung gian mà chính nó là một tệp thực thi (Minecraft pydoc, và cowsayđều là ví dụ của loại thực thi này). Các tệp thực thi của loại thứ nhất hầu như không bao giờ có phần mở rộng tệp trên các hệ thống UNIX, trong khi các tệp thực thi của loại thứ hai có thể có hoặc không. Đây là những gì FHS gọi là "nhị phân". Chúng có thể được chạy từ các tệp thực thi khác, nhưng yêu cầu gọi các hàm đặc biệt để gọi chúng ( fork()exec()trong C và C ++, mọi thứ nằm ngoàisubprocess mô-đun trong Python, v.v.) và chạy như một quy trình riêng biệt.

  • Thư viện: Đây là những tệp chứa mã có thể tái sử dụng có thể được gọi bởi thư viện khác hoặc tệp thực thi. Mã trong các thư viện được gọi (hầu hết) trực tiếp bởi mã khác sau khi thư viện được tải (gọi là 'liên kết' khi nói về mã được biên dịch) và chạy trong cùng một quy trình như mã gọi nó. Có ba loại thư viện chung:

    1. Thư viện tĩnh: Đây là các giống ban đầu. Chúng bao gồm một tệp lưu trữ (thường là định dạng AR) với một số lượng lớn các tệp đối tượng bên trong, một tệp cho mỗi chức năng trong thư viện. Các tệp đối tượng được liên kết vào tệp thực thi sử dụng chúng, do đó, tệp thực thi chỉ sử dụng các thư viện tĩnh về cơ bản là độc lập 100% với bất kỳ mã nào khác. Trên các hệ thống UNIX, chúng thường có .aphần mở rộng. Khái niệm thư viện tĩnh không thực sự tồn tại bên ngoài các ngôn ngữ lập trình được biên dịch.
    2. Thư viện động: Đây là loại thư viện phổ biến nhất được sử dụng hiện nay. Thư viện động là một tệp đối tượng đặc biệt, thường có .sophần mở rộng trên UNIX ( .dlllà tiêu chuẩn trên Windows), được tải vào thời gian chạy bởi các tệp thực thi sử dụng nó. Hầu hết những gì bạn sẽ tìm thấy /libtrên các hệ thống sản xuất là các thư viện động.
    3. Các mô-đun: Đây là tương đương với một thư viện động cho một ngôn ngữ diễn giải. Xử lý hơi khác một chút so với ngôn ngữ được biên dịch và không giống với ngôn ngữ được biên dịch, có thể tệp có thể vừa là mô-đun vừa là tệp thực thi ( http.serverví dụ trong thư viện tiêu chuẩn Python).

Đừng quên các tệp script, là trường hợp đặc biệt của các tệp thực thi, vì chúng phụ thuộc vào tệp thực thi nhị phân ( bash, python) được chạy. Hơn nữa, các tập lệnh trong /libcó thể được sử dụng bởi các tập lệnh khác; so sánh các mô-đun Python.
Murphy

1
Điều đó nằm trong 'được giải thích bởi một số chương trình trung gian . Tow of the examples I listed for that (pydoc` và cowsay) là các tập lệnh.
Austin Hemmelgarn

Làm rõ đến # 3 - các mô-đun là các bit mã có thể tải được sử dụng để mở rộng chức năng. Các mô-đun Apache / php là một ví dụ tốt cho phần kịch bản được giải thích của bạn, nhưng các mô-đun hạt nhân cũng vậy ... Tôi cũng thêm một điểm để bao quát các ngôn ngữ được hiểu là hầu hết có thể đọc được của con người như các tập lệnh cho các shell khác nhau, php, perl, v.v. mỗi FHS sẽ đi vào thư mục / bin hoặc / sbin vì chúng là các chương trình thực thi
ivanivan

Các mô-đun như phần mở rộng thường được gọi là bổ trợ. Lựa chọn đặt tên của Apache dựa trên tiêu chuẩn UNIX cũ gọi các mô-đun trình điều khiển hạt nhân và giờ đây đã trở thành thuật ngữ phổ biến với các máy chủ web (vì tiếp thị), nhưng đó là một trường hợp kỳ lạ so với hầu hết các phần mềm khác, sử dụng phổ biến cả plugin ' 'hoặc' phần mở rộng 'khi đề cập đến điều đó.
Austin Hemmelgarn
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.