Smalltalk勉強会＠京都
2009年2月4日 キャンパスプラザ京都

では、では、さっそく…
6F第2講習室

コンパイラ・インタプリタ・仮想マシンを有する
プログラミング言語処理系「Smalltalk」

言語処理系としてのSmalltalk
字句解析（メッセージパッシングを支える処理系の初歩）
原始プログラム（ソースコード）青木 淳

京都産業大学コンピュータ理工学部
研究室： 1号館 4階 1402研究室
客員研究員： 浅岡 浩子 ・ 澤本 依里



最適化
コード生成

意味解析

構文木
名前表

単語列


 


atsushi@cc.kyoto-su.ac.jp
http://www.cc.kyoto-su.ac.jp/~atsushi/

構文解析

言語処理系の構成

目的プログラム（バイトコード）解析木               

参考ページ：言語処理系の構成をプログラムで示しておきました。

12

原始プログラム（ソースコード）

字句解析

字句解析     

構文解析

最適化
コード生成

意味解析★

      

原始プログラム（ソースコード）

構文木
名前表単語列       

目的プログラム（バイトコード）

解析木           


★

3

4

単語列（トークン並び）

構文解析・意味解析


字句解析

ソースプログラム（原始プログラム）をスキャン（走査）して、ソースプログラムを構成している単語（字句）を順番に列挙したもの。

     

構文解析★
原始プログラム（ソースコード）           


単語列           

最適化
コード生成

意味解析

★
構文木
名前表

解析木

目的プログラム（バイトコード）★

しばしば、ソースプログラムを構成している単語（字句）をトークン（token）と呼びます。

56構文木・名前表・解析木

最適化・コード生成

構文木



     

解析木
字句解析

構文解析

最適化
コード生成

意味解析

★
原始プログラム（ソースコード）

構文木
名前表

単語列

解析木

目的プログラム（バイトコード）      !   !   !  !
!
!
 

   !   !

★
名前表 
    

しばしば、名前表はシンボルテーブル（symbol table）と呼ばれます。要は
名前から番地がひけるテーブルです。
7

目的プログラム（バイトコード）

8

スタック（stack）とキュー（queue）

         
 &*( ()%'"%"&%&  &*( ()%'"%"&%& &*( ()%'"%"&%&&*("%"&*("%"&*("%" ($ ($  ()%'"%"&%& &*("%"  ')*'$

push: anObject

機械語＝マシン（コンピュータ）が理解できる言語に変換されていますね？

enqueue: anObject

pop

スタック操作（stack operation）の列に変換されていることがわかりますか？
仮想マシンはバイトコード（00～FF）という機械語を高速に実行する「ソフトウェアで作られたハードウェア」です。
バイトコードには、【スタック操作命令】【メッセージ送信命令】【分岐命令】【リターン命令】があります。

dequeue))&*('( &$),+ )(#"")"!"*%%!"*%%!&)' )#"+*$(& **  &'#%!#!$#$**  $(& **  &'#%!#!$#$** $(&  ** &'#%!#!$#$**$(& !#!**$(& !#!**$(& !#!** &"** &"**  &'#%!#! $#$**  $(& !#!
**  %'(%"

＜Ｄ８０Ａ＞

910**))+*
**
** ******))+*
**
** ****

!#!
!#!!#!!#!

**$(& +*  &'#%!#!$#$**  $(& **  &'#%!#!$#$** $(&  ** &'#%!#!$#$**$(& !#!**$(& !#!**$(& !#!** &"** &"**  &'#%!#! $#$**  $(& !#!
**  %'(%"

＜４Ｃ＞
local 0local 110!#!
!#!!#!!#!

local 2

push: 10

local 310

pop10

101112**$(& **  &'#%!#!$#$+*  $(& **  &'#%!#!$#$** $(&  ** &'#%!#!$#$**$(& !#!**$(& !#!**$(& !#!** &"** &"**  &'#%!#! $#$**  $(& !#!
**  %'(%"

＜Ｄ８**))**
+*
** ****

１４＞!#!
!#!!#!!#!

