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

Компанія Microsoft для розробки рідної мови до своєї платформи.Net обрала саме Сі-подібний синтаксис. Понад те, на Сі написано безліч операційних систем.

Звичайно, Сі не ідеальний: творці мови – Кен Томпсон та Денніс Рітчі – довгий час доопрацьовували її. Стандартизація Сі триває досі. Він існує понад 45 років та активно використовується.

З ним часто асоціюють не одну, а дві мови програмування - C/C++. Однак нижче йтиметься саме про «чисте» Сі.

Мова Сі сходить корінням до мови ALGOL (розшифровується як ALGorithmic Language), яка була створена в 1958 році спільно з комітетом Європейських та Американських вчених у сфері комп'ютерних наук на зустрічі у Швейцарській вищій технічній школі Цюріха. Мова була відповіддю на деякі недоліки мови FORTRAN та спробою їх виправити. Крім того, розробка Сі тісно пов'язана зі створенням операційної системи UNIX, над якою також працювали Кен Томпсон та Денніс Рітчі.

UNIX

Проект МАС (Multiple Access Computer, Machine-Aided Cognition, Man and Computer) розпочався як дослідницький в MIT в 1963 році.

У рамках проекту МАС було розроблено операційну систему CTSS (Compatible Time-Sharing System). У другій половині 60-х було створено кілька інших систем з поділом часу, наприклад, BBN, DTSS, JOSS, SDC та Multiplexed Information and Computing Service (MULTICS) у тому числі.

Multics – спільна розробка MIT, Bell Telephone Laboratories (BTL) та General Electric (GE) щодо створення ОС з розподілом часу для комп'ютера GE-645. Останній комп'ютер під керуванням Multics вимкнули 31 жовтня 2000 року.

Проте BTL відійшов від цього проекту ще на початку 1969 року.

Деякі його співробітники (Кен Томпсон, Денніс Рітчі, Стью Фельдман, Дуг МакІлрой, Боб Морріс, Джо Оссанна) захотіли продовжити роботу самостійно. Томпсон працював над грою Space Travel на GE-635. Її написали спочатку для Multics, а потім переписали на Fortran під GECOS на GE-635. Гра моделювала тіла Сонячної системи, а гравцю треба було посадити корабель кудись на планету чи супутник.

Ні софт, ні залізо цього комп'ютера не підходили для гри. Томпсон шукав альтернативу, і переписав гру під безхазяйний PDP-7. Пам'ять була об'ємом 8К 18-бітових слів, і ще був процесор векторного дисплея для виведення красивої графіки.


Зображення із сайту slideshare.net

Томпсон та Рітчі повністю вели розробку на крос-ассемблері на GE та переносили код на перфострічках. Томпсон це активно не подобалося, і він почав писати ОС для PDP-7, починаючи з файлової системи. Так виникла UNIX.

Томпсон хотів створити комфортне обчислювальне оточення, сконструйоване відповідно до його дизайну, використовуючи будь-які доступні засоби. Його задуми, що очевидно оглядаючись назад, вбирали багато інновацій Multics, включаючи поняття процесу як основи управління, деревоподібну файлову систему, інтерпретатор команд як користувальницької програми, спрощене представлення текстових файлів і узагальнений доступ до пристроїв.

PDP-7 UNIX також започаткував високорівневу мову B, яка створювалася під впливом мови BCPL. Денніс Рітчі сказав, що В - це Сі без типів. BCPL містився у 8 Кб пам'яті та був ретельно перероблений Томпсоном. У поступово виріс у З.


Зображення із сайту it-world.com

До 1973 року мова Сі стала досить сильний, і більшість ядра UNIX, спочатку написана на асемблері PDP-11/20, було переписано на Сі. Це було одне з найперших ядер операційних систем, написане мовою, відмінною від асемблера.

Виходить, що Сі - це супутній продукт, отриманий під час створення операційної системи UNIX.

Батьки Сі

Натхненні мовою ALGOL-60, Математична лабораторія Кембриджського Університету спільно з Комп'ютерним відділом Лондонського університету створили у 1963 році мову CPL (Combined Programming Language).

Мова CPL визнали складною, і у відповідь на це Мартіном Річардсоном була створена в 1966 році мова BCPL, основне призначення якої полягало в написанні компіляторів. Зараз він практично не використовується, але свого часу через хорошу портованість він грав важливу роль.

BCPL використовувався на початку 1970-х в декількох цікавих проектах, серед яких - операційна система OS6 і частково в розробках Xerox PARC.

BCPL послужив предком для мови Бі (B), розробленого в 1969 вже знайомою всім AT&T Bell Telephone Laboratories, не менш знайомими Кеном Томпсоном і Деннісом Рітчі.

