univerzita komenskÉho v bratislave€¦ · web view1.1.1 ye olde turing machine. 10 1.1.2...

60
UNIVERZITA KOMENSKÉHO V BRATISLAVE FAKULTA MATEMATIKY, FYZIKY A INFORMATIKY Evidenčné číslo: 88d03097-8c27-488f-b24f-63b7897ae843 SIMULÁTOR TURINGOVHO STROJA

Upload: others

Post on 10-Jul-2020

4 views

Category:

Documents


0 download

TRANSCRIPT

UNIVERZITA KOMENSKÉHO V BRATISLAVEFAKULTA MATEMATIKY, FYZIKY A INFORMATIKY

Evidenčné číslo: 88d03097-8c27-488f-b24f-63b7897ae843

SIMULÁTOR TURINGOVHO STROJA

2012

Michal Lacko

UNIVERZITA KOMENSKÉHO V BRATISLAVEFAKULTA MATEMATIKY, FYZIKY A INFORMATIKY

SIMULÁTOR TURINGOVHO STROJA

Bakalárska práca

Študijný program: Aplikovaná informatikaŠtudijný odbor: 9.2.9 Aplikovaná informatikaŠkoliace pracovisko: Katedra aplikovanej informatikyŠkoliteľ: RNDr. Michal Winczer, PhD.

Bratislava, 2012

Michal Lacko

UNIVERZITA KOMENSKÉHO V BRATISLAVEFAKULTA MATEMATIKY, FYZIKY A INFORMATIKY

ZADANIE PRÁCE

Meno a priezvisko študenta: Michal LackoŠtudijný program: Aplikovaná informatikaŠtudijný odbor: 9.2.9 Aplikovaná informatikaTyp záverečnej práce: bakalárska prácaJazyk záverečnej práce: slovenský

Názov práce: Simulátor Turingovho stroja

Cieľ práce:Vytvorenie on-line simulátora Turingovho stroja. Simulátor by mal pracovať ako web aplikácia využitím technológie Silverlight. Dôraz bude na vytvorení priateľského používateľského rozhrania.

Školiteľ: RNDr. Michal Winczer, PhD.Katedra: Katedra aplikovanej informatikyVedúci katedry: doc. PhDr. Ján Rybár, PhD.

Spôsob sprístupnenia elektronickej verzie práce:sprístupňovanie vyhotovenej digitálnej rozmnoženiny školského diela on-lineprostredníctvom internetu bez obmedzenia, vrátane práva poskytnúť sublicenciu tretej osobe na študijné, vedecké, vzdelávacie a informačné účely.

Dátum potvrdenia finálnej verzie práce, súhlas s jej odovzdaním (vrátane spôsobu sprístupnenia):

V Bratislave, xx.xxxx 2012 .........................................

RNDr. Michal Winczer, PhD.

Abstrakt

LACKO, Michal: Simulátor Turingovho stroja.[Bakalárska práca] – Univerzita Komenského v Bratislave. Fakulta matematiky, fyziky a informatiky.Katedra aplikovanej informatiky. – Vedúci záverečnej práce: RNDr. Michal Winczer. PhD. Komisia pre obhajobu: Aplikovaná informatika. Predseda komisie: XXXXXXXXXXXXX.Stupeň odbornej kvalifikácie: bakalár aplikovanej informatiky.Bratislava: FMFI UK, 2012, XX strán.

Cieľom našej práce bolo vytvoriť simulátor Turingovho stroja. Návrhu na aplikáciu predchádzala analýza vybraných existujúcich riešení na túto tému. Naše požiadavky sme si rozdelili na funkčné a nefunkčné tak aby sme splnili okrem iného cieľ vytvoriť užívateľské prostredie na vysokej úrovni. Aplikáciu sme vytvorili za pomoci technológie Silverlight. Pri realizovaní projektu sa nám okrem vizualizácie podarilo pridať aj ďalšie vybrané funkcie: testovanie, história prechodov či rôzne možnosti krokovania. Po vývojárskej stránke možno aplikáciu rozdeliť na hlavné okno a podokná s kódom na pozadí a triedy, ktoré realizujú samotnú simuláciu a ďalšie funkcie vyplývajúce z požiadaviek na aplikáciu.

Výsledkom tejto práce je webová aplikácia, ktorá spĺňa naše funkčné aj technické požiadavky.

Kľúčové slová

Turingov stroj, webová aplikácia, simulácia, vizualizácia, Silverlight

Obsah

ZOZNAM SKRATIEK, SYMBOLOV A POJMOV................................................6

ZOZNAM OBRÁZKOV A TABULIEK...................................................................7

ÚVOD............................................................................................................................8

CIELE PRÁCE...............................................................................................................8

1 ANALÝZA EXISTUJÚCICH RIEŠENÍ................................................................9

1.1.1 Ye Olde Turing Machine.............................................................................101.1.2 XTuringMachine.........................................................................................111.1.3 Turing in a flash..........................................................................................121.1.4 Turing machine simulator in Silverlight 4.0...............................................131.1.5 Tuatara Turing Machine Simulator............................................................141.1.6 Dušan Rodina: Turingov stroj (v.1.6).........................................................15

1.2 ZÁVER ANALÝZY................................................................................................17

2 POŽIADAVKY NA APLIKÁCIU.........................................................................18

3 SILVERLIGHT.......................................................................................................19

3.1 HISTÓRIA TECHNOLÓGIE SILVERLIGHT..............................................................193.2 VYBRANÉ TECHNOLOGICKÉ MOŽNOSTI SILVERLIGHT........................................21

3.2.1 Vstupno-výstupné prvky..............................................................................213.2.2 Ukladanie a načítavanie súborov................................................................223.2.3 Spracovanie výnimiek..................................................................................223.2.4 Základná grafika.........................................................................................233.2.5 Grafické efekty a transformácie..................................................................233.2.6 Užívateľské udalosti....................................................................................25

4 NÁVRH A IMPLEMENTÁCIA............................................................................26

4.1 POUŽÍVATEĽSKÉ ROZHRANIE..............................................................................264.1.1 Zobrazenie stavov........................................................................................264.1.2 Zobrazenie, vytvorenie a úprava stavu – prechody....................................274.1.3 Vizualizácia stavov a ich prechodov...........................................................284.1.4 Spustenie a krokovanie programu...............................................................314.1.5 Zobrazenie histórie prechodov....................................................................324.1.6 Testovanie programu..................................................................................32

4.2 IMPLEMENTÁCIA TURINGOVHO STROJA.......................................................344.2.1 Trieda Stav a štruktúra Prechod.................................................................344.2.3 Trieda Turing..............................................................................................374.2.4 Ukladanie a načítavanie súborov................................................................384.2.5 Ukladanie nastavení a Cookies...................................................................40

ZÁVER........................................................................................................................41

MOŽNÉ POKRAČOVANIE PRÁCE......................................................................41

POUŽITÁ LITERATÚRA........................................................................................42

Príloha: Zdrojový kód aplikácie...............................................................................43

Zoznam skratiek, symbolov a pojmov

Zoznam obsahuje vysvetlenie používaných pojmov tak ako sa majú podľa autorov chápať v rámci práce. Zoznam je usporiadaný v abecednom poradí.

Applet program napísaný v jazyku JAVA, ktorý sa dá spustiť v rámci prehliadača prostredníctvom pluginu.

Drag and drop technika, pomocou ktorej sa premiestňujú grafické prvky prostredníctvom myši.

Exception handling spracovanie výnimiek vyskytujúcich sa v rámci aplikácie.

Flash (Adobe Macromedia Flash) je platforma umožňujúca pridanie interaktívnych a grafických prvkov (video a animácie).

Framework množina knižníc či tried, ktoré sa využívajú pri softvérových systémoch.

