Чому C ++ все ще вважає за краще створювати важкі програми GUI на останніх динамічних мовах? [зачинено]


46

Я бачу, що більшість програм, які містять важкий вміст графічного інтерфейсу, зазвичай розробляються на C ++. Більшість ігор / браузерів кодуються в C ++.

Чи не можемо ми просто розробити кращі програми GUI з найновішими динамічними мовами? Я знаю, що Java не буде чудовим вибором. Але як щодо таких мов, як python, які побудовані на C? Хіба останні мови не повинні бути кращими за їх предків? Чому ми все ще мусимо віддавати перевагу віковій C ++ перед останніми мовами?

І я також хотів би знати, що це відповідає за C ++, за кращу швидкість обробки GUI? З іншого боку, чого не вистачає інших останніх мов?


22
Якщо ви вважаєте, що Java - "динамічна" мова, ви сильно розгублені, що означає це слово в цьому контексті.
Майк Баранчак

15
@ Майк Баранчак: Це довга історія. В основному, був дослідницький проект спочатку в Стенфорді, пізніше в дослідженні Sun під назвою Self. Self - мова програмування в сім'ї Smalltalk, яка є простішою, потужнішою, виразнішою і головне, значно більш динамічною, ніж Smalltalk. Оскільки він був розроблений як мова програмування для розробки цілих систем у (як і всі діалекти Smalltalk), включаючи (але не обмежуючись ними) настільні додатки, сервери, операційні системи, драйвери пристроїв, сам по собі він повинен був надзвичайно швидко. Отже, команда Self винайшла цілу купу нового ...
Jörg W Mittag

15
... методи оптимізації, і коли Self VM вийшов у 1987 році (а тим більше друге покоління в 1992 році), це було швидко. Це було швидше, ніж будь-який інший Smalltalk VM. Система Self постачалася з великою кількістю прикладу коду, і одним із таких прикладів був перекладач Smalltalk, написаний у Self, і навіть це було швидше, ніж будь-який інший Smalltalk VM. Самостійність була швидшою, ніж у багатьох C ++ впровадженнях на той час, і навіть конкурувала з C. Ну, ви це розумієте. Це було швидко . Однак Sun вирішив, що у них немає потреби в об'єктно-орієнтованій мові програмування або швидкій машині VM, тому вони ...
Jörg W Mittag

15
... в основному голодував проект «Я» до смерті, припинивши фінансування. Коли інженери Self VM не розчарувались у Sun, вони були швидко зібрані запуском Smalltalk під назвою LongView (більш відомий за назвою їх самого продукту, додатковою системою статичного типу для Smalltalk: StrongTalk). LongView знав, що вони ніколи не зможуть продати статичний набір тексту для Smalltalk, тому подумали, що краще продати найшвидший Smalltalk на планеті, а потім включити StrongTalk в пакет у своєрідній грі Trojan Horse. Вони також зрозуміли, що ніхто не крутий ...
Йорг W Міттаг

15
... оптимізації, які робив Self VM, були якимось чином особливими для Self, але були застосовні до майже будь-якої об'єктно-орієнтованої мови (або навіть просто до будь-якої мови взагалі ). Отже, інженери Self VM приступили до роботи над VM Smalltalk під назвою Animorphic VM. Знову ж таки, Animorphic VM був сліпуче швидким (і все-таки є насправді, хоча кодову базу не торкалися вже 15 років, вона все ще може конкурувати з сучасними високопродуктивними Smalltalks, JVM та .NET, особливо якщо взяти враховуючи, що він використовує набагато менше ресурсів, ніж ті, оскільки він був розроблений для 486-х років з 20 мег ...
Jörg W Mittag

Відповіді:


58