Як і інші операційні системи на той час, UNIX було написано на асемблері. Налагодження програм на асемблері справжнє борошно. Томпсон вирішив, що для подальшої розробки ОС необхідна мова високого рівня і вигадав невелику мову B. За основу Томпсон взяв мову BCPL. Мова B можна як C без типів.

Багато деталях BCPL, B і C різняться синтаксично, але переважно вони схожі. Програми складаються із послідовності глобальних декларацій та оголошень функцій (процедур). У BCPL процедури можуть бути вкладеними, але не можуть посилатися на нестатичні об'єкти визначені в процедурах, що їх містять. B і C уникають такого обмеження, вводячи суворіше: вкладених процедур немає взагалі. Кожна з мов (за винятком найдавніших версій B) підтримує роздільну компіляцію та надає засоби для включення тексту з іменованих файлів.

На противагу повсюдній зміні синтаксису, що відбувалася під час створення B, основна семантика BCPL – його структура типів та правила обчислення виразів – залишилася недоторканою. Обидві мови – безтипові, вірніше мають єдиний тип даних – «слово» або «комірка», набір бітів фіксованої довжини. Пам'ять у цих мовах - масив таких осередків, а зміст вмісту осередку залежить від операції, що до неї застосовується. Наприклад, оператор "+" просто складає свої операнди за допомогою машинної інструкції add, та інші арифметичні операції також байдужі до змісту своїх операндів.

Ні BCPL, ні B, ні C не виділяють у мові символьні дані; вони вважають рядки векторами цілих чисел та доповнюють загальні правила кількома угодами. І в BCPL, і B рядковий літерал означає адресу статичної області ініціалізований символами рядка упакованими в комірки.

Як створювався Сі

У 1970 році Bell Labs придбала для проекту комп'ютер PDP-11. Оскільки B був готовий працювати на PDP-11, Томпсон переписав частину UNIX на B.

Але модель B і BCPL передбачала витрати під час роботи з покажчиками: правила мови, визначаючи покажчик як індекс у масиві слів, робили покажчики індексами слів. Кожне звернення до покажчика під час виконання генерувало масштабування покажчика на адресу байта, на який очікував процесор.

Тому ставало ясно, що для того, щоб впоратися з символами і байтовою адресацією, а також підготуватися до апаратної підтримки обчислень з плаваючою точкою, потрібна типізація.

У 1971 році Рітчі почав створювати розширену версію B. Спочатку він назвав її NB (New B), але коли мова стала сильно відрізнятися від B, назву змінили на C. Ось що, писав про це сам Рітчі:

Я хотів, щоб структура не лише характеризувала абстрактний об'єкт, а й описувала набір біт, який міг прочитати з каталогу. Де компілятор зміг би сховати покажчик, наname, якого вимагає семантика? Навіть якби структури були б задумані більш абстрактними, і місце для покажчиків могло б бути заховано десь, як би я вирішив технічну проблему коректної ініціалізації цих покажчиків при виділенні пам'яті для складного об'єкта, можливо структури, що містить масиви, які містять структури, і так до довільної глибини?

Рішення полягало в рішучому стрибку в еволюційному ланцюжку між безтиповим BCPL і типізованим C. Він виключав матеріалізацію покажчика в сховищі, а натомість породжував його створення, коли ім'я масиву згадувалося у виразі. Правило, яке збереглося і в сьогоднішньому C, полягає в тому, що значення масиви, коли вони згадуються у виразі, конвертуються в покажчики на перший з об'єктів, що становлять цей масив.

Друге нововведення, яке найбільш ясно відрізняє C від його попередників, - ось ця повніша структура типів і особливо її виразність у синтаксисі декларацій. NB пропонував основні типи int і char разом із масивами їх і покажчиками ними, але інших способів скомпонувати їх.

Потрібно узагальнення: для об'єкта будь-якого типу має бути можливим описати новий об'єкт, який об'єднує декілька таких об'єктів у масив, отримує його з функції або є вказівником на нього.



Зображення з книги "Мова Сі": M. Уейт, С. Прата, Д. Мартін

Для будь-якого об'єкта такого складового типу вже був спосіб вказати на об'єкт, який є його частиною: індексувати масив, викликати функцію, використовувати з покажчиком оператор непрямого звернення. Аналогічне міркування призводило до синтаксису оголошення імен, який відбиває синтаксис висловлювання, де ці імена використовуються. Так

оголошує ціле, покажчик на ціле та покажчик на покажчик на ціле. Синтаксис цих оголошень відбиває той факт, що i, *pi, і **ppi все в результаті дають тип int, коли використовуються у виразі. Подібним чином
оголошують функцію, що повертає ціле, функцію, що повертає покажчик на ціле, покажчик на функцію, що повертає ціле;
оголошують масив покажчиків на ціле, покажчик на масив цілих.

