tcl | |
---|---|
Jazyková třída |
multiparadigma : objektově orientované , funkční , procedurální , událostmi řízené , imperativní |
Typ provedení | interpretován |
Objevil se v | 1988 |
Autor | John Ousterhout |
Přípona souboru | .tcl |
Uvolnění |
|
Typový systém | dynamický |
Byl ovlivněn | Shell , Lisp |
ovlivnil | Python , Ruby |
Licence | jako BSD |
webová stránka | tcl.tk |
Mediální soubory na Wikimedia Commons |
Tcl (z anglického Tool Command Language - „příkazový jazyk nástrojů“, čti „ticle“ nebo „ti-si-el“) je skriptovací jazyk na vysoké úrovni .
Tcl se často používá ve spojení s grafickou knihovnou Tk (Tool Kit) . Svazek Tcl / Tk se v ruštině někdy nazývá „Tak-tikl“ (anglická verze je „tikl-tok“).
Oblasti použití jazyka jsou rapid prototyping , tvorba grafických rozhraní pro konzolové programy (softwarové balíčky), zabudování do aplikačních programů, testování . Tcl se také používá při vývoji webových aplikací .
V Tcl lze s daty všech typů, včetně programového kódu, manipulovat jako s řetězci. To z něj dělá jazyk s přirozenou podporou metaprogramování . Toto programovací paradigma bylo vzato v úvahu při vývoji a vývoji jazyka.
Program Tcl se skládá z příkazů oddělených novými řádky nebo středníky. Každý příkaz se skládá ze sady polí oddělených mezerami. První pole musí být název příkazu a volitelná zbývající pole jsou argumenty předané tomuto příkazu. Příkaz vrací hodnotu, někdy prázdnou. To znamená, že stejně jako Lisp , Tcl používá předponový zápis.
Neexistují žádná klíčová slova jako taková - pojem příkazu v Tcl je podobný pojmu procedura nebo funkce v běžných programovacích jazycích. To platí také pro konstrukce ovládání jazyka. V kombinaci s elementární syntaxí to činí jazyk dobře rozšiřitelným, včetně knihoven napsaných v jiných jazycích, jako je C / C++ nebo Java .
Tcl má také dobře implementovaný model řízení programu založený na událostech . Události mohou být generovány časovačem, když se objeví data v kanálu, když se změní hodnota proměnné, když skončí externí program nebo prostě když uživatel pracuje s rozhraním Tk. Můžete nastavit své vlastní události a spravovat je.
Stejně jako většina moderních skriptovacích jazyků obsahuje Tcl pokročilé nástroje pro práci s regulárními výrazy, pracuje s asociativními poli a dalšími dynamickými datovými strukturami.
Basic Tcl nepodporoval OOP až do verze 8.6, nicméně kvůli snadnému rozšíření syntaxe jazyka existuje mnoho rozšíření Tcl s objektově orientovanými mechanismy, implementovaných jako odkazové knihovny v C nebo v Tcl samotném. Před verzí 8.5 byly nejběžnější tyto: incr Tcl , XOTcl a Snit [3] . Další implementací OOP mechanismů využívajících samotné Tcl, zahrnuté ve standardní knihovně Tcl [4] , je knihovna STOOOP [5] . Od verze 8.5 existuje nová implementace OOP pro Tcl, TclOO , která je od verze 8.6 součástí jazykového jádra [6] [poznámka 1] :
rozšíření | implementováno dne | vlastnosti použitého modelu |
---|---|---|
XOTcl | C | výkonný objektový systém s dynamickou definicí tříd a metod, blízký CLOS |
incr Tcl | C | OOP ve stylu C++ , rozšířený o zavedení konfigurátorů |
Snit | tcl | implementace objektového modelu založená na delegování , nikoli na dědičnosti |
STOOOP | tcl | OOP ve stylu co nejblíže C++, byl také zaveden mechanismus přepínání tříd |
TclOO [7] | C | Kompaktní, ale výkonný objektově orientovaný systém, který lze použít přímo i jako framework pro vytváření pokročilých OOP modelů. |
Jmenné prostory jsou podporovány na úrovni jazykového jádra. Při implementaci OOP mechanismů v Tcl se využívá podpora vnořovací hierarchie jmenných prostorů v tomto jazyce [8] .
Tcl se snadno programuje ve funkčním stylu : poskytuje mechanismy, jako jsou funkce vyššího řádu a abstrakce funkcí [9] , i když Tcl se tímto způsobem používá jen zřídka. Zde je příklad toho, jak lze skládat dvě funkce :
proc o { f g x } { $f [ $g $x ]}Ve verzi 8.5 zavedl Tcl také příkaz apply , který tento styl programování značně usnadňuje.
Zde je příklad jeho použití z oficiální dokumentace:
proc mapa { seznam lambda } { nastavit výsledek {} pro každou položku $list { výsledek lappend [použít $lambda $item ] } return $result } map { x { return [ délka řetězce $x ] : $x }} { a bb ccc dddd }výsledkem tohoto příkladu bude
1:a 2:bb 3:ccc 4:ddddJazyk vyvinul John Ousterhout , když byl na University of California v Berkeley. Původním cílem bylo vytvořit univerzální jazyk pro vkládání do konzolových aplikací . V návaznosti na to Ousterhout rozšířil svůj jazyk o nástroje pro vytváření grafických rozhraní - tak se zrodil Tcl / Tk. [deset]
Za 4 roky vývoje v univerzitních zdech se komunita Tikl rozrostla na několik set tisíc programátorů. V roce 1993 bylo vyvinuto první objektově orientované rozšíření, incr Tcl .
V roce 1994 se Ousterhout stal hlavním inženýrem projektu SunScript. Během následujících 4 let, kdy se Tikl stal jedním z projektů Sun Corporation , zůstal nejen volně distribuovaným systémem, ale také se výrazně zlepšil a stal se multiplatformním .
Richard Stallman zasadil značnou ránu popularitě jazyka , když v září 1994 publikoval v řadě diskusních skupin doporučení „Proč byste neměli používat Tcl“ [11] . V něm staví na tvrzeních, že „Tcl není navržen jako seriózní programovací jazyk“ a „Tcl má zvláštní syntaxi, která přitahuje hackery kvůli své jednoduchosti. Ale syntaxe Tcl se většině uživatelů zdá divná." , a také v souvislosti s propagací Emacs Lisp , vydal verdikt: " projekt GNU nebude používat Tcl v softwaru GNU" . Kromě subjektivních nároků na design jazyka Stallman upozornil na tehdejší objektivní nedostatek – nízký výkon.
Nárůst počtu vývojářů aktivně využívajících tikl však za toto období činil 600 %.
V roce 1998, kvůli rozmachu Javy a s tím spojené tvrdé konkurenci, již nemohla korporace věnovat stejnou pozornost tikl. John Ousterhout opouští Sun, aby vytvořil (s podporou Sun) Scriptics a pokračoval ve vývoji technologie Tcl/Tk [12] [13] . Byla to jedna z prvních komerčních softwarových firem, která se zaměřila na svobodný software .
V březnu 1998 napsal Ousterhout dnes již klasický článek „Scripting: High-Level Programming for the 21st Century“ [14] , ve kterém skriptovací jazyky nazval systémy systémové integrace jazyky, protože jsou zaměřeny především na práci s objekty operačního systému. prostředí, nikoli s elementárními daty. To umožňuje bez psaní tisíců řádků kódu „slepit“ takové objekty do jednoho pomocí dvou nebo tří příkazů.
Ve stejném roce získal dvě významná ocenění za rozvoj jazyka Tcl. První je cena ACM Software System Award, která oceňuje „nejvýznamnější software“. Ocenění již dříve ocenilo základní systémy, jako je zásobník protokolů TCP/IP , první tabulkový procesor , první relační databáze , World Wide Web , Unix , PostScript a Smalltalk . Druhým je každoroční ocenění USENIX Software Tools User Group (STUG) jako uznání vynikajícího softwaru.
V roce 1999 byl vydán Tcl 8.0 - v této implementaci se poprvé objevila kompilace do bytecode , což umožnilo zvýšit rychlost 6x [15] . Další verze Tcl 8.1 zavádí plnou podporu Unicode a poprvé zavádí multithreading . V souvislosti s tímto vydáním Ousterhout uvedl:
„Obecně platí, že 8.1 posouvá Tcl do nové kategorie, protože jej nyní lze použít pro serverové aplikace. C, C++ a Java lze stále používat k vytváření částí aplikací kritických pro výkon, zatímco Tcl lze použít k integraci a sestavování frontendových komponent. [16]
V roce 2000 byl Scriptics přejmenován na Ajuba Solutions a poté koupil Interwoven, který neměl zájem pracovat se svobodným softwarem . V tomto ohledu byl vývoj Tcl přenesen do programátorské komunity. Tak vznikl Tcl Core Team .
Na 9. konferenci Tcl/Tk ve Vancouveru byl představen virtuální souborový systém StarKit , který poskytuje nový, uživatelsky příjemný způsob distribuce programů Tcl.
První slovo je název příkazu, zbytek jsou jeho argumenty. Jakýkoli argument lze nahradit jiným příkazem uzavřeným v hranatých závorkách. Všechny argumenty ve složených závorkách jsou předány příkazu tak, jak jsou, jako jeden argument.
Syntax:
nastavit hodnotu proměnnéPříklad:
nastavit 2 _ sada b 3Syntax:
# text komentářePříklad:
# je komentářSyntax:
dát výrazPříklad:
položí "Ahoj! To jsem já." vloží 123 vloží $a vloží "b = $b"Syntax:
while { Tcl_Expression_With_Boolean_Value } { TclCommand jinýTclCommand ... ... }Příklad:
zatímco { $x < 10 } { vloží $x incr x }Syntax:
if { Expression_Tcl_With_Boolean_Value } { příkaz Tcl }Příklad:
if { $x < 0 } { nastavit x 0 }Příklad:
switch - glob -- $var { { vidět } - { viděl } - { viděl } { vloží "Všechno to znamená totéž!" } }jednoduše vrátí aktuální pracovní adresář. A tým
nastavit wdir [ pwd ]do proměnné wdir uložíte název aktuálního adresáře .
vrátí seznam názvů souborů v aktuálním adresáři, které odpovídají vzoru Vzor .
Postupy jsou definovány následovně
název procedury { seznam argumentů } { … … }Následující fragment kódu vytvoří a inicializuje asociativní pole (v jiných jazycích nazývané také mapa, slovník nebo hash).
základní kapitál ( Francie ) Paříž základní kapitál ( Itálie ) Řím základní kapitál ( Německo ) Berlín základní kapitál ( Polsko ) Varšava základní kapitál ( Rusko ) Moskva základní kapitál ( Španělsko ) MadridK dotazu a zobrazení jedné z hodnot asociativního pole použijte
vkládá $capital ( Itálie )Pomocí příkazu lze získat seznam všech zemí (klíče pole).
názvy polí velkáVýsledek nebude seřazen, protože Tcl pole jsou založena na hashovacích tabulkách .
Polsko Španělsko Rusko Německo Itálie FrancieŘazení lze provést příkazem
lsort [ názvy polí velká ]Chcete-li odkazovat na pole (předat jej jako odkaz), použijte název proměnné obsahující:
proc demo arrName { upvar 1 $arrName arr ; # spojte odkaz s místním názvem # udělejte něco s arr }Chcete-li přistupovat k poli podle hodnoty, použijte pole get nebo array set . Chcete-li například zkopírovat jedno pole do druhého:
sada polí Newarr [ array get Oldarr ]Tcl 8.5 zavedl pole předávaná hodnotou - slovníky ( dict ).
Chcete-li převést skalární proměnnou na pole a naopak, odstraňte existující proměnnou pomocí příkazu unset .
Ve výchozím nastavení jsou uvnitř procedury viditelné pouze proměnné definované v proceduře. Mimo definici procedury nejsou její proměnné přístupné jinak než prostřednictvím mechanismu předávání parametrů. V proceduře je možné mít proměnné se stejným názvem jako v hlavním programu, přičemž hodnoty těchto proměnných se budou lišit, ve skutečnosti se bude jednat o různé proměnné. Ke změně tohoto chování se používají příkazy global nebo upvar .
Dobrý den, světový program vypadá takto
říká "Ahoj světe!"nebo tak
klade { Ahoj světe ! _ }Zobrazení hodnoty prvku pole OldArray(precision), jehož název (pole) je dán novou proměnnou NewArray
set NewArray OldArray vloží [set $ { NewArray }( přesnost )] Sčítání čísel v poliMetoda (A) – Sčítání pomocí smyčky „foreach“.
nastavit čísla { 1 2 3 4 5 6 7 8 9 10 } nastavit výsledek 0 pro každé číslo $čísla { set result [výraz { $výsledek + $číslo }] } vloží $výsledekMetoda (B) – Mnohem elegantnější způsob pomocí příkazu 'join'
nastavit čísla { 1 2 3 4 5 6 7 8 9 10 } klade [výraz [ spojit $čísla + ]] Výpis obsahu polePole tcl_platform obsahuje informace o vlastnostech platformy, na které Tcl běží. Seznam názvů vlastností lze získat pomocí
názvy polí tcl_platformNásledující úryvek je vypíše spolu s jejich hodnotami:
foreach i [ názvy pole tcl_platform ] { vloží "$i = $tcl_platform($i)" }Pokud mají být vlastnosti seřazeny
foreach i [ lsort [ názvy polí tcl_platform ] ] { vloží "$i = $tcl_platform($i)" }Zde je ukázáno vnoření příkazů. Mohou být vnořeny do libovolné hloubky. Podobného výsledku lze dosáhnout pomocí příkazu parray [17] zavedeného v Tcl 8.5.
Procedura filtru vrátí ty prvky seznamu, pro které skript vyhodnotí jako PRAVDA:
proc filter { skript seznamu } { set res {} foreach e $list {if {[vyšší úroveň 1 $script $e ]} { lappend res $e }} return $res }Příkaz vyšší úrovně 1 vyhodnocuje výraz v kontextu, ve kterém se nazývá filtr slov .
Procedura in je zkrácený zápis pro zahrnutí množin:
proc v { seznamu e } { výraz {[ lsearch - přesný $list $e ] >= 0 } }Zkouška:
% filtr { a b c } { v { b c d }} b cTo ukazuje, že název příkazu může být libovolný řetězec, stejně jako operátor ?: známý z jiných jazyků .
Tcl je interpretovaný jazyk, to znamená , že programy Tcl jsou připraveny ke spuštění bez kompilace a spojování .
Tcl interpret byl portován na většinu běžných platforem [18] . Je šířen pod bezplatnou licencí bez copyleftu , která umožňuje jeho použití bez omezení při vývoji proprietárních aplikací a také k vytváření proprietárních odvozených systémů. Vývojáři ji označují jako BSD-like , ačkoli ve srovnání s licencí BSD ukládá licence Tcl méně omezení.
V současné době na jádru jazyka Tcl pracuje skupina vývojářů [19] s názvem Tcl Core Team [20] . Nejnovější verze překladače Tcl a základních knihoven jsou k dispozici v repozitáři SourceForge.net , viz seznam projektů sourceforge zahrnutých v hlavní distribuci Tcl/Tk [21] .
Překladač Tcl zkompiluje program do přechodné reprezentace - bajtkódu a poté jej interpretuje. Na rozdíl například od Pythonu se tato prostřední reprezentace neukládá na disk, program lze uložit pouze ve zdrojovém kódu, případně zabalený v modulu StarKit nebo pomocí nějakého jiného wrapperu . V závislosti na možnostech kompilace může nebo nemusí Tcl interpret podporovat multithreading .
Zatímco většina učebnic Tcl pro začátečníky říká něco ve smyslu „Tcl má pouze jeden typ proměnné, řetězec“, realita je taková, že překladatelé Tcl dělají věci již dlouhou dobu jinak. Interně Tcl používá dynamický typový systém s automatickou transparentní konverzí řetězců.
Tcl je součástí téměř všech distribucí Linuxu . Microsoft Windows vyžaduje samostatný instalační balíček.
Verze Tcl 8.4 se od předchozí liší novými funkcemi (optimalizace 64bitového kódu, VFS, doplňky z hlediska introspekce ) a určitým zvýšením výkonu díky optimalizaci práce s bajtkódem.
Nové funkce přidané ve verzi 8.1 (jako je podpora více vláken, možnosti internacionalizace a zpracování znaků Unicode) zpomalily Tcl o přibližně 19 % ve srovnání s verzí 8, která přinesla skok v rychlosti. Vývojáři 8.4 vynaložili veškeré úsilí, aby maximalizovali rychlost provádění programů, aby zajistili, že nebudou pracovat nejen pomaleji, ale dokonce rychleji, než když se objevila verze 8.0. Tohoto cíle bylo dosaženo téměř u všech nástrojů Tcl a Tk - verze 8.4 je v průměru 8x rychlejší než verze 7.6 [15] .
Aktuální verze TCL je 8.6.
Alternativní implementace a dialektyPro populární univerzální virtuální stroje existují alternativní implementace Tcl. Jedná se o Java interpret - Jacl [22] (poslední verze z roku 2008) a projekt Eagle [23] , který implementuje většinu příkazů Tcl 8.4 pro CLR (k dispozici jsou sestavení pro .NET 4.0 a 2.0). Probíhají experimenty s překladem programů Tcl do kódu virtuálního stroje Parrot , který je vyvíjen pro šestou verzi Perlu [24] .
Pro programování vestavěných systémů a vkládání do aplikací byl vyvinut speciální dialekt Tcl - Jim [25] [26] . Jedná se o interpret, který implementuje velkou podmnožinu Tcl, rozšířenou o další objektově orientované a funkční programovací mechanismy a zabírá méně než 100 kilobajtů v kompilované formě.
Dalším dialektem Tcl je mobilní skriptovací jazyk Hecl [27] , vyvinutý Davidem Weltonem a implementovaný v Javě ( J2ME ) [28] [29] . Pokud jde o platformu Android , podporu Tcl na ní (spolu s dalšími skriptovacími jazyky) zajišťuje: skriptovací vrstva SL4A [30] ; existuje také nativní implementace Tcl pro tento OS s názvem AndroWish [31] .
Všechny níže uvedené distribuce jsou distribuovány volně a jsou sestaveny z komponent, které mají tu či onu bezplatnou licenci . Většina z nich je multiplatformních (kromě WinTclTk a Tcl/Tk Aqua ), i když na unixových systémech je Tcl/Tk obvykle součástí distribuce OS .
Tcl se spolu s Perlem a Pythonem stal jedním ze tří klasických univerzálních skriptovacích jazyků. Tato trojice se objevuje nejen jako seznam bezplatných distribucí sestavených v ActiveState , ale také například jako jazyky, ve kterých lze (kromě dialektu PL/pgSQL ) psát triggery a uložené procedury oblíbeného databázového serveru PostgreSQL .
Tcl jako embeddable jazyk našel uplatnění v oblasti CAD ( CAD | CAM | CAE ) [41] [42] . Používá se například jako databázový tuner v postprocesoru Unigraphics . Navíc je to de facto automatizační a integrační jazyk ve všech předních softwarových balíčcích pro návrh čipů ( FPGA a ASIC ).
Ve webovém programování se Tcl obvykle používá ve spojení s webovým serverem AOLServer nebo jedním z „odlehčených“ webových serverů FastCGI , jako je lighttpd . Pro integraci Tcl s Apache existuje modul Rivet [43] .
Pod kontrolou AOLServeru je zejména OpenACS [44] redakční systém pro webové stránky s bohatou rozšiřitelností v jazyce Tcl, rozšířeném XOtcl nebo project-open [45] - systém pro skupinovou práci s webovým rozhraním .
Existují také projekty jako TclHttpd [46] a jeho nástupce Wub [47] , což jsou kompletní webové rámce . Na základě nového objektového rozšíření jazyka TclOO je vyvíjen webový rámec Woof (Web Oriented Object Framework) [48] . Příkladem CMS pro TclHttpd je Ucome [49] .
Kromě toho, že se Tcl používá jako implementační jazyk webových aplikací, lze jej použít jako skriptovací jazyk pro rozšíření stávajících aplikací. Jsou na něm napsány například moduly pro bota Eggdrop IRC [50] [51] .
Nevýhodou raných verzí Tcl/Tk byl nepochybně pomalý výkon. Verze pod 8 používaly přímou interpretaci zdrojového kódu, ale použití bajtkódu tento problém vyřešilo. Nyní se Tcl z hlediska rychlosti příliš neliší od PHP , i když je výrazně horší než takové skriptovací jazyky, jako je například Python nebo Lua . Složité nebo časově kritické části kódu se doporučuje provádět jako externí moduly v C / C++ .
Tcl/Tk má pro programátory v "tradičních" jazycích neznámou syntaxi. Je blíže standardní syntaxi unixového shellu . Tato syntaxe může být libovolně upravena (jako v jiných „programovatelných programovacích jazycích“ jako Forth [pozn. 2] nebo Common Lisp ). To může být výhoda pro jednotlivého programátora nebo malou skupinu programátorů, ale Tcl/Tk je stěží vhodný pro použití jako obecný jazyk pro průmyslový vývoj. Ačkoli přítomnost standardizovaných rozšíření snižuje závažnost tohoto problému. Tcl lze využít i ve velkých projektech v rámci své „ekologické niky“ (embedded skripty, „lepící“ komponenty, WEB programování).
Ačkoli Tcl má všechny vlastnosti funkcionálního jazyka , jeho interpret před verzí 8.6 neprováděl optimalizaci rekurze ocasu , což ztěžovalo použití čistě funkčního stylu a snižovalo jeho efektivitu. Flexibilita jazyka však umožňuje tento problém obejít implementací zdání takové optimalizace na vysoké úrovni [52] . Konečně příkaz tailcall , který se objevil v testovací verzi 8.6, umožňuje bez problémů používat tail rekurzi.
Nepochybnou výhodou Tcl je nejbližší integrace Tcl s grafickou knihovnou Tk , která se často používá v kombinaci s jinými programovacími jazyky. Chcete-li vytvořit obaly GUI pro konzolové programy nebo balíčky konzolových programů, může být Tcl nejlepší volbou.
I když to není široce používaný programovací jazyk, Tcl, spolu s (dřívějšími) jazyky, jako je Lisp a Smalltalk , měl významný vliv na programování. Stal se prvním jazykem zaměřeným na snadné vkládání do aplikací [53] .
Snadné použití knihovny grafických widgetů Tk nemělo obdoby a stalo se populární i v jiných univerzálních skriptovacích jazycích kromě Tcl . Tkinter zůstává výchozím nástrojem pro vytváření GUI aplikací v Pythonu . Existují také knihovny vazeb Tk pro Perl [ 54] (Tkx) a Ruby [53] .
SQLite , zabudovatelný odlehčený systém pro správu databází SQL , byl původně vyvinut jako rozšíření Tcl [53] .
Programovací jazyky | |
---|---|
|