Bạn đã từng tự thắc mắc tại sao lại có hai loại thư viện liên kết động và thư viện liên kết tĩnh chưa? Tại sao không dùng một thứ mà phải phát minh ra hai thứ chi cho mệt vậy? Ban đầu thì mình cũng không để ý lắm khi dùng các thư viện nhỏ với các project nhỏ, nhưng đến khi mình dùng bộ thư viện có dung lượng lên tới cả GB cho project của mình thì mình mới giật mình và phải lên google tìm hiểu để làm rõ mọi chuyện. Và đây là câu trả lời…
Thư viện liên kết động – Dynamic Link library
Trong Windows thì các file thư viện này có đuôi là .dll, trong các hệ điều hành họ Linux thì chúng có đuôi là .so, trên MacOS thì là .dylib. Chúng chứa cái gì trong đó? Câu trả lời là code, class, hàm… tất nhiên là không phải các loại code như C++, Java… mà là mã nhị phân, là ngôn ngữ bậc thấp của hệ điều hành, do đó chúng ta không thể mở nó ra như mở file text được. Khi chúng ta viết phần mềm bằng các ngôn ngữ cao cấp như Pascal, C++… thì các mã nguồn này sẽ được dịch dần dần qua mã Assembly rồi tới mã nhị phân. Các chương trình (hay các file .exe) có sử dụng đến thư viện liên kết động sẽ đọc code trong các file .dll (hay .so trên linux…) này để sử dụng trong quá trình chạy.
Thư viện liên kết tĩnh – Static library
Trong Windows thì chúng có đuôi .lib, trong Linux là .a. Cũng giống với thư viện liên kết động, thư viện liên kết tĩnh cũng chứa code (đã gọi là thư viện mà nhỉ :D) nhị phân, chỉ khác là chúng được các chương trình gọi tới trong quá trình biên dịch. Khi chương trình của chúng ta được dịch từ các ngôn ngữ cấp cao sang mã nhị phân, chúng sẽ copy cả mã nguồn của các file thư viện tĩnh này vào trong mã nguồn của mình, tức là bây giờ code trong file .exe của bạn sẽ bao gồm code của cả file thư viện.
Vậy tóm lại thư viện liên kết động gọi hàm từ các file .dll (hoặc .so) để chạy, còn thư viện liên kết tĩnh thì copy code trong file .lib (hoặc .a) vào file .exe của mình để chạy. Vậy khi các file thư viện bị lỗi, chương trình của bạn có thể sẽ chỉ báo lỗi trong khi chạy nếu dùng file .dll, còn nếu dùng file .lib thì thư viện của bạn không thể chạy được, nói đúng hơn là không thể dịch được khi bị lỗi.
Lợi ích của từng loại thư viện
Thư viện liên kết động giảm thiểu số lượng code có trong chương trình của bạn, do đó chương trình bạn viết ra sẽ luôn gọn nhẹ hơn so với dùng thư viện liên kết tĩnh. Thư viện liên kết động cho phép nhiều chương trình sử dụng nó một cách trực tiếp mà không cần phải biên dịch lại. Tuy nhiên, sử dụng thư viện liên kết động sẽ làm cho thời gian chạy chương trình lâu hơn do phải truy cập file, đọc file… từ đĩa cứng… vốn là công việc đòi hỏi thời gian.
Thư viện liên kết tĩnh thì ngược lại, chúng sẽ làm cho chương trình của bạn phình to ra do phải copy code trong thư viện vào code của chính nó. Tuy nhiên chương trình của bạn sẽ chạy rất nhanh, bởi vì chúng không mất thời gian mở các file .dll ra để đọc code, chúng đã có sẵn code trong RAM cùng với code của mình rồi, vì tốc độ đọc ghi trong RAM nhanh hơn tốc độ đọc ghi trong đĩa cứng rất nhiều lần.
Vậy là bạn đã hiểu rõ cơ chế hoạt động của từng loại thư viện rồi, bạn sẽ biết khi nào thì nên dùng thư viện liên kết động, khi nào thì nên dùng thư viện liên kết tĩnh để chương trình của mình viết ra luôn đạt hiệu suất tối đa.