Kontajner predstavuje množinu prvkov, ktoré môžu byť vykreslené podľa konkrétnej implementácie či nastavenia kontajnera.

Kód na pozadí/Codebehind

technika používaná firmou Microsoft, v rámci ktorej je kód stránky a aplikačný kód rozdelený do rôznych súborov.

Pixel Predstavuje jeden bod. Najmenšiu grafickú jednotku v rastovej grafike.

Plugin/Plug-in množina softvérových komponentov, ktoré pridávajú funkcionalitu určitým typom aplikácii.

SaveFileDialog/OpenFileDialog

dialógové okno, ktoré umožňuje používateľovi vybrať si súbor z priestoru na disku či iných médií.

UnhandledException/Exception

spracovaná či nespracovaná výnimka vyvolaná v rámci kódu aplikácie.

XAML

(eXtensible Application Markup Language) deklaratívny XML jazyk vytvorený firmou Microsoft. Používa sa na definovanie a inicializáciu hodnôt a objektov.

XMLrozšíriteľný značkovací jazyk (eXtensible Markup Language) umožňujúci vytváranie značkovacích jazykov pre rôzne údajové typy.

Zoznam obrázkov a tabuliek

OBRÁZOK 1 YE OLDE TURING MACHINE.....................................................................10OBRÁZOK 2 XTURINGMACHINE...................................................................................11OBRÁZOK 3 TURING IN FLASH: PRÍKLAD VIZUALIZÁCIE..............................................12OBRÁZOK 4 TURING MACHINE SIMULATOR..................................................................13OBRÁZOK 5 TUATARA TURING MACHINE SIMULATOR................................................14OBRÁZOK 6 DUŠAN RODINA: TURINGOV STROJ (V.1.6) VIZUALIZÁCIA SIMULÁTORA.15OBRÁZOK 7 ARCHITEKTÚRA SILVERLIGHT 2...............................................................19OBRÁZOK 8 PRÍKLADNÁ TABUĽKA STAVOV.................................................................26OBRÁZOK 9 PRÍKLADNÝ STAV S PRECHODMI...............................................................27OBRÁZOK 10 PRÍKLAD VIZUALIZÁCIE, STAVY SA VYKRESLILI DO KRUHU. PRE 3 STAVY

TO PREDSTAVUJE ROVNOSTRANNÝ TROJUHOLNÍK................................................28OBRÁZOK 11 ORIENTÁCIA TEXTU SA MENÍ PODĽA UHLA ŠÍPKY..................................29OBRÁZOK 12 ZOBRAZENIE MENU PO POUŽITÍ PRAVÉHO TLAČIDLA MYŠI....................30OBRÁZOK 13 DCÉRSKE OKNO URČENÉ NA RÝCHLE PRIDANIE STAVU..........................30OBRÁZOK 14 PRÍKLADNÉ PRIDANIE PRECHODU MEDZI 2 STAVMI................................30OBRÁZOK 15 MOŽNOSTI SPÚŠŤANIA PROGRAMU: RUČNÉ KROKOVANIE, SPUSTENIE

PROGRAMU DO KONCA, AUTOMATICKÉ KROKOVANIE S NASTAVENÍM ČASOVÉHO ODSTUPU PRI KROKOVANÍ AKO AJ MOŽNOSŤ PRERUŠENIA...................................31

OBRÁZOK 16 ZVÝRAZNENIE PRECHÁDZANÝCH HRÁN V GRAFE EFEKTOM ROZMAZANIA..............................................................................................................................32

OBRÁZOK 17 HISTÓRIA PRÍKLADNÉHO PROGRAMU PO AKCEPTÁCII SLOVA.................32OBRÁZOK 18 PRÍKLADNÉ TESTOVANIE PROGRAMU.....................................................33Obrázok 19 Diagram vzťahov tried.............................................................................35

TABUĽKA 1 SUMARIZAČNÁ TABUĽKA SIMULÁTOROV.................................................18

Úvod

K potrebe vytvoriť simulátor Turingovho stroja ma viedlo štúdium na škole v rámci ktorej sa zaoberáme aj teoretickou informatikou. Pri riešení komplexných úloh za pomoci Turingovho stroja som ocenil existujúce simulátory Turingovho stroja. Simulátory mali ale svoje nedostatky, ktoré sa nakoniec stali mojou inšpiráciou k vlastnému riešeniu.

Predovšetkým on-line simulátory často zaostávali za možnosťami desktopových aplikácii. Vedel som že tu sú aj technológie s obdobnými možnosťami, ktoré by sa mohli využiť.

Rozhodli sme sa vytvoriť simulátor s technológiou Silverlight ktorej aplikácie sú dostupné on-line a majú možnosti obdobné desktopovým. Verím že naša práca nájde svoje uplatnenie v mnohých akademických úlohách ako rýchla a intuitívna pomôcka.

Pri tvorbe simulátora sme sa rozhodli zohľadňovať teoretické základy uvedené v rámci knihy J. Hromkovič, Theoretical Computer Science.

Ciele práce

Ciele našej práce je možné zhrnúť do nasledujúcich bodov:1. zanalyzovať a vyhodnotiť existujúce riešenia simulátorov Turingovho stroja2. oboznámiť sa s technológiou Silverlight3. navrhnúť používateľské prostredie a vizualizáciu pre vlastné riešenie

simulátora4. implementovať navrhnutý simulátor

Michal Winczer, 03.01.-0001,
Toto prepiseme cele na koniec.
Michal, 03.01.-0001,
TODO este premysliet

1 Analýza existujúcich riešení.

Vybrané riešenia zachytávajú široké spektrum zaužívaných technológii. Analýzu sme sústredili na spoločné črty simulátorov: úroveň užívateľského prostredia, schopnosť vizualizovať chod programu, technické požiadavky aplikácie a dodatočná funkcionalita (ukladanie programu/pásky, možnosti krokovania a iné).

Jednotlivé riešenia sú zoradené podľa komplexnosti začínajúc najjednoduchším.

1.1.1 Ye Olde Turing Machine.

Stránka aplikácie: http://web.bvu.edu/faculty/schweller/Turing/Turing.html

Jednoduchý online simulátor Turingovho stroja, vytvorený ako JAVA applet.Simulátor umožňuje vytvoriť svoj vlastný program priamo v applete. Inštrukcie vytvoreného programu neumožňujú súčasne pohyb na páske a jej prepis. Simulátor umožňuje automatické aj ručné krokovanie.

Obrázok 1 Ye Olde Turing Machine

Hlavné atribúty aplikácie rýchly prístup bez nutnosti inštalácie. jednoduché textové písanie programu. ručné aj automatické krokovanie. bez možnosti uloženia programu. bez vizualizácie programu či vykonávaných inštrukcii.

1.1.2 XTuringMachine

Stránka aplikácie: http://math.hws.edu/TMCM/java/labs/xTuringMachineLab.html

Online simulátor vytvorený ako JAVA applet. Simulátor sa spúšťa zo stránky kde si vytvorí vlastné okno. V aplikácii sa program realizuje ako tabuľka s nasledujúcimi stĺpcami:

1. aktuálny stav2. znak na páske3. znak na zápis4. pohyb na páske5. nový stav

Používateľ vytvára program editovaním danej tabuľky. Pre symboly a stavy existuje iba vopred daná množina znakov na výber. Aplikácia simuluje program na páske s nastaviteľnou rýchlosťou a možnosťou krokovania.

Pri testovaní aplikácie sa ukázalo ukladanie vytvoreného programu nefunkčné.

Obrázok 2 XturingMachine

Hlavné atribúty aplikácie rýchly prístup bez nutnosti inštalácie. jednoduchá možnosť písania programu. aplikácia umožňuje ručné aj automatické krokovanie programu. nie je funkčne ukladanie programu. je možné použiť iba danú obmedzenú množinu symbolov a stavov. tvorba programu v rámci tabuľky. bez vizualizácie programu či bežiacich inštrukcii.

