Užitočné tipy

Ako vytvoriť svoj vlastný programovací jazyk: teória, nástroje a rady od praktického lekára

Tajný komunikačný jazyk


"Sasegagdadnanaya babudadetat bol spárovaný na stretnutie šašatababa Yunanogaga Dadozazoraru," zabručel Marinka.
Genka a Roba ohromení hľadeli prázdne na jej pery, cez ktoré sa vyliala nepochopiteľná blábolka.
- Čo, čo? Spýtali sa takmer unisono.
- Onani nane paponanimamyat, - Sveta náhle odpovedala rovnakou praskajúcou frázou.
"Mamlaladadenans z Tatunandadrara," opovrhla Marinka.
"Tatupapy mamalalchachishashi," dodala Svetka.
A hoci Genka a Roba nerozumeli ani slovu z tejto výmeny názorov, z tónu priateľiek bolo jasné, že boli nemilosrdne a nezaslúžene urazení.
- To je to, červy! - nahnevaná, temperamentná Genka, - po prvé, nechajte svoj jazyk vtáčích bláznov pre ostatných a po druhé sa mi zdá, že urazíte našu česť. Nevidím, že sme členmi toho istého tímu a navyše ste dievčatami a ...
Marinka a Svetka sa spolu smiali.
- Vidíte, - Svetka šeptala veselo, - ani naši šikovní muži ničomu nerozumeli.
„Zdá sa, že povedali niečo o Young Watch,“ navrhol Roba, ktorý chytil známe kombinácie písmen, „ale zvyšok nemožno pochopiť.
- A čo je potrebné pochopiť, - nedotknuteľná Genka vybuchla z postele, - nesú nejaké odpadky ...
„A to vôbec nie je nezmysel,“ hrdo povedala Marinka, „toto je náš nový jazyk.“
"Tajný jazyk pre komunikáciu medzi členmi našej organizácie," potvrdila Svetka, "aby nikto z cudzích nerozumel tomu, čo sa hovorí."
Dievčatá spolu viedli, aby svojim priateľom vysvetlili povahu a štruktúru nového štýlu tajnej komunikácie. Všetko sa ukázalo byť veľmi jednoduché. Sveta ako vedúci spravodajských služieb a kontrarozviedky vážne uvažovala o zachovaní utajenia svojich činností. Niektoré oficiálne dokumenty ich tajnej organizácie vytlačené pomocou Robyho počítača už obsahovali rôzne bezpečnostné známky: od „na úradné použitie“ po „prísne tajné“. A aké sú tieto tajné dokumenty, ktoré si mohol prečítať každý, kto si mohol prečítať do rúk oficiálnej dokumentácie Young Watch. Bezcenné také tajomstvo. Okrem toho bolo niekedy potrebné komunikovať s cudzincami o niektorých aktuálnych záležitostiach ich tajnej organizácie. Niektorí z nich požadovali súrne naliehavé kroky. Aj keď nájdete odľahlé miesto, vlak už odchádza. V škole opäť môžete korešpondovať vo svojom vlastnom jazyku a obsah poznámky, ktorá sa náhodou dostane do nesprávnych rúk, bude pre cudzinca nepochopiteľná.
Áno, bolo potrebné tajomstvo. Navyše je to nevyhnutné. Ďalšou tajnou a nebezpečnou operáciou bolo varenie piva, ktorého stupeň utajenia bol najvyšší. Ale ako vytvoriť tajný systém správ? Naučiť sa nejaký mŕtvy jazyk starých ľudí, ktorý dnes nikto nepoužíva? Naučte sa hovoriť jazykom dávno vyhynulého Hyksosa, Eftala alebo Filištína? Nie, nech to urobia lingvistickí vedci lepšie.
Priatelia už diskutovali o tomto probléme, ale neboli predložené žiadne rozumné návrhy. Každý z nich vyjadril svoj názor na túto otázku, ale neprišiel k spoločnému menovateľovi.
Genka verila, že každý môže dostať špeciálnu lepenku, v ktorej budú okná rezané. K textu je možné priložiť lepenku, či už knihu alebo ručne, na určitú stranu a skladaním písmen, ktoré sa zobrazujú v oknách, si môžete prečítať tajnú správu. Príliš objemný - zamietol jeho návrh. Áno, a na ústny rozhovor nie je vhodný.
Sveta verila, že korešpondencia je možná pomocou latinskej abecedy, ktorej písmená sa dajú použiť na písanie ruských slov. Napríklad: mesto vstrechi izmenit nelzia (miesto konania sa nedá zmeniť). A na komunikáciu sa môžete učiť pomocou posunkového jazyka, ako je napríklad abeceda nepočujúcich. Tiež kritizovaný. Po prvé, v našom osvetlenom čase latinské listy vedia takmer všetko, čo znamená, že môžu kryptografiu voľne čítať týmto spôsobom. Vynájsť posunkovú reč je veľmi nepríjemná záležitosť. A nie každé slovo môže byť vysvetlené gestikulovaním.
Roba navrhol vylepšenie návrhu Svetkina. Písanie písmen v počítači napíšte ruskými písmenami, ale vrátane anglického písma. Potom povedzme, že fráza „miesto stretnutia sa nedá zmeniť“ bude vyzerať takto: vtcnj dcnhtxb bpvtybnm ytkmpz. Vyzerá to úžasne, všetci sa zhodli, ale potom každý musí mať svoj vlastný počítač, mať v ňom poštovú schránku a posielať si e-maily navzájom. Komplikované vo všetkých smeroch. Pokiaľ ide o hovorený jazyk, Rob mal v úmysle vyvinúť svoj vlastný, ale založený na počítačovom slangu. Napríklad na aktualizáciu vylepeného obsahu, jeho vyplnenie a kopírovanie-prilepenie. Preložené do normálneho jazyka bude znieť takto: aktualizujte poškodený text, napíšte správu veľkými písmenami a skopírujte ho na správne miesto. Skvelé zvuky - všetci súhlasili. Každý pokročilý používateľ však tento kód rozdelí, ako napríklad veverička orechová. Okrem toho sa pokúste zapamätať si také frázy a dokonca ich vysloviť - zlomíte si jazyk. Nie, nebude.
Natasha, ako veliteľ, hovorila ako posledná. Ale neponúkala nič nové. Vyvíjajte špeciálne kryptografické knihy a používajte ich na šifrovanie a dešifrovanie textov. Je to spoľahlivé? Áno. Je to však veľmi drahé a časovo náročné. A problém tajnej orálnej komunikácie pretrváva.
Nakoniec sa rozhodli zveriť túto úlohu Svetke, ktorá má takéto veci robiť zamestnaním. A ona sa s ňou skvele vysporiadala. Tajný jazyk, ktorý vymyslela, bol extrémne jednoduchý, ústne aj písomne, a čo je najdôležitejšie, bolo úplne nepochopiteľné pre nezasvätených v tomto tajomstve.
Podstata vyvinutého systému bola nasledovná. Po každej spoluhláske sa vložilo písmeno „a“ a potom rovnaká spoluhláska a samohlásky zostali nezmenené.
Potom zaznie fráza „miesto stretnutia sa nedá zmeniť“ a bude napísané takto: mamezastato vavsastatrarechachi z názvu sa zmení a prečíta. Vyskúšajte, hádajte, o čo ide. Zvládnutie tohto štýlu nebolo vôbec ťažké a o týždeň neskôr už Genka a Roba jazdili v tomto bláznivom jazyku o nič horšie ako dievčatá. Následne vynálezca Roba navrhol komplikáciu šifry. Teraz bolo za každú vyslovenú spoluhlásku vložené písmeno „a“, ktoré bolo uzavreté a za každú hluchú spoluhlásku bolo vložené písmeno „i“, ktoré sa zatváralo v tej istej neobmedzenej spoluhlásky.
Tí, ktorí si želajú, si môžu sami vyskúšať, čo zmení vetu, ktorú už poznáme.
Je však čas vrátiť sa k tajnej operácii, ktorú plánuje Young Watch. Tie dve trhové handry, ktoré chlapci zachránili pred predajom mafiánskym gangom v zahraničí, boli umiestnené v jednej z mestských internátnych škôl. Ukázali sa ako súrodenci. Alex a Vika prišli o rodičov, ktorí zomreli pri dopravnej nehode. Útok bol spáchaný a osobný vlak v dôsledku výbuchu odišiel z koľajníc. Vzdialení príbuzní ich odmietli a deti boli úplne osirelé. Rodina žila na Ďalekom severe a ich bývanie bolo oficiálne. Osirelé deti boli umiestnené do detenčného centra pre mladistvých, aby ich v budúcnosti bolo možné identifikovať v internátnej škole niekde na pevnine, pretože severné krajiny nazývali región ležiaci južne od polárneho kruhu.
Nikto sa neobťažoval hovoriť deťom o ich budúcom osude a rozhodli sa, že boli poslaní do detského väzenia. Faktom je, že v zásade boli obyvateľmi zadržiavacieho zariadenia tínedžeri, ktorí sa dopustili trestných činov a čakali na ich odoslanie do špeciálnych vzdelávacích inštitúcií pre mladistvých páchateľov. Preto utiekli a nalodili prvý vlak, ktorý narazil. Dirigent ich ľutoval a pomohol sa dostať na miesto určenia. A tak skončili v našom meste, zmenili sa na neplnoletých bezdomovcov a prerušili ich skládky na trhu a zvláštne práce.
Keď Leshka a Vika prežili zajatie v kufri džípu, prišli na pohľad na úrady, ktoré ich identifikovali v internátnej škole. Vedeli, že ich spasenie bolo spôsobené nedávnymi nepriateľmi a boli vďační mladým strážcom. Deti často navštevovali svoje oddelenia, priniesli im jednoduché dary a bavili sa spolu. Siroty sa ukázali byť dobrými kamarátmi a ich ľudské vlastnosti neboli nižšie ako ich noví priatelia. Na jednom zo stretnutí ústredia Young Watch sa rozhodlo, že najbližšími kandidátmi na vstup do tajnej organizácie budú práve Leshka a Vika.
Postupom času však boli bývalí roztrhaní ľudia tmavší a tmavší a Leshka na poslednom stretnutí nečakane oznámil, že on a Vika utečú z internátnej školy.
- Prečo? - úprimne prekvapená Marinka, - je to tam naozaj zlé?
"Zlé," smutne povedala Vika.
"A každý deň sa zhoršuje," dodala Leshka sklesle.
"Čo sa stalo?"
"Starý režisér nedávno odišiel do dôchodku," uviedla Leshka, "a nový režisér rozptýlil polovicu predchádzajúcich zamestnancov a najal si vlastných, a to sú solídni podvodníci a zlodeji."
"Stále bojujú," uviedla Vika, "najmä nový manažér zásobovania." Každý, koho považuje za vinného, ​​je vtiahnutý do svojej technickej miestnosti a je zbitý železným vládcom. A začali sa kŕmiť veľmi zle: je to malé a bez chuti ...
A začali sa snažiť hovoriť o rôznych zneužívaniach novej správy internátnej školy. A všeobecne sa niekde začalo posielať veľké množstvo detí, údajne adoptovaných cudzincami. Ale je to tak, nikto nevie. Očarujúce zahraničné autá však skutočne jazdia do budovy centrálnej školy a riaditeľ sa začal obliekať ako milionár alebo bankár. Nehovorí o svojej práci - niekedy sa už niekoľko dní neobjavuje v škole.
"Sova sa správa arogantne a pravdepodobne predáva žiakov, pretože tie najzdravšie a najkrajšie deti zmiznú," uviedla presvedčená Vika.
- Čo sova? - Marinka a Genka zvolali takmer jednotne.
"No, naša nová režisérka, hneď sme jej zavolali Sova," vysvetlila Vika, "vyzerá ako sova a jej zvyky sú sovy." A keď som sám náhodou videl oknom, ako jej nejaký tučný strýko, ktorý jazdil v cudzom aute, dal jej peniaze.
"Je lepšie sa vrátiť na trh," zhrnula Lesha smutne, "než žiť v takýchto podmienkach, ale počkať, až budeš predaný ako otrok."
"Počkaj, počkaj ..." posmievala sa Genka, "dobre, utečeš a čo s ostatnými žiakmi?" Takže budú umývať?
- Naozaj! - ostatní hliadky to držali, - nedávaš zatratenie ostatným, alebo čo?
"Existuje niekoľko stoviek detí, takmer sedemsto bez dvoch tuctov," uviedol Roba, "a každá z nich má právo na šťastné detstvo."
"Nech všetci utečú, nikto im nezakáže," zamračene povedala Vika.
„Nie, to nebude fungovať,“ povedala Marinka rozhodne, „naše motto je: zomrieť sám sebou a pomôcť svojmu súdruhovi a ...“
- Všetko pre jedného a jedno pre všetkých! - priateľsky zdvihol zvyšok strážcov.
Po krátkej výmene názorov sa rozhodli. Vika a Leshka zostávajú v internátnej škole a začnú zhromažďovať informácie o všetkých odporných činech režiséra a jeho pomocníkov. Na druhej strane, Marinka a jej kamaráti navštevujú internátnu školu pod zámienkou niektorých šéfkuchárov a pomaly sa pýtajú svojich obyvateľov na urážky, ktoré sa odohrávajú, ako aj na zhromažďovanie fotografických dokumentov a ďalšej dokumentácie na túto tému. Potom sa všetko zhromaždené postúpi výkonnému výboru mesta alebo dokonca prokuratúre mesta, v závislosti od stupňa kriminality zozbieranej špiny. Táto operácia sa volala „adopcia“ a hliadky okamžite začali realizovať plán, ktorý začali, počnúc návštevou internátnej školy.
Pokračovanie