У всіх цих випадках оголошення змінної нагадує її використання у виразі, чий тип – це те, що знаходиться на початку оголошення.

70-ті роки: «смутний час» та лже-діалекти

Мова до 1973 стала досить стабільною для того, щоб на ній можна було переписати UNIX. Перехід на C забезпечив важливу перевагу: переносимість. Написавши компілятор C для кожної машини в Bell Labs, команда розробників могла портувати на них UNIX.

З приводу виникнення мови Сі Пітер Мойлан у своїй книзі «The case against C» пише: «Потрібна була мова, здатна обійти деякі жорсткі правила, вбудовані в більшість мов високого рівня та забезпечують їх надійність. Потрібна була така мова, яка дозволила б робити те, що до неї можна було реалізувати тільки на асемблері або на рівні машинного коду».

C продовжив розвиватися у 70-х. У 1973-1980-х роках мова трохи підросла: структура типів отримала беззнакові, довгі типи, об'єднання та перерахування, структури стали близькими до об'єктів-класів (бракувало лише нотації для літералів).

Перша книга з Cі. Книга «Мова програмування Сі», написана Браяном Керніганом та Деннісом Рітчі та опублікована у 1978 році, стала біблією програмістів на Сі. За відсутності офіційного стандарту ця книга - відома також як K&R, або "Біла Книга", як люблять називати шанувальники сі - фактично стала стандартом.


Зображення із сайту learnc.info

У 70-х програмістів на Cі було небагато і більшість із них були користувачами UNIX. Тим не менш, у 80-х Cі вийшов за вузькі рамки світу UNIX. Компілятори Ci стали доступні на різних машинах, що працюють під управлінням різних операційних систем. Зокрема, Сі став поширюватися на платформі IBM PC, що швидко розвивається.

K&R запровадив такі особливості мови:

структури (тип даних struct);
довге ціле (тип даних long int);
ціле без знака (тип даних unsigned int);
оператор += і подібні до нього (старі оператори =+ вводили аналізатор лексики компілятора Сі в оману, наприклад, при порівнянні виразів i = + 10 і i = +10).

K&R C часто вважають найголовнішою частиною мови, яку має підтримувати компілятор Сі. Багато років навіть після виходу ANSI Cі він вважався мінімальним рівнем, якого слід дотримуватись програмістам, які бажають домогтися від своїх програм максимальної переносимості, тому що не всі компілятори тоді підтримували ANSI C, а хороший код на K&R C був вірний і для ANSI C.

Разом із зростанням популярності виникли проблеми. Програмісти, що писали нові компілятори, брали за основу мову, описану в K&R. На жаль, у K&R деякі особливості мови були описані розпливчасто, тому компілятори часто трактували їх на власний розсуд. Крім того, в книзі не було чіткого поділу тим, що є особливістю мови, а що особливістю операційної системи UNIX.

Після публікації K&R C до мови було додано кілька можливостей, підтримуваних компіляторами AT&T, та деяких інших виробників:

Функції, що не повертають значення (з типом void), та покажчики, що не мають типу (з типом void *);
функції, що повертають об'єднання та структури;
імена полів даних структур у різних просторах імен кожної структури;
присвоєння структур;
специфікатор констант (const);
стандартна бібліотека, що реалізує більшу частину функцій, запроваджених різними виробниками;
тип, що перераховується (enum);
дрібне число одинарної точності (float).

Погіршувало ситуацію і те, що після публікації K&R Сі продовжував розвиватися: до нього додавалися нові можливості і з нього вирізалися старі. Незабаром з'явилася очевидна потреба у вичерпному, точному та відповідному сучасним вимогам описі мови. Без такого стандарту почали з'являтися діалекти мови, які заважали переносимості – найсильнішій стороні мови.

Стандарти

Наприкінці 1970-х років, мова Сі почав витісняти BASIC, який на той час був провідним у галузі програмування мікрокомп'ютерів. У 1980-х роках його адаптували під архітектуру IBM-PC, що призвело до значного стрибка його популярності.

Розробкою стандарту мови Сі зайнявся Американський національний інститут стандартів (ANSI). При ньому 1983 року було сформовано комітет X3J11, який зайнявся розробкою стандарту. Перша версія стандарту була випущена у 1989 році та отримала назву С89. У 1990 році, внісши невеликі зміни до стандарту, його прийняла Міжнародна Організація Стандартизації ISO. Тоді він став відомий під кодом ISO/IEC 9899:1990, але серед програмістів закріпилася назва, пов'язані з роком прийняття стандарту: С90. Останньою на даний момент версією стандарту є стандарт ISO/IEC 9899:1999, також відомий як С99, прийнятий у 2000 році.

