Да опитаме да представим химията без Периодичната система на Менделеев (1869). Колко елементи трябваше да държим в главата си, и то в произволен ред… (Тогава — 60.)
За това е достатъчно да помислим за един или няколко езика за програмиране. Същите чувства, същият творчески безпорядък.
А сега можем да изживеем чувствата на химиците от XIX век, когато им бяха предложени всичките им знания, и малко отгоре, в една Периодична таблица.

Книгата „Матрьошка Си. Слойна система на езика на програмата“ представя всички единици на езика Си, както на длан. Това позволява да ги подредим, да поправим остарялата информация и дори да уточним самото понятие на програмата.
Днес информацията за програмиране се нуждае от систематизиране дори повече, отколкото химическите елементи преди 150 години.
Първата необходимост — преподаването. Менделеев започна създаването на своята система, когато се изправи пред въпроса — от кой елемент да започне да чете лекции: O, H, N, He, Au… При това му беше по-лесно — той учеше химия на най-добрите — студенти от СПб университета. А програмирането вече се преподава в училище и скоро ще започне в детската градина.
Втората необходимост — научният подход. С помощта на Периодичната система бяха открити нови елементи и беше поправена информацията за старите. Тя помогна в създаването на модела на атома (1911). И така нататък.
Третата необходимост — уточняване на понятието програма.
Съвременното програмиране с единия крак е заседнало през 50-те години на XX век. Тогава програмите бяха прости, а машините и машинните езици — сложни, поради което всичко се въртеше около машините и езиците.
Сега всичко е обратно: програмите са сложни и основни, езиците — прости и вторични. Това се нарича приложен подход, който на всички изглежда познат. Но студентите и разработчиците продължават да бъдат убедени, че всичко остава същото.
Това ни връща към първата лекция на приват-доцента Менделеев. Какво да кажем на първокурсниците? Къде е истината? В това е въпросът.
Своя отговор на него предлага книгата „Матрьошка Си. Слойна система на езика на програмата“. И тя е насочена не само към студентите, но и към подготвени програмисти, тъй като именно те трябва да търсят истината и да променят светогледа си.
Следва кратко съдържание на книгата.
1. Въведение
През 1969 г. беше създаден езикът Си, който стана основополагаещ език за програмиране и остава такъв вече 50 години. Защо е така? На първо място, защото Си е прикладен език, който придава на програмата човешки вид вместо машинен. Това постижение е затвърдено от езици от семейството на Си: C++, JavaScript, PHP, Java, C# и други. На второ място, това е кратък и красив език.
Обаче самият език Си обикновено се смесва с машинен асемблер, което усложнява и изкривява неговото възприятие. Другата крайност е налагане на некоя 'философия' върху езика: процедурна, обектна, функционална, компилируема, интерпретируема, типизирана и т.н. Това добавя емоции, но не помага да се опише по-добре езикът.
Истината е посредата, като за езика Си — строго посредата между философското и машинното възприятие.
Езикът Си не е самостоятелен, той подчинява обичайната писмена реч, а в същото време — сам управлява езика асемблер. Това положение описва Речевата модел на програмата, според който програмата е разделена на три подчинени вида: речеви, кодов, команден. Езикът Си отговаря за втория, кодов вид.
Определяйки мястото на езика в програмата, може да се систематизира информацията за него, което прави Слойна система на езика на програмата, представяща езика Си в духа на системата на Менделеев — на една страница.
Системата е изградена със знанието за общността на прикладните езици, произтичаща от тяхната речева подчиненост. Един набор от единици Матрьошка Си позволява да се описват и сравняват различни езици, създавайки редица Матрьошки: C++, PHP, JavaScript, C#, MySQL, Python и т.н. Достойно и правилно е, че различните езици се описват с единици на основополагаещия език.
2. ГЛАВА 1. Речевата модел на програмата. Разбираем Си
В първата глава е представена речевата модел на програмата, отразяваща приложния подход. Според него програмата има три очевидни последователни вида:
- речеви — пряка реч на програмиста, решаващ задача,
- кодови — кодиране на решението в математически вид на езика Си (или на който и да е друг)
- и командни — непосредствени машинни команди.
Речевата модел обяснява защо Си е прост и разбираем език. Си е построен по образ и подобие на познатата ни човешка реч.
Първият вид програма е пряка реч на програмиста. Речта съответства на човешкото мислене. С помощта на речта пишат програми начинаещите програмисти — първо на български, после стъпка по стъпка превеждайки действията на кодов език. И именно по този образец беше създаден езикът Си.
Умозаключенията на програмиста, изразени в реч, се преобразуват в кодов числов вид. Това преобразуване следва да бъде наречено отразяване, тъй като речта и кодът имат една природа (отразяване — раждане — род). Това е напълно очевидно, ако се сравнят речевият (вляво) и кодовият (вдясно) вид на програмата.

