Matryoshka C. Lagdelt programmeringssprogssystem

Lad os forestille os kemi uden Mendeleevs Periodesystem (1869). Hvor mange elementer skulle man holde styr på, og i vilkårlig rækkefølge… (Dengang – 60.)

Det er nok at tænke på et eller flere programmeringssprog på én gang. De samme følelser, det samme kreative kaos.

Og nu kan vi opleve følelserne fra 1800-tallets kemikere, da de fik præsenteret al deres viden, plus lidt ekstra, i et Periodesystem.

Matryoshka C. Lagdelt programmeringssprogssystem


Bogen "Matryoshka C. Lagdelt programmeringssprog" præsenterer alle enheder i C-sproget som på en håndflade. Dette gør det muligt at organisere dem, rette forældede oplysninger og endda præcisere selve begrebet program.

I dag har oplysninger om programmering brug for systematisering mere end kemiske elementer for 150 år siden.

Den første nødvendighed er undervisning. Mendeleev begyndte at skabe sit system, da han stod over for spørgsmålet – hvilket element skulle han begynde med: O, H, N, He, Au… Det var lettere for ham – han underviste de bedste studerende fra St. Petersborgs universitet. Programmering undervises allerede i skolen og snart også i børnehaven.

Den anden nødvendighed er den videnskabelige tilgang. Takket være Periodesystemet blev nye elementer opdaget og oplysninger om gamle korrigeret. Det hjalp med at skabe atommodellen (1911). Og så videre.

Den tredje nødvendighed er præciseringen af begrebet program.

Moderne programmering er med et ben fastlåst i 1950'ernes USA. Dengang var programmerne enkle, mens maskinerne og maskinsprog var komplekse, så alt kredsede om maskiner og sprog.

Nu er det omvendt: programmerne er komplekse og primære, sprogene er enkle og sekundære. Dette kaldes en praktisk tilgang, som alle tilsyneladende kender til. Men studerende og udviklere bliver fortsat overbevist om, at alt er som før.

Dette bringer os tilbage til den første lektion af lektor Mendeleev. Hvad skal der siges til førsteårs-studerende? Hvor er sandheden? Det er spørgsmålet.

Bogen "Matryoshka C. Lagdelt programmeringssprog" giver sit svar. Den henvender sig ikke kun til studerende, men også til erfarne programmører, da det netop er dem, der skal finde sandheden og forandre deres verdenssyn, altså os.

Her følger et kort resumé af bogen.

1. Introduktion

I 1969 blev programmeringssproget C skabt, som blev et grundlæggende programmeringssprog og har været det i 50 år nu. Hvorfor er det sådan? Først og fremmest fordi C er et anvendeligt sprog, der giver programmerne et menneskeligt udseende i stedet for et maskinelt. Denne præstation blev videreført af sprog fra C-familien: C++, JavaScript, PHP, Java, C# og andre. For det andet er det et kort og smukt sprog.

Dog blandes C-sproget ofte med maskinassembler, hvilket komplicerer og fordrejer dets opfattelse. Den anden ekstrem er pålæggelsen af en eller anden 'filosofi' til sproget: proceduremæssig, objektorienteret, funktionel, kompilérbar, fortolket, typet osv. Dette tilføjer følelser, men hjælper ikke med at beskrive sproget bedre.

Sandheden ligger et sted imellem, idet C-sproget strengt sagt ligger lige midt imellem den filosofiske og maskinelle opfattelse.

C-sproget er ikke selvstændigt, det adlyder almindelig skriftlig tale, samtidig med at det selv styrer assembler-sproget. Denne position beskrives af Programmodel, ifølge hvilken programmet er opdelt i tre underordnede dimensioner: taler, kode og kommando. C-sproget svarer til den anden, den kodemæssige dimension.

Når man har defineret sprogets plads i programmet, kan man systematisere oplysningerne om det, hvilket gør Den lagdelte systemsprog, der præsenterer C-sproget i ånden af Mendelsystemsdemokratiet – på én side.

