Matrjoshka C. A programnyelv réteges rendszere

Próbáljuk elképzelni a kémiát a Mendeljejev-féle periódusos rendszer (1869) nélkül. Hány elemet kellett volna fejben tartanunk, ráadásul tetszőleges sorrendben... (Akkor 60 volt.)

Ehhez elég gondolni egy vagy több programozási nyelvre. Ugyanazok az érzések, ugyanaz a kreatív káosz.

Most pedig átélhetjük a 19. századi kémikusok érzéseit, amikor mindazt a tudásukat, és egy kicsit többet, egyetlen periódusos táblázatban ajánlották fel.

Matrjoshka C. A programnyelv réteges rendszere


A "Matrioska C. A programnyelv rétegzett rendszere" könyv a C nyelv minden egységét kézhez álló módon mutatja be. Ez lehetővé teszi azok rendszerezését, az elavult információk helyreállítását, sőt, még magának a program fogalmának pontosítását is.

Ma a programozással kapcsolatos ismeretek rendszerezésre szorulnak, még inkább, mint 150 éve a kémiai elemek.

Az első szükséglet — az oktatás. Mendeljejev a saját rendszerének létrehozásába akkor kezdett, amikor szembesült a kérdéssel — melyik elemmel kezdje az előadásokat: O, H, N, He, Au... Ráadásul neki egyszerűbb volt — a legjobb hallgatókat, a Szentpétervári Egyetem diákjait tanította kémiára. A programozást azonban már az iskolákban tanítják, és hamarosan a gyermekkertekben is elindul.

A második szükséglet — tudományos megközelítés. A periódusos rendszer segítségével új elemeket fedeztek fel és javították a régiek ismereteit. Segített az atommodell létrehozásában (1911). És így tovább.

A harmadik szükséglet — a program fogalmának pontosítása.

A modern programozás egyik lába a 20. század 50-es éveiben ragadt. Akkor a programok egyszerűek voltak, míg a gépek és a gépi nyelvek bonyolultak, ezért minden a gépek és nyelvek körül forgott.

Most éppen fordítva van: a programok bonyolultak és elsődlegesek, míg a nyelvek egyszerűek és másodlagosak. Ezt hívják alkalmazott megközelítésnek, ami mindenkinek ismerősnek tűnik. De a hallgatókat és a fejlesztőket továbbra is arról győzik meg, hogy minden továbbra is így van.

Ez visszavezeti minket Mendeljejev magántanár első előadásához. Mit mondjunk az elsőéveseknek? Hol van az igazság? Ez a kérdés.

A könyv, a "Matrioska C. A programnyelv rétegzett rendszere" saját válaszát kínálja erre. Ráadásul nemcsak a hallgatóknak szól, hanem a felkészült programozóknak is, mivel az igazság keresése és a világkép megfordítása éppen az ő feladatuk, vagyis a miénk.

Ezután a könyv rövid összefoglalója következik.

1. Bevezetés

1969-ben került kialakításra a C nyelv, amely alapvető programozási nyelvvé vált, és már 50 éve megmaradt annak. Miért van ez így? Először is, mert a C alkalmazási nyelv, ami emberi arcot adott a programnak a gépi megjelenés helyett. Ezt a vívmányt megerősítették a C családba tartozó nyelvek: C++, JavaScript, PHP, Java, C# és mások. Másodszor, ez egy rövid és szép nyelv.

A C nyelvet azonban gyakran összekeverik a gépi assembly-vel, ezzel megnehezítve és torzítva annak értelmezését. Egy másik szélsőség a nyelvhez kapcsolódó „filozófia” ráerőltetése: procedurális, objektumorientált, funkcionális, fordított, értelmezett, típusos, és így tovább. Ez érzelmeket ad hozzá, de nem segít jobban leírni a nyelvet.

Az igazság a középen van, és a C nyelv esetében ez szigorúan a filozófiai és gépi értelmezés középpontjában helyezkedik el.

A C nyelv nem önálló, alárendeli magát a szokásos írott nyelvnek, és egyben ő szabályozza a gépi assembly-t is. Ezt a helyzetet írja le A program beszédmodellje, amely szerint a program három alárendelt típusra oszlik: beszédes, kódolt, utasítási. A C nyelv a második, a kódolt típusért felelős.