Любопитно е, че отразяването става изключително просто — само с две рода изрази.
Въпреки това, съвременното описание на езика Си (от 1978 година) не съдържа достатъчен списък с названия нито за описанието на езика като цяло, нито за задачата за отразяване по-специално. Затова сме принудени да се заемем с творчество и да въведем тези названия.
Изборът на думи трябва да бъде точен и ясен. За това беше необходим специален подход, кратко изразен така — строга употреба на родния език. За англичаните това ще бъде английски, но ние не сме англичани. Така че ще използваме това, което имаме, и ще се опитваме да говорим на български.
Отразяването се извършва от два рода изрази:
- изчисление (Вч) — отразява промяна в свойствата на предмета. Свойството на предмета се изразява с число, следователно действието над свойството — това е действие над числото — операция.
- подчинение (Пч) — отразява промяна в реда на действията. Прообраз на Пч е речево сложно подчинено изречение, затова повечето видове Пч започват с подчинителни съюзи като „ако“, „иначе“, „докато“, „за“. Други видове Пч ги допълват.
Между другото, можете да повярвате, че в описанието на Си няма наименование за изразите изчисление — те просто се наричат „изрази“? След това вече не бива да се изненадвате от отсъствието на наименование и обединение за рода подчинение, а и изобщо оскъдица в частта на имената, определенията и обобщенията. Всичко това е, защото известният К/Р („Език Си“, Керниган/Ричи, 1978) не е описание, а ръководство за приложение на езика.
Обаче би било хубаво да имаме описание на езика. Затова то предлага Слойна система на езика на програмата.
3. ГЛАВА 2. Слойна система. Кратък Си
Каквото и описание да е, то трябва да бъде точно и максимално кратко. В случая на езика на програмата описанието е затруднено.
Имаме програма. Тя се състои от модули. Модулите се състоят от подпрограми и набори (structure). Подпрограмите се състоят от отделни изрази: декларации, изчисления, зависимости. Има цели десет вида зависимости. Зависимостите свързват поднива и подпрограми. Декларациите също са няколко. Всъщност, декларации не само че се включват в подпрограми и поднива, но и в модули и набори. И повечето изрази се състоят от думи, които е толкова трудно да се опишат, че обикновено се дават просто в два списъка — основни и производни думи, с които предстои да се запознаете през цялото изучаване и прилагане на езика. Добавяме към това пунктуационни знаци и още редица изрази.
В такова изложение е трудно да разбереш кой на кого стои.
Прякото йерархично описание на езика ще бъде прекалено сложно. Търсенето на обходни пътища води до описание на езика на базата на неговата речева природа и командната страна. Така се роди Слойната система, частично съвпадаща с Периодичната система на Менделеев, която също е слойна. Както се оказа 42 години след нейното издаване (1869), периодичността на системата е свързана с електронни слоеве (1911, модел на атома на Бор-Резерфорд). Освен това, Слойната и Периодичната системи споделят таблично разположение на всичките единици на една страница.
Описание на единиците на езика е кратко — само 10 рода изрази и 8 рода други единици, а също така съдържателно и нагледно. Въпреки това, е необичайно за първата запознатост.
Единиците на езика са разделени на 6 нива:
- отряди — редове в таблицата
- отдели — специални групи родове (части от първия ред)
- рода — клетки (главно ниво на делене)
- надвидове — разделители на видове (рядко ниво)
- видове — формули на единици в долната част на клетката или отделно
- образци — самите единици (само за думи)
Образците на думи описва речник — отделна подсистема, съставена от същите шест нива.
Речевата съставка на езика Си е напълно очевидна, въпреки че пак заслужава описание. А командната част на езика е свързана с управлението на компилацията, по време на която се създава третият вид програма — командна. Тук приближаваме до най-вълнуващата страна на езика Си — красотата.
4. ПОСЛЕДВАЩИ ГЛАВИ. Красивият Си
Езикът Си лежи в основата на съвременното програмиране. Защо? Първо, поради най-високото съответствие на езика. Второ, защото успешно преодолява ограниченията на машинната обработка на числа.
Какво точно предлага Си? Образ и слой.
Думата "образ" е превод на английската дума "type", която произлиза от гръцкото "прототип" — "модел". В българския език думата "тип" не предава достатъчно точно изразяваното понятие, освен това се обърква с служебното значение "вид".
Първоначално образът решаваше чисто машинска задача за изчисление, а след това стана стартова площадка за появата на обектно-ориентирани езици.
Слоят веднага решаваше няколко задачи — както машинни, така и приложни. Затова разглеждането ще започне с еднозадачен образ и ще премине към многозадачен слой.
Едно от неприятните качества на историческото програмиране е, че повечето понятия, включително основните, се дават без определения. "Програмен език (името на реките) има целочислен и плаващ тип числа..." — и продължават нататък. Какво е "тип" (образ) — не е задължително да се определя, защото авторите самите не го разбират напълно и ще го пренебрегнат "за яснота". Ако ги притиснат до стената, ще дадат размито и безполезно определение. Много помага да се скриеш зад чужди думи: за руските автори — зад английските (тип), за англичаните — зад френските (subroutine), гръцките (полиморфизъм), латинските (инкапсулация) или техните комбинации (полиморфизъм ad-hoc).
Но това не е нашата съдба. Нашият избор са определения с повдигната забрава на чист български език.
Образ
Образ — това е образуващо име за величина, определящо 1) собствените свойства на величината и 2) подбор на операции към величината.
На словото "тип" (вид) съответства първата част от определението: "собствени свойства на величината". Но основният смисъл на образа — е във втората част: "подбор операции към величините".
Отправна точка за въвеждането на образа в езика Си — е обичното изчисление, например, операцията събиране.
Хартиена математика, записвана на ръка или печатана, не прави особени разлики между видовете числа, обикновено считано ги за действителни. Затова операциите им за обработка са еднозначни.
Машинна Математиката строго разделява числата на цели и дробни. Различните видове числа се съхраняват по различен начин в паметта и се обработват от различни команди на процесора. Например, командите за събиране на цели и дробни числа са две различни команди, съответстващи на две различни единици на процесора. Въпреки това, команда за събиране на цяло и дробно число липсва.
Прилагана математика, тоест езикът Си, разделя видовете числа, но обединява операциите: събирането на цели и/или дробни числа се записва с един и същи оператор.
Ясното определение на понятието образ позволява да се говори определено за две други понятия: величина и операция.
Величина и операция
Величина — обработвано число.
Операция — обработка на стойностите на входните величини (аргументи), за да се получи крайното число (резултат).
Величината и операцията са взаимосвързани. Всяка операция е величина, тъй като има числов резултат. А всяка величина е резултат от предаването на стойността в регистъра на процесора/от процесора, тоест — резултат от операция. Въпреки тази взаимовръзка, все пак основното е възможността за тяхното отделно описание, макар и с повторение на една и съща дума в различни секции на речника, което се случва в ма3.
Машинният подход разделя всички числа, използвани от програмиста, на команди и данни. Преди и двете бяха именно числа, например, командите бяха написани с числови кодове. Въпреки това в приложните езици командите престанаха да бъдат числа и станаха думи и оператори. Само "данните" останаха числа, но продължаването да ги наричаме така е абсурдно, защото при прехода от машинна към математическа перспектива числата са величини, които се делят на входни (данни) и крайни (изисквани). "Непознато данно" — това би звучало глупаво.
Командите също се разделиха на два вида действия: математически и служебни. Математическите действия — операции. За служебните ще се обърнем по-късно.
В езиците Си обичайната бюрократска и машинна еднозначна, или единична, математическа операция почти изцяло става множестна.
Множествени операции – няколко едноименни операции с различни образи на аргументите и различни, близки по смисъл, действия.
Целите на аргументи отговарят на целите операции, при дробните — дробни. Тази разлика е особено очебийна при операцията деление, когато изразът 1/2 дава резултат 0, а не 0,5. Тази форма не отговаря на правилата на училищната математика, но езикът C не се стреми да ги спазва (в отличие от Fortran) — той играе по свои прилагани правила.
В случай на смесване на цели и дробни числа се включва единствено правилното привеждане на стойностите на аргументите — селективна трансформация на стойността от един вид в друг. Действително, при събиране на цяло и дробно число резултатът е дробен, затова формата на операцията избира операцията за преобразуване на целия аргумент в дробна стойност.
Някои операции остават не множество, а единични. Такива операции са дефинирани само за един вид аргументи: остатък от делението — за цели аргументи, побитови операции — за естествени цели. Ма3 показва множествеността на операциите с знаците (#^) с указание за формите, за които операцията е определена. Това е важно, но пропуснато досега свойство на всяка операция.
Всички функции са произволни единични операции. Изключението са операторите — безскобочни функции, вградени в езика (изходни операции).
Содействието
Содействието — придружаващо действие на операцията.
Ако разглеждаме операцията като основно действие, можем да отличим две придружаващи, които осигуряват операцията и се различават от нея. Това е 1) управление на променлива и 2) подчинение. Такова действие се нарича содействие..
Тук трябва да се отклоним и отделно да говорим за руски преводи на учебници по програмиране. В текста К/Р за запис на действия е въведена нова дума statement (израз), която направи опит да раздели понятието за машинна команда на различни действия: 1) операция, 2) декларация и 3) подчинение (наречено „управляващи конструкции“). Тази опит беше погребан от руските преводачи, заменяйки „израз“ с думата „оператор“, която:
- стана синоним на машинната дума „команда“,
- стана синоним на словосъчетанието „знак на действие“,
- и също получи неограничено количество допълнителни значения. Тоест, се превърна в подобие на английския артикул „ъъм...“.
Нека разгледаме съпътстващите действия, или содействия..
Управление на променна.
Управление на променна. (УП) — създаване/изтриване на променливи.
УП се извършва неявно при деклариране на променлива, което вече се пише по друга причина — за указване на подвижността на величината. Явно се управлява само един вид допълнителни променливи чрез функциите malloc() и free().
Трябва да се отбележи, че неявните действия са по-удобни за написване, тъй като изобщо не изискват нищо да бъде написано, но са по-трудни за разбиране — по-трудно се отчитат и интерпретират.
Подчинение
Подчинение — свързване/разкачване на слойни раздели.
Езикът C предлага различен от асемблера, практичен начин за управление на реда на действията — подчинение. То отразява и развива речевото сложно-съчинено изречение с явно разделение на основната част (предложение подчинение) и придатъчната част (раздели подниво/подпрограма).
Както декларацията, така и подчинението са напълно изградени на понятието слой.
Слой
Слой — това е ограничен едноуровнев селективен набор от изрази.
Слоят явно и неявно поема изпълнението на няколко задачи наведнъж:
- подреждане на програмата,
- ограничаване на видимостта на имената (неявно),
- управление на променливите (паметни клетки) (неявно),
- определяне на придатъчни раздели за подчинение,
- определения на функции и избрани и други.
В машинните езици не е имало понятие слой, затова то не се е появило и в К/Р, а ако нещо не е съществувало там — въвеждането му в последващите книги би било ерес и лекомислие. Затова понятието слой изобщо не се е появило, въпреки че е крайно полезно и напълно очевидно.
Без слой е невъзможно кратко и ясно да се обяснят много действия и правила на програмата. Например, защо простият като три копейки goto е лош, а сложният while е добър. Може само безсилно да се ругае, както правеше Дейкстра („квалификацията на програмистите е функция, обратно зависеща от честотата на появата на операторите goto в техните програми“. По същество, само кози използват goto. Нивото на обосновка е Бог.) Истина е, че не е толкова страшно, ако вашите книги изобщо не трябва да обясняват нищо, но, както вече казахме, това не е нашата съдба.
Между прочим, можно предположить, че Дън Ричи е оставил goto именно като ключ за търсене на неясно понятие, тъй като нямаше никаква необходимост или красота в израза goto. Напротив, имаше нужда от просто и ясно обяснение на новите принципи на езика, които самият Ричи не искаше да дава и които всъщност се основават на понятието слой.
Отклонение
Отклонение — изменение на обичайните свойства на новото име.
Най-важното отклонение е свързано със слойните свойства на програмата и се описва с една дума „static“, която има различно значение в различните видове слоя.
5. ПОСЛЕДНА ГЛАВА. Обща характеристика на приложните езици
Приложните езици — това са образни езици (които имат образ, „типизирани“). Те се основават на явно или неявно използване на образа. И тук отново се проявява противоречие: явният образ е по-разбираем, но по-малко удобен, и обратно.