Я з тих людей, хто пише додатки графічного інтерфейсу C ++ (переважно для Windows). З Qt, якщо бути точним. Мої причини:

  • Мені подобається C ++. Я фрілансер і зазвичай можу вибрати свої інструменти (пощастило мені!)
  • У керованому середовищі вам може бути важко, коли вам потрібно використовувати якийсь некерований код (довгомоторні декларації WinAPI в C #, комусь?)
  • Менше залежностей, які легше розгортаються
  • Більше контролю над усім.
  • RAII (проти GC). І навіть якщо я виділяю їх new, я рідко коли- deleteнебудь явно щось бою, бо використовую розумні покажчики чи QObjectієрархію.
  • C ++ дуже хвилює ці дні, я не можу чекати, коли компілятор повністю підтримає новий стандарт.
  • Швидкість (лише в кінці списку. Я знаю, що це не так важливо для самого графічного інтерфейсу, але воно, як правило, швидше, тому що програми C ++ не страждають від накладних витрат, які виконуються під час виконання, байтовий код JIT-компіляція та подібні технології додають до Програма.)

Як бачите, це переважно особисті переваги. Я вважаю важливим, щоб моя робота була приємною, і C ++ надає мені це.


11
+1 Швидкість, безумовно, головна причина тут, окрім особистих уподобань. Однак мені подобається, що "C ++ дуже хвилює ці дні". Щоб звернутись до запитувача , не @ Tamás Szelei: Звичайно, обчислювальні зміни швидко змінюються новими ідеями, парадигмами, технологіями, продуктами, але найновіші та найбільші - це не чеснота. C ++ існує деякий час, і це не означає, що він застарів, скоріше, він має досить довгий досвід порівняно з новими технологіями. Оригінальний текст Stroustrup (книга винахідника) дуже важкий, але інші приємні книги там - перевірте, наприклад, oreilly.com.
therobyouknow

1
@Tarnas Я думаю, що "завжди буде швидше" є трохи обмеженим / авторитетним, але недостатньо для того, щоб вимагати перемоги ...
Макс

2
Як анекдотична підтримка: Я брав участь у різних проектах для створення графічних інтерфейсів із значним розміром у Windows за допомогою C ++ та JavaScript. Я також брав участь у різних проектах ігрових консолей на C ++ та JavaScript. В обох випадках із JavaScript було значно більше швидкості та пам'яті.
Gort the Robot

2
Пізно до партії, але чи можете ви детальніше зупинитися на "менш / легко розгортаються залежності"?
weberc2

2
Я використовую C ++ вже більше 20 років. З 11, 14 і 17. додано багато нових та чудових функцій. Ви майже можете використовувати C ++ як мову сценаріїв і все ж отримувати перевагу від швидкої швидкості. Коли я працюю з великими даними, мені майже доводиться використовувати C ++, оскільки будь-яка інша мова там буде на 10-1000 повільніше.
Kemin Zhou

32

Тому що швидкість має значення.

  • Ігри використовують C ++ для основних завдань, де важлива продуктивність. Вони використовують динамічні мови для сценаріальних завдань, де важлива гнучкість.

  • Настільні програми GUI : Наприклад, Visual Studio написаний у .NET, а не на рідному C ++. Здається, він працює досить добре для IDE, оскільки самому IDE не потрібно виконувати багато завдань з високою ефективністю. (Компілятор, лінкер та інші інструменти не обов'язково записуються у .NET - хоча, як wawa вказує в коментарі, деякі, здається, є (наприклад, VB.NET))

  • Браузери теж повинні бути швидкими. Адже вони є своєрідною вторинною ОС. З іншого боку, ви можете стверджувати, що великі частини Firefox насправді "написані" на JavaScript, оскільки структура Mozilla, здається, сильно залежить від javascript.

Підводячи підсумок: я б не сказав, що C ++ є обов'язково переважним, але якщо у вас є вузьке місце, ви повинні підійти ближче до металу і тоді ви зустрінете C ++ (ну або C). Іноді просто простіше зробити все на C ++ - одній мові.


1
+1 Найкраща відповідь: Цілком пов'язана зі швидкістю, як основна причина використання C ++. Навіть самі Microsoft визнають, що C ++ найкращий за ефективністю порівняно з c # та візуальним базовим - дивіться їх на своїх сторінках Visual Studio. Дуже близькою є портативність - якщо ви використовуєте крос-платформні бібліотеки, такі як Qt. Найкраща відповідь ще й тому, що це об'єктивне, а не суб'єктивне.
therobyouknow

2
Ваша друга думка не зовсім вірна. Компілятор VB.NET записаний у VB.NET, а компілятор F # записаний у F #. Компілятор C # - це не те, що було опубліковано про проект Roslyn, я думаю, що компілятор C # переписується на C #.
Wesley Wiser

5
Візуальна студія gui (хром) написана (від vs2010) у c # та WPF. Провідник рішень, система побудови, браузер коду та панель інструментів пишеться на c # / c ++ з формами winform. Компілятор написаний c ++.
Мартін Беккет

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

@MartinBa: Зауважу, що поточний компілятор для C # і VB (Roslyn) написаний на C #.
jmoreno

17

Програми GUI, які, як ви бачите, написані на мові C ++, як правило, робляться через застарілі причини. Python (з Qt або Gtk) дуже життєздатний для програм GUI, як і C #, якщо ви працюєте в будинку Windows. Починаючи щось нове, або дуже віддають перевагу С ++ через відсутність роботи сантехніки, яку потрібно виконати.


5
+1 існуючий код важливий. Починати повністю з нуля буває рідко при розробці нових програм

7
як використання Python з Qt більш кращим, ніж використання C ++ з Qt? Якби я сьогодні розпочав новий проект, я все-таки використовував би C ++ для GUI. Тому що: а) це те, що я знаю, б) це робить роботу добре. Тільки тому, що C ++ вже деякий час не робить його "застарілим".
TZHX

