Чому сучасні бібліотеки не використовують OOP


20

Я програміст на рівні початківців C ++, але поняття мови я досить добре розумію. Коли я почав вивчати зовнішні бібліотеки C ++, як-от SDL, OpenGL (можливо, ще щось), на моє велике здивування я виявив, що вони взагалі не використовують поняття C ++.

Наприклад, ні SDL, ні OpenGL не використовують класи або винятки, віддаючи перевагу функціям та кодам помилок. У OpenGL я бачив такі функції, як glVertex2f, який приймає 2 вхідних змінних у якості вхідних даних і, ймовірно, буде кращим як шаблон. Більше того, ці бібліотеки іноді використовують marcos, хоча, мабуть, є загальною згодою, що використання макрозів погано.

Загалом вони, здається, написані більше у стилі C, ніж у стилі C ++. Але вони абсолютно різні незрівнянні мови, чи не так?

Питання: чому сучасні бібліотеки не використовують переваг мови, на якій вони написані?


1
Я думаю, що Тімо добре відповів на ваше запитання. Іншими причинами (для інших бібліотек) може бути бібліотека, яка була створена в C, а потім перенесена. Або розробники C написали це.
— Жанна Боярський

5
Крім того, ні OpenGL, ні «сучасні» в тому сенсі, що вони молоді, або, принаймні, здатні прийняти нові фантазії. Обидва мають тривалу історію (OpenGL 1.1: 1997; SDL: 1998) та обмеження сумісності ззаду назад.

1
Просто так сказано: DirectX набагато об'єктивніший (якщо ще й трохи нижчий).
— cHao

1
Рідні C ++ бібліотеки, такі як stl та Boost, також не використовують хитрі, застарілі, непотрібні концепції OOP.
— SK-логіка

5
Я думаю, що ваше помилкове уявлення тут полягає в тому, що SDL і OpenGL є репрезентативними для багатьох "сучасних бібліотек". Наприклад, дуже популярна бібліотека Qt повністю орієнтована на об'єкти. Назви вашого питання краще мати "Чому SDL і OpenGL не використовують OOP"?
— Док Браун

Відповіді:


31

