Този въпрос възниква постоянно в разговорите с курсисти преди началото на някое от нашите обучения по програмиране. Многократно чуваме: C е отживелица (Произнася се Си). Надяваме се тази статия да даде отговори на въпроси като:
- Защо C е добър избор за първи език за програмиране?
- Има ли смисъл да се задълбочим в C?
- Какво е бъдещето на програмният език C?
- И все пак: Защо C? …
Една добра причина да изберем обучение на C е, че ще направи основите ни много силни. Езикът C е баща на повечето програмни езици, за които сме чували (или не) днес. Той е разработен за операционната система UNIX (която пък е основата на Linux), т.е. езикът C е близо до нивото на операционните системи (наричаме го също и системен език), което го прави високо производителен. Високопроизводителни езици са онези, при които управлението на ресурсите на системно ниво е ефективно.
Любопитно: C е бил План Б
Действието се развива през 1972 г. UNIX e разработена на асемблер и инсталирана на PDP-7 от Денис Ричи и Кен Томпсън. Те обаче искат да прехвърлят операционната система на PDP-11 и да разширят възможностите ѝ. Оригиналната версия на UNIX за PDP-11 също е на асемблер. Кен Томпсън се нуждае от програмен език, за да направи допълнителни обслужващи програми в UNIX. За целта първо се опитва да направи компилатор на Фортран, но много скоро се отказва и създава нов компилаторен език B (Би), или опростено BCPL. Въпреки това не написва много услуги на B, защото B е много бавен, а и не използва напълно възможностите на PDP-11 като байтово адресиране, например. Така Ричи се заема със задачата да усъвършенства езика B, като резултатът е нов език C. C компилаторът и някои помощни програми на C са включени във версия 2 на UNIX. През ноември 1973 г. ядрото на UNIX е изцяло пренаписано на C и с това излиза версия 4 на UNIX.
Така и сами стигаме до извода, че C е най-използваният програмен език при писане на и за операционни системи. Както споменах по-горе, първата операционна система написана на C е UNIX. Но и по-късни операционни системи като GNU/Linux също са написани на C. Не само че C е езикът на операционните системи, но той е и предшественик и вдъхновение за почти всички най-популярни езици от високо ниво днес. Така например C++, Java, Perl, PHP, Python и Ruby са написани на C.
Можем да направим една малка аналогия с изучаването на чужди езици – например ако трябва да научим езиците от т.нар. Романска група: испански, португалски, италиански, френски и румънски езици. Тогава познаването на латински език вероятно ще ни е полезно и ще ускори изучаването на всички останали езици.
Точно както латинският е в основата на тези езици, така C е в основата на споменатите по-горе програмни езици, и неговото познаване ще ни даде възможност да разберем и оценим цялото семейство програмни езици, изградени върху C, при това ускорявайки многократно тяхното изучаване. Познаването на C ни носи свобода. Ето тук можете да се убедите колко дълъг е списъкът на всички езици от семейството на C.
Щом C е близо до хардуера, защо C, а не асемблерен език?
Докато с асемблер можете да постигнете висока скорост на изпълнение и максимален контрол, то езикът C ще ви осигури преносимост, т.е. кодът написан на C ще бъде машинно-независим. Различните процесори изискват програмиране на специфични за тях асемблери, което налага доброто познаване на съответния асемблерен език. А едно от основните предимства на C е, че съчетава универсалност и преносимост върху различни компютърни архитектури, като същевременно запазва и голяма част от контрола върху хардуера – нещо, което иначе се осигурява само от асемблерния език.
Ето малко примери: Програми на C могат да бъдат компилирани и изпълнявани на HP 50g калкулатор (ARM процесор), на TI-89 калкулатор (68000 процесор), на Palm OS Cobalt смартфони (ARM процесор), на оригиналния iMac (PowerPC), на Arduino (Atmel AVR) и на Intel iMac (Intel Core 2 Duo). Всяко от тези устройства има свой собствен асемблерен език, който е напълно несъвместим с асемблерния език на останалите процесори.
Програмирането на асемблер, макар и да е изключително мощно, е твърде трудоемко за големи приложения, езикът е трудно четим, трудно се разбира логиката.
C е компилаторен език и като такъв създава бързи и ефективни изпълними файлове. Също така той не е сложен език – “what you see is all you get”: един израз на C съответства на не много изрази на асемблер, всичко останало се осигурява от библиотечни функции.
Чудно ли е тогава, че C е толкова популярен език?
Подобно на ефекта на доминото, всяко следващо поколение програми следва тенденцията на своите предци. Операционните системи, проектирани на C, имат системни библиотеки, създадени на C. Тези системни библиотеки от своя страна се използват за създаване на библиотеки от по-високо ниво (като OpenGL или GTK), а дизайнерите на тези библиотеки често решават да използват езика, който системните библиотеки вече са използвали. Разработчиците на приложения използват библиотеките от по-високо ниво за проектиране на текстообработващи процесори, игри, медийни плейъри и други подобни. Много от тях ще изберат да програмират на езика, който библиотеката от по-високо ниво използва. И така моделът продължава и продължава…
Защо C, а не друг език?
Основната цел на C е да се създаде преносим код, като същевременно да се запази производителността и да се минимизира „отпечатъка“ (времето на процесора, използването на паметта, дисковите входно-изходни операции и т.н.). Това е полезно за операционните системи, за вградените (embedded) системи, както и за други програми, където производителността е много важна (интерфейсът от „високо ниво“ влияе на производителността).
Със C е сравнително лесно да запазите ментална картина на това, което се случва, защото повечето от нещата са написани изрично в кода. C има голяма кодова база за приложения на ниско ниво.
Това е “майчиния” език на UNIX, което го прави гъвкав и преносим. Това е стабилен и зрял език, който е малко вероятно да изчезне и който е пренесен за повечето, ако не и за всички платформи.
Още една мощна причина да използваме C е възможностите му за управление на паметта.
За разлика от повечето езици за програмиране, C позволява на програмиста да пише директно в паметта.
Ключовите конструкции в C, като структури, указатели и масиви са проектирани така, че да структурират и манипулират паметта по ефективен, машинно-независим начин. По-специално, C дава контрол върху разположението в паметта на структурите от данни. Освен това разпределението на динамичната памет е под контрола на програмиста (което означава също и че освобождаването на паметта трябва да се извърши от програмиста).
Езици като Java и Perl спестяват на програмиста необходимостта да управлява повечето от детайлите по управлението на паметта и указателите (с изключение на недостига на памет и някои други форми на прекомерно използване на паметта). Това може да бъде много полезно, тъй като справянето с управлението на паметта при изграждането на програми от високо ниво, е рисков процес, силно подложен на грешки.
Но ако се занимавате с код от ниско ниво, като част от операционна система например, с който да управлявате дадено устройство, езикът C осигурява еднакъв и чист интерфейс в кода. Тези възможности просто не съществуват в повечето други езици.
Докато Perl, PHP, Python и Ruby могат да бъдат много мощни и да поддържат много възможности, които липсват по подразбиране в C, то тези възможности обикновено не са написани на техния собствен език. По-скоро повечето от тях първоначално разчитат на написването им на C (или на друг високопроизводителен език за програмиране) и биха изисквали тяхното имплементиране да бъде пренесено на нова платформа, преди да могат да бъдат използвани.
И все пак можем да заключим, че както при другите езици за програмиране, така и тук: дали да се избере C или друг програмен език от ниско ниво, дали да се избере друг език от високо ниво, но да се загуби част от контрола, дали да не се програмира всичко изцяло на C, за всички тези избори ще повлияят както личното мнение така и редица много важни технически и бизнес изисквания.
Знанията обаче, които ще имате за C и за програмирането като цяло, ще бъдат неизменната ви и здрава основа, върху която уверено ще можете да надграждате нови умения в тази така бързо променяща се и все по-разнообразна област от езици за програмиране.
Някои мнения от форумите за програмисти, а и на наши курсисти:
Мисля, че основната причина да ме наемат, ще е ако мога да реша даден проблем, който е реалистичен и който няма да мога да намеря в Google. А езикът C има широк обхват. Искам да кажа, че C е близо до хардуера, бързо се е развил и е първият език, който е възприет от общността на програмистите.
За етапа ми на обучение обмислям възможността да науча първо C и после друг език, както, разбира се, и другите неща като: алгоритъм, структури от данни и операционни системи.
Без значение дали е необходимо в интервю или не, C е бащата и дори дядото на всички известни езици. Можете да създадете красив уеб интерфейс или да създадете страхотно приложение. Но когато става въпрос за максимална производителност и да сте близо до хардуера, няма друг език – тогава само C ще помогне. Добре известен факт е, че Android е базиран на Linux. Приложенията на Android са свързани с Java. Но базата, Linux, е кодирана главно на C. Дори Windows е кодиран със C и C++. Дори и да не намерите горните аргументи за достатъчни, трябва да знаете как да използвате ефективно C, тъй като това ще ви даде умения за програмиране. Можете лесно да използвате C++ STL, Python или нещо друго за структури от данни и работа с низове, но никой няма да ви направи достатъчно талантлив програмист, за да ги имплементирате сами. Това може да ви се струва скучно, но е само във ваша полза.
Мнозина казват, че не е необходимо да се учи C, но от моя гледна точка е много полезно като първа стъпка в кариерата на програмирането. Чрез езика C вие ще се научите да програмирате. Когато питах другите с какво да започна, някои отговоряха, че започват със C ++. Но C ++ е различен. Това е обектно ориентиран език за програмиране, за разлика от езика C. Мисля, че изучаването на C е полезно.
Не, не е необходимо да се учи програмиране на C. Но за начинаещи програмисти препоръчвам да се започне със C.
Да, C не е обектно ориентиран език. Но не бързайте да го подминавате! C е основата на много обектно ориентирани езици, а разбирането на C може да ви помогне много, когато става въпрос за изучаване на езици от по-високо ниво. Освен това, C е чудесен за изучаване на алгоритми. Ученето на алгоритми може да бъде трудно в началото, но ако се фокусирате върху това, вие ще изградите много силна основа за езици като Java или Python. Понастоящем съм студент в Holberton School и трябваше да пишем на много ниско ниво на C и да учим алгоритми още от самото начало на нашето обучение (и все още е така). Идеята е, че ако можете да тренирате мозъка си да мисли алгоритмично, останалото ще дойде по-лесно. Програмирането е свързано със съществуването на някакъв голям проблем (проект) и разбирането му как да го разделим на куп по-малки и по-управляеми неща. И точно на това ви учат алгоритмите. Разбира се – може да не използвате непременно алгоритми в ежедневния си живот, но това фундаментално обучение ще ви помогне да постигнете успех.
На вашия въпрос мога да отговоря с друг въпрос: Непременно ли трябва да знаеш английски, за да общуваш? Не, ти можеш да говориш на кой да е друг език. Цялата работа е в логиката, която обсъждате. C е основен език, който всички (интервюиращи) ще знаят, макар че често няма да бъде използван при разработване на продукт. Общуването обаче на език, който е разбираем и за двете страни, е добро нещо.
„C“ е основата на програмирането. По-добре е с него да се започне, защото е лесен и прост за разбиране от начинаещи. Истината е, че интервюта, от стартиращи компании до гиганти като Google и Microsoft, могат да бъдат „кракнати“, ако си експерт програмист на C. Не е нужно да учиш много езици за програмиране. Просто трябва да научиш един език както трябва, защото логиката е важна, езикът е само инструмент за реализация.
Автор: Милена Бакалова