Zkousim prvni priklad a dopadl jsem blede:
~/src/ada $ gnatmake hello_example.adb
gcc -c hello_example.adb
gnatbind -x hello_example.ali
gnatlink hello_example.ali
~/src/ada $ ./hello_example
failed run-time assertion : Tasking not implemented on this configuration
Programy bez vlaken mi funguji... Co s tim?
Mam gnat z gcc-3.3.2 na SuSE Linuxu 9.0/AMD64.
Zajímavé. Problém bude s tím AMD64, ada pro to asi ještě nemá podporu. To, že v GCC vlánka fungují ještě nic neznamená. Adovské vlákna jsou relativně samostatná (například mají vlastní systém priorit) a je jich mapování na systémová vlákna asi nebude triviální. Nezbývá než počkat na nový GNAT. Holt nová HW platforma...
Ano, umí. Sice netuším, jak vypadají výjimky v Prologu :-), ale Ada má více méně standardní model výjimek, podobný tomu z C++. Ovšem s tím rozdílem, že výjimka je v Adě samostatný typ. Neošetřenou výjimku odchytí runtime a vypíše jméno souboru a číslo řádky, kde byla vyvolána. To není u jazyků kompilovaných do nativního kódu právě samozřejmost.
Samotná Ada výjimky používá. Třeba dělení nulou vyvolá standardní výjimku, kterou lze ošetřit. Používají se i v souvislosti s tasky. Při pokusu o rande s taskem, který byl ukončen se vyvolá Tasking_Error atd.
Zdravim,
v uvodu naznacujete neco v tom smyslu, ze 'interaktivni aplikace
potrebuje bezet ve vice vlaknech...'. Lez jako vez, prirozenejsi
je pouzit neblokujici volani a rozumne strukturovat dany program.
Funguje to pak stejne dobre jak s thready, jenom neni treba se
vyrovnavat s kernel-level slozitosti (vymyslet zamykaci strategii,
ladit to cele). Spojovat thready automaticky s vyssim vykonem
nebo lepsi interaktivni odezvou je neopodstatnene.
Jinak pekny clanek.
-- Freza
To je pekna blbost, kazda trochu slozitejsi GUI aplikace musi pouzivat vice threadu aby vypadala "plynule". Vsek se podivej do seznamu procesu napr. na mozillu. Nejcasteji GUI bezi v hlavnim threadu, funkce kde hrozi zdrzeni se pousteji v dalsich. Neblokujici volani nic neresi, protoze funguji >mezi dvema procesy
Huh? MozillaFirebird mi bezi v jednom threadu, stejne tak links, stejne tak Xserver, stejne tak skoro vsechno.
> Neblokujici volani nic neresi, protoze funguji
> mezi >dvema procesy< anebo pro nektera volani
> jadra.
Hm?
> Cili to vypada jako by ses chtel ubranit pouzivani
> vice threadu zavedenim vice procesu.
Ne, nechtel.
Přesně tak. Platí pravidlo, že jakákoli akce, která blokuje GUI déle než desetinu sekundy by se měla provádět v sekundárním vlákně. Pokud aplikace žádnou takovou akci nemá, je zbytečné se vlákny zaobírat. Smůla je, že většina aplikací není takto triviální. Dvě vlákna pro jednodušší GUI aplikace často stačí.
Velmi ostře protestuji, že to co autor vynáší jako vymoženost Ady, není skoro známé. Přece tohle všechno se muselo používat už před 20 lety v CICSu.
Jinak bych si dovolil připomenout, že obyčejné programování cgi-scriptů pro WWW-server umožňuje polovinu zmiňovaných věcí - a mnohem bezpečněji a dokonce i na cizích počítačích! (A co Ada na toto?)
Stačí jediné, podívat se do Helpu třeba k Perlu, jak z cgi-skriptu aktivovat požadavek na tentýž (anebo úplně cizí) WWW-server.
O žádném CICSu jsem v životě neslyšel. Adu jsem vždycky srovnával s běžnými jazyky. Nepochybuji, že na různých univerzitách mají implementované nejrůznější šílenosti.
CGI skript může být napsán v jakémkoli prosředí. Měl jsem CGI program v Adě a momentálně rutinně provozuji jeden v C#. A co?
Jinak Ada má nějakou úchylnou podporu pro distribuované programování. Prostě umožňuje vytvořit nějakou aplikaci, která se spustí v několika "partitions" (adresových prostorech), které můžou běžet i na různých strojích. Podrobnosti nevím, možná to používá RPC.
Ale Marku, to CICS je komunikační monitor a ten se mohl programovat třeba i ve FORTRANu. To Vás na škole neučili?
Přidané subroutiny se chovají jako makro-jazyk.
Ovšem otevírání a sdílení souborů, fronty zásobníků a podobně patří do jiné oblasti, do správy dat. A závisí na zvolené přístupové metodě či používané databázi. To pouze Ada vše míchá (pro začátečníky) dohromady.
P.S.
Ohledně cgi-skriptů je potřeba si napsat nějaký spolupracující s jiným serverem. Jinak každý mluvíme o něčem jiném.
Nechapu jak maji CGI skripty souviset s thready. Copak CGI skripty maji spolecny adresni prostor a musi si hlidat soubezny pristup ke spolecnym datovym strukturam?
A myslim, ze synchronizace pristupu ke sdilenym datum pomoci pomoci klicovych slov jazyka je opravdu vymozenost Ady, jinde jsem se s tim nesetkal*. Jinde se to resi funkcemi typu mutex_lock() a mutex_unlock() a obcas se pak podari neco zapomenout zamknute a pak se muzete divit, kde to vazne. (Nebo naopak nekde neco nezamknout a pak se clovek ani nestaci divit...)
* s vyjimkou synchronized v Jave; pak to mozna v MS okopirovali i do C#.
Štveš mě! :-)
Tenhle článek je už více než povídáním o bezpečném programování jakýmsi nástinem "tutoriálu" k Adě. A pěkně psaného, dlužno dodat. Já ty tásky při PGS zaboha nemohl pochopit (taky je nikdo nevysvětlil), ale tohle je stručné, jednoduché a výstižné.
Proč končíš, když jsi teprve začal???