Zostavené alebo interpretované?

Kompilátor analyzuje celý program, zmení ho na strojový kód a uloží ho na neskoršie vykonanie. Tlmočník analyzuje a vykonáva programové riadky po riadku v reálnom čase.

Technicky je možné zostaviť alebo interpretovať akýkoľvek jazyk. Ale pre každý jazyk je jedna z metód vhodnejšia ako druhá a ďalší spôsob je stanovený paradigmou. Vo všeobecnom zmysle je interpretácia flexibilná a kompilácia poskytuje vysoký výkon, je to však iba špička mimoriadne komplexnej témy.

Chcel som vytvoriť jednoduchý a zároveň produktívny jazyk, ktorý je málo, takže od samého začiatku som sa rozhodol zostaviť Pinecone. Pinecone má však aj tlmočníka - prvé spustenie bolo možné iba s jeho pomocou, neskôr vysvetlím prečo.

Pribl. Trans. Mimochodom, máme krátku recenziu na sériu článkov o vytvorení vlastného tlmočníka - toto je vynikajúce cvičenie pre tých, ktorí študujú Python.

Výber jazyka

Zvláštny meta-krok: samotný programovací jazyk je program, ktorý musí byť napísaný v nejakom jazyku. Vybral som si C ++ z dôvodu jeho výkonu, jeho veľkej sady funkcií a jednoducho preto, že sa mi to páči.