2
@TZHX: "Це те, що я знаю" - це аргументація життєздатного. Якщо це не дано, не потрібно більше доглядати за управлінням пам’яттю - це величезне підвищення продуктивності, і це може компенсувати зусилля для вивчення Python навіть для одного проекту. Ще однією причиною використання Python була б кросплатформованість - із C ++ ви повинні бути обережними та вживати спеціальних заходів, тоді як python, ймовірно, просто працює.
тдаммери

4
Я не бачу жодних переваг використання PyQt замість Qt з C ++ для тих, хто знає C ++.
БенджамінB

13
C ++, ймовірно, також просто працює. З Python ви повинні турбуватися про те, яку версію python встановив користувач, або турбуватися про його поєднання. Насправді не так вже й багато роботи, щоб зробити «догляд за пам'яттю», якщо ви не зробите дурних помилок. Я думаю, що багато людей дають "управління пам'яттю" як велику перешкоду роботі з C ++, не знаючи, наскільки це різниця.
TZHX

16

Оскільки незалежно від того, скільки покажуть тести на ефективність .NET та подібних натовпів, незалежно від того, наскільки вони наближаються до показників, врешті-решт додаток C ++ виходить на перше місце. Це швидше при холодному завантаженні, він швидше, і є більше способів його вдосконалити.

На початкових етапах проекту я чув численні докази того, що .NET - це дорога, але після того, як його обрано, вони завжди виявлялися важким загрозою.

Також C ++ на сьогоднішній день є досить безпечним і досить простим у використанні, особливо з такими рамками, як Qt або WTL.


2
+1: "Також C ++ на сьогоднішній день є досить безпечним і досить простим у використанні, особливо з такими рамками, як Qt ..." Я повністю погоджуюся: я вважаю, що велика сила - це не (тільки) C ++ сама по собі, а факт, що (1 ) він компілюється в основний код, (2) має розумний набір функцій (OOP, шаблони), (3) має дуже хороші рамки, такі як Qt. Це компенсує той факт, що мова досить велика і її важко вивчити: раз ви освоїте гідний підмножина мови та кілька хороших бібліотек, ви можете бути справді продуктивними з нею.
Джорджо

10

Більшість ігрових двигунів кодуються в C ++. Також багато двигунів браузера кодуються в C ++. Але графічний інтерфейс браузера часто кодується за допомогою легкого сценарію (JavaScript, Python). За винятком виключення Source Engine, більшість ігрових двигунів також використовують мови скриптування (наприклад, Lua або Python). [для довідки: список ігор зі сценаріями Lua ]