A nyelv helyének meghatározásával a programban rendezni lehet az információkat róla, ami létrehozza A program nyelvének rétegezett rendszere, amely a C nyelvet a periódusos rendszer szellemében mutatja be – egy oldalra.

A rendszer figyelembe veszi az alkalmazási nyelvek közötti közösséget, amely a beszédes alárendeltségükből fakad. Egy egyetlen készlet Matryoshka egység a C nyelven lehetővé teszi, hogy különböző nyelveket írjunk le és hasonlítsunk össze, létrehozva egy sor Matryoshkát: C++, PHP, JavaScript, C#, MySQL, Python és így tovább. Megfelelő és helyes, hogy a különböző nyelveket az alapnyelv egységeivel írják le.

2. FEJEZET 1. A program beszédmodellje. Érthető C

Az első fejezet bemutatja a program beszédmodelljét, amely a gyakorlati megközelítést tükrözi. Ennek megfelelően a programnak három nyilvánvaló egymásutánisága van:

  1. beszédes – a feladatot megoldó programozó közvetlen beszéde,
  2. kódolt – a megoldás kódolása matematikai formában C nyelven (vagy bármely más nyelven)
  3. és utasítási – közvetlen gépi utasítások.

A beszédmodell magyarázatot ad arra, hogy miért egyszerű és érthető a C. A C a nekünk szokásos emberi beszéd mintájára épül.

Az első programtípus a programozó közvetlen beszéde. A beszéd megfelel az emberi gondolkodásnak. A beszéd segítségével programokat írnak a kezdő programozók – először oroszul, majd lépésről lépésre fordítva a cselekvéseket kódnyelvre. És pontosan ezen minta alapján készült a C nyelv.

A programozó következtetései, amelyeket beszéddel fejeznek ki, kódos számformává alakulnak. Ezt a transzformációt nevezzük tükörképnek, mivel a beszéd és a kód egy természetű (tükörkép — születés — származás). Ez teljesen nyilvánvaló, ha összehasonlítjuk a beszéd (balra) és a kódolt (jobbra) programváltozatokat.

Matrjoshka C. A programnyelv réteges rendszere

Érdekes, hogy a tükörkép nagyon egyszerűen történik – mindössze kétféle kifejezéssel.

Ugyanakkor a C nyelv modern leírása (1978-ból) nem tartalmaz elegendő névsort sem a nyelv általános leírására, sem a tükörképként való feladatára vonatkozóan. Ezért kénytelenek vagyunk kreatívan eljárni és bevezetni ezeket a neveket.

A szavak kiválasztásának pontosnak és világosnak kell lennie. Ehhez különleges megközelítés szükséges, amely röviden úgy fejezhető ki – a saját nyelv szigorú használata. Az angolok számára ez lenne az angol nyelv, de mi nem vagyunk angolok. Tehát használjuk, ami van, és megpróbálunk oroszul beszélni.

A tükörképet kétféle kifejezés hajtja végre:

  1. számítás (Sz) – tükrözi a tárgy jellemzőinek változását. A tárgy jellemzője szám formájában van kifejezve, tehát a jellemzőn végzett művelet – az a művelet a számmal – operáció.
  2. alárendelés (Al) – a cselekvések sorrendjének változását tükrözi. Az Al alapja a beszédbeli bonyolult alárendelt mondat, ezért a legtöbb Al típus alárendelő kötőszavakkal kezdődik, mint például „ha”, „egyébként”, „amíg”, „számára”. Más Al típusok kiegészítik ezeket.

Egyébként elhiszed, hogy a C leírásában nincs neve a számítási kifejezéseknek – csak simán „kifejezéseknek” nevezik őket? Ezután már nem meglepő annak hiánya és az alárendelés fajtájának összegzése, és egyáltalán a nevek, meghatározások és általánosítások szegénysége. Mindaz azért, mert a híres K/R („C nyelv”, Kernighan/Ritchie, 1978) nem leírás, hanem a nyelv használatának útmutatója.

Azonban szeretnénk, ha lenne egy leírása a nyelvnek. Ezért ezt kínálja A program nyelvének rétegezett rendszere.

3. FEJEZET 2. Rétegződési rendszer. Rövid C

Bármilyen leírásnak pontosnak és rendkívül tömörnek kell lennie. A programnyelv esetében a frontális leírás nehéz.

