Poskusimo si predstavljati kemijo brez Periodične tabele Mendelejeva (1869). Koliko elementov bi bilo treba imeti v mislih, in to v poljubnem redu... (Takrat - 60.)
Zadostuje, da pomislite na enega ali več programskih jezikov. Enaki občutki, tista sama ustvarjalna zmeda.
Sedaj lahko doživimo občutke kemičarjev 19. stoletja, ko so jim ponudili vse njihovo znanje, in še malo več, v eni Periodični tabeli.

Knjiga 'Matrioshka C. Plastenjski sistem programske jezika' predstavlja vse enote jezika C, kot bi bile na dlani. To omogoča, da jih uredimo, popravimo zastarele informacije in celo natančneje opredelimo samo pojmo programa.
Danes informacije o programiranju potrebujejo sistematizacijo še bolj kot kemični elementi pred 150 leti.
Prva nujnost - poučevanje. Mendelejev je začel ustvarjati svoj sistem, ko se je soočil z vprašanjem - s katerim elementom začeti predavati: O, H, N, He, Au... Pri tem je bilo njemu lažje - poučeval je kemijo najboljše - študente SPb univerze. Programiranje pa že poučujejo v šoli in kmalu začnejo v vrtcih.
Druga nujnost - znanstveni pristop. S pomočjo Periodične tabele so odkrili nove elemente in popravili podatke o starih. Pomagala je pri ustvarjanju modela atoma (1911). In tako naprej.
Tretja nujnost - natančnejša opredelitev pojma programa.
Sodobno programiranje je z eno nogo zastalo v 50-ih letih 20. stoletja. Takrat so bile programe preproste, stroji in strojni jeziki pa zapleteni, zato je vse krožilo okoli strojev in jezikov.
Sedaj je vse obratno: programe so zapletene in primarne, jeziki pa so preprosti in sekundarni. To se imenuje aplikativni pristop, ki je vsem nekoliko znan. A študente in razvijalce še naprej prepričujejo, da je vse še vedno tako.
Kar nas vrača k prvi predavanji privatnega docenta Mendelejeva. Kaj povedati prvaškim študentom? Kje je resnica? To je vprašanje.
Svoj odgovor na to ponuja knjiga 'Matrioshka C. Plastenjski sistem programske jezika'. Poudariti je treba, da je ta namenjena ne le študentom, ampak tudi usposobljenim programerjem, saj morajo resnico iskati in prevrniti svetovni nazor prav oni, torej mi.
Naslednje sledi kratko povzetek knjige.
1. Uvod
V letu 1969 je bil ustvarjen jezik C, ki je postal temeljni programski jezik in že 50 let ostaja tak. Zakaj je to tako? Predvsem zato, ker je C praktičen jezik, ki programom daje človeški videz namesto strojnega. To dosežek so potrdili jeziki iz družine C: C++, JavaScript, PHP, Java, C# in drugi. Drugič, to je kratek in lep jezik.
Vendar pa se sam jezik C običajno zameša z strojno asemblerjem, kar otežuje in izkrivlja njegovo dojemanje. Druga skrajnost je vsiljevanje neke 'filozofije' jeziku: procedurne, objektne, funkcionalne, kompajlirane, interpretirane, tipizirane in tako naprej. To dodaja čustva, vendar ne pomaga bolje opisati jezika.
Resnica se nahaja na sredini, in sicer za jezik C — strogo na sredini med filozofskim in strojnih dojemanjem.
Jezik C ni samostojen, podrejen je običajnemu pisnemu govoru, hkrati pa sam upravlja jezik asemblerja. To stanje opisuje Govorna model programa, po katerem je program razdeljen na tri podrejene tipe: govorni, kodni, ukazni. Jezik C odgovarja za drugi, kodni tip.
Ko določite mesto jezika v programu, lahko uredite informacije o njem, kar omogoča Plastna sistem programa, ki predstavlja jezik C v duhu Mendeljejevega sistema — na eni strani.
Sistem je zgrajen ob upoštevanju skupnosti praktičnih jezikov, ki izhaja iz njihove govorne podrednosti. En sklop enot Matrioške C omogoča opisovanje in primerjanje različnih jezikov, kar ustvarja niz Matriošk: C++, PHP, JavaScript, C#, MySQL, Python in tako naprej. Pravično je in prav, da so različni jeziki opisani z enotami temeljnega jezika.
2. GLAVA 1. Govorna model programa. Razumljiv C
V prvem poglavju je predstavljena govorna model programa, ki odraža praktičen pristop. Po njem ima program tri očitne zaporedne tipe:
- govorni — neposredna govor programerja, ki rešuje nalogo,
- kodni — kodiranje rešitve v matematični obliki v jeziku C (ali kateremkoli drugem)
- in ukazni — neposredni strojni ukazi.
Govorna model pojasnjuje, zakaj je C preprost in razumljiv jezik. C je zgrajen po vzoru in podobni naši običajni človeški govor.
Prvi tip programa je izravni govor programera. Govor je u skladu s ljudskim razmišljanjem. Pomoću govora pišu programe početnici — najprije na ruskom, a zatim postupno prevodeći radnje na programski jezik. I prema tom uzorku je stvoren jezik C.
Zaključci programera, izraženi govorom, pretvaraju se u kodni brojčani oblik. Ovu transformaciju treba nazvati odrazom, budući da govor i kod imaju jednu prirodu (odraz — rođenje — rod). To je sasvim očito kada se usporede govorni (s lijeve strane) i kodni (s desne strane) oblici programa.