Серед нововведень стандарту С99 варто звернути увагу на зміну правила щодо місця оголошення змінних. Тепер нові змінні можна було оголошувати посеред коду, а чи не лише на початку складового блоку чи глобальної області видимості.

Деякі особливості C99:

Функції (inline);
оголошення локальних змінних у будь-якому операторі програмного тексту (як у C++);
нові типи даних, такі, як long long int (для полегшення переходу від 32 - до 64-бітових чисел), явний булевий тип даних _Bool і тип complex для представлення комплексних чисел;
масиви змінної довжини;
підтримка обмежених покажчиків (restrict);
іменована ініціалізація структур: struct ( int x, y, z; ) point = ( .y=10, .z=20, .x=30 );
підтримка однорядкових коментарів, що починаються на //, запозичених з C++ (багато компіляторів Сі підтримували їх і раніше як доповнення);
декілька нових бібліотечних функцій, таких як snprintf;
декілька нових заголовних файлів, таких як stdint.h.

Стандарт С99 зараз більшою чи меншою мірою підтримується всіма сучасними компіляторами мови Сі. В ідеалі код написаний на Сі з дотриманням стандартів і без використання апаратно- і системно-залежних викликів ставав як апаратно-так і платформно-незалежним кодом.

У 2007 році розпочалися роботи над наступним стандартом мови Сі. 8 грудня 2011 року опубліковано новий стандарт для мови Сі (ISO/IEC 9899:2011). Деякі можливості нового стандарту підтримуються компіляторами GCC і Clang.

Основні особливості С11:

Підтримка багатопоточності;
покращена підтримка Юнікоду;
узагальнені макроси (type-generic expressions, дозволяють статичне перевантаження);
анонімні структури та об'єднання (спрощують звернення до вкладених конструкцій);
керування вирівнюванням об'єктів;
статичні твердження (static assertions);
видалення небезпечної функції gets (на користь безпечної gets_s);
функція quick_exit;
специфікатор функції _Noreturn;
новий режим ексклюзивного відкриття файлу

Незважаючи на наявність стандарту 11 року, багато компіляторів досі не підтримують повністю навіть версії C99.

За що критикують Сі

У нього досить високий поріг входження, що ускладнює його використання у навчанні як першу мову програмування. Програмуючи на Сі, потрібно враховувати безліч деталей. «Народжений серед хакерів, він стимулює відповідний стиль програмування, часто небезпечний, і заохочує написання заплутаного коду», пише Вікіпедія.

Глибоку та аргументовану критику висловив Пітер Мойлан. Він присвятив критиці Сі цілих 12 сторінок. Наведемо кілька фрагментів:

Проблеми з модульністю
Модульне програмування мовою Сі можливе, але у тому випадку, коли програміст дотримується низки досить жорстких правил:

На кожен модуль повинен припадати один header-файл. Він повинен містити лише експортовані прототипи функцій, опису та нічого іншого (крім коментарів).

Зовнішній процедурі, що викликає, про цей модулі повинні бути відомі тільки коментарі в header-файлі.

Для перевірки цілісності кожен модуль повинен імпортувати власний header-файл.

Для імпорту будь-якої інформації з іншого модуля кожен модуль повинен містити рядки #include, а також коментарі, що показують, що імпортується.

Прототипи функцій можна використовувати лише у header-файлах. (Це правило необхідно, оскільки мова Сі не має механізму перевірки того, що функція реалізується в тому ж модулі, що і її прототип; так що використання прототипу може маскувати помилку відсутності функції - missing function).

Будь-яка глобальна змінна в модулі, і будь-яка функція, крім імпортованої через header-файл, повинні бути оголошені статичними.

Слід передбачити попередження компілятора виклик функції без прототипу (function call without prototype); таке попередження завжди слід розглядати як помилку.

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

Слід з підозрою ставитись до будь-якого використання утиліти grep. Якщо прототип розташований не на своєму місці, це, швидше за все, помилка.

В ідеалі програмісти, що працюють в одній команді, не повинні мати доступу до файлів один одного. Вони повинні спільно використовувати лише об'єктні модулі та header-файли.

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



Зображення із сайту smartagilee.com
Проблеми з покажчиками
Незважаючи на всі досягнення в теорії та практиці структур даних, покажчики залишаються для програмістів справжнім каменем спотикання. На роботу з покажчиками припадає значна частина часу, що витрачається на налагодження програми, і саме вони створюють більшість проблем, що ускладнюють її розробку.

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

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

Перша полягає в тому, що в середовищі програмістів, які використовують мову Сі, стало традицією створювати покажчики навіть там, де вже існують інші методи доступу, що нічим не поступаються їм, наприклад, при перегляді елементів масиву.

