Tại sao việc sử dụng các thư viện C ++ lại phức tạp như vậy?


14

Trước hết, tôi muốn lưu ý rằng tôi yêu C ++ và tôi là một trong những người cho rằng việc viết mã trong C ++ dễ hơn Java. Ngoại trừ một điều nhỏ bé: thư viện.

Trong Java, bạn có thể chỉ cần thêm một số jar vào đường dẫn xây dựng và bạn đã hoàn thành.

Trong C ++, bạn thường phải đặt nhiều đường dẫn cho các tệp tiêu đề và chính thư viện. Trong một số trường hợp, bạn thậm chí phải sử dụng cờ xây dựng đặc biệt. Tôi chủ yếu sử dụng Visual Studio, Code Blocks và không có IDE nào cả. Tất cả 3 tùy chọn không khác nhau nhiều khi nói về việc sử dụng các thư viện bên ngoài.

Tôi tự hỏi tại sao không có sự thay thế đơn giản hơn cho việc này? Giống như có một tệp .zip đặc biệt có mọi thứ bạn cần ở một nơi để IDE có thể thực hiện tất cả công việc cho bạn khi thiết lập các cờ xây dựng. Có bất kỳ rào cản kỹ thuật cho việc này?

Câu trả lời:


15

C ++ được thiết kế để cải thiện ngôn ngữ C bằng cách tạo ra một ngôn ngữ dễ dàng hơn, tự động hơn với sự hỗ trợ cho lập trình hướng đối tượng. Nhưng nó không làm gì để thay đổi hoặc cải thiện cách C xử lý các thư viện và tệp tiêu đề bên ngoài. C ++ không có hệ thống mô-đun như các ngôn ngữ hiện đại hơn - nó vẫn sử dụng hệ thống liên kết và tiền xử lý C. Vì một trong những mục tiêu đã nêu của C ++ là khả năng tương thích ngược với mã C, nên điều này không thực sự đáng ngạc nhiên. Bất kỳ hệ thống mô-đun C ++ nào cũng sẽ phải hoạt động cùng với hệ thống tiêu đề / tệp liên kết C cũ. Ủy ban tiêu chuẩn C ++ đơn giản là không có ý định thiết kế một hệ thống mô-đun hiện đại hơn. (Mặc dù họ đang làm việc với nó, hãy xem bình luận của Klaim bên dưới.)


8
Dòng cuối cùng không hoàn toàn chính xác: hệ thống mô-đun đã hoạt động từ năm 2004 (tài liệu đầu tiên) nhưng ngụ ý rất nhiều công việc đến nỗi nó thậm chí không thể được dự tính cho tiêu chuẩn cuối cùng vì sẽ thiếu việc thực hiện ủng hộ đề xuất. Việc triển khai đó đã được thực hiện (cùng với các bản nháp khác) để đánh bại tiêu chuẩn C ++ tiếp theo. Không phải nó không phải là ưu tiên của các nhà thiết kế C ++, đây chỉ là một trong những tính năng bạn không thể mắc phải, phải giữ tính tương thích retro (với hầu hết mã C và C ++ 11) và rất khó để hiểu đúng. Vì vậy, nó mất rất nhiều thời gian.
Klaim

Tuyệt vời. Cảm ơn bạn, Klaim, cho thông tin. Chắc chắn sẽ kiểm tra. Điều đó rất thú vị :)
Pijusn

Hầu hết các ngôn ngữ đứng ngoài công việc chuẩn hóa các liên kết vì cơ chế có thể khác nhau giữa các hệ điều hành. Bản chất chạy mọi nơi của Java yêu cầu bắt buộc một định dạng thư viện và liên kết cụ thể. Không có gì sai với điều đó, nhưng nó mang lại một số chi phí có thể không được mong muốn trong mọi trường hợp.
Blrfl

Thành thật mà nói, tôi khá sợ hãi khi đọc rằng ủy ban tiêu chuẩn C ++ đang làm việc tại một hệ thống mô-đun cho chính ngôn ngữ này. C ++ đã là một ngôn ngữ lớn và phức tạp và cố gắng thêm một tính năng nhạy cảm như vậy vào nó có thể rất rủi ro. Như Karl Bielefeldt đã lưu ý ở đây bên dưới, vấn đề này đã tìm thấy một giải pháp tốt ở cấp độ nền tảng (hệ thống gói Linux) và có lẽ có thể được giải quyết rất tốt bởi hầu hết các IDE với ít nỗ lực. Có một cái nhìn về cách Thư viện Qt và Qt Creator xử lý vấn đề này, ví dụ.
AlexBippii

1
@AlexBottoni, tôi thực sự nghi ngờ họ sẽ đưa ra một hệ thống mô-đun chuẩn hóa bất cứ lúc nào trong thế kỷ này. Họ thậm chí không bao gồm các khái niệm trong C ++ 11 vì họ không thể đồng ý về việc triển khai chính xác. Một hệ thống mô-đun hoạt động cùng với hệ thống tiêu đề / liên kết thậm chí còn phức tạp hơn và có lẽ chúng ta sẽ không thấy nó trong một thời gian dài.
Charles Salvia

2

Đó không phải là một rào cản kỹ thuật. Trên Linux, "tệp zip đặc biệt" của bạn là gói thư viện bạn cài đặt với trình quản lý gói và thiết lập cờ bao gồm và cờ liên kết cũng đơn giản như thêm một vài dòng vào configure.acsử dụng pkg-config để thiết lập mọi thứ.

Pkg-config cũng có sẵn cho Windows, nhưng các rào cản văn hóa đã ngăn cản việc áp dụng rộng rãi của nó. Unix có một lịch sử mạnh mẽ về việc cho phép tính di động bằng cách phân phối mã nguồn, vì vậy chúng bao gồm các công cụ phát triển miễn phí. Windows có một lịch sử mạnh mẽ chỉ khuyến khích các nhà phát triển phân phối và tính phí nhị phân cho các công cụ. Khi bạn kiếm tiền từ việc bán các thư viện, sẽ không có ý nghĩa gì khi giúp các bên thứ ba cung cấp chúng dễ dàng hơn.

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.