Systemet er bygget med hensyn til fælles anvendelsessprog, der udmunder i deres talte underordnede. Et sæt enheder fra Matryoshka C gør det muligt at beskrive og sammenligne forskellige sprog ved at skabe en række Matryoshka: C++, PHP, JavaScript, C#, MySQL, Python osv. Det er passende og korrekt, at forskellige sprog beskrives med enheder fra grundlæggende sprog.

2. KAPITEL 1. Programmodel. Forståeligt C

I det første kapitel præsenteres programmodellen, der afspejler den anvendte tilgang. Ifølge denne har programmet tre åbenlyse på hinanden følgende dimensioner:

  1. tale – direkte tale fra programmøren, der løser opgaven,
  2. kode – kodning af løsningen i matematisk form på C-sprog (eller et andet)
  3. og kommando – de direkte maskinkommandoer.

Programmodellen forklarer, hvorfor C er et simpelt og forståeligt sprog. C er bygget i overensstemmelse med vores velkendte menneskelige tale.

Den første type program er direkte tale fra programmøren. Talen svarer til menneskelig tænkning. Med hjælp fra tal skriver begyndere programmer - først på russisk, derefter gradvist oversætter handlingerne til kodningssprog. Og det er efter denne model, at C-sproget blev skabt.

Programmørens ræsonnering, udtrykt i tale, omdannes til en numerisk kodetype. Denne transformation bør kaldes refleksion, da tale og kode har samme natur (refleksion - fødsel - oprindelse). Dette er ganske åbenlyst, når man sammenligner den talte (til venstre) og kodede (til højre) type program.

Matryoshka C. Lagdelt programmeringssprogssystem

Det er interessant, at refleksionen sker meget enkelt - med kun to typer udtryk.

Dog indeholder den moderne beskrivelse af C-sproget (fra 1978) ikke en tilstrækkelig liste af betegnelser, hverken til beskrivelsen af sproget generelt eller til refleksionsopgaven i særdeleshed. Derfor er vi tvunget til at være kreative og indføre disse betegnelser.

Valget af ord skal være præcist og klart. Til dette kræves en særlig tilgang, der kort kan udtrykkes som - strengt brug af modersmålet. For englændere ville det være engelsk, men vi er ikke englændere. Så vi bruger det, vi har, og vil bestræbe os på at tale russisk.

Refleksion udføres af to typer udtryk:

  1. beregning (B) - afspejler ændringen af objektets egenskaber. Objektets egenskab udtrykkes med et tal, og dermed er handlingen over egenskaben - en handling over tallet - en operation.
  2. underordning (U) - afspejler ændringen af rækkefølgen af handlinger. Forbilledet af U er en komplekssætning, derfor begynder de fleste former for U med underordnede konjunktioner som „hvis“, „ellers“, „mens“, „til“. Andre former for U supplerer dem.

Forresten, kan du tro, at der i beskrivelsen af C-sproget ikke er noget navn for beregningsudtryk - de kaldes blot „udtryk“? Efter dette burde det ikke være overraskende, at der ikke er noget navn og samling for underordningstypen, eller for den sags skyld en generel mangel på navne, definitioner og generaliseringer. Alt dette skyldes, at den berømte K/R ("C-Sproget", Kernighan/Ritchie, 1978) ikke er en beskrivelse, men en brugervejledning til sproget.

Men man kunne alligevel godt ønske sig en beskrivelse af sproget. Derfor tilbyder vi Den lagdelte systemsprog.

3. KAPITEL 2. Lagdelt system. Kort C

Enhver beskrivelse skal være præcis og ekstremt kortfattet. I tilfælde af programmeringssprog er en direkte beskrivelse besværlig.

Her har vi et program. Det består af moduler. Modulerne består af underprogrammer og samlinger (struktur). Underprogrammerne består af enkelte udtryk: erklæringer, beregninger, underordnede. Der findes ti slags underordnede. Underordnede forbinder underniveauer og underprogrammer. Der er også flere erklæringer. Desuden inkluderes erklæringer ikke kun i underprogrammer og underniveauer, men også i moduler og samlinger. Og de fleste udtryk består af ord, som er så svære at beskrive, at de normalt bare gives i to lister - kildeord og afledte ord, som man skal gøre sig bekendt med i løbet af hele studiet og anvendelsen af sproget. Lad os tilføje kommaer og en række andre udtryk.

