Матрьошка Си. Слойна система на езика на програмата

Нека опитаме да си представим химията без Периодичната система на Менделеев (1869). Колко елемента трябваше да се държат в главата, и то в произволен ред... (Тогава — 60.)

За това е достатъчно да помислим за един или няколко езика за програмиране наведнъж. Същите чувства, същият творчески хаос.

А сега можем да изживеем чувствата на химиците от XIX век, когато им бъде предложено всичкото им знание, и малко отгоре, в една Периодична таблица.

Матрьошка Си. Слойна система на езика на програмата


Книгата "Матрешка Си. Слойна система на езика на програмата" представя всичките единици на езика Си като на длан. Това позволява да ги подредим, да поправим остарелите сведения и дори да уточним самото понятие за програма.

Днес информацията по програмиране се нуждае от систематизиране дори повече, отколкото химическите елементи преди 150 години.

Първата необходимост — преподаването. Менделеев започна създаването на своята система, когато се изправи пред въпроса — от кой елемент да започне да чете лекции: O, H, N, He, Au… В същото време бе по-лесно за него — той учеше химия на най-добрите студенти от Университета в СПб. А програмирането вече се преподава в училище и скоро ще започне в детските градини.

Втората необходимост — научен подход. С помощта на Периодичната система бяха открити нови елементи и бяха коригирани сведенията за старите. Тя помогна в създаването на модела на атома (1911). И така нататък.

Третата необходимост — уточняване на понятието за програма.

Съвременното програмиране с единия крак е заседнало в 50-те години на XX век. Тогава програмите бяха простички, а машините и машинните езици — сложни, затова всичко се въртеше около машините и езиците.

Сега е всичко обратно: програмите — сложни и първични, езици — прости и вторични. Това се нарича приложен подход, който сякаш всеки познава. Но студентите и разработчиците продължават да бъдат убеждавани, че всичко си остава по старому.

Това ни връща към първата лекция на приват-доцента Менделеев. Какво да кажем на първокурсниците? Къде е истината? Ето в това е въпросът.

Своя отговор на него предлага книгата "Матрешка Си. Слойна система на езика на програмата". Освен това, тя е насочена не само към студентите, но и към подготвените програмисти, тъй като именно те, т.е. ние, трябва да търсят истината и да преобръщат светогледа си.

Следва кратко съдържание на книгата.

1. Въведение

През 1969 година беше създаден езикът Си, който стана основополагающ език за програмиране и остава такъв вече 50 години. Защо е така? На първо място, защото Си е прикладен език, който придава на програмата човешки външен вид вместо машинен. Това постижение бе утвърдено от езици от семейството на Си: C++, JavaScript, PHP, Java, C# и други. На второ място, това е кратък и красив език.

Обаче самият език Си обикновено се смесва с машинен асемблер, което усложнява и из distorted неговото възприятие. Другата крайност е налагането на каквато и да е "философия" към езика: процедурна, обектна, функционална, компилирана, интерпретирана, типизирана и т.н. Това добавя емоции, но не помага да се опише по-добре езика.

Истината е някъде по средата, а за езика Си — строго посредата между философското и машинното възприятие.

Езикът Си не е самостоятелен, той подчинява обикновената писмена реч, а едновременно с това сам управлява езика на асемблер. Това положение описва Моделът на речта на програмата, според който програмата е разделена на три подчинени вида: речеви, кодов и команден. Езикът Си отговаря за втория, кодов вид.

Определяйки мястото на езика в програмата, можем да подредим информацията за него, което прави Слойната система на езика на програмата, представляваща езика Си в духа на системата на Менделеев — на една страница.

Системата е построена с оглед на общността на приложните езици, произтичаща от тяхното речево подчинение. Един набор единици на Матрьошката Си позволява да опишем и сравним различни езици, създавайки редица Матрьошки: 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) подбор операции към величината.

На думата «тип» (вид) отговаря първата част от определението: «собствени свойства на величината». Но основният смисъл на образа е във втората част: «подбор операции към величините».

Отправната точка за въвеждането на образа в езика Си е обикновено изчисление, например, операцията събиране.

Хартиена математика, записвана от ръка или печатана, не прави особен distinction между видовете числа, обикновено приемайки ги за веществени. Затова операциите им на обработка са еднозначни.

Машинна математиката строго разделя числата на цели и дробни. Различните видове числа се съхраняват по различен начин в паметта и се обработват от различни команди на процесора. Например, командите за събиране на цели и дробни числа са две различни команди, съответстващи на два различни модула на процесора. Обаче командата за събиране на цяло и дробно число отсъства.

Приложна математика, т.е. езикът Си, разделя видовете числа, но обединява операциите: събирането на цели и/или дробни числа се записва с един знак за действие.

Ясното определение на понятието образ позволява определено да се говори за две други понятия: величина и операция.

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

Величина — обработваното число.

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

