From 08e9faade1b05796d689982cc99e213b3c509de4 Mon Sep 17 00:00:00 2001 From: skylee03 <1178715749@qq.com> Date: Mon, 1 Jul 2024 14:42:25 +0800 Subject: [PATCH 1/6] feat: add Chapter 14 --------- Co-authored-by: Zihang Ye Co-authored-by: Dawn Magnet <61567130+DawnMagnet@users.noreply.github.com> --- docs/14-stack-machine.md | 185 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 185 insertions(+) create mode 100644 docs/14-stack-machine.md diff --git a/docs/14-stack-machine.md b/docs/14-stack-machine.md new file mode 100644 index 0000000..a488291 --- /dev/null +++ b/docs/14-stack-machine.md @@ -0,0 +1,185 @@ +# Case Study: Stack-based Virtual Machine + +Today, we are going to try to implement a simple stack-based virtual machine, taking the backend Wasm used by Moonbit as an example. In the first part, we will introduce what a stack-based virtual machine is and the instructions we are going to implement. + +Before explaining the virtual machine, let's explain two concepts: compilation and interpretation. As we all know, the programs we write are in text format. What the computer can really execute are binary formats. So, there is a compilation process in between. Compilation is the use of a compiler to convert the source program, usually the source code, into the target program we want to execute. After that, we can directly execute the binary format of the target program, providing various inputs during its operation, such as command line arguments, command line input, or various files, network resources, to obtain the output we expect. The compiled language you are familiar with may be C language. But sometimes, for some languages, we don't compile and execute directly, but directly input the text format source code to the interpreter, let the interpreter read the program while executing, to get the output we want. Typical ones are generally JavaScript or Python. Broadly speaking, the CPU is also a kind of interpreter. + +Let's extend the topic a bit. Interested students can search and learn. In fact, the interpreter and the compiler are not completely separate concepts. We can transform the interpreter into a compiler through a two-way mapping. The concept used here is partial computation, which is a program optimization technique, that is, to specialize the computation based on known information. For an extreme example, if your interpreter is a calculator and your program is an arithmetic expression, then you can use these two pieces of information to directly calculate the value corresponding to the program, thus obtaining a target program. This target program is equivalent to the compiled program, and you only need to input data to get the output program. + +In addition to compiling and interpreting execution, another way is to combine the two. A typical example is Java. The Java virtual machine was created to achieve the purpose of writing once and running everywhere, defining an instruction set that is not based on any platform, and then implementing an interpreter on different platforms. So the first step is to compile from the source code to this virtual instruction set, and then the interpreter interprets and executes the instruction set. The interpreter here is also a virtual machine. There are two common types of virtual machines: one is the stack-based virtual machine, where operands are stored on the stack, and data follows the LIFO (Last In First Out) principle. The other is the register-based virtual machine, similar to a normal computer, where operands are stored in registers. The stack-based virtual machine is relatively simple to implement and has a smaller code size, while the register-based virtual machine is closer to the actual computer structure and has higher performance. + +example: Lua VM Maximize function(register-based) +``` +MOVE 2 0 0 ; R(2) = R(0) +LT 0 0 1 ; R(0) < R(1)? +JMP 1 ; JUMP -> 5 (4 + 1) +MOVE 2 1 0 ; R(2) = R(1) +RETURN 2 2 0 ; return R(2) +RETURN 0 1 0 ; return +``` +example: WASM Maximize function(stack-based) +```wasm +local.get $a local.set $m ;; let mut m = a +local.get $a local.get $b i32.lt_s ;; if a < b { +if local.get $b local.set $m end ;; m = b } +local.get $m ;; m +``` + +Now that we have mentioned WebAssembly, let's give it a brief introduction. WebAssembly, as its name suggests, Web+Assembly, is a virtual instruction set. It was initially used on the web and can be used in browsers, but since it is an instruction set, it can be executed on other platforms as long as a virtual machine is implemented, so there are also runtimes like [Wasmtime](https://github.com/bytecodealliance/wasmtime), (WAMR)[https://github.com/bytecodealliance/wasm-micro-runtime], [WasmEdge](https://wasmedge.org/), etc. It is also the first compilation backend of MoonBit. One of its major features is that its instruction set also has a type system, so there is a great guarantee of security. Today we will take a subset of the WebAssembly instruction set as an example. + +The data we consider today is only 32-bit signed integers, that is, Int in Moonbit. To meet the needs of control flow, we use non-zero integers to represent true, and zero to represent false. Our instruction set includes: data operations, data storage, and control flow. On the data side, const can define an integer constant, as well as addition, subtraction, equality judgment, and modulo. Data storage includes fetching and storing operations from local parameters. Control flow includes if-else and function calls. + +[The definition of types in Moonbit](https://www.moonbitlang.com/docs/syntax#built-in-data-structures) is basically a one-to-one copy: data is defined using an enumeration type, although we only have 32-bit signed integers; instructions, as just introduced, include the definition of constants, addition, modulo, equality, and function calls, local fetching and setting values, all identified by strings. Finally, there is conditional judgment, which includes an integer and two instruction lists. The integer represents how many calculation results will be left after this expression block ends, and the two instruction lists correspond to the situations when the condition is true and false, respectively. + +The function type definition includes the function name, input parameters, output parameters, local variables, and the function body. Here, since we only have one data type, we only record their respective names and quantities, without considering the specific corresponding types. A complete program includes multiple functions and an optional function as the program entry point. + +Let's take a look at the specific operation process of the stack-based virtual machine. First is numerical calculation. Taking 1+2 as an example, we have a stack, which is initially empty. The first thing we need to do is to add data to the stack. Since it is a constant, we use the constant instruction to add 1 and 2. Then, we use the addition instruction. The addition instruction will take the top two values of the stack, add them together, and store the result back on the top of the stack. So, after the operation is completed, the top element of the stack is 3. + +```moonbit no-check +List::[ Const(1), Const(2), Add ] +``` + +![](../pics/add.drawio.svg) + +In addition to directly using the constant instruction for definition, we can also use local variables. These variables come from the function's parameters and some defined temporary variables. For example, in this addition, there are parameters a and b available for us to use. We use the fetch instruction to store the corresponding values on the stack, and then perform the calculation. Each local variable can be modified, and can be done through the Set instruction. + +```moonbit no-check +List::[ Local_Get("a"), Local_Get("b"), Add ] +``` + +![](../pics/local.drawio.svg) + +After that, we can also call other functions for calculation. In this example, we use the addition function for calculation. We still put 1 and 2 on the stack. Then, we call the function. At this time, according to the number of function parameters, the corresponding number of elements on the top of the stack will be taken out, bound to local variables in order, and an element representing the function will be added to the stack. This element separates the original stack data from the function's data, and this element will also record the number of function return values. After the function calculation is finished, according to the number of return values, we take out the top elements of the stack, remove the function's element, and then put the top elements back on the top of the stack, so that we get the calculation result at the place where the function is called. + + +```moonbit no-check +Lists::[ Const(1), Const(2), Call("add") ] +``` + +![](../pics/return.drawio.svg) + +As for conditional branching, as we said before, we use whether the 32-bit integer is non-zero to represent true or false. When we execute the IF statement, we take out the top element of the stack, judge according to its value, if it is true, then execute the then branch, if it is false, then execute the else branch. It is worth noting that each code block in Wasm has parameter types and return value types, specifically referring to the number and type of stack top elements involved in the calculation when entering the code block, and the modification of the stack top elements compared to the original calculation environment when exiting the code block. For example, here, when we enter the conditional judgment code block, there is no input, so we assume that the stack is empty when we perform calculations inside the IF code block, no matter what is on the stack originally, it is irrelevant to the current code block. And we declared to return an integer, so when we normally end the execution, there must be and only one integer in the current calculation environment. + +```moonbit no-check +List::[ +Const(1), Const(0), Equal, +If(1, List::[Const(1)], List::[Const(0)]) +] +``` + +![](../pics/if.drawio.svg) + +We use the content we just described to implement an addition program. The definition of the addition function has been seen before, and we added a test_add as the main entry of the program. The only thing to pay attention to is that after calling the add function, we call the print_int function again. The print_int is a special function. You may have noticed that I did not mention how to define input and output in Wasm, because these functions need to be implemented by external functions, Wasm itself can be considered as a program running in a sandbox. + +```moonbit +struct Program { + functions : @immut/list.List[Function] + start : Option[String] +} +``` + +```moonbit expr +let program = Program::{ + + start: Some("test_add"), // Program entry point + + functions: @immut/list.List::[ + Function::{ + name: "add", // Addition function + params: @immut/list.List::["a", "b"], result: 1, locals: @immut/list.List::[], + instructions: @immut/list.List::[Local_Get("a"), Local_Get("b"), Add], + }, + Function::{ + name: "test_add", // calculate add and output + params: @immut/list.List::[], result: 0, locals: @immut/list.List::[], // entry function with no input or output + // “print_int" is a special function + instructions: @immut/list.List::[Const(0), Const(1), Call("add"), Call("print_int")], + }, + ], +} +``` + +output program +```wasm +;; Multiple functions +;; WASM itself only defines operations; interaction depends on external functions +(func $print_int (import "spectest" "print_int") (param i32)) + +(func $add (export "add") ;; Export function to be directly used by runtime + (param $a i32) (param $b i32) (result i32 ) ;; (a : Int, b : Int) -> Int + local.get $a local.get $b i32.add ;; + +) + +(func $test_add (export "test_add") (result ) ;; Entry function with no input or output + i32.const 0 i32.const 1 call $add call $print_int +) + +(start $test_add) +``` + +Finally, we will show the target program we hope to obtain. You can compare it with the program defined in Moonbit before, and you will find that it is almost one-to-one. The next thing we need to do is to write a compiler. The compiler here is relatively simple because our data definition is a one-to-one copy of the Wasm instruction. What we need to do is to convert strings. It should be noted that when I implemented the compiler, we did not directly use string concatenation here, but used the way of modifying the Buffer. The Buffer will allocate additional memory, so when adding new content, it does not necessarily need to allocate additional memory, compared with simple string concatenation, the memory allocation operation can be reduced. As shown in the example code, we directly add strings to the buffer. Of course, Wasm is not only in text format, it also has a binary format. What is now presented to everyone is the binary corresponding to each instruction. Those who are interested can check the WebAssembly standard document. + +Recall the previous lessons where we introduced the syntax parser. At that time, we used it to parse integer addition, subtraction, multiplication, and division, and performed calculations. The examples at that time were relatively simple, just addition, subtraction, multiplication, and division, which could be completely constant-folded, meaning the calculations were completed directly during compilation. However, for a program, constant folding for the entire program is obviously not the norm; it must be compiled to a backend for execution. Now, after introducing WebAssembly, we can fill in the last piece of the puzzle. We start with strings, perform lexical analysis to obtain a stream of tokens. Then we use the syntax parser to obtain an abstract syntax tree. From this step, we compile to the WebAssembly instruction set. Finally, we can feed it to various runtime environments for execution. Of course, due to the `Tagless Final` technique we introduced in the last class, the abstract syntax tree can also be omitted. Here, let's recall the syntax book from the last lesson, which includes an integer and addition, subtraction, and multiplication, and division. + +So we can use a simple recursive function. This function performs pattern matching on the abstract syntax tree and translates it into the corresponding sequence of WebAssembly instructions. For example, an integer is translated into a single constant instruction, while addition and the like require recursive translation of two parameters. After that, since WebAssembly is a stack-based virtual machine, we link them together and add an addition instruction at the end. It can be seen that we also utilized the operator overloading feature of Moonbit here. + +After introducing compilation, let's take a look at interpretation. We build an interpreter here to directly interpret our previous program. To execute, we need two data structures: an operand stack and an instruction queue. On the operand stack, in addition to storing the values involved in the calculation, as previously defined, we also store the variables stored in the environment before the function runs. The instruction queue stores the currently executing instructions. We expand on the original instructions, adding some control instructions, such as the return when the function ends. + +# Type Definitions + +- Data + +```moonbit +enum Value { I32(Int) } // Only considering 32-bit signed integers +``` + +- Instructions + +```moonbit +enum Instruction { + Const(Int) // Constant + Add; Sub; Modulo; Equal // Add, Subtract, Modulo, Equal + Call(String) // Function call + Local_Get(String); Local_Set(String) // Get value, Set value + If(Int, @immut/list.List[Instruction], @immut/list.List[Instruction]) // Conditional statement +} +``` + +- Functions + +```moonbit +struct Function { + name : String + // Only considering one data type, so omit the type of each data, only keep the name and quantity + params : @immut/list.List[String]; result : Int; locals : @immut/list.List[String] + instructions : @immut/list.List[Instruction] +} +``` + +What you see now is our type definition. When expanding instructions, our function end instruction has an integer parameter. What is actually referred to here is the information of the function's return value. Since we only have integers here, we only store the last few values returned. The entire program environment includes the program definition, as well as the operand stack, instruction queue, and local variables in the current calculation environment. All data structures are immutable, and what we need to do is calculate the next state based on the previous state, including the current instruction to be executed, etc. Since errors may occur, after all, we have not verified the code, the returned state is defined by `Option`. + +```moonbit no-check +(Cons(Plain(If(_, then, else_)), tl), Cons(Val(I32(i)), rest)) => + Some(State::{..state, + stack: rest, + instructions: (if i != 0 { then } else { else_ }).map( + AdministrativeInstruction::Plain, + ).concat(tl)}) +``` + +![](../pics/interp_if.drawio.svg) + +After that, we implement our interpreter. What we need to do is to match the current instruction and data stack. If the match is successful, like the addition instruction here, there should be two consecutive integers at the top of the stack, then we calculate the next state. If all matches fail, it means something went wrong, and we use a wildcard to directly return `None`. + +For conditional judgment, we need to take out the corresponding branch code from the stack and add it to the instruction queue. It should be noted that the stored instructions are not expanded, so we perform a mapping here. + +Next is the function call. As we mentioned earlier, without an external interface, WebAssembly can only perform calculations silently and cannot perform input and output, unless it uses memory, which is another topic. To solve this problem, we specially judge the function named `print_int` here. If a call is detected, we directly output its value to our cache. + +![](../pics/interp_end_call.drawio.svg) + +For ordinary function calls, we need to save the current environment and then enter the called environment. In terms of instructions, we need to add a function return instruction, and then expand the corresponding function instructions found in the program above. In terms of data, we need to take a certain number of elements from the top of the current stack according to the number of function parameters to become the new function call environment. After that, we add a function stack on the stack, which stores the current environment variables. + +After execution, theoretically, it should be encountering the control instruction to return the function at this time. We take out the elements from the top of the stack according to the number of return values stored in the instruction, clear the current calculation environment, until the function stack that was previously stored. We restore the original calculation environment from it, and then continue to calculate. + +So the above is the interpreter introduced in this lesson. Interested students can expand the function definition in the syntax parser according to our instruction set. Or you can also add an early return instruction `return` to the instruction set. From f3d1db4b91b28297682b23186092f40e7de2c02c Mon Sep 17 00:00:00 2001 From: skylee03 <1178715749@qq.com> Date: Mon, 1 Jul 2024 14:48:17 +0800 Subject: [PATCH 2/6] feat: add pics for Chapter 14 --------- Co-authored-by: Zihang Ye --- static/pics/add.drawio.svg | 4 ++++ static/pics/call.drawio.svg | 4 ++++ static/pics/if.drawio.svg | 4 ++++ static/pics/interp_add.drawio.svg | 4 ++++ static/pics/interp_call.drawio.svg | 4 ++++ static/pics/interp_end_call.drawio.svg | 4 ++++ static/pics/interp_if.drawio.svg | 4 ++++ static/pics/interp_print_int.drawio.svg | 4 ++++ static/pics/local.drawio.svg | 4 ++++ static/pics/return.drawio.svg | 4 ++++ 10 files changed, 40 insertions(+) create mode 100644 static/pics/add.drawio.svg create mode 100644 static/pics/call.drawio.svg create mode 100644 static/pics/if.drawio.svg create mode 100644 static/pics/interp_add.drawio.svg create mode 100644 static/pics/interp_call.drawio.svg create mode 100644 static/pics/interp_end_call.drawio.svg create mode 100644 static/pics/interp_if.drawio.svg create mode 100644 static/pics/interp_print_int.drawio.svg create mode 100644 static/pics/local.drawio.svg create mode 100644 static/pics/return.drawio.svg diff --git a/static/pics/add.drawio.svg b/static/pics/add.drawio.svg new file mode 100644 index 0000000..6875656 --- /dev/null +++ b/static/pics/add.drawio.svg @@ -0,0 +1,4 @@ + + + +
……
Const(1)
1
……
Const(2)
1
2
……
Add
1 + 2
……
\ No newline at end of file diff --git a/static/pics/call.drawio.svg b/static/pics/call.drawio.svg new file mode 100644 index 0000000..6715dab --- /dev/null +++ b/static/pics/call.drawio.svg @@ -0,0 +1,4 @@ + + + +
……
Const(1)
1
……
Const(2)
1
2
……
Call("add")
1
……
2
Function(1)
a
b
\ No newline at end of file diff --git a/static/pics/if.drawio.svg b/static/pics/if.drawio.svg new file mode 100644 index 0000000..33b8646 --- /dev/null +++ b/static/pics/if.drawio.svg @@ -0,0 +1,4 @@ + + + +
……
Const(1)
1
……
Const(0)
0
……
……
0
Equal
IF
……
Const(0)
0
End
Result: I32
Param: _
……
0
\ No newline at end of file diff --git a/static/pics/interp_add.drawio.svg b/static/pics/interp_add.drawio.svg new file mode 100644 index 0000000..18a6df4 --- /dev/null +++ b/static/pics/interp_add.drawio.svg @@ -0,0 +1,4 @@ + + + +
Add
tail
rest
Instruction
Stack
i32(x)
i32(y)
tail
rest
Instruction
i32(x + y)
Stack
\ No newline at end of file diff --git a/static/pics/interp_call.drawio.svg b/static/pics/interp_call.drawio.svg new file mode 100644 index 0000000..bd76476 --- /dev/null +++ b/static/pics/interp_call.drawio.svg @@ -0,0 +1,4 @@ + + + +
Call
"add"
tail
rest
Instruction
Stack
i32(x)
i32(y)
Func
Instruction
Stack
rest
params/locals
params/locals
x      y
EndOfFrame
"add"
tail
\ No newline at end of file diff --git a/static/pics/interp_end_call.drawio.svg b/static/pics/interp_end_call.drawio.svg new file mode 100644 index 0000000..b3b9715 --- /dev/null +++ b/static/pics/interp_end_call.drawio.svg @@ -0,0 +1,4 @@ + + + +
Instruction
Stack
rest
Func
Instruction
Stack
rest
tail
params/locals
x      y
EndOfFrame
tail
params/locals
x + y
x + y
...
\ No newline at end of file diff --git a/static/pics/interp_if.drawio.svg b/static/pics/interp_if.drawio.svg new file mode 100644 index 0000000..2516a82 --- /dev/null +++ b/static/pics/interp_if.drawio.svg @@ -0,0 +1,4 @@ + + + +
If
tail
rest
Instruction
Stack
0
tail
rest
Instruction
Stack
Then
Else
Else
\ No newline at end of file diff --git a/static/pics/interp_print_int.drawio.svg b/static/pics/interp_print_int.drawio.svg new file mode 100644 index 0000000..58c19bc --- /dev/null +++ b/static/pics/interp_print_int.drawio.svg @@ -0,0 +1,4 @@ + + + +
Call
"print-int"
tail
rest
Instruction
Stack
i32(x)
tail
rest
Instruction
Stack
x
Buffer
...
\ No newline at end of file diff --git a/static/pics/local.drawio.svg b/static/pics/local.drawio.svg new file mode 100644 index 0000000..8dd69e4 --- /dev/null +++ b/static/pics/local.drawio.svg @@ -0,0 +1,4 @@ + + + +
……
Local_Get("a")
1
……
Local_Get("b")
1
2
……
Add
1 + 2
……
1
a
b
2
\ No newline at end of file diff --git a/static/pics/return.drawio.svg b/static/pics/return.drawio.svg new file mode 100644 index 0000000..598e01c --- /dev/null +++ b/static/pics/return.drawio.svg @@ -0,0 +1,4 @@ + + + +
……
3
Function(1)
Return
……
3
1
2
a
b
\ No newline at end of file From c13d27f0adaa6aa0c3e84d8799164ecfb6a2a5fe Mon Sep 17 00:00:00 2001 From: skylee03 <1178715749@qq.com> Date: Mon, 1 Jul 2024 14:51:40 +0800 Subject: [PATCH 3/6] feat: update TOC --- docs/00-course-overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/00-course-overview.md b/docs/00-course-overview.md index 5d7e779..d06d2b4 100644 --- a/docs/00-course-overview.md +++ b/docs/00-course-overview.md @@ -29,7 +29,7 @@ The course is suitable for a wide audience, from programming beginners to experi | 11 | [Case Study: Parser](./parser) | Pending | Pending | | | 12 | [Case Study: Autodiff](./autodiff) | Pending | Pending | | | 13 | Case Study: Neural Network | Pending | Pending | | -| 14 | Case Study: Stack Machine | Pending | Pending | | +| 14 | [Case Study: Stack Machine](./stack-machine) | Pending | Pending | | Chapters 1 to 6 focus on functional programming, where we will learn about basic data structures and algorithms, and then delve into advanced topics such as higher-order functions and interfaces. Starting from Chapter 7, we will move on to imperative programming, where we will work with mutable data. Finally, we will conclude our study with an introduction to object-oriented programming. In the last few chapters, we will present some case studies to demonstrate how to use MoonBit to develop complex programs. From 1898334f0c749069978d6d250c1906ef6b130fd8 Mon Sep 17 00:00:00 2001 From: skylee03 <1178715749@qq.com> Date: Mon, 1 Jul 2024 19:28:07 +0800 Subject: [PATCH 4/6] feat: update Chapter 14 --- docs/14-stack-machine.md | 304 +++++++++++++++++++++++++++++---------- 1 file changed, 225 insertions(+), 79 deletions(-) diff --git a/docs/14-stack-machine.md b/docs/14-stack-machine.md index a488291..49fd51f 100644 --- a/docs/14-stack-machine.md +++ b/docs/14-stack-machine.md @@ -1,82 +1,141 @@ -# Case Study: Stack-based Virtual Machine +# 14. Case Study: Stack Machine -Today, we are going to try to implement a simple stack-based virtual machine, taking the backend Wasm used by Moonbit as an example. In the first part, we will introduce what a stack-based virtual machine is and the instructions we are going to implement. +In this chapter, we are going to implement a simple stack-based virtual machine based on WebAssembly. -Before explaining the virtual machine, let's explain two concepts: compilation and interpretation. As we all know, the programs we write are in text format. What the computer can really execute are binary formats. So, there is a compilation process in between. Compilation is the use of a compiler to convert the source program, usually the source code, into the target program we want to execute. After that, we can directly execute the binary format of the target program, providing various inputs during its operation, such as command line arguments, command line input, or various files, network resources, to obtain the output we expect. The compiled language you are familiar with may be C language. But sometimes, for some languages, we don't compile and execute directly, but directly input the text format source code to the interpreter, let the interpreter read the program while executing, to get the output we want. Typical ones are generally JavaScript or Python. Broadly speaking, the CPU is also a kind of interpreter. +## Compilation vs Interpretation -Let's extend the topic a bit. Interested students can search and learn. In fact, the interpreter and the compiler are not completely separate concepts. We can transform the interpreter into a compiler through a two-way mapping. The concept used here is partial computation, which is a program optimization technique, that is, to specialize the computation based on known information. For an extreme example, if your interpreter is a calculator and your program is an arithmetic expression, then you can use these two pieces of information to directly calculate the value corresponding to the program, thus obtaining a target program. This target program is equivalent to the compiled program, and you only need to input data to get the output program. +Before explaining the idea of a virtual machine, let's explain two concepts: compilation and interpretation. As we all know, the code we write everyday are in text format, while what computers can really execute are binary instructions. There is a compilation process in between. Compilation is the use of a compiler to convert the source code into the target programs, so that we can execute the program with various inputs to obtain the output we expect. Many languages, such as C, are compiled languages. However, for some languages, we don't compile and execute the code directly, but instead input the source code to an interpreter, and let it read the code while simultaneously performing the actions accordingly. Such languages, e.g., JavaScript and Python, are called interpreted languages. Broadly speaking, the CPU is also a kind of interpreter. -In addition to compiling and interpreting execution, another way is to combine the two. A typical example is Java. The Java virtual machine was created to achieve the purpose of writing once and running everywhere, defining an instruction set that is not based on any platform, and then implementing an interpreter on different platforms. So the first step is to compile from the source code to this virtual instruction set, and then the interpreter interprets and executes the instruction set. The interpreter here is also a virtual machine. There are two common types of virtual machines: one is the stack-based virtual machine, where operands are stored on the stack, and data follows the LIFO (Last In First Out) principle. The other is the register-based virtual machine, similar to a normal computer, where operands are stored in registers. The stack-based virtual machine is relatively simple to implement and has a smaller code size, while the register-based virtual machine is closer to the actual computer structure and has higher performance. +Let's extend the topic a bit for interested students. In fact, the interpreter and the compiler are not completely separate concepts. We can transform the interpreter into a compiler through a two-way mapping. The concept used here is partial computation, which is a program optimization technique, that is, to specialize the computation based on known information. For an extreme example, if your interpreter is a calculator and your program is an arithmetic expression, then you can use these two pieces of information to directly calculate the value corresponding to the program, thus obtaining a target program. This target program is equivalent to the compiled program, and you only need to input data to get the output program. -example: Lua VM Maximize function(register-based) -``` -MOVE 2 0 0 ; R(2) = R(0) -LT 0 0 1 ; R(0) < R(1)? -JMP 1 ; JUMP -> 5 (4 + 1) -MOVE 2 1 0 ; R(2) = R(1) -RETURN 2 2 0 ; return R(2) -RETURN 0 1 0 ; return +## Virtual Machines + +In addition to compilation and interpretation, another way is to combine the two. A typical example is Java. The Java Virtual Machine (JVM) was created to achieve the purpose of "writing once and running everywhere". It has a platform-independent instruction set and different interpreters for different platforms. To execute a Java program, the first step is to compile from the source code to the instruction set, and then use the interpreter to interpret the instructions. + +There are two common types of virtual machines: one is the stack-based virtual machine, where operands are stored on a stack following the Last-In First-Out (LIFO) principle; the other is the register-based virtual machine, where operands are stored in registers like what actually happens in a normal computer. The stack-based virtual machine is simpler to implement and has a smaller code size, while the register-based virtual machine is closer to the actual computer organization and has higher performance. + +Taking the `max` function as an example, +- Lua VM (register-based): + ``` + MOVE 2 0 0 ; R(2) = R(0) + LT 0 0 1 ; R(0) < R(1)? + JMP 1 ; JUMP -> 5 (4 + 1) + MOVE 2 1 0 ; R(2) = R(1) + RETURN 2 2 0 ; return R(2) + RETURN 0 1 0 ; return + ``` +- WebAssembly VM (stack-based): + ```wasm + local.get $a local.set $m ;; let mut m = a + local.get $a local.get $b i32.lt_s ;; if a < b { + if local.get $b local.set $m end ;; m = b } + local.get $m ;; m + ``` + +## WebAssembly + +Now, let's give a brief introduction to WebAssembly. As its name suggests, it is a virtual instruction set, which was initially used on the web, but since it is an instruction set, it can also be used on other platforms as long as a virtual machine is implemented, so there are also runtimes like [Wasmtime](https://github.com/bytecodealliance/wasmtime), [WAMR](https://github.com/bytecodealliance/wasm-micro-runtime), [WasmEdge](https://wasmedge.org/), etc. It is also the first backend of MoonBit. One of its major features is that its instruction set also has a type system which guarantees security. + +Here, we will only consider a subset of WebAssembly where the only data type is 32-bit signed integers, and we will use non-zero integers to represent `true` and zero to represent `false` in conditional statements. Also, we will only consider very limited subset of instructions as follows: + +- Create a static constant: `const` +- Arithmetic operations: `add`, `minus`, `equal`, `modulo` +- Function call: `call` +- Get/set the values of local variables: `local.get`, `local.set` +- Conditional statement: `if/else` + +They can be represented with MoonBit as follows: + +```moonbit +enum Value { I32(Int) } + +enum Instruction { + Const(Value) // Create a static constant + Add; Sub; Modulo; Equal // Arithmetic operations + Call(String) // Function call + Local_Get(String); Local_Set(String) // Get/set the values of local variables + If(Int, @immut/list.List[Instruction], @immut/list.List[Instruction]) // Conditional statement +} ``` -example: WASM Maximize function(stack-based) -```wasm -local.get $a local.set $m ;; let mut m = a -local.get $a local.get $b i32.lt_s ;; if a < b { -if local.get $b local.set $m end ;; m = b } -local.get $m ;; m + +The above definition is basically a one-to-one copy from WebAssembly. It is worth noting that `If` takes an integer and two instruction lists as its parameters. The integer represents the number of results to be put on the stack after the `if/else` block ends, and the two instruction lists correspond to the cases when the condition is `true` and `false`, respectively. + +Similarly, we can also easily define the structures of functions and programs: + +```moonbit +struct Function { + name : String + params : @immut/list.List[String]; result : Int; locals : @immut/list.List[String] + instructions : @immut/list.List[Instruction] +} + +struct Program { + functions : @immut/list.List[Function] + start : Option[String] +} ``` -Now that we have mentioned WebAssembly, let's give it a brief introduction. WebAssembly, as its name suggests, Web+Assembly, is a virtual instruction set. It was initially used on the web and can be used in browsers, but since it is an instruction set, it can be executed on other platforms as long as a virtual machine is implemented, so there are also runtimes like [Wasmtime](https://github.com/bytecodealliance/wasmtime), (WAMR)[https://github.com/bytecodealliance/wasm-micro-runtime], [WasmEdge](https://wasmedge.org/), etc. It is also the first compilation backend of MoonBit. One of its major features is that its instruction set also has a type system, so there is a great guarantee of security. Today we will take a subset of the WebAssembly instruction set as an example. +A function has a name, a list of parameters, a result, a list of local variables, and a list of instructions representing the function body. A program includes multiple function definitions and an optional function as the entry point. -The data we consider today is only 32-bit signed integers, that is, Int in Moonbit. To meet the needs of control flow, we use non-zero integers to represent true, and zero to represent false. Our instruction set includes: data operations, data storage, and control flow. On the data side, const can define an integer constant, as well as addition, subtraction, equality judgment, and modulo. Data storage includes fetching and storing operations from local parameters. Control flow includes if-else and function calls. +### Examples -[The definition of types in Moonbit](https://www.moonbitlang.com/docs/syntax#built-in-data-structures) is basically a one-to-one copy: data is defined using an enumeration type, although we only have 32-bit signed integers; instructions, as just introduced, include the definition of constants, addition, modulo, equality, and function calls, local fetching and setting values, all identified by strings. Finally, there is conditional judgment, which includes an integer and two instruction lists. The integer represents how many calculation results will be left after this expression block ends, and the two instruction lists correspond to the situations when the condition is true and false, respectively. +Now, let's take a look at some examples. -The function type definition includes the function name, input parameters, output parameters, local variables, and the function body. Here, since we only have one data type, we only record their respective names and quantities, without considering the specific corresponding types. A complete program includes multiple functions and an optional function as the program entry point. +#### Basic Arithmetic Calculations -Let's take a look at the specific operation process of the stack-based virtual machine. First is numerical calculation. Taking 1+2 as an example, we have a stack, which is initially empty. The first thing we need to do is to add data to the stack. Since it is a constant, we use the constant instruction to add 1 and 2. Then, we use the addition instruction. The addition instruction will take the top two values of the stack, add them together, and store the result back on the top of the stack. So, after the operation is completed, the top element of the stack is 3. +Taking `1 + 2` as an example, we have a stack which is initially empty. The first thing we need to do is to push the operands as static constants to the stack using the `Const` instruction. Then, we use the `Add` instruction to add them up. It consumes two operands from the top of the stack and stores their sum back to the top of the stack. Thus, after the operation, the top element of the stack is `3`. ```moonbit no-check -List::[ Const(1), Const(2), Add ] +@immut/list.List::[ Const(I32(1)), Const(I32(2)), Add ] ``` -![](../pics/add.drawio.svg) +![](/pics/add.drawio.svg) -In addition to directly using the constant instruction for definition, we can also use local variables. These variables come from the function's parameters and some defined temporary variables. For example, in this addition, there are parameters a and b available for us to use. We use the fetch instruction to store the corresponding values on the stack, and then perform the calculation. Each local variable can be modified, and can be done through the Set instruction. +#### Functions and Local Variables + +In a function, we need to get the values of its arguments. The following example is a function that takes two parameters and returns their sum as the result: + +```moonbit no-check +add(a : Int, b : Int) { a + b } +``` + +We should use the `Local_Get` instruction to get the values of `a` and `b` and push them to the stack. Then we could use the `Add` instruction to perform the calculation just like what we did in our last example. ```moonbit no-check -List::[ Local_Get("a"), Local_Get("b"), Add ] +@immut/list.List::[ Local_Get("a"), Local_Get("b"), Add ] ``` -![](../pics/local.drawio.svg) +![](/pics/local.drawio.svg) -After that, we can also call other functions for calculation. In this example, we use the addition function for calculation. We still put 1 and 2 on the stack. Then, we call the function. At this time, according to the number of function parameters, the corresponding number of elements on the top of the stack will be taken out, bound to local variables in order, and an element representing the function will be added to the stack. This element separates the original stack data from the function's data, and this element will also record the number of function return values. After the function calculation is finished, according to the number of return values, we take out the top elements of the stack, remove the function's element, and then put the top elements back on the top of the stack, so that we get the calculation result at the place where the function is called. +To set the value of an local variable, we can use the `Local_Set` instruction. + +#### Function Calls + +After the function `add` is defined, we can call it to perform some calculations. Just like what we did in our first example, we first put `1` and `2` on the stack. Then, instead of using the `Add` instruction, we call the `add` function we defined using the `Call` instruction. At this time, according to the number of function parameters, the corresponding number of elements on the top of the stack will be consumed, bound to local variables in order, and an element representing the function call will be pushed to the stack. It separates the original stack elements from the function's own data, and also records the number of its return values. After the function call is finished, according to the number of return values, we take out the elements from the top of the stack, remove the element for the function call, and then put the original top elements back. After that, that we get the calculation result at the place where the function is called. ```moonbit no-check -Lists::[ Const(1), Const(2), Call("add") ] +@immut/list.Lists::[ Const(I32(1)), Const(I32(2)), Call("add") ] ``` -![](../pics/return.drawio.svg) +![](/pics/return.drawio.svg) + +#### Conditional Statements -As for conditional branching, as we said before, we use whether the 32-bit integer is non-zero to represent true or false. When we execute the IF statement, we take out the top element of the stack, judge according to its value, if it is true, then execute the then branch, if it is false, then execute the else branch. It is worth noting that each code block in Wasm has parameter types and return value types, specifically referring to the number and type of stack top elements involved in the calculation when entering the code block, and the modification of the stack top elements compared to the original calculation environment when exiting the code block. For example, here, when we enter the conditional judgment code block, there is no input, so we assume that the stack is empty when we perform calculations inside the IF code block, no matter what is on the stack originally, it is irrelevant to the current code block. And we declared to return an integer, so when we normally end the execution, there must be and only one integer in the current calculation environment. +For conditional statements, as we introduced earlier, we use a 32-bit integer to represent `true` or `false`. When we execute the `If` statement, we take out the top element of the stack. If it is non-zero, the `then` branch will be executed; otherwise, the `else` branch will be executed. It is worth noting that each code block in Wasm has parameter types and return value types, corresponding to the elements to be consumed from the top of the stack when entering the code block, and the elements to be put on the top of the stack when exiting the code block. For example, when we enter the `if/else` block, there is no input, so we assume that the stack is empty when we perform calculations inside the block, no matter what is on the stack originally, it is irrelevant to the current code block. And we declared to return an integer, so when we normally end the execution, there must be one and only one integer in the current calculation environment. ```moonbit no-check -List::[ -Const(1), Const(0), Equal, -If(1, List::[Const(1)], List::[Const(0)]) +@immut/list.List::[ + Const(I32(1)), Const(I32(0)), Equal, + If(1, @immut/list.List::[Const(I32(1))], @immut/list.List::[Const(I32(0))]) ] ``` -![](../pics/if.drawio.svg) +![](/pics/if.drawio.svg) -We use the content we just described to implement an addition program. The definition of the addition function has been seen before, and we added a test_add as the main entry of the program. The only thing to pay attention to is that after calling the add function, we call the print_int function again. The print_int is a special function. You may have noticed that I did not mention how to define input and output in Wasm, because these functions need to be implemented by external functions, Wasm itself can be considered as a program running in a sandbox. +#### A Complete A + B Program -```moonbit -struct Program { - functions : @immut/list.List[Function] - start : Option[String] -} -``` +We use the knowledge we just introduced to implement a program that calculates the sum of two integers. The definition of the `add` function has been shown before. Now, we also add a `test_add` function as the main entry of the program, in which the only thing to pay attention to is that after calling the `add` function, we call the `print_int` function. It is a special function and we did not mention how to define input and output in Wasm, because these functions need to be implemented by external functions, and Wasm itself can be considered as a program running in a sandbox. ```moonbit expr let program = Program::{ @@ -91,24 +150,26 @@ let program = Program::{ }, Function::{ name: "test_add", // calculate add and output - params: @immut/list.List::[], result: 0, locals: @immut/list.List::[], // entry function with no input or output - // “print_int" is a special function - instructions: @immut/list.List::[Const(0), Const(1), Call("add"), Call("print_int")], + params: @immut/list.List::[], result: 0, locals: @immut/list.List::[], // no input or output + // "print_int" is a special function + instructions: @immut/list.List::[Const(I32(0)), Const(I32(1)), Call("add"), Call("print_int")], }, ], } ``` -output program +## Implementing a Compiler + +The following is the target program in WebAssembly we want to obtain. + ```wasm ;; Multiple functions -;; WASM itself only defines operations; interaction depends on external functions +;; Wasm itself only defines operations; interaction depends on external functions (func $print_int (import "spectest" "print_int") (param i32)) (func $add (export "add") ;; Export function to be directly used by runtime (param $a i32) (param $b i32) (result i32 ) ;; (a : Int, b : Int) -> Int local.get $a local.get $b i32.add ;; - ) (func $test_add (export "test_add") (result ) ;; Entry function with no input or output @@ -118,46 +179,116 @@ output program (start $test_add) ``` -Finally, we will show the target program we hope to obtain. You can compare it with the program defined in Moonbit before, and you will find that it is almost one-to-one. The next thing we need to do is to write a compiler. The compiler here is relatively simple because our data definition is a one-to-one copy of the Wasm instruction. What we need to do is to convert strings. It should be noted that when I implemented the compiler, we did not directly use string concatenation here, but used the way of modifying the Buffer. The Buffer will allocate additional memory, so when adding new content, it does not necessarily need to allocate additional memory, compared with simple string concatenation, the memory allocation operation can be reduced. As shown in the example code, we directly add strings to the buffer. Of course, Wasm is not only in text format, it also has a binary format. What is now presented to everyone is the binary corresponding to each instruction. Those who are interested can check the WebAssembly standard document. +You can compare it with the program written in MoonBit before, and you will find that the correspondence is almost one-to-one. + +The next thing we need to do is to write a compiler, which should be simple because the instructions we defined with MoonBit is almost a one-to-one copy of WebAssembly instructions. + +| Instruction | WebAssembly Instruction | +| ------------------------------------------- | -------------------------------------------------- | +| `Const(I32(0))` | `i32.const 0` | +| `Add` | `i32.add` | +| `Local_Get("a")` | `local.get $a` | +| `Local_Set("a")` | `local.set $a` | +| `Call("add")` | `call $add` | +| `If(1, @immut/list.List::[Const(I32(0))], @immut/list.List::[Const(I32(1))])` | `if (result i32) i32.const 0 else i32.const 1 end` | + +What we need to do is simply string conversion. However, it should be noted that when implementing the compiler, we should not directly use string concatenation, but make use of the built-in `Buffer` data structure. When adding new content to it, we do not need to allocate new memory every time. Thus, compared with naive string concatenation, the memory allocation operation can be reduced. + +```moonbit no-check +fn Function::to_wasm(self : Function, buffer : Buffer) -> Unit +fn Program::to_wasm(self : Program, buffer : Buffer) -> Unit +fn Instruction::to_wasm(self : Instruction, buffer : Buffer) -> Unit { + match self { + Add => buffer.write_string("i32.add ") + Local_Get(val) => buffer.write_string("local.get $\(val) ") + _ => buffer.write_string("...") + } +} +``` + +Of course, WebAssembly not only has a text format (WAT), but also has a binary format. [Here](https://webassembly.github.io/wabt/demo/wat2wasm/) is a useful tool that converts WAT to binary WASM. Those who are interested can also check the [WebAssembly Specification](https://webassembly.github.io/spec/core/index.html). -Recall the previous lessons where we introduced the syntax parser. At that time, we used it to parse integer addition, subtraction, multiplication, and division, and performed calculations. The examples at that time were relatively simple, just addition, subtraction, multiplication, and division, which could be completely constant-folded, meaning the calculations were completed directly during compilation. However, for a program, constant folding for the entire program is obviously not the norm; it must be compiled to a backend for execution. Now, after introducing WebAssembly, we can fill in the last piece of the puzzle. We start with strings, perform lexical analysis to obtain a stream of tokens. Then we use the syntax parser to obtain an abstract syntax tree. From this step, we compile to the WebAssembly instruction set. Finally, we can feed it to various runtime environments for execution. Of course, due to the `Tagless Final` technique we introduced in the last class, the abstract syntax tree can also be omitted. Here, let's recall the syntax book from the last lesson, which includes an integer and addition, subtraction, and multiplication, and division. +| Text Format | Binary Format | +| ------------- | ------------------------------------------------------ | +| `i32.const` | 0x41 | +| `i32.add` | 0x6A | +| `local.get` | 0x20 | +| `local.set` | 0x21 | +| `call $add` | 0x10 | +| `if else end` | 0x04 (vec[instructions]) 0x05 (vec[instructions]) 0x0B | -So we can use a simple recursive function. This function performs pattern matching on the abstract syntax tree and translates it into the corresponding sequence of WebAssembly instructions. For example, an integer is translated into a single constant instruction, while addition and the like require recursive translation of two parameters. After that, since WebAssembly is a stack-based virtual machine, we link them together and add an addition instruction at the end. It can be seen that we also utilized the operator overloading feature of Moonbit here. +### Multi-Level Compilation -After introducing compilation, let's take a look at interpretation. We build an interpreter here to directly interpret our previous program. To execute, we need two data structures: an operand stack and an instruction queue. On the operand stack, in addition to storing the values involved in the calculation, as previously defined, we also store the variables stored in the environment before the function runs. The instruction queue stores the currently executing instructions. We expand on the original instructions, adding some control instructions, such as the return when the function ends. +In [Chapter 11](./parser), we introduced the syntax parser. At that time, we used it to parse basic arithmetic expressions, which were so simple that with constant folding, they can be entirely completed during compilation. However, for a program, constant folding is obviously not the norm, and it must be compiled to a backend for execution. Now, after introducing WebAssembly, we can fill in the last piece of the puzzle. We start with strings, perform lexical analysis to obtain a token stream. Then we use the syntax parser to obtain an abstract syntax tree. From this step, we compile to the WebAssembly instruction set. Finally, we can feed it to various runtime environments for execution. Of course, thanks to the "tagless final" technique we introduced, the abstract syntax tree may also be simplified. -# Type Definitions +