I denne fremstilling er det ikke nemt at forstå, hvem der står på hvem.

En direkte hierarkisk tilgang til beskrivelsen af sproget vil være alt for kompleks. At finde alternative veje fører til beskrivelsen af sproget baseret på dets talende natur og kommandodel. På denne måde blev det Lagdelte system skabt, hvilket delvist stemmer overens med Det Periodiske System af Mendelejev, som også er lagdelt. Som det blev tydeliggjort 42 år efter dets udgivelse (1869), er periodisiteten af systemet relateret til elektroniske lag (1911, Bohr-Rutherford modellen af atomet). Desuden har det Lagdelte system og Det Periodiske System til fælles, at alle enheder placeres i en tabel på én side.

Beskrivelsen af sprogets enheder bliver kortfattet - kun 10 slægter af udtryk og 8 slægter af andre enheder, samt indholdsmæssigt og visuelt. Selvom det kan være uvant ved første bekendtskab.

Sprogets enheder er opdelt i 6 niveauer:

  1. ordener - rækker i tabellen
  2. afdelinger - særlige grupper af slægter (dele af den første række)
  3. slægter - celler (hovedniveauet for opdeling)
  4. overgrupper - adskillelser af typer (sjældent niveau)
  5. typer - formler for enheder i bunden af cellen eller separat
  6. prøver - selve enhederne (kun for ord)

Prøver af ord beskrives af ordbogen - et separat subsystem sammensat af de samme seks niveauer.

Den talende komponent i C-sproget er ganske åbenlys, selvom den stadig fortjener en beskrivelse. Men den kommandodel af sproget er netop relateret til styringen af kompileringen, hvorved den tredje type program skabes - den kommandodede. Her nærmer vi os den mest fascinerende side af C-sproget - skønheden.

4. NÆSTE KAPITLER. Smuk C

C-sproget danner grundlaget for moderne programmering. Hvorfor? For det første, på grund af dets høje overensstemmelse med sproget. For det andet, fordi det elegant omgår begrænsningerne for maskinbehandling af tal.

Hvad foreslog C egentlig? Type og lag.

Ordet "type" er en oversættelse af det engelske ord "type", som stammer fra det græske "prototype" — "forbillede". På russisk formidler ordet "typ" ikke fuldt ud essensen af konceptet, og det blandes også med den funktionelle betydning "art".

Oprindeligt løste type rent maskinelle opgaver for beregning, men blev derefter en startbane for udviklingen af objektorienterede sprog.

Lag løste straks flere opgaver — både maskinelle og anvendelsesmæssige. Derfor vil undersøgelsen begynde med den enkle type og gå videre til det fleropgave-lag.

En af de ubehagelige aspekter ved historisk programmering er, at de fleste begreber, inklusive de grundlæggende, præsenteres uden definitioner. "Programmeringssproget (navn på floder) har hel- og flydende taltyper..." - og så videre. Hvad betyder "type" (type) — det er ikke nødvendigt at definere, fordi forfatterne selv ikke helt forstår det og vil dække det "for klarhedens skyld". Hvis de bliver presset, vil de give en utydelig og ubrugelig definition. Det hjælper meget at gemme sig bag udenlandske ord: for russiske forfattere — bag de engelske (type), for englændere — bag de franske (subroutine), græske (polymorfi), latinske (enkapsulering) eller deres kombinationer (polymorfi ad-hoc).

Men det er ikke vores skæbne. Vores valg — definitioner med hævet ansigt i rent russisk sprog.

Billede

Billede — det er et forbilledlig navn for størrelsen, der definerer 1) de egne egenskaber ved størrelsen og 2) valg af operationer til størrelsen.

Ordet "type" (art) svarer til den første del af definitionen: "egne egenskaber ved størrelsen". Men hovedsigtet med type er i den anden del: "valg af operationer til størrelserne".

Afsætningspunktet for introduktionen af type i C-sproget er almindelig beregning, for eksempel additionsoperationen.

Papir matematik, der er skrevet i hånden eller trykt, skelner ikke stort mellem typer af tal og antager dem normalt som reelle. Derfor er deres behandlingsoperationer entydige.