І OpenGL, і SDL - це бібліотеки C і відкривають інтерфейс C для решти країн світу (як і майже кожна мова там, може працювати з C, але не обов'язково з C ++). Таким чином, вони обмежені процедурним інтерфейсом, який C дає вам та способу декларування та використання структур даних.

Окрім аспекту "взаємодії з іншими мовами", який пропонує інтерфейс C, C, як правило, є трохи більш портативним, ніж C ++, що, в свою чергу, полегшує отримання не залежної від платформи частини коду бібліотек як, наприклад, що працюють в іншій ОС або архітектурі обладнання. Практично на кожній платформі є гідний компілятор C, але все ж є такі, які обмежили компілятори C ++ або такі, які просто не дуже хороші.

Хоча C і C ++ є дуже різними мовами, вони не є "несумісними", насправді значною мірою C ++ є сукупністю C. Є деякі несумісності, але не багато, тому використовувати інтерфейс C від C ++ - дуже легка річ зробити.


О Я бачу. Ну, наступне питання: чи є, скажімо, бібліотека графіки для C ++ настільки ефективною, як OpenGL? Чи, можливо, обгортка над OpenGL, яка використовує всі переваги C ++ та забезпечує гарне управління ресурсами? API виглядатимуть набагато чистіше, і я не думаю, що накладні витрати на пам'ять / процесор будуть занадто високими.
— Саге

Ефективна чи ефективна? У будь-якому випадку, слід досить легко знайти обгортку C ++ для SDL або OpenGL. Швидкий Google підніс цю обгортку для OpenGL: oglplus.org - не маю уявлення, наскільки це добре, я не використовував його.
— Тімо Геш

1
Так, є досить багато проектів, які намагаються обернути OpenGL більше інтерфейсів C ++ ish (у мене навіть є сам, хоча я утримуюсь від багатьох функцій і в основному додаю перевантаження і подібне). Моє враження, що більшість додають багато багажу, що ускладнює переклад чистих фрагментів OpenGL і складніше застосовувати стандартні оптимізації (шукайте Дизайн, орієнтований на дані; деякі ігрові розробники клянуться ним). Але в жодному разі не дозволяйте цьому стримувати вас. Крім того, ви можете мати більше шансів використовувати цілий ігровий механізм (наприклад, Irrlicht або Ogre), а не просто графічний API з голими кістками.

Добре, я думаю, що у мене є всі відповіді, які я шукав. Дякую всім!
— Саге

Слід також зазначити, що графічне обладнання не розуміє і не виконує обчислень на заняттях. У вас є float3s, тому що все обладнання, що стосується, це масиви поплавків. Структура "класу" (поняття про те, що вектор дорівнює 2, 3 або 4 плаває) - це все мається на увазі в тому, як картці пропонується отримати доступ до своєї маси пам'яті. Можливо, приємно спробувати і подумати на заняттях при програмуванні графіки, але, на мій погляд, така робота досить близька до апаратних засобів, що це більше клопоту, ніж допомоги для вилучення брудних деталей реалізації.
— Девід Кауден

10

Думаю, ви плутаєте "написання бібліотеки" проти "експонування API зовні". Я не знаю багато конкретно про згадані вами бібліотеки (вони можуть бути написані внутрішньо на C), але я знаю, що багато інших, в тому числі я, написали бібліотеки / рамки С ++, які повністю використовували всі види фантазійних практик / моделей OOP , але все-таки піддаються API стилю C у зовнішньому світі.

  1. C і C ++ - не зовсім різні системи. C ++ був побудований поверх C і a) може легко споживати код C і b) повністю здатний надати apis у стилі C.
  2. Перевагою інтерфейсу С є те, що він дуже легко витрачається рештою світу. Є шари interop, які дозволяють використовувати API API майже з будь-якої мови (python, java, c #, php ...), де інтерфейс C ++ є споживчим з ..... ну, можливо, C ++ і все ще не завжди ( різні компілятори, різні версії одного компілятора спричинять проблеми)

Раніше, в якості експерименту в одному з робочих проектів, я вирішив відкрити інтерфейс "OO" з DLL C ++. Щоб приховати внутрішні деталі та уникнути купу інших речей, я майже закінчив винаходити Windows COM (компонентну об’єктну модель). Після цього проекту я зрозумів, що COM не такий вже й поганий, як це роблять люди, тому що а) він відкриває інтерфейси OOP, б) піклується про всі проблеми, в які я зіткнувся, і в) достатньо стандартний, щоб витрачати його на ряд інші мови.

Але COM все ще не обходиться без багажу. У багатьох випадках регулярний API в стилі C все ще є значно кращою альтернативою.


7

І OpenGL, і SDL - це бібліотеки C, а не C ++. Ви можете використовувати їх із C ++, але вони написані на C та мають API API (який також доступний з інших мов; C ++ - це біль для доступу через FFI). Погляньте на Boost для великого масиву бібліотек C ++ загального призначення (та деяких спеціалізованих) бібліотек C ++ та SFML для мультимедійної бібліотеки C ++.


3

Якщо говорити саме про OpenGL, OpenGL спочатку був частиною стеку API - OpenGL забезпечував API низького рівня, орієнтований на продуктивність, доступний з C (або навіть Fortran), тоді як OpenInventor забезпечує об'єктно-орієнтований API високого рівня, розроблений використовувати з C ++ і надавати як графічний інтерфейс API високого рівня, так і абстракції для збереження / читання сцен у / з файлів та інтеграцію графічного інтерфейсу.

Нарешті, OpenGL пішов набагато далі, ніж OpenInventor (це наполягало на більш гострій потребі, даючи виробникам відео обладнання, для чого можна оптимізувати, і надаючи звичайним API низького рівня, щоб люди могли орієнтуватися замість того, щоб безпосередньо займатися обладнанням для прискорення 3D). Але OpenInventor все ще є там, і є хороша реалізація з відкритим кодом - Coin3D - з підтримкою Unix / X11, Windows та MacOS X / Cocoa.


-2

Ці бібліотеки зовсім не сучасні. Вони є API API і погані. Ваше приміщення є недоліком.


Як OpenGL не є сучасним?
— Джеймс

1
Я б насправді мав би з цим погодитися. OpenGL не є сучасною, оскільки його модель доступу та маніпулювання станом, яким він керує, базується на апаратних засобах початку 1990-х. Виконувати такі речі, як прив’язання текстури до певної цілі на певному блоці, і лише обмежена кількість доступних незалежно від того, скільки текстур у вас в VRAM, не дуже сучасно.
— користувач1118321
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.