Я розглядаю питання навчання С
Немає конкретних причин не вивчати C, але я б запропонував C ++. Він пропонує велику частину того, що робить C (оскільки C ++ - це супер набір C), з великою кількістю «марок». Навчання C до C ++ зайве - вони фактично є окремими мовами.
Інакше кажучи, якби C був набором деревообробних інструментів, швидше за все, це:
- молоток
- нігті
- Ручні пилки
- ручна дриль
- блок шліфувальної машини
- зубило (можливо)
За допомогою цих інструментів ви можете створити що завгодно - але все, що є хорошим, потенційно потребує багато часу та навичок.
C ++ - це колекція електроінструментів у вашому місцевому магазині обладнання.
Якщо ви дотримуєтесь основних мовних функцій для початку, C ++ має порівняно невелику додаткову криву навчання.
Але чому люди використовують C (або C ++), якщо його можна використовувати "небезпечно"?
Тому що деякі люди не хочуть меблів від IKEA. =)
Хоча це серйозно, хоча в багатьох мовах, які є "вищими", ніж C або C ++, можуть бути речі, які роблять їх (потенційно) "простішими" у використанні в певних аспектах, це не завжди є корисним. Якщо вам не подобається, як щось робиться, або функція не надається, швидше за все, ви можете цього зробити. З іншого боку, C та C ++ забезпечують достатню кількість "низьких рівнів" мовних функцій (включаючи вказівники), що ви можете отримати доступ до багатьох речей досить безпосередньо (наприклад, апаратне забезпечення або ОС), або створити їх самостійно, що може бути неможливим для інших мови, як реалізовано.
Більш конкретно, C має такий набір функцій, які роблять його бажаним для багатьох програмістів:
- Швидкість - Через відносну простоту та оптимізацію компілятора протягом багатьох років, це спочатку дуже швидко. Крім того, багато людей з'ясували багато ярликів до конкретних цілей під час використання мови, що робить її потенційно ще швидшою.
- Розмір - З аналогічних причин, що вказані для швидкості, програми C можна зробити дуже маленькими (як з точки зору виконуваного розміру, так і з використанням пам'яті), що бажано для середовищ з обмеженою пам'яттю (тобто вбудованої або мобільної).
Сумісність - C існує вже давно, і кожен має інструменти та бібліотеки для цього. Мова сама по собі теж не вибаглива - вона очікує, що процесор виконує вказівки та пам'ять для зберігання матеріалів, і це стосується цього.
Крім того, існує щось відоме як прикладний бінарний інтерфейс (ABI) . Коротше кажучи, це спосіб спілкування програм на рівні машинного коду, який може мати переваги перед інтерфейсом програмування програм (API) . Хоча інші мови, такі як C ++, можуть мати ABI, як правило, вони менш рівномірні (погоджені), ніж C, тому C створює добру мову основи, коли ви хочете з якоїсь причини використовувати ABI для спілкування з іншою програмою.
Чому програмісти не просто використовують Java чи Python чи іншу мову, що склалася, наприклад Visual Basic?
Ефективність (а іноді і схеми управління пам'яттю, які неможливо реалізувати без відносно прямого доступу до пам'яті).
Безпосередній доступ до пам’яті за допомогою покажчиків вводить багато акуратних (як правило, швидких) хитрощів, коли ви можете прямо вкладати свої грязні лапи на маленьких та нулі у вашій пам’яті, і не потрібно чекати, що цей вчитель роздає іграшки просто під час відтворення, а потім знову зачерпніть їх.
Коротше кажучи, додавання матеріалів потенційно створює відставання або іншим чином створює небажану складність.
Що стосується скриптованих мов і подібних помилок, вам доведеться наполегливо працювати, щоб мови, що вимагають, щоб вторинні програми запускалися так само ефективно, як і C (або будь-яка складена мова). Додавання ввімкненого інтерпретатора по суті дає можливість зменшити швидкість виконання та збільшити використання пам'яті, оскільки ви додаєте іншу програму до суміші. Ефективність ваших програм залежить як від ефективності цієї вторинної програми, так і від того, наскільки добре (погано =) ви написали свій початковий програмний код. Не кажучи вже про те, що ваша програма часто повністю покладається на другу програму навіть для виконання. Та друга програма чомусь не існує в певній системі? Код не йде.
Насправді введення будь-якого "зайвого" потенційно уповільнює або ускладнює ваш код. Мовами "без страшних покажчиків" ви завжди чекаєте, коли інші біти коду очистяться за вами, або іншим чином винайдете "безпечні" способи вчинити, тому що ваша програма все ще робить ті самі операції з доступу до пам'яті, що і для інших покажчики. Ви просто не той, хто цим обробляє (так що ви не можете f * ck it up, genius = P).
Під небезпечним я маю на увазі покажчики та інші подібні речі. [...] Як запитання про переповнення стека Чому функція get настільки небезпечна, що її не слід використовувати?
Відповідно до прийнятої відповіді:
"Він залишався офіційною частиною мови аж до стандарту ISO C 1999 року, але офіційно був видалений стандартом 2011 року. Більшість програм C все ще підтримують його, але принаймні gcc видає попередження для будь-якого коду, який використовує його."
Думка, що оскільки щось можна зробити мовою, це треба зробити, є дурним. Мови мають вади, які виправляються. З міркувань сумісності зі старішим кодом цю конструкцію все ще можна використовувати. Але нічого (ймовірно) не змушує програміста використовувати get (), і фактично ця команда була по суті замінена більш безпечними альтернативами.
Більш того, проблема з get () не є проблемою вказівника сама по собі. Це проблема з командою, яка не обов'язково знає, як безпечно використовувати пам'ять. В абстрактному сенсі це все питання вказівника - читання та написання матеріалів, яких ви не повинні. Це не проблема з покажчиками; це проблема з реалізацією вказівника.
Для уточнення покажчики не є небезпечними, поки ви випадково не отримаєте доступ до місця пам'яті, до якого ви не збиралися. І навіть тоді це не гарантує, що ваш комп'ютер розтане або вибухне. У більшості випадків ваша програма просто перестане функціонувати (правильно).
Однак, оскільки вказівники забезпечують доступ до місць пам'яті і тому, що дані та виконуваний код існують у пам'яті разом, існує достатня реальна небезпека випадкового пошкодження, яке потрібно правильно керувати пам'яттю.
До цього моменту, оскільки дійсно прямі операції з доступу до пам’яті часто приносять меншу користь, ніж вони могли мати багато років тому, навіть не зібрані сміття зібрані мови, такі як C ++, запровадили такі речі, як розумні покажчики, щоб допомогти усунути розрив між ефективністю пам'яті та безпекою.
Підсумовуючи це, є дуже мало причин боятися вказівника, якщо він безпечно використовується. Просто знайдіть підказку з версії Стіва "Мисливець на крокодилів" Ірвіна - Саунд-Парк, - не обмінюйтесь, стирчавши великий палець у купінах крокусів .