1.1.3 Turing in a flash

Stránka projektu: http://turinginaflash.com/

Projekt je vytvorený technológie flash, je spustiteľný na domovskej stránke. Simulátor pracuje s vizualizáciou, na ktorej si používateľ môže pomocou drag and drop vytvoriť jednotlivé stavy a prechody medzi nimi. Vizualizácia umožňuje používateľovi interaktívne manipulovať s pozíciami hrán medzi stavmi.

Webová aplikácia umožňuje vytvorené programy a pásku uložiť aj načítať na disk používateľa. Používateľ nemá možnosť pomenovať stavy (stavy sú automaticky očíslované). Abeceda programu sa môže skladať z akýchkoľvek jednoznakových symbolov.

Aplikácia umožňuje ručné aj automatické krokovanie (aj spätné) ako aj dobehnutie programu do konca. Program sa začína na naposledy označenom stave a skončí po dosiahnutí konca pásky.

Projekt na nás zanechal pozitívny dojem aj vďaka dynamickým komentárom, ktoré nás pri testovaní sprevádzali.

Obrázok 3 Turing in flash: príklad vizualizácie

Hlavné atribúty aplikácie webová aplikácia, ktorú nie je nutné inštalovať. aplikácia umožňuje ukladať a načítavať program ako aj pásku. program sa vytvára za pomoci pokročilej vizualizácie. program možno krokovať ručne ako aj automaticky (aj spätným smerom). páska sa môže skladať z akýchkoľvek znakov (vždy jeden znak na jednom

mieste). aplikácia v rámci krokovania zvýrazňuje stavy grafickým efektom. aplikácia umožňuje iba jednosmerný pohyb na páske.

1.1.4 Turing machine simulator in Silverlight 4.0

Projekt je na stiahnutie tu: http://sourceforge.net/projects/tmssilverlight/

Projekt nemá svoju vlastnú stránku, aplikáciu je možné spustiť v programe Visual Web Developer 2010. Projekt je vytvorený technológiu Microsoft Silverlight v jazyku C#.

Simulátor obsahuje príkladne programy Turingovho stroja, ktoré sa dajú jednoducho načítať. Páska sa zobrazuje v jednoduchej tabuľke a zároveň aj v klasickom textovom poli. Simulátor umožňuje krokovanie aj zastavenie bežiacej simulácie. Vždy sa zobrazuje aktuálny stav simulácie (páska a stav).

Simulátor obsahuje ešte podokno s informáciami o Alanovi Turingovi.

Obrázok 4 Turing machine simulator

Hlavné atribúty aplikácie

projekt nemá svoju stránku a nevyhnutné vlastné spustenie v programe Visual Web Developer.

čiastočne nejasná funkcionalita. možnosť krokovanie programu. neumožňuje ukladanie vytvorených programov. jednoduchá simulácia bez vizualizácie. obsahuje príkladné programy, ktoré je možné hneď spustiť. aplikácia nie vždy reaguje na používateľské udalosti.

1.1.5 Tuatara Turing Machine Simulator

Stránka projektu: http://tuataratmsim.sourceforge.net/Projekt vytvorený v jazyku JAVA možno spustiť až po kompilácii zdrojových

kódov, ktoré má používateľ k dispozícii. Najsilnejšou stránkou aplikácie je vizualizácia a užívateľské prostredie, ktoré umožňuje jednoduchú úpravu aktuálneho programu.

Obrázok 5 Tuatara Turing Machine Simulator

Hlavné atribúty aplikácie aplikácia nie je stiahnuteľná v spustiteľnej podobe. aplikácia pracuje s vizualizáciou na vysokej úrovni typu orientovaný graf. spustený program je možné krokovať. je možne program uložiť/načítať. aplikácia umožňuje pre daný program vytvoriť iba jednoznakovú vopred

definovanú abecedu.

1.1.6 Dušan Rodina: Turingov stroj (v.1.6)

Projekt na stiahnutie: http://programy.isvet.sk/Download/27/Turingov-stroj--v-1-6-

Projekt je realizovaný ako klasická desktopová aplikácia, ktorú je možné spustiť bez inštalácie. Aplikácia má v rámci našej analýzy ako simulátor Turingovho stroja najlepšie vlastnosti. Umožňuje tvorbu programu za pomoci vizualizácie (orientovaný graf) ako aj klasickým textovým spôsobom.

V rámci vizualizácie je možné pridávať a odoberať stavy a prechody medzi nimi. Aplikácia zaznamenáva históriu prechodov (pri spustení programu). Je možné používať akékoľvek viacznakové symboly vrámci abecedy. Vytvorený program sa dá uložiť/načítať. Používateľ si môže zobraziť jeho formálnu špecifikáciu.

Pri testovaní aplikácie sme zistili chybovosť vo vizualizácie, aplikácia nereagovala na stlačenia tlačidiel myši prípadne reagovala nesprávne.

Obrázok 6 Dušan Rodina: Turingov stroj (v.1.6) vizualizácia simulátora

Hlavné atribúty aplikácie: aplikáciu možno stiahnuť a spustiť bez inštalácie. aplikácia pracuje s najlepšou vizualizáciou vrámci našej analýzy. aplikácia umožňuje vizuálnu aj textovú formu tvorby programu. páska umožňuje používanie vlastnej abecedy a viacznakových symbolov. možnosť ukladania/načítania programu na disku používateľa. možnosť zobrazenia histórie prechodov programu. nesprávne spracovanie udalostí s myšou.

1.2 Záver analýzy

Analýza existujúcich aplikácii, ktoré sa umožňujú tvorbou a simulovaním Turingových programov nám pomôže pri tvorbe požiadaviek na vlastné riešenie a pri návrhu aplikácie.

V nasledujúcej tabuľke uvádzame základné atribúty jednotlivých aplikácii.

Webová aplikácia

Uloženie programu

Vizualizácia programu

Krokovanie programu

História prechodov

Ye Olde Turing Machine X X

XTuringMachine X Nie je funkčné XTuring machine

simulator in Silverlight 4.0

X X

Tuatara Turing Machine Simulator

X X X

Dušan Rodina: Turingov stroj

(v.1.6)X X X X

Turing in a flash X X X X

Tabuľka 1 Sumarizačná tabuľka simulátorov

2 Požiadavky na aplikáciu.

Formulácia požiadaviek pre našu aplikáciu vyplýva z analýzy existujúcich riešení a vlastného návrhu na funkcionalitu aplikácie.

Naše požiadavky berú ohľad na technologické možnosti Silverlightu a všeobecné znalosti a schopnosti používateľa pri práci s aplikáciami. Požiadavky možno rozdeliť na funkčné (implementácia konkrétnych funkcii) a technické (ďalšie vlastnosti aplikácie).

Funkčné požiadavky: Aplikácia musí umožniť vytvorenie programu Turingovho stroja, ktorý bude

spustiteľný nad vlastnou páskou s možnosťou zmeniť program aj pásku. Mená stavov programu ako aj abeceda pásky by mali byť ľubovoľné podľa

požiadaviek používateľa. Aplikácia umožní ukladať a načítavať programy vytvorené v rámci aplikácie. Aplikácia by mala umožňovať okrem klasického spustenia vytvoreného

programu aj jeho krokovanie prípadne postupné automatické krokovanie. Aplikácia umožní prácu s programom v rôznych formách, napríklad

vizualizácia orientovaného grafu. Aplikácia by mala vedieť zobraziť históriu inštrukcii simulácie od posledného

spustenia.

Technické požiadavky: Spustenie aplikácie by malo vyžadovať minimálnu námahu a čas používateľa. Vytváranie programov Turingovho stroja by malo byť pre používateľa

prijemné a intuitívne. Aplikáciu nebude závislá na operačnom systéme.