Itt van egy programunk. Modulokból áll. A modulok alprogramokból és válogatásokból (structure) állnak. Az alprogramok különálló kifejezésekből állnak: nyilatkozatokból, számításokból, alárendelésekből. Az alárendeléseknek összesen tíz típusa van. Az alárendelések alszinteket és alprogramokat kapcsolnak be. Nyilatkozatokból is több van. Egyébként a nyilatkozatok nemcsak alprogramokban és alszintekben szerepelnek, hanem modulokban és válogatásokban is. A kifejezések többsége szavakból áll, amelyeknek a leírása olyan bonyolult, hogy általában egyszerűen két listaként adják meg őket — az alap- és a származékos szavakat, amelyeket a nyelv tanulása és használata során fogunk megismerni. Ehhez adjuk még hozzá a írásjelet és számos egyéb kifejezést.

Ilyen formában nehéz megérteni, hogy ki kinek a helyén állt.

A nyelv leírásának közvetlen hierarchikus megközelítése túl bonyolult lenne. A körülményes utak keresése a nyelv beszédtermészete és parancsi oldala alapján történő leírásához vezet. Így jött létre a Rétegzett rendszer, amely részben egybeesik a Mendeljejev periódusos rendszerével, amely szintén rétegezett. 42 évvel a megjelenése után (1869) kiderült, hogy a rendszer periódusossága a elektronikus rétegekkel (1911, Bohr-Rutherford atommodell). A Rétegzett és a Periódikus rendszert a különböző egységek egyoldalú elhelyezése is összeköti.

A nyelv egységeinek leírása tömör — mindössze 10 kifejezéstípus és 8 egyéb egységtípus, valamint tartalmilag gazdag és jól átlátható. Ugyanakkor első találkozásra szokatlan.

A nyelv egységei 6 szintre vannak osztva:

  1. rendek — a táblázat sora
  2. szakok — különleges csoportok (az első sor részei)
  3. típusok — cellák (a fő felosztási szint)
  4. felső típusok — a fajták elválasztói (ritka szint)
  5. fajták — az egységek képletei a cella alján vagy külön
  6. minták — maguk az egységek (csak szavakra vonatkozik)

A szavak mintáit a szótár leírja — külön alrendszer, amely a hat szintből áll.

A C nyelv beszédkomponensei megnyilvánulnak, bár mégis indokolt a leírása. A nyelv parancsi része viszont kapcsolódik a fordítás kezeléséhez, amely során egy harmadik programtípus — a parancsos — jön létre. Itt érkezünk a C nyelv leglenyűgözőbb részéhez — a szépséghez.

4. KÖVETKEZŐ FEJEZETEK. Gyönyörű C

A C nyelv a modern programozás alapja. Miért? Először is, mert leginkább megfelel a beszélt nyelvnek. Másodszor, mert szépen megkerüli a gépi számfeldolgozás korlátait.

Mit is kínált a C? Típus és réteg.

A 'típus' szó az angol 'type' szóból származik, amely a görög 'prototypus' - 'prototípus' szóból ered. A magyar nyelvben a 'típus' szó nem adja vissza a kifejezés sarkalatos jelentését, ráadásul keveredik a segéd jelentéssel, amely a 'faj' volt.

Eredetileg a típus tisztán gépi számítási feladatot oldott meg, majd egy ugródeszkává vált az objektumorientált nyelvek születéséhez.

A réteg azonnal több feladatot is megoldott - gépi és alkalmazási szempontból egyaránt. Éppen ezért a vizsgálódás az egydimenziós típussal kezdődik, majd áttér a többarcu rétegre.

A történelmi programozás egyik kellemetlen vonása, hogy a legtöbb fogalom, beleértve a legfontosabbakat is, meghatározás nélkül kerül bemutatásra. 'A programozási nyelv (folyók neve) egész és lebegő számokkal rendelkezik...' - majd továbbgondolják. Mi a 'típus' (típus) - meghatározni nem kötelező, mert az írók maguk sem értik teljesen, és ezt 'érthetőség' érdekében eltagadják. Ha szorongatják őket, homályos és haszontalan definíciót adnak. Nagyon segít elbújni a külföldi szavak mögé: a magyar szerzők számára az angol (típus), az angolok számára pedig a francia (alprogram), görög (polimorfizmus), latin (inkapszuláció) vagy ezek kombinációi (ad-hoc polimorfizmus).

