Informatii generale
- Categorie: Utilitar
- Judetul: Argeș
- Surse: GitHub - Edd12321/zrc: The Zrc UNIX shell and scripting language.
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