Vo všeobecnosti je však možné poskytnúť nasledujúce rady:

  • interpretoval YP vysoko odporúčanépísať na kompilovanom YaP (C, C ++, Swift). Inak strata výkonu porastie ako snehová guľa, zatiaľ čo meta-tlmočník interpretuje vášho tlmočníka,
  • zostavené YP vie písať vo tlmočenom jazyku (Python, JS). Čas kompilácie sa predĺži, ale nie čas potrebný na vykonanie programu.

Lexikálny analyzátor / lexer

Riadok zdrojového kódu prechádza cez lexer a mení sa na zoznam tokenov.

Prvým krokom vo väčšine PL je lexikálna analýza. Jednoducho povedané, ide o rozdelenie textu na tokeny, tj jednotky jazyka: premenné, názvy funkcií (identifikátory), operátory, čísla. Teda vložením riadka so zdrojovým kódom do vstupného lexera dostaneme zoznam všetkých tokenov, ktoré obsahuje.

K zdrojovému kódu sa už nebude pristupovať v nasledujúcich krokoch, takže lexer musí poskytnúť všetky potrebné informácie.

Pri vytváraní jazyka som ako prvá urobil lexer. Neskôr som preskúmal nástroje, ktoré by uľahčili lexikálnu analýzu a znížili počet vznikajúcich chýb.