Michal, 03.01.-0001,
TODO ocislovanie, este sa rozhodnom ked to cele precitam znova

3 SilverlightMicrosoft Silverlight je webový framework realizovaný ako plug-in

prehliadača poskytujúci aplikáciám podporu pre animácie, vektorovú grafiku a audio/video playback. Svojimi možnosťami pripomína desktopové aplikácie. Vzhľadom na existujúce technológie sa najviac podobá na technológiu Flash. Plug-in má svoje verzie pre každý operačný systém a dokáže sa po nainštalovaní aktualizovať bez zásahu používateľa.

3.1 História technológie SilverlightPrvá verzia technológie Silverlight (Silverlight 1) vznikla v roku 2007 pod

názvom Windows Presentation Foundation/Everywhere (WPF/E). Technológia umožňovala prácu s grafickými a vstupno-výstupnými prvkami ako aj prehrávanie rôznych zvukových a video formátov.

Silverlight 2 (pôvodne Silverlight 1.1) (finálna verzia zverejnená 10.14.2008) v sebe zahŕňa aj .NET Framework vďaka čomu bolo možné vytvoriť aplikáciu v každom .NET jazyku. Verzia .NET Frameworku, ktorá prišla verziou Silverlight umožnila efektívnejšiu tvorbu používateľského rozhrania (UI-programming model) zahŕňajúc podporu pre zobrazovanie kriviek, dokumentov a animácie objektov. Pribudli tiež štandardné prvky ako textové pole (TextBox), zaškrtávacie pole (CheckBox), skrolovací panel či tabuľka (ScrollViewer), kalendár a iné.

Obrázok 7 Architektúra Silverlight 21

1 Zdroj: http://en.wikipedia.org/wiki/File:Microsoft_Silverlight_stack.svg

Silverlight 3 bol zverejnený 9. júla 2009. Do tretej verzie bolo pridaných množstvo nových ovládacích a výstupných prvkov ako aj nové kontajnery prvkov napríklad údajová mriežka (DataGrid), stromové zobrazenie (TreeView) a iné panely. Silverlight 3 umožňuje aplikovať 3D transformácie na všetky grafické elementy. Pridané boli aj ďalšie efekty ako zošikmenie, priesvitnosť (alpha bleding), tieňovanie (pixel shaders) a iné (hardwarovo akcelerované). Verzia umožňuje naviazanie jedného prvku na iný (element-to-element binding). Aplikácie vytvorené za pomoci Silverlight 3 môžu byť spustené aj ako klasické desktopové mimo okno prehliadača.

V čase písania práce používaná verzia Silverlight 4 bola zverejnená 15. apríla 2010. Podporuje prácu s mikrofónom, web kamerou a tlačiarňou. Verzia rozširuje aj možnosti použitia myši o pravé tlačidlo a koliesko. Štvrtá verzia zaviedla technológiu Deep Zoom pre efektívnejšie narábanie s obrázkami pri zväčšovaní a zmenšovaní (napr. pri mape). Boli tiež pridané možnosti prechodnej pamäti (Clipboard), drag and drop, spustenie na celú obrazovku (full screen), prístup k súborom používateľa za pomoci kódu na pozadí a iné.

3.2 Vybrané technologické možnosti Silverlight

V nasledujúcej kapitole opíšeme niektoré technologické možnosti technológie Silverlight. Pre opis jednotlivých technológii sme sa rozhodli na základe využitia pri vývoji našej aplikácie.

Kapitola začína opisom niektorých grafických prvkov ako aj ich možné využitie v aplikácii. Na akýkoľvek grafický prvok je následne možné aplikovať rôzne efekty, niektoré z nich sú opísané v ďalšom texte. Pre prácu so súbormi sme rozpísali technologickú novinku technológie Silverlight uzavretý priestor (Isolated Storage) a štandardný prístup za pomoci dialógov a triedy Stream. Kapitola pokračuje opisom spracovania neodchytených výnimiek, ktoré nenarúšajú beh aplikácie. Pre prácu s užívateľským prostredím sme sa rozhodli ešte opísať udalosti spojené s činnosťou používateľa.

3.2.1 Vstupno-výstupné prvky

Každý grafický prvok v rámci aplikácie musí byť umiestnený v niektorom kontajneri prvkov. Hlavné kontajnery prvkov sú plátno (Canvas), mriežka (Grid) a zoznamový panel (StackPanel). Poloha a iné vlastnosti prvkov môžu byť definované v rámci XAML kódu alebo v kóde na pozadí. Jednotlivé prvky je možné pridať a zmeniť ich viditeľnosť aj za behu aplikácie.

Aplikácia môže obsahovať všetky štandardné prvky zaužívané v desktopových aplikáciách. Okrem štandardných prvkov obsahuje Silverlight aj prvky ako dcérske okno (ChildWindow), ktorý predstavuje osobitné podokno.

Na každý grafický prvok je možné aplikovať efekty tieňa, zaostrenia, priehľadnosti a iné. Silverlight umožňuje tiež transformačné zmeny ako rotácia a zošikmenie a to aj v 3D. Tieto efekty budú osobitne opísané neskôr.

Okrem základných prvkov ako tlačidlo (Button), odkazové tlačidlo (HyperlinkButton), výberový zoznam (ComboBox) či dialógu MessageBox sme v našej aplikácii použili aj pokročilejšie prvky.

Dcérske okno (ChildWindow) predstavuje osobitné podokno v prehliadači, v rámci ktorého môžeme používať akékoľvek iné prvky tak ako na hlavnej stránke aplikácie.

Zoznamový panel (StackPanel) predstavuje kontajner pre iné prvky, ktoré sú automaticky usporiadané podľa danej orientácie.

Posúvajúci panel (ScrollViewer) je kontajner prvkov, ktorý zobrazuje vložené prvky do napríklad vopred definovanej tabuľky. Takéto zobrazenie umožňuje posúvanie obsahu.

Kontajnery ako aj iné prvky umožňujú automatické naviazanie na iné prvky či zoznam prvkov („binding“ napríklad na List<T> v kóde na pozadí).

3.2.2 Ukladanie a načítavanie súborov

Pre účel ukladania údajov je možné vytvoriť online databázu či využiť úložný priestor používateľa.

Pri návrhu aplikácie sme sa rozhodli využiť priestor používateľa. Silverlight umožňuje ukladanie binárnych súborov, no iba pre Silverlight aplikácie vyhradenom mieste.

3.2.2.1 Isolated StoragePri ukladaní súborov využitím Isolated Storage používateľ nevie o úložnom

priestore a aplikácia má k súborom prístup bez vedomosti používateľa. Isolated Storage uľahčuje prácu vývojárov, keďže manažuje prístup aplikácii k svojim súborom na disku používateľa. Zabraňuje teda konfliktom aplikácii a uľahčuje tvorbu a čítanie súborov. Veľkosť príslušnej pamäti je zvyčajne obmedzená na niekoľko MB.

Pre prácu so súbormi za pomoci Isolated Storage potrebujeme triedu IsolatedStorageFile. IsolatedStorageFile umožňuje okrem uloženia a načítania binárneho súboru aj preloženie zoznamu vývojárom definovaných objektov (napríklad List<Object>) do XML formátu.

Súbory uložené v Isolated Storage sú vždy naviazané na konkrétnu aplikáciu.

3.2.2.2 Štandardné načítavanie a ukladanie súborovNa ukladanie a načítavanie textových súborov bol do technológie Silverlight

pridaný štandardný Save File a Open File dialog, ktorý umožňuje používateľovi vybrať cestu k súborom.

Načítanie a ukladanie textových súborov sa môže realizovať za pomoci objektu Stream.

3.2.3 Spracovanie výnimiek

