プログラム断片(2008/09/08)

for VisualWorks 7.6 with Jun770

字句解析

| sourceCodeString scanTokens |
sourceCodeString := '
            | aaa bbb ccc ddd |
            aaa := 10.
            bbb := 20.
            ccc := 30.
            ddd := aaa + (bbb * ccc).
            ^ddd
        '.
scanTokens := Scanner new scanTokens: sourceCodeString.
Transcript clear.
scanTokens
    do: [:scanToken | Transcript show: scanToken printString]
    separatedBy: [Transcript space].
^scanTokens
01
#| #aaa #bbb #ccc #ddd #| #aaa #':' 
#= 10 #'.' #bbb #':' #= 20 #'.' #ccc 
#':' #= 30 #'.' #ddd #':' #= #aaa #+ 
#(#bbb #* #ccc) #'.' #'^' #ddd

構文解析・意味解析

| sourceCodeString methodNodeHolder parseTree |
sourceCodeString := '
            | aaa bbb ccc ddd |
            aaa := 10.
            bbb := 20.
            ccc := 30.
            ddd := aaa + (bbb * ccc).
            ^ddd
        '.
methodNodeHolder := Compiler new
    parseNoPattern: sourceCodeString readStream
    in: Object
    notifying: nil.
parseTree := JunParseTree
    node: methodNodeHolder node
    class: Object
    code: sourceCodeString.
parseTree show.
^parseTree
02-1

02-2
graph(
    nodes(
        node01((parameter)),
        node02((variable) aaa),
        node03((parameter)),
        node04((variable) bbb),
        node05((parameter)),
        node06((variable) ccc),
        node07((parameter)),
        node08((variable) ddd),
        node09((assignment) :=),
        node10((variable) aaa),
        node11((literal) 10),
        node12((assignment) :=),
        node13((variable) bbb),
        node14((literal) 20),
        node15((assignment) :=),
        node16((variable) ccc),
        node17((literal) 30),
        node18((message) *),
        node19((variable) bbb),
        node20((variable) ccc),
        node21((message) +),
        node22((variable) aaa),
        node23((assignment) :=),
        node24((variable) ddd),
        node25((return) ^),
        node26((variable) ddd),
        node27((sequence) temporaries: 4 statements: 5),
        node28((block) arguments: 0),
        node29((method) DoIt)),
    arcs(
        arc(node01=>node02),
        arc(node03=>node04),
        arc(node05=>node06),
        arc(node07=>node08),
        arc(node09=>node10),
        arc(node09=>node11),
        arc(node12=>node13),
        arc(node12=>node14),
        arc(node15=>node16),
        arc(node15=>node17),
        arc(node18=>node19),
        arc(node18=>node20),
        arc(node21=>node22),
        arc(node21=>node18),
        arc(node23=>node24),
        arc(node23=>node21),
        arc(node25=>node26),
        arc(node27=>node01),
        arc(node27=>node03),
        arc(node27=>node05),
        arc(node27=>node07),
        arc(node27=>node09),
        arc(node27=>node12),
        arc(node27=>node15),
        arc(node27=>node23),
        arc(node27=>node25),
        arc(node28=>node27),
        arc(node29=>node28)))

コード生成

| sourceCodeString methodNodeHolder compiledMethod byteCodes |
sourceCodeString := '
            | aaa bbb ccc ddd |
            aaa := 10.
            bbb := 20.
            ccc := 30.
            ddd := aaa + (bbb * ccc).
            ^ddd
        '.
methodNodeHolder := Compiler new
    parseNoPattern: sourceCodeString readStream
    in: Object
    notifying: nil.
compiledMethod := methodNodeHolder generate.
byteCodes := compiledMethod bytes.
Transcript clear.
byteCodes
    do: [:byteCode |
        | aString |
        aString := byteCode printStringRadix: 16.
        [aString size < 2] whileTrue: [aString := '0' , aString].
        Transcript show: aString]
    separatedBy: [Transcript space].
^byteCodes
03-1
D8 0A 4C D8 14 4D D8 1E 4E 10 11 12 A8 A0 4F 13 65
| sourceCodeString methodNodeHolder compiledMethod symbolicCodes |
sourceCodeString := '
            | aaa bbb ccc ddd |
            aaa := 10.
            bbb := 20.
            ccc := 30.
            ddd := aaa + (bbb * ccc).
            ^ddd
        '.
methodNodeHolder := Compiler new
    parseNoPattern: sourceCodeString readStream
    in: Object
    notifying: nil.
compiledMethod := methodNodeHolder generate.
symbolicCodes := compiledMethod symbolic.
Transcript clear.
Transcript show: symbolicCodes.
^symbolicCodes
03-2
long CompiledMethod numArgs=0 numTemps=4 frameSize=7

literals: ()

1 <D8 0A> push 10
3 <4C> store local 0; pop
4 <D8 14> push 20
6 <4D> store local 1; pop
7 <D8 1E> push 30
9 <4E> store local 2; pop
10 <10> push local 0
11 <11> push local 1
12 <12> push local 2
13 <A8> send *
14 <A0> send +
15 <4F> store local 3; pop
16 <13> push local 3
17 <65> return

最適化

| sourceCodeString methodNodeHolder compiledMethod symbolicCodes |
sourceCodeString := '
            ^10 + (20 * 30)
        '.
methodNodeHolder := Compiler new
    parseNoPattern: sourceCodeString readStream
    in: Object
    notifying: nil.
compiledMethod := methodNodeHolder generate.
symbolicCodes := compiledMethod symbolic.
Transcript clear.
Transcript show: symbolicCodes.
^symbolicCodes
04
normal CompiledMethod numArgs=0 numTemps=0 frameSize=12

literals: ()

1 <D8 0A> push 10
3 <D8 14> push 20
5 <D8 1E> push 30
7 <DF 08> no-check send *
9 <DF 00> no-check send +
11 <65> return

for VisualWorks 7.6 with Jun770


Updated: 2017/09/22 (Created: 2008/09/08) KSU AokiHanko