Tại sao các thư viện hiện đại không sử dụng OOP


20

Tôi là một lập trình viên C ++ mới bắt đầu, nhưng tôi hiểu các khái niệm về ngôn ngữ khá tốt. Khi tôi bắt đầu tìm hiểu các thư viện C ++ bên ngoài, như SDL, OpenGL (có thể là một thứ khác nữa), tôi rất ngạc nhiên khi phát hiện ra rằng họ hoàn toàn không sử dụng các khái niệm C ++.

Ví dụ, cả SDL, hay OpenGL đều không sử dụng các lớp hoặc ngoại lệ, ưu tiên các hàm và mã lỗi. Trong OpenGL tôi đã thấy các hàm như glVertex2f, lấy 2 biến float làm đầu vào và có thể sẽ tốt hơn dưới dạng mẫu. Hơn nữa, các thư viện này đôi khi sử dụng marcos, trong khi nó có vẻ là một thỏa thuận chung rằng sử dụng macro là xấu.

Nhìn chung, chúng dường như được viết nhiều hơn theo kiểu C, hơn là theo kiểu C ++. Nhưng chúng là những ngôn ngữ hoàn toàn khác nhau, phải không?

Câu hỏi là: tại sao các thư viện hiện đại không sử dụng những lợi thế của ngôn ngữ mà chúng được viết bằng?


1
Tôi nghĩ Timo đã trả lời tốt câu hỏi của bạn. Các lý do khác (đối với các thư viện khác) có thể là một thư viện được tạo bằng C và sau đó được chuyển. Hoặc các nhà phát triển C đã viết nó.
Jeanne Boyarsky

5
Ngoài ra, cả OpenGL cũng không phải là "hiện đại" theo nghĩa là họ còn trẻ, hoặc ít nhất có thể áp dụng các phương pháp mới lạ mắt. Cả hai đều có một lịch sử lâu dài (OpenGL 1.1: 1997; SDL: 1998) và các ràng buộc tương thích ngược.

1
Như đã nói: DirectX có tính khách quan hơn nhiều (nếu cũng ở mức độ thấp hơn một chút).
cHao

1
Các thư viện C ++ bản địa, như stl và Boost, cũng không sử dụng các khái niệm OOP nhảm nhí, lỗi thời, vô dụng.
SK-logic

5
Tôi nghĩ quan niệm sai lầm của bạn ở đây là SDL và OpenGL là đại diện cho rất nhiều "thư viện hiện đại". Thư viện Qt rất phổ biến, ví dụ, hoàn toàn hướng đối tượng. Tiêu đề câu hỏi của bạn tốt hơn nên là "Tại sao SDL và OpenGL không sử dụng OOP"?
Doc Brown

Câu trả lời:


31

Cả OpenGL và SDL đều là thư viện C và hiển thị giao diện C cho phần còn lại của thế giới (hầu như mọi ngôn ngữ ngoài kia đều có thể giao tiếp với C nhưng không nhất thiết phải có C ++). Do đó, chúng bị giới hạn trong giao diện thủ tục mà C cung cấp cho bạn và cách C khai báo và sử dụng cấu trúc dữ liệu.

Hơn và trên khía cạnh "giao tiếp với các ngôn ngữ khác" mà giao diện C cung cấp cho bạn, nói chung C có xu hướng dễ mang theo hơn một chút so với C ++, điều này giúp dễ dàng có được phần phụ thuộc không phải nền tảng của mã thư viện như những cái này hoạt động trên một hệ điều hành hoặc kiến ​​trúc phần cứng khác. Khá nhiều nền tảng ngoài kia có một trình biên dịch C phong nha, nhưng vẫn có một số nền tảng đã hạn chế các trình biên dịch C ++ hoặc các trình biên dịch không tốt lắm.

Mặc dù C và C ++ là hai ngôn ngữ rất khác nhau, nhưng chúng không "không tương thích", trên thực tế, ở một mức độ lớn, C ++ là siêu ngôn ngữ của C. Có một số điểm không tương thích nhưng không nhiều, vì vậy sử dụng giao diện C từ C ++ là một điều rất dễ dàng làm.


Ồ, tôi hiểu rồi. Chà, câu hỏi tiếp theo là: có phải, một thư viện đồ họa cho C ++ có hiệu quả như OpenGL không? Hoặc có thể là một trình bao bọc trên OpenGL sử dụng tất cả các lợi thế của C ++ và cung cấp quản lý tốt các tài nguyên? Các API sẽ trông gọn gàng hơn nhiều và tôi không nghĩ rằng chi phí bộ nhớ / cpu quá cao.
Saage

Hiệu quả hay hiệu quả? Dù bằng cách nào, việc tìm một trình bao bọc C ++ cho SDL hoặc OpenGL khá dễ dàng. Một Google nhanh chóng đưa ra trình bao bọc này cho OpenGL: oglplus.org - không biết nó tốt như thế nào, tôi đã không sử dụng nó.
Timo Geusch

1
Vâng, có khá nhiều dự án cố gắng bao bọc OpenGL với nhiều giao diện ish C ++ hơn (tôi thậm chí còn có một mình, mặc dù tôi đã kiềm chế nhiều tính năng và chủ yếu thêm quá tải và như vậy). Ấn tượng của tôi là hầu hết thêm rất nhiều hành lý khiến cho việc dịch các đoạn OpenGL thuần túy trở nên khó khăn hơn và khó áp dụng tối ưu hóa tiêu chuẩn (tra cứu Thiết kế hướng dữ liệu; một số nhà phát triển game chửi rủa nó). Nhưng bằng mọi cách đừng để điều đó ngăn cản bạn. Ngoài ra, bạn có thể gặp nhiều may mắn hơn khi sử dụng toàn bộ công cụ trò chơi (như Irrlicht hoặc Ogre) thay vì chỉ API đồ họa đơn giản.