Друга причина - правило мови Сі, за яким усі параметри функцій повинні передаватися за значенням. Коли вам потрібен еквівалент VAR-параметра мови Паскаль або inout- параметра мови Ada, єдине рішення полягає в тому, щоб передати покажчик. Цим багато в чому пояснюється погана читання програм мовою Сі.

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

Сі – живий

Згідно з даними на червень 2016 року, індекс TIOBE, який вимірює зростання популярності мов програмування, показав, що C посідає 2 місце:

Нехай хтось скаже, що Сі застарів, що його широке поширення – наслідок удачі та активного PR. Нехай хтось скаже, що без UNIX мову Сі ніколи не створили б. Додати теги

Я вирішив іноді публікувати вибрані розділи зі стандарту мови С++.

Наразі вже закінчується робота над стандартом 2017 року. Але чинним на даний момент є стандарт 2014 року. Офіційна версія стандарту платна (ціна 133 долара).

Однак на офіційному сайті можна завантажити версію 2014 (неофіційну, але робочу та цілком придатну для вивчення). Тому я публікуватиму на своєму сайті уривки стандарту 2014 року.

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

Триватиме вона довго, якщо не нескінченно))) Тому що в стандарті понад 1300 сторінок.

Але сподіваюся, що комусь ці відомості виявляться корисними. Тому, а також для того, щоб не забути англійську, я іноді це робитиму…

А почнемо ми з першої сторінки документа та короткого змісту…

Номер документа: N4296
Дата: 2014-11-19
Перегляд: N4140
Відповідальний: Richard Smith
Google Inc
[email protected]

Робочий проект, Стандарт для програмування

Мова C++

Це ранній проект. Відомі неточності та відсутні деякі відомості, і стандарт має багато не дуже добрих місць, які мають бути доопрацьовані.

ВАЖЛИВО!
Не всі компілятори та засоби розробки точно відповідають стандартам. Тобто деякі функції, визначені стандартом, можуть не підтримуватись компілятором. А також компілятори можуть надавати свої додаткові функції та бібліотеки, яких немає у стандарті.

ПРИМІТКА
Нижче наведено основні розділи стандарту С++ 2014. У міру сил я перекладатиму ці розділи, а також даватиму свої коментарі там, де це необхідно. І тоді замість тексту з назвою розділу з'являтимуться посилання. Також у розділів з'являтимуться підрозділи...

ОСНОВНІ РОЗДІЛИ

СПИСОК ТАБЛИЦЬ
СПИСОК ЗОБРАЖЕНЬ

2. ЛЕКСИЧНІ УГОДИ
3. ОСНОВНІ КОНЦЕПЦІЇ
4. СТАНДАРТНІ ПЕРЕТВОРЕННЯ
5. ВИРАЗИ
6. ОПЕРАТОРИ
7. ОГОЛОШЕННЯ
8. ОПИСНИКИ
9. КЛАСИ
10. ВИРОБНИЧІ КЛАСИ
11. УПРАВЛІННЯ ДОСТУПОМ ДО ЧЛЕНІВ
12. СПЕЦІАЛЬНІ ФУНКЦІЇ-ЧЛЕНИ
13. ПЕРЕВАНТАЖЕННЯ
14. Шаблони
15. ОБРОБКА ВИКЛЮЧЕНЬ
16. ДИРЕКТИВИ ПРЕПРОЦЕСОРА
17. БІБЛІОТЕКИ: ЗАГАЛЬНІ ВІДОМОСТІ
18. БІБЛІОТЕКА ПІДТРИМКИ МОВИ
19. БІБЛІОТЕКА ДІАГНОСТИКИ
20. БІБЛІОТЕКА ОСНОВНИХ УТИЛІТ
21. БІБЛІОТЕКА РЯДК
22. БІБЛІОТЕКА ЛОКАЛІЗАЦІЇ
23. БІБЛІОТЕКА КОНТЕЙНЕРІВ
24. БІБЛІОТЕКА ІТЕРАТОРІВ
25. БІБЛІОТЕКА АЛГОРИТМІВ
26. БІБЛІОТЕКА ЧИСЛ
27. БІБЛІОТЕКА ВВЕДЕННЯ-ВИСНОВКУ
28. БІБЛІОТЕКА РЕГУЛЯРНИХ ВИРАЗІВ
29. БІБЛІОТЕКА АТОМАРНИХ ОПЕРАЦІЙ
30. БІБЛІОТЕКА ПІДТРИМКИ ПОТОКІВ
ДОДАТОК A. ГРАМАТИКА: ПІДСУМКИ
ДОДАТОК B. РОЗМІРИ ВИХІДНИХ ФАЙЛІВ
ДОДАТОК C. ОСОБЛИВОСТІ СУМІСНОСТІ
ДОДАТОК E. УНІВЕРСАЛЬНІ ІМЕНА ДЛЯ СИМВОЛІВ ІДЕНТИФІКАТОРА
ДОДАТОК F. ПЕРЕХРИСНІ ПОСИЛАННЯ
ІНДЕКС
ІНДЕКС ПРОДУКТІВ ГРАМАТИКИ
ІНДЕКС ІМЕН БІБЛІОТЕК
ІНДЕКС ВИЗНАЧЕНОЇ РЕАЛІЗАЦІЇ ПОВЕДІНКИ

