SKILL (プログラミング言語)

SKILLパラダイム|  オブジェクト指向プログラミング, 関数型言語

|

登場時期|  1990
開発者|  ケイデンス・デザイン・システムズ
最新リリース|  ?/ ?
型付け|  動的型付け
主な処理系|  Cadence Allegro, Cadence APD, Cadence Concept HDL and Cadence Virtuoso. Major LISP implementation ? Cadence UniCAD.
方言|  SKILL, SKILL++
影響を受けた言語|  Scheme, Common Lisp
テンプレートを表示

SKILL（スキル） はLISP系のスクリプト言語であり、ケイデンス・デザイン・システムズ社製の多くのEDA製品 （Cadence Allegro、Cadence Virtuoso等）で使われる「PCell」を記述するための言語である。その始めは1990年のIEEEの論文[1]での提案にある。

## 歴史

[編集]

SKILL言語の始まりはカリフォルニア大学バークレー校のリチャード・フェイトマン教授の学生によってつくられた言語 Franz Lisp である。「SKILL」の名称は他の語の語の頭文字ではない。公式の商標は全ての文字を大文字で表記する「SKILL」であるため、ケイデンス・デザイン・システムズ社は、大文字表記が好ましいとしている[2]。Franz Lisp 言語などの多くのLISP系の言語はANSIが策定したLISP系の言語の標準言語である「Common Lisp」に取って代わられた。 現在「SKILL言語」として知られているものは、当初、「IL言語」として知られていた。SKILL言語はIL言語の関数ライブラリーであった。当時、その関数ライブラリーは「SCIL」[3]と呼ばれていたが、後に、発音が同じ普通の覚えやすい英単語「skill」に変更された。IL言語は純然たるインターフェース言語であった。一方、SKILLも当初は言語というよりも、APIを記述するために使われていたものであったが、名前としては、より洒落た「SKILL」の方が定着した。「IL」という名前はSKILL言語プログラムファイルの標準的な拡張子「.il」に名残を留めている。

## 文法

[編集]

SKILL言語のプログラムには意味が等価な2つの書法がある。LISP系の言語に伝統的なS式による

(car mylist)

のようなものと、

car(mylist)

のような、C言語に似たものである。2つの書法はプログラム中で混在可能だが、C言語類似の書法の場合は、C言語とは違い、関数名と開き括弧の間に空白文字を入れて、

car (mylist) ; 誤り

のように書くことはできない。

いくつかの算術演算子は中置記法で書くことができる。例えば、

(plus 1 2)

plus(1 2)

1+2

これらは、いずれも正しい書き方である。このようなC言語に似せた書法は、C言語や類似の書法を持つ他の手続き型言語の経験者がSKILLのコードを容易に理解できるよう導入された。C言語との違いとして、SKILL言語の全ての変数は動的スコープである。

SKILL言語の関数群には製品固有のものがいくつかある。例えば、製品「PCB Editor」では、「`axlDBGetDesign`関数」など、「axl」で始まる固有の関数群があり、製品「Design Entry」では、「`cnGetDwgInfo`関数」など、「cn」で始まる固有の関数群がある。

## サンプル

[編集]

基本的な「Hello world」プログラムは以下のように記述する。

(println "Hello, world!")

階乗を計算する関数は以下のようになる。

(define (factorial n)
(if (leqp n 1)

(times n (factorial (difference n 1)))

ここで、`define` のかわりに `procedure(factorial n)` としても正常に動作する。`define` と `procedure` に大きな違いはなく、`define` は `procedure` の一種である。`procedure` は最初の引数として関数名と引数を1つの引数と考えセットで取る。一方、`define` は最初の引数として関数名を取り、二つ目の引数で引数を取るようになっている[4]。

C言語類似の書法では、長いプログラムコードでは、S式書法での等価なコードとは見かけが全く異なるものになる。

define( factorial(n)
if( n<=1 then

else
n * factorial(n-1)

次の例は、特殊フォーム「`setq`」を使い変数へ代入する方法と、特殊フォーム「`let`」を使い変数スコープを区切る方法を示す。

(define (swap)
(let ((a 1) (b 2))
(setq c a)
(setq a b)
(setq b c)
(printf "a=%d, b=%d, c=%d\n" a b c)

変数 `a` と `b` は、特殊フォーム `let` で局所化されるが、変数 `c` は、そうなっていない。そのため、変数 `c` は、関数 `swap` の外からもアクセス可能。次のコードは関数 `swap` の実行結果として、変数 `a`、`b`、`c` の内容を出力したもの。

> (swap)
a=2, b=1, c=1

> a
*Error* toplevel: undefined variable - a
> b
*Error* toplevel: undefined variable - b
> c

注釈は、伝統的な他のLISP系言語と同じく、セミコロン「;」で区切って書く。C言語などの他の言語と同じように長い範囲でコメントアウトしたい時には/* ~ */ といったコメント文も有効である。

(car mylist) ; セミコロンから行末までは注釈。

また、C言語と同じ書き方もできる。

/* 注釈 */   car(mylist)   /* 別の注釈 */

## 脚注

[編集]

1. ^ Barnes, T. J.「SKILL: a CAD system extension language」, 第27回 ACM/IEEE Design Automation Conference, 1990. Proceedings; 266-271ページ
2. ^ “Re: SKILL stands for ...?”. 2008年9月19日閲覧。
3. ^ 英語「silicon compiler interface language」の頭文字。
4. ^ MIT記法

* G. Wood、H-F S. Law, 「SKILL - An Interactive Procedural Design Environment」, Proceedings of Custom Integrated Circuits Conference, 1986, 544?547ページ
* Quan Nguyen, 「CAD Scripting Languages」, RAMACAD社. ISBN 0977781224, ISBN 9780977781225. (Google Books のサンプル)

## ユーザーグループ

[編集]

* SKILL言語のユーザーグループは、現在、米国 Yahoo!社 のウェブサイト「Yahoo! Groups」の「skill_school」にある。
* ケーデンス・デザイン・システムズ社が主催する同社製品のユーザーグループのフォーラムもある。「Allegro PCB SKILL」（PCB SKILL）専用のフォーラムと、「IC SKILL」（Custom IC SKILL）専用のフォーラムがある。
* Concept SKILLのユーザーグループはない。（2009年1月現在）

## 外部リンク

[編集]

* ケーデンス・デザイン・システムズ社
* CopperCAD Design 社 \- Cadence Allegro用プログラムのカスタム開発とパッケージ販売の商用サイト。
* PCBSKILLウィキ
* SKILL備忘録 Wiki

* 表
* 話
* 編
* 歴

LISP系言語

言語（処理系）|

* AutoLISP
* Clojure
* Common Lisp
* Emacs Lisp
* Interlisp
* ISLISP（英語版）
* LFE（英語版）
* LISP
* LISPマシン
* Lush
* Maclisp
* Scheme
* GNU Guile
* MIT/GNU Scheme
* Gauche
* Chicken
* Kawa
* Racket
* SKILL
* Steel Bank Common Lisp

関連項目|

* S式
* SRFI
* ラムダ計算