De ez nem a mi sorsunk. A mi választásunk a tiszta magyar nyelvű meghatározások.

Kép

Kép - ez a mennyiség előképző neve, amely meghatározza 1) a mennyiség sajátos tulajdonságait és 2) a műveletek kiválasztását a mennyiséghez.

A 'típus' (faj) szónak megfelelő első rész meghatározása: 'sajátos tulajdonságok a mennyiséghez'. De a legfontosabb jelentés a típus második részében rejlik: 'a műveletek kiválasztása a mennyiségekhez'.

A típus bevezetésének kiindulópontja a C nyelvben a hagyományos számítás, például az összeadás művelete.

Papíralapú matek, kézzel feljegyezve vagy nyomtatva, nem különböztet lényegesen a számok típusai között, általában reálisnak tekinti őket. ezért a műveleteik feldolgozása egyértelmű.

Gépi A matematika szigorúan elválasztja a számokat egész és tört számokra. A különböző számfajták eltérően kerülnek tárolásra a memóriában, és a processzor különböző utasításai dolgozzák fel őket. Például az egész és a tört számok összeadását két különböző utasítás jelenti, amelyek két különböző processzorcsomóponthoz tartoznak. Azonban az egész és tört argumentumok összeadására vonatkozó utasítás nem létezik.

Alkalmazott matematika, más néven C nyelv, elválasztja a számfajtákat, de összekapcsolja a műveleteket: az egész és/vagy tört számok összeadása egyetlen műveleti jellel írható le.

A fogalom világos meghatározása lehetővé teszi, hogy határozottan beszéljünk két másik fogalomról: mennyiség és művelet.

Mennyiség és művelet

Mennyiség — a feldolgozott szám.

Művelet — az alapmennyiségek (argumentumok) értékeinek feldolgozása a végső szám (eredmény) előállítása érdekében.

A mennyiség és a művelet összefonódik. Minden művelet mennyiség, mivel numerikus eredménye van. Minden mennyiség pedig a processzorba történő értékátvitel (vagy a processzorból való kilépés) eredménye, tehát egy művelet eredménye. Ezen összefonódás ellenére, a legfontosabb kérdés, hogy lehetőség van a különálló leírásukra, még ha a szót több helyen is meg kell ismételni a szótár különböző részeiben, ahogyan ez a ma3-ban történik.

A gépi megközelítés az összes, a programozó által használt számot a következő kategóriákra osztotta: parancsok és adatokat. Régen mindkettő pontosan szám volt, például az utasításokat numerikus kódokkal írták. Azonban az alkalmazási nyelvekben az utasítások már nem számokként funkcionálnak, hanem szavakként és műveleti jelekként. Csak az „adatok” maradtak számok, de nevük ilyenként való folytatása nevetséges, mert a gépi nézőponttól a matematikai nézőpontra való áttéréskor a számok olyan mennyiségek, amelyek az alap (adatokat) és a végső (keresett). „Ismeretlen adat” — ez nevetségesen hangzik.

Az utasítások is kétféle műveletre oszlottak: matematikai és segéd. A matematikai műveletek — műveletek. A segédműveletekként később visszatérünk.

A C nyelveknél a megszokott papíralapú és gépi egységes, vagyis egyértelmű matematikai műveletek szinte teljesen többszörössé válnak.

A többszörös műveletek – több azonos nevű művelet eltérő argumentumformákkal és hasonló jelentésű cselekvésekkel.

A whole argument corresponds to a whole operation, while a fractional one corresponds to a fractional operation. This difference is particularly evident in division, where the expression 1/2 results in 0 instead of 0.5. Such notation does not comply with the rules of paper mathematics, but the C language does not aim to adhere to them (unlike Fortran) — it plays by its own practical rules.

In the case of mixing whole and fractional numbers, the only correct one is to convert the argument values — a selective transformation of a value from one form to another. Indeed, when adding a whole and a fractional number, the result is fractional, hence the form of the operation selects the operation of converting a whole argument into a fractional value.

A range of operations remains not multiple, és single. Such operations are defined only for one type of arguments: the remainder of a division — whole arguments, bitwise operations — natural wholes. The symbol 3 indicates the multiplicity of operations with signs (#^) specifying the forms for which the operation is defined. This is an important but previously overlooked property of each operation.

All functions are arbitrary single operations. The exception consists of operators — bracketless functions, built into the language (basic operations).

Assistance

Assistance — a supportive action for the operation.

If we consider the operation as the main action, we can identify two accompanying actions that ensure the operation and differ from it. These are 1) variable control and 2) subordination. This action is called assistance..

