{{위키데이터 속성 추적}}
{{다른 뜻|TCL}}
[[파일:Tcl.svg|섬네일|Tcl 로고]]
'''Tcl''' (원래 "Tool Command Language"에서 왔지만 관례적으로 "TCL"이 아니라 "Tcl"이라고 쓰며 "티클" 또는 "티씨엘"<ref>''Tcler's Wiki [http://wiki.tcl.tk/11902 Tcl vs. TCL] {{웨이백|url=http://wiki.tcl.tk/11902 |date=20080719105102 }}''</ref>로 발음한다.)은 [[스크립트 언어]]로써 존 오스터하우트가 만들었다. 처음에 같이 일하던 프로그래머들이 응용 프로그램에 포함시키기 위한 (조악한) 언어를 직접 만들며 좌절하는 모습을 보고 만들었다고 하지만, Tcl은 빠르게 인기를 얻었다. 비교적 배우기 쉽다고 알려져 있지만 충분히 강력하다. 보통 [[빠른 프로토타이핑]], 스크립트 프로그램, GUI 및 테스팅에 많이 사용된다. 임베디드 플랫폼에서도 광범위하게 사용되며 Tcl 언어 전체 또는 그 작은 일부분만 떼어낸 버전을 이용하기도 한다. 또한 [[공용 게이트웨이 인터페이스|CGI]]와 [[IRC 봇]]을 만드는 데에도 사용되고 있다.

Tcl과 [[Tk (소프트웨어)|Tk]] [[위젯 툴킷|GUI 툴킷]]을 묶어서 '''Tcl/Tk'''라고 자주 부른다.

== 특징 ==
Tcl은 아래와 같은 특징이 있다:

* 언어 구조를 포함해서 모든 것은 [[명령어 (컴퓨팅)|명령어]]이며, [[전위 표기법]]으로 표현한다.
* 명령어는 [[가변인자]]를 받을 수 있다.
* 모든 것을 동적으로 재정의하고 오버라이드할 수 있다.
* [[부호 (정보)|코드]]를 포함한 모든 [[자료형]]을 [[문자열]]로 다룰 수 있다.
* 극히 간단한 [[문법 (프로그래밍 언어)|문법]] 규칙.
* [[인터넷 소켓|소켓]]과 [[컴퓨터 파일|파일]]에 대해 [[이벤트 구동 방식]] 인터페이스를 가지고 있다. 시간 기반 이벤트 및 사용자 정의 이벤트가 모두 가능하다.
* 유연한 [[변수 영역]] 규칙을 지원해서, 정적 영역 규칙이 기본이지만 uplevel과 upvar는 proc이 둘러싸고있는 함수의 영역까지 작용할 수 있도록 허용한다.
* 모든 명령어가 실행 후 반환하는 예외 코드를 이용한 간단한 예외 처리
* Tcl에 정의된 모든 명령어는 잘못된 사용에 대해 의미있는 오류 메시지를 만들어낸다.
* [[C (프로그래밍 언어)|C]], [[C++]], [[자바 (프로그래밍 언어)|자바]] 및 Tcl을 통해 바로 확장할 수 있다.
* [[인터프리터]] 언어이지만 [[바이트코드]]를 이용하여 동적인 수정이 가능한 특성을 유지하면서 속도가 빨라짐.
* 1999년에 처음 출시한 완전한 [[유니코드]] (3.1) 지원.
* 플랫폼 독립적: [[Win32]], [[유닉스|UNIX]], [[리눅스]], [[매킨토시|애플 매킨토시]], 등.
* 윈도([[그래픽 사용자 인터페이스|GUI]]) 인터페이스 [[Tk (소프트웨어)|Tk]]와 밀접한 결합.
* 코드를 관리하기 쉽다. 많은 경우 Tcl 스크립트는 다른 언어로 동일한 기능을 작성했을 때보다 더 작고 읽기 쉬운 코드가 된다.
* 다양한 목적과 환경에서 사용된다: 텍스트 전용 스크립트 언어, 애플리케이션 프로그램을 위한 GUI 가능한 언어, (서버측 또는 [[Tclets]]과 같이 클라이언트측) 웹페이지와 ([[PostgreSQL]]과 같이 서버측) 데이터베이스를 위한 임베디드 언어 등.
* 개발용 버전(예, ActiveState Tcl), tclkit (일종의 실행용 버전, 1 메가바이트밖에 안됨), starpack (단일 실행파일), BSD 라이선스의 자유로이 배포가능한 소스 등 여러가지로 존재한다.

Tcl은 원래 함수형 언어로써 [[객체 지향 프로그래밍|객체 지향]] 문법을 지원하지는 않았다. 그러나 최근 버전은 XOTcl과 같이 객체 지향 기능을 제공하는 확장을 지원한다. incr Tcl, Snit, 및 STOOOP (simple tcl-only object-oriented programming)와 같은 다른 객체 지향 확장도 존재한다.

Tcl은 고차 함수와 함수 요약이 언어 자체에서 지원되므로 [[함수형 프로그래밍]]은 쉽게 가능하지만 그러한 목적으로 많이 쓰이지는 않는다. 아래 예는 쉽게 두 함수를 합성할 수 있음을 보여준다.
<syntaxhighlight lang="tcl">
proc o {f g x} {$f [$g $x]}
</syntaxhighlight>

== 예제 ==

아래 예제는 아무 Tcl 셸에 붙여넣어도 실행 가능한 간단한 코드이다.

=== 수 더하기 ===

방법 (ㄱ) - 'foreach' 반복문을 이용하여 덧셈

<syntaxhighlight lang="tcl">
set numbers {1 2 3 4 5 6 7 8 9 10}
set result 0
foreach number $numbers {
    set result [expr {$result + $number}]
}
puts $result
</syntaxhighlight>

방법 (ㄴ) - 'join' 명령을 이용하여 훨씬 더 우아한 방법으로 덧셈

<syntaxhighlight lang="tcl">
 set numbers {1 2 3 4 5 6 7 8 9 10}
 puts [expr [join $numbers +]]
</syntaxhighlight>

방법 (ㄷ) - 더하기 명령을 리스트 펼치기 문법과 함께 사용

<syntaxhighlight lang="tcl">
 namespace import tcl::mathop::+
 set numbers {1 2 3 4 5 6 7 8 9 10}
 puts [+ {*}$numbers]
</syntaxhighlight>

=== 메아리 서버 ===
이벤트 기반 소켓 처리를 보여주는 잘 동작하는 간단한 예제

<syntaxhighlight lang="tcl">
#!/usr/bin/env tclsh

# echo server that can handle multiple
# simultaneous connections.

proc newConnection { sock addr port } {

     # client connections will be handled in
     # line-buffered, non-blocking mode
     fconfigure $sock -blocking no -buffering line

     # call handleData when socket is readable
     fileevent $sock readable [ list handleData $sock ]
}

proc handleData { sock } {
     puts -nonewline $sock [ gets $sock ]
     if { [ eof $sock ] } {
        close $sock
     }
}

# handle all connections to port given
# as argument when server was invoked
# by calling newConnection
set port [ lindex $argv 0 ]
socket -server newConnection $port

# enter the event loop by waiting
# on a dummy variable that is otherwise
# unused.
vwait forever
</syntaxhighlight>

=== 전자 시계 ===
Tk와 timer 이벤트를 이용하는 또다른 예제([https://web.archive.org/web/20080906222256/http://wiki.tcl.tk/2563 A simple A/D clock]). 네 줄의 코드로 전자 시계를 만든다.

<syntaxhighlight lang="tcl">
package require Tk
proc every {ms body} {
    eval $body
    after $ms [list every $ms $body]
}
pack [label .clock -textvar time]
every 1000 {set ::time [clock format [clock seconds] -format %H:%M:%S]} ;# RS
</syntaxhighlight>

설명: 첫 번째 줄은 Tk 패키지를 불러들인다. (실제로는 4줄에 걸쳐있는) 두 번째 줄은 액션('body')를 매 'ms' 밀리초마다 반복해서 실행하는 명령어 "every"를 정의하고, 세 번째 줄은 변수 'time'에 연동되는 라벨을 만들고 스크린에 출력되도록 한다. 네 번째 줄은 매 초마다 변수 'time'이 형식이 갖춰진 지역 시간으로 갱신되도록 한다.

== 같이 보기 ==
* [[Expect]]
* [[프로그래밍 언어의 비교]]
* [[프로그래밍 언어 목록]]
== 각주 ==
<references/>

== 외부 링크 ==
{{위키공용분류}}
* {{dmoz|Computers/Programming/Languages/Tcl-Tk|Tcl-Tk}}
* [https://blog.naver.com/narawon/222056196990 (한글 교재) Tcl/Tk 기본 + alpha]

{{전거 통제}}

[[분류:스크립트 언어]]
[[분류:1988년 개발된 프로그래밍 언어]]
[[분류:C로 작성된 자유 소프트웨어]]
[[분류:크로스 플랫폼 자유 소프트웨어]]
[[분류:자유 컴파일러와 인터프리터]]
[[분류:다중 패러다임 프로그래밍 언어]]
[[분류:동적 타입 프로그래밍 언어]]
[[분류:텍스트 지향 프로그래밍 언어]]
[[분류:고급 프로그래밍 언어]]