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ší.
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.
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 engine | něco již je | |
komunikace s vývojáři | ||
organizace | ||
Jiří Vyskočil | implementace cml2 engine | kvů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 strana | něco | |
pomoc s GUI | GUI není vůbec | |
Noví členové: | ||
Daniela Dybalová, Martin Trčka | správa WWW stránek | |
dokumentace | není | |
GUI a jeho design | není nic | |
další potřebné věci | ||
Odcházející člen: | ||
Julius Štroffek | správa stránek | |
implementace cml2 engine | nic | |
návrh chování cml2 engine | v podstatě nic |
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 souseduvTo 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) => Bkde 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 Anení 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.