Here we should digress and separately address Russian translations of programming textbooks. In the K/R text for recording actions, a new word was introduced statement which attempted to separate the concept of a machine command into different actions: 1) operation, 2) declaration, and 3) subordination (termed 'control structures'). This attempt was buried by Russian translators, replacing 'statement' with the word 'operator', which:

  1. became a synonym for the machine word 'command',
  2. turned out to be synonymous with the phrase 'action sign',
  3. and also acquired an unlimited number of additional meanings. In other words, it turned into a semblance of the English article 'uhhhh...'.

Let's consider the accompanying actions, or assistance..

Variable control.

Variable control. (UP) — változócellák létrehozása/eltávolítása.
Az UP implicit módon történik, amikor egy változó deklarálásra kerül, ami már egy másik okból történik — a mennyiség megadására. Csak egyféle típus van, amit a függvények kezelnek. kiegészítő változók a malloc() és free() függvények segítségével.

Meg kell említeni, hogy az implicit műveletek kényelmesebbek az írás szempontjából, mivel egyáltalán nem igényelnek semmiféle írást, de nehezebbek a megértés szempontjából — nehezen számíthatók és értelmezhetők.

Alárendelés

Alárendelés — rétegelt szakaszok csatlakoztatása/leválasztása.

A C nyelv egy, az assemblerntől eltérő, alkalmazás orientált módot kínált a tevékenységek sorrendjének kezelésére — az alárendelés. Ez visszatükrözi és fejleszti a beszélt alárendelt mondatot egyértelmű elválasztással a fő rész (alárendelt mondat) és a mellékszöveg (alprogram/részletek) között.

Az alárendelés és a deklaráció teljesen azon a fogalmon alapul, hogy réteg.

A réteg

A réteg — egy korlátozott, egyszintű kiválasztó kifejezés halmaz.

A réteg nyíltan és implicit módon számos feladat ellátását vállalta:

  1. a program rendezettsége,
  2. a nevek láthatóságának korlátozása (implicit módon),
  3. változók (memóriacellák) kezelése (implicit módon),
  4. mellékelt részletek meghatározása az alárendeléshez,
  5. funkciók és gyűjtemények meghatározása és egyéb.

A gépi nyelvekben nem létezett a réteg fogalma, ezért a K/R-ben sem jelent meg, és ha ott nem volt, akkor utólagos bevitele a további könyvekbe eretnekségnek és szabadgondolkodásnak számított. Tehát a réteg fogalma egyáltalán nem jelent meg, bár rendkívül hasznos és teljesen nyilvánvaló.

Réteg nélkül sok cselekvést és a program szabályait röviden és világosan elmagyarázni lehetetlen. Például, hogy miért rossz a háromfilléres goto, míg a bonyolult while jó. Csak tehetetlenül lehet szitkozódni, ahogy Dijkstra tette ("a programozók képesítése — egy funkció, amely visszafelé függ a goto utasítások előfordulásának gyakoriságától a programjaikban". Röviden, csak a bunkók használják a goto-t. A megalapozás szintje — Isten.) Igaz, ez nem olyan rémisztő, ha a könyveidnek egyáltalán nem kell semmit magyarázniuk, de, ahogy már mondtuk, ez nem a mi sorsunk.

Egyébként feltételezhető, hogy Dennis Ritchie a goto kifejezést pontosan azért hagyta meg, mint egy kulcsot egy névtelen fogalom keresésére, mert nem volt szükség vagy szépség a goto kifejezésre. Viszont szükség volt egy egyszerű és érthető magyarázatra az új nyelvi elvekről, amelyeket Ritchie maga nem akart megadni, és amelyek éppen a fogalomra épülnek. réteg.

Eltérés

Eltérés — a új név szokásos tulajdonságainak megváltozása.

A legfontosabb eltérés éppen a program rétegzett tulajdonságaihoz kapcsolódik, és egy szóval „statikus” jellemzi, amelynek a rétegek különböző jelentései vannak.

5. FEJEZET. Az alkalmazási nyelvek közössége

