70年代生まれの言語 Smalltalk は時代遅れか？

# 概要
ソフトウェア開発の世界はドッグイヤーと呼ばれるように、次々と新しい技術が生まれています。プログラミング言語も例外ではありません。プログラミング言語の黎明期だけでなく、21世紀に入ってからも、[Rust](https://www.rust-lang.org/)や[Go](https://go.dev/)のように比較的新しい言語が生まれ、言語仕様や処理系が拡張・更新されています。では、古い言語はすぐに陳腐化して捨てられてしまうのでしょうか？オブジェクト指向言語Smalltalkを例に、古い言語は時代遅れなのかどうか、見てみましょう。

# Smalltalk略史

SmalltalkはXerox PARCで生まれた、最初期のオブジェクト指向言語です。最初の処理系は1972年に生まれたことからSmalltalk-72と呼ばれています。その後、Smalltalk-74、-76、-78を経て、Smalltalk-80が生まれました。一般にSmalltalkと言うと、このSmalltalk-80を指します。
Xerox PARCからスピンアウトしたParcPlace Systems社から商用の処理系が販売された他、Digitalk社などからもSmalltalkの処理系が販売されました。SRAも、ParcPlace Systems社とDigitalk社が合併してできたParcPlace Digitalk社のVARとしてSmalltalk/VおよびVisualSmalltalkと呼ばれた処理系を販売したことがあります。現在は、SqueakやPharoなどオープンソースソフトウェアとして開発されている処理系もあります。
1980年代にオブジェクト指向がブームとして広がりました。その火付け役が米Byte誌の[Smalltalk特集](https://archive.org/details/byte-magazine-1981-08)でした。そしてJavaが生まれ、オブジェクト指向が一気にソフトウェア開発の現場に広がっていきました。

# これまでにSmalltalkから生まれたもの、普及したもの

ソフトウェア開発の現場で使われている技術にも、Smalltalk由来のものが多くあります。主なものを見ていきましょう。

### 開発プロセス編

Smalltalkから生まれた開発プロセスは、現在のソフトウェア開発でも十分に現役であることがわかります。

#### アジャイル開発

1999年に発売された[eXtreme Programming explained](https://www.amazon.co.jp/dp/B00N1ZN6C0/)([日本語版](https://www.amazon.co.jp/dp/B012UWOLOQ))を皮切りに、ソフトウェア開発の現場にアジャイル開発の波がやってきました。XPは前述explainedの著者であるKent Beck氏がSmalltalkで行った開発プロジェクトでの経験を基に考えられたものです。Scrumなど具体的な手法にはSmalltalkとは別の源流があるものが多くありますが、ソフトウェア開発でアジャイルが注目されるようになったきっかけとしてXPの果たした役割は非常に大きいです。

#### ライブプログラミング

動作中のプログラムを編集した瞬間に、そのプログラムの動作に即座に反映され、実行が継続されていくようなプログラミング環境をライブプログラミング環境といいます。多くのプログラミング環境では、動作中のプログラムのソースコードを編集しても、動作中のプログラムの動作には反映されません。再ビルドして、プログラムを起動し直す必要があります。Smalltalkはライブプログラミング環境であり、その様子は[漫画「スティーブズ」4巻](https://www.amazon.co.jp/gp/product/B079TMPXRC)の176ページ「チチンプイプイの〜プイ！」に描かれています。

#### クラス階層による差分プログラミング

プログラムを開発する時に、既存のクラスをベースにして、そこから拡張する部分のみを記述することで、新しいクラスを定義することができます。今ではオブジェクト指向による開発でも継承の利用は注意が必要だということがよく知られていますが、それも、Smalltalkで生まれた差分プログラミングが広く実践されるようになった結果と言えます。また、継承の弊害を低減するための仕組みとして[Traits](https://scg.unibe.ch/research/traits)がScala等の言語で採用されていますが、TraitsもSmalltalkでの実装により他言語に広がっていきました。

### 開発ツール編

現代的な開発環境で使われるツール/フレームワークにも、Smalltalk由来のものがあります。

#### xUnit

xUnitは、Kent Beck氏のXPにより広がり、特にその普及にはBeck氏らが開発したJUnitが大きな役割を果たしました。JUnitのベースになったのが、Smalltalk上で開発された[TestingFramework](https://live.exept.de/doc/online/english/tools/misc/testfram.htm)です。

#### リファクタリング

現在の開発環境にはリネームやメソッド分割やメソッド抽出などの簡単なリファクタリングを自動化していたり、xUnitによるTDDを前提にしたリファクタリング支援提供しているものがあります。リファクタリングを広めたのは、SmalltalkプログラマであるMartin Fowler氏の[Refactoring](https://martinfowler.com/books/refactoring.html)によるところが大きいですが、XP Explainedに先立つ1997年にはRalph Johnson教授の研究グループがSmalltalk向けのリファクタリングブラウザを開発し公開しています。

# 現在、Smalltalkから生まれつつあるもの

今現在、Smalltalk関連の研究の中で近い将来に他言語での開発現場に提供されるであろうものを紹介します。

#### Slot - オブジェクトとしての変数

Smalltalkは純粋オブジェクト指向言語で、整数や文字列をはじめ多くのものがオブジェクトとして提供されています。Javaでいうintのようなプリミティブ型はありません。しかし、オブジェクトに変数を代入することはあっても、変数自体はオブジェクトではありませんでした。最近までは。
Smalltalk処理系の1つであるPharoには、Slotと呼ばれる、プログラム可能な変数を定義する機能が実装されています。これは一種のコンパイラのユーザ定義プラグインのようなもので、ソースコード上に記述された変数への代入や変数への参照に対してコンパイラがどのようなバイトコードを出力すべきかを、ソースコード上で定義することができるものです。

#### Moldable tools - 各オブジェクトに埋め込まれた開発環境

JavaScriptでプログラムを書いていて、あるオブジェクトをconsole上に表示しようとしたら object としか表示されなくて悲しい思いをしたことがありませんか？私はあります。あるいはJavaScriptに限らず、デバッガ上で変数の内容をウォッチしている時に、必要な情報が表示されなかったことがありませんか？通常、デバッガ上でオブジェクトがどのような表示がされるか、どのような操作が可能かは、デバッガの実装次第です。Moldable toolsは、デバッガの機能を表示対象のオブジェクトが提供するための仕組みです。Smalltalkの処理系の1つであるPharoに実装されています。

#### Pharo

上記のように、現在、多くの新世代のオブジェクト指向開発ツールがPharo上で研究され開発されています。多くの新しい研究成果が搭載されているPharoは既にSmalltalk-80とは別の言語になりつつあります。ある意味、Pharo自体が、Smalltalkから生まれつつある新しい言語とも言えます。

# まとめ
黎明期に生まれたプログラミング言語にも現役のものが少なくありません。[Fortran](https://fortran-lang.org/)は今でもまだ言語仕様が更新され、[Fortran 2023](https://wg5-fortran.org/f2023.html)がリリースされています。

また、新しい応用によって新たに脚光を浴びる言語もあります。例えば、1991年に登場した[Python](https://www.python.org/)は、メールフィルタなど、Unixシステム上で簡単なグルーコードを書くためのスクリプト言語として裏方仕事に使われていました。私がPythonを使っていた2000年頃には、Zopeによるウェブ上の動的なコンテンツ管理システムが主な利用で、日本のプログラマの多くはPythonの名前は知っていてもRubyを選択する人が多かったことを記憶しています。それが、機械学習の爆発的なブームによって、NumPy/SciPyなどの高速な演算ライブラリを備え、インタプリタとしての手軽さのあるPythonが一気に脚光を浴びるようになりました。

生まれたのが古くても、使われ続け、更新され続けている言語は最新言語なのだと思います。

# 余談

数年前、スイスのチューリッヒで現地のFortranプログラマと食事をした時に、「あなたはFortranプログラマですよね。プログラミング黎明期の言語です。わたしはSmalltalkプログラマです。Smalltalkもプログラミング黎明期の言語です。でもなぜか、今の時代でも手になじむのですよ。我々は古いプログラマなんですかね？」と自嘲気味に発言したところ、「今のFortranは昔のFORTRANとは違う。変わり続けてきた。Smalltalkもそうじゃないのか？」と返されました。全くその通りだと思います。