Maskinelle Matematikken adskiller strengt mellem hele og decimaltal. Forskellige typer tal opbevares og behandles forskelligt i hukommelsen med forskellige kommandosæt fra processoren. For eksempel er kommandoerne for addition af hele og decimaltal to forskellige kommandoer, der svarer til to forskellige kerner i processoren. Derimod findes der ingen kommando for at lægge en helt og et decimaltal sammen.

Anvendt matematik, altså C-sprog, adskiller typer af tal, men forener operationerne: addition for hele og/eller decimaltal skrives med ét tegn for operationen.

En klar definition af begrebet "værdien" gør det muligt at tale præcist om to andre begreber: værdi og operation.

Værdi og operation

Værdi – det tal der behandles.

Operation – bearbejdning af værdierne af de oprindelige størrelser (argumenter) for at opnå det endelige tal (resultatet).

Værdi og operation er indbyrdes forbundet. Hver operation er en værdi, da den har et numerisk resultat. Og hver værdi er resultatet af overførslen af værdien til CPU-registeret/fra CPU'en, dvs. – resultatet af operationen. På trods af denne sammenhæng er det dog vigtigt, at de kan beskrives separat, selvom det kan medføre, at det samme ord gentages i forskellige sektioner af ordbogen, hvilket også sker i ma3.

Den maskinelle tilgang opdelte alle tal, der blev brugt af programmøren, i kommandoer og data. Tidligere var begge kun tal, for eksempel blev kommandoer skrevet som numeriske koder. Men i anvendte sprog er kommandoer ikke længere tal, men ord og handlingstegn. Kun "data" forblev tal, men det er absurd at kalde dem sådan, fordi når man går fra en maskinelle til en matematisk synsvinkel, er tal størrelser, der opdeles i oprindelige (data) og endelige (efterstræbte). "Ukendt data" ville lyde tåbeligt.

Kommandoer er også opdelt i to typer handlinger: matematiske og tjenestekommandoer. De matematiske handlinger er operationer. Vi vil se nærmere på de tjenestelige senere.

I C-sprog bliver de vante papirbaserede og maskinelle entydige, eller enkeltruelle, matematiske operationer stort set til multipla.

Multiple operationer – flere ensartede operationer med forskellige udtryk for argumenter og forskellige, men nært beslægtede, handlinger.

Hele argumenter matcher en hel operation, mens decimale matcher en decimaltal. Denne forskel er især tydelig ved division, når udtrykket 1/2 giver resultatet 0 og ikke 0,5. Denne skrivemåde følger ikke reglerne for papir-matematik, men C-sproget stræber heller ikke efter at overholde dem (modsat Fortran) — det spiller efter sine applikations regler.

I tilfælde af blanding af hele og decimale tal aktiveres den eneste korrekte konvertering af argumentværdier — en udvælgende omdannelse af værdien fra én form til en anden. Faktisk, når der adderes et helt og et decimaltal, bliver resultatet — et decimaltal, så formen for operationen tilpasser operationen til at konvertere det hele argument til en decimaltalsværdi.

En række operationer forbliver ikke multiple, og enkelt. Sådanne operationer er kun defineret for én type argumenter: rest af division — hele argumenter, og bitwise operationer — naturlige hele tal. Ma3 angiver pluraliteten af operationer med tegn (#^) sammen med de former, for hvilke operationen er defineret. Dette er en vigtig, men tidligere overset egenskab ved hver operation.

Alle funktioner er vilkårlige enkeltoperationer. Undtagelsen er operatører — parentesfri funktioner, indlejret i sproget (oprindelige operationer).

Bistand

Bistand er en medfølgende handling til operationen.

Hvis man ser på operationen som den primære handling, kan man identificere to hjælpende handlinger, der understøtter operationen og adskiller sig fra den. Det er 1) kontrol af variablen og 2) underordning. Denne handling kaldes bistand.