Được rồi, tôi nghĩ rằng tôi có tất cả các câu trả lời tôi đang tìm kiếm. Cảm ơn mọi người!
Saage

Cũng cần lưu ý rằng phần cứng đồ họa không hiểu hoặc thực hiện tính toán trên các lớp. Bạn có float3s bởi vì tất cả các phần cứng có liên quan là mảng nổi. Cấu trúc "lớp" (khái niệm rằng một vectơ là 2, 3 hoặc 4 float) hoàn toàn tiềm ẩn trong cách thẻ được yêu cầu truy cập vào bộ nhớ của nó. Có thể tốt để thử và suy nghĩ trong các lớp khi lập trình đồ họa, nhưng theo tôi, loại công việc đó đủ gần với phần cứng mà nó rắc rối hơn là giúp trừu tượng hóa các chi tiết bẩn của việc triển khai.
David Cowden

10

Tôi nghĩ rằng bạn đang nhầm lẫn "viết thư viện" so với "phơi bày API ra bên ngoài". Tôi không biết nhiều về các thư viện mà bạn đã đề cập (chúng có thể được viết bằng C), nhưng tôi biết nhiều thư viện khác, bao gồm cả tôi, đã viết thư viện / khung C ++ sử dụng đầy đủ tất cả các loại thực tiễn / mẫu OOP ưa thích , nhưng vẫn tiếp xúc API kiểu C với thế giới bên ngoài.

  1. C và C ++ không phải là hệ thống hoàn toàn khác nhau. C ++ được xây dựng trên đỉnh C và a) có thể dễ dàng tiêu thụ mã C và b) hoàn toàn có khả năng cung cấp apis kiểu C.
  2. Ưu điểm của giao diện C là phần còn lại của thế giới rất dễ tiêu thụ. Có các lớp interop cho phép API C được sử dụng từ bất kỳ ngôn ngữ nào (python, java, c #, php ...), trong đó giao diện C ++ có thể sử dụng được từ ..... tốt, có thể là C ++ và vẫn không phải lúc nào cũng ( trình biên dịch khác nhau, các phiên bản khác nhau của cùng một trình biên dịch sẽ gây ra sự cố)

Trước đây, như một thử nghiệm trong một trong các dự án tại nơi làm việc, tôi đã quyết định trưng ra giao diện "OO" từ một C ++ DLL. Để che giấu các chi tiết nội bộ và tránh một loạt những thứ khác, tôi gần như đã kết thúc việc phát minh lại Windows COM (mô hình đối tượng thành phần). Sau dự án đó, tôi nhận ra COM không tệ như mọi người nghĩ là vì a) nó phơi bày các giao diện OOP, b) quan tâm đến tất cả các vấn đề tôi gặp phải và c) đủ tiêu chuẩn để có thể tiêu thụ từ một số những ngôn ngữ khác.

Nhưng COM vẫn không phải không có hành lý của nó. Trong nhiều trường hợp, API kiểu C thông thường, kế hoạch vẫn là một lựa chọn tốt hơn nhiều.


7

Cả OpenGL và SDL đều là thư viện C, không phải thư viện C ++. Bạn có thể sử dụng chúng từ C ++, nhưng chúng được viết bằng C và có API C (cũng có thể truy cập được từ các ngôn ngữ khác; C ++ rất khó truy cập thông qua FFI). Hãy xem Boost cho một mảng lớn các thư viện C ++ đa năng (và một số chuyên ngành) và SFML cho thư viện đa phương tiện C ++.


3

Nói riêng với OpenGL, OpenGL ban đầu là một phần của một nhóm API - OpenGL cung cấp API định hướng hiệu suất, mức độ thấp, có thể truy cập từ C (hoặc thậm chí là Fortran), trong khi OpenInventor cung cấp API hướng đối tượng cấp cao, được thiết kế được sử dụng từ C ++ và cung cấp cả API biểu đồ cảnh cấp cao và trừu tượng hóa để lưu / đọc cảnh đến / từ tệp và tích hợp GUI.

OpenGL cuối cùng đã đi xa hơn nhiều so với OpenInventor (nó đáp ứng nhu cầu cấp thiết hơn, cung cấp cho các nhà sản xuất phần cứng video một thứ gì đó để tối ưu hóa và cung cấp một API cấp thấp thông thường mà mọi người có thể nhắm mục tiêu thay vì xử lý trực tiếp phần cứng tăng tốc 3D). Nhưng OpenInventor vẫn ở ngoài đó và có một triển khai nguồn mở tốt - Coin3D - với sự hỗ trợ cho Unix / X11, Windows và MacOS X / Ca cao.


-2

Những thư viện đó không phải là hiện đại từ xa. Chúng là các API C và các API xấu ở đó. Tiền đề của bạn là thiếu sót.


OpenGL không hiện đại như thế nào?
James

1
Tôi thực sự phải đồng ý với điều này. OpenGL không hiện đại ở chỗ mô hình của nó để truy cập và thao túng trạng thái mà nó quản lý dựa trên phần cứng từ đầu những năm 1990. Phải làm những việc như liên kết một kết cấu với một mục tiêu cụ thể trên một đơn vị cụ thể và chỉ có một số lượng hạn chế trong số đó cho dù bạn có bao nhiêu họa tiết trong VRAM không phải là rất hiện đại.
dùng1118321
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.