From 840f691c5a472bf01f5e14ad85928482655175a8 Mon Sep 17 00:00:00 2001 From: Guille Polito Date: Thu, 22 Aug 2024 09:39:44 +0200 Subject: [PATCH] Moving method layout to object layout chapter --- .../figures/compile_method_shape-ascii.txt | 0 .../figures/compile_method_shape.pdf | Bin Chapters/2-ObjectStructure/objectStructure.md | 57 +++++++++++++++- .../3-MethodsAndBytecode/methodsbytecode.md | 62 +----------------- .../BasicsOnExecution/basicsOnExecution.md | 2 +- .../figures/width_0-ascii.txt | 9 --- .../BasicsOnExecution/figures/width_0.pdf | Bin 11445 -> 0 bytes pillar.conf | 2 +- pillar.config | 1 - 9 files changed, 59 insertions(+), 74 deletions(-) rename Chapters/{3-MethodsAndBytecode => 2-ObjectStructure}/figures/compile_method_shape-ascii.txt (100%) rename Chapters/{3-MethodsAndBytecode => 2-ObjectStructure}/figures/compile_method_shape.pdf (100%) delete mode 100644 Chapters/BasicsOnExecution/figures/width_0-ascii.txt delete mode 100644 Chapters/BasicsOnExecution/figures/width_0.pdf delete mode 100644 pillar.config diff --git a/Chapters/3-MethodsAndBytecode/figures/compile_method_shape-ascii.txt b/Chapters/2-ObjectStructure/figures/compile_method_shape-ascii.txt similarity index 100% rename from Chapters/3-MethodsAndBytecode/figures/compile_method_shape-ascii.txt rename to Chapters/2-ObjectStructure/figures/compile_method_shape-ascii.txt diff --git a/Chapters/3-MethodsAndBytecode/figures/compile_method_shape.pdf b/Chapters/2-ObjectStructure/figures/compile_method_shape.pdf similarity index 100% rename from Chapters/3-MethodsAndBytecode/figures/compile_method_shape.pdf rename to Chapters/2-ObjectStructure/figures/compile_method_shape.pdf diff --git a/Chapters/2-ObjectStructure/objectStructure.md b/Chapters/2-ObjectStructure/objectStructure.md index 7a08e4e..79ad0c3 100644 --- a/Chapters/2-ObjectStructure/objectStructure.md +++ b/Chapters/2-ObjectStructure/objectStructure.md @@ -426,7 +426,62 @@ However, they use a different format so the runtime can differentiate them from ### Methods and Headers -TODO! +Pharo users write methods in Pharo syntax. +However, Pharo source code is just text and is not executable. +Before executing those methods, a bytecode compiler processes the source code and translates it to an executable form by performing a sequence of transformations until it generates a `CompiledMethod` instance. +A parsing step translates the source code into a tree data structure called an _abstract syntax tree_, a name resolution step attaches semantics to identifiers, a lowering step creates a control flow graph representation, and finally a code generation step produces the `CompiledMethod` object containing the code and meta-data required for execution. +A compiled method is structured around a method header, a literal frame, a bytecode sequence and a method trailer as shown in Figure *@methodshape@*. + +![Structure of a compiled method.%anchor=methodshape&width=60](figures/compile_method_shape.pdf) + + +#### Literals and the Literal Frame + +Pharo code includes all sort of literal values that need to be known and accessed at runtime. +For example, Listing *@exampleMethod@* shows a method using integers, arrays, and strings. + +```caption=Source code with several literals&anchor=exampleMethod +MyClass >> exampleMethod + self someComputation > 1 + ifTrue: [ ^ #() ] + ifFalse: [ self error: 'Unexpected!' ] +``` + +In Pharo, literal values are stored each in different reference slot in a method. +The collection of reference slots in a method is called the _literal frame_. +Remember from the object representation chapter, that `CompiledMethod` instances are variable objects that contain a variable reference part and a variable byte indexable part. + +- Commonly, the literal frame contains references to numbers, characters, strings, arrays and symbols used in a method. +- In addition, when referencing globals (and thus classes), class variables and shared variables, the literal frame references their corresponding associations. +- Finally, the literal frame references also runtime meta-data such as flags or message selectors required to perform message-sends. + +It is worth noticing that the literal frame poses no actual limitation to what type of object it references. +Such capability is rarely exploited when a method's behavior cannot be expressed in Pharo syntax. +This is for example the case of foreign function interface methods that are compiled by a separate compiler and store foreign function meta-data as literals. + +#### Method Header + +All methods contain at least one literal named the _method header_, referencing an immediate integer representing a mask of flags. + +- **Encoder:** a bit indicating if the method uses the default bytecode set or not. +- **Primitive:** a bit indicating if the method has a primitive operation or not. +- **Number of parameters:** 4 bits representing the number of parameters of the method. +- **Number of temporaries:** 6 bits representing the number of temporary variables declared in the method. +- **Number of literals:** 15 bits representing the number of literals contained in the method. +- **Frame size:** 1 bit representing if the method will require small or large frame sizes. + +The encoder and primitive flags will be covered later in this chapter. +The frame size will be explored in the context reification chapter. + +#### Method Trailer + +Following the method literals, a `CompiledMethod` instance contains a byte-indexable variable part, containing bytecode instructions. +However, it is of common usage in Pharo to make this byte-indexable part slightly larger to contain trailing meta-data after a method's bytecode. +Such meta-data is called the _method trailer_. + +The method trailer can be arbitrarily long, encoding binary data such as integers or encoded text. +Pharo usually uses the trailer to encode the offset of the method source code in a file. +It has, however, also been used to encode a method source code in utf8 encoding, or zipped. ### Classes diff --git a/Chapters/3-MethodsAndBytecode/methodsbytecode.md b/Chapters/3-MethodsAndBytecode/methodsbytecode.md index 9d7f873..e376248 100644 --- a/Chapters/3-MethodsAndBytecode/methodsbytecode.md +++ b/Chapters/3-MethodsAndBytecode/methodsbytecode.md @@ -13,14 +13,7 @@ In this chapter, we explain in detail how methods are modeled using the sista by We explain how bytecode and primitive instructions are executed using a conceptual stack. The bytecode interpreter and the call stack are introduced in Chapter *@cha:Slang@*. -### Compiled Methods - -Pharo users write methods in Pharo syntax. -However, Pharo source code is just text and is not executable. -Before executing those methods, a bytecode compiler processes the source code and translates it to an executable form by performing a sequence of transformations until it generates a `CompiledMethod` instance. -A parsing step translates the source code into a tree data structure called an _abstract syntax tree_, a name resolution step attaches semantics to identifiers, a lowering step creates a control flow graph representation, and finally a code generation step produces the `CompiledMethod` object containing the code and meta-data required for execution. - -#### Intermezzo: Variables in Pharo +### Intermezzo: Variables in Pharo To understand how Pharo code works, it is useful to do a quick reminder on how do variables work. In this chapter, we will deal with the low-level representation of variables (how read/writes are implemented). @@ -63,59 +56,6 @@ Literal variables live as long as the program, or a developer decides to explici Literal variables do not have an index: they are represented as an association (a key-value object) and stored in dictionaries. Methods using literal variables store the corresponding associations in their literal frame, as we will see next. -#### Literals and the Literal Frame - -Pharo code includes all sort of literal values that need to be known and accessed at runtime. -For example, Listing *@exampleMethod@* shows a method using integers, arrays, and strings. - -```caption=Source code with several literals&anchor=exampleMethod -MyClass >> exampleMethod - self someComputation > 1 - ifTrue: [ ^ #() ] - ifFalse: [ self error: 'Unexpected!' ] -``` - -In Pharo, literal values are stored each in different reference slot in a method. -The collection of reference slots in a method is called the _literal frame_. -Remember from the object representation chapter, that `CompiledMethod` instances are variable objects that contain a variable reference part and a variable byte indexable part. - -- Commonly, the literal frame contains references to numbers, characters, strings, arrays and symbols used in a method. -- In addition, when referencing globals (and thus classes), class variables and shared variables, the literal frame references their corresponding associations. -- Finally, the literal frame references also runtime meta-data such as flags or message selectors required to perform message-sends. - -It is worth noticing that the literal frame poses no actual limitation to what type of object it references. -Such capability is rarely exploited when a method's behavior cannot be expressed in Pharo syntax. -This is for example the case of foreign function interface methods that are compiled by a separate compiler and store foreign function meta-data as literals. - -### Compiled Method - -A compiled method is structured around a method header, a literal frame, a bytecode sequence and a method trailer as shown in Figure *@methodshape@*. - -![Structure of a compiled method.%anchor=methodshape&width=60](figures/compile_method_shape.pdf) - -#### Method Header - -All methods contain at least one literal named the _method header_, referencing an immediate integer representing a mask of flags. - -- **Encoder:** a bit indicating if the method uses the default bytecode set or not. -- **Primitive:** a bit indicating if the method has a primitive operation or not. -- **Number of parameters:** 4 bits representing the number of parameters of the method. -- **Number of temporaries:** 6 bits representing the number of temporary variables declared in the method. -- **Number of literals:** 15 bits representing the number of literals contained in the method. -- **Frame size:** 1 bit representing if the method will require small or large frame sizes. - -The encoder and primitive flags will be covered later in this chapter. -The frame size will be explored in the context reification chapter. - -#### Method Trailer - -Following the method literals, a `CompiledMethod` instance contains a byte-indexable variable part, containing bytecode instructions. -However, it is of common usage in Pharo to make this byte-indexable part slightly larger to contain trailing meta-data after a method's bytecode. -Such meta-data is called the _method trailer_. - -The method trailer can be arbitrarily long, encoding binary data such as integers or encoded text. -Pharo usually uses the trailer to encode the offset of the method source code in a file. -It has, however, also been used to encode a method source code in utf8 encoding, or zipped. ### Stack Bytecode diff --git a/Chapters/BasicsOnExecution/basicsOnExecution.md b/Chapters/BasicsOnExecution/basicsOnExecution.md index b356735..f0ed1ee 100644 --- a/Chapters/BasicsOnExecution/basicsOnExecution.md +++ b/Chapters/BasicsOnExecution/basicsOnExecution.md @@ -61,7 +61,7 @@ The fact that the variable is named `origin` depends on the fact that this metho The commented form of the bytecodes for Rectangle width is shown below: -![.](figures/width_0.pdf) +![.](figures/interpreter_activation.pdf) %Rectangle >> #width %- <01> pushRcvr: 1 - push the value of the receiver's second instance variable (corner) onto the stack diff --git a/Chapters/BasicsOnExecution/figures/width_0-ascii.txt b/Chapters/BasicsOnExecution/figures/width_0-ascii.txt deleted file mode 100644 index 1fecc3d..0000000 --- a/Chapters/BasicsOnExecution/figures/width_0-ascii.txt +++ /dev/null @@ -1,9 +0,0 @@ - -instructionPtr -----> <01> pushRcvr 1 - push the value of the receiver's second instance variable (corner ) - <7E> send 'x' - send the unary message x - <00> pushRcvr 0 - push the value of the receiver's first instance variable (origin ) - <7E> send 'x' - send the unary message x - <61> send '-' - send the binary message - - <5C> returnTop - - diff --git a/Chapters/BasicsOnExecution/figures/width_0.pdf b/Chapters/BasicsOnExecution/figures/width_0.pdf deleted file mode 100644 index 6539e3f221489eb03c2a1f0601761a2fc8e30d2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11445 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 UKyOAD)*c@}CIf@CvJB?`0Z4ve00000 diff --git a/pillar.conf b/pillar.conf index f66ba5d..f4435ee 100644 --- a/pillar.conf +++ b/pillar.conf @@ -1 +1 @@ -{ "series" : "Square Bracket tutorials", "base_url" : "", "\"tocFile\": \"index.pillar\" if you have a index.pillar file containing the table of contents of your book" : "comment", "attribution" : "The Pharo team", "latexWriter" : "miclatex:sbabook", "keywords" : "Virtual machine, object encodings, garbage collection, Pharo, Smalltalk", "htmlWriter" : "html", "title" : "[DRAFT/WIP] The Pharo Virtual Machine Explained", "site_name" : "Pharo Book", "bibFile" : "vmbib.bib" } \ No newline at end of file +{ "series" : "Square Bracket tutorials", "base_url" : "", "\"tocFile\": \"index.md\" if you have a index.pillar file containing the table of contents of your book" : "comment", "attribution" : "The Pharo team", "latexWriter" : "miclatex:sbabook", "keywords" : "Virtual machine, object encodings, garbage collection, Pharo, Smalltalk", "htmlWriter" : "html", "title" : "[DRAFT/WIP] The Pharo Virtual Machine Explained", "site_name" : "Pharo Book", "bibFile" : "vmbib.bib" } \ No newline at end of file diff --git a/pillar.config b/pillar.config deleted file mode 100644 index f66ba5d..0000000 --- a/pillar.config +++ /dev/null @@ -1 +0,0 @@ -{ "series" : "Square Bracket tutorials", "base_url" : "", "\"tocFile\": \"index.pillar\" if you have a index.pillar file containing the table of contents of your book" : "comment", "attribution" : "The Pharo team", "latexWriter" : "miclatex:sbabook", "keywords" : "Virtual machine, object encodings, garbage collection, Pharo, Smalltalk", "htmlWriter" : "html", "title" : "[DRAFT/WIP] The Pharo Virtual Machine Explained", "site_name" : "Pharo Book", "bibFile" : "vmbib.bib" } \ No newline at end of file