GNU Smalltalk

**GNU Smalltalk**(グヌー スモールトーク)はGNUプロジェクトにより開発されているSmalltalk環境。

## 概要
CUI環境で開発できるSmalltalk環境として開発されており、CUIに特化しており基本構成ではその他のSmalltalk環境で一般的な統合開発環境のGUIを備えておらず (Headless mode)、GUIからソースコードを入力して編集することはできない。起動コマンド実行時に指定したソースファイル、またはイメージを読み込んで起動するという他のプログラミング言語では一般的だが、Smalltalk環境では異色の方式をとっている。

## 特徴

### インタープリター実行と仮想機械によるイメージファイル実行
GNU Smalltalkはフロントエンドとして対話的に実行できるインタープリター（通訳機能）を備えており、代表的な起動コマンドである`gst`を引数なしで起動するとSmalltalkの式をインタープリター実行できるシェルが起動する。このシェルは補完機能も備えておりメッセージ式や変数名を途中まで入力すると補完することができる。`gst`の引数にソースコードを指定するとそのソースコードを実行する。このフロントエンド(`gst`)の動作からインタープリターとして実装したSmalltalkと誤解されることがあるが、プログラムを実行する本体はその他のSmalltalk環境と同じでイメージファイルに格納した中間言語を仮想機械が実行する仮想機械方式になっておりインタープリターではない。Smalltalk環境は一般的に実行中に入力されたソースコードを中間言語に翻訳してから実行するという機能が備わっているがインタープリター実行やソースファイルの実行はその機能を利用してフロントエンドだけで実現している。仮想機械そのものは実行にイメージファイルしか必要とせず、`gst-load`のようなイメージファイルだけを使う起動コマンドではソースファイルを指定せずに起動することができる。ソースコードを指定した起動ではソースコードを一旦中間言語に翻訳するためイメージファイルをだけを指定した起動より若干遅くなる。

### 独自構文
GNU Smalltalkは起動コマンドの引数に指定するソースファイルは、Smalltalk環境の交換用に一般的なファイル用構文であるChunk形式を使うことができるが、ファイル上での編集性を考慮した独自構文を備えている。例えば下記(1)のChunk形式は下記(2)となる。

(1) Chunk形式
```smalltalk
Object
	subclass:		        #Example
	instanceVariableNames:	'variable0'
	classVariableNames:	    ''
	poolDictionaries:	    ''
	category:		        'example'.

Example methodsFor: 'Instance Methods' 
!
selector0
	^ 0.
!
selector1: anArgument
	^ 1.
!!

Example class methodsFor: 'Class Methods' 
!
selector0
	^ 2.
!
selector1: anArgument
	^ 3.
!!

Transcript
    nextPutAll: 'example';
    nl.
```
(2) 独自構文
```smalltalk
#!/usr/bin/gst

Object subclass: Example
[
    | variable0 |
    
    <category: 'example'>
    
    selector0
    [
        <category: 'Instance Methods'>
        ^ 0
    ]
    
    selector1: anArgument
    [
        <category: 'Instance Methods'>
        ^ 1
    ]

    Example class >> selector0
    [
        <category: 'Class Methods'>
        ^ 2
    ]
    
    Example class >> selector1: anArgument
    [
        <category: 'Class Methods'>
        ^ 3
    ]
].

Transcript
    nextPutAll: 'example';
    nl.
```


### 準標準的な構文
標準ではないが他のSmalltalk環境にも存在する拡張構文として次のようなものが存在する。

#### 非定数要素配列
Smalltalkの標準的な配列は要素の指定として定数しか指定できないが、GNU Smalltalkでは非定数の要素用の配列構文を用意している。
```smalltalk
array := { 1. 1 + 1 }. ".で区切った2番目の要素は通常の定数配列では指定できない。"
```


#### 名前空間
長い名前を省略できる仕組みとして名前空間を備えている。名前空間の解決については、他のSmalltalkと互換性があるが定義については互換性がない。


```smalltalk
"名前空間登録"
Smalltalk addSubspace: #SystemExceptions.

"名前解決"
Smalltalk.SystemExceptions.InvalidValue signalOn: 0.  "Smalltalk.SystemExceptions.までが名前空間"

"現在の名前空間切り替え"
Namespace current: Smalltalk.SystemExceptions.
```
なお構文ではないがメッセージ式形式で名前解決することもできる。この場合は、変数に代入した名前空間をさらに参照することができる。
```smalltalk
| namespace |

"名前解決"
namespace := Smalltalk.
namespace SystemExceptions InvalidValue signalOn: 0.
```


### 標準ライブラリー
膨大なクラスを備える他のSmalltalk環境と比べ数は少ないが、基礎機能が保守的なVisualWorksなどと比較して基礎機能に近代的なものが多い。近代的なものとしては下記がある。

# 反復子専用クラス(Iterable)
# 継続(Continuation)
# 生成器(Generator)
# 複数例外の捕捉

このうち1と4について補足する。

#### 反復子専用クラス
従来のSmalltalk環境では列挙処理を集合体の抽象クラスであるCollectionが保有していた。列挙処理は必ずしも値を保持する集合体だけでなく入力用のストリームやDBMSに問い合わせた際の問い合わせ結果や生成器にも適用できる。このため他のクラスでも継承できるように集合体のCollectionから列挙処理を分離したものが反復子専用クラスとなっている。

#### 複数例外の捕捉
従来のSmalltalk環境では下記(1)の様に同時に1種類しか捕捉することができなかった。GNU Smalltalkでは下記(2)のように複数の例外捕捉を可能にしている。

(1)
```smalltalk
[
	Error signal: '異常発生'. 
]
	on: Error
	do:
	[ :exception |
		"エラーの例外だけを捕捉。#on:doはこれ以上増やせない。"
	].
```
(2)
```smalltalk
[
	Notification signal: '接続準備完了'. 
]
	on: Error, Notification
	do:
	[ :exception |
		"エラーと通知両方の例外を1度に補足"
	]
	on: Exception
	do:
	[
	    "その他の例外を捕捉。on:do:はBlockClosureで定義している数だけ並べることができる。"
	].
```


## 注釈

## 出典

## 関連項目
* Smalltalk
* GNUプロジェクト
* GemStone/S - GUIを持たないSmlltalk環境