Squeak Smalltalkで使用されている上位50位のセレクター(メソッド名)を抽出してみる

Smalltalk で「セレクタ−」というのは、0個以上の引数と組み合わせて「メッセージ」を構成する要素で、端的には通常の言語におけるメソッド名のようなものです。たとえば、arr at: 1 put: #something という Smalltalk の式があったとき、arr がレシーバー、at: 1 put: #something がメッセージ、1 と #something が引数で at:put: がセレクターです(セレクターの実体はシンボルなので #at:put: と書くこともあります)。at: 1 put: #something というメッセージを arr に送ることで、通常であれば #at:put: という名前の(Smalltalk ではコロンもメソッド名に含まれます)メソッドがコールされます。よくある文法で書くと arr.at:put:(1, #something) と同じことで、そんなに難しいことはありません。



ということで、このツイートでは「メッセージ」と表現されている「セレクター」、すなわちメソッド名のうち、Squeak Smalltalk のシステム(処理系)内でよく使われている上位50位をカウントして抽出してみました。

| selectors counts |
selectors := Set new.
SystemNavigation default allBehaviorsDo: [:class | selectors addAll: class selectors].
counts := OrderedCollection new.
selectors do: [:sel | counts add: (SystemNavigation default allCallsOn: sel) size -> sel].
^(counts sort: #>) first: 50


短いコードですが、それなりに時間のかかる処理なので実際にお試しの際には注意してください。また、この手のリフレクション操作は処理系依存的なコードになるのが常なので、他の Smalltalk 処理系で同じことを試すには、似たような方針でその処理系が提供している API やユーティリティクラスを使ったコードに書き直す必要がある点にもご留意ください。


結果を以下に示します。

6999->#==
5509->#=
4774->#new
4270->#+
3058->#size
3014->#-
2536->#at:
2357->#do:
2298->#,
2051->#assert:
2019->#@
1762->#<=
1743->#class
1723->#>
1504->#first
1458->#at:put:
1354->#*
1232->#<
1148->#name
1074->#add:
1059->#nextPutAll:
1003->#new:
969->#isEmpty
941->#translated
938->#default
937->#error:
933->#asString
927->#includes:
907->#nextPut:
882->#not
861->#on:
840->#collect:
799->#ifTrue:
792->#extent:
782->#value:
737->#cr
735->#//
732->#printString
711->#notNil
682->#isNil
668->#contents
663->#value
651->#last
640->#/
630->#at:ifAbsent:
615->#extent
594->#color:
581->#isKindOf:
567->#>=
562->#current


調べるまでもなく、なじみのメソッド名ばかりですね。^^;


なお、前述コードは記述を簡単にするためにソース中でメソッドがコールされる回数そのものではなく、そのメソッドをコールしているメソッドの数をカウントしているので、メソッド内で複数回使われることの多いセレクターの順位は前後するかもしれません。またカウントに使ったイメージは 4.3-ja にさらに手を入れた普段使っているイメージなので公式イメージや、他のバージョンでは結果が異なることがあります。あしからず。