SNOBOL
Author
Albert FloresSNOBOL (angl. 'StriNg Oriented and symBOlic L'anguage) je programovací jazyk vyvíjen v letech 1962 až 1967 v AT&T Bellových laboratořích pány David J. Farber, Ralph E. Griswold a Ivan P. Polonsky, jehož poslední verzí je jazyk SNOBOL4. Byl jedním z několika textově orientovaných jazyků vyvíjených v 50. a 60. letech, mezi které patří i COMIT a TRAC.
SNOBOL4 se liší od většiny programovacích jazyků tím, že má vzory jako primární datový typ (tj. datový typ, jehož hodnoty mohou být měněny všemi způsoby povolenými kterémukoliv jinému datovému typu programovacího jazyka) a poskytováním operátorů pro řetězení a měnění vzorů. +more S řetězci generovanými během vykonávání programu může být zacházeno jako s programy a mohou být spouštěny.
SNOBOL4 byl v 60. a 70. letech docela široce vyučován na velkých univerzitách a v 70. a 80. letech byl též široce využíván jako jazyk pro práci s textem v humanitních oborech.
V 80. a 90. +more letech jeho užívání upadávalo, protože nové jazyky, jako například AWK a Perl, umožňovaly manipulaci s řetězci pomocí regulárních výrazů. Vzory SNOBOL4 zahrnují gramatiky BNF, které jsou ekvivalentní bezkontextové gramatice a silnější než regulární výrazy. Regulární výrazy v současných verzích AWK a Perl jsou ve skutečnosti rozšířením regulárních výrazů v tradičním smyslu. Ale regulární výrazy, na rozdíl od vzorů jazyka SNOBOL4, nemohou být rekurzívní, což je značnou výhodou vzorů SNOBOL4. Nicméně regulární výrazy v jazyce Perl mohou být od verze Perl 5. 10 (vydané v prosinci roku 2007) také rekurzívní.
Jeden z vývojářů jazyka SNOBOL, Ralph Griswold, navrhl nástupce jazyka SNOBOL4 nazvané „SL5“ a „Icon“, které kromě jiných nově přidaných funkcí také kombinovaly backtracking vzorů SNOBOL4 a obvyklejší ALGOL strukturu.
Vývoj
Původní jazyk SNOBOL byl vytvořen jako nástroj pro jeho autory k práci se symbolickou manipulací polynomy. Byl napsán v jazyce symbolických instrukcí pro IBM 7090. +more Měl jednoduchou syntaxi - jen jeden datový typ (řetězec - String), žádnou funkci, žádnou deklaraci a velmi malou kontrolu chyb. Nicméně i přes svou jednoduchost a osobitost se začal šířit i do jiných skupin. V důsledku toho se jeho autoři rozhodli ho rozšířit a vyčistit. Přepsali ho a rozšířili o doplňkové funkce - a to jak standardní, tak uživatelsky definované. Výsledek vydali jako SNOBOL3. Verze SNOBOL2 také existovala, ale neobsahoval uživatelem definované funkce a nebyl nikdy vydán. SNOBOL3 se stal docela populární a byl přepsán i pro jiné počítače než IBM 7090 - jinými programátory. A v důsledku toho vzniklo několik neslučitelných dialektů.
Jak SNOBOL3 začínal být populárnější, tak autoři dostávali více a více požadavků na rozšíření do jazyka. Také dostávali stížnosti ohledně nekompatibility a chyb ve verzích, které byly napsány jinými autory. +more Na adresu toho a ve prospěch nových počítačů zaváděných na konci 60. let se rozhodli vyvinout SNOBOL4 se spoustou extra datových typů a funkcí, ale založený na virtuálním stroji z důvodu portability mezi počítači. SNOBOL4 překladač byl stále psán v jazyce symbolických instrukcí. Nicméně makro funkce assembleru byly použity k definování instrukcí virtuálního stroje ze SNOBOL Implementation Language, SIL, což velmi zlepšilo přenositelnost jazyka.
Funkce
SNOBOL4 podporuje několik zabudovaných datových typů, jako jsou celá čísla, reálná čísla, řetězce, vzory, pole, tabulky (asociativní pole) a také uživatelem definované datové typy a funkce. Způsob definování 'uživatelem definovaných datových typů' v jazyce SNOBOL4 byl v té době velmi pokročilý - podobně jako dříve v jazyce COBOL nebo později v jazyce Pascal.
Všechny příkazové řádky jsou ve tvaru: : label subject pattern = object : transfer Každý z pěti prvku je volitelný. Obecně platí, že předmět je porovnáván vůči vzoru. +more Pokud je přítomen objekt, jakákoliv ovlivněná část je objektem nahrazena dle pravidel pro výměnu. Převod může být po absolutní větvi nebo podmíněné větvi - to závisí na úspěchu či neúspěchu při hodnocení předmětu, vyhodnocení vzorů, shodě vzorů, hodnocení objektu nebo konečného přiřazení. Převedeno do kódu a zkompilováno to může být také samotným programem během jeho spuštění.
Vzory jazyka SNOBOL mohou být velmi jednoduché i extrémně komplexní. Jednoduchým vzorem je pouhý řetězec (např. +more „ABCD“), ale komplexní vzor může být popsán rozsáhlou strukturou (např. kompletní gramatika počítačového jazyka). Interpret určitého programovacího jazyka je možné v jazyce SNOBOL implementovat téměř přímo z Backusovy-Naurovy formy příslušného jazyka, (s malými rozšířeními). Makroassembler a interpret pro vymyšlený hardware může být ve SNOBOLu implementován na pouhých několika stovkách řádků, přičemž k přidání nové strojové instrukce může stačit jediný řádek.
Komplexní vzory SNOBOLu mohou dělat věci, které by bylo nepraktické ci nemožné udělat pomocí primitivnějších regulárních výrazů, jako to dělá většina ostatních jazyků. Část jejich síly vyplývá z tzv. +more „SPITBOL rozšíření“ (která byla od té doby zahrnuta do základů všech moderních implementací původního jazyka SNOBOL4), dosáhnout stejného výkonu je ovšem možné i bez nich. Část této síly pochází z vedlejších účinků, ke kterým dochází při provádění operace „pattern matching“ (nalezení vzoru), včetně ukládání odpovídajících výsledků a schopnost spustit uživatelem napsané funkce během shody vzorů, který může provádět téměř jakékoli požadované zpracování, a pak ovlivnit probíhající směr přerušeného porovnávání vzorů, nebo v průběhu odpovídající operace dokonce změnit vzorec samotný. Vzory mohou být uloženy jako každá jiná primární datová položka (datový typ), mohou být zřetězeny, použity v rámci jiných vzorů, použity k vytvoření velmi složitých a sofistikovaných výrazů. Například je možné napsat vzor, který obsahuje „úplný název a mezinárodní poštovní korespondenční adresu“, což výrazně přesahuje možnosti regulárních výrazů.
„SNOBOL Pattern-matching“ používá backtracking (zpětné procházení) podobně jako v logickém programovacím jazyce Prolog, který poskytuje vzory podobné konstrukce přes DCG . Tento algoritmus usnadňuje použití jazyka SNOBOL (jako logický jazyk) - oproti většině jiných jazyků.
SNOBOL ukládá proměnné, řetězce a datové struktury v jediné haldě (garbage-collection).
Příklad programů
Program „Hello World“ může vypadat následovně: OUTPUT = "Hello world" END Jednoduchý program, který se ptá uživatele na jméno a využije možnost vstupu: OUTPUT = "What is your name. " Username = INPUT OUTPUT = "Thank you, " Username END Možnost vybrat si ze třech výstupů: OUTPUT = "What is your name. +more" Username = INPUT Username "J" :S(LOVE) Username "K" :S(HATE) MEH OUTPUT = "Hi, " Username :(END) LOVE OUTPUT = "How nice to meet you, " Username :(END) HATE OUTPUT = "Oh. It's you, " Username END Neustálé vyžadování vstupů do přerušení (odeslání prázdného řetězce): OUTPUT = "This program will ask you for personal names" OUTPUT = "until you press return without giving it one" NameCount = 0 :(GETINPUT) AGAIN NameCount = NameCount + 1 OUTPUT = "Name " NameCount ": " PersonalName GETINPUT OUTPUT = "Please give me name " NameCount + 1 PersonalName = INPUT PersonalName LEN(1) :S(AGAIN) OUTPUT = "Finished. " NameCount " names requested. " END.
SNOBOL a Python
Protože někteří uživatelé programovacího jazyka Python zjistili, že používání regulárních výrazů může být omezující, byl jazyk Python rozšířen o možnost použití „SNOBOL Pattern-matching“. Rozšíření s názvem SnoPy vytvořil Don Rozenberg.