Zanimljivo je da se odraz odvija vrlo jednostavno — samo s dva roda izraza.
Međutim, moderno opisivanje jezika C (od 1978. godine) ne sadrži dovoljan popis naziva ni za opis jezika uopće, ni za zadatak odraza posebno. Stoga smo prisiljeni suočiti se s kreativnošću i uvesti te nazive.
Izbor riječi mora biti točan i jasan. Za to je potreban poseban pristup, koji se može ukratko izraziti ovako — strogo korištenje materinjeg jezika. Za Engleze bi to bio engleski, ali mi nismo Englezi. Dakle, koristimo ono što imamo i trudimo se govoriti ruski.
Odraz se izvršava s dva roda izraza:
- računanje (Rč) — odražava promjenu svojstava predmeta. Svojstvo predmeta izražava se brojem, tada je radnja nad svojstvom — to je radnja nad brojem — operacija.
- podčinjenje (Pč) — odražava promjenu reda radnji. Predložak Pč je složena rečenica, pa većina vrsta Pč počinje s podrednim veznicima "ako", "inače", "dok", "za". Druge vrste Pč ih dopunjuju.
Usput, možete povjerovati da u opisu C nema naziva za izraze računanje — jednostavno se nazivaju "izrazi"? Nakon toga već ne iznenađuje nedostatak naziva i kombinacija za rod podčinjenje, a ni općenito oskudica u nazivu, definicijama i generalizacijama. Sve zbog toga što poznati K/R ("Jezik C", Kernighan/Ritchie, 1978) nije opis, već priručnik za korištenje jezika.
Međutim, ipak bismo željeli imati opis jezika. Stoga ga nudi Plastna sistem programa.
3. GLAVA 2. Slojni sustav. Kratki C
Svaki opis mora biti točan i izuzetno kratak. U slučaju jezika programa, frontalni opis je otežan.
Tukaj imamo program. Sestavljen je iz modulov. Moduli so sestavljeni iz podprogramov in zbirk (structure). Podprogrami so sestavljeni iz posameznih izrazov: izjav, izračunov in podrejenih. Podrejenih je kar deset vrst. Podrejenja vključujejo podravni in podprogrami. Izjav je tudi več. Vendar pa se izjave ne vključujejo le v podprograme in podravne, temveč tudi v module in zbirke. In večina izrazov je sestavljena iz besed, katerih opis je tako zapleten, da jih običajno preprosto predstavimo v dveh seznamih – izvorne in izpeljane besede, s katerimi se bomo spoznali skozi celotno učenje in uporabo jezika. Dodajmo k temu še ločila in še vrsto izrazov.
V takšnem prikazu ni enostavno razumeti, kdo je bil kdo.
Neposreden hierarhični pristop k opisovanju jezika bi bil preveč zapleten. Iskanje ovinkastih poti pripelje do opisa jezika na osnovi njegove govorne narave in ukazne plati. Tako je nastala Plastična sistem, delno sovpadajoča s Periodičnim sistemom Mendelejeva, ki je prav tako plastna. Kot se je izkazalo 42 let po njenem izidu (1869), je periodičnost sistema povezana z elektronskimi plastmi (1911, model atoma Bohr-Rutherford). Prav tako Plastični in Periodični sistem združuje tabelarična struktura vseh enot na eni strani.
Opis enot jezika je kratek – le 10 rodov izrazov in 8 rodov drugih enot, ter hkrati vsebinski in pregleden. Čeprav nenavaden za prvo srečanje.
Enote jezika so razdeljene na 6 ravni:
- razredi – vrstice tabele
- oddelki – posebne skupine rodov (del prve vrstice)
- rodi – celice (glavna raven delitve)
- nadvrste – ločevalci vrst (redka raven)
- vrste – formule enot na dnu celice ali posebej
- primerki – same enote (samo za besede)
Primerke besed opisuje slovar – ločen podz sistem, sestavljen iz istih šestih ravni.
Govorna sestavina jezika C je povsem očitna, čeprav vseeno zasluži opis. Del ukazov jezika pa je povezan z upravljanjem prevajanja, pri čemer nastane tretja vrsta programa – ukazna. Tukaj pridemo do najbolj fascinantnega dela jezika C – lepote.
4. NASLEDNJA GLAVA. Lep C
Jezik C leži u osnovi modernog programiranja. Zašto? Prvo, zbog najveće usklađenosti s jezikom. Drugo, jer se elegantno nosi s ograničenjima mašinske obrade brojeva.
Šta je tačno C ponudio? Tip i sloj.
Reč „tip“ je prevod engleske reči „type“, koja potiče od grčkog „prototypo“ — „uzor“. U srpskom jeziku reč „tip“ ne prenosi suštinsko značenje izražene ideje, a takođe se meša sa službenim značenjem „vrsta“.
U početku je tip reševao isključivo mašinski problem izračunavanja, a zatim je postao uzletna pista za nastanak objektno-orijentisanih jezika.
Sloj je odmah rešavao nekoliko zadataka — i mašinskih i primenjenih. Zato će razmatranje početi od jednonamenskog tipa i preći na višenamenski sloj.
Jedna od neprijatnih osobina istorijskog programiranja je ta da se većina pojmova, uključujući osnovne, daje bez definicija. "Programsko jezgro (ime reka) ima ceo i decimalni tip brojeva..." — i nastavi dalje. Šta je “tip” (oblik) — nije obavezno definisati, jer autori to sami ne razumeju do kraja i zamagljuju „da bi bilo jasnije“. Ako ih pritisnete, dajeće nejasne i beskorisne definicije. Veoma pomaže sakriti se iza stranih reči: za ruske autore — iza engleskih (tip), za Engleze — iza francuskih (subroutine), grčkih (polimorfizam), latinskih (enkapsulacija) ili njihovih kombinacija (polimorfizam ad-hoc).
Ali to nije naša sudbina. Naš izbor — definicije sa podignutim štitom na čistom srpskom jeziku.
Slika
Slika — to je uzorak imena veličine koji određuje 1) sopstvena svojstva veličine i 2) izbor operacija za veličinu.
Reči „tip“ (vrsta) odgovara prvi deo definicije: „sopstvena svojstva veličine“. Ali glavno značenje tipa je u drugom delu: „izbor operacija za veličine“.
Polazna tačka za uvođenje tipa u jeziku C — uobičajeno izračunavanje, na primer, operacija sabiranja.
Papirna matematika, zapisana ručno ili kucana, ne pravi posebnu razliku između vrsta brojeva, obično smatrajući ih realnim. Stoga su operacije njihove obrade jednoznačne.
Mašinska Matematika strogo loči številke na cele in decimalne. Različne vrste števil se shranjujejo v spomin in obravnavajo z različnimi ukazi procesorja. Na primer, ukazi za seštevanje celih in decimalnih števil so dve različni ukazni, ki sta povezani z dvema različnima enotama procesorja. Vendar pa ukaza za seštevanje celotnega in decimalnega argumenta ni.
Praktična matematika, torej jezik C, loči vrste števil, vendar združuje operacije: seštevanje celih in/ali decimalnih števil se zapiše z enim znakom delovanja.
Jasna definicija pojma 'oblika' omogoča, da jasno govorimo o dveh drugih pojmih: veljavnost in operacija.
Veljavnost in operacija
Veljavnost — obdelana številka.
Operacija — obdelava vrednosti izvornih veljavnosti (argumentov) za pridobitev končne številke (rezultata).
Veljavnost in operacija sta med seboj povezani. Vsaka operacija je veljavnost, saj ima numerični rezultat. Vsaka veljavnost pa je rezultat prenosa vrednosti v register procesorja/iz procesorja, torej — rezultat operacije. Kljub tej povezanosti pa je ključnega pomena možnost njihovega ločenega opisa, čeprav z ponavljanjem iste besede v različnih oddelkih slovarja, kar se dogaja v ma3.
Strojni pristop je delil vse številke, ki jih uporablja programer, na ukazov in podaci. V preteklosti so bili tako eni kot drugi pravzaprav številke, na primer, ukazi so bili zapisani z numeričnimi kodi. Vendar so v aplikativnih jezikih ukazi prenehali biti številke in postali besede in znaki dejanj. Številke so ostale samo 'podatki', toda nenehno jih imenovati tako je absurdno, saj pri prehodu od strojne do matematične perspektive številke postanejo velikosti, ki jih delijo izvorne (podaci) in končne (iskane). 'Neznan podatek' — to bi slišalo neumno.
Ukazi so se prav tako razdelili na dve vrsti dejanj: matematične in službene. Matematična dejanja so operacije. O službenih se bomo pozneje vrnili.
V jezikih C se običajne papirnate in strojne nedvoumne, ali enojne, matematične operacije skoraj skoraj vedno pretvorijo v mnogotere.
Mnogotere operacije – več enakih operacij z različnimi oblikami argumentov in različnimi, po pomenu povezanimi dejanjimi.
Celoštevnim argumentom ustrezajo celoštevilčne operacije, decimalnim pa decimalne. Ta razlika je še posebej očitna pri operaciji deljenja, ko izraz 1/2 da rezultat 0, namesto 0,5. Takšna zapis ne ustreza pravilom papirnate matematike, vendar jezik C ne stremi k njihovemu spoštovanju (v nasprotju s Fortranom) — igra po svojih aplikativnih pravil.
V primeru mešanja celih in decimalnih števil se vklopi edino pravilno prikazovanje vrednosti argumentov — selektivno pretvorbo vrednosti iz ene oblike v drugo. Res je, da pri seštevanju celega in decimalnega števila rezultat — decimalno, zato se oblika operacije prilagodi operaciji pretvorbe celega argumenta v decimalno vrednost.
Vrsta operacij ostaja ne večkratne, a enotne. Takšne operacije so opredeljene le za en tip argumentov: ostanek deljenja — cela števila, ukaz (bitne operacije) — naravna cela števila. Ma3 označuje večkratnost operacij z znaki (#^) z navedbo oblik, za katere je operacija opredeljena. To je pomembna, a prej spregledana lastnost vsake operacije.
Vse funkcije so poljubne enotne operacije. Edina izjema so operatorji — brezskobčne funkcije, vgrajene v jezik (izvorne operacije).
Pomoč
Pomoč — spremljajoče dejanje operaciji.
Če gledamo operacijo kot osnovno dejanje, lahko izpostavimo dve spremljajoči, ki podpirata operacijo in se razlikujeta od nje. To sta 1) upravljanje spremenljivke in 2) podrejanje. Takšno dejanje se imenuje pomoč.
Tukaj je treba odstopiti in posebej omeniti ruske prevode učbenikov o programiranju. V besedilu K/R so za zapis dejanj uvedli novo besedo statement (izraz), ki je poskušal razdeliti pojme strojne ukaze na različne dejavnosti: 1) operacijo, 2) napoved in 3) podrejanje (imenovano „nadzorne strukture“). Ta poskus so pokopali ruski prevajalci, nadomestivši „izraz“ z besedo „operator“, ki:
- je postala sinonim za strojno besedo „ukaz“,
- se je izkazala za sinonim besedne zveze „znak delovanja“,
- in je tudi pridobila neomejeno število dodatnih pomenov. Torej je postala podobna angleškemu: „uhhh…“.
Poglejmo spremljajoča dejanja, ali pomoči.
Upravljanje spremenljivke
Upravljanje spremenljivke (UP) — ustvarjanje/odstranjevanje celic spremenljivke.
UP se zgodi implicitno ob razglasitvi spremenljivke, kar se že piše z drugega razloga — za označevanje oblike veličine. Izrecno se upravlja le z enim tipom dodatnih spremenljivk s funkcijama malloc() in free().
Treba je opozoriti, da so implicitni postopki bolj priročni za pisanje, saj ne zahtevajo ničesar pisati, a so težji za razumevanje — težje jih je upoštevati in razlagati.
Podrejanje
Podrejanje — povezovanje/odklopanje slojnih različnih delov.
Jezik C je predlagal drugačen pristop od assemblerja za obvladovanje zaporedja dejanj — podrejanje. To odraža in razvija govorjeno zapleteno podrejeno poved z jasnim ločevanjem na glavni del (poved podrejanje) in stranski del (oddelki podneva/podprogram).
Tako razglasitev kot podrejanje sta v celoti zgrajena na pojmu sloj.
Sloj
Sloj — je omejena enonivojska izbira izrazov.
Sloj je jasno in implicitno prevzel izvajanje več nalog takoj:
- urejanje programa,
- omejevanje vidnosti imen (implicitno),
- upravljanje s spremenljivkami (celicami pomnilnika) (implicitno),
- določanje stranskih odsekov za podrejanje,
- določanje funkcij in nabora ter druge.
V strojnih jezikih ni bilo pojma sloj, zato se ta ni pojavil niti v K/R, in če že česa tam ni bilo — bi bilo napakev in svobodoljubnosti to uvajati v nadaljnjih knjigah. Zato pojem sloj sploh ni nastal, čeprav je izjemno uporaben in povsem očiten.
Brez sloja ni mogoče na kratek in jasen način razložiti mnogih dejanj in pravil programa. Na primer, zakaj je preprost goto — slab, medtem ko je zapleten while — dober. Lahko se samo brez moči pritožujemo, kot je počel Dijkstra («kvalifikacija programerjev — funkcija, ki se obratno odvisno povečuje s frekvenco vključevanja operadorjev goto v njihovih programih». Skratka, le kozli uporabljajo goto. Raven utemeljitve — Bog.) Res pa to ni tako strašno, če vaše knjige sploh ne obvezujejo, da bi karkoli razložile, vendar, kot smo že rekli, to ni naš usoda.
Usput, može se pretpostaviti da je Den Riči ostavio goto upravo kao ključ za pretraživanje nekog neimenovanog pojma, jer nije postojala nikakva potreba ili lepota u izrazu goto. Međutim, postojala je potreba za jednostavnim i jasnim objašnjenjem novih principa jezika, koje sam Riči nije želeo da pruži, a koji su upravo zasnovani na tom pojmu. sloj.
Odstupanje
Odstupanje — promena uobičajenih osobina novog imena.
Najvažnije odstupanje je upravo povezano sa slojnim osobinama programa, i opisuje se jednom rečju „static“, koja ima različita značenja u svakoj vrsti sloja.
5. POSLEDNJA GLAVA. Opštost aplikativnih jezika
Aplikativni jezici su oblikovni jezici (koji imaju oblik, „tipizovani“). Oni se zasnivaju na eksplicitnoj ili implicitnoj upotrebi oblika. I ovde se ponovo javlja kontradikcija: eksplicitan oblik — jasniji je, ali manje praktičan, i obrnuto.

