tcl | |
---|---|
Sprog klasse |
multiparadigme : objektorienteret , funktionel , proceduremæssig , begivenhedsdrevet , imperativ |
Udførelsestype | fortolket |
Dukkede op i | 1988 |
Forfatter | John Ousterhout |
Filtypenavn _ | .tcl |
Frigøre |
|
Type system | dynamisk |
Blev påvirket | Shell , Lisp |
påvirket | Python , Ruby |
Licens | BSD-lignende |
Internet side | tcl.tk |
Mediefiler på Wikimedia Commons |
Tcl (fra det engelske Tool Command Language - "command language of tools", læs "ticle" eller "ti-si-el") er et scriptsprog på højt niveau .
Tcl bruges ofte i forbindelse med Tk (Tool Kit) grafikbibliotek . Tcl / Tk-pakken på russisk kaldes nogle gange "Tak-tikl" (den engelske version er "tikl-tok").
Sprogets anvendelsesområde er hurtig prototyping , oprettelse af grafiske grænseflader til konsolprogrammer (softwarepakker), indlejring i applikationsprogrammer, test . Tcl bruges også i webudvikling .
I Tcl kan data af alle typer, inklusive programkode, manipuleres som strenge. Dette gør det til et sprog med naturlig understøttelse af metaprogrammering . Dette programmeringsparadigme blev taget i betragtning under udviklingen og udviklingen af sproget.
Et Tcl-program består af kommandoer adskilt af nye linjer eller semikolon. Hver kommando består af et sæt felter adskilt af mellemrum. Det første felt skal være navnet på kommandoen, og de valgfrie resterende felter er de argumenter, der sendes til den kommando. Kommandoen returnerer en værdi, nogle gange tom. Det vil sige, ligesom Lisp , bruger Tcl præfiksnotation.
Der er ingen nøgleord som sådan - konceptet med en kommando i Tcl ligner konceptet med en procedure eller funktion i almindelige programmeringssprog. Dette gælder også for sprogkontrolkonstruktioner. Kombineret med den elementære syntaks gør dette sproget godt udvideligt, herunder biblioteker skrevet på andre sprog såsom C / C++ eller Java .
Tcl har også en velimplementeret event-baseret programkontrolmodel . Hændelser kan genereres af en timer, når data vises i en kanal, når værdien af en variabel ændres, når et eksternt program slutter, eller blot når brugeren arbejder med Tk-grænsefladen. Du kan indstille dine egne begivenheder og administrere dem.
Som de fleste moderne scriptsprog indeholder Tcl avancerede værktøjer til at arbejde med regulære udtryk, arbejder med associative arrays og andre dynamiske datastrukturer.
Basic Tcl understøttede ikke OOP før version 8.6, men på grund af den nemme udvidelse af sprogets syntaks er der mange udvidelser af Tcl med objektorienterede mekanismer, implementeret som linkbiblioteker i C eller i selve Tcl. Før version 8.5 var de mest almindelige: incr Tcl , XOTcl og Snit [3] . En anden implementering af OOP-mekanismer, der bruger Tcl selv, inkluderet i Tcl-standardbiblioteket [4] , er STOOOP- biblioteket [5] . Siden version 8.5 er der en ny implementering af OOP for Tcl, TclOO , inkluderet siden version 8.6 i sprogkernen [6] [note 1] :
udvidelse | implementeret på | egenskaber ved den anvendte model |
---|---|---|
XOTcl | C | kraftfuldt objektsystem med dynamisk definition af klasser og metoder, tæt på CLOS |
incr Tcl | C | OOP i en C++- stil , udvidet med introduktionen af konfiguratorer |
Snit | tcl | objektmodelimplementering baseret på delegation , ikke arv |
STOOOP | tcl | OOP i en stil så tæt som muligt på C++, en klasseskiftemekanisme er også blevet introduceret |
TclOO [7] | C | Et kompakt, men kraftfuldt objektorienteret system, der både kan bruges direkte og som ramme for opbygning af avancerede OOP-modeller. |
Navneområder understøttes på sprogets kerneniveau. Ved implementering af OOP-mekanismer i Tcl, bruges understøttelse af indlejringshierarkiet af navnerum på dette sprog [8] .
Tcl er let at programmere i en funktionel stil : det giver mekanismer såsom funktioner af højere orden og funktionsabstraktioner [9] , selvom Tcl sjældent bruges på denne måde. Her er et eksempel på, hvordan to funktioner kan sammensættes :
proc o { f g x } { $f [ $g $x ]}I version 8.5 introducerede Tcl også kommandoen apply , som gør denne programmeringsstil meget lettere.
Her er et eksempel på dets brug fra den officielle dokumentation:
proc map { lambda liste } { sæt resultat {} for hvert element $list { lappend resultat [anvend $lambda $item ] } returner $result } kort { x { return [ strenglængde $ x ] : $x }} { a bb ccc dddd }resultatet af dette eksempel vil være
1:a 2:bb 3:ccc 4:ddddSproget blev udviklet af John Ousterhout, mens han var på University of California i Berkeley. Det oprindelige mål var at skabe et universelt sprog til indlejring i konsolapplikationer . Efter dette udvidede Ousterhout sit sprog med værktøjer til at skabe grafiske grænseflader - sådan blev Tcl / Tk født. [ti]
I 4 års udvikling inden for universitetets mure er Tikl-samfundet vokset til flere hundrede tusinde programmører. I 1993 blev den første objektorienterede udvidelse, incr Tcl , udviklet .
I 1994 blev Ousterhout ledende ingeniør på SunScript-projektet. I løbet af de næste 4 år, da Tikl blev et af Sun Corporations projekter , forblev Tikl ikke kun et frit distribueret system, men blev også væsentligt forbedret og blev på tværs af platforme .
Richard Stallman gav et betydeligt slag for sprogets popularitet, da han i september 1994 i en række nyhedsgrupper offentliggjorde anbefalingen "Hvorfor du ikke bør bruge Tcl" [11] . I den bygger han på påstandene om, at "Tcl ikke er designet som et seriøst programmeringssprog" og "Tcl har en særlig syntaks, der tiltrækker hackere på grund af dets enkelhed. Men Tcl-syntaksen virker mærkelig for de fleste brugere." , og også i forbindelse med promoveringen af Emacs Lisp , udstedte en dom: " GNU -projektet kommer ikke til at bruge Tcl i GNU-software" . Ud over subjektive krav til sprogets design påpegede Stallman en objektiv ulempe på det tidspunkt - lav ydeevne.
Væksten i antallet af udviklere, der aktivt bruger tikl, udgjorde dog 600% i denne periode.
I 1998, på grund af Java -boomet og den hårde konkurrence forbundet med det, kunne selskabet ikke længere være opmærksom på tikl. John Ousterhout forlader Sun for at danne (med Sun-støtte) Scriptics og fortsætter udviklingen af Tcl/Tk-teknologi [12] [13] . Det var et af de første kommercielle softwarefirmaer, der fokuserede på fri software .
I marts 1998 skrev Ousterhout den efterhånden klassiske artikel "Scripting: High-Level Programming for the 21st Century" [14] , hvori han kaldte scripting languages system integration languages, fordi de primært fokuserer på at arbejde med objekter i driften. miljø og ikke med elementære data. Dette gør det muligt, uden at skrive tusindvis af kodelinjer , at "lime" sådanne objekter til én med to eller tre kommandoer.
Samme år vandt han to store priser for udviklingen af Tcl-sproget. Den første er ACM Software System Award, som anerkender "den mest betydningsfulde software." Prisen har tidligere hædret grundlæggende systemer såsom TCP/IP -protokolstakken , det første regneark , den første relationelle database , World Wide Web , Unix , PostScript og Smalltalk . Den anden er den årlige USENIX Software Tools User Group (STUG) Award som anerkendelse af fremragende software.
I 1999 blev Tcl 8.0 udgivet - i denne implementering dukkede kompilering til bytecode først op , hvilket gjorde det muligt at øge hastigheden med 6 gange [15] . Den næste version af Tcl 8.1 introducerer fuld Unicode- understøttelse og introducerer multithreading for første gang . I forbindelse med denne udgivelse udtalte Ousterhout:
“Generelt flytter 8.1 Tcl ind i en ny kategori, da den nu kan bruges til serverapplikationer. C, C++ og Java kan stadig bruges til at bygge de ydeevnekritiske dele af applikationer, mens Tcl kan bruges til at integrere og bygge frontend-komponenter." [16]
I 2000 blev Scriptics omdøbt til Ajuba Solutions og derefter købt af Interwoven, som ikke var interesseret i at arbejde med fri software . I denne forbindelse blev udviklingen af Tcl overført til programmeringsfællesskabet. Sådan blev Tcl Core Team dannet .
Ved den 9. Tcl/Tk-konference i Vancouver blev det virtuelle filsystem StarKit introduceret , hvilket giver en ny, brugervenlig måde at distribuere Tcl-programmer på.
Det første ord er navnet på kommandoen, resten er dens argumenter. Ethvert argument kan erstattes af en anden kommando omgivet af firkantede parenteser. Eventuelle argumenter i krøllede klammeparenteser sendes til kommandoen, som de er, som et enkelt argument.
Syntaks:
indstille variabel værdiEksempel:
sæt en 2 sæt b 3Syntaks:
# kommentartekstEksempel:
# er en kommentarSyntaks:
sætte udtrykEksempel:
sætter "Hej! Det er mig." sætter 123 sætter $a sætter "b = $b"Syntaks:
mens { Tcl_Expression_With_Boolean_Value } { TclCommand andenTclCommand ... ... }Eksempel:
mens { $x < 10 } { sætter $x incr x }Syntaks:
if { Expression_Tcl_With_Boolean_Value } { Tcl kommando }Eksempel:
hvis { $x < 0 } { sæt x 0 }Eksempel:
switch - glob -- $var { { se } - { så } - { set } { sætter "Det hele betyder det samme!" } }returnerer blot den aktuelle arbejdsmappe. Og holdet
sæt wdir [ pwd ]du gemmer navnet på den aktuelle mappe i variablen wdir .
vil returnere en liste over filnavne i den aktuelle mappe, der matcher mønsteret Pattern .
Procedurer er defineret som følger
proc ProcedureName { Argument List } { … … }Følgende kodestykke vil oprette og initialisere et associativt array (også kaldet et kort, ordbog eller hash på andre sprog).
hovedstad ( Frankrig ) Paris satte hovedstad ( Italien ) Rom satte hovedstad ( Tyskland ) Berlin satte hovedstad ( Polen ) Warszawa satte hovedstad ( Rusland ) Moskva satte hovedstad ( Spanien ) Madrid _For at forespørge og vise en af værdierne for et associativt array skal du bruge
sætter $kapital ( Italien )En liste over alle lande (arraynøgler) kan fås med kommandoen
array navne hovedstadResultatet vil ikke blive sorteret, fordi Tcl-arrays er baseret på hash-tabeller .
Polen Spanien Rusland Tyskland Italien FrankrigSortering kan udføres med kommandoen
lsort [ matrixnavne kapital ]For at henvise til en matrix (giv den som reference), skal du bruge navnet på den indeholdende variabel:
proc demo arrName { upvar 1 $arrName arr ; # bind referencen til et lokalt navn #gør noget med arr }For at få adgang til et array efter værdi, brug array get eller array set . For eksempel, for at kopiere et array til et andet:
array sæt Newarr [array hent Oldarr ]Tcl 8.5 introducerede arrays videregivet af værdi-ordbøger ( dict ).
For at konvertere en skalarvariabel til en matrix og omvendt skal du fjerne den eksisterende variabel med kommandoen unset .
Som standard er det kun de variable , der er defineret i proceduren, der er synlige i proceduren. Uden for definitionen af en procedure er dens variabler ikke tilgængelige undtagen gennem parameteroverførselsmekanismen. Det er muligt at have variabler i en procedure med samme navn som i hovedprogrammet, mens værdierne af disse variabler vil være forskellige, faktisk vil de være forskellige variabler. For at ændre denne adfærd bruges de globale eller upvar- kommandoer .
Hej, verdensprogrammet ser sådan ud
sætter "Hej verden!"eller sådan
sætter { Hej verden ! _ }Viser værdien af array-elementet OldArray(præcision), hvis navn (array) er givet af den nye variabel NewArray
sæt NewArray OldArray sætter [sæt $ { NewArray }( præcision )] Tilføjelse af tal i et arrayMetode (A) - Tilføjelse ved hjælp af 'foreach' loop
sæt tal { 1 2 3 4 5 6 7 8 9 10 } sæt resultat 0 for hvert nummer $numbers { sæt resultat [udtr { $result + $number }] } sætter $resultMetode (B) - En meget mere elegant måde ved at bruge 'join'-kommandoen
sæt tal { 1 2 3 4 5 6 7 8 9 10 } puts [udtr . [ join $numbers + ]] Visning af indholdet af et arraytcl_platform - arrayet indeholder information om egenskaberne for den platform, som Tcl kører på. En liste over ejendomsnavne kan fås med
matrixnavne tcl_platform _Følgende uddrag udlæser dem sammen med deres værdier:
foreach i [array navne tcl_platform ] { sætter "$i = $tcl_platform($i)" }Hvis ejendomme skal sorteres
foreach i [ lsort [ matrixnavne tcl_platform ] ] { sætter "$i = $tcl_platform($i)" }Kommando-nesting demonstreres her. De kan indlejres til enhver dybde. Et lignende resultat kan opnås med parray-kommandoen [17] introduceret i Tcl 8.5.
Filterproceduren returnerer de elementer på listen , for hvilke scriptet evalueres til TRUE:
proc filter { liste script } { sæt res {} foreach e $list {if {[uplevel 1 $script $e ]} { lappend res $e }} return $res }Kommandoen uplevel 1 evaluerer et udtryk i den kontekst, hvori ordfilteret kaldes .
Den i proceduren er en forkortelse for at inkludere sæt:
proc i { liste e } { udtr {[ lsearch - nøjagtig $list $e ] >= 0 } }Undersøgelse:
% filter { a b c } { i { b c d }} b cDette viser, at kommandonavnet kan være en hvilken som helst streng, såvel som operatoren ?: kendt fra andre sprog .
Tcl er et fortolket sprog, det vil sige , Tcl- programmer er klar til at køre uden kompilering og linkning .
Tcl-tolken er blevet overført til de fleste almindelige platforme [18] . Det distribueres under en gratis , ikke-copyleft- licens , som gør det muligt at bruge det uden begrænsninger i udviklingen af proprietære applikationer , samt til at skabe proprietære afledte systemer. Udviklere omtaler det som BSD-lignende , selvom Tcl-licensen sammenlignet med BSD-licensen pålægger færre begrænsninger.
I øjeblikket udføres arbejdet med kernen af Tcl-sproget af en gruppe udviklere [19] kaldet Tcl Core Team [20] . De seneste versioner af Tcl-oversætteren og kernebibliotekerne er tilgængelige i SourceForge.net - depotet , se listen over sourceforge-projekter inkluderet i Tcl/Tk-hoveddistributionen [21] .
Tcl-oversætteren kompilerer programmet til en mellemrepræsentation - bytecode , og fortolker den derefter. I modsætning til for eksempel Python , gemmes denne mellemrepræsentation ikke på disken, programmet kan kun gemmes i kildekode, eventuelt pakket i et StarKit- modul eller ved hjælp af en anden wrapper . Afhængigt af kompileringsmulighederne understøtter Tcl-fortolkeren måske eller ikke multithreading .
Mens de fleste begynder-Tcl-lærebøger siger noget i retning af "Tcl har kun én type variabel, strengen", er virkeligheden, at Tcl-oversættere har gjort tingene anderledes i lang tid. Internt bruger Tcl et dynamisk typesystem med automatisk transparent strengkonvertering.
Tcl er inkluderet i næsten alle Linux- distributioner . Microsoft Windows kræver en separat installationspakke.
Version Tcl 8.4 adskiller sig fra den forrige med nye funktioner (optimering af 64-bit kode, VFS, tilføjelser med hensyn til introspektion ) og en vis ydelsesforøgelse på grund af optimering af arbejdet med bytekode.
De nye funktioner tilføjet i version 8.1 (såsom multithreading-understøttelse, internationaliseringsfaciliteter og håndtering af Unicode-tegn) sænkede Tcl med omkring 19 % sammenlignet med version 8, hvilket gav et spring i hastighed. Udviklerne af 8.4 har gjort alt for at maksimere hastigheden af programafviklingen for at sikre, at de ikke kun arbejder langsommere, men endda hurtigere, end det var, da version 8.0 dukkede op. Dette mål blev nået for næsten alle Tcl- og Tk-værktøjer - version 8.4 er i gennemsnit 8 gange hurtigere end version 7.6 [15] .
Den aktuelle version af TCL er 8.6.
Alternative implementeringer og dialekterDer er alternative Tcl-implementeringer til populære virtuelle maskiner til generelle formål . Dette er en Java -fortolker - Jacl [22] (seneste version fra 2008) og Eagle-projektet [23] , som implementerer de fleste Tcl 8.4-kommandoer til CLR (byggeprogrammer til .NET 4.0 og 2.0 er tilgængelige). Eksperimenter er i gang med at oversætte Tcl-programmer til koden for den virtuelle Parrot -maskine , som er ved at blive udviklet til den sjette version af Perl [24] .
Til programmering af indlejrede systemer og indlejring i applikationer er der udviklet en speciel dialekt af Tcl - Jim [25] [26] . Dette er en fortolker, der implementerer en stor delmængde af Tcl, udvidet med yderligere objektorienterede og funktionelle programmeringsmekanismer, og optager mindre end 100 kilobyte i kompileret form.
En anden dialekt af Tcl er det mobile scriptsprog Hecl [27] , udviklet af David Welton og implementeret i Java ( J2ME ) [28] [29] . Hvad angår Android -platformen , leveres Tcl-understøttelse på den (sammen med andre scriptsprog) af: SL4A scriptinglag [30] ; der er også en indbygget Tcl-implementering for dette OS kaldet AndroWish [31] .
Alle de distributioner, der er anført nedenfor, distribueres frit og er samlet af komponenter, der har en eller anden gratis licens . De fleste af dem er på tværs af platforme (undtagen WinTclTk og Tcl/Tk Aqua ), selvom Tcl/Tk normalt er en del af OS - distributionen på Unix-systemer .
Tcl er sammen med Perl og Python blevet et af de tre klassiske scriptsprog til generelle formål. Denne treenighed optræder ikke kun som en liste over gratis distributioner kompileret i ActiveState , men også for eksempel som sprog, hvor man (udover PL/pgSQL- dialekten ) kan skrive triggere og lagrede procedurer på den populære PostgreSQL -databaseserver .
Tcl som et integreret sprog har fundet anvendelse inden for CAD ( CAD | CAM | CAE ) [41] [42] . Den bruges for eksempel som en databasetuner i Unigraphics postprocessor . Derudover er det de facto automatiserings- og integrationssprog i alle førende chipdesignsoftwarepakker ( FPGA'er og ASIC'er ).
I webprogrammering bruges Tcl normalt sammen med AOLServer -webserveren eller en af de "lette" FastCGI -webservere som lighttpd . For at integrere Tcl med Apache er der Rivet-modulet [43] .
Især under kontrol af AOLServer er OpenACS [44] et indholdsstyringssystem til websteder med rig udvidelsesmuligheder i Tcl-sproget, udvidet XOtcl eller projektåbent [45] - et gruppearbejdssystem med en webgrænseflade .
Der er også projekter som TclHttpd [46] og dets efterfølger, Wub [47] , som er komplette web- frameworks . Baseret på den nye objektudvidelse af TclOO-sproget udvikles webrammeværket Woof (Web Oriented Object Framework) [48] . Et eksempel på et CMS til TclHttpd er Ucome [49] .
Ud over at blive brugt som et webapplikationsimplementeringssprog, kan Tcl bruges som et scriptsprog til at udvide eksisterende applikationer. For eksempel er moduler til Eggdrop IRC-bot skrevet på den [50] [51] .
Ulempen ved tidlige versioner af Tcl/Tk var uden tvivl langsom ydeevne. Versioner under 8 brugte en direkte fortolkning af kildekoden, men brug af bytekode løste dette problem. Nu, hvad angår hastighed, er Tcl ikke meget anderledes end PHP , selvom det er mærkbart ringere end sådanne scriptsprog som for eksempel Python eller Lua . Komplekse eller tidskritiske sektioner af kode anbefales at blive udført som eksterne moduler i C / C++ .
Tcl/Tk har en ukendt syntaks for programmører på "traditionelle" sprog. Det er tættere på standard Unix shell syntaks . Denne syntaks kan modificeres vilkårligt (som i andre "programmerbare programmeringssprog" såsom Forth [note 2] eller Common Lisp ). Dette kan være en fordel for en individuel programmør eller en lille gruppe af programmører, men gør Tcl/Tk næppe velegnet til brug som et generelt sprog til industriel udvikling. Selvom tilstedeværelsen af standardiserede udvidelser reducerer alvoren af dette problem. Tcl kan også bruges i store projekter inden for dens "økologiske niche" (indlejrede scripts, "liming"-komponenter, WEB-programmering).
Selvom Tcl har alle egenskaberne for et funktionelt sprog , udførte dets tolk før version 8.6 ikke hale-rekursionsoptimering , hvilket gjorde det vanskeligt at bruge en rent funktionel stil og reducerede dens effektivitet. Sprogets fleksibilitet gør det dog muligt at omgå dette problem ved at implementere et skin af en sådan optimering på et højt niveau [52] . Endelig giver tailcall- kommandoen, som dukkede op i testversion 8.6, dig mulighed for at bruge halerekursion uden problemer.
Den tætteste integration af Tcl med Tk -grafikbiblioteket , som ofte bruges i kombination med andre programmeringssprog, er en utvivlsom fordel ved Tcl. For at oprette GUI- indpakninger til konsolprogrammer eller pakker med konsolprogrammer kan Tcl være det bedste valg.
Selvom det ikke er et udbredt programmeringssprog, har Tcl sammen med (tidligere) sprog som Lisp og Smalltalk haft en bemærkelsesværdig indflydelse på programmering. Det blev det første sprog, der fokuserede på nem indlejring i applikationer [53] .
Brugervenligheden af Tk grafiske widget -bibliotek var uden sidestykke og blev populær i andre generelle scriptsprog udover Tcl . Tkinter forbliver standardværktøjet til at oprette GUI- applikationer i Python . Der er også Tk-bindingsbiblioteker for Perl [ 54] (Tkx) og Ruby [53] .
SQLite , et letvægts SQL -databasestyringssystem, der kan integreres, blev oprindeligt udviklet som en udvidelse til Tcl [53] .
Programmeringssprog | |
---|---|
|