Az alkalmazási nyelvek — képviseleti nyelvek (kép alapú, „tipizált”). Ezek nyilvános vagy implicit kép használatán alapulnak. Ráadásul itt újra megjelenik a ellentmondás: a nyílt kép — könnyebben érthető, de kevésbé kényelmes, és fordítva.

Matrjoshka C. A programnyelv réteges rendszere

(A táblázat formázását még nem szállították, ezért a táblázat képként van megadva.)

A C utáni fejlődés az alkalmazási nyelvekben a képviselet növelésének irányába haladt. A legfontosabb a magas szintű képviselet megértésében a C közvetlen leszármazottja — a C++ nyelv. Ez fejleszti az ötletet, hogy tetszőleges műveleteket rendelnek a mennyiségekhez, és megvalósítja azt a C nyelvű kifejezés alapján, amely új nevet kapott — objektum. Azonban a C++ nem olyan rövid és kifejező, mint a C, a különböző típusú műveletek és a velük kapcsolatos szabályok túlterheltsége miatt. Egy szót említsünk a „túlterhelésről”.

Túlterhelés és polimorfizmus

A „túlterhelés” (overload) szó — egy elavult gépi megközelítés utáni kifejezés, amely a többszörös műveletek létrehozására utal..

A gépi (rendszerszintű) programozók többszörössége a műveletek teljesen irritálhatja: „Mit jelent ez a jel (+): egész számok összeadását, tört számok összeadását, vagy egyáltalán eltolást?! A mi időnkben nem így írták!” Innen származik a választott szó negatív árnyalata („zavarás”, „unalom”). Az alkalmazási programozók számára a többszörös műveletek — a C nyelv alapköve, legfontosabb vívmánya és öröksége, annyira természetesek, hogy gyakran nem is tudatosulnak.

A C++ nyelvet többszörössége распространилась не только на исходные операции, но и на функции — как отдельные, так и объединенные в классы — методы. Вместе с множественными методами появилась возможность их переопределения в расширенных классах, которая была туманно названа «полиморфизмом». Сочетание полиморфизма и перегрузки дало взрывчатую смесь, которая разлетелась на два полиморфизма: «истинный» и «ad-hoc». Разобраться в этом можно только вопреки присвоенным названиям. Иностранными названиями вымощена дорога в ad.

Объявление вида «перегрузка» лучше выразить словом дообъявление — добавляющее объявление одноименной функции с аргументами другого образа.

Объявление вида «полиморфизм» лучше назвать словом переобъявление — перекрывающее объявление в новом расширяющем слое одноименной функции с аргументами того же образа.

Тогда будет легко разобраться, что одноименные методы разных образов (аргументов) — дообъявляются, а одного образа — переобъявляются.

Русские слова решают.

Взлётная полоса

Рассмотрение понятий высоко-образных языков подтверждает важность чёткого определения основополагающих понятий. С правильно описанным Си изучение высоко-образных языков будет лёгким и приятным.

Особенно это важно для неявных высоко-образных языков (PHP, JavaScript). Для них важность объектов (составных образов) становится ещё выше, чем в С++, но само понятие образа становится неявным и трудноуловимым. С точки зрения удобства они стали проще, а вот с точки зрения понимания — сложнее.

Поэтому начинать изучение языков программирования следует с языка Си и двигаться дальше в порядке появления языков семейства Си.

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

Особого упоминания заслуживает язык MySQL. Казалось бы — ничего общего, но он прекрасно описывается Матрёшкой, и знакомство с ним становится быстрее и проще. Что важно, учитывая его значение для веба — столовой дороги современного программирования. А где MySQL, там и прочие SQL. Ну, и всякие фортраны-паскали-питоны тоже описываются Матрёшкой, как только руки дойдут.

Öt nagy feladat vár ránk – a C nyelv alkalmazott leírása és az azt követő nyelvek egységes leírása. „Céljaink világosak, a feladatok meghatározottak. Dolgozni kezdjünk, elvtársak! (Lázas, hosszan tartó taps, ami ovációba csap át. Mindenki feláll.)”

Véleményeiket nagy figyelemmel fogjuk meghallgatni, segítségüket a Matryoshka webhelyének létrehozásában nagy hálával fogadjuk. Részletesebb információk a könyvről a C Matryoshka-babában rejtőzködő weboldalon találhatók.

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster