ツールを素早く作り上げるのに適した強力なスクリプティング環境である。非常に強力なGUIスクリプティング環境である。現在、各種オペレーティングシステム(UNIX、Windows、Macintosh)上で動作する。言語は、コマンド行のみで構造化文法をフォローしてしまう非常にシンプルな文法を特徴とする。言語環境からも利用できる。カリフォルニア大学バークレー校のジョン・ケネス・オースターハウト博士[4]により最初に開発されたのは1988年の事である。当時アプリケーションプログラムに組み込まれる拡張用スクリプト言語には標準がなく、アプリケーション毎に独自の言語が実装されていた。そのためアプリケーション使用者はツール毎に異なるスクリプト言語の習得を余儀なくされた。アプリケーションにおける標準となる拡張スクリプト言語をデザインしようと考えた。アプリケーションへの組み込みが容易であることを重視してデザインされた。具体的には処理系をライブラリとして提供することでC言語で書かれたアプリケーションに容易に組み込めることや、言語構造が簡素であり、かつ高い拡張性を持つこと、インタプリター言語であることが挙げられる。作成できるツールキットである。バンドルされる形で公開された。触発されて開発されたと言う。言語と共に一躍人気に火がつく。スクリプティング環境として人気を博した。同社で開発が進められた。その流れの上、その対象領域をウェブに広げていく。この時期機能的にもっとも大きな進歩を果たした。Tk」として人気を拡大することは出来なかった。開発はサンの手を離れた。開発はオープンソースにその場を移し、精力的に開発が続けられている。比べ劣勢と言わざるを得ない。日本国内での利用者数は少ない。ツールキットの一つとなっており、広く利用されている。名前は「ツールキット」を意味する英語「toolkit」に由来する。言語の特徴は一言でいえば「全て文字列」である。首尾一貫したリスト構造の二つを組み合わせ、非常に小さいルールで広範囲の領域をカバーする点にある。コマンド行はひとつのリストであり、先頭の要素がコマンド、それ以降の要素がコマンドへの引数として扱われる。言語と同様の一貫性を持つと言えるが、リストの要素分離記号がブランクやタブであるため、これらの文字が無視される一般のプログラム言語に慣れた人には「とまどい」を与えるかもしれない。リスト構造[編集]リストは文字列である。リストを構成する要素はブランクかタブで区切られる。ブランクやタブを要素に含めたい場合には、その要素をブレス({、})で挟めば良い。以下の文字列は三つの要素から成るリストである。パーサーがソースコードからコマンド行としてリストを取り出すとき、ひとつのリストの終端は改行コードかセミコロン(;)で判断する。改行コードやセミコロンがブレスの内側にあれば、それをリストの終端記号とは見なさない。したがって、以下の3行の文字列は3つの要素から成るひとつのリストである。改行コードは3個あるが、最後の改行コードだけがリストの終端記号の役割を果たす。ブレスがリスト記述記号として採用されているので似ているだけである。コマンドを以下のように改行の位置を変えると、ifコマンドの引数エラーになる。パーサーは上記4行の文字列を2つのリストとして認識する。したがって先頭行のifコマンド行は引数がひとつだけしか与えられていないことになり、引数エラーが発生する。パーサーが検出した「文法エラー」ではないということである。制御文などの「文」はない。分岐や繰り返しなどの実行制御も単にコマンドによって実現されているだけである。細かなルールが無い」のであり、そこにはリスト構造と、以下に解説する「特殊記号」しかない。パーサーはリストの先頭要素を常にコマンド名として認識する。それ以外の要素はコマンドに渡すべき引数として認識する。その引数要素がブラケット([、])で挟まれていると、その中身をコマンド行と認識し、それを実行してから本来の引数値を求めてくれる。これが「コマンド置換」である。パーサーは変数機能の提供によりコマンド間でのデータの受け渡しも扱ってくれる。変数はsetコマンドにより生成される。$記号が先頭に付いた要素を変数名とみなし、その値に要素全体を置換する。これが「変数置換」である。$a変数置換はコマンド行の先頭要素に対しても機能する。コマンド名を変数で与えることも可能である。変数置換は1回しか実行されない。変数置換結果に文字「$」が含まれていても再置換が試みられることはない。変数置換で得られた文字列にブランクが含まれていても、2つの引数としてではなく、ブランクが含まれた1つの引数として渡される。引数の分離(リストの認識)は変数置換前に行われるからである。ダブルクォーテーション記号[編集]リスト構造で解説したように、ブレス({、})は、改行コードなどの特殊文字の機能を無効化する。この法則はコマンド置換子であるブラケットや、変数置換子である$記号に対しても貫かれる。そのため、下記のコードではコマンド置換も変数置換も行われない。円}そのため、実行結果として出力される文字列は以下のものになる。コマンドに渡すには、ブレスの代わりにダブルクォーテーション(")で挟めば良い。このように、ダブルクォーテーションの機能はブレス機能とほぼ同等であるが、コマンド置換と変数置換をTclパーサーに許すところが異なる。ダブルクォーテーションとブレスの機能は、それらがリスト要素の先頭と末尾に記述された場合にのみ有効である。下の例では「"」は文字として扱われる。石を投げたら"ゴツン"と音がしたセミコロン記号(マルチコマンド)[編集]複数のコマンドを1行に記述したい場合はコマンド行をセミコロン(;)で区切れば良い。$b]#記号(注釈行)[編集]コマンドの位置に「#」を記述すると行末までコメントと見なされる。「コマンドの位置に」ということが重要であり、以下の最後のコードは「#」がコマンドの位置にないので誤りである。初期値バックスラッシュ記号[編集]ひとつのコマンドを複数行で記述したい場合は、行の末尾にバックスラッシュを付ける。$arg4$文字の前に\を置くと$置換子の機能を抑制して単なる文字として扱わせることができる。"金額=\$100"コマンド置換子([、])、ブレス({、})の前に置いた場合も同様である。基本的にバックスラッシュにはC言語とほぼ同じ機能がある。改行コードは「\n」と書ける。パーサーから渡された引数がコマンド内部で評価されるか否かは重要である。ここでの評価とはコマンド置換や変数置換のことである。コマンドは引数を内部で評価する。従って以下の2つのコマンドは同じ結果を返す。パーサーが行ってくれずとも、exprコマンドが内部で変数置換しているので同じ結果が得られるのである。よって評価し、その結果を使う。パーサは第一引数の「$val」を評価して「true」(文字列)に書き換える。同様に第二引数「{~処理~}」を評価して、文字列リテラルなのでそのまま同じ値「{~処理~}」に書き換え、以下のようにする。true]」として渡し、その結果をもって処理を続ける。コマンドが含まれていない場合)。{$val}]」として渡し、その結果をもって処理を続ける。なって、その時点で繰り返し処理を終了する。switchコマンドの第1引数は内部では評価されない。したがって下記の2番目の記述は期待する結果が得られない。{...}もし引数をコマンド内部で評価してくれるならば、その引数はブレス({})で挟んで渡した方が効率が良い。Tclパーサーとコマンドの両方による多重評価処理を回避できるからである。このような理由により、ifコマンドやwhileコマンドやforコマンドの引数は常にブレスで挟むべきである。ループの条件式は必ずブレスで挟む必要がある。ブレスで挟まないと変数置換されてからループコマンドに渡されてしまうので、定数を並べた条件式になってしまい、無限ループをもたらす。パーサーにあらかじめ実装されているビルトインコマンドと、ユーザーにより作成された拡張コマンドがある。ユーザーによる拡張コマンドの実装は簡単である。C言語などで「コマンド本体関数」と「登録用関数」を記述し、ダイナミックリンクライブラリファイルに格納する。用いて拡張コマンドを登録する。コマンドの引数には、「ライブラリファイル名」と「登録用コマンド名」を与える。コマンドは、登録用コマンド名から「登録用関数」名を求め、これを実行してくれる。この「登録用関数」の中に本当の登録処理を記述しておく。コマンドに渡したコマンド名にライブラリ名の意味を持たせ、「登録用関数」の中で複数のコマンドを登録してしまうことも可能である。拡張コマンドの実体となる「コマンド本体関数」を、決められた型と引数に従って先に定義しておき、そのコマンド関数アドレスと公開コマンド名を引数に与えて実行すれば登録される。パーサーからの引数を、引数の数(argc)と引数文字列配列(argv)で受け取る。パーサーは、スクリプト文字列を受け取り、常に処理結果を文字列で返すように見える。これでは文字列の解析や文字コードとバイナリ値への変換が頻繁に行われていることになり、いかにも効率が悪く思える。そのような単純なものではなく、内部では可能な限りバイナリ値を維持している。スクリプトでバイナリ値も扱えるのはこのおかげである。型として振る舞うことができる。オブジェクトとして存在している。オブジェクト間のデータ移動で無駄な型変換が行われないように配慮されている、ということである。オブジェクトとして存在している。コマンドを用いるべきであることが分かる。巨大なリストを文字列として全体参照するのも効率を悪くするので慎重にすべきである。値のリストとして格納される。オブジェクトのままで受け取るコマンド関数を登録するためのものである。オブジェクトを通じて返すことができる。値をそのまま返す例である。オブジェクトは不要になったとき自動的に削除される仕組みがある。オブジェクトが持つ「参照カウンタ」による制御である。オブジェクトを作成し、それを存続したければ参照カウンタを増加させておき(Tcl_IncrRefCount)、必要なしとなったところで減ずる(Tcl_DecrRefCount)ようにする。なったときにのみ、そのオブジェクトは削除される。存続と廃棄の要求を自分だけの都合で出しておくだけで、削除のタイミングがコントロールされるという仕組みである(スマートポインタ)。オブジェクトとして存在している。2016年9月29日閲覧。2013年1月4日閲覧。比較TIOBEインデックス(英語版)この項目は、FLOSSに関連した書きかけの項目です。この項目を加筆・訂正などしてくださる協力者を求めています(Portal:FLOSS)。(日時は個人設定で未設定ならばUTC)。表示-継承ライセンスの下で利用可能です。追加の条件が適用される場合があります。詳細は利用規約を参照してください。開発者Cookieに関する声明モバイルビュ。