String → Token Stream → (Abstract Syntax Tree) → Wasm IR → Compile/Run

-- Data +The following is the definition of the syntax trees for basic arithmetic expressions adopted from [Chapter 11](./parser). ```moonbit -enum Value { I32(Int) } // Only considering 32-bit signed integers +enum Expression { + Number(Int) + Plus(Expression, Expression) + Minus(Expression, Expression) + Multiply(Expression, Expression) + Divide(Expression, Expression) +} ``` -- Instructions +Therefore, we can use a simple recursive function that performs pattern matching on the AST and translates it into the corresponding sequence of WebAssembly instructions. For example, an integer is translated into a single constant instruction, and binary operations require recursive translation of the two operands followed by the instruction for the operation itself. It can be seen that we have used the operator overloading feature of MoonBit here. ```moonbit -enum Instruction { - Const(Int) // Constant - Add; Sub; Modulo; Equal // Add, Subtract, Modulo, Equal - Call(String) // Function call - Local_Get(String); Local_Set(String) // Get value, Set value - If(Int, @immut/list.List[Instruction], @immut/list.List[Instruction]) // Conditional statement +fn compile_expression(expression : Expression) -> @immut/list.List[Instruction] { + match expression { + Number(i) => @immut/list.List::[Const(I32(i))] + Plus(a, b) => compile_expression(a) + compile_expression(b) + @immut/list.List::[Add] + Minus(a, b) => compile_expression(a) + compile_expression(b) + @immut/list.List::[Sub] + _ => @immut/list.List::[] + } +} +``` + +## Implementing an Interpreter + +Now, let's take a look at interpretation. We will build an interpreter to directly interpret our previous program. Here, we need two data structures: an operand stack and an instruction queue. On the operand stack, in addition to storing the values involved in the calculation, we also store the variables stored in the environment before the function is called. The instruction queue stores to instructions to be executed. We will also expand on the original instruction set with some control instructions, such as the `EndOfFrame` instruction. + +The `EndOfFrame` instruction has an integer parameter for the return values of the function. Since we only have integers as our basic data type, we only need to know the the number of return values. The entire program environment includes the program definition, as well as the operand stack, instruction queue, and local variables in the current environment. + +```moonbit +enum StackValue { + Val(Value) // Ordinary value + Func(@immut/hashmap.Map[String, Value]) // Function stack, stores previous local variables +} +enum AdministrativeInstruction { + Plain(Instruction) // Ordinary instruction + EndOfFrame(Int) // Function end instruction +} +struct State { + program : Program + stack : @immut/list.List[StackValue] + locals : @immut/hashmap.Map[String, Value] + instructions : @immut/list.List[AdministrativeInstruction] } ``` -- Functions +What we need to do now is calculate the next state based on the previous state by pattern matching on the current instruction and data stack. Since errors may occur, the returned state should be wrapped by `Option`. If the match is successful, like the `Add` instruction here, there should be two consecutive integers representing the operands at the top of the stack, then we can calculate the next state. If all matches fail, it means something went wrong, and we use a wildcard to handle such cases and return a `None`. + ```moonbit -struct Function { - name : String - // Only considering one data type, so omit the type of each data, only keep the name and quantity - params : @immut/list.List[String]; result : Int; locals : @immut/list.List[String] - instructions : @immut/list.List[Instruction] +fn evaluate(state : State, stdout : Buffer) -> Option[State] { + match (state.instructions, state.stack) { + (Cons(Plain(Add), tl), Cons(Val(I32(b)), Cons(Val(I32(a)), rest))) => + Some( + State::{ ..state, instructions: tl, stack: Cons(Val(I32(a + b)), rest) }, + ) + _ => None + } } ``` -What you see now is our type definition. When expanding instructions, our function end instruction has an integer parameter. What is actually referred to here is the information of the function's return value. Since we only have integers here, we only store the last few values returned. The entire program environment includes the program definition, as well as the operand stack, instruction queue, and local variables in the current calculation environment. All data structures are immutable, and what we need to do is calculate the next state based on the previous state, including the current instruction to be executed, etc. Since errors may occur, after all, we have not verified the code, the returned state is defined by `Option`. +![](/pics/interp_add.drawio.svg) + +For conditional statement, we need to take out the code of the corresponding branch from the stack and add it to the instruction queue. It should be noted that the stored instructions should not be not expanded, so we perform a mapping here. ```moonbit no-check (Cons(Plain(If(_, then, else_)), tl), Cons(Val(I32(i)), rest)) => @@ -168,18 +299,33 @@ What you see now is our type definition. When expanding instructions, our functi ).concat(tl)}) ``` -![](../pics/interp_if.drawio.svg) +![](/pics/interp_if.drawio.svg) + +Next is the function call. As we mentioned earlier, without external APIs, WebAssembly cannot perform input and output. To solve this problem, we specially handle the function calls for `print_int`. If a call is detected, we directly output its value to our cache. + +```moonbit no-check +(Cons(Plain(Call("print_int")), tl), Cons(Val(I32(i)), rest)) => { + stdout.write_string(i.to_string()) + Some(State::{ ..state, stack: rest, instructions: tl }) +} +``` + +![](/pics/interp_print_int.drawio.svg) -After that, we implement our interpreter. What we need to do is to match the current instruction and data stack. If the match is successful, like the addition instruction here, there should be two consecutive integers at the top of the stack, then we calculate the next state. If all matches fail, it means something went wrong, and we use a wildcard to directly return `None`. +For ordinary function calls, we need to save the current environment and then enter the new environment for the call. That is why we need to add the `EndOfFrame` instruction. In terms of data, we need to take a certain number of elements from the top of the current stack according to the number of function parameters to become the new function call environment. After that, we add a function stack on the stack, which stores the current environment variables. -For conditional judgment, we need to take out the corresponding branch code from the stack and add it to the instruction queue. It should be noted that the stored instructions are not expanded, so we perform a mapping here. +![](/pics/interp_call.drawio.svg) -Next is the function call. As we mentioned earlier, without an external interface, WebAssembly can only perform calculations silently and cannot perform input and output, unless it uses memory, which is another topic. To solve this problem, we specially judge the function named `print_int` here. If a call is detected, we directly output its value to our cache. +After execution, it should be encountering the control instruction to return the function at this time. We take out the elements from the top of the stack according to the number of return values stored in the instruction, clear the current environment, until the function stack that was previously stored. We restore the original environment from it, and then continue the calculation. -![](../pics/interp_end_call.drawio.svg) +![](/pics/interp_end_call.drawio.svg) -For ordinary function calls, we need to save the current environment and then enter the called environment. In terms of instructions, we need to add a function return instruction, and then expand the corresponding function instructions found in the program above. In terms of data, we need to take a certain number of elements from the top of the current stack according to the number of function parameters to become the new function call environment. After that, we add a function stack on the stack, which stores the current environment variables. +## Summary -After execution, theoretically, it should be encountering the control instruction to return the function at this time. We take out the elements from the top of the stack according to the number of return values stored in the instruction, clear the current calculation environment, until the function stack that was previously stored. We restore the original calculation environment from it, and then continue to calculate. +In this chapter we + - Learned the structure of a stack-based virtual machine + - Introduced a subset of the WebAssembly instruction set + - Implemented a compiler + - Implemented an interpreter -So the above is the interpreter introduced in this lesson. Interested students can expand the function definition in the syntax parser according to our instruction set. Or you can also add an early return instruction `return` to the instruction set. +Interested readers may try to expand the definition of functions in the syntax parser, or add the `return` instruction to the instruction set. From 10e3d8987334faf3a70ead84fc7961967d0d120b Mon Sep 17 00:00:00 2001 From: skylee03 <1178715749@qq.com> Date: Mon, 1 Jul 2024 19:33:45 +0800 Subject: [PATCH 5/6] fix: disable spell checking for SVG files --- _typos.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_typos.toml b/_typos.toml index fb2b685..76d635c 100644 --- a/_typos.toml +++ b/_typos.toml @@ -3,5 +3,5 @@ ot = "ot" [type.po] -extend-glob = ["*.webp"] +extend-glob = ["*.svg", "*.webp"] check-file = false \ No newline at end of file From aa999de06eac11a1be6a6517e85864bb578c2664 Mon Sep 17 00:00:00 2001 From: skylee03 <1178715749@qq.com> Date: Tue, 2 Jul 2024 11:31:51 +0800 Subject: [PATCH 6/6] feat: convert `.svg` to `.webp` --- docs/07-imperative-programming.md | 4 ++-- docs/08-queues.md | 8 ++++---- docs/10-hash-maps-closures.md | 12 ++++++------ docs/11-parser.md | 4 ++-- docs/13-neural-network.md | 2 +- docs/14-stack-machine.md | 18 +++++++++--------- static/pics/add.drawio.svg | 4 ---- static/pics/add.drawio.webp | Bin 0 -> 4116 bytes static/pics/alias.drawio.svg | 4 ---- static/pics/alias.drawio.webp | Bin 0 -> 10404 bytes static/pics/ast-example.drawio.svg | 4 ---- static/pics/ast-example.drawio.webp | Bin 0 -> 3132 bytes static/pics/call.drawio.svg | 4 ---- static/pics/call.drawio.webp | Bin 0 -> 6426 bytes static/pics/circle_list.drawio.svg | 4 ---- static/pics/circle_list.drawio.webp | Bin 0 -> 5016 bytes static/pics/circle_list_back.drawio.svg | 4 ---- static/pics/circle_list_back.drawio.webp | Bin 0 -> 5074 bytes static/pics/if.drawio.svg | 4 ---- static/pics/if.drawio.webp | Bin 0 -> 7910 bytes static/pics/interp_add.drawio.svg | 4 ---- static/pics/interp_add.drawio.webp | Bin 0 -> 5766 bytes static/pics/interp_call.drawio.svg | 4 ---- static/pics/interp_call.drawio.webp | Bin 0 -> 9876 bytes static/pics/interp_end_call.drawio.svg | 4 ---- static/pics/interp_end_call.drawio.webp | Bin 0 -> 7632 bytes static/pics/interp_if.drawio.svg | 4 ---- static/pics/interp_if.drawio.webp | Bin 0 -> 4246 bytes static/pics/interp_print_int.drawio.svg | 4 ---- static/pics/interp_print_int.drawio.webp | Bin 0 -> 5834 bytes static/pics/lex_rail.drawio.svg | 4 ---- static/pics/lex_rail.drawio.webp | Bin 0 -> 4006 bytes static/pics/linked_list.drawio.svg | 4 ---- static/pics/linked_list.drawio.webp | Bin 0 -> 5200 bytes static/pics/linked_list_2.drawio.svg | 4 ---- static/pics/linked_list_2.drawio.webp | Bin 0 -> 8296 bytes static/pics/local.drawio.svg | 4 ---- static/pics/local.drawio.webp | Bin 0 -> 5668 bytes static/pics/neural_network.drawio.svg | 4 ---- static/pics/neural_network.drawio.webp | Bin 0 -> 20836 bytes static/pics/open_address.drawio.svg | 4 ---- static/pics/open_address.drawio.webp | Bin 0 -> 7102 bytes static/pics/open_address_delete.drawio.svg | 4 ---- static/pics/open_address_delete.drawio.webp | Bin 0 -> 15822 bytes static/pics/open_address_delete_en.drawio.svg | 4 ---- .../pics/open_address_delete_en.drawio.webp | Bin 0 -> 16478 bytes static/pics/open_address_en.drawio.svg | 4 ---- static/pics/open_address_en.drawio.webp | Bin 0 -> 6258 bytes .../pics/open_address_reallocate.drawio.svg | 4 ---- .../pics/open_address_reallocate.drawio.webp | Bin 0 -> 6996 bytes .../open_address_reallocate_en.drawio.svg | 4 ---- .../open_address_reallocate_en.drawio.webp | Bin 0 -> 7888 bytes static/pics/rearrange.drawio.svg | 4 ---- static/pics/rearrange.drawio.webp | Bin 0 -> 13962 bytes static/pics/rearrange_2.drawio.svg | 4 ---- static/pics/rearrange_2.drawio.webp | Bin 0 -> 18600 bytes static/pics/rearrange_2_en.drawio.svg | 4 ---- static/pics/rearrange_2_en.drawio.webp | Bin 0 -> 18498 bytes static/pics/rearrange_en.drawio.svg | 4 ---- static/pics/rearrange_en.drawio.webp | Bin 0 -> 14188 bytes static/pics/ref.drawio.svg | 4 ---- static/pics/ref.drawio.webp | Bin 0 -> 10746 bytes static/pics/return.drawio.svg | 4 ---- static/pics/return.drawio.webp | Bin 0 -> 2868 bytes static/pics/separate_chaining.drawio.svg | 4 ---- static/pics/separate_chaining.drawio.webp | Bin 0 -> 1292 bytes static/pics/separate_chaining_op.drawio.svg | 4 ---- static/pics/separate_chaining_op.drawio.webp | Bin 0 -> 6400 bytes .../pics/separate_chaining_op_en.drawio.svg | 4 ---- .../pics/separate_chaining_op_en.drawio.webp | Bin 0 -> 4040 bytes static/pics/tombstone.drawio.svg | 4 ---- static/pics/tombstone.drawio.webp | Bin 0 -> 13860 bytes static/pics/tombstone_en.drawio.svg | 4 ---- static/pics/tombstone_en.drawio.webp | Bin 0 -> 14922 bytes 74 files changed, 24 insertions(+), 160 deletions(-) delete mode 100644 static/pics/add.drawio.svg create mode 100644 static/pics/add.drawio.webp delete mode 100644 static/pics/alias.drawio.svg create mode 100644 static/pics/alias.drawio.webp delete mode 100644 static/pics/ast-example.drawio.svg create mode 100644 static/pics/ast-example.drawio.webp delete mode 100644 static/pics/call.drawio.svg create mode 100644 static/pics/call.drawio.webp delete mode 100644 static/pics/circle_list.drawio.svg create mode 100644 static/pics/circle_list.drawio.webp delete mode 100644 static/pics/circle_list_back.drawio.svg create mode 100644 static/pics/circle_list_back.drawio.webp delete mode 100644 static/pics/if.drawio.svg create mode 100644 static/pics/if.drawio.webp delete mode 100644 static/pics/interp_add.drawio.svg create mode 100644 static/pics/interp_add.drawio.webp delete mode 100644 static/pics/interp_call.drawio.svg create mode 100644 static/pics/interp_call.drawio.webp delete mode 100644 static/pics/interp_end_call.drawio.svg create mode 100644 static/pics/interp_end_call.drawio.webp delete mode 100644 static/pics/interp_if.drawio.svg create mode 100644 static/pics/interp_if.drawio.webp delete mode 100644 static/pics/interp_print_int.drawio.svg create mode 100644 static/pics/interp_print_int.drawio.webp delete mode 100644 static/pics/lex_rail.drawio.svg create mode 100644 static/pics/lex_rail.drawio.webp delete mode 100644 static/pics/linked_list.drawio.svg create mode 100644 static/pics/linked_list.drawio.webp delete mode 100644 static/pics/linked_list_2.drawio.svg create mode 100644 static/pics/linked_list_2.drawio.webp delete mode 100644 static/pics/local.drawio.svg create mode 100644 static/pics/local.drawio.webp delete mode 100644 static/pics/neural_network.drawio.svg create mode 100644 static/pics/neural_network.drawio.webp delete mode 100644 static/pics/open_address.drawio.svg create mode 100644 static/pics/open_address.drawio.webp delete mode 100644 static/pics/open_address_delete.drawio.svg create mode 100644 static/pics/open_address_delete.drawio.webp delete mode 100644 static/pics/open_address_delete_en.drawio.svg create mode 100644 static/pics/open_address_delete_en.drawio.webp delete mode 100644 static/pics/open_address_en.drawio.svg create mode 100644 static/pics/open_address_en.drawio.webp delete mode 100644 static/pics/open_address_reallocate.drawio.svg create mode 100644 static/pics/open_address_reallocate.drawio.webp delete mode 100644 static/pics/open_address_reallocate_en.drawio.svg create mode 100644 static/pics/open_address_reallocate_en.drawio.webp delete mode 100644 static/pics/rearrange.drawio.svg create mode 100644 static/pics/rearrange.drawio.webp delete mode 100644 static/pics/rearrange_2.drawio.svg create mode 100644 static/pics/rearrange_2.drawio.webp delete mode 100644 static/pics/rearrange_2_en.drawio.svg create mode 100644 static/pics/rearrange_2_en.drawio.webp delete mode 100644 static/pics/rearrange_en.drawio.svg create mode 100644 static/pics/rearrange_en.drawio.webp delete mode 100644 static/pics/ref.drawio.svg create mode 100644 static/pics/ref.drawio.webp delete mode 100644 static/pics/return.drawio.svg create mode 100644 static/pics/return.drawio.webp delete mode 100644 static/pics/separate_chaining.drawio.svg create mode 100644 static/pics/separate_chaining.drawio.webp delete mode 100644 static/pics/separate_chaining_op.drawio.svg create mode 100644 static/pics/separate_chaining_op.drawio.webp delete mode 100644 static/pics/separate_chaining_op_en.drawio.svg create mode 100644 static/pics/separate_chaining_op_en.drawio.webp delete mode 100644 static/pics/tombstone.drawio.svg create mode 100644 static/pics/tombstone.drawio.webp delete mode 100644 static/pics/tombstone_en.drawio.svg create mode 100644 static/pics/tombstone_en.drawio.webp diff --git a/docs/07-imperative-programming.md b/docs/07-imperative-programming.md index 670becc..da7482c 100644 --- a/docs/07-imperative-programming.md +++ b/docs/07-imperative-programming.md @@ -93,7 +93,7 @@ The distinction between mutable and immutable data is important because it affec - In the second diagram, we use `let` to bind the identifier `ref` to a struct. Thus, the box contains a reference to the struct. When we modify the value in the struct using `ref`, we are updating the value stored in the struct which it points to. The reference itself does not change because it still points to the same struct. - In the third diagram, when we define a mutable `ref` and modify it, we are creating a new box and updating the reference to point to the new box. -![](/pics/ref.drawio.svg) +![](/pics/ref.drawio.webp) ### Aliases @@ -115,7 +115,7 @@ fn init { } ``` -![](/pics/alias.drawio.svg) +![](/pics/alias.drawio.webp) ## Loops diff --git a/docs/08-queues.md b/docs/08-queues.md index 075474b..f2eacf0 100644 --- a/docs/08-queues.md +++ b/docs/08-queues.md @@ -39,11 +39,11 @@ When implementing a circular queue, we keep track of the `start` and `end` indic The following diagram is a demonstration of these operations. First, we create an empty queue by calling `make()`. At this point, the `start` and `end` indices both point to the first element. Then, we push an element into the queue by calling `push(1)`. The element `1` is then added to the position pointed to by `end`, and the `end` index is updated. Afterwards, we call `push(2)` to push another element into the queue, and finally call `pop()` to pop out the first element we have pushed. -![](/pics/circle_list.drawio.svg) +![](/pics/circle_list.drawio.webp) Now, let's take a look at another situation when we are close to the end of the array. At this point, `end` points to the position of the last element of the array. When we push an element, `end` cannot move forward, so we wrap it back to the beginning of the array. Then, we perform two `pop` operations. Similarly, when `start` exceeds the length of the array, it returns to the beginning of the list. -![](/pics/circle_list_back.drawio.svg) +![](/pics/circle_list_back.drawio.webp) With the above basic ideas in mind, we can easily define the `Queue` struct and implement the `push` operation as follows: @@ -180,9 +180,9 @@ fn push[T](self: LinkedList[T], value: T) -> LinkedList[T] { The following diagram is a simple demonstration. When we create a linked list by calling `make()`, both the `head` and `tail` are empty. When we push an element using `push(1)`, we create a new node and point both the `head` and `tail` to this node. When we push more elements, say `push(2)` and then `push(3)`, we need to update the `next` field of the current `tail` node to point to the new node. The `tail` node of the linked list should always point to the latest node. -![](/pics/linked_list.drawio.svg) +![](/pics/linked_list.drawio.webp) -![](/pics/linked_list_2.drawio.svg) +![](/pics/linked_list_2.drawio.webp) To get the length of the list, we can either record it in the struct as we did for circular queues, or we can use a naive recursive function to calculate it. diff --git a/docs/10-hash-maps-closures.md b/docs/10-hash-maps-closures.md index ac705dd..4a805db 100644 --- a/docs/10-hash-maps-closures.md +++ b/docs/10-hash-maps-closures.md @@ -44,7 +44,7 @@ Another approach is **open addressing** which does not change the type of the ar Let's start with direct addressing. When a hash/index collision occurs, store the data of the same index into some data structure like lists. For example, when adding 0 and 5 (with hash values of 0 and 5 respectively) into an array of length 5, both 0 and 5 mod length 5 will be 0 and are added into a list at index 0: -![](/pics/separate_chaining.drawio.svg) +![](/pics/separate_chaining.drawio.webp) For implementation, we'll define two additional data structures: 1) a key-value pair that enables convenient in-place value updates; and 2) a mutable list where a null value means an empty list, and otherwise the tuples are the head element plus the remaining list. Finally, let's define the hash map. It contains an array of lists of key-value pairs, and we dynamically maintain the length of the array and the number of key-value pairs. @@ -67,7 +67,7 @@ struct HT_bucket[K, V] { For the add/update operation, we first calculate the position to store the key based on its hash value. Then, we look up if the key already exists by traversing the list. If the key exists, we update the value, and if not we add the key-value pair. Similarly, we check the corresponding list and update it for the remove operation. -![height:200px](/pics/separate_chaining_op_en.drawio.svg) +![height:200px](/pics/separate_chaining_op_en.drawio.webp) The following code demonstrates adding and updating data. We first calculate the hash value of the key at line 2 with the hash interface specified in `K : Hash` at line 1. Then we find and traverse the corresponding data structure. We're using a mutable data structure with an infinite while loop at line 4. We break out of the loop if we find the key already exists or reach the end of the list. If the key is found, we update the data in place. Otherwise, we update the bucket to be the remaining list so the loop terminates. When we reach the end of the list and haven't found the key, we add a new pair of data at the end of the list. At last, we check if it needs resizing based on the current load factor. @@ -124,7 +124,7 @@ fn remove[K : Hash + Eq, V](map : HT_bucket[K, V], key : K) -> Unit { Let's continue with open addressing. Recall that linear probing is when a hash collision occurs, we keep incrementing the index to find the next empty slot to place the collided key. In the following example, we first add 0 whose hash value is 0 into slot 0. Then, we add 1 whose hash value is 1 into slot 1. Lastly, we add 5 whose hash value is 5, but it exceeds the range of indices and we use modulo to get 0 instead. In theory, we should store 5 in slot 0, but the slot was already taken. Therefore, we increment the index until we find the next empty slot which is slot 2 as slot 1 was also taken. Note that an invariant must be maintained throughout the program: there should be no empty slots between the original slot and the slot where the key-value pair is actually stored. This ensures we won't waste time traversing the whole hash map to check if some key-value pair already exists or not. Also, since we made sure there's no gap between the slots, we can exit the loop once the next empty slot is found. -![height:300px](/pics/open_address_en.drawio.svg) +![height:300px](/pics/open_address_en.drawio.webp) To implement open addressing, we will use an array with default values similar to the implementation of a circular queue introduced in the last lecture. Feel free to try and implement it using Option as well. Besides the array to store key-value pairs, we also have an array of boolean values to determine if the current slot is empty. As usual, we dynamically maintain the length of the array and the number of key-value pairs. @@ -184,7 +184,7 @@ The remove operation is more complicated. Recall that we have an invariant to ma A simple solution is to define a special state that marks a slot as "deleted" to ensure subsequent data can still be reached and found. Another solution is to check if any element from the slot of data removal to the next empty slot needs to move location so as to maintain the invariant. Here we demonstrate the simpler marking method, also known as "tombstone". -![height:320px](/pics/open_address_delete_en.drawio.svg) +![height:320px](/pics/open_address_delete_en.drawio.webp) We define a new `Status` enum consisting of `Empty`, `Occupied` and `Deleted`, and update the type of the occupied array from boolean value to Status. @@ -241,7 +241,7 @@ Next, let's introduce another implementation of open addressing: rearrange eleme First, we check element 5 and notice that 5 should be mapped to index 0, but is stored in the current slot to handle hash collision. Now that element 1 has been removed, the invariant no longer holds as there's an empty slot between indices 0 and 2. To solve this, we need to move element 5 forward to the index previously storing element 1. Then we check element 3 and it's in the slot it should be mapped to, so we do not move it. We encounter an empty slot after element 3. The elements after the empty spot won't be affected, so we stop checking. -![](/pics/rearrange_en.drawio.svg) +![](/pics/rearrange_en.drawio.webp) Let's look at another example as follows: we have an array of size 10, so a number that ends in *n* will be mapped to index *n* with modulo, like the index for element 0 is 0, for element 11 is 1, for element 13 is 3, etc. We will remove the data at index 1 and rearrange the elements in the hash map. We check the elements at index 1 to 5 and: @@ -249,7 +249,7 @@ We find element 11 should be stored at index 1 if there were no hash collision. Now, the invariant holds again: there should be no empty slots between the original slot and the slot where the key-value pair is actually stored. The detailed implementation is left as an exercise and feel free to give it a try! -![](/pics/rearrange_2_en.drawio.svg) +![](/pics/rearrange_2_en.drawio.webp) ## Closure diff --git a/docs/11-parser.md b/docs/11-parser.md index b9b9e55..9c59bd1 100644 --- a/docs/11-parser.md +++ b/docs/11-parser.md @@ -27,7 +27,7 @@ Whitespace = " " Let's take integers and the plus sign for examples. Each line in the lexical rules corresponds to a pattern-matching rule. Content within quotes means matching a string of the same content. Rule `a b` means matching rule `a` first, and if it succeeds, continue to pattern match rule `b`. Rule `a / b` means matching rule `a` or `b`, try matching `a` first, and then try matching rule `b` if it fails. Rule `*a ` with an asterisk in front refers to zero or more matches. Lastly, `%x` means matching a UTF-encoded character, where `x` indicates it's in hexadecimal. For example, `0x30` corresponds to the 48th character `0`, and it is `30` in hexadecimal. With this understanding, let's examine the definition rules. Plus is straightforward, representing the plus sign. Number corresponds to zero or a character from 1-9 followed by zero or more characters from 0-9. -![](/pics/lex_rail.drawio.svg) +![](/pics/lex_rail.drawio.webp) In MoonBit, we define tokens as enums, and tokens can be values containing integers or operators and parentheses. Whitespaces are simply discarded. @@ -183,7 +183,7 @@ expression =/ expression "+" expression / expression "-" expression expression =/ expression "*" expression / expression "/" expression ``` -![](/pics/ast-example.drawio.svg) +![](/pics/ast-example.drawio.webp) However, our syntax rules have some issues since it doesn't differentiate the precedence levels. For instance, `a + b * c` should be interpreted as `a` plus the product of `b` and `c`, but according to the current syntax rules, the sum of `a` and `b` multiplied by `c` is also valid, which introduces ambiguity. It also doesn't show associativity. Arithmetic operators should be left-associative, meaning `a + b + c` should be interpreted as `a` plus `b`, then adding `c`. However, the current syntax also allows adding `a` to the sum of `b` and `c`. So, we need to adjust the syntax rules for layering. diff --git a/docs/13-neural-network.md b/docs/13-neural-network.md index 6fcdf1d..b16c486 100644 --- a/docs/13-neural-network.md +++ b/docs/13-neural-network.md @@ -196,7 +196,7 @@ Machine learning is a vast and complex field, and the knowledge related to neura Neural networks are a subtype of machine learning. As the name suggests, they simulate the neural structure of the human brain. A classic neural network usually consists of multiple layers and interconnected neurons. A neuron typically has multiple inputs, a single output, and weights to calculate the output signal based on the input signals. A neuron typically activates once it reaches a certain threshold. -![](/pics/neural_network.drawio.svg) +![](/pics/neural_network.drawio.webp) The above diagram an illustration of a neural network. Each node represents a neuron. The yellow neuron receives inputs from the four neurons in the left layer and passes its output to the neurons in the right layer. diff --git a/docs/14-stack-machine.md b/docs/14-stack-machine.md index 49fd51f..3ccbe5a 100644 --- a/docs/14-stack-machine.md +++ b/docs/14-stack-machine.md @@ -89,7 +89,7 @@ Taking `1 + 2` as an example, we have a stack which is initially empty. The firs @immut/list.List::[ Const(I32(1)), Const(I32(2)), Add ] ``` -![](/pics/add.drawio.svg) +![](/pics/add.drawio.webp) #### Functions and Local Variables @@ -105,7 +105,7 @@ We should use the `Local_Get` instruction to get the values of `a` and `b` and p @immut/list.List::[ Local_Get("a"), Local_Get("b"), Add ] ``` -![](/pics/local.drawio.svg) +![](/pics/local.drawio.webp) To set the value of an local variable, we can use the `Local_Set` instruction. @@ -118,7 +118,7 @@ After the function `add` is defined, we can call it to perform some calculations @immut/list.Lists::[ Const(I32(1)), Const(I32(2)), Call("add") ] ``` -![](/pics/return.drawio.svg) +![](/pics/return.drawio.webp) #### Conditional Statements @@ -131,7 +131,7 @@ For conditional statements, as we introduced earlier, we use a 32-bit integer to ] ``` -![](/pics/if.drawio.svg) +![](/pics/if.drawio.webp) #### A Complete A + B Program @@ -286,7 +286,7 @@ fn evaluate(state : State, stdout : Buffer) -> Option[State] { } ``` -![](/pics/interp_add.drawio.svg) +![](/pics/interp_add.drawio.webp) For conditional statement, we need to take out the code of the corresponding branch from the stack and add it to the instruction queue. It should be noted that the stored instructions should not be not expanded, so we perform a mapping here. @@ -299,7 +299,7 @@ For conditional statement, we need to take out the code of the corresponding bra ).concat(tl)}) ``` -![](/pics/interp_if.drawio.svg) +![](/pics/interp_if.drawio.webp) Next is the function call. As we mentioned earlier, without external APIs, WebAssembly cannot perform input and output. To solve this problem, we specially handle the function calls for `print_int`. If a call is detected, we directly output its value to our cache. @@ -310,15 +310,15 @@ Next is the function call. As we mentioned earlier, without external APIs, WebAs } ``` -![](/pics/interp_print_int.drawio.svg) +![](/pics/interp_print_int.drawio.webp) For ordinary function calls, we need to save the current environment and then enter the new environment for the call. That is why we need to add the `EndOfFrame` instruction. In terms of data, we need to take a certain number of elements from the top of the current stack according to the number of function parameters to become the new function call environment. After that, we add a function stack on the stack, which stores the current environment variables. -![](/pics/interp_call.drawio.svg) +![](/pics/interp_call.drawio.webp) After execution, it should be encountering the control instruction to return the function at this time. We take out the elements from the top of the stack according to the number of return values stored in the instruction, clear the current environment, until the function stack that was previously stored. We restore the original environment from it, and then continue the calculation. -![](/pics/interp_end_call.drawio.svg) +![](/pics/interp_end_call.drawio.webp) ## Summary diff --git a/static/pics/add.drawio.svg b/static/pics/add.drawio.svg deleted file mode 100644 index 6875656..0000000 --- a/static/pics/add.drawio.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
……
Const(1)
1
……
Const(2)
1
2
……
Add
1 + 2
……
\ No newline at end of file diff --git a/static/pics/add.drawio.webp b/static/pics/add.drawio.webp new file mode 100644 index 0000000000000000000000000000000000000000..b69c17d2c2bb85e4ec473b8043802083f101258c GIT binary patch literal 4116 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 S`OoLS=oLcW>pw8Bo@W404i+o` literal 0 HcmV?d00001 diff --git a/static/pics/alias.drawio.svg b/static/pics/alias.drawio.svg deleted file mode 100644 index 8a8fa1c..0000000 --- a/static/pics/alias.drawio.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
x
x
val
val
1
1
alter(x, x)
alter(x, x)
a
a
init
init
b
b
x
x
val
val
10
10
alter(x, x)
alter(x, x)
a
a
init
init
b
b
x
x
val
val
20
20
alter(x, x)
alter(x, x)
a
a
init
init
b
b
a.val = 10
a.val = 10
b.val = 20
b.val = 20
Text is not SVG - cannot display
\ No newline at end of file diff --git a/static/pics/alias.drawio.webp b/static/pics/alias.drawio.webp new file mode 100644 index 0000000000000000000000000000000000000000..1e455b8e92b308f79c8f6ae852c5e99f96843a4e GIT binary patch literal 10404 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 Y*~=95^V}w!d>=$Le)^-2$WG$_0KzyTSpWb4 literal 0 HcmV?d00001 diff --git a/static/pics/ast-example.drawio.svg b/static/pics/ast-example.drawio.svg deleted file mode 100644 index e98c75d..0000000 --- a/static/pics/ast-example.drawio.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
1
1
+
+
-
-
1
1
5
5
1 + (1 - 5)
1 + (1 - 5)
*
*
-
-
5
5
1
1
5
5
(1 - 5) * 5
(1 - 5) * 5
Text is not SVG - cannot display
\ No newline at end of file diff --git a/static/pics/ast-example.drawio.webp b/static/pics/ast-example.drawio.webp new file mode 100644 index 0000000000000000000000000000000000000000..0056b3f1b685e8dab61764b47c744943958a88db GIT binary patch literal 3132 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 f7*I;Jc-s>u - - -
……
Const(1)
1
……
Const(2)
1
2
……
Call("add")
1
……
2
Function(1)
a
b
\ No newline at end of file diff --git a/static/pics/call.drawio.webp b/static/pics/call.drawio.webp new file mode 100644 index 0000000000000000000000000000000000000000..c4f4835963f735a09b2bc18ccbf911fbdab5970e GIT binary patch literal 6426 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 - - -
0
0
0
0
0
0
0
0
0
0
Start
Start
End
End
push(1)
push(1)
0
0
0
0
0
0
0
0
Start
Start
End
End
make()
make()
1
1
push(2)
push(2)
0
0
0
0
0
0
Start
Start
End
End
1
1
2
2
pop()
pop()
0
0
0
0
0
0
Start
Start
End
End
0
0
2
2
0
0
1
1
2
2
3
3
Text is not SVG - cannot display
\ No newline at end of file diff --git a/static/pics/circle_list.drawio.webp b/static/pics/circle_list.drawio.webp new file mode 100644 index 0000000000000000000000000000000000000000..b08f7493d14cc08207f2f3bf5dbe2f6c3e404357 GIT binary patch literal 5016 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 - - -
0
0
0
0
0
0
0
0
Start
Start
End
End
push(6)
push(6)
Start
Start
End
End
pop()
pop()
pop()
pop()
5
5
0
0
0
0
0
0
5
5
6
6
Start
Start
End
End
0
0
0
0
0
0
0
0
6
6
End
End
0
0
0
0
0
0
0
0
0
0
Start
Start
0
0
1
1
2
2
3
3
Text is not SVG - cannot display
\ No newline at end of file diff --git a/static/pics/circle_list_back.drawio.webp b/static/pics/circle_list_back.drawio.webp new file mode 100644 index 0000000000000000000000000000000000000000..6eedb4938ba28bb7e45aca2f995c707ba12b9f26 GIT binary patch literal 5074 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 - - -
……
Const(1)
1
……
Const(0)
0
……
……
0
Equal
IF
……
Const(0)
0
End
Result: I32
Param: _
……
0
\ No newline at end of file diff --git a/static/pics/if.drawio.webp b/static/pics/if.drawio.webp new file mode 100644 index 0000000000000000000000000000000000000000..025996f743d22f51435a4a6a65c55c9b0066d235 GIT binary patch literal 7910 zcmVRg2=bZ5%t^r$vNj7Z@%~c{r|sn&iylI=qSMpA`n1Lk2)-X2Rxtw z0XZAM06isxmTLh8l&GVmVsMg!gVg^_tPnEPnHmvm00|hu!cjo-fCKcP00*Fe!NRJb z&p5&r<1hfgvdQcp_Wv_sZQHiP0078j2jqIBkNaV^Z7+w5%Hwyl5Lwr$(CZQG1(+cq|0n^Sn-`^EZ;@2(m^oUax4YE?I5(N-(A-Ku#+ zEu+wllNRTpyA|6`>s%}I;Mc0wwp-QS^T-HxGq&~5BVE=?E6di`+_Q*Uw(Zu|JgOD7 z_KMxo)>xueRV()P-t+j|Y1OJ`?4()4_$CnBHYelcTe}t8>DDk}HEpB)&p}}$8E_8g zcN_))kTm=ML}?6KiBSgh9}*i$iX`XZGE?){ineXf9yf=N-h1!8_uhN&?eMsJ+y?Hwrrk?OuV_Ra6dWX;ihClQCS#+)5*nPI9n_zt{&Z#uX|Bv$5eg0yHd3gzVl-ZY zH=zX#p6ozD6^)RnW((;wLBi?5LcvBeG(FjY2dCqn;PEE3fK<^D8l0vh*vJY4fN1*v zS7cQxFbn{)P5-~OHrePu97d89Ns->sGYs6EZ^hcS<(8c8PMVpSnVFfHnVFfHnVFfH znVFfHNrgFa|Ns7bpH+MRyJ-Yfu4d3Oq*+In4$UDFUAd4u18AAWpc!VsF8YiioE&?H z6U~}AGiZ565OB;HLA#PovUKRkaB^l4W={4h8D?}WdjxHBY?vgDf|;2)QO$UI0_eib z=$M&FWd`_BacxfTC!$XkwfRU0P!TC$d{H!VaAQiNlU#XwL6W$6BB zyd}!-TbgCVvW@&@?8r-6P{s-$bX2B9wA}SA(4NXX&v1^oAT5ueWVH0;C(=OpxPvVI z@L8+y|M81OFAur7Jm<44T3PXf2E(^q*2#dxwM0r9J*h7O8OX2MJQr|mE%k?o?pt{) z3yNIE%;57`BNAM|$* z-T!CX9%1@Dy8f@ls^+>o%~v$m>XS^%GZ%^7PG+OsO?7qg-&A{Sjo_^!tMdfe>vys{ z_ujI#bcNXsWuvUeBgtsaD0k>h|3y`gAGl3)qf*b5i6UP(r=#7n9!t;f%5E?C7Z7Q-o2q*Ngtn|pB%`$_b(~51 zI+IEu!`w~7f`o9*<_aN!boT`c5OGX)p82s_PN1$UNbm0s6hiOZ_5q85D=^ zx4id1J~``mNoj~7+>2cKFHRP8Y?2)H3mVGv!nK$GP*rC>JIrD>!-IKZbfW-!XgIx! z6mFd%JsD|U4_JZOlG9C`pr? z39C->P#u(kIqs^KJUD9|<1gZ$Fe|uU<_X$(O;nz3M&*!Lc%`ADv92`MS?y&u-rZ`|5V5NpvS;_`B(wg}ftIR^jxqr_rYrzG|7ZV;djStP+mH7fxSFc{uvr-GZ8^T5d*IQr&{%hpv>)t* zV7s9RI2;E+fz<7P92cSmME*ZQEZMe12#_JQS;d?y3^m|l<{oMawxSLO$;)2OKKJE5 z|1EOTk1+I={bJ&44_+ei!j9e(5~^13i7;!6Jfi-j@20)7y4WML-wl#3^k_&E6198+ zLmTDDQm3`({q3(bbXuCTqlmI98-;2;c{9mX$WNBe;4f=WQr)|>P{ok<7#ipfju`v= z9?MNqP4cg)dc3~#I)aHdV(0eQh;RkwE;E6#&st^D>XSx^1xbFte+?d+Cc6)nDo63H zq&KWJDbDy^dKoif%j^liN~coZHwg=hz|~bx+ZBGFINJf?W29I^l-oXM8$!duu$YK< z@|}Xl(>pmUnaL0@N`C+|p4~Kj5>*`}0cTbH8r`*0BUjtr znI{-7uO{iKFlsDGb))#HCGpE&{*)hX@0wQAt}*&qLFylUMKwv^rv1tt5oD|am6gUk zlVi>QaRU+VLcVx?!Y^0$Nx?z28}DY{>aLr7vp68lJH2ue#&hyoZf-5V*|({l2;xK( zi*BC0J@EgFs;d78FR{^3cn)c*Ga}PS{f>Zb8eRaI?-7VG_<}SAZI|_E^*1^5Q_>sm zau?ZN%mIdDWm}5*E;Sr8WXmzz&O6>5XD-YvN#VT0@4d;K<2QAAjO!0Widk#asd9n> zRZHV(|J)kyO#AM!T*O?qMMPjjLdB7FV-ZQYhaM_-#o}&`M}VKa+i6FHUmwDG&+*c` zJ)g$XJH5%yOa{HSl%7gOo=pc9%0T6>s?UW}9J2Lt3H_=zl99~x1*<+<$RD48-mfW$ z+9Fb5YZP4;m4nU zXrfeH9Qxersm|unZYEsX++4H2tXZp7@cIOKsc|`+U3>1f%Wmo?w}l@_8{&zkY3)R| zUM^c50Ha;?2sRE!&5=y08CjZ^Ok|oH2jMD+zDL5mmzmlv%K?L)YbWkqM~I^0I)0T2!>QbKL=Mb>OK{vXo~Sf^6SvAp`&0yIusf!}O;|DEc11Yh z#^|LAv{Y3!O`hs;ygP-}-63HLqXwo_x&Qf$shiezRD(Bo?*F48t&Od4Bhx>5`z3|H z@_scOE&BNp`Wj;_ok%s|*J&y*^>P+wE~J&JanHQC*+MLd^SQgr4ktLoJ#($Nrs{XL zMfBs$IsOad5ZoNLLO3wTB8dG~BEhmHvDCEd{j`5N9NDZVjOQRe?J4kVJrPnaYVIh~ z{tt8o=Gi==vmk0CA{VC?8;dZX>lobsiuyh<)vk#b(s=w+ zzW2|^UiR1h-hxOk~7*5%ez&vTX3LKbc?cd-VWkQ11Ac8XHoK0R{ znr@d@SJJ266=XhlTQ%c*so1E^VWz6^FV%@6JWldj{%)i1y zsxz1aIw_;7M=K4LYezac!rR3u(w}O90G}{eJGyCkU0q?o>`hiJ`*PrS9PNnUsmHr@Svm@`(lJdKdIaoPv>Hza zrJy#I*IPHi+aIKk8^06Mwwi8Z<$DS6T-8^;n|LLly+DHz%yn1OAe$jjHcGNFndDO9 zWbT_9Ji%Rp!sE$=_|F%K-BJ~u{YP-*Sl@A~RE~zmci87s*}s`?dVlvaWGBw`V<@ z8j7$^x2-KryqnKcHT1_x08TNi=+A8u_=)OoX*r#&H}rjgF`q0ySN%5ApTp#PD^=uP zg&@#$_pd6Q0jH~ne>u?Hzqvno-|69-BrEpZ9ESFnuW03XF#v_}}r0E(F^hc9Pz-e2=L-CFw%$=JP0PM@rh1u(x-Cz!3MGL%O7JJ|bz373okQrBcsLG{3dH;Ysz61_&03 zy$zwYk;zr2*S-YBDz@KM>rsEbJOZ_5k54|vsB>E$sjjk$K3kl%<1$Ykh*(8_apfcW zRFkurmHnb3^I6tQ%VS*1a@t4d*q5{#E@~EeIkP`~Gg*4W;w<~Po9N(oPoqB`ePuJ(7GW;68`mF~1UfLApNpE!_xNs} z=xk9(qKdX2Iq;JzxRz8(H+jBgiX8h8gP`_fYQ-hqLMr3F?FEy+< zjJR}+?~hvKR9RcXMzDuV%`A1EE5DR3PFeMAu9KWC+G(&%7L zX2b_YZq@-XlDz7F&!{zti7AcbR=I_oW4w25h*^ZY~Q)K?^3+FfjD5nVCo6rCu8?RYT6vNf%Ky%D38i> zr#G5irE)Jn#! zRec*upBl-cQ-T`@)9XGq?xTWlY9#+GB)Kw*{xL?W0Of!zAZ=i}afr-VU#_NmK&(CA zDv-d&r%l%Iot1n`Z4|QZG_t&KXh6HrqaC4tJ#lSFxn=E!AVgl!uO34?XH#TW_fg&N z#7-DeuBk)cFzXnjxPV$gIyQxZ%Mh1uCuZtF=d{a%!&C5_N0$?#cRP*V`K18W(d2*0 zVS??~_q(5Ya5)1}%`?cQ^5A;KEA=X1wXRTT7V3RNRXaL%Sv@B5N95 zzN*gcozZRNTA3_6$q&vSqv~hwt`9q3a+m?^`dMFg>bSk}JKfwFp+S&x2iEU0wB*~d z`0BOiv0N?d+lkKX{oL(x16HwTY!jZY#`dz$06a>cTKY%lQp0 zGZ{O!=Gfs4JxZUP;@gn)iZwC9C8(wls(S_<_*P3I#k*nMz4}qrS)P{oM7$}CRP=4X zrV^t?@7%p7^8&IYIWbPcn#u|b6kqR)iMl#(tV_zH%NbgqYU$Db1(%3^c-8SKC7P-Z zqW50Z@rEcp`4NiBY6w_2-TFZhCxJgmmtZ$Gkkravt$CYmJw8F8MvyWEN(GmpCEt#) zjvFJ$_3cDYF6>(m?on!!Xb3Y(pOjYanqk*)O+Soow}RzZiKJGptWMIUyFYx)2W#rv zjv+E9hpus{x3jA(PV9*@kBBf(Hwelj^7%$tN>qhk>{< z)bhG?NzQ2l!RjFPl>tx+NJ#>#aT#jz?F>?Zmpg)u2lK?}$BM3(`_t{)Rl?^QW|Tf< zLTh^WMpM`l>?Q0&ow(IriQK9Cm4gqH@J7-d9ZkN8KSdfyZ!hLAhFMkft3tXhz1h*= z7S5WKUus`=+Vc%l^lToYv*H_Go}sdD#J$1V^*;54hMHa{G76v7{Nz(*j8Snwx*&`M z&^5RWG5K~h4Om5I>)ToPZ~J!HY~-1H82{h#Lnm6_fW)e6UtdBw(pjcg&Y-HdS|&lNe`42a zq>^u3(!t3=tVy&Ckn*V1(3>!wX)M*p)zBo8?L`;SYARI)1vq z1%SLVn=1c?NOqOn-(um(jK3gw{NsNT7f>-g-epM1w`0i*?EI6nLw!j1`xab4&c0-SjE3%z&Pz^}4VE{dEILt6m}=Q!5bH93rQc=^R&`*NtkSex zt48jWJNt!ReE~#aQAo2z=uZ!P+y<5!V#%oT1(F+S=FIm+SsQfkM|CTZRi_!>7cHd` z+~4Cn0WS$dL68&pNEsFiu0u(_9ar{A;JG^4<#MXG=j)3;qN=Yf1J#W?b9SF7A)~c& z?jT0#ley9A?6%Vsws>Wsrmy~A<3`L01YzcURTXVx{K(OK?mzq?N+5h(+CKX<)$xWS zYhQ8v8vuT_;}{P7h=Q}2&d%SZyAvzHJUIZ4fN0`QIK1guOdnvUAM{1R|68hhGasi? z&AgP0gsJN1e`N!YZwnFvfDLc-@vcKiz8!a70B;rTiPRBMoSa*@G1RPP8(Ng26=9u? zxq}#`k5JA}_EoiBEZXEuI)Xf_rNOKbA%c{9Wpb@-s`Cv;R0AU1RC4 z_3ec3b4E2R)qQqC{=~J1(5pIYoCM1JO>M_=OaD%_&vX`;LKIPYG&^|wqG8@fph@Tp zT=_riASB<83zqfms8cy80})%}R~_C`$?B!9HrCMZyKbHGsUzbSVw64^mG#>XWM;6P z6J@63%fM_bT9bFeuC4yhHA3_n>|B2LPj-Y8ITJjn-tVcA_Z5~EzGbz2{v{@uLwF(E zN{nY|5QyqaCkYc*TD0VB?>+B!+M*OY7_(bP71Q(9D_PfC?@_K}fzG zcY<&gibNk0g!RY?t2@YChAHxz!vjRba}6*`AE_S_Db#cyR*4oIivJ8!i)X>JRCBIO z#;rnU?$GL4&b05FWs0A%M0mf|?&WyRkabgHG*iEN4#eri7*KcybA)%(XZ{Kx>c&;= zcaiNmP~RQ+R9Lo0L`c3Jca8=h)hq;07Sh-YVM+-*ze>L&=DTc&54#2!rH|H6o3(#( zWXVe$f+NC@G2gq*7!jk@{`#)FaKEzJ(dis$@DA=Z zs(ksm+9M()-;O)0fkSGh<69mVN4I#eX(2~V{^2d<-#d2=FiIb>jlN_Gtfy>|2ROZ3 zZLj+vo(*qFcXTdDdPU3{UnOMPdZJaVj;Y60rzbxP{#Eg}ljTs!Yfkr>a8j<3Ve2+@ zM0s=3vAgM3ufRM1D*d@vi)V>4k4FAk;LaIjbFH5Z_m_((c|?Td+i~WdZ%5G{%Fcz< zLLU0cPlnqpXF9FrC4QO&t^r2rqjvwzDa#|3ksdxFoG|#%Q306xOgB?gSV_^uxW&*m z&sIYkBh>YVWr}yXVX7eyyB9#L%L>JMZuf#7?5M7Y3cty5LpK2MZ}Lvrt{TeMX)&bS z2|1bgd+x;}q9osrBkz1W>QpM~K5Y`xZNWdyYE|ik(os2RD%Iq}n}VlcSXF)L6Jau! z0HgF#%b7G?lPT`jC+Q(j?aR(_>$v^l2MJVbZuXexJ-ie5wX2_Uf-hD7dkw!o=JP6Y z2@GPo^vfe)vG-yiMw;DpeTL2 z6?}E;q2;_YjiVj;X&JvUu2V&2_0FmuiqINO{vqmmqoF&DreIYM$N=Zt5&WH-VwcA1 z0jqxLpv16LATZt0-#fF!(A(=65LH$6kjTroW3oXt6U&`n9>?4xFW-)3!?7Yzmv4sx zfjCgi>h;8ZK8;(FYMdul|18?DsBso;K$JO)HYAqhyew5+re#XhHvc3p%PQZF#Q#V1 z=G!sO1EqfT{o4Ms{bz%yPskOX-#3{0fagE|3YK5+M!(mi`I#3w2UAA?oq?%ifG)uA z^=N)N1&dc%e!;v3Kh_gUI>I8b-*T~zun6q8&<+-XjSNZ_8MK%07jcn6TLZVqptA{w zY<v4pu)-mWz?K0kW)ax3XSpl_TluV*MPSRG5nKcgo3mmTfi;dd+y1lt QXZz2lfpLzDqHp}10qF6!w*UYD literal 0 HcmV?d00001 diff --git a/static/pics/interp_add.drawio.svg b/static/pics/interp_add.drawio.svg deleted file mode 100644 index 18a6df4..0000000 --- a/static/pics/interp_add.drawio.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
Add
tail
rest
Instruction
Stack
i32(x)
i32(y)
tail
rest
Instruction
i32(x + y)
Stack
\ No newline at end of file diff --git a/static/pics/interp_add.drawio.webp b/static/pics/interp_add.drawio.webp new file mode 100644 index 0000000000000000000000000000000000000000..e6b74d669f0d6aa8bb6d9074994c3c6d74b179f2 GIT binary patch literal 5766 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�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 E0LeQ^kN^Mx literal 0 HcmV?d00001 diff --git a/static/pics/interp_call.drawio.svg b/static/pics/interp_call.drawio.svg deleted file mode 100644 index bd76476..0000000 --- a/static/pics/interp_call.drawio.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
Call
"add"
tail
rest
Instruction
Stack
i32(x)
i32(y)
Func
Instruction
Stack
rest
params/locals
params/locals
x      y
EndOfFrame
"add"
tail
\ No newline at end of file diff --git a/static/pics/interp_call.drawio.webp b/static/pics/interp_call.drawio.webp new file mode 100644 index 0000000000000000000000000000000000000000..c3c1c65e849bb1afd0e7c55c31f9aa734962565e GIT binary patch literal 9876 zcmZ8`1yCJ9)9v1iyE_DT*8sr+1b26Lg1cWJXmEFTcXtTx?iL_8gkS*zkMH~cSM};m zZSBtP&UT-f)2FJZS4CPvB8mn8G{1-{X(;i^LEihUTu=gl`uE_Lcq;3}qu8fjJ}?G5 z$S~F?)Si|V?Nae|0glzViCE%-M`k)R9I!I+cBuf%3o1pN0EHH|`Vi~!e0oL*^V($a z*6pO8{<=fx>mzEi`vY(D*Nx@gsoKf^za=#VJ@s5&rLq?p+8P}fG8~!zW>-<76{Ah6 zr6hO#ULN?FpTvqxMM8leC4iJK=8cILgNDHno#_ITu_mmP5HXSo30U!U&2x^Iq z<2nFVNG5k~Y&I;YC3@4W_G8aSErDP_WPO+~h%HCQ{GZ35L;{6Z!-)TOc46#4t>=JO z@3(+@yN#Cr=THc(GgLfuyBPWRd)3EMzZL82R&2EcUmOsCOptuY_6lUzCiqyMCr zswJLS+T^mmnX{3_absb$>Pb8MHK6;jE$?P4HqE|p`LjKos6z=@fuW7WKXUh0@vFaC7KIZ}m| z!(fl|ps(UI$xtbCRxmzkv!ZFP#V)z^NT-0^St(;#k@k#McRrcTaP&U#<1r`3I~!67 zg^OmZKdwIU-lm)Xdz;y?H`#Fey3vx&-;&r-Z}+L(bfZOE5^w(Pt#x_bC%5r!<}`h| zrG~6ksgq>A#jdkEFt5dqXbxrZ@L%@?5ygwMDYL|Wya?iX9^vaIbkmi=>%KV2x} z19U{1N!4HR;Q>U;w}3KEkEnttw6J)pFDgwQtCDDqE}Z6g&u{F8)iW|b)+j5bZ1 z4d>hJ`fDbx?vRei@qq3ArRL5U=bIe&iqz0a;y|ro98k)(i+lrOS_dt9Dm0y%KeP#f zCiL+}bY71YOq8BEop!De-<0uWo@B$I{I48|K+Ohde9l7gMx)wG!7oTx%ebQg1hjG#{|7YCo*vPnp{?P(`Q*) zP-K@RxgPBEorTSGfohjRDHi!8J?6u4@Kt8>N7)Rx2EjZ<=f8LvYd)MQ?X(-PZJaWx zJkKm2ofK|1YmlpfDkw!C(`o(wYXXGbOgU%$4$8K)L8dxc{SXN@rz=AR6wpi&DciS=WIH#=PZUIi%f9=`5G&=%9XM(0#wM^ zO<@+7Q~EU$JoW?Qh31&fm2WkgG=8O7; z9A6D8ZowL$?#>8xaXfL^l?~KUZg`z2OSY6i!&WJlsx$#nqQDxA$v9 zW~`Xknd%{$90&{KdG!gno3^FvGMlp3Kd9kJMK{ZJb9c8vPcx1&D1Y%C`l6skQteF+ zvnK<(^y2GW_K7WWBO>V^gv_K9(>vhMOAL!Z>mG9qFVdU(PNJNp%qt4b$zi4YSBb!7 zl=%1>jvA48BDorKzs#5OS9kBenn-K7o$Wy#klTO)WQC&(vhY~=oDaj?Sw71roW)peoJMmo`+6x(90) zw?0tIQ-E=eV%7|b@M$YiXQ-0=NCitmWD9StmkeDmd#;?!pSu!`N$@!rt(t$IcZQ|c zZI0}oX6qn8*jU854an5(6Us}!$wMUSW*C4a>aV_2ZxL|{IFCsQiC$*%w<>Wh`}e=P+6)UoEj9)jT*xH z&uM)n63h5786zl30ksUNG?bxc7-?5wxwz+h8ym|wLpKBk5?Wa;aL(@`3ke>;wp#yS zG&}jy4Y#B3t7yNyjY6lwGHMXBfVWwg?PyO`^qnyBIRD(~2LcZG2Ym7ZWv9)2S9R!T z){w1$c}{$j=3jPZDMXb>R5MfjR>77+#w1oc5m)Ns&(29u8%bQsV3LkBmaQ0+K%uR$ z_%T=nqapPGkS;`(h!I0L>4473eiaTiZO``O*HnODLhDK~TF;!Y;7JAn0xKhfkGN9w zyn0*i*bd#-NFmt3SUNupZeNW3B!r**<&m{eS?RgL8s^2*)R_w?VdLqe9_v8pm>ULoM?_Kjh}w6M>!0GQ zMWDh$f9!m8sMX|{t;__wj7hk4cj_ksS}-qlG!A@@V65dYdiC<%DSxDoF0Q{kxZ6Vk zgSXcF4{|%)cpAO&<{uhq%UA)C$2e|Lk7r32fCm_J$-L&i-~sB;CJlRba{>%SKHTv4oY7a(ceqU~2O8*J{ouanz}=?o zXd7|OwO9S&R-o&luFR#ZkTn>v%zXFX%AL+i79n`*wTsYzbt z#_*!ia%GeEwG{ISSzPr#uc9DY=F9DkrXh1rsiynKp}D2vsJlaXkc>m7lJ&9Xd8Uza z5e}SB)A25uW~Xy35fS*0<8OOMmF_q*Xbt>1{kU>D!vO*jru!DTDlU)4<+z@2?r7Yg zdH#5~DQQHKSJe+s+HZz^rX|F$E{`*N!eMXkojPc)R9y72*5tu}ZB^BmH&Q=p-{-$b z-}_?mP)e%}#q`U`Pu#zK-WicK%a+)dZJ(rXzzPo5v%u6wMB|LJSc@;lhivx8FKNx0 zq)@j99VXcFO=GrA!}bw!GW-_rs-W>@3o-TbmAQ^ z*hp`o&tYvO^7qSH>7LMiI{vuU*23X#GmoK>8UsxuUQAt&)4qVEpJ%e>j}^nUHCdZX zGY#rMV9p~Hd>#?jxYEA7Wy-;tCX&&^*eG%IH-eEvm5QOlL#i5Druwsqp6$ouCh|fp zHx(%Lc2elIyv~xZA^r1}Z73Z}|6iT`e1muYjNBqr=3-%>^s_S0OC(aD1y#VlD8#Em zYk3Due?b<#<3v6hlyu@IvOdBXxTuIOu!WyOHK8(e1C81@pU%;-p3&FVgk)|rp|ZZp z2?F4C8__ndWu?DBS}_0Qc{$#9Nb2vF{IN3eSi2UMhc<+TiK7joFAHt(g&jR#uj+x} z=usF|943UBz>9+4`)Y`HP$*PK^EpkI0#$^6VE&~uw68+LcW;=d zW_nZP{ri!Z0SRNLSXC<13ix(6#166wy-q@k%w4gRorLNuchSeW?%U%o$ ze)JYOU=xDEH1mcL2Xaj+R}VXu0@W15T}rfkw$(aD5OP&UXs|S64%00~=P_1~p!5C( zzfjio9;w^{zQcN#R^N)2tcCveT0-XQL-oFG5f&_q?n#MZ>qJOJ)!-?<)Dz*j2em0+ ztDG$bq|B9$7o9Y9;xx^0Qv?$VP1q<|Rd@DxIhAf!d+Ly{(~$8=FZ1M3OfD0JkO9M+%bNQ=zhf-g|R9cad=P`;M ze|Iue9n#WbAfU$2tlUzu9OH($^jjMu(PPPBAZMrw&5X0c=`+nSu|*irXQJTV6O}Nc zlm7B13@_QJN7b|&ICd@-!Q^Q)&xlUlN_pLSDkM3BQ0~4EE`y{jN!$|TeNWYWmZ&oq zb{#xtoQBF|8u`ihw{#062v3gyg#s}@N`wQk5(X3;V;1=HqKJYQ(bZ;tLhq(M@MP5$ z@nbkpJE&mtC4MN~8nDBW@>+QcgXg*k6mI%##wB9Ga}rp!!1)moaS_Sh{N|0IZsdpa zQ@+hNm3q7*$uoWo6B2R1Z&P{n=OW^3zCYV{x_Z{Euq~-5A{96#(<~|Q!@$7to)wPr zJsAMB)lZjH%3O$`6GW5~3Y;ObyS_&|elZ~}Aa1tFv^LwRiZ*SMnD4S^tA95zUh`N~MU*8Cnwym^DdQ^W} z?q{RdG?8&U5&Ns|(%pP6(pmF}x1O%sW5HrS^m$=d_qwxPc8WsY)EGaAt1fAd7rxUQgnt!7mq4!?iWYZ>I}+h|1N@c-g_?{VbHW;Wx7ih@6RJ zod;G#%gL=F4E&yV5Qtkc{=2jTL9V4Fza<6Y6W|1S3%p3)kqT@XY^gU#-CDibEe`y`4 z_n>Z*25MeQ7?bttM&Z zUxOwJ^z@%dUDFb`osgh{n1ks;4Il!K!IGvwFC4|nnm;H@ZvKM$yF{y;L8r>W=(-BC zUk^fOkPmbXBPwk0^woQSih(_tt#*0>~oA$Cp5Q&?_C!xX-V6O}~2Ju?T zSPicXVlawFmz(L7fUIb`L>6uq3xH9}^bqp0pqmOacj##v>md>RYGoVRgD3~u z&O)gowcK-6AxlrsObVavvf$tpmO0JOQiB*riEj?y(3{;|m2^BBbF_<83g#0YBPr&n zSv3(clq)tQOSpZloluqH#NDV;at7l|>_Wn&45;}f@v56C`dc3KM9{Yg~3K>hQw$7+VKeag_+o42Vh zibdB}L`tt$3H(#MZqK|X$jxHS(+A&q#uN&#b2ewYJ@bbf(6yvs|Brxm$}NFO znzvs6*m|uH4E~dH#IdK10cTiUgTK{O6#T+K-|l59+>5NL=Wm^STkGsm&zm>gh=4mR z_fk={Ut}B|5?nyob@%Oy)AW#geIwXr{>vZXb#WPMxJpeSe(i0GA(e=h&MCWTsqCuO zBYxU94+o>pzX_sOD1|opR?RtOI&?bKw8prR8V#F$|B&Dtm6|T6dX-z1nsj8LS+J|! zF+-5PR3?k>iOy9-;%SWrgD0$vGZ}IPyrXRwwF%$;G?5m!a_J-C&hr_}1cfN$=ZpMz zXe>op(4qr$j&cIwdF?#LZo((%D8m1Jw?C(AgT7r8>TXf}myL1`&=#=#2L6v52E@Um zlMBxT!h%v=OQHDl&z}P&=#<)&nkp!gmNCjTyfOV{#hV&a6f=2P56*`W{K72-PUcgbvp zfqo5iAyM1UMKy8npcwX>c(JWbxx_i0R}pW+GG>r?P=mEOe_|ec_jaRfNEGr%d0LFa zxd%OBzTvE3@e8a(WI3l=9V)ajzPk$Vra+cG>_UW_IH2DyglegYCt(jLI>!<*HM{M> zb_*E_DNx6_>z;{9TPT-Xh0R$0EuQp`8(rm0ycYmZXpznBUx*%Fe63lXFp01@C>P$1 z-Vb~^x%uiJ$XjqwPoq!Z=_p(b9FbMN|0Q2$m(-uD%lvNT@ zc;#E|MRR)Hc31f#4z2uB!k?R+^|c7k*Y7%wf~IPKX#eblOREsbGBlDKQvUr0Tdacx zYcTGhBi=;+tOPNr)0Iu?yS?N|IwWy2GFX-g7VSh|N7i}hT>m9N9Nb4DED^4Wb z4`v^U^gjx%cnX8FF{?Fg^$Ny8_0wyM(Skm2Pt1fB1Fc%z{uAk~Y8Z zd4yIab8gj#G5G@4a3?X6>Y~fTc=%nGuG3lD&k`3VLnJ-A-|hznZVktEX^ERPllI^G zvU8vSwk`bhb;Q~i_gJ)D*!ZdWWcja_yi8HiViAlH3R^K*^h(a=hO0aieG)X z1}O?coMZrsh4JHXYXxmBR@(>S{z+D&jx(U(o^|)Mqa@$5iNp3<+TjT^9Sw*7ftzuO z*m_nAw)CoQ+se4yzW1r|5GrPX=5be1Pvx0JIO>8agv1`)shqjY72jw`U;XDR8=^;= zsI}lxjyW~SBO#<`=U2fURNc-*^=m5+;SV*w;k+fk;_bN|WE3yyqZ!cT9DKbjUDWaF z@h4N}-4~>m;LEu5l-)X<7^5RRwhcGH?+pyz_ug3_{KAl{Ox*zaeF2WJn&@*a$6h$k zioY)Y-2m4@zl5*s^Lk)Adj8M$J-(8XT_Jleo8oHkn~oUTuNm0#dxoLm#UTaB#L8G1 zzbA{n?$f%!PG`T~nKf~x*@)eD-m`oKDrp)beQ)r8_zKNJQ%wkm@#no^c)L>cUndb-L+vm}&Bqip_1k18eERU`;!TM^yntSfX7 z#-zaBwD+U24eRKZJwqZeLCrDVZCr+*%s8xS zO19ofs(fog{yR3R2 zh}OYv2fOBy60RP#Nj9X_EAKhMec3mvlf8nR z@dPriZ*YUBtE}NpXGzf*@PEHC(vy1FslY_+lUCiz*-A@($XYhp#EYBNbyUSsAFNsc zogoedM()37JmDf0SrL=3Fq7^ieaW}1yNI^o#5Hve0eYG9;^}`?gKeUiygM9o6(z%y zSg<(hY?%AFDUvxT6?VX*3tS&+m2mzjz*R9&TQWIXiVrd%71JNence?aT^+A5UEG>F z4g#XZE0a#vq~$Sz-Q55Q?-N&tz*|d%(;}f z)$ea!_s?)_f({9s@oT-1lNuY}hR4zC7gJ)l1 zkjKjcKzr;`t*oWsOl`coamONVSw$OC!zhi3#1ua93GIN&ducfSk-a;osFz#1W@II0 z)u$d_7h^IP#R6Si($qbHakuu|w>0ehe@Mp!cdQ~HmQojCS4I3@NI@3rgQ5>{vFU0r zfYWQu{dTweo`TGg$k=W60vNIGwUW1gm!&+}?U)e#g^IGNU*q9*bOuQOlvGnc&MmF$ zn(V|%ewRJ=iRu_3s~bHt6xnpa8vXeb#-@WylR(dU#Q-jPGEJWzZo7{w z-WH10A2q#EPeu(~O*YKTSal-O;(w6YwY1N?h#sh99gz@(sS!(to=ATegyL{cV!GtZsJqPpu!E7qw9rWvGRnE=?Xn)dIt<8`gA@x7HR^ z#*{D_zlr06!oOp-9%;)sLj3_U&YYZodW{zuam zPjc*wC;3-M+{yP7Tu##!_$OP9H^lfCFP{-Rq;>>0OQBWp5O3(|LVZeOJSpop6m(4P z*c=eVeCE`Ux4)1akCr2x6L3|@E#xK>HVDTfD>}Qw?Yi7d%?#kLwt~-x#3~wM!X*s< zP%KG91N3$3Z&K0zV+RTShMVbjUyzCq0mb+bl30dnN@zVa#IRr$eXzb`6swW+A6$Bn zxLTE2WSHPt^ka}1Mg;ni;sT=(6+?m8xzyj$SiF50_y`6GAD~zdPIJ; zPP41Z28XY(kjR0=q8&5<(94nHP+JKkp~ralI17+Va)k=Zf~j)bnxUwF#aH#VNVb-c z^E7VTFf4>~MiqrVOqw&iy@=68CRoRWq$h>{mksoEqPz2c*?CdPorTksB*E%jR3 zLSZwmJHn&-_NYXXvf+MT>|#diFe(7q5RcZ7b6ebFpXdA7Woy?3{UPaq`kKr{$+iTB z>&&}7)zbkVKR3B55Kq#^rmZ`VN2ClKYxta@5IwfYD4Hh45i4qx8PXaByz0R$=ZWoc$*> zieEh5epxn6-DFfEQp)@A#2WT*!PK?@sx2@~&)E>q)>j1h@^dM*kWoO));_@*0bRH> z<%;v^o?XaB3ea`A@yT)cxAg!J7`*Pe142yk<9Q$f;wX21BCDOj=F#_4lEoO7pJ}sU zX7k&#hQCKR(8c(hi?ACBoN$*K_Ny!GgbSuI+suqIX!W1s?#5l`cS@!=rfJv5Q03er zp$MHgMf+HTKoA)oc66SZ4v5278q@_vWqNt4p0G(9QxsNReQ>uXg|W9Tyq@OTjBPT z475qDe9Kzx{EE8JTW=@~4iGY?KrTEBoU5BQ;T6HakL%0Ymj;>X=feP5Z)CNYUeSmu zU%nu&g9akIKZLK#obCshS$(l9x?q^({T5ZF$_@18!019nCc+ToPUUE+HsK|~z|SW$ zhrPHqD&9__kGu1goI*@*SnDed?QrnVDP^7-(cXi9}yU^lMnD>xl(!SNE3$rko=L) z)gAe$63V+~K<;4EMy(eM6=EFf92JweO5qm-?!3;Y`34*B66A`~J8o?r3C}WM{Kp|;c6SH^dE~?Hq zj-Mey&IY<1He~go;_T}X@CG-eH3_u`A|v1@9XfJ=yC~dKp}vzoYOyft*UuPZ!@q9IwC<+` z9>-B%?AB1Ew!}}tgfiKDmzr{k@vL^ARVDF*a`=hY%6%q*=Fcabhk}pU*mw zJncC%viG73C$_}v6C(gg9Qlv3cZ_3exf#mgA^A%``{WYFs9}K~m!xu5bYz6MTQ@wQ zjK@rl@Zs3kx$*Ik(G&pgU%oAivl?*5Q9}KNGwM0i&<9C6SN?|T)31?iFv`+s+THok zZu{*&(Mle{L1S<$+^YZipED&9dlegrFCAU+98BcGN^QB6AFaaW2J3Hi;w2^5k-vjK zSpD<(T@yHNu78VDp0JM+-PmRnZEcB1` - - -
Instruction
Stack
rest
Func
Instruction
Stack
rest
tail
params/locals
x      y
EndOfFrame
tail
params/locals
x + y
x + y
...
\ No newline at end of file diff --git a/static/pics/interp_end_call.drawio.webp b/static/pics/interp_end_call.drawio.webp new file mode 100644 index 0000000000000000000000000000000000000000..d76b0eed93a93fb3ea3eb9cd01fdda0f7db9e506 GIT binary patch literal 7632 zcmZX1RZ!eb^yLqCcXt>Zg1gJWBzSQ7fWak5a2ebK3>Ms-KyY_LkPzHGxDyB-V6*#w z*s9%I{m>7mPTzC-R@Z55u(I+94FKpX$!osX6oqvD+wfI3$7#E-dxMs3Qj#Wc}%RhmS#rM2(hF|HjH!g;=`@@lL<*wSV;6x z*zQ=GF@@qjzMM5`r8muYP0G>t*LpAc6(1^b9$R(g@f;|@AyXgTPlfYJZlNORn)`b` zMe92GSQ4|C^E(LJDE4bGot0(yk}90B@>%5fJ+0T*sLYO6+%;uw=0*Mm{vYSk zu;Z84xLuoD(2xJ8ApUoF(0!2<=e1Hyn$@%s73^7y;S`AxRb(v-J_Uy z5?>tV`bLR(&=L&1wnf)pQM`a8x!Ai#d^EemT9UiA)FdoR;0+CK!k2p%#ywQd|4s zjC1n`xJc~HJR#|3l%K7}?8e^&xfiR$etlZeNX&3W&5`mUa|+B8d@*x&-Bf0eEtyaPgJdRX~ojz99H$JJ2(d}nm0JJ-b;DnnVJ z(mHhC9(^9yDUCgqjl798*Q=iC)A}ZX>9a<|A4-=(by&C zO=*Q`4_5dM8uOErI$1}h$6F%>&&PnOm4}#7H`nz=C z`qtiU+0*%{*#3I5#dU&Z+Vg1z>#Xd4a|Z>u;nvcJPrm!LtQHUw{kl%XY43y~?u_|Y zWTrdgBc5A;pmic^fs6lsl8a8`tu6L%sI@(LxJls;IX@2)FE$?(xQZ`WVJKL+PG3wMt>lZRpj*RlcB$9 zn;`u%H$6-%WUhHL_S=)k{%@-aBm;!}CzthBi+yPf{B%h3e;z~+FO>O8H|u8Gj0OSE z`Q8fjprgsRGO?L=9>eX>22^C$UIDB8u@7f@=?A?;XT`+lN=|gS$5;LD9a9F;3hw%? z-Ec8qg~pLfq7#to*QpQz#z%3`Nu4`NZ5Hg{`vnnhr#93KJH!DhNgj{A1ehSC@}zXf zjr7PTMdYw(hrt1WKVUTKoS#k^CNU@_Yj8E}_zg*yOJ_BZunmdcH2OtF*tgD`2?Le_ zSU${{r!ehrAmoW4xF9GT#11?1^51k+Eo)~K2c~k>KD3NS9{t%*^++AGvvuDG%y1+) zX)-qJG`$GLcF^xKMa;L`5vn>>i5TylG}0v##92>wd`-?u=Uy)j8t^f`9)u&BFCH0m zZBpl9(+3|n1q$5lMI*&;sF&f$iC&!suHCLH9AQKsLt|BY_@K38N$fO0rb7DK!SP80 zlufHJ-V+@%T=%SJ9Gq8UfZBAv#KS?x_~@7Yn2+@m&nz3TS@e4)S2Kfj`C2mYe3*=s5>^Inr~p3O!{@N>9R6 zQyBAj#x~k=(X)7;P}R_7L~l6Ro_d7J*07`S5e&uR)C3MWr2;FoojnPlQ&4(uW!ZIk zv0=wgwvDnfbVT+?Ipal6`ixv5swUhdKd+0tN@_b^txRp%M>5Zhw-XRd( zv3F5&c;}_uf&uJobvVQ57|IMDhBxU&MkWo7HO`6_mmc&XP}V1Yw<)l%k6k(@xKcEa zr^N2q3rY8#n$Ln$27nN+xYKO>TeWdNv?!wSEI^T&{9WR?6_qUzprjcFugYp>2JFxS zJ}lF?!Wup?LUep3kIZI6!Z#Jv8@<=~_x#^j|utVwjO>5 zwbFb{pSP#uO{fK#p*``MMe$krZ=f#5&~FW=ZkG3t5a%v0-aHc+`aRI(7@RFYHdj(o zsMoj^fo-S<9l#X(ZB6Kby8HWL_k-6sb1Dx}#J08{T_YYeF^B_ziEhk^ zF?2f+=P^GPnupEuF9JkHXw&Qo^xO8tI|b{maBgiRSzfzDi|={KyqBGGTzuonK~4d9 z0=>-5zgN2Xh@}aO;)agm^SK&!p`O74x`A0cNPNl8c;UR}^jU&GsMm=95^(?6utsJn z43gmeytP_k;V}NG&_hGiQ6P$W5c9Km$va=(z53=&RHET+FS<4>I1qi1?KB@E>02=) zhf#e0#Rdy70_~Co)ND5pcwd(a>tN>@1+FVs3Y&FO)Gd@fU!%g7M$hTYTM8HOScjZj zOsms}m~D|?`H&R69?uAa({}ToTMS2t8J9etGyeh^!pI?`13t^X&Yd9&1M1keW^T_i zV4mK5mPBM2QA&gbOwGCXgF1|=@-nM>4ZLsJ>9 z+)J?t5KA$&jO)F4n`~a=fj(f7*U#02f z_!^MxdGt`*?2gKiQQwY6PTV-4$7egzs}v(w=+xRRBP`-9nx>7A%L~~|ASL#JpHgGf zs|gD}RIX`MAr(L>1F{Y)Qh~z~>wWxtmfR#dr0R4qU_$&)ISH;>5=6VyS-4?;c`57+ zhty^e2ORxl`tO8rnAG#F&*oNc3)ifLqJ?{lB)fvi_BT!1%9A4GS`yX3jdB9{r%)0; z{~Rj^4eCgKoe{R=!0jk~f>m#c(vTFa3^gFYytc;4@b8j13>lO>7SC{4HP`T}Pd*z? ztnrrY7b%Q>mu(NEq!Yqtvb;0&`wP+*$|@ah4kFLK`UJrN<1H|$v0iR%Qt!otzBpg) zzZtvDXt+5mM_#i##<8HT@$@ub?I-AST}2;|{7wz#(8zC#`U0oCQ1 z@7`Z(4*~;RfDBI$k2&h@I8)q(G1uog1kyA8a8}MR9OIz#HlQyrwDOVextVRSE`pI; zZ{PQ>_z4kUj(?8i^SV4(1Zoh(u0=UWa+Cqu5R!4>XT?7#*qZDV-yK`!i6VUwG&5&z zD_-(&9Ti#TI{m4tiJrpfrU?J+N?S=1^X#SJj*-R^c<9|c#oc-zii%n|T;n}FR&?*| z=grm}Tu97Arr);v^tvBWi+j%t;W$sW>MS_anQmyc@Ak;`vVHDqg{pMl-eMNM7`D;k z#cy~G z;U8GG5-s_Yz*u_wmg%8$z32Jn9{BT1x^Q@aj6R!b>3OP$-8PSqo-?#dsYxMm(Niw; z_Faa&O$~PJWc>j41zlkKV$%KBv-*Lh7OA{fUGh(KiK=Q`;FmC5>3D)bB1Dd&RBgjOFN2e zjxt;XiL+V|(?JnF*i>KBM_~|eOCKB@;yZn9I$!>!zScraPT)S_2SKH356d=BF+xtU zGQUHiSU3?D_1Jq9LRb}wF>z6Zbn;UOyt}PZ)=&QGMhGs8^>gD;X$o1b7}Hw0V4>3X zZ~#o@MDg3-*s|~%);~|b{|Ep|t%W#uSpd*BTJV$no6F|{2#I6T%Gi^RNcE(p2x~h$ zH@DZqSweyi-ZK3rRqsV9rP?N#di#I-nuc=pYA)d$@**;Q*6T95E!4w@t0(YUXdvC* z)w`%N9T8HI^>C3D{^)F*jz_Rgb|8~x^CE){tId2RqOcHnwdEhMdC{;8pZJ?Ugr5B% z6GI?;9n2_t?4jvG{E=Z*O{~i?c9$~_~HgR6r9CcU())1f@h_ZZm`!|VO2N{3r zXhYLMp5$N05-85-P_0vf(sw3$$#_X!2Dus9htu+9I|XQ@dV+b3*fV^E{^IW8GhqbT z53X}GO$@1(N6n;K=*gm+&q5|TC4=(ZkO8MC^<_H;bXI258|@mL`pnngIDBavFyZiq zqz;~MUcR3nXZr0&3Bt4?YGm{IM*RgiPr@Jh2`wZHrLpSUzpJ6+M(w|uJJKg)wG$p3 z>4JdGz0!TSU3C^bEBfbL^b7HjgqMki>Rg)k6EREVnWx)|; z!{9hSlR+~>tS~m- zqz4YLKK{pRtpLKZ$`0aiHX}5P{PAj>FXYNP=ySxX)k6I6Ih0rPh`f_s2`>$_i55&x z?1+j_Z?5C{G(0K%lq+$jGgKmY*2K%sGgDb>6zaKG!5ki`!z95?k{W6ciyTjEy}V5H z@lOwY*#6fRj|2O6E5}bi>7ohw*>9~Djfzg{Y((ah+v*IZOYnuS&E?W>C~GYBx`BV% z2{tuXBS@_ajoMPL1eeUbOfm7&BIwgZq2F%h=2BsmHFg7M-n&vum-+=b5$B;GeTxbeiEO4#m9vr6!*1bP4%-;47t4 zh6=TBs9TxJSm*f*l;p1|`8B%Zl4rwdjvG0p~cf zZRtd8VrG~bPiJKV`CR-Ud+aqnExrB|RhY9UJf-%Ww${vQrrA@fmLV0ztL2mDo&|XN zftqKpYe;F*TAVea)#QDsdQt~D)Ut-R`Halra$n8d>wvqjC)jaD{u9IQr>uv3VV4Da z_PApo69rI8QgvksYb3}}TCaRy!03Q=lFe;OAg!7;PAz)*n~Z%WgQNB?mcrp-_xSC#L52@+5s^ zBc-hqTA?BCUMND(kTL^YYmOR5OhGeHr8*J~4cyObhOUnY^>^*swRb4|?1ASz_bqEt zNrNODb~a2jFWCsX|A_ria;&J6(FUs?mam?lYFK~5uGe$%(?bo$H@C5nvjcccS+502 z-lTThWi(E6JH<#C(650T;P_ji1ExGn`{7H&IvSRxt6QrlPgKGasl8q2%0l4{vbWI+ zc~;h|5yRI-BgIK6W(eWAe&U;$EXI>JRKVp6R|;6qs&YH9{^<%=lH+A&T=yeP!f2#^ z!UTngQQFJXMMFD4>*FP&+t)_qFiLqtFT#Hzf!#zrG0*dwOj7|QAVEQ6s?mRL zkPb~CD899J3^1y*`J!?BSNtSUEkn9~pUu-yjpRoXf6DY@{@Bf$F2K0BvN6q&yh9*| zyDp{rXZptN8<{#h*q*ei7?i%QrJlUG@Po`NSoKD3ZvB%Uy4>Bl{@`vCS!E=J1xJ;Y zYPEAw@=rFh+s{8bMjkw*E0K|Zn`&Y~3tZnwaWwO2V|3^sqRNdLfpo+)AtnwJ4;PLg zlnoZ1{Rt8*fj!0|fRZ?lFr)tX9bJ3#=XpoTh{JuF@2pV|Nba8s(T8o^9> z(5`aQ3<1FFaU&LhSy=C{!6vz6%{*f6iiizT+e%dIPS+Mi0~#z+MV=$ay|B9=ep^=% zRGvRnCHoGyZkJ7gl7W+(J)Fc=7m##Z5!*+N7gEaiq&TrkG3tI>$O5BY1bTlQ!cTG0 zki1o#nZSz{2;gF z_8MB4iR1`*9+1??U;B&C4Fj-P)=*;?1igt-$CL~)$6<*P0AB}mvrVAyHo^xkLs67+ z$ecTxH)KVj(*@DYJYaNWpJ+07G4Yj|@6-9a!}htCkpolcYGbl+DW;qTJ55Ex3}!y^ zW1>vNjSzC`Ohu&t42g(sm%nMDS@`b^1wo84>ZE3o_KXRxZGDlDSjw(&#v&`O2KR71 z#7J3){tWsgj%ppTEcO2!XLwnMTegBo`8F~zo$cb!a171uz1&9hj#60|%SWT<3;wMN zR58{q!dnNl)UX_510%2?h?RxMT$}hVy&GXG2CC|Q84tj!XjzX8=`G4%oqr?a#|KPf z$i6Hp2H`~ai5{wWc2j5;?B=ztB`!hdLIz6;MJa|aUU%*e(rUb0+v0qWf(3c6!;rwz zl4Dcl&WexER|xH|$_}z2MW5SJ{XCE

DgYG3pclSU{{iLK*rYZ^XRjwBfDI|8lb{ z;ppLKDFf+F;v~Uyi*)vNnWU)cf-{tOy zYzC!EpTI)16X{E*T$CFQt~W2-Cji}p^h z>s@yICYipT2`kOSzYg0Rne+DU@H|QRLkFrynWoB8;ger?4ah2*8^^k9ZGALD`~{}< z=ZGbWLl8okr_5lJk)n5dAE%IO75DbmE5P~-Lu8JDvejoxQqUM9y`Ok{v$1a%MzkfO zcygwm24#Uh5JHP2j1R#`@~lIEVW9VXE|DH(s+xep?&M&zUn$u&PhtSr;i9qcD*_=U zCl86lXU8Z#)s2acn+M3-|vFg(L|jy|?6RA07a{HRjF z7k5~Ey~N5|`Wn#HvN-gxLjn#YJY#sF2{QR3EBb(G(Z0US&G?}-?Ld!f>#7>On07z0 z+}D3wegy;whj3riqP@#VPRZ2lZQTA_l{8syd1rJP9WqeEqp8c>%#w+Gxve4#f@4Po ztJcc*$4E1WS!PTv#S~fYtVW~pSi1cFjRpVnghYw|fCgTOk(nO*zK8&D?KKP4bMB$? zfRp95ztQg2qaSFve@pcNGk+1;5Sry^?2(Oekb%czS?`?6!f?R7A5EbNV+B;$WqQbt zLJnRj-V8j6T!sqT4@(ZGR-E_zVrxk^jTKvfPSiWCVsHtqGRF5F4oz|@l~36ZEMTEWOnAsyyt-waR#d3 zKUbWiu&KroT$2FYp8a+4YcdEXbNU%xkPYH(@w`o72;uyrdo}Oa7db4zr-%0f?3;;_ zu!X^Wmf&eQi?lf<8pZ5e9r<&loY#*Djx7>~0mKrXVy>}ZMTag5x2)vwY7V$(D4>eJ z+|eQ47v63V2*y@5&5`G2P$WGa600av=E5Zt8B2tp5ppOW-!*hz5XNWG1XyP>N~4~Z zP?4JzfTB-99c3;-I3y0=K%%nvu!>(;d|s!TSA<2>{1U|03+!Xc;+3mf(Yo&RnBWeK zGNb?{#$nvTY2pVR(e7HJd(#3{blI>XIM2|t92tTEyriA6zpXDQ)J}9nZ$kps-S?Lg zdyf5`Y(pcngYq}+ZGug%Ho2`lG;w@`9KMh?nXlHv|79Nmkz^o3Wfd1J$EAft)nA4; zBW^zsG_vhiageivqIm_979|SY+yV)Oaqnl#i#W-64@s~6ich7G9rMs6RmBl!lQ3Z4 zReLn)F98ZF3Ju2YW91JrqcgRaeM0Z^cTi%H^)+^VcY`Iw2?}jf{|z+i3G$fgqX06J zsx&EGgjv&_?Z~SOI1pZHx^oac@ahL`?qizczNd$|-}cxY)bxpE!;KYHg3`EXmJ!&4 zDO@GW2Z*yF%y>N1fOgqel1js0LPpQjCLI61&Qc)CVCh4g zp;C2SV59X6juQR$T$>YE^FYuGEEM5`xWzh*YYBn$V)GM|+b;TWCM%0R;3 me*D2}nrT*``?n*ZmJCF4;1{C(`$M~IJ1FjUQ~x~!@V@}prl3;* literal 0 HcmV?d00001 diff --git a/static/pics/interp_if.drawio.svg b/static/pics/interp_if.drawio.svg deleted file mode 100644 index 2516a82..0000000 --- a/static/pics/interp_if.drawio.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
If
tail
rest
Instruction
Stack
0
tail
rest
Instruction
Stack
Then
Else
Else
\ No newline at end of file diff --git a/static/pics/interp_if.drawio.webp b/static/pics/interp_if.drawio.webp new file mode 100644 index 0000000000000000000000000000000000000000..920a4fa2f5fd32aab4ebc6e8debdf1b75fee7a7f GIT binary patch literal 4246 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 literal 0 HcmV?d00001 diff --git a/static/pics/interp_print_int.drawio.svg b/static/pics/interp_print_int.drawio.svg deleted file mode 100644 index 58c19bc..0000000 --- a/static/pics/interp_print_int.drawio.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
Call
"print-int"
tail
rest
Instruction
Stack
i32(x)
tail
rest
Instruction
Stack
x
Buffer
...
\ No newline at end of file diff --git a/static/pics/interp_print_int.drawio.webp b/static/pics/interp_print_int.drawio.webp new file mode 100644 index 0000000000000000000000000000000000000000..3f04cb65fc4aa368c420c69e0b1badd121bb7b0a GIT binary patch literal 5834 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 UBvvi3)}0a+ewo?*H=Az)0M;a_hX4Qo literal 0 HcmV?d00001 diff --git a/static/pics/lex_rail.drawio.svg b/static/pics/lex_rail.drawio.svg deleted file mode 100644 index 6e5d591..0000000 --- a/static/pics/lex_rail.drawio.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
"+"
"+"
"0"
"0"
"1"-"9"
"1"-"9"
"0"-"9"
"0"-"9"
Text is not SVG - cannot display
\ No newline at end of file diff --git a/static/pics/lex_rail.drawio.webp b/static/pics/lex_rail.drawio.webp new file mode 100644 index 0000000000000000000000000000000000000000..6ca90138a6ca3f433bb28488cbaa3de9947b26ad GIT binary patch literal 4006 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 MXQv<6bMikHLW8cZkpKVy literal 0 HcmV?d00001 diff --git a/static/pics/linked_list.drawio.svg b/static/pics/linked_list.drawio.svg deleted file mode 100644 index 3f504fa..0000000 --- a/static/pics/linked_list.drawio.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
head
head
tail
tail
None
None
None
None
LinkedList
LinkedList
make()
make()
list.push(1)
list.push(1)
head
head
tail
tail
Some
Some
Some
Some
LinkedList
LinkedList
val
val
next
next
1
1
None
None
Node
Node
Text is not SVG - cannot display
\ No newline at end of file diff --git a/static/pics/linked_list.drawio.webp b/static/pics/linked_list.drawio.webp new file mode 100644 index 0000000000000000000000000000000000000000..0bc4900f3446c6c09c02061839a95a5a218bdcce GIT binary patch literal 5200 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 KWqlFipL_tWDmj1v literal 0 HcmV?d00001 diff --git a/static/pics/linked_list_2.drawio.svg b/static/pics/linked_list_2.drawio.svg deleted file mode 100644 index c081eb5..0000000 --- a/static/pics/linked_list_2.drawio.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
list.push(2).push(3)
list.push(2).push(3)
head
head
tail
tail
Some
Some
Some
Some
LinkedList
LinkedList
val
val
next
next
1
1
None
None
Node
Node
head
head
tail
tail
Some
Some
Some
Some
LinkedList
LinkedList
val
val
next
next
1
1
Some
Some
Node
Node
val
val
next
next
2
2
Some
Some
Node
Node
val
val
next
next
3
3
None
None
Node
Node
Text is not SVG - cannot display
\ No newline at end of file diff --git a/static/pics/linked_list_2.drawio.webp b/static/pics/linked_list_2.drawio.webp new file mode 100644 index 0000000000000000000000000000000000000000..c18f0e67dda7c962036d793700bbc591a06da91e GIT binary patch literal 8296 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 I^xzNtA21SVz5oCK literal 0 HcmV?d00001 diff --git a/static/pics/local.drawio.svg b/static/pics/local.drawio.svg deleted file mode 100644 index 8dd69e4..0000000 --- a/static/pics/local.drawio.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
……
Local_Get("a")
1
……
Local_Get("b")
1
2
……
Add
1 + 2
……
1
a
b
2
\ No newline at end of file diff --git a/static/pics/local.drawio.webp b/static/pics/local.drawio.webp new file mode 100644 index 0000000000000000000000000000000000000000..09d2fc383ebe3d73e89d9452771d3d6bd38cb90a GIT binary patch literal 5668 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 K?LRPAk23)0d{)K) literal 0 HcmV?d00001 diff --git a/static/pics/neural_network.drawio.svg b/static/pics/neural_network.drawio.svg deleted file mode 100644 index ecaf342..0000000 --- a/static/pics/neural_network.drawio.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/static/pics/neural_network.drawio.webp b/static/pics/neural_network.drawio.webp new file mode 100644 index 0000000000000000000000000000000000000000..ca5c4b250cfece0ff6f20319ac74df86d96578ca GIT binary patch literal 20836 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 literal 0 HcmV?d00001 diff --git a/static/pics/open_address.drawio.svg b/static/pics/open_address.drawio.svg deleted file mode 100644 index 4432f64..0000000 --- a/static/pics/open_address.drawio.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
0
0
键:0;哈希值:0;索引:0≡0 (mod 5)
键:0;哈希值:0;索引:0≡0 (mod 5)
0
0
1
1
键:1;哈希值:1;索引:1≡1 (mod 5)
键:1;哈希值:1;索引:1≡1 (mod 5)
0
0
1
1
键:5;哈希值:5;索引:5≡0 (mod 5)
键:5;哈希值:5;索引:5≡0 (mod 5)
5
5
Text is not SVG - cannot display
\ No newline at end of file diff --git a/static/pics/open_address.drawio.webp b/static/pics/open_address.drawio.webp new file mode 100644 index 0000000000000000000000000000000000000000..94b2421a4abcad2bab696a9ae0b3dcbfaf868773 GIT binary patch literal 7102 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 AH2?qr literal 0 HcmV?d00001 diff --git a/static/pics/open_address_delete.drawio.svg b/static/pics/open_address_delete.drawio.svg deleted file mode 100644 index 08ceb2d..0000000 --- a/static/pics/open_address_delete.drawio.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
0, 5
0, 5
1
1
3
3
0
0
1
1
5
5
3
3
理想情况
理想情况
实际情况
实际情况
依次添加:0, 1, 5, 3
依次添加:0, 1, 5, 3
删除 1 后
删除 1 后
0
0
5
5
3
3
方案1:“墓碑”
方案1:“墓碑”
0
0
已删除
已删除
5
5
3
3
方案2:重新移动
方案2:重新移动
0
0
5
5
3
3
Text is not SVG - cannot display
\ No newline at end of file diff --git a/static/pics/open_address_delete.drawio.webp b/static/pics/open_address_delete.drawio.webp new file mode 100644 index 0000000000000000000000000000000000000000..9d32d52edfeba578f2882163e47a02fe82ce1cdb GIT binary patch literal 15822 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 D40c6< literal 0 HcmV?d00001 diff --git a/static/pics/open_address_delete_en.drawio.svg b/static/pics/open_address_delete_en.drawio.svg deleted file mode 100644 index 5887436..0000000 --- a/static/pics/open_address_delete_en.drawio.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
0, 5
0, 5
1
1
3
3
0
0
1
1
5
5
3
3
Ideally
Ideally
Actually
Actually
Add Sequentially:0, 1, 5, 3
Add Sequentially:0, 1, 5, 3
After Deleting 1
After Deleting...
0
0
5
5
3
3
Option 1: "Tombstone"
Option 1: "Tombstone"
0
0
deleted
deleted
5
5
3
3
Option 2: Move Element
Option 2: Move Element
0
0
5
5
3
3
Text is not SVG - cannot display
\ No newline at end of file diff --git a/static/pics/open_address_delete_en.drawio.webp b/static/pics/open_address_delete_en.drawio.webp new file mode 100644 index 0000000000000000000000000000000000000000..1101e47da9c2933775848b05a58a2fb4679aa8d4 GIT binary patch literal 16478 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 - - -
0
key: 0;  hash: 0;  index: 0≡0 (mod 5)
0
1
key: 1;  hash: 1;  index: 1≡1 (mod 5)
0
1
key: 5;  hash: 5;  index: 5≡0 (mod 5)
5
\ No newline at end of file diff --git a/static/pics/open_address_en.drawio.webp b/static/pics/open_address_en.drawio.webp new file mode 100644 index 0000000000000000000000000000000000000000..4abbea84ebe7022c65e979e199ce015e11a35a93 GIT binary patch literal 6258 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 OHM)Y`X0Pp2-2Vexo)Gu| literal 0 HcmV?d00001 diff --git a/static/pics/open_address_reallocate.drawio.svg b/static/pics/open_address_reallocate.drawio.svg deleted file mode 100644 index b29362e..0000000 --- a/static/pics/open_address_reallocate.drawio.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
i
i
j
j
h
h
•••
•••
•••
•••
•••
•••
•••
•••
•••
•••
无空位
无空位
i
i
j
j
h
h
•••
•••
•••
•••
•••
•••
•••
•••
•••
•••
一个空位:i
一个空位:i
Text is not SVG - cannot display
\ No newline at end of file diff --git a/static/pics/open_address_reallocate.drawio.webp b/static/pics/open_address_reallocate.drawio.webp new file mode 100644 index 0000000000000000000000000000000000000000..737f9d87adf9c4e3a92f5f355759e9b4721b7b32 GIT binary patch literal 6996 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 literal 0 HcmV?d00001 diff --git a/static/pics/open_address_reallocate_en.drawio.svg b/static/pics/open_address_reallocate_en.drawio.svg deleted file mode 100644 index 9f930bb..0000000 --- a/static/pics/open_address_reallocate_en.drawio.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
i
i
j
j
h
h
•••
•••
•••
•••
•••
•••
•••
•••
•••
•••
No Empty Spot
No Empty Spot
i
i
j
j
h
h
•••
•••
•••
•••
•••
•••
•••
•••
•••
•••
Empty Spot: i
Empty Spot: i
Text is not SVG - cannot display
\ No newline at end of file diff --git a/static/pics/open_address_reallocate_en.drawio.webp b/static/pics/open_address_reallocate_en.drawio.webp new file mode 100644 index 0000000000000000000000000000000000000000..e449bdf594e5750266b30ec1851cd7925ee6448b GIT binary patch literal 7888 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 literal 0 HcmV?d00001 diff --git a/static/pics/rearrange.drawio.svg b/static/pics/rearrange.drawio.svg deleted file mode 100644 index 1636dcc..0000000 --- a/static/pics/rearrange.drawio.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
0
0
5
5
3
3
依次添加:0, 1, 5, 3,并删除1
依次添加:0, 1, 5, 3,并删除1
检查5并移动
检查5并移动
0
0
5
5
3
3
0
0
5
5
3
3
检查3
检查3
需要检查不变性
需要检查不变性
Text is not SVG - cannot display
\ No newline at end of file diff --git a/static/pics/rearrange.drawio.webp b/static/pics/rearrange.drawio.webp new file mode 100644 index 0000000000000000000000000000000000000000..645c6dfd23bc0bfd15a21de3a62920367fb0f9b5 GIT binary patch literal 13962 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 Ryzkq|n>3DcW+}x1{}&#vP{;rP literal 0 HcmV?d00001 diff --git a/static/pics/rearrange_2.drawio.svg b/static/pics/rearrange_2.drawio.svg deleted file mode 100644 index b13e712..0000000 --- a/static/pics/rearrange_2.drawio.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
0
0
1
1
11
11
3
3
21
21
初始状态
初始状态
13
13
27
27
0
0
11
11
3
3
21
21
13
13
27
27
检查11
检查11
0
0
11
11
3
3
21
21
13
13
27
27
检查3
检查3
0
0
11
11
3
3
21
21
13
13
27
27
检查21
检查21
0
0
11
11
21
21
3
3
13
13
27
27
检查13
检查13
0
0
11
11
21
21
3
3
13
13
27
27
Text is not SVG - cannot display
\ No newline at end of file diff --git a/static/pics/rearrange_2.drawio.webp b/static/pics/rearrange_2.drawio.webp new file mode 100644 index 0000000000000000000000000000000000000000..ae3b33aebb3a78ca190751e5a0d4e817d3ad8e4e GIT binary patch literal 18600 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

ls$tM*hnoY&w>v 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 - - -
0
0
1
1
11
11
3
3
21
21
Initial State
Initial State
13
13
27
27
0
0
11
11
3
3
21
21
13
13
27
27
Check 11
Check 11
0
0
11
11
3
3
21
21
13
13
27
27
Check 3
Check 3
0
0
11
11
3
3
21
21
13
13
27
27
Check 21
Check 21
0
0
11
11
21
21
3
3
13
13
27
27
Check 13
Check 13
0
0
11
11
21
21
3
3
13
13
27
27
Text is not SVG - cannot display
\ No newline at end of file diff --git a/static/pics/rearrange_2_en.drawio.webp b/static/pics/rearrange_2_en.drawio.webp new file mode 100644 index 0000000000000000000000000000000000000000..3e6e3154cc0b6ec3cf0e656f195b9abcc2fc0114 GIT binary patch literal 18498 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
-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 F0RWv~tB(Kx literal 0 HcmV?d00001 diff --git a/static/pics/rearrange_en.drawio.svg b/static/pics/rearrange_en.drawio.svg deleted file mode 100644 index 8045aa9..0000000 --- a/static/pics/rearrange_en.drawio.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
0
5
3
Add 0, 1, 5, 3 sequentially, then delete 1
Check 5 and move it
0
5
3
0
5
3
Check 3
Need to check invariant
\ No newline at end of file diff --git a/static/pics/rearrange_en.drawio.webp b/static/pics/rearrange_en.drawio.webp new file mode 100644 index 0000000000000000000000000000000000000000..04042e4c5d84d9553a84f8072e70950f1497e892 GIT binary patch literal 14188 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 vUPVd)w3&x20 - - -
1
1
var x = 1
var x = 1
x = 2
x = 2
x
x
2
2
x
x
let ref = { val : 1 }
let ref = { val : 1...
ref.val = 10
ref.val = 10
ref
ref
ref
ref
1
1
10
10
val
val
val
val
mut ref = { val : 1 }
mut ref = { val : 1...
ref = { val : 10 }
ref = { val : 1...
ref
ref
ref
ref
1
1
1
1
val
val
val
val
10
10
val
val
Text is not SVG - cannot display
\ No newline at end of file diff --git a/static/pics/ref.drawio.webp b/static/pics/ref.drawio.webp new file mode 100644 index 0000000000000000000000000000000000000000..9ae822af6dd60b333d2c71f78cf56a07781efdb3 GIT binary patch literal 10746 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 - - -
……
3
Function(1)
Return
……
3
1
2
a
b
\ No newline at end of file diff --git a/static/pics/return.drawio.webp b/static/pics/return.drawio.webp new file mode 100644 index 0000000000000000000000000000000000000000..8ac01601d3f9b64e5cf4c4412684769dd8da196c GIT binary patch literal 2868 zcmV-43(NFUNk&F23jhFDMM6+kP&iB=3jhEw%mFe06^G)sZ5(<3wNtO(FCr#@peFP- zEPD#9U&%3RrNAHrMR>66JQ^P4G?$zw(eVUmJL$*M$LannPR=s6tqmCO zKwR3Tlh!Dwic{J<;G|K|wvikA_V(iN5CZ^6+vNW%b{DS0;({0Y@5qrPM~S@Q*E`?= zkr*!ry(KaQaoCDj!g$kX#jqVLzkcd$){+=4>CAjaBc$RsBUPAktkEP|U@zuaeJo~h z10@ImQMYV@1#iXQ=t8AUwAJ=CQ2lWb(=cX^*Dd~%-qPT+LbyTK(4>e+mr#{y(_2B? zNB+d&#SNg_f5Ar$Q&ilX#MGj_7vShrweARATOyiD?qXM5pWMvH+VE%ac`v3Y2-REG6L82srNi#C^ zDvem*DK)J-?RCa^NMNn==a38 zWka3pRGY!2rz)M}bs9cZ$nhBw^CmBn7*#~1N`s3dq~cH9tnLJ`V0(c@{JQGyD?`6sWyCfb>oBOreDBe?{wq$!)&DU_=*|{=e3Rl>Ukq35R0g$tbg_}?d~=XchI>>E^}$ zg}DA~As-`l2>V(;qqTO~%cA5Y{$>4K39GBpXAbME$is{NsoyP3;g<9>n$RV~}oC1SFtkaiSci56G z|AcPrvee5s%lPhdZ})xMEDnFx|4z^wE}PL+VT2Cb8m=@jVbkbBrs^6RJ>bml=64===vY|IDIaEC?$uS`Z zdnDGTL&ZjelC9LKJ#=P|LS`xhdmXe@2I3^{7P!x!H`FV@MrTgty7IAuH&4XRC%A=2M|+j_@8_*(yin^X8bmbi!MikwOY-S2Q>-mf$n z@VVy#h{(}bopc}m`TcA+<6GK!%QyeOba-^WdCVpv5^Op))>8RcTO{T+7=1(oQbP7Q zICl6(C8x#j+IvP1|AVyYkkVh13Zr!2erVOebHD%e7c@SjT#o{WU+^tGh1@rte$QST{=z{@8hu6D&&Jisv{?WO4R?&e;{& zPH6)k@IAP902XrS&!e!PAIj2J-z{7(Q0j&PoqPumYxod1bbFEhW79p0!a zUE3XbL-=O$Ev`*T;;*3Da40NL%G9_dI-)wo?y zXkMFU;SNJJKB6~2;c+Pk8ewW*pNP#@%BP&q4?%VD6+C6Qf_+zP8`j-Jvm-g3WR`t6A%E<*zF^Iv4?W5UZS|sZrb>{*|i%e zN1O6V!)UUg)2|=isR)kwKID@O_%T5`zhzs%`a?q-fFG@)m73SZ0zl1))5!^HV5W;i z?oCaL0C950H6rI;%Q_-2vDmZ@E{&O;0@+l;eLcJOBROi58#fzG0akjnQ#$!fda`r> z1Jd3HJJy>t7&|SJMu?T%Y;Q~NzeTTh9&kW!5AGZG(5EXkpFHiD;m=y4<=zM727}H= zRGDNtA4zH;t$fe#&mA=%zC($$2uUpJ@UWtB4+)*PKtzZju7x9RuNL09XxeCA=N?I; zM1ZQj`gvbYc4|zU#yo*><)2b(`a#uJ^vl7{gOOL*`MOH>WGGJ4dK|$14^P3(BHiNg zQ+du6kyd{P$gF=62^ta7kiGHDD&l1T&2fNKUJEO_C4r7 z*j#T-(n-n!&Bwy8=(AM%QYhe6ebReCF%t%A~(1 zyq|S@zi#IVj_=Be*VnR`@1!3`eMOo7KU8G;&tTX)ya)U5VE>i)tJ}vP@7`|l#~<&` zVFd4LpB@V&99(O685|%Y@+!2WeR?dAHXYRRy+Jq|jnfmIT(cT0;=9>3tFa - - -
0
0
5
5
Text is not SVG - cannot display
\ No newline at end of file diff --git a/static/pics/separate_chaining.drawio.webp b/static/pics/separate_chaining.drawio.webp new file mode 100644 index 0000000000000000000000000000000000000000..478639fe1e5f1739168cb987bb862d8ed35338bc GIT binary patch literal 1292 zcmV+n1@rn+Nk&El1pok7MM6+kP&iEY1ONapkO4dZ1vPBjjyKXX__Z9{wr$(CZQDl1 zwr$(?OpQs0)gY*XNqQZ}^lR3;c~^<(zazGh6v+d%$Bc__QINv#t+;=;!{a}X|2+Qt zA8`sdd%P)!0mUfOWx8T8rjQgy)ksl{Fs1zJM}uOdVuUe;Mhc@+q&Acy6NN%#;!ucm z5z3IRLK(8+`LE7bRE3x>6;6VPz^xie5T=GFArZLM+~EGRfJe`Wad8=3D0 z`rX|QkN-UW`+s)&6Q{zILTHmDBFVa$)j?E#$vmWQ3aRc?29u?T0YcKs4prbtCuadx zNJUj}S5i6vA|%NNMX+9KqA6MBsv;OG?X^nFCPmO+25QxnrHY`NjMr){vlT&K8LCxJ z7AS&|(nYJBtWg9jq>)x0Iim4 zl@m3kP^>zPhk1}qM5NR!l^9cLIXq*|1&4x+%lG)t<3Er8{=EGSy&m`fUT+(n$Nz1k z`;Y#%(Ruvm@t-Fsp^~W7PzE>E!#3$^(3B`;Fh%C8#@-#}kZLF|&v@r!QVD5fPCAj~ z4ZW0sNknqDsPm0{ds7uWm82` zU1f|S=qO_};`7T9MX+DK_W@WUnJtRISwp@byK89^Np@BpHch%q5)qNC=Tu@$<*N-- zXP>bs$f#qF|2+P43w_Zil-QrZyXQZf<=zLQMXxs!rw;|gE&nLzuP5##dOugwx}A@9 zTj+j%6=Ez9OI)Jk zVRB$?rM*G1#UX|-Q8w(vK+{mH(eBFL30`kr+WTd(HRDe_&%VKdbNn>tq)Su4KB(V} z3h}-(_jQfy+x{t7%2f^kCe7uHADvgiN4+bXPB(nCUpM@OPxdW!4{MIc>{Gq3JnbHS~EUjG>)dK38ecKGbc6pOz)LUX*J?z}6i zy(LwNFTysRsl>zZ_`>mi#lG?nJkWymi|y-hOLWv@ao9UfOytBgyvvRTcC4ULWVx3t z+N2Q@gI`KBbew+(ruPQw-2wXdI|5!UA^OVd;}a>vy&;<8o$3zxG-7f?33lpuSZo$$ zph$w5-p#O<-uu=KkuHLD_3kc;UmH{R8s&p+aAcDCn6o0VX(dXF!;J>oJZ2o>;k2?Sj C`+?Q~ literal 0 HcmV?d00001 diff --git a/static/pics/separate_chaining_op.drawio.svg b/static/pics/separate_chaining_op.drawio.svg deleted file mode 100644 index bfd3122..0000000 --- a/static/pics/separate_chaining_op.drawio.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
0
0
3
3
1. 计算对应数组索引
1. 计算对应数组索引
4
4
9
9
2.遍历对应数据结构
2.遍历对应数据结构
Text is not SVG - cannot display
\ No newline at end of file diff --git a/static/pics/separate_chaining_op.drawio.webp b/static/pics/separate_chaining_op.drawio.webp new file mode 100644 index 0000000000000000000000000000000000000000..6e1e293c1e57b07fddc74b3967d7b0eb029d23fb GIT binary patch literal 6400 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 OcsM - - -
0
0
3
3
1. Find the index in array
1. Find the i...
4
4
9
9
2. Traverse the corresponding data structure
2. Traverse the...
Text is not SVG - cannot display
\ No newline at end of file diff --git a/static/pics/separate_chaining_op_en.drawio.webp b/static/pics/separate_chaining_op_en.drawio.webp new file mode 100644 index 0000000000000000000000000000000000000000..32f9bb30efadd5bfa2358ab3c4c2a1ed42fa7279 GIT binary patch literal 4040 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 literal 0 HcmV?d00001 diff --git a/static/pics/tombstone.drawio.svg b/static/pics/tombstone.drawio.svg deleted file mode 100644 index d88f1ee..0000000 --- a/static/pics/tombstone.drawio.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
0, 5
0, 5
1
1
2
2
0
0
1
1
5
5
2
2
理想情况
理想情况
实际情况
实际情况
依次添加:0, 1, 5, 2
依次添加:0, 1, 5, 2
删除 1 后
删除 1 后
0
0
5
5
2
2
“墓碑”
“墓碑”
0
0
已删除
已删除
5
5
2
2
Text is not SVG - cannot display
\ No newline at end of file diff --git a/static/pics/tombstone.drawio.webp b/static/pics/tombstone.drawio.webp new file mode 100644 index 0000000000000000000000000000000000000000..87585068fbac01e95ce3be64370acc434534538a GIT binary patch literal 13860 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 literal 0 HcmV?d00001 diff --git a/static/pics/tombstone_en.drawio.svg b/static/pics/tombstone_en.drawio.svg deleted file mode 100644 index ceafda4..0000000 --- a/static/pics/tombstone_en.drawio.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
0, 5
0, 5
1
1
2
2
0
0
1
1
5
5
2
2
Ideally
Ideally
Actually
Actually
Add Sequentially:0, 1, 5, 2
Add Sequentially:0, 1, 5, 2
After Deleting 1
After Deleting...
0
0
5
5
2
2
"Tombstone"
"Tombston...
0
0
deleted
deleted
5
5
2
2
Text is not SVG - cannot display
\ No newline at end of file diff --git a/static/pics/tombstone_en.drawio.webp b/static/pics/tombstone_en.drawio.webp new file mode 100644 index 0000000000000000000000000000000000000000..e9f648c87513fe018a5d2ed1c04a1d17f01044e6 GIT binary patch literal 14922 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 SqH1e(D@4-C>JI;z1OGn