Her skal man pause og nævne de russiske oversættelser af lærebøger om programmering. I teksten K/R blev der introduceret et nyt ord til at beskrive handlinger, statement (udtryk), som forsøgte at adskille begreberne for maskinkommandoer til forskellige handlinger: 1) operation, 2) erklæring og 3) underordning (benævnt 'kontrolstrukturer'). Dette forsøg blev begravet af de russiske oversættere, der erstattede 'udtryk' med ordet 'operatør', hvilket:

  1. blev synonymt med det maskinelle ord 'kommando',
  2. blev synonymt med udtrykket 'handlings tegn',
  3. og fik også et ubegribelig antal ekstra betydninger. Det vil sige, det blev til en form for det engelske artikels 'uhhh...'.

Lad os overveje de medfølgende handlinger, eller bistand.

Kontrol af variabel

Kontrol af variabel (UP) — oprettelse/fjernelse af variabel celler.
UP finder sted implicit ved erklæringen af en variabel, som allerede skrives af en anden årsag — for at angive en størrelse. Kun én slags yderligere variabler styrer eksplicit ved hjælp af funktioner som malloc() og free().

Det skal bemærkes, at implicitte handlinger er mere praktiske at skrive, da det ikke kræver noget at skrive, men er sværere at forstå — de er sværere at tage højde for og fortolke.

Underordning

Underordning — tilslutning/frakobling af lagdelte sektioner.

C-sproget tilbød en anden, mere anvendelig måde at styre rækkefølgen af handlinger på — underordning. Det afspejler og udvikler en kompleks underordnet sætning med en klar opdeling mellem hoveddelen (underordningssætningen) og den underordnede del (sektioner af niveauet/underrutine).

Både erklæringen og underordningen er helt bygget op på begrebet lag.

Lag

Lag — er et begrænset ensartet udvalg af udtryk.

Laget påtager sig åbenlyst og implicit mange opgaver samtidig:

  1. sortering af programmet,
  2. begrænsning af synlighed af navne (implicite),
  3. styring af variabler (hukommelsesceller) (implicite),
  4. bestemmelse af underordnede sektioner til underordning,
  5. bestemmelse af funktioner og samlinger og andre.

I maskinsprog fandtes der ikke noget begreb for lag, derfor dukkede det heller ikke op i C/R, og hvis noget ikke eksisterede der, ville det være en dårskab og fri tænkning at indføre det i efterfølgende bøger. Derfor dukkede begrebet lag slet ikke op, selvom det er yderst nyttigt og ganske åbenlyst.

Uden lag er det umuligt at kort og klart forklare mange handlinger og regler i programmet. For eksempel, hvorfor det så simpelt som tre ører goto er dårligt, mens den komplekse while er god. Man kan kun magtesløst klage, som Dijkstra gjorde (‘programmererens kvalifikation er en funktion, som omvendt afhænger af hyppigheden af goto-er i deres programmer’. Kort sagt, kun fårehyrder bruger goto. Begrundelsesniveauet — Gud.) Sandt, det er ikke så skræmmende, hvis dine bøger slet ikke skal forklare noget, men som vi allerede har sagt, er det ikke vores skæbne.

Forresten kan man antage, at Den Ritchie efterlod goto som en nøgle til at finde en ubestemt ræsonnering, fordi der ikke var nogen nødvendighed eller skønhed i udtrykket goto. Derimod var der et behov for en simpel og forståelig forklaring af de nye principper for sproget, som Ritchie ikke ønskede at give, og som netop er baseret på begrebet lag.

Afvigelse

Afvigelse — ændring af de normale egenskaber ved det nye navn.

Den vigtigste afvigelse er netop relateret til lagene i programmet og beskrives med ét ord "static", som har forskellige betydninger i hver type lag.

5. SIDSTE KAPITEL. Fællesskabet af anvendte sprog

Anvendte sprog — det er billedlige sprog (som har et billede, "typede"). De er baseret på den eksplicitte eller implicitte brug af billedet. Igen her opstår der et modsætningsforhold: det eksplicitte billede er mere forståeligt, men mindre praktisk, og omvendt.

Matryoshka C. Lagdelt programmeringssprogssystem

(Tabelopstillingen er ikke tilgængelig endnu, derfor gives tabellen som et billede.)