Мова Сі була розроблена Деннісом Рітчі та Браяном Керніганом у 1969–1973 роках. Сі замислювався для реалізації операційної мережі UNIX, але згодом знайшов собі ширше застосування.

На сьогоднішній момент Сі займає стабільне друге місце.

Навіщо потрібний Сі?

Ми вже про важливість мови Сі, тому пробіжимося основними пунктами.

Почнемо з того, що більшість системного програмного забезпечення пишеться мовою Сі. Ядро популярної Open Source ОС Linux було написано на Сі.

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

Варто також відзначити, що найбільш популярні мови програмування тим чи іншим чином пов'язані із Сі. Так, наприклад, Java і C# мають так званий Сі-подібний синтаксис, а C++ і Objective-C у тому чи іншому роді є розширеннями Сі.

Якщо ви пишете код якоюсь динамічною мовою програмування, будь то PHP, JavaScript або Python, то його інтерпретатор, середовище виконання та більшість бібліотек в основному написані на Сі. Отже, щоб зрозуміти особливості поведінки тієї чи іншої мови, потрібно знати особливості мови Сі. А якщо ви вийшли за межі можливостей своєї мови програмування, то не встигнете озирнутися, як почнете писати нове розширення на Сі.

До того ж, знання Сі дозволяє програмісту по-справжньому оцінити всі принади високорівневих мов програмування, а також обмеження, які виникають при їх використанні.

І це аргументи на користь вивчення Сі.

Що далі?

Тепер, коли ми розібралися, навіщо нам потрібний Сі, виникає логічне запитання: «А як його вивчити?».

Книга «Мова програмування Сі»

Ніхто не розповість вам про Сі краще, ніж творці цієї мови програмування. Тому книга «Мова програмування Сі», написана Деннісом Рітчі та Браяном Керніганом, є must-have для кожного, хто хоч якось вирішив пов'язати своє життя із Сі.

Курс "The Complete C Developer Course - Build 7 Exciting Projects"

Курс покриває як початкові аспекти мови, і більш просунуті: програмування графіки, моделі пам'яті та багато іншого. У процесі проходження курсу ви створите 7 захоплюючих проектів, таких як система управління базами даних і свій власний комп'ютерний вірус.

Курс платний, але він однозначно вартує своїх грошей. Далі пропонуємо безкоштовні матеріали.

Знаменитий гарвардський курс «CS50»

Тепер він мовою. Насамперед CS50 навчить вас думати. Деякі з тем, які ви пройдете протягом курсу: абстракція, алгоритми, структури даних, інкапсуляція, керування ресурсами, безпека, розробка програмного забезпечення та веб-розробка. Мови, які ви будете використовувати: C, Python, SQL та JavaScript разом з HTML та CSS. І що важливо, курс безкоштовний.

Безкоштовний курс C Tutorial for Beginners

З цією програмою ви вивчите основи мови Сі, розберетеся з покажчиками, структурами та об'єднаннями, а також навчитеся писати прості програми.

Безкоштовні онлайн-курси Сі від двох провідних фінських університетів

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

Над курсом спільно працювали університет Аалто і університет Гельсінкі (той самий, де колись навчався Лінус Торвальдс), а матеріал, що пояснюється в ньому, повністю дублює курси по Сі, що викладаються в цих університетах.

Книга "Learn C The Hard Way"

Книга навчить вас тому Сі, який застосовується в реальному житті для створення реальних проектів, а не абстрактних механізмів та педантичної теорії. Ви також вивчіть кілька важливих тем, таких як алгоритми та структури даних та автоматизоване тестування. Бажаючі можуть знайти її переклад російською мовою. Tproger теж часто рекомендує хороші книги з програмування, так що загляньте в