Також візьміть таку популярну бібліотеку графічного інтерфейсу C ++, як Qt. У поточній версії (4.7) він використовує QML для GUI. QML - це в основному JavaScript з прив’язками Qt.

Так що насправді немає C ++ проти динамічних мов, це змішано.


[Цитування потрібне]. Я знаю, що багато ігор використовують мови скриптів, щоб дозволити користувачам розширювати їх, але, наскільки я знаю, насправді не так багато ігор, які використовують мови скриптів для їх випуску-бінарної функціональності.
ProdigySim

1
@ProdigySim: Я знаю декілька, що роблять. У верхній частині голови, World of Warcraft (Lua + XML), Uncharted серія Naughty Dog's Uncharted (Lisp), серія Unreal (UnrealScript), ігри, засновані на двигунах Torque та Unity, Dungeon Siege, NeverWinter Nights та багато інших. Ігри, керовані даними, стають нормою, коли хост сценаріїв переймає більшість (якщо не всі) функцій інтерфейсу та стан ігор зверху вниз.
greyfade

@ProdigySim: навіть якщо це приховано від звичайних користувачів, це не означає, що внутрішньо вони не використовують сценарії двигунів. В основному розробники ігор мають два варіанти - створити власну мову сценаріїв для моделей або використовувати одну із загальних цілей. Lua особливо хороший для ігор, так як це, як правило, добре для систем реального часу.
vartec

Джерело двигуна використовує мову сценаріїв Білка.
cubuspl42

6

Першою причиною буде: (стара) звичка

Друга причина: менша надійність віртуальних машин, інтерпретаторів, які потрібно встановити тощо.

І ще є досить чудових IDE для розробки коду в C ++.


1
" все-таки чудові IDE". Я б заперечував, що Visual Studio і Eclipse є передовими і вже досить давно.
JBRWilkinson

@JBRWilkinson: Я не сказав, що інша мова їх теж не має.
Roalt

6

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

Дивіться тут короткий приклад.


2
Adobe Lightroom, який в основному є підмножиною Photoshop, написаний у Lua.
Йорг W Міттаг

4
@ Йорг: а решта - це C ++. насправді це, мабуть, найкраща комбінація, що доступна: C ++ для фундаменту, Lua для решти (хоча я все ще віддаю перевагу C над C ++ для речей низького рівня).
Хав'єр

2
@Javier: Так, Lightroom - це в основному алгоритми маніпулювання зображеннями з Photoshop (які, ймовірно, написані в основному в складі MMX / SSE) і SQLite3 (який написано в попередньому історичному ANSI C для портативності), склеєні разом з Lua. Adobe також розробила власну Lua IDE, повністю в Луа. Хтось знає, який графічний інструментарій вони використовують? AFAIR Photoshop передує майже всі сучасні набори інструментів, тож це, мабуть, щось домашнє?
Jörg W Mittag

4
без образи, але якщо ви думаєте, що ANSI C є доісторичним, ви читали неправильні зразки коду
Хав'єр

6

C ++ вводиться статично. Це дозволяє заздалегідь оптимізувати виконання коду за допомогою компілятора, який відповідає вашим абстракціям для наявного системного процесу на даній платформі. До цих пір динамічним мовам потрібен додатковий програмний рівень (= інтерпретатор), який уповільнює доступ до системних ресурсів.


4

Більшість наведених причин є технічними або "над столом" ... ось бізнес-причини або "під столом":

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

дурні користувачі: принаймні у свідомості управління. вони все ще сприймають своїх користувачів, що ледве можуть двічі клацнути по "setup.exe". Якщо ви включите встановлення інтерпретатора як частину налаштування, вони будуть хитати головою з боку в бік.

старі розробники: більшість людей із досвідом існують давно, і вони не оновлювали себе. вони програмують на C ++, а не на новіших мовах, оскільки не знають нових мов.


Я б стверджував, що ви перешкоджаєте вихідному коду, коли ви випускаєте додаток .NET Подивіться на Visual Studio значна частина інтерфейсу розроблена з формами WPF. Деякі ваші моменти, безумовно, справедливі, значна частина сьогоднішнього менеджменту була розробниками вчорашнього дня, погана новина більшості сьогоднішніх рамок навряд чи буде дійсною через зміни на комп’ютерах сьогодні.
Рамхаунд

