From a9ad01b4be614730ab082809b94b3205b9be8138 Mon Sep 17 00:00:00 2001 From: guillaume abel Date: Tue, 19 Dec 2023 22:27:23 +0100 Subject: [PATCH 1/5] Enhance Readme --- README.md | 26 ++++++++++++- spec.md | 114 ++++++++++++++++++++++++++++++++++++------------------ 2 files changed, 101 insertions(+), 39 deletions(-) diff --git a/README.md b/README.md index f3650f1..5193874 100644 --- a/README.md +++ b/README.md @@ -180,15 +180,37 @@ a / b ```c struct Point { - a: Int, + x: Int, + y: Int, }; ``` +- **Structs Initialization** +``` +@Point p = {1, 2}; +``` + +- **Structs Access** +``` +p:x +``` + +- **Nested Structs** +``` +struct Rect +{ + Point size; + Point pos; +}; +@Rect r = {{1, 2}, {3, 4}}; +r:size:x +``` + - **Generic Structs** ```c struct Rect[A] { - a: A, + attribute: A, }; ``` diff --git a/spec.md b/spec.md index 15b2793..f9ee5ea 100644 --- a/spec.md +++ b/spec.md @@ -2,17 +2,12 @@ :: All value starting with `0x` are hexadecimal -|-----------------------------------------------------------------------------| -| Header | -|-----------------------------------------------------------------------------| -| Struct registration | -|-----------------------------------------------------------------------------| -| Global variable registration | -|-----------------------------------------------------------------------------| -| Function registration | -|-----------------------------------------------------------------------------| -| Start function | -|-----------------------------------------------------------------------------| +| Summary | +|------------------------------| +| Header | +| Struct registration | +| Function registration | +| Start function | ## Header @@ -24,9 +19,6 @@ ## Struct registration -|-----------------------------------------------------------------------------| -| 0x01 0xZZZZZZZZ 0x | -|-----------------------------------------------------------------------------| Struct ID for: - __Int__: `0x00000001` @@ -37,41 +29,89 @@ Struct ID for: 1. The section starts with: -``` -0x00 0x06 0x07 0x00 -``` + ``` + 0x00 0x06 0x07 0x00 + ``` + - Each struct type `ID` is an (Int32) followed by its name in multiple (Char8), until `0x00` + ``` + 0x00000006MyStruct0x000x00000007SndStruct0x00 + ``` 2. Struct are a list of other struct of built-in types -- Struct start + - Struct start -``` -0x01 -``` + ``` + 0x01 + ``` -- Struct name (Int32) is an `ID` of the struct name. + - Struct name (Int32) is an `ID` of the struct name. -All reference to this struct will be with the `ID`. + All reference to this struct will be with the `ID`. -- Number of fields (Int16) + - Number of fields (Int16) -- Each fild is a `ID` of the field type + - Each field is an `ID` of the field type -- Struct end + - Struct end -``` -0x00 -``` + ``` + 0x00 + ``` +## Function registration -``` -struct a { - int -} +Struct ID for: +- __print__: `0x00000001` +- __printErr__: `0x00000002` +- __getLine__: `0x00000003` +- __str__: `0x00000004` +- __type__: `0x00000005` +- __call__: `0x00000006` -struct b { - a -} -``` +1. The section starts with: + + ``` + 0x00 0x06 0x07 0x00 + ``` + + - Each function `ID` is an (Int32) followed by its name in multiple (Char8), until `0x00` + + ``` + 0x00000006myFunc0x000x00000007sndFunc0x00 + ``` + +2. Struct are a list of other struct of built-in types + + - Struct start + + ``` + 0x01 + ``` + + - Struct name (Int32) is an `ID` of the struct name. + + +1. The section starts with: + + ``` + 0x00 0x06 0x07 0x00 + ``` + +2. Each function is: + + - Function start + + ``` + 0x01 + ``` + + - Function name (Int32) is an `ID` of the function name. + + All reference to this function will be with the `ID`. + + - Function name (Char8) is the name of the function and finish with `0x00` + + - \ No newline at end of file From a1b08d206390ae731e253d2eabbc178e40f83fad Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Wed, 20 Dec 2023 09:20:38 +0100 Subject: [PATCH 2/5] Move file in docs --- spec.md => docs/ByteCodeSpec.md | 0 docs/SUMMARY.md | 1 + 2 files changed, 1 insertion(+) rename spec.md => docs/ByteCodeSpec.md (100%) diff --git a/spec.md b/docs/ByteCodeSpec.md similarity index 100% rename from spec.md rename to docs/ByteCodeSpec.md diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index 8168fc0..72e6716 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -4,3 +4,4 @@ This is a new amazing programming language made in Haskell. [README](README.md) +[Byte Code Spec](ByteCodeSpec.md) From 2ae306f71217a2aec57e2a82d4c0d4dd59d5a3fd Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Wed, 20 Dec 2023 09:21:48 +0100 Subject: [PATCH 3/5] Remove compil haskell in the doc --- .github/workflows/documentation.yml | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index af808f7..017b93a 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -48,19 +48,6 @@ jobs: if: steps.filter.outputs.docs == 'true' || steps.filter.outputs.docs2 == 'true' || steps.filter.outputs.workflow == 'true' || github.ref == 'refs/heads/main' run: mdbook build - - name: Install Haskell - uses: haskell-actions/setup@v2 - with: - enable-stack: true - stack-version: 'latest' - - - name: Compil - if: steps.filter.outputs.docs == 'true' || steps.filter.outputs.docs2 == 'true' || steps.filter.outputs.workflow == 'true' || github.ref == 'refs/heads/main' - run: | - if ! stack build; then - exit 0 - fi - - name: Setup Pages if: github.ref == 'refs/heads/main' uses: actions/configure-pages@v3 From 3424b98d80f71444405c5316a213601e5a1818ff Mon Sep 17 00:00:00 2001 From: Xavier Mitault Date: Wed, 20 Dec 2023 11:53:31 +0100 Subject: [PATCH 4/5] Add current spec --- docs/ByteCodeSpec.md | 191 ++++++++++++++++++++++++++++--------------- 1 file changed, 126 insertions(+), 65 deletions(-) diff --git a/docs/ByteCodeSpec.md b/docs/ByteCodeSpec.md index f9ee5ea..067fff6 100644 --- a/docs/ByteCodeSpec.md +++ b/docs/ByteCodeSpec.md @@ -2,116 +2,177 @@ :: All value starting with `0x` are hexadecimal -| Summary | -|------------------------------| -| Header | -| Struct registration | -| Function registration | -| Start function | - ## Header 1. The file starts with: ``` -0x55 0x1E 0x53 0x0A +0x00 0x61 0x73 0x6D +0x01 0x00 0x00 0x00 ``` -## Struct registration +## Function Section +``` +0x03 +``` -Struct ID for: -- __Int__: `0x00000001` -- __String__: `0x00000002` -- __Bool__: `0x00000003` -- __Void__: `0x00000004` -- __Char__: `0x00000005` +## Export Section -1. The section starts with: +``` +0x07 +``` - ``` - 0x00 0x06 0x07 0x00 - ``` +Instructions +------------ - - Each struct type `ID` is an (Int32) followed by its name in multiple (Char8), until `0x00` +## Instructions - ``` - 0x00000006MyStruct0x000x00000007SndStruct0x00 - ``` +### Stack -2. Struct are a list of other struct of built-in types +#### local - - Struct start +##### local.get - ``` - 0x01 - ``` +``` +0x20 +``` - - Struct name (Int32) is an `ID` of the struct name. +Get a local variable by its index and add it to the stack. - All reference to this struct will be with the `ID`. +##### local.set - - Number of fields (Int16) +``` +0x21 +``` - - Each field is an `ID` of the field type +Get the top of the stack and set a local variable by its index. - - Struct end +#### global - ``` - 0x00 - ``` +##### global.get + +``` +0x23 +``` + +Get a global variable by its index and add it to the stack. + +##### global.set + +``` +0x24 +``` + +Get the top of the stack and set a global variable by its index. + +#### i32 + +##### i32.const + +``` +0x41 +``` + +Push an `Int32` to the stack. -## Function registration +### Memory -Struct ID for: -- __print__: `0x00000001` -- __printErr__: `0x00000002` -- __getLine__: `0x00000003` -- __str__: `0x00000004` -- __type__: `0x00000005` -- __call__: `0x00000006` +#### i32 -1. The section starts with: +##### i32.store + +``` +0x36 +``` + +Take the top of the stack. This will be the value stored in memory. +Take the top of the stack. This will be the index in memory. + +Store the value in memory at the index. + +##### i32.load + +``` +0x28 +``` + +Take the top of the stack. This will be the index in memory. + +Push an `Int32` to the stack with the value at address in memory. + +### Condition + +#### i32 + +##### i32.gt_s + +``` +0x4a +``` + +Compare the 2 values on the top of the stack. + +If the first value is greater than the second value, push `1` to the stack. +else, push `0` + +##### i32.eq + +``` +0x46 +``` + +Compare the 2 values on the top of the stack. + +If the first value is equal to the second value, push `1` to the stack. +else, push `0` + +#### control + +##### if...else...end + +- if ``` - 0x00 0x06 0x07 0x00 + 0x04 ``` - - Each function `ID` is an (Int32) followed by its name in multiple (Char8), until `0x00` + Enter in the first branch if the top of the stack is 1. + +- else ``` - 0x00000006myFunc0x000x00000007sndFunc0x00 + 0x05 ``` -2. Struct are a list of other struct of built-in types + Enter in the second branch if the top of the stack is 0. - - Struct start +- end ``` - 0x01 + 0x0b ``` - - Struct name (Int32) is an `ID` of the struct name. + Exit from the if/else block. +##### loop