Jedným z hlavných nástrojov je Flex - generátor lexikálnych analyzátorov. Dostane súbor s popisom gramatiky jazyka a potom vytvorí program v jazyku C, ktorý následne analyzuje reťazec a vytvára požadovaný výsledok.

Moje rozhodnutie

Rozhodol som sa zanechať analyzátor napísaný mnou. Nevidel som žiadne konkrétne výhody Flexu a jeho použitie by vytvorilo iba ďalšie závislosti, ktoré komplikujú proces montáže. Okrem toho môj výber poskytuje väčšiu flexibilitu - napríklad môžete do jazyka pridať operátora bez potreby úpravy viacerých súborov.

Analyzátor / analyzátor

Zoznam tokenov prechádza cez syntaktický analyzátor a mení sa na strom.

Ďalšou fázou je syntaktický analyzátor. Konvertuje zdrojový text, to znamená zoznam tokenov (berúc do úvahy zátvorky a poradie operácií), do abstraktného stromu syntaxe, ktorý umožňuje štruktúrne znázorniť pravidlá vytvoreného jazyka. Samotný proces sa dá nazvať jednoduchý, ale so zvyšujúcim sa počtom jazykových konštrukcií sa stáva veľmi komplikovaným.

V tomto kroku som tiež uvažoval o použití knižnice tretej strany, keď zvážim Bisona na vygenerovanie syntaktického analyzátora. V mnohých ohľadoch je veľmi podobný Flexu - užívateľský súbor s pravidlami syntaxe je štruktúrovaný pomocou programu C. Opäť som však opustil nástroje automatizácie.