Мова програмування Сі++(вимовляється як "сі плюс плюс") - мультипарадигмова мова програмування, підтримує об'єктно-орієнтоване програмування. Бьорн Страуструп з Bell Labs розробляв мову програмування C++ протягом 1980-х років, використовуючи як основу мову програмування C . Великою мірою завдяки величезній популярності C, мова програмування Сі++ стала найпопулярнішою мовою протягом 1990-х років. Програмування для початківців. І досі він дуже широко використовується в комерційних додатках і досі. Мова програмування C++ замінив собою C у сфері комерційних додатків, тому що він дозволяє програмістам розробляти системи з постійно зростаючою складністю, при цьому не відмовляючись від своїх коренів C (наприклад, бібліотек які написані на звичайному Сі). Поряд з об'єктно-орієнтованим проектуванням, сьогоднішній Cі++ відрізняється від C своєю підтримкою узагальненого програмування та шаблонне метапрограмування. Це реалізовано через псевдоніми типів, у вбудованими розширеннями, шаблонами та коментарями в стилі // коментар (хоча зауважимо, що в C згодом було прийнято //-коментар). Програмування для чайників

Історія C++
Страуструп почав працювати над мовою в 1979 році, натхненний Simula67, як основою програмування. Компанія AT & T вперше використовувала мову в серпні 1983 року . Оригінальний компілятор називався Cfront. Перший комерційний реліз відбувся у жовтні 1985 року. Стандартизований C++ організацією ISO / IEC 14882-1998 1998 .

Історія назви "C++"
Ця назва належить Ріку Маскітті Rick Mascitti (середина 1983) і вперше була використана в грудні 1983 року. Раніше, під час дослідження та періоду розвитку мови було прийнято називати "Сі з класами". Остаточна назва походить від Сі та "++" оператора (який збільшує значення змінної на одиницю) та загального іменування через "+", щоб вказати на розширені можливості програми комп'ютера, наприклад: "Wikipedia +". (Простіше кажучи, знак плюсу означає вдосконалення програми та надання їй нового функціонала) За Страуструпом: "це ім'я означає еволюційний характер зміни з Сі". Хоча більшість коду C дійсно для C++, але C не утворює підмножина C++.
Деякі програмісти C наголосили, що якщо оголосити x=3; та y=x++; то при виконанні x = 4 а y = 3; тому що x збільшується після того, як його значення надається y. Однак якщо написати y=++x; то y = 4 і x = 4 .
Після таких міркувань, найбільш підходяща назва C++ може бути фактично ++С. Однак, C++ і ++C це збільшення C тому форма C++ є більш поширеною, ніж ++C.
Педанти можуть відзначити, що після введення C++, мова C сама себе не змінила і найточніша назва може бути "C +1".

Право власності на C++
Ніхто не володіє C++. Страуструп та AT&T не отримують гонорари за використання C++.

Програма "Привіт Вікіпедії!"
Код нижче може бути скомпілюваний у програму, яка виводить текст повідомлення.

Include // The header is needed for std::cout // Beginning of main() function int main(int argc, const char**argv) ( // ( ... ) is used to include blocks of code std:: cout<< "Hello, Wikipedia!\n"; // Outputs the text enclosed by "" return 0; }

Визначення класу

Include using std::string; class InetMessage (string m_subject, m_to, m_from; public: InetMessage (const string & subject, const string & to, const string & from); string subject () const; string to () const; string from () const; );

C++ бібліотеки
Стандартні бібліотеки C++ здебільшого є надмножиною стандартних бібліотек C. Більшість бібліотеки С++ включає стандартну бібліотеку шаблонів (STL). STL надає такі корисні інструменти, як ітератори (які нагадують високого рівня покажчики) та контейнери (які нагадують масиви, які можуть автоматично зростати за рахунок включення нових елементів). Як і C, особливістю доступу до бібліотеки відбувається за допомогою #include директиви для підключення стандартних заголовкових файлів. C++ надає п'ятдесят застарілих стандартних заголовків.

Майбутнє мови
Мова програмування C++ продовжує розвиватися, щоб задовольнити зростаючі вимоги. Досі розробники компіляторів і середовищ розробок, як і раніше, продовжують боротьбу за підтримку всіх особливостей C++ (бл. 2004), ситуація значно покращилася в період з 1998 по 2003 рік. Зокрема, одна група розробників Boost.org, яка багато зусиль доклала для того, щоб мова програмування Сі++ стала такою, якою ми знаємо її сьогодні і консультують комітет зі стандартизації з функцій, які працюють, а які потребують поліпшення. Поточна робота показує, що C++ спиратиметься на його характер мультипарадигми більше і більше. Роботи розміщені на Boost.org, наприклад, значно розширюють C++ функціональну та мета можливості програмування. C++ досі немає стандарту по іменуванню змінних та функцій, роблячи несумісним код, що виробляється різними компіляторами.