(Оформлението на таблицата все още не беше доведено, така че таблицата е предоставена като изображение.)
След Си, развитието на приложните езици продължи по пътя на увеличаване на тяхната образност. Най-важен за разбирането на високообразността е пряк потомък на Си — езикът С++. Той развива идеята за произволно подбиране на операции за величини и я осъществява на базата на Си-израза за подбора, който получава новото име — обект. Въпреки това, Си++ не е толкова кратък и изразителен, колкото Си, поради натоварването с нови видове подбор и свързаните с тях правила. Нека поговорим за „натоварването“.
Натоварване и полиморфизъм
Думата „натоварване“ (overload) е остарял термин от машинния подход, обозначаващ създаването на множество операции.
Машинни (системни) програмисти множество операции могат да дразнят: „Какво означава този знак (+): събиране на цели числа, събиране на дробни числа или изобщо преместане?! В наше време така не пишеха!“ Оттук идва отрицателният оттенък на избраната дума („прекаляване“, „омръзнал съм“). За приложния програмист множествените операции са основен камък, основно постижение и наследство на езика Си, толкова естествени, че често не се осъзнават.
В езика Си++ множество Разпространението се разпространи не само върху основните операции, но и върху функциите — както отделни, така и обединени в класове — методи. Възможността за повторно определяне на многобройните методи в разширените класове, която беше неясно наречена «полиморфизъм», се появи заедно с тях. Комбинацията от полиморфизъм и презареждане осигури експлозивна смес, която се раздели на два вида полиморфизъм: «истински» и «ad-hoc». Разбирането на това може да стане само в противоречие с приписаните имена. Думите от чужди езици осигуряват пътя в ad.
Обявление от типа «презареждане» е по-добре да се изрази с думата допълнително обявление — добавящо обявление на функция с идентично име, но с аргументи на друг вид.
Обявление от типа «полиморфизъм» е по-добре да се нарече с думата преповторение — покриващо обявление в новия разширяващ слой на функция с идентично име, но с аргументи на същия вид.
Тогава ще бъде лесно да се разбере, че методите с идентично име на различни видове (аргументи) — допълнително се обявяват, а на един вид — преповтарят.
Руски думи решават.
Излетна ивица
Разглеждането на концепции за високообразни езици потвърдва важността на ясното определяне на основополагаещите понятия. С правилно описания С, изучаването на високообразни езици ще бъде лесно и приятно.
Особено важно е за неявни високообразни езици (PHP, JavaScript). За тях важността на обектите (съставни образи) става още по-голяма, отколкото в С++, но самото понятие за образ става неявно и трудноуловимо. От гледна точка на удобството, те станаха по-прости, а от гледна точка на разбирането — по-сложни.
Затова изучаването на програмни езици трябва да започне с езика С и да продължи по реда на появяване на езиците от семейството на С.
Същото важи и за описанието на езиците. Различните езици имат съвпадащ или по-малък набор от родове единици от езика С. Броят на видовете и образците може да се различава в двете посоки: С++ има повече видове от С, а JavaScript — по-малко.
Особено внимание заслужава езикът MySQL. На пръв поглед — нищо общо, но той се описва прекрасно с Матрьошка и запознаването с него става по-бързо и по-лесно. Както е важно с оглед влиянието му върху уеба — основната улица на съвременното програмиране. А където е MySQL, там са и другите SQL. И всякакви фортрани-паскали-питони също се описват с Матрьошка, щом стигнат ръцете.
Така че ни очакват велики дела — практическо описание на езика Си и единно описание на следващите езици. „Нашите цели са ясни, задачите определени. Назад на работа, другари! (Силни, продължителни аплодисменти, преминаващи в овации. Всички стават.)“
Вашите мнения ще бъдат изслушани с голямо внимание, вашата помощ в създаването на сайта на матрьошките ще бъде приета с огромна благодарност. По-подробна информация за книгата е налична на сайта, хитро скрит в Матрешка Си.
Източник: habr.com