Výhody vlastného programu

S lexerom bolo moje rozhodnutie písať a používať vlastný kód (asi 200 riadkov dlhé) celkom zrejmé: mám rád hádanky, a tento je tiež pomerne banálny. Syntaktický analyzátor má iný príbeh: teraz je jeho dĺžka 750 riadkov a toto je tretí pokus (prvé dva boli jednoducho hrozné).

Rozhodol som sa však urobiť syntaktický analyzátor sám. Toto sú hlavné dôvody:

  • minimalizovať prepínanie kontextu
  • zjednodušenie montáže,
  • túžba vyrovnať sa s úlohou sami.

O výhodnosti riešenia presvedčilo vyhlásenie Waltera Brighta (tvorcu jazyka D) v jednom z jeho článkov:

Neodporúčam používať lexikálne a syntaktické analyzátory, ako aj iné takzvané kompilátory kompilátorov. Písanie slovníka a syntaktického analyzátora nezaberie veľa času a použitie generátora vás k nemu bude v budúcnosti pevne spájať (na čom záleží pri prenose kompilátora na novú platformu). Okrem toho sa generátory vyznačujú generovaním irelevantných chybových hlásení.

Abstraktný sémantický graf

Prechod zo stromu syntaxe na sémantický graf

V tejto časti som implementoval štruktúru, ktorá je vo svojej podstate najbližšia „strednému zastúpeniu“ v LLVM. Medzi abstraktným stromom syntaxe (ASD) a abstraktným sémantickým grafom (ASG) je malý, ale dôležitý rozdiel.

ASG vs ASD