ЛІРИЧНИЙ ВСТУП.
є на ФКНе такий предмет: ЯСіТП (мова і теорія програмування). іситівці вивчають його на третьому курсі та особливих проблем з ним, як правило, не мають. а нещасні студенти з мкн змушені саме з нього почати вивчення програмування – з перших тижнів перебування в універі. все б нічого - якщо студент у школі хоч трохи вчив інформатику і добре знайомий з паскалем - вивчить синтаксис і далі заганятиметься матаном та дискретою. а якщо не вчив і не знайомий? тобто навіть зовсім?
тоді ваша справа труба \ дрянь \ погано.
перше: на лекціях Хлібобудова не спати. немає важче завдання, ніж підкорити під його розмірений голос на четвертій парі, але... все залежить від вас.
друге: почніть читати книжку, наприклад http://www.ph4s.ru/bookprogramir_1.html там знайдете книгу Богатирьова "керівництво повного ідіота з програмування" або щось інше до смаку.
третє і, мабуть, найголовніше: ПРАКТИКА. про що я й поведу мову.
перш ніж намагатися щось писати вдома, треба встановити правильну студію. з досвіду майже всього мкн2012 набору бачул студіо 2010 з ++ експрес - неробоча. Те що ідеально написано на комп'ютерах в університеті, вона читає з помилкою без можливості виправлення. чому - не наша справа, ми шукаємо віжуал студіо 2010 (2012) вултимайт (Visual Studio Ultimate 2012). наприклад: http://www.microsoft.com/visualstudio/ru... . встановлюємо пробну версію, після чого можна вже приступати до практики.

(Примітка 1:
файл - додаткові параметри збереження - кирилиця doc. тоді консоль нормально читатиме російські літери.

ПРИМІТКА2: для того, щоб отримати повноцінну програму з представленого коду, необхідно створити новий проект у віжуал студіо, вибрати пункт "порожній проект", вказати ім'я проекту, в папці "файли вихідного коду" правою клавішею миші додати новий елемент "файл з++", скопіювати в вікно, що утворилося, мій код і скомпілювати (клавіші контрол+ F5), після чого спробувати написати щось подібне самостійно.)

Практика.
Програмування класично починається з написання елементарної програми "Привіт світ!".
на форумі є кілька тем про цю програму різними мовами, крім с++, тому ось код:

#include "stdio.h" #include "conio.h" int main(int argc, char* argv) ( printf("Hello, World!\n"); )

корисно написати так само пару трійку найпростіших програм такого типу (наприклад, ця виводить результат рівняння з відомими заздалегідь даними):

// tytytyty.cpp: Defines the entry point for console application. // #include "stdafx.h" int _tmain(int argc, _TCHAR* argv) ( int x , y , z; x = 9; y = 4; z = x*y; printf("%d", z) ;)

потім складніше (ця програма зчитує два значення, що вводяться і дає результат рівняння з введеними значеннями):

#include "stdio.h" void main() ( int x , y , z; scanf("%d, %d", &x, &y); z = x*y; printf("%d", z); )

наступна програма, задана викладом після "привіт мир!", у мене виглядала так:
умова: дано квадрат і вписане в нього коло. знайти половину площі квадрата, що залишилася за межами кола, якщо буде відома сторона квадрата.
Рішення:

#include "stdio.h" #include "math.h" #define PI 3.1415926535897932384626433832795 void main() ( double x; printf("введіть значення сторони квадрата x = "); scanf("%lf", &x = x / 2; double f = x * x; double z = PI * y * y; double s = (f - z) / 2; printf("%lf\n", s);

як варіант з використанням бібліотеки констант:

#define _USE_MATH_DEFINES #include "stdio.h" #include "math.h" void main() ( double x; printf("x = "); scanf("%lf", &x); double y = x / 2; double f = x * x; double z = M_PI * y * y; double s = (f - z) / 2; printf("%lf\n", s);

програма номер п'ять із таск два. умова: розв'язати квадратне рівняння з коефіцентами, що задаються.
реалізація:

#include "stdio.h" #include "math.h" #include "conio.h" int main() ( float x , x1, sq, a, b, c; printf("Vvedite znachenija a, b, c: "); scanf("%f, %f, %f", &a, &b, &c); if (a == 0) ( x = - c / b; printf("%f", x); ) else (float k; k = b * b - 4 * a * c; if (k< 0) { printf("Kornei net!"); } else if (k == 0) { x = - b / (2 * a); printf("%f", x); } else { sq = sqrt(k); x = (-b + sq) / (2 * a); x1 = (-b - sq) / (2 * a); printf("%f, %f", x, x1); } } getch(); return 0; }

(УВАГА!! при вказівці бібліотек замість знаків більше \ менше скрізь вказані лапки)

ПІСЛЯМОВА: пізніше будуть додаватися інші завдання.