**$(& **  &'#%!#!$#$**  $(& +*  &'#%!#!$#$** $(&  ** &'#%!#!$#$**$(& !#!**$(& !#!**$(& !#!** &"** &"**  &'#%!#! $#$**  $(& !#!
**  %'(%"**))**
+*
** ****

＜４Ｄ＞
local 010

local 120!#!
!#!!#!!#!

local 2

push: 20

local 3
20

pop

20

20

13

**$(& **  &'#%!#!$#$**  $(& **  &'#%!#!$#$+* $(&  ** &'#%!#!$#$**$(& !#!**$(& !#!**$(& !#!** &"** &"**  &'#%!#! $#$**  $(& !#!
**  %'(%"

＜Ｄ８**))**
**
+* ****

１Ｅ＞

!#!
!#!!#!!#!

14**$(& **  &'#%!#!$#$**  $(& **  &'#%!#!$#$** $(&  +* &'#%!#!$#$**$(& !#!**$(& !#!**$(& !#!** &"** &"**  &'#%!#! $#$**  $(& !#!
**  %'(%"**))**
**
+* ****

＜４Ｅ＞

push: 30

local 010

local 120

local 230!#!
!#!!#!!#!

local 3
30

pop

30

30

**$(& **  &'#%!#!$#$**  $(& **  &'#%!#!$#$** $(&  ** &'#%!#!$#$+*$(& !#!**$(& !#!**$(& !#!** &"** &"**  &'#%!#! $#$**  $(& !#!
**  %'(%"

＜１０＞● local 010

local 120

local 2301516**))**
**
** +*****))**
**
** +***

!#!
!#!!#!!#!

**$(& **  &'#%!#!$#$**  $(& **  &'#%!#!$#$** $(&  ** &'#%!#!$#$**$(& !#!+*$(& !#!**$(& !#!** &"** &"**  &'#%!#! $#$**  $(& !#!
**  %'(%"

＜１１＞
local 010

● local 1

20

local 230!#!
!#!!#!!#!

local 3

local 3
push: ●

push: ●

20
10

10

17

1018

**$(& **  &'#%!#!$#$**  $(& **  &'#%!#!$#$** $(&  ** &'#%!#!$#$**$(& !#!**$(& !#!+*$(& !#!** &"** &"**  &'#%!#! $#$**  $(& !#!
**  %'(%"**))**
**
** +***

＜１２＞
local 010

local 120

● local 230!#!
!#!!#!!#!

local 3**$(& **  &'#%!#!$#$**  $(& **  &'#%!#!$#$** $(&  ** &'#%!#!$#$**$(& !#!**$(& !#!**$(& !#!+* &"** &"**  &'#%!#! $#$**  $(& !#!
**  %'(%"

!#!
!#!!#!!#!

*pop

push: ●**))**
**
** +***

＜Ａ８＞

pop

push: 600

30
30

20

20

20

10

10

10

600
10101019**$(& **  &'#%!#!$#$**  $(& **  &'#%!#!$#$** $(&  ** &'#%!#!$#$**$(& !#!**$(& !#!**$(& !#!** &"+* &"**  &'#%!#! $#$**  $(& !#!
**  %'(%"**))**
**
** +***

＜Ａ０＞!#!
!#!!#!!#!

pop
pop+

20

**$(& **  &'#%!#!$#$**  $(& **  &'#%!#!$#$** $(&  ** &'#%!#!$#$**$(& !#!**$(& !#!**$(& !#!** &"** &"+*  &'#%!#! $#$**  $(& !#!
**  %'(%"**))**
**
** +***

＜４Ｆ＞

push: 610

local 010

local 120

local 230

local 3610!#!
!#!!#!!#!

610

pop

600
10

610

610

**$(& **  &'#%!#!$#$**  $(& **  &'#%!#!$#$** $(&  ** &'#%!#!$#$**$(& !#!**$(& !#!**$(& !#!** &"** &"**  &'#%!#! $#$+*  $(& !#!
**  %'(%"

＜１３＞
local 010

local 120

local 230

● local 3

610

2122**))**
**
** +*****))**
**
** **+*

!#!
!#!!#!!#!

**$(& **  &'#%!#!$#$**  $(& **  &'#%!#!$#$** $(&  ** &'#%!#!$#$**$(& !#!**$(& !#!**$(& !#!** &"** &"**  &'#%!#! $#$**  $(& !#!
+*  %'(%"

＜６５＞!#!
!#!!#!!#!

push: ●

610

610

2324