Матрьошка Сі. Шарова система мови програми

Спробуємо уявити хімію без Періодичної системи Менделєєва (1869). Скільки елементів треба було пам'ятати, причому у довільному порядку… (Тоді — 60.)

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

А тепер ми можемо пережити почуття хіміків ХІХ століття, коли їм запропонували всі їхні знання, і трохи згори, в одній Періодичній таблиці.

Матрьошка Сі. Шарова система мови програми


Книга «Матрьошка Сі. Шарова система мови програми» представляє всі одиниці мови Сі як на долоні. Це дозволяє впорядкувати їх, виправити застарілі відомості та навіть уточнити саме поняття програми.

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

Перша необхідність – викладання. Менделєєв почав створення своєї системи, коли став перед питанням — з якого елемента починати читати лекції: O, H, N, He, Au… При цьому йому було простіше — він навчав хімії найкращих студентів СПб університету. А програмування вже викладають у школі та скоро почнуть у дитячому садку.

Друга необхідність – науковий підхід. За допомогою Періодичної системи було відкрито нові елементи та виправлено відомості про старі. Вона допомогла у створенні моделі атома (1911). І так далі.

Третя необхідність – уточнення поняття програми.

Сучасне програмування однією ногою застрягло у 50-х роках ХХ століття. Тоді програми були прості, а машини та машинні мови – складні, тому все крутилося навколо машин та мов.

Тепер все навпаки: програми – складні та первинні, мови – прості та вторинні. Це називається прикладний підхід, який усім начебто знайомий. Але студентів та розробників продовжують переконувати, що все як і раніше.

Що повертає нас до першої лекції приват-доцента Менделєєва. Що казати першокурсникам? Де правда? Ось у чому питання.

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

Далі слідує короткий зміст книги.

1. Вступ

У 1969 році була створена мова Сі, яка стала основною мовою програмування і залишається нею вже 50 років. Чому це так? Насамперед, тому що Сі — це прикладної мова, яка надала програмі людяний вид замість машинного. Це досягнення закріпили мови сімейства Сі: C++, JavaScript, PHP, Java, C# та інші. По-друге, це коротка і гарна мова.

Однак саму мову Сі зазвичай змішують з машинним асемблером, тим самим ускладнюючи і спотворюючи його сприйняття. Іншою крайністю є нав'язування в навантаження до мови певної «філософії»: процедурної, об'єктної, функціональної, компілюваної, інтерпретованої, типізованої тощо. Це додає емоцій, але не допомагає краще описати мову.

Істина знаходиться посередині, причому для мови Сі — строго посередині між філософським та машинним сприйняттям.

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

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

Система побудована з урахуванням спільності прикладних мов, що з їх мовної підпорядкованості. Один набір одиниць Матрьошки Сі дозволяє описувати та порівнювати різні мови, створивши ряд Матрьошок: C++, PHP, JavaScript, C#, MySQL, Python тощо. Достойно і правильно, що різні мови описуються одиницями основної мови.

2. РОЗДІЛ 1. Мовленнєва модель програми. Зрозумілий Сі

У першому розділі представлена мовна модель програми, Що відображає прикладний підхід Згідно з ним, програма має три очевидні послідовні види:

  1. мовленнєвий - пряма мова програміста, що вирішує завдання,
  2. кодовий - кодування рішення в математичний вид мовою Сі (або будь-яким іншим)
  3. і командний – безпосередні машинні команди.

Мовленнєва модель пояснює, чому Сі — проста і зрозуміла мова. Сі побудований за образом і подобою звичного нам людського мовлення.

Перший вид програми – пряма мова програміста. Йдеться про людське мислення. За допомогою мови пишуть програми програмісти-початківці — спочатку російською, потім покроково перекладаючи дії кодовою мовою. І саме за таким зразком було створено мову Сі.

Висновки програміста, виражені мовою, перетворюються на кодовий чисельний вид. Це перетворення слід назвати відображеннямоскільки мова і код мають одну природу (відображення - народження - рід). Це цілком очевидно, якщо зіставити мовний (ліворуч) та кодовий (праворуч) види програми.

Матрьошка Сі. Шарова система мови програми

Цікаво, що відображення відбувається дуже просто — лише двома пологами виразів.

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

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

Відображення виконують два роди виразів:

  1. обчислення (Вч) - Відображає зміна властивостей предмета. Властивість предмета виражається числом, тоді дію над властивістю це дію над числом операція.
  2. підпорядкування (Пч) - відображає зміну порядку дій. Прообразом Пч є мовленнєва складнопідрядна пропозиція, тому більшості видів Пч починається з підрядних спілок «якщо», «інакше», «поки», «для». Інші види ПЧ їх доповнюють.

