Zadání studentského softwarového projektu
MCml2

Motivace projektu

Při konfiguraci složitějších systémů (softwarových balíků) se často řeší obecný problém nastavení hodnot konfiguračních symbolů (parametrů), které jsou mezi sebou provázány pravidly. Typickým případem je například konfigurace linuxového jádra, kde například nemůžeme nastavit zvukovou kartu na Sound Blaster 32, když jsme předtím rozhodli, že nechceme zvuk a podobně. Projekt MCml2 se snaží o řešení tohoto problému vytvořením obecného konfiguračního nástroje založeného na jazyce CML2.

Jazyk CML2 je deklarativní - neříká tedy, jak se má se symboly manipulovat, ale jen co má platit a tím velmi usnadňuje proces utváření konfiguračních pravidel. Navíc dává velké možnosti v síle interpretace, které MCml2 může využít.

MCml2 ocení především každý, kdo bude chtít nakonfigurovat nějaký větší systém a zjistí, že počet různých pravidel mu již přerůstá přes hlavu. Hlavním důvodem pro vytvoření cml2 a potažmo MCml2 je konfigurace linuxového jádra, nicméně použitelnost tohoto nástroje je mnohem širší.

Přesnější popis MCml2

MCml2 bude nástroj, jímž se z deklarativního popisu závislostí mezi položkami konfigurace vygeneruje konfigurační program. V něm si uživatel interaktivně nastaví konfiguraci podle svého, ale s respektováním závislostí a omezení. Vstupem MCml2 je text v deklarativním jazyce cml2. Označme tuto část ZDROJ. Ten se nejprve zkompiluje velmi rychlým (v C napsaným) kompilátorem (lexikální až sémantická analýza) do datových struktur a otestují se kruhové závislosti. Tuto část nazveme PARSER. Výsledek PARSERU se předá (mezivrstvou) generátoru našeho metajazyka GENENG. GENENG vygeneruje dané vstupní databázi symbolů a pravidel(ZDROJ) na míru šitou výkonnou jednotku - jádro výsledného programu. To bude ovšem v metajazyku, který je možné si představit jako zobecnění několika procedurálních programovacích jazyků. Tuto vygenerovanou část nazveme V1. K V1 se ještě přidá V2 - výsledek generátoru uživatelského rozhraní (řekněme GENUI). GENUI bere rovněž jako zdroj výsledek PARSERU a generuje opět kód v metajazyku. K V1 a V2 se ještě přidá V3 - GUI (v podobě metajazyka nebo jako kód v nějakém konkrétním jazyce). Toto GUI dodá generátor GUI. Navíc, GENUI má na starosti vygenerování MCml2 strany autokonfiguračního protokolu AMP, který pro účel komunikace s případným autokonfiguračním nástrojem vyvíjíme (odkaz ukazuje stávající stav protokolu).

Na části V1,V2,V3 (což je kód programu napsaný až na GUI skoro celý v metajazyku) nyní pustíme kompilátor KOMPMETA, který je překompiluje do jazyka, který výsledný uživatel bude chtít. Vlastně půjde o několik kompilátorů. Řekněme, že cílový uživatel chce kód v C - KOMPMETA1 převede metajazyk do C a přidá GUI napsané v C. Bude mít tedy program v C, který již mimo jiného obsahuje i všechna data ze ZDROJe, ten zkompiluje a nakonfiguruje si, co je třeba. Jako další z jazyků předpokládáme Javu - pak se vezme V1,V2, příp. V3, zkompilují se do Javy kompilátorem řekněme KOMPMETA2. Uživatel tedy opět bude mít jen výsledný kód v Javě, který si podle potřeby převede na bytecode a pustí na jakékoliv JVM. Koncový uživatel bude mít program v jazyce, v jakém bude chtít. Ten si zkompiluje (protože si jistě vybere jazyk, pro který má kompilátor) a spustí.

Největší možnosti na zvýšení síly programu jsou v části GENENG - generování výkonné jednotky jazyka. Je zde možné k různým optimalizacím využít toho, že celá databáze pravidel a symbolů (ZDROJ) je známá. Náznak toho, co je zde možné optimalizovat je možné se dočíst v sekci Hlavní rysy a možnosti CML2.

Závazné cíle projektu

Ostatní (nezávazné) cíle

Další informace o projektu

Projekt bude psán v C, Prologu a metajazyku.

Vedoucím je Martin Beran.

Projekt navazuje na zrušený projekt cml2.
JménoČást projektu Stav
Staří členové projektu:
Petr Šváb kompilátor cml2 (do struktur)téměř vše
návrh chování cml2 engineněco již je
komunikace s vývojáři
organizace
Jiří Vyskočil implementace cml2 enginekvůli absenci návrhu chování nic
metajazyk (implementace a správa kompilátoru)hodně, ale jazyk je stále rozšiřován
Libor Dener UI's(Command line, curses)něco již je
autoconf. protokol a MCml2 strananěco
pomoc s GUIGUI není vůbec
Noví členové:
Daniela Dybalová, Martin Trčka správa WWW stránek
dokumentacenení
GUI a jeho designnení nic
další potřebné věci
Odcházející člen:
Julius Štroffek správa stránek
implementace cml2 enginenic
návrh chování cml2 enginev podstatě nic

Hlavní rysy a možnosti cml2

Jedním ze základních kamenů je CML2. Jde o deklarativní zápis symbolů a jejich hodnot, hierarchické provázání symbolů, provázání přes pravidla a další informace. Chceme-li například symbol test, napíšeme

symbols test 'Text, který se zobrazí, když má byt symbol vidět'
nebo ho prostě jen někde uvedeme a cml2 si domyslí (bude-li to možné), že to má být symbol. Zavést mezi symboly hierarchii se dá deklarací menu - například
 menu domy    
   nas    
   souseduv   
To rovněž přiřazuje symbolům typy. Z dalších konstruktů pro ilustraci uvedeme ještě ten nejpodstatnější, a to podmiňování. Podmínku, že pokud máme šneka (snek==y), pak máme i ulitu (ulita==y) při konfiguraci zahrádky zadáme například:
 require snek==y implies ulita==y

Velkým prostorem je takzvané nucení a s ním spojené vedlejší efekty. Například máme-li:

 (A and C) => B 
kde A,B=false a C=true a uživatel nastaví A=true, pak jediný způsob, jak může být tato podmínka splněna je nastavení B na true. To je případ vynucení, které může cml2 výkonné jádro dělat za uživatele, aby mu umožnilo snazší práci.

Předpokládejme však nyní, že uživatel se rozhodl vzít své neuvážené kroky zpět a vrátil A na false. Pak by ovšem očekával, že je ve stejné situaci, jako před tím, než A nastavit na true. K tomu slouží mechanismus odstraňování vedlejších efektů, aby zajistil, že B se nyní opět uvede na false. Kdyby systém takto fungoval, pak by uživatel klidně nastavoval symboly, jak by chtěl a nemusel by se bát, že když nastaví A,B,C tak bude mít symboly v jiné konfiguraci, než když je zadá v pořadí B,A,C!

Jenže situace samozřejmě není tak snadná, jako v tomto triviálním případě. Například pro

 (A and B) => C ,  C =>non A 
není vůbec jasné, jak má nucení dopadnout.

Takových problémů je samozřejmě mnohem více a celá oblast není vůbec probádaná. Alespoň částečně prozkoumat mechanismy vynucování je tedy rovněž nutnou součástí našeho projektu.