(Tabela za formatiranje još nije dostupna, pa je tabela data kao slika.)
Nakon C-a, razvoj aplikativnih jezika otišao je putem povećanja njihove oblikovnosti. Najvažniji za razumevanje visoke oblikovnosti je direktni potomak C-a — jezik C++. On razvija ideju slobodnog izbora operacija na vrednostima i ostvaruje je na osnovu C-ovog izraza izbor, koji dobija novo ime — objekat. Međutim, C++ nije tako kratak i izražajan kao C, zbog preopterećenja novih vrsta izbora i povezanih pravila. Usput, razgovaraćemo o „preopterećenju“.
Preopterećenje i polimorfizam
Reč „preopterećenje“ (overload) — zastareli termin mašinskog pristupa, koji označava stvaranje višestrukih operacija.
Mašinskih (sistemskih) programera višestrukost operacija mogla je iritirati: „Šta ovaj simbol (+) znači: sabiranje celih brojeva, sabiranje decimalnih brojeva ili možda pomeranje?! U naše vreme to se nije pisalo!“ Odatle negativna konotacija izabranog izraza („pretilo“, „dosadilo“). Za aplikativnog programera višestruke operacije — to je kamen temeljac, najveće dostignuće i nasleđe jezika C, toliko prirodne, da se često ne prepoznaju.
U jeziku C++ višestrukost se je razširila ne le na osnovne operacije, temveč tudi na funkcije — tako ločene kot združene v razrede — metode. Skupaj z več metodami se je pojavila možnost njihovega predefiniranja v razširjenih razredih, ki je bila nejasno poimenovana "polimorfizem". Kombinacija polimorfizma in čezobremenitve je ustvarila eksplozivno mešanico, ki se je razdelila na dva polimorfizma: "pravi" in "ad-hoc". Razumeti to je mogoče le kljub dodeljenim imenom. S tujimi imeni je tlakovana pot v ad.
Objava vrste "čezobremenitev" je bolje izraziti z besedo dodeklaracija — dodana objava istoimenske funkcije z argumenti druge oblike.
Objava vrste "polimorfizem" je bolje poimenovati z besedo predeklaracija — preklicna objava v novem razširjenem sloju istoimenske funkcije z argumenti iste oblike.
Takrat bo enostavno razumeti, da se istoimenske metode različnih oblik (argumentov) — dodeklarirajo, ena sama oblika — predeklarira.
Ruske besede rešujejo.
Vzletna steza
Obravnava pojmov visokooblikovnih jezikov potrjuje pomembnost jasne opredelitve temeljnih pojmov. Z ustrezno opisanim C je učenje visokooblikovnih jezikov lahko in prijetno.
To je še posebej pomembno za implicitne visokooblikovne jezike (PHP, JavaScript). Zanje postane pomembnost objektov (sestavljenih oblik) še višja kot pri C++, toda samo pojmovanje oblike postane implicitno in težko zajemljivo. Z vidika enostavnosti so postali bolj preprosti, z vidika razumevanja — pa težji.
Zato bi se moralo učenje programskih jezikov začeti z jezikom C in napredovati naprej v vrstnem redu, v katerem so se jeziki pojavili iz družine C.
Enak primer velja za opis jezikov. Različni jeziki imajo sovpadajoč ali manjših niz rodov enot kot jezik C. Število vrst in vzorcev se lahko razlikuje v obe smeri: C++ ima več vrst kot C, JavaScript — manj.
Posebno omembo si zasluži jezik MySQL. Zdi se, da ni nič skupnega, a se odlično opisuje z Matrioško, in spoznavanje z njo postane hitrejše in lažje. Kar je pomembno, ob upoštevanju njegovega pomena za splet — avtocesto sodobnega programiranja. In kjer je MySQL, so tudi drugi SQL. No, tudi vsi Fortran-Pascal-Python jeziki se opisujejo z Matrioško, ko pridejo na vrsto.
Tako da nas čekaju velika dela — primen opis jezika C i jedinstven opis sledećih jezika. „Naši ciljevi su jasni, zadaci određeni. Na posao, drugovi! (Burne, dugotrajne ovacije koje prelaze u aplauz. Svi ustaju.)“
Vaša mišljenja će biti pažljivo saslušana, vaša pomoć u kreiranju sajta matrioshki biće prihvaćena s velikim zahvalnostima. Potpune informacije o knjizi nalaze se na sajtu, vešto skrivenom u Matrioshki C.
Izvor: habr.com