До речі, ви можете повірити, що в описі Сі немає назви для виразів обчислення - вони називаються просто "вирази"? Після цього вже не здивує відсутність назви та об'єднання для роду підпорядкування, та й взагалі мізерність щодо назв, визначень та узагальнень. Все тому, що знаменитий К/Р («Мова Сі», Керніган/Річі, 1978) є не описом, а посібником із застосування мови.

Однак мати опис мови все ж таки хотілося б. Тому його пропонує Шарова система мови програми.

3. РОЗДІЛ 2. Шарова система. Короткий Сі

Будь-який опис має бути точним та гранично коротким. У разі мови програми лобовий опис важко.

Ось ми маємо програму. Вона складається із модулів. Модулі складаються з підпрограм та добірок (structure). Підпрограми складаються з окремих виразів: оголошень, обчислень, підпорядкування. Підкорень — цілих десять видів. Підпорядкування підключають підрівні та підпрограми. Оголошень теж кілька. Втім, оголошення включаються не тільки в підпрограми та підрівні, а й у модулі та добірки. І більшість виразів складається зі слів, які описувати настільки складно, тому зазвичай їх просто дають двома списками — вихідні та похідні слова, з якими належить знайомитися протягом усього вивчення та застосування мови. Додамо до цього розділові знаки і ще ряд виразів.

У такому викладі непросто зрозуміти, хто на кому стояв.

Прямий ієрархічний підхід до опису мови буде надмірно складний. Пошук манівців призводить до опису мови на основі його мовної природи та командної сторони. Таким чином народилася Шарова система, яка частково збігається з Періодичною системою Менделєєва, яка теж є шаровий. Як з'ясувалося через 42 роки після її видання (1869), періодичність системи пов'язана з електронними. шарами (1911 модель атома Бора-Резерфорда). Також Шарову та Періодичну системи ріднить табличне розміщення всіх одиниць на одній сторінці.

Опис одиниць мови виходить коротким - всього 10 пологів виразів та 8 пологів інших одиниць, а також змістовним та наочним. Хоча й незвичним для першого знайомства.

Одиниці мови розділені на 6 рівнів:

  1. загони - рядки таблиці
  2. відділи - особливі групи пологів (частини першого рядка)
  3. роду - осередки (головний рівень поділу)
  4. надвиди - роздільники видів (рідкісний рівень)
  5. види - формули одиниць внизу комірки або окремо
  6. зразки самі одиниці (тільки для слів)

Зразки слів описує словник - окрема підсистема, складена з тих самих шести рівнів.

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

4. НАСТУПНІ ГОЛОВИ. Гарний Сі

Мова Сі лежить в основі сучасного програмування. Чому? По-перше, з огляду на найбільшу відповідність мови. По-друге, тому, що красиво обійшов обмеження машинної обробки чисел.

Що саме запропонував Сі? Образ та шар.

Слово "образ" - це переклад англійського слова "type", яке походить від грецького "прототип" - "прообраз". У російській мові слово «тип» не передає наріжність поняття, що виражається, до того ж поєднується зі службовим значенням «вид».

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

Шар відразу вирішував кілька завдань — і машинних, і прикладних. Тому розгляд почнеться з однозадачного образу та перейде до багатозадачного шару.

Одна з неприємних рис історичного програмування у тому, більшість понять, включаючи основні, даються без визначень. "Мова програмування (ім'я річок) має цілий і плаваючий тип чисел ..." - і почухали далі. Що таке тип (образ) — визначати необов'язково, тому що автори самі це не до кінця розуміють і замнуть для ясності. Якщо їх припруть до стіни, то дадуть розмите і марне визначення. Дуже допомагає сховатись за іноземними словами: для російських авторів – за англійськими (тип), для англійців – за французькими (subroutine), грецькими (поліморфізм), латинськими (інкапсуляція) або їх поєднаннями (поліморфізм ad-hoc).

Але це не наша доля. Наш вибір - визначення з піднятим забралом чистою російською мовою.

образ

образ - Це прообразующее ім'я величини, що визначає 1) власні властивості величини та 2) підбір операцій до величини.

Слову тип (вид) відповідає перша частина визначення: власні властивості величини. Але головне значення образу — у другій частині: «підбір операцій до величин».

Відправна точка для введення образу в мові Сі - звичайне обчислення, наприклад, операція додавання.

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