Podobne ako u iných aplikácii vytvorených v jazykoch .NET je možné spracovať výnimky, ktoré vzniknú počas behu aplikácie. Nespracovanie výnimky spôsobí následné vytvorenie výnimky UnhandledException, ktorej spracovanie je pre Silverlight aplikácie povinné. Aplikácia po nespracovaní výnimky neprestane fungovať a používateľ môže pokračovať vo svojej práci, prípadne môže byť varovaný v rámci udalosti UnhandledException.

3.2.4 Základná grafika

Pre vykreslenie geometrických obrazcov sú k dispozícii 2 kategórie tried Shape a Geometry. Základné obrazce (typu Shape) sú čiara (Line), množina čiar (PolyLine), obdĺžnik (Rectangle), polygon (Polygon), krivka (Path) a elipsa (Ellipse). Pri vykresľovaní sa používa súradnicová sústava s počiatkom v ľavom hornom rohu pre plochu daného kontajnera (napríklad plátno).

Základné vlastnosti obrazcov sú farba výplne, farba okrajov a šírka obrysov (Fill, Stroke a StrokeThickness).

Obrazec možno ako každý iný prvok pridať do projektu v rámci XAML kódu alebo za pomoci kódu na pozadí. Pridanie čiary za pomoci kódu na pozadí môže vyzerať nasledovne:

Line l = new Line();l.Stroke = new SolidColorBrush(Color.FromArgb(255, 0, 0, 0));l.StrokeThickness = 2;l.X1 = 0;l.Y1 = 0;l.X2 = 100;l.Y2 = 100;canvas.Children.Add(l);

V príklade bola pridaná čiara do inštancie kontajnera plátno (Canvas). Pri definícii farby čiary môžeme nastaviť aj priehľadnosť (prvý argument FromArgb).

Pre vykreslenie obrázkov máme k dispozícii EIElement Image. Pre vykreslenie je potrebné nastaviť vlastnosť Source na príslušnú cestu k obrázku. Súbor obrázku musí byť súčasťou Resources projektu.

3.2.5 Grafické efekty a transformácie

Na každý UI element, ktorý je pre používateľa viditeľný, sa dajú aplikovať grafické efekty a geometrické transformácie.

Silverlight poskytuje nasledujúce transformácie: maticová transformácia (MatrixTransform). rotácia (RotateTransform). zmena veľkosti (ScaleTransform). zošikmenie (SkewTransform). posun (TranslateTransform). TransformGroup umožňuje kombináciu viacerých transformácii a ich

viacnásobné použitie.

Transformácie je možné definovať v rámci XAML kódu alebo za behu na pozadí.

Dynamická rotácia textu môže vyzerať nasledovne:

TransformGroup _tg = new TransformGroup();RotateTransform _rt = new RotateTransform();_tg.Children.Add(_rt);

Label l = new Label();l.RenderTransform = _tg;

double angle = …;_rt.Angle = angle;_rt.CenterX = l.Width / 2;_rt.CenterY = l.Height / 2;

Spolu s transformáciami môžeme na každý UIElement aplikovať grafické efekty ako rozmazanie (BlurEffect), tieňovanie(DropShadowEffect) a 3D perspektívu.

Pri aplikácii efektu rozmazania musíme špecifikovať parameter Radius, ktorý určuje polomer pre výpočet novej farby jednotlivých pixelov. Takéto efekty možno aplikovať priamo v XAML kóde napríklad takto:

<Button …><Button.Effect>

<BlurEffect Radius=”6”><BlurEffect></Button.Effect>

</Button>

Alternatívne môžeme efekt aplikovať v kóde na pozadí najmä ak sme UIElement prvky vytvorili dynamicky. V takom prípade pridáme efekt nasledujúcim spôsobom:

Ellipse e = new Ellipse();e.Effect = new BlurEffect { Radius = 4 };

3.2.6 Užívateľské udalosti

Primárnou úlohou mnohých grafických prvkov (UIElement) je reagovať na podnety či vstup používateľa a to najmä za pomoci myši či zadaného textu. V prípade technológie Silverlight sú takéto udalosti spracované vždy v kóde na pozadí aplikácie. Jednotlivé prvky môžu zdieľať tú istú metódu na spracovanie udalosti. Pokiaľ je prvok vytvorený v rámci XAML kódu môžeme mu prideliť udalosť nasledujúcim spôsobom:“Udalosť“=“funkcia na spracovanie udalosti“, napríklad:

<Button … Click="bt_Click">

Metódu na spracovanie udalosti je možné pridať do prvku aj v rámci kódu na pozadí, napríklad:

canvas.MouseMove += new MouseEventHandler(canvas_MouseMove);

Pre väčšinu prvkov je možné spracovanie nasledujúcich udalostí spojených s používaním myši:

MouseEnter, vstúpenie kurzora do (vykreslenej) oblasti prvku MouseLeave, opustenie kurzora z oblasť prvku MouseMove, pohyb kurzora nad oblasťou prvku MouseLeftButtonDown, stlačenie ľavého tlačidla myši za predpokladu že

kurzor je nad oblasťou prvku MouseLeftButtonUp, uvoľnenie ľavého tlačidla myši za predpokladu že je

kurzor nad oblasťou prvku

Silverlight umožňuje odchytávanie aj stlačenie a uvoľnenie pravého tlačidla myši.

Iná často používaná udalosť je zmena textu daného textového prvku (ako napríklad TextBox).

4 Návrh a implementácia

Návrh používateľského rozhrania vychádza z funkčných a technických požiadaviek ktoré sme si zadefinovali. Pri jeho návrhu sme brali ohľad na intuitívne ovládanie a vizualizáciu, ktorá predstavuje jedno z ťažísk tejto práce.

Používateľské rozhranie sme implementovali spolu s architektúrou na pozadí. Jednotlivé komponenty projektu opíšeme v nasledujúcich častiach.

4.1 Používateľské rozhranie

Pri návrhu používateľského rozhrania sme sa rozhodli rozdeliť pracovnú plochu na hornú časť, v rámci ktorej sa definuje samotný program a dolnú časť s páskou a možnosťami spustenia vytvoreného programu. Rozdelenie plochy na „vizuálne“ a „pracovné“ nám vyplynulo z analýzy ako aj prácou s inými simulátormi.

Celková plocha zaberá 750x850 pixelov a je vycentrovaná do stredu okna prehliadača.

Kapitola opisuje spôsoby zobrazenia stavov a prechodmi medzi nimi ako aj komunikáciu s používateľom. Následne sa opisuje práca s programom teda jeho spustenie a testovanie.

4.1.1 Zobrazenie stavov

Základné zobrazenie stavov sa realizuje ako tabuľku kde: prvý stĺpec obsahuje názvy jednotlivých stavov v druhom stĺpci je dodatočná informácia o počte prechodov vychádzajúcich

z daného stavu zvyšné 2 stĺpce umožňujú úpravu stavu a jeho vymazanie.

Nový stav je možné pridať tlačidlom, ktorého udalosť spôsobí prechod rozhrania, ktorý umožňuje pridať stav. Obrázok tlačidla pre nový stav ako aj iných tlačidiel sú pre používateľa v dôvernom motíve.

Obrázok 8 Príkladná tabuľka stavov

Tabuľka je realizovaná ako ScrollViewer, ktorého obsah sa dynamicky mení na základe príslušných udalostí. Požiadavky na vymazanie a úpravu sa realizujú cez tlačidlá, ktoré sú dynamicky vytvárané pre každý riadok v tabuľke. Udalosti stlačenia sú spracované v jednotnom kóde na pozadí. V rámci udalosti stlačenia sa stav identifikuje indexom označeného riadku v tabuľke.

4.1.2 Zobrazenie, vytvorenie a úprava stavu – prechody

Prechody medzi stavmi sú naviazané na stav, z ktorého vychádzajú (každý stav má svoj zoznam prechodov, ktorý môže byť prázdny).

Podobne ako pre stavy sa prechody z daného stavu zobrazujú v rámci tabuľky s dynamickým obsahom. Názov stavu možno meniť v unikátnom textovom poly.

Pridanie prechodu sa realizuje za pomoci tlačidla „pridaj prechod“, ktorý pridá do tabuľky s prechodmi nový riadok. Riadok v tabuľke obsahuje:

dva stĺpce pre nájdený a výstupný reťazec znakov (na páske) stĺpec s prvkom ComboBox pre posun na páske (L, P, N) stĺpec s prvkom ComboBox, ktorý predstavuje prechod na iný stav stĺpec s tlačidlom pre vymazanie daného riadku.

Pri potvrdení vykonaných zmien sa prejde späť do pôvodného zobrazenia stavov pričom obsah tabuľky stavov sa znovu vygeneruje.

Obrázok 9 Príkladný stav s prechodmi

4.1.3 Vizualizácia stavov a ich prechodov

Pre lepšie znázornenie aktuálneho programu Turingovho stroja sme sa rozhodli vytvoriť aj vizualizáciu jednotlivých stavov ako orientovaný graf kde vrcholy predstavujú stavy a orientované hrany prechody medzi nimi.

Takúto formu vizualizácie Turing programov využívajú aj mnohé iné simulátory. Na základe analýzy existujúcich riešení ako aj vlastných špecifikovaných požiadaviek sme sa rozhodli implementovať podobné riešenie.

Na vizualizáciu sme si vytvorili osobitnú triedu VizualModel, ktorá zahŕňa logiku vytvárania grafu a spracovania jednotlivých udalostí vyvolaných používateľom.

4.1.3.1 Vykreslenie vizualizácie Turingovho programu

Základným prostredím na vizualizáciu predstavuje plátno, ktoré je v aplikácii umiestnené na vopred zadanej pozícii. Pre potreby vizualizácie sa plátno zviditeľní a tabuľka stavov zneviditeľní. Trieda VizualModel získa zoznam stavov a zobrazí ich na plátno postupne do kruhu (na základe veľkosti plátna).

Obrázok 10 Príklad vizualizácie, stavy sa vykreslili do kruhu. Pre 3 stavy to predstavuje rovnostranný trojuholník

Pre každý stav vytvorí kružnicu s názvom stavu a pre každý prechod medzi stavmi vytvorí orientovanú šípku (realizovanú ako tri inštancie Line) s textovou informáciou o prechode. Šípka sa generuje za behu na základe pozícii 2 kružníc (predstavujúcich stavy). Textová informácia prechodu rotuje podľa uhla šípky a v prípade potreby zmení smer vypísania o 180 stupňov.

Obrázok 11 Orientácia textu sa mení podľa uhla šípky

4.1.3.2 Udalosti v rámci vizualizácie

Pre každý vykreslený prvok (ako aj plátno) sa dajú nadefinovať udalosti spojene s používateľskou činnosťou. Okrem pohybu a stlačenie ľavého tlačidla na myši umožňuje Silverlight používať aj pravé tlačidlo myši.

Pri návrhu vizualizácie sme sa rozhodli umožniť používateľovi zmeniť rozloženie jednotlivých stavov (kružníc) podľa vlastnej potreby. Umiestnenie kružníc predstavujúcich stavy je rýdzo vizuálna pomôcka, logiku pozícií nemôže teda simulátor predvídať. Na tieto účely aplikácia odchytáva udalosť pohybu myši nad plátnom a stlačenie a uvoľnenie tlačidla myši nad kružnicou. Pri stlačení myši nad kružnicou sa zapamätá príslušná kružnica pokým nie je stlačenie uvoľnené. Pri pohybe nad plátnom sa následne mení pozícia príslušnej kružnice. Pre účely lepšej vizualizácie sa mení aj sfarbenie kružnice.

Pri každej zmene rozmiestnenia kružníc sa znovu vytvárajú prechodové šípky a iné prvky podľa nových pozícii. Nenastáva úplné prekreslenie plátna ale iba vymazanie prvkov, ktoré nie sú aktuálne (podľa príslušnosti k zmenenej pozície kružnice), a ich následné znovu pridanie.

Silverlight štandardne nepodporuje dvojklik myši. Pre účely rýchleho prechodu z vizualizácie do editácie stavu sme takúto udalosť za pomoci časovača vytvorili. Používateľ je schopný dvojklikom na kružnicu editovať príslušný stav (dostane sa do tabuľky s prechodmi zo stavu).

Spracovanie udalosti stlačenia pravého tlačidla myši sme využili pre jednotlivé kružnice ako aj pre plátn. V oboch prípadoch používateľovi vyskočí štandardné menu (v našom prípade ContextMenu). V prípade kružníc sme zvolili 2 funkcie a to editovanie (do ktorého je možné prejsť aj z hlavnej tabuľky či dvojklikom na kružnicu) a vymazanie stavu (ktoré je tiež možné aj z hlavnej tabuľky).

Obrázok 12 Zobrazenie menu po použití pravého tlačidla myši

Pri pravom kliknutí na plátno je používateľovi umožnené pridať nový stav a to buď prechodom na štandardnú tabuľku alebo otvorením menšieho dcérskeho okna s jediným editačným prvkom a to meno nového stavu.

Obrázok 13 Dcérske okno určené na rýchle pridanie stavu

Pridanie prechodu medzi stavmi sa realizuje za pomoci menšej kružnice, ktorá sa zviditeľní vždy pre jednu kružnicu pokiaľ je v dostatočnej blízkosti ku kurzoru myši. Kliknutie na menšiu kružnicu spôsobí zobrazenie čiary, ktorá sa vykresľuje až do uvoľnenia tlačidla. V rámci udalosti uvoľnenia tlačidla sa skontroluje najbližšia kružnica a pri dostatočnej blízkosti je používateľovi umožnené pridanie prechodu (pozri obrázok 14).

Obrázok 14 Príkladné pridanie prechodu medzi 2 stavmi

Možnosti ktoré vizualizácia poskytuje môžu byť aj vzhľadom na charakter webových aplikácii pre používateľa nejasné. Pre znázornenie možností ako napríklad využitie pravého tlačidla myši sme sa rozhodli pri prvom použití vizualizácie zobraziť vysvetľujúci obrázok.

4.1.4 Spustenie a krokovanie programu

Pre spustenie musí mať program definovaný počiatočný a konečný stav, ktorý používateľ vyberie pomocou prvku ComboBox. V prípade že používateľ neurčí potrebné stavy bude na to upozornený jednoduchým hlásením (používateľ môže aj nemusí vybrať zamietací stav) pri snahe program spustiť.

Rozhodli sme sa realizovať tri spôsoby spúšťania: Spustenie programu do konca. Krokovanie programu a to aj v histórii späť. Automatické krokovanie s rozumným časovým odstupom a možnosťou

zastavenia.

Obrázok 15 Možnosti spúšťania programu: ručné krokovanie, spustenie programu do konca, automatické krokovanie s nastavením časového odstupu pri krokovaní ako aj možnosť prerušenia

V rámci každej z možnosti sa spúšťa rovnaký kód (jedna operácia vyvolaná používateľom/časovačom/cyklom).

Metóda, ktorá realizuje jediný krok (v elementárnej forme):

public string runProgramOneStep() {

string vstup = paska.getValueOnPosition(poziacia);

Stav.Prechod prechod = aktual.getPrechodByVstup(vstup);

paska.setValueOnPosition(poziacia, prechod.vystup);

aktual = prechod.nasledujuciStav; // aktual je aktualny stav

if (prechod.posun == Stav.Posun.vlavo) poziacia--; else if (prechod.posun == Stav.Posun.vpravo) poziacia++;

}

Pokiaľ je aktuálne zobrazená vizualizácia, používateľ môže sledovať prechody medzi stavmi, ktoré sú zvýraznené efektom rozmazania.

Obrázok 16 Zvýraznenie prechádzaných hrán v grafe efektom rozmazania

Architektúra aplikácie umožňuje editáciu programu Turingovho stroja a pásky aj behom krokovania. Keďže sa môže používateľ vrátiť krokovaním späť dokáže tým zmeniť históriu.

4.1.5 Zobrazenie histórie prechodov

Každé nové spustenie programu vytvorí novú históriu prechodov medzi stavmi a zmenami na páske. Históriu prechodov je možné zobraziť za pomoci jednoduchého dcérskeho okna. Jednotlivé prechody a zmeny pásky sú zobrazené v riadkoch.

Pre väčšiu efektívnosť je možné históriu filtrovať podľa stavov, v rámci ktorých sa udial (prechod z aj do stavu).

Obrázok 17 História príkladného programu po akceptácii slova

4.1.6 Testovanie programu

Pre rozšírenie funkčnosti aplikácie sme sa rozhodli navrhnúť a implementovať jednoduché testovacie prostredie. Počas testovania chceme umožniť overenie akceptácie či zamietnutie slova ako aj správnosť výslednej pásky.

Jednotlivé jednoduché testy sú pre používateľa realizované ako dva textové polia: vstupná páska (slovo) a očakávaná výstupná páska. Ďalej dva prvky Checkbox: akceptácia slova a overenie výstupnej pásky.

Pre lepšie pochopenie funkčnosti testovania sa používateľovi zobrazí pri prvom otvorení testovacieho okna informačný obrázok.

Obrázok 18 Príkladné testovanie programu

4.2 Implementácia Turingovho stroja

V nasledujúcej kapitole opíšeme jednotlivé triedy a vybrané metódy, ktoré realizujú simuláciu programu Turingovho stroja. Po opísaní tried Stav, Prechod a Paska nasleduje trieda Turing, ktorá obsahuje okrem iných metódu pre krokovanie programu.

Kapitola ešte opisuje implementáciu testovania, ukladania a načítavania súborov (programu či testu) a použitie Cookies v našom projekte.

4.2.1 Trieda Stav a štruktúra Prechod

Stav Turingovho stroja je definovaný ako samostatná trieda, ktorá definuje meno stavu a obsahuje zoznam (List<Prechod>) prechodov vychádzajúcich z daného stavu.

V rámci triedy Stav sme definovali ešte štruktúru (struct) Prechod, ktorá obsahuje informácie o vstupnom a výstupnom znaku ako aj posun na páske a nasledujúci stav.

public class Stav {...private List<Prechod> prechody;private string meno;...public enum Posun { vpravo,vlavo, neutral }

public struct Prechod {

public string vstup; public Posun posun; public string vystup; public Stav nasledujuciStav; }

public bool addPrechod(Prechod p) { foreach (Prechod prechod in prechody) { if (prechod.vstup == p.vstup) return false; }

prechody.Add(p);

return true; }

...

public string getStavCode(){…}}

Metóda geStavCode vráti text predstavujúci daný stav. Metóda sa využíva pri zápise do súboru.

Trieda Stav obsahuje okrem štandardných aj niekoľko statických metód, ktoré využívajú iné Triedy:

public static List<Stav> getPrikladneStavy()public static String posunToLPN_String(Posun p)public static Posun getPosunByString(String pos)public static Prechod getDummyPrechod()

Vráti jednoduchý prechod. Keďže Prechod je štruktúra nemôže byť null.

public static Stav getStavByName(string name, List<Stav> stavy)public static Prechod getPrechodFromCode(string code, List<Stav> stavy)

Na základe textu (štandardne načítaného z uloženého súboru) a zoznamu stavov (na ktoré sa stav musí odkazovať) vytvorí inštanciu prechodu.

public static List<Stav> getStavyRefToStav(List<Stav> stavy, Stav refer)public static string getNextStandardStavName(List<Stav> stavy)

Vráti text typu „q0“, „q1“..., podľa už existujúcich mien.

public static void removePrechodyByVystupnyStav(List<Stav> stavy, Stav removeBy)

Obrázok 19 Diagram vzťahov tried

4.2.2 Trieda Páska

Pásku (zoznam reťazcov) je možné implementovať aj ako List<string>. Pre väčší zoznam požiadaviek na pásku sme sa rozhodli pre osobitnú triedu Paska.

Základom triedy predstavuje zoznam reťazcov. Trieda tiež udržiava konštantné informácie o „prázdnom“ políčku na páske (defaultná hodnota políčka) ako aj rozdeľovací reťazec, ktorý je v samotnej páske (aj v názvoch stavov) zakázaný.

public class Paska { private List<string> paska;

public static string emptyString = "_"; public static string separatorString = ",";

public string getValueOnPosition(int position)public void setValueOnPosition(int position, string value)

public string getPaskaString()public Paska(String paska)

}

Trieda Paska umožňuje vytvoriť inštanciu aj na základe reťazca, ktorý predstavuje pásku (rozdelenie do zoznamu je na základe „separatorString“). Podobne je možné nechať vytvoriť jeden reťazec predstavujúci celú pásku (getPaskaString). Takéto načítavanie a vypisovanie pásky sa využíva pri komunikácii s používateľom.

4.2.3 Trieda Turing

Pre samotné spúšťanie vytvoreného programu sme sa rozhodli vytvoriť triedu Turing, ktorá je schopná za pomoci daných stavov a pásky program krokovať či spustiť do konca. Trieda pritom využíva informácie o štartovacom, akceptačnom a zamietacom stave. Pre chybné programy, ktoré by mohli byť spustené v cykle bez konca sme zaviedli ešte 2 hraničné hodnoty a to maximálna veľkosť použitej pásky a maximálny počet prechodov medzi stavmi.

public class Turing {

private Paska paska; private int poziacia, prechodov; private List<Stav> stavy; private Stav begin, end, aktual, previous, reject;

public static RuningLog runningLog;

public string runProgramToEnd()public string runProgramOneStepBack(out int newPoz)public string runProgramOneStep(out int newPoz)

public bool isAkcepted() { return aktual == end ; }

public bool isRejected() { return aktual == reject ; }}

Trieda Turing tiež pri každom novom spustení programu vytvára históriu prechodov. Táto história sa ukladá do statickej inštancie RuningLog. RuningLog obsahuje zoznam inštancii PaskaPrechodInfo, v rámci ktorej je uložená aktuálna páska, stav a pozícia na páske

public class RuningLog { private List<PaskaPrechodInfo> paskaPrechody;

public PaskaPrechodInfo getPaskaPrechodByIndex(int i)public void removePaskaPrechodByIndex(int i)

}

Metóda na vymazávanie záznamov (removePaskaPrechodByIndex) sa využíva pri krokovaní späť.

public class PaskaPrechodInfo { private string paska; private string funName, nextFunName; private int stringChanged;public string getPaskaInfo(string onlyFromFunName, string onlyToFunName)}

Informácia, ktorú nesie inštancia PaskaPrechodInfo, sa využíva pri vypísaní histórie prechodov.

4.2.4 Ukladanie a načítavanie súborov

Po zvážení možností technológie Silverlight a aktuálnych trendov vo vývoji softvéru sme sa rozhodli pri ukladaní súborov pre klasickú textovú formu. Používateľ dokáže prečítať obsah a podľa potrieb ho aj zmeniť.

Ukladanie a načítavanie súborov sa využíva na dvoch miestach: ukladanie programu. ukladanie testovacích scenárov.

Pri ukladaní a načítavaní využívame už existujúce a pre používateľa známe dialógy (SaveFileDialog a OpenFileDialog). Pri vytváraní súboru používame vlastné koncovky súborov (*.turing a *.turingTest), ktoré sa potom využívajú ako filter pri načítavaní.

OpenFileDialog ofd = new OpenFileDialog();

ofd.Filter = "turing files (*.turing)|*.turing|All files (*.*)|*.*"; ofd.FilterIndex = 1;

bool? result = ofd.ShowDialog();

Samotné vytváranie obsahu súboru sa pre daný program generuje nasledovne: vytvorí sa riadok s názvom programu kde názov je totožný s názvom súboru. vytvoria sa tri riadky kde prvý obsahuje názov štartovacieho stavu, ďalší

názov akceptačného stavu a tretí názov zamietacieho stavu. pre každý stav v programe sa spustí príslušná metóda na vygenerovanie

ukladajúceho textu. Metóda prejde cez všetky prechody, ktoré obsahuje stav (vychádzajú zo stavu) a pre každý vytvorí riadok s príslušnými informáciami. V prípade že stav nemá žiadne prechody vypíše sa iba jeho názov.

string getProgramCode() { string result = "";

result += "program: " + meno+"\n"; result += "begin: " + this.begin.Meno+"\n"; result += "end: " + this.end.Meno + "\n"; if(this.reject != null) result += "reject: " + this.reject.Meno + "\n"; else result += "reject: " + "\n";

if (stavy != null) { foreach (Stav f in stavy) { result += f.getStavCode(); } } return result; }

string getStavCode() { string result = "";

if (prechody != null) { foreach (Prechod p in prechody) { String prechodS = Meno + "," + p.vstup + "," + Stav.posunToLPN_String(p.posun) + "," + p.vystup + ","; if (p.nasledujuciStav == null) prechodS += Meno; else prechodS += p.nasledujuciStav.Meno;

result += "\n" + prechodS; } }

if (prechody == null || prechody.Count == 0) { result += "\n" + Meno; } return result; }

Príkladný obsah súboru:

program: rejectbegin: startend: akceptreject: reject

start,$,P,$,startstart,1,P,x,startstart,_,N,_,akceptstart,0,N,0,rejectakceptreject

Pri načítavaní sa súbor prechádza v dvoch cykloch. Prvý načíta a vytvorí všetky stavy, ktoré sú v súbore spomenuté. Druhý vytvorí prechody medzi stavmi (prechody potrebujú zoznam stavov pre pridanie).

4.2.5 Ukladanie nastavení a Cookies

Aplikácia si ukladá niektoré údaje tak aby pretrvali do ďalšieho spustenia. Na ich uloženie sme sa rozhodli pre Cookies.

Pre prácu s Cookies sme vytvorili triedu Cookies, ktorú využíva trieda Settings. Jediná inštancia triedy Settings je k dispozícii cez statickú metódu getInstance. Trieda obsahuje dva údaje, ktoré dokáže načítať a zapísať z/do Cookies: obmedzenie na najväčšiu veľkosť pásky a obmedzenie na počet prechodov vykonaných v rámci simulácie. Oba údaje sa využívajú pri spúšťaní programu a majú zabrániť príliš dlhému behu či nekonečnému cyklu programu. Tieto hodnoty sa dajú zmeniť za behu používateľom.

public class Settings { private static Settings instance;

public static Settings getInstance()

private const int maxPaskaLengthStandard = 1000; private const string maxPaskaLengthCookieKey = "maxPaskaLength"; private int maxPaskaLength;

private const int maxPrechodovStandard = 1000; private const string maxPrechodovCookieKey = "maxPrechodov"; private int maxPrechodov;

...}

public static class Cookies {

public static bool Exists(string key, string value)public static string Read(string key)public static void Write(string key, string value, int expireDays)public static void Delete(string key)

}

Samotné nastavenie údajov sa realizuje v jednoduchých dcérskych oknách.

Záver

Turingov stroj predstavuje jeden z elementárnych spôsobov tvorby programov. Schopnosť naprogramovať požadovanú funkciu patrí k základným znalostiam informatika. Považujem za úspech že sa nám cieľ vytvoriť simulátor Turingovho stroja podaril.

Táto práca začala analýzou existujúcich riešení, v rámci ktorej sme sa orientovali na spoločné črty či individuálne nedostatky aplikácii. Analýza nám pomohla pri zostavení vlastných požiadaviek, ktoré nasledujú logicky za analýzou. Použiť technológiu Silverlight bol jedným z našich cieľov a detaily technológie s vybranými možnosťami sme rozpísali v samostatnej kapitole.

Výsledok našej práce je teda simulátor, ktorý umožňuje používateľovi pracovať bez nutnosti inštalácie tak aby mu po funkčnej stránke nič nechýbalo. Nefunkčné charakteristiky aplikácie sú výsledkom analýzy, vlastnej skúsenosti a testovania.

Simulátor umožňuje vytvorenie programu za pomoci tabuliek aj vizualizácie. Takýto program je možné uložiť a načítať ako textový súbor. Pôvodný zámer ukladať program ako binárny súbor na pre Silverlight aplikácie určené miesto sa ukázal ako nepraktický. Program je možné spustiť viacerými spôsobmi, podľa vôle používateľa.

Do aplikácie sme sa snažili okrem vizualizácie pridať aj ďalšie funkcie a som rád že sa nám to podarilo. Aplikácia si ukladá históriu všetkých prechodov od posledného spustenia programu, ktoré si používateľ môže následne prezrieť. Aplikácia obsahuje jednoduché testovacie prostredie, v rámci ktorého je možné definovať sadu testov. Takéto testy možno podobne ako samotný program uložiť a načítať. Výhoda spočíva teda aj v jasnejšej definícii zadania hľadanej funkcie (programu). Po vytvorení vizualizácie sme si uvedomili výhodu obrázku (či orientovaného grafu) ako definíciu programu a preto sme umožnili ukladať aktuálnu podobizeň vizualizácie do obrázka.

Možné pokračovanie práce

Aplikácia využíva vizualizáciu, ktorá by bola vhodná aj pre iné typy simulátorov, napríklad simulátor automatov. Je teda možné aplikáciu zjednodušiť tak aby fungovala vhodne pre tvorbu automatov.

Simulátor by bolo tiež možné obohatiť o ďalšie pásky tak že sa zmení podstata niektorých tried v aplikácii a generovanie vstupno-výstupných prvkov sa viac zautomatizuje. Pri takomto rozšírení by bolo treba zmeniť množstvo ďalších komponentov ako ukladanie, testovanie či históriu prechodov.

Pri štandardnom pokračovaní projektu by sme si vedeli predstaviť doplnenie sprievodcu tvorby programu či pomocníka, ktorý by dôkladnejšie vysvetľoval jednotlivé funkcie.

Použitá literatúra

J. Hromkovič. Theoretical Computer Science. ISBN 3-540-14015-8, Springer-Verlag Berlin Heindelberg New York

Luboslav Lacko. Silverlight, výukový průvodce tvorbou interaktivních aplikací. 2010, ISBN 9788025127162, Computer Press

Juraj Ladický, Peter Tomcsányi, RNDr. Simulátor konečných automatov a Turingových strojov. Bakalárska práca, 2010.

Tomáš Lörincz, Michal Winczer, RNDr., PhD. Simulátor konečných automatov. Bakalárska práca, 2011.

Pinaki Chakraborty, P.C. Saxena, C.P. Katti. Fifty Years of Automata Simulation: A Review. Volume 2 Issue 4, December 2011. [online] http://dl.acm.org/citation.cfm?id=2038893

Jeff Scanlon. The History of Silverlight. Apress December 04, 2008. [online]http://www.c-sharpcorner.com/uploadfile/freebookarticles/apress /2008dec04014325am/IntrotoSilverlight/2.aspx

MSDN Library. [online] http://msdn.microsoft.com/en-us/library/default.aspx

FluxJpeg Core. Knižnica [online] http://code.google.com/p/fjcore/

Príloha: Zdrojový kód aplikácie

Kompletný zdrojový kód aplikácie sa nachádza na priloženom CD.