Перше слово мовою C
Обіцяв я давати уроки програмування мовою С. Гадаю, що пройшло достатньо часу для того, щоб підготуватись. Ось і настав час написати першу програму. Зовсім простеньку, однак цінну, хоча б для розуміння того як працювати з компілятором і як виглядають програми написані мовою C
Декілька слів про Linux, компілятори та таке інше
Всі, хто читав попередній матеріал, повинні вже пам'ятати, що я заохочую людей спробувати попрацювати в Unix подібних операційних системах. Я ще раз хочу на цьому наголосити.
Хочу ще додати, що необов'язково цілком видаляти Windows для цього. По-перше, існую така річ як cygwin. Це емулятор unix-подібних операційних систем, для ОС Windows. До wine йому далеченько (щоб запустити x.org треба стільки ресурсів, що про комфортну роботу на моій машині справа йти не може.. та ще й далеко не все підтримується. А от wine може запустити стільки всього). Однак для роботи з мовою C цілком вистачить. Деяку інформацію можна знайти на Wikipedia.
Інший варіант - використання віртуальної машини. Наприклад, VMVare та десятків інших. Таким чином Ви зможете встановити наприклад Linux і працювати з ним навіть не покидаючи звичного для багатьох Windows.
Ну і на кінець, ніхто не заважає користуватись Windows та її компіляторами. Однак в такому випадку виникне маса труднощів стосовно моїх уроків.
Перша програма
Ну що ж. За традицією почнемо з простенької програми, що на екран виведе слова "Hello, world!", себто "Привіт, Світ!". Пропоную скористатись для цього все таки ж редактором vim. В консолі наберемо:
І побачимо інтерфейс vim'a. Для початку слід натиснути i (перейти з командного режиму в режим введення) і ввести текст програми:
Тепер натисніть ESC щоб повернутись до командного режиму, наберіть :w та натисніть Enter - виконаємо команду збереження файла. Тепер можна вийти з редактора, для того щоб скомпілювати програму. Для цього в командному режимі скористаємось командою :x чи :q (перша перед виходом автоматично збереже всі внесені зміни).
Компіляція програми виконується в терміналі командою:
і побачимо бажане "Hello, world!".
Час пояснень
Все чудово, однак слід розібратись, що ж написано в коді.
Перший рядок: #include "stdio.h". Всі рядки в С та C++, що починаються з # являються директивами препроцесора. Саме препроцесор надає С можливість бути таким гнучким, створювати на ньому програмний код, що досить безболісно переноситься з одної платформи на іншу.
Що ж таке препроцесор? Перед компіляцією програмного коду препроцесор його обробляє виконуючи директиви вказані в коді, в результаті чого компілятор отримує змінену версію програмного коду. Взагалі то на нього покладається декілька функцій, одну з яких можна побачити в прикладі - підключення файла-заголовка директивою #include. Тобто файла призначеного для опису заголовків бібліотечних функцій.
В даному прикладі підключається бібліотека stdio(тобто standart input output), призначений для роботи з файлами. Оскільки за прийнятою в *nix ідеологією з якої зачерпнула багато ідей і мова C, будь-що є файлом, то і стандартний контекст вводу/виводу (тобто консоль) - файл, а значить ця бібліотека дозволяє працювати з даними введеними користувачем з клавіатури.
Що дає можливість підключення бібліотек? Писати програмний код, що не залежить від платформи. Для кожної платформи підключаються необхідні бібліотеки, що містять необхідні функції у відкомпільовані під дану платформу. А програміст до цих функцій у своїй програмі звертається на будь-якій платформі однаково. До того ж, використання стандартних бібліотек дозволяє спрощувати роботи ховаючи низькорівневі, а іноді і досить високорівневі операції від розробника.
Рухаємось далі. Наступний рядок описує функцію main, що повертає значення типу int. Як багато страшний та нових слів... Почну з пояснення поняття функції. Всі повинні пам'ятати шкільний (чи навіть університетський) курс математики. Функція - співвідношення при якому кожному елементу множини А (множини аргументів функції) відповідає одне значення з множини В (множини значень). Тобто це всі ті y = x2 та багато чого іншого. В мові С поняття функції аналогічне до математичного. Кожна функція може мати 0 або більше аргументів, виконуючи над ними дії (і не тільки над ними) мусить повернути певне значення результатом. По суті, функція - набір дій.
Функція main - головна функція будь-якої програми мовою С. З неї починається виконання програми. А вже вона сама може викликати функції описані всередені програми чи в підключених бібліотеках.
Як було сказано вище, кожна функція в результаті свого виконання повертає якесь значення. Це значення може мати різні типи. Що ж таке тип? Зрозуміло, що в математиці та і в житті також, різні об'єкти розрізняються між собою. Наприклад, цілі та дійсні числа. Числа взагалі та рядки. Мова С, як типізована мова в своїй основі має розподіл даних на типи, кожен з яких має свої властивості, особливі операції. В прикладі наша функція main повертає значення типу int - ціле число (від англійського integer).
Тепер можна зрозуміти, що той рядок описує функцію main, яка має повернути ціле число і є точкою входу в програму. Тепер же подивимось, що робить ця функція і таким чином вся програма.
За аналогієї до математики послідовність дій у функції задається аналогічним до задання множини за її значеннями чином. Тобто в фігурних дужках { та }. Елементи-дії розділяються ";".
Як ми можемо побачити функція main виконує дві дії. Перша (puts("Hello, world!")) - виклик функції puts в яку аргументом передається рядок. Ця функція належить стандартній бібліотеці stdio, яку ми підключали першим рядком програми. Її призначення - вивести рядок на стандартний контекст виводу, а це за замовчуванням консоль. Тобто цей рядок надрукує на екрані рядок "Hello, world!".
Ще раз наголошу, що функція має повертати значення. Ось саме для цього й існує оператор return, що повертає передане значення як результат виконання функції, автоматично зупиняючи подальше виконання цієї функції.
Отже ця перша програма підключає стандартну бібліотеку для роботи з пристроями введення/виведення, виводить на екран рядок "Hello, world!" та завершує своє виконання повертаючи код 0.
І це все?
Зрозуміло, що нічого особливо корисного програма не робить, однак це лише перша програма, написана для того, щоб хоча б трішки ознайомитись з синтаксисом мови програмування С та отримати певні навички роботи з редактором vim та компілятором gcc. Сподіваюсь все було зрозуміло, всі подолають цей перший крок, та приєднуються наступного разу.
Чекаю на питання та коментарі.
Дякую за увагу!
Коментарі:
Чекаєю на продовження.
І хотілось би зауважити, що уроків програмування мовою C і так достатньо. Її навіть в університетах вивчають. А от програмування саме для Unix - тема цікавіша, і описана слабше. Мені навіть пробували дещо пояснити, але я ще майже не розібрався.
Особливо цікаво було б розібратись з тим як робити makefile, настроювати Vim, як IDE, і ефективно шукати помилки за допомогою gdb.
Хех.. А я тут саме набрав цылу купу цыкавих тем. Не стільки про програмування під Unix (хоча й з цієї теми є про що розповісти), а от цікавинки С та С++. STL і т.д. :) А може щось і про GTK та QT розповім, про те, як працюють демони і пр. Тільки все ніяк не розгребусь з купую роботи :(