машинна математика суворо поділяє числа на цілі та дробові. Різні види чисел по-різному зберігаються у пам'яті та обробляються різними командами процесора. Наприклад, команди додавання цілих і дробових чисел — це дві різні команди, що відповідають двом різним вузлам процесора. Натомість команда складання цілого та дробового аргументів відсутня.

Прикладна математика, тобто мова Сі, поділяє види чисел, але поєднує операції: додавання для цілих та/або дробових чисел записується одним знаком дії.

Чітке визначення поняття образ дозволяє виразно говорити про два інші поняття: величина и операція.

Величина та операція

Величина - Оброблюване число.

Операція - Обробка значень вихідних величин (аргументів) для отримання підсумкового числа (підсумка).

Величина та операція взаємопов'язані. Кожна операція є величиною, оскільки має числовий результат. А кожна величина є результатом пересилання значення регістр процесора/з процесора, тобто — підсумком операції. Незважаючи на цей взаємозв'язок, все-таки головним є можливість їх роздільного опису, нехай і з повторенням одного слова в різних відділах словника, що відбувається в ма3.

Машинний підхід ділив усі числа, що використовуються програмістом, на команди и дані. Раніше і ті, й інші були саме числами, наприклад команди писалися числовими кодами. Однак у прикладних мовах команди перестали бути числами та стали словами и знаками дій. Числами залишилися лише «дані», але продовжувати називати їх так безглуздо, тому що при переході від машинного до математичного погляду числа — це величини, які діляться вихідні (дані) та підсумковими (шукані). «Невідоме це» - це звучатиме безглуздо.

Команди теж розділилися на два види дій: математичні та службові. Математичні дії – операції. До службових звернемося пізніше.

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

Множинні операції – кілька однойменних операцій із різними образами аргументів та різними, близькими за змістом, діями.

Цілим аргументам відповідає ціла операція, дробовим - дробова. Ця різниця особливо наочна під час операції поділу, коли вираз 1/2 дає результат 0, а чи не 0,5. Такий запис не відповідає правилам паперової математики, але мова Сі і не прагне їх дотримуватись (на відміну від Фортрана) — він грає за своїми прикладним правилам.

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

Ряд операцій залишаються не множинними, а одиничними. Такі операції визначено лише одного виду аргументів: залишок поділу — цілі аргументи, укладання (побітові операції) — натуральні цілі. Ма3 вказує множинність операцій знаками (#^) із зазначенням образів, котрим операція визначена. Це важлива, але пропускається раніше властивість кожної операції.

Усі функції є довільними одиничними операціями. Виняток становлять оператори безскобочні функціївбудовані в мову (вихідні операції).

сприяння

сприяння - Супутнє операції дію.

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

Тут треба відволіктися та окремо сказати про російські переклади підручників із програмування. У тексті К/Р для запису дій було запроваджено нове слово заяву (Вираз), яке зробило спробу розділити поняття машинної команди на різні дії: 1) операцію, 2) оголошення та 3) підпорядкування (назване «керівними конструкціями»). Цю спробу поховали російські перекладачі, замінивши «вираз» словом «оператор», яке:

  1. стало синонімом машинного слова «команда»,
  2. виявилося синонімом словосполучення «знак дії»,
  3. а також отримувало необмежену кількість додаткових значень. Тобто перетворилося на подобу англійського артикля «еее…».

Розглянемо супутні дії, або сприяння.

Управління змінною

Управління змінною (УП) - створення/видалення осередків змінної.
УП відбувається у неявному вигляді при оголошенні змінної, яке й так вже пишеться з іншого приводу – для вказівки образу величини. Явно керуються лише один вид додаткових змінних за допомогою функцій malloc() та free().

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

Підпорядкування

Підпорядкування - Підключення/відключення шарових розділів.

Мова Сі запропонував відмінний від асемблера, прикладний спосіб управління порядком дій - підпорядкування. Воно відбиває і розвиває мовне складнопідрядне речення з явним поділом на головну частину (пропозиція підпорядкування) та додаткову частину (розділи підрівень/підпрограма).

І оголошення, і підпорядкування повністю побудовані на понятті шар.

Шар

Шар — це обмежений однорівневий вибірковий набір виразів.