Efter C er udviklingen af anvendte sprog gået i retning af øget billedlighed. Den mest vigtige for forståelsen af høj billedlighed er den direkte efterkommer af C — sprog C++. Det udvikler ideen om vilkårlig tilknytning af operationer til værdier og realiserer den baseret på det C-lignende udtryk tilknytning, som får det nye navn — objekt. Dog er C++ ikke så kortfattet og udtryksfuld som C, på grund af overbelastningen af nye typer tilknytninger og de tilknyttede regler. For ordens skyld vil vi tale om "overbelastning".

Overbelastning og polymorfi

Ordet "overbelastning" (overload) — er et forældet begreb fra maskinmetoden, som beskriver skabelsen af flere operationer.

Maskinprogrammører mangfoldighed af operationer kunne helt sikkert irritere: "Hvad betyder dette tegn (+): addition af heltal, addition af brøker eller overhovedet skift?! I vores tid skrev man ikke sådan!" Herfra fremkommer den negative nuance af det valgte ord ("overbelastning", "træthed"). For den anvendte programmør er flere operationer hjørnestenen, hovedpræstationen og arven fra C-sprog, så naturlige, at de ofte ikke bliver bevidstgjort.

I sproget C++ mangfoldighed spredte sig ikke kun til grundlæggende operationer, men også til funktioner - både som individuelle og som grupperet i klasser - metoder. Sammen med de mange metoder kom muligheden for at overskrive dem i udvidede klasser, hvilket blev vagt kaldt 'polymorfi'. Kombinationen af polymorfi og overbelastning gav en eksplosiv blanding, der blev opdelt i to slags polymorfi: 'ægte' og 'ad-hoc'. At forstå dette er kun muligt på trods af de tildelte betegnelser. Udenlandske navne baner vejen til ad.

Meddelelsesformen 'overbelastning' er bedre udtrykt med ordet overdeclaration — en tilføjelse af en deklaration af den samme funktion med argumenter af en anden type.

Meddelelsesformen 'polymorfi' er bedre benævnt med ordet gen-deklaration — en overlapping af en deklaration i et nyt udvidende lag af den samme funktion med argumenter af samme type.

Så vil det være let at forstå, at metoder med samme navn men forskellige typer (argumenter) — overdeklares, men af samme type — gen-deklare.

Danske ord løser.

Startoperation

Overvejelsen af begreberne i højniveau-sprog bekræfter vigtigheden af klart at definere grundlæggende begreber. Med korrekt beskreven C vil studiet af højniveau-sprog være let og behageligt.

Dette er især vigtigt for implicit højniveau-sprog (PHP, JavaScript). For dem bliver betydningen af objekter (sammensatte typer) endnu vigtigere end i C++, men selve begrebet type bliver implicit og svært at fange. Set fra et brugervenlighedsperspektiv er de blevet lettere, men fra et forståelsesperspektiv – sværere.

Derfor bør man begynde at studere programmeringssprog med C og bevæge sig derfra videre i den rækkefølge, sprog fra C-familien blev introduceret.

Det samme gælder beskrivelsen af sprog. Forskellige sprog har en overensstemmende eller mindre mængde af typer end C. Antallet af typer og former kan variere i begge retninger: C++ har flere typer end C, mens JavaScript har færre.

Særligt værd at nævne er MySQL-sproget. Tilsyneladende — intet fælles, men det kan beskrives perfekt med Matryoshka, og bekendtskab med det bliver hurtigere og lettere. Hvilket er vigtigt, givet dets betydning for weben - hovedvejen for moderne programmering. Og hvor MySQL er, er der også andre SQL. Og mange Fortran-Pascal-Python også kan beskrives med Matryoshka, når tiden er til det.

Så vi står over for store opgaver – anvendelsen af C-sprog og en samlet beskrivelse af de efterfølgende sprog. "Vores mål er klare, opgaverne er defineret. Lad os komme i gang, kammerater! (Voldsomme, langvarige bifald, der overgår til en stående ovation. Alle rejser sig.)"

Dine meninger vil blive lyttet til med stor opmærksomhed, og din hjælp til at skabe hjemmesiden for matrjoskaer vil blive modtaget med stor taknemmelighed. Mere detaljerede oplysninger om bogen findes på hjemmesiden, der er listigt gemt i C-matrjoskaen.

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster