1/13 Ada Vláknové programování část I Lukáš Hejmánek, Petr Holub {xhejtman,hopet}@ics.muni.cz Laboratoř pokročilých síťových technologií PV192 2014–02–18 2/13 Ada Přehled přednášky Ada 3/13 Ada Ada     “Regression testing?” What’s that? If it compiles, it is good, if it boots up it is perfect. – Linus Torvalds     Compilable but broken code is even worse than working code. – Alan Cox during a bright moment on the linux-kernel list     Ada: Ideally, when compiles fine it also runs fine. 4/13 Ada Ada Ada 83/95/2005 jazyk orientovaný na spolehlivé aplikace: vojáci, letectví, ... WORM: write once read many silně typovaný jazyk podpora paralelismu enkapsulace, výjimky, objekty, správa paměti, atd. GNAT ◾ volně dostupný překladač, frontend k GCC materiály na webu ◾ (Annotated) Reference Manual http://www.adaic.org/standards/ada05.html ◾ http://stwww.weizmann.ac.il/g-cs/benari/books/index.html#ase ◾ http://en.wikibooks.org/wiki/Programming:Ada ◾ http://www.adahome.com/Tutorials/Lovelace/lovelace.htm ◾ http://www.pegasoft.ca/resources/boblap/book.html 5/13 Ada Na co se podívat Struktura balíků, enkapsulace, pojmenování souborů Typový systém Ada, typy a podtypy, ukazatele (access vs. access all), generika, objekty, atributy proměnných Správa paměti Generické kontejnery Volby kompilace: gnatmake hello.adb vs. gnatmake -gnatya -gnatyb -gnatyc -gnatye -gnatyf -gnatyi -gnatyk -gnatyl -gnatyn -gnatyp -gnatyr -gnatyt -g -gnato -gnatf -fstack-check hello.adb 6/13 Ada Co v Adě neuděláte ... tedy co v ní neuděláte (takhle). 1 if(c = ntoa(b)) {} 7/13 Ada Co v Adě neuděláte ... tedy co v ní neuděláte (takhle). 1 send(to, from, count) register short *to, *from; 3 register count; { 5 register n = (count + 7) / 8; switch(count % 8) { 7 case 0: do { *to = *from++; case 7: *to = *from++; 9 case 6: *to = *from++; case 5: *to = *from++; 11 case 4: *to = *from++; case 3: *to = *from++; 13 case 2: *to = *from++; case 1: *to = *from++; 15 } while(--n > 0); } 17 } Zdroj: https://en.wikipedia.org/wiki/Duff%27s_device Kopírování pole do memory-mapped výstupu, nikoli kopie pole. 8/13 Ada Co v Adě neuděláte ... tedy co v ní neuděláte (takhle). 1 if(c = ntoa(b)) {} 3 #define _ -F<00||--F-OO--; int F=00,OO=00;main(){F_OO();printf("%1.3f\n",4.*-F/OO/OO);}F_OO() 5 { _-_-_-_ 7 _-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_ 9 _-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ 11 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ 13 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ 15 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ 17 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_ 19 _-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_ 21 _-_-_-_ } Zdroj: http://www0.us.ioccc.org/1988/westley.c 9/13 Ada Ada: kontejnery with Ada.Containers.Ordered_Sets; 2 with Ada.Containers.Hashed_Sets; with Ada.Containers.Hashed_Maps; 4 package Priklad_Kolekci is 6 function Unbounded_String_Hash (S : Unbounded_String) 8 return Hash_Type; 10 package UString_Int_Hash is new Ada.Containers.Hashed_Maps ( Key_Type => Unbounded_String, 12 Element_Type => Integer, Hash => Unbounded_String_Hash, 14 Equivalent_Keys => "="); 16 package UStringSet is new Ada.Containers.Hashed_Sets ( Element_Type => Unbounded_String, 18 Hash => Unbounded_String_Hash, Equivalent_Elements => "="); 10/13 Ada Ada: kontejnery 1 procedure Output_Host_Set (HostSet : UStringSet.Set) is use UStringSet; 3 Cur : UStringSet.Cursor; Is_Tag_Open : Boolean := False; 5 begin Cur := First (HostSet); 7 if Cur /= UStringSet.No_Element then Open_Tag (Is_Tag_Open, " "); 9 while Cur /= UStringSet.No_Element loop Put_Line (" " & To 11 _String (Element (Cur)) & ""); Cur := Next (Cur); 13 end loop; Close_Tag (Is_Tag_Open, " " 15 ); end if; 17 exception 19 when An_Exception : others => Syslog (LOG_ERR, "State dump failed! " & 21 & Exception_Information (An_Exception)); Close_Tag (Is_Tag_Open, " " 23 ); end Output_Host_Set; 25 end Priklad_Kolekci 11/13 Ada Instalace GNATu Instalační soubory jsou ve studijních materiálech ◾ /el/1433/jaro2011/PV192/um/23046574/ ◾ Linux x86 32 b ◾ Linux x86 64 b ◾ Windows Součásti: GNAT GPL Ada Ada compiler, debugger, tools, libraries AUnit gpl-2010 Ada unit testing framework SPARK GPL SPARK Examiner and Simplifier (static prover) GNATbench Ada plugins for the Eclipse/Workbench IDEs PolyORB gpl-2010 CORBA and Ada distributed annex AWS gpl-2.8.0 Ada web server library ASIS gpl-2010 Library to create tools for Ada software AJIS gpl-2010 Ada Java interfacing suite GNATcoll gpl-2010 Reusable Ada components library GtkAda gpl-2.14.1 Create modern native GUIs in Ada XMLAda gpl-3.2.1 Library to process XML streams Florist gpl-2010 Interface to POSIX libraries (pouze pro Linux) Win32 Ada gpl-2010 Ada API to the Windows library (pouze pro Windows) 12/13 Ada Instalace GNATu Instalace překladače Linux: ◾ adacore-X86LNX-201102271805.zip: x86-linux/gnatgpl-gpl-2010/ gnat-gpl-2010-i686-gnu-linux-libc2.3-bin.tar.gz gnat-2010-i686-gnu-linux-libc2.3-bin ./doinstall Windows: ◾ adacore-X86WIN-201102271212.zip: x86-windows/gnatgpl-gpl-2010/ gnat-gpl-2010-1-i686-pc-mingw32-bin.exe 13/13 Ada Úkol – Ada Naprogramujte ekvivalent fgrep-u ◾ podpora voleb -i, -r, -n ◾ smyslem je seznámit se s jazykem