Багато людей з великим досвідом набули свого досвіду, постійно оновлюючись. Вони, як правило, не вивчають нові гарячі мови (як, наприклад, Паскаль на початку 1980-х) лише тому, що вони гарячі, але тільки в тому випадку, якщо їм це вдається, або вони мають цікаві ідеї (наприклад, Haskell).
Девід Торнлі

4

Я б розширив сферу проблеми від GUI до програмного забезпечення, яке, як очікується, буде конкурентоспроможним. C ++ не накладає податку на цільову платформу, оскільки це стосується потужності процесора, встановленого часу виконання, фреймворків тощо. Отже, він буде працювати на більш обмеженому апаратному забезпеченні, ніж аналогічне рішення, написане керованою / інтерпретованою мовою. У випадку успішного комерційного програмного забезпечення вартість розробки (потенційно вища у випадку C ++) амортизується за кількістю продажів.

Крім того, C ++ зазвичай пропонує прямий доступ до системних apis (наприклад, GUI), що дає найкращу можливість оптимізувати використання та відрізнятись від подібних рішень.


3

Я думаю, що багато з цим пов'язане з API для наборів інструментів GUI. Усі вони мають C / C ++ API, але не всі вони мають (скажімо) прив'язки Python. І іноді самі набори інструментів писалися на увазі C ++, тому навіть якщо вони мають підтримку інших мов, вони не підтримують їх повністю (наприклад, вони не підтримують Python tupleяк аргумент).


О, вони не повністю їх підтримують, тому що вони не хочуть або не мають часу на їх реалізацію. Не тому, що це неможливо.
cubuspl42

2

Ви згадуєте браузери та ігри як приклади. Обидва ці програми є критично важливими для продуктивності, тому мати швидкість на мові низького рівня для швидкості має сенс.

Багато інших програм мають меншу продуктивність, і їх можна легко писати іншими мовами. C # зокрема, здається, використовується багато. (І Obj-C, але, напевно, це не кваліфікується як високий рівень. Я краще, ніж C ++.)

Однак існує певна відсутність рамок для останніх мов програмування. Наприклад, насправді не існує життєздатної рідної бібліотеки GUI для Python. Звичайно, ви можете використовувати PyQt або PyGtk, і вони добре працюють, але, врешті-решт, це знову лише взаємодія з кодом C. Знову ж таки, C # (і, можливо, Obj-C) здається винятком, і, можливо, MacRuby або IronPython могли змінити цю гру.


0

Щоб мова замінила C ++ або Java, вона повинна робити те, що в цих мовах дуже не вистачає, крім того, щоб виконувати їх на власні сили. Також величезні інвестиції пішли на ці мови. Це означає, що на багатьох платформах є стандартна бібліотека C ++, якою браузери, ігри та подібні програми можуть легко користуватися. Значить, має бути якась інерція. Мови, як правило, вилітають повільно на відміну від інших програм.

Якщо ви подивитесь на це, Anaconda (програма встановлення RedHat) існує вже близько 10 років, написана в Python з самого початку. Пітон не був таким популярним, коли Анаконда була новою.

Google Go (golang.org) розвивається дуже швидко. Компілятор ще не завантажиться. Щоб його популярність знімалася, її бібліотека повинна стабілізуватися, компілятор повинен бути завантажений, і, тим більше людей, доведеться ним користуватися. Я чув, що одна виробнича програма поза Google написана на Go, і, як повідомляється, ще не було часу в її житті трохи більше року.


1
Насправді існує комерційний компілятор Go для Windows, який написаний на Go, тому є завантажений компілятор для Go. (Однак це все ще в закритій бета-версії.)
Йорг W Міттаг

О, я тоді був не в контакті. Дякую за те, що ви розповіли :)
vpit3833

2
Він називається erGo і виробляється компанією під назвою Newquist Solutions .
Йорг W Міттаг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.