Шар явно і неявно взяв він виконання відразу кількох завдань:

  1. впорядкування програми,
  2. обмеження видимості імен (неявно),
  3. управління змінними (комірками пам'яті) (неявно),
  4. визначення придаткових розділів для підпорядкування,
  5. визначення функцій та добірок та інші.

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

Без шару неможливо коротко і ясно пояснити багато дій та правил програми. Наприклад, чому простий як три копійки goto – поганий, а мудрий while – добрий. Можна лише безсило лаятися, як робив Дейкстра («кваліфікація програмістів — функція, що назад залежить від частоти появи операторів goto в їхніх програмах». Коротше, тільки козли використовують goto. Рівень обґрунтування — Бог.) Правда, це не так страшно, якщо ваші книги взагалі нічого не зобов'язані пояснювати, але, як ми вже сказали, це наша доля.

До речі, можна припустити, що Ден Річі залишив goto саме як ключ для пошуку якогось неназваного поняття, тому що жодної необхідності чи краси у виразі goto не було. Натомість була потреба простого і зрозумілого пояснення нових принципів мови, які сам Річі давати не хотів, і які саме ґрунтуються на понятті шар.

відхилення

відхилення - Зміна звичайних властивостей нового імені.

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

5. ОСТАННЯ РОЗДІЛ. Загальність прикладних мов

Прикладні мови – це образні мови (що мають образ, «типізовані»). Вони ґрунтуються на явному або неявному використанні образу. Причому тут знову проявляється суперечність: явний образ — зрозуміліший, але менш зручний, і навпаки.

Матрьошка Сі. Шарова система мови програми

(Розмітку таблиці поки не підвезли, тому таблиця дана картинкою.)

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

Перевантаження та поліморфізм

Слово "перевантаження" (overload) - застарілий термін машинного підходу, що означає створення множинних операцій.

Машинних (системних) програмістів множинність операцій цілком могла дратувати: «Що означає цей знак (+): додавання цілих чисел, додавання дробових чисел або взагалі зміщення?! В наш час так не писали! Звідси негативний відтінок обраного слова (перебір, набридло). Для прикладного програміста множинні операції — це наріжний камінь, головне досягнення і спадщина мови Сі настільки природні, що часто не усвідомлювані.

У мові Сі++ множинність поширилася як на вихідні операції, а й у функції — як окремі, і об'єднані в класи — методи. Разом з множинними методами з'явилася можливість їх перевизначення у розширених класах, туманно названа «поліморфізмом». Поєднання поліморфізму та перевантаження дало вибухову суміш, яка розлетілася на два поліморфізми: «істинний» та «ad-hoc». Розібратися в цьому можна лише всупереч назвам. Іноземними назвами вимощена дорога в ad.

Оголошення виду «перевантаження» краще висловити словом дооголошення - Додає оголошення однойменної функції з аргументами іншого образу.

Оголошення виду «поліморфізм» краще назвати словом переоголошення — перекриває оголошення в новому шарі однойменної функції, що розширює, з аргументами того ж образу.

Тоді легко розібратися, що однойменні методи різних образів (аргументів) доголошуються, а одного образу - переоголошуються.

Російські слова вирішують.

Злітна смуга

Розгляд понять високоподібних мов підтверджує важливість чіткого визначення основних понять. З правильно описаним Си вивчення високоподібних мов буде легким та приємним.

Особливо це важливо для неявних високоподібних мов (PHP, JavaScript). Їх важливість об'єктів (складових образів) стає ще вище, ніж у С++, але саме поняття образу стає неявним і трудноуловимым. З погляду зручності вони стали простішими, а ось з погляду розуміння — складнішими.

Тому починати вивчення мов програмування слід із мови Сі і рухатися далі гаразд появи мов сімейства Сі.

Те саме стосується опису мов. Різні мови мають збігається, чи менший набір пологів одиниць, ніж мова Сі. Число видів і зразків може відрізнятися в обидві сторони: у Сі + + видів більше, ніж у Сі, у Ява Скрипт - менше.

На особливу згадку заслуговує мова MySQL. Здавалося б - нічого спільного, але він чудово описується Матрьошки, і знайомство з ним стає швидше і простіше. Що важливо, враховуючи його значення для Інтернету – їдальні дороги сучасного програмування. А де MySQL, там та інші SQL. Ну, і всякі фортрани-паскалі-пітони теж описуються Матрьошки, як тільки руки дійдуть.

Отже, на нас чекають великі справи — прикладний опис мови Сі і єдиний опис наступних мов. «Наші цілі зрозумілі, завдання визначено. За роботу, товариші! (Бурхливі, тривалі оплески, що переходять в овацію. Всі встають.)»

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

Джерело: habr.com

Додати коментар або відгук