Величината и операцията са взаимосвързани. Всяка операция е величина, тъй като има числов резултат. А всяка величина е резултат от прехвърлянето на стойността в регистъра на процесора/из процесора, т.е. — резултат от операция. Въпреки тази взаимовръзка, основната остава възможността за тяхното отделно описание, макар и с повторение на една и съща дума в различни части на речника, което и се случва в ма3.

Машинният подход разделя всички числа, използвани от програмиста, на команди и данни. Преди и двете бяха точно числа, например, командите се записваха с числови кодове. Обаче в приложните езици командите престанаха да бъдат числа и станаха думи и знаци за действия. Числата останаха само "данни", но продължението на наричането им по този начин е нелепо, тъй като при преминаването от машинна към математическа гледна точка числата са величини, които се делят на входни (данни) и крайни (търсени). "Неизвестно данно" — това ще звучи глупаво.

Командите също се разделиха на два вида действия: математически и служебни. Математическите действия — операции. Към служебните ще се върнем по-късно.

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

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

Целите аргументи съответстват на цяла операция, дробните — на дробна. Това разминаване е особено отчетливо при операцията деление, когато изразът 1/2 дава резултат 0, а не 0,5. Такава запис не отговаря на правилата на традиционната математика, но езикът C не се стреми да ги спазва (в отличие от Fortran) — той играе по свои практически правила.

В случай на смесване на цели и дробни числа се активира единствено правилното привеждане на стойностите на аргументите — подборно преобразуване на стойността от един вид в друг. Всъщност, при събирането на цяло и дробно число резултатът е дробен, затова формата на операцията подбира операцията за преобразуване на целия аргумент в дробна стойност.

Поредицата от операции остава неп многобройни, а единични.. Такива операции се определят само за един вид аргументи: остатък от деление — цели аргументи, побити операции — натурални цели. Ма3 обозначава многобройността на операциите със знаци (#^) с указание на формите, за които операцията е определена. Това е важно, но досега игнорирано свойство на всяка операция.

Всички функции са произволни единични операции. Изключение правят операторите — безскобочни функции, вградени в езика (сходни операции).

Съдействие

Съдействие — спомагателно действие на операцията.

Ако се разглежда операцията като основно действие, могат да се откроят две спомагателни, които осигуряват операцията и се различават от нея. Това е 1) управление на променливата и 2) подчинение. Такова действие се нарича съдействие..

Тук трябва да се отклоним и отделно да споменем руските преводи на учебници по програмиране. В текста на К/Р за запис на действия беше въведено ново слово statement (израз), което направи опит да раздели понятието за машинна команда на различни действия: 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.

Обявлението от вида „наддаване“ е по-добре да се изрази с думата добавяне на заявление – добавящо заявление на едноименната функция с аргументи от друг вид.

Обявлението от вида „полиморфизъм“ е по-добре да се нарече переопределение – припокриващо обявление в новия разширяващ слой на едноименната функция с аргументи от същия вид.

Тогава ще бъде лесно да се разбере, че едноименните методи на различни образи (аргументи) – добавят, а на един образ – переопределят.

Руски думи решават.

Летище

Разглеждането на понятията на високо образни езици потвърджава важността на ясното определяне на основополагаещите понятия. С правилно описан C, изучаването на високо образните езици ще бъде лесно и приятно.

Особено важно е за неявните високо образни езици (PHP, JavaScript). За тях важността на обектите (съставни образи) става още по-голяма, отколкото в C++, но самото понятие за образ става неявно и трудно уловимо. От гледна точка на удобство, те станаха по-прости, но от гледна точка на разбирането – по-сложни.

Затова изучаването на програмни езици трябва да започне с езика C и да се продължи в реда на появата на езици от семейството на C.

Същото важи и за описанието на езици. Различните езици имат съвпадащ или по-малък набор от родове единици от C. Броят на видовете и образците може да варира в двете посоки: C++ има повече видове от C, а JavaScript – по-малко.

Особено внимание заслужава езикът MySQL. Изглежда, че няма нищо общо, но той прекрасно се описва с Матрьошката и запознаването с него става по-бързо и по-лесно. Важно е, като се има предвид значението му за уеба – основния път на съвременното програмиране. А там където е MySQL, са и останалите SQL. Също така, всякакви фор транове, паскал и питони също могат да бъдат описани с Матрьошката, стига времето да позволи.

Така че, ни чакат велики дела - приложно описание на езика Си и единно описание на следващите езици след него. «Нашите цели са ясни, задачите определени. На работа, другари! (Бурни, продължителни ръкопляскания, преминаващи в овация. Всички стават.)»

Вашите мнения ще бъдат чути с голямо внимание, вашата помощ в създаването на сайта на матрьошките ще бъде приета с огромна благодарност. По-подробна информация за книгата е налична на сайта, хитро скрит в матрьошката Си.

Източник: habr.com

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster