Zrc - Un limbaj de scripting - Utilitar - Argeș - Lucrari 2023 Nationala

Informatii generale

Descriere

Zrc este un limbaj de shell gandit pentru scripturi mai complexe. Suporta lucruri care sunt imposibile in limbajele bazate pe simplul sh (ex: functii care returneaza valori arbitrare, nu doar 0-255).
Are o sintaxa complet dinamica in stil Tcl (totul este un string, chiar si “blocurile” de cod), suporta lexical scoping, hashmap-uri, control flow complex (break, continue), definirea de keyword-uri personalizate, macro-uri/alias-uri, un line editor, fisier de configuratie, signal-trapping, o biblioteca standard, job control si multe altele.

Zrc are peste 50 de comenzi built-in, si poate apela programe externe/proceduri definite de catre utilizator.

Tehnologii

Limbajul a fost scris in C++. Baza de cod este extrem de minimalista (~2500SLOC, mult mai mica decat rc, care are ~9000SLOC).
La baza limbajului consta un lexer care delimiteaza un flux/string/etc. in mai multe “cuvinte”, si un evaluator care converteste cuvintele in “pipeline”-uri alcatuite din mai multe “comenzi”. Limbajul este implementat intr-un mod complet recursiv, iar comportamentul oricarui script este complet predictibil daca cunosti regulile de sintaxa.
Fiecare comanda contine numai cuvinte. De exemplu, comanda “if” are 2 argumente: un string care reprezinta o expresie aritmetica, si alt string care reprezinta un script care va fi evaluat daca conditia evalueaza != 0. Nu exista conceptul de “bloc de cod”, totul cu exceptia operatorilor de shell/herestring/heredoc/operatorului de expansiune ({*}) sunt cuvinte. Aceasta uniformitate sintactica ii ofera programatorului de a redefini cu usurinta sintaxa sa, asemenea Tcl (cunoscut si sub sintagma de “Chameleon Language”).
Comenzile, builtin-urile si functiile sunt stocate in dispatch table-uri (std::unordered_map<std::string, std::function<…> >), si pot fi lansate ori in serie ori in paralel.

Lexer-ul este folosit nu numai in interpreter-ul propriu-zis, ci si pentru multiplele DSL-uri prezente in limbaj (comanda switch, de exemplu, este un astfel de “DSL”, care foloseste regulile de word-splitting pentru a implementa un mini-limbaj inauntrul Zrc. De asemenea, implementarea din zrclib a listelor utilizeaza si ea word-splitting-ul standard Zrc).

Pentru construirea proiectului, am optat sa folosesc Makefile (dar nu este obligatoriu pentru a compila Zrc).

Cerinte sistem

  • (Pentru compilare) Un compilator care suporta C++17
  • Environment UNIX (Cygwin, GNU/Linux, BSD, etc.)
  • (Pentru heredoc) prezenta /tmp

Realizatori

Eduard-Octavian Sandu-Popa

  • Scoala: Colegiul National “Zinca Golescu”
  • Clasa: 10
  • Judet: Argeș
  • Oras: Pitesti

Screenshots