Sémantický graf je zhruba syntaxový strom s kontextom. To znamená, že obsahuje informácie, ako je typ funkcie, ktorá sa vracia alebo na ktorých miestach sa používa rovnaká premenná. Pretože graf musí rozpoznávať a pamätať si všetky tieto súvislosti, kód, ktorý ho generuje, potrebuje podporu vo forme rôznych vysvetľujúcich tabuliek.

Po zostavení grafu sa spustenie programu stáva pomerne jednoduchou úlohou. Каждый узел содержит реализацию функции, которая получает некоторые данные на вход, делает то, что запрограммировано (включая возможный вызов вспомогательных функций), и возвращает результат. Это — интерпретатор в действии.

Написать свой компилятор

Сначала мне понравилась эта мысль — я люблю делать вещи сам, к тому же давно хотел изучить язык ассемблера. Вот только создать с нуля кроссплатформенный компилятор — сложнее, чем написать машинный код для каждого элемента языка. Túto myšlienku považujem za absolútne nepraktickú a nestojí za vynaložené prostriedky.

LLVM je zbierka kompilačných nástrojov, ktoré používajú napríklad spoločnosti Swift, Rust a Clang. Rozhodol som sa pre túto možnosť prebrať, ale opäť som nevypočítal zložitosť úlohy, ktorú som si stanovil. Pre mňa to nebol problém ovládať zostavovateľ, ale pracovať s obrovskou viaczložkovou knižnicou.

Transpayling

Stále som potreboval nejaké riešenie, tak som napísal niečo, čo by fungovalo s istotou: transpilátor z Pinecone do C ++ - kompiluje sa ako „zdrojový kód do zdrojového kódu“ a tiež pridal schopnosť automaticky kompilovať výstup s GCC. Táto metóda nie je ani škálovateľná, ani multiplatformová, ale v súčasnosti funguje aspoň pre takmer všetky programy Pinecone, je to už dobré.

záver

Dúfam, že tento článok je pre niekoho užitočný. Dôrazne odporúčam aspoň sa pokúsiť napísať svoj vlastný jazyk, napriek tomu, že musíte porozumieť mnohým podrobnostiam o implementácii - je to výučba, vývoj a iba zaujímavý experiment.

Tu sú všeobecné tipy odo mňa (samozrejme celkom subjektívne):

  • Ak nemáte žiadne preferencie a máte pochybnosti o tom, či je zostavený alebo tlmočený jazyk napísaný, vyberte druhý jazyk. Tlmočené jazyky sa zvyčajne ľahšie navrhujú, zostavujú a učia sa,
  • s lexermi a parsery robia, čo chcete. Používanie automatizačných nástrojov závisí od vášho želania, skúseností a konkrétnej situácie,
  • Ak nie ste pripravení / nechcete tráviť čas a úsilie (veľa času a úsilia) pri navrhovaní vlastnej stratégie vývoja jadrových zbraní, postupujte podľa krokov uvedených v tomto článku. Venoval som tomu veľa úsilia a funguje to,
  • znovu, ak nemáte dostatok času / motivácie / skúsenosti / túžby alebo niečoho iného na to, aby ste napísali klasický YP, skúste napísať esoterik, ako je napríklad Brainfuck. (Odporúčame vám pamätať na to, že ak je jazyk napísaný pre zábavu, neznamená to, že jeho písanie je tiež čistou zábavou. - približne.

Počas vývoja som urobil niekoľko chýb, ale už som prepísal väčšinu kódu, ktorý by mohol ovplyvniť. Jazyk teraz funguje dobre a bude sa rozvíjať (v čase písania by mohol byť postavený na Linuxe as rôznym úspechom na MacOS, ale nie na Windows).

Skutočnosť, že som sa zapojil do príbehu vytvorením borovice, ju v žiadnom prípade neľutuje - je to vynikajúci experiment a práve sa začal.

Ako Yandex využíva vaše údaje a strojové učenie na prispôsobenie služieb - čítajte a sledujte YaC 2019.