Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Сломана кодогенерация #15

Closed
Stepami opened this issue Sep 19, 2022 · 5 comments · Fixed by #4 or #21
Closed

Сломана кодогенерация #15

Stepami opened this issue Sep 19, 2022 · 5 comments · Fixed by #4 or #21
Labels
BackEnd Working on backend of the interpreter Blocked Can't be implemented because of dependency Bug Something isn't working
Milestone

Comments

@Stepami
Copy link
Owner

Stepami commented Sep 19, 2022

Некоторые программы выдают неправильную адресацию инструкций для виртуальной машины.

@Stepami
Copy link
Owner Author

Stepami commented Sep 19, 2022

Например, есть программа:

type int = number
type ints = int[]

function swap(array: ints, i: int, j: int) {
    let ai = array[i]
    array[i] = array[j]
    array[j] = ai
}

function partition(values: ints, l: int, r: int): int {
    let x = values[r]
    let less = l

    let i = l
    while (i < r) {
        let value = values[i]
        if (value <= x) {
            swap(values, i, less)
            less = less + 1
        }
        i = i + 1
    }
    swap(values, less, r)
    return less
}

function quickSortImpl(values: ints, l: int, r: int) {
    if (l < r) {
        let q = partition(values, l, r)
        quickSortImpl(values, l, q - 1)
        quickSortImpl(values, q + 1, r)
    }
}

function quickSort(values: ints) {
    let n = ~values
    if (n != 0) {
        quickSortImpl(values, 0, n - 1)
    }
}

let numbers = [6,2,4,3,7,1,5,]
quickSort(numbers)
print(numbers as string)

@Stepami
Copy link
Owner Author

Stepami commented Sep 19, 2022

Интерпретатор сгенерирует следующий набор инструкций:

0: Goto 7
1: BeginFunction swap
2: ai = array [] i
3: _t3 = array [] j
4: array[i] = _t3
5: array[j] = ai
6: Return
7: Goto 29
8: BeginFunction partition
9: x = values [] r
10: less = l
11: i = l
12: _t12 = i < r
13: IfNot _t12 Goto 24
14: value = values [] i
15: _t15 = value <= x
16: IfNot _t15 Goto 22
17: PushParameter array = values
18: PushParameter i = i
19: PushParameter j = less
20: Call (1, swap), 3
21: less = less + 1
22: i = i + 1
23: Goto 12
24: PushParameter array = values
25: PushParameter i = less
26: PushParameter j = r
27: Call (1, swap), 3
28: Return less
29: Goto 48
30: BeginFunction quickSortImpl
31: _t31 = l < r
32: IfNot _t31 Goto 47
33: PushParameter values = values
34: PushParameter l = l
35: PushParameter r = r
36: q = Call (8, partition), 3
37: PushParameter values = values
37: _t37 = q - 1
38: PushParameter l = l
40: PushParameter r = _t37
41: Call (30, quickSortImpl), 3
42: PushParameter values = values
42: _t42 = q + 1
44: PushParameter l = _t42
45: PushParameter r = r
46: Call (30, quickSortImpl), 3
47: Return
48: Goto 59
49: BeginFunction quickSort
50: n = ~values
51: _t51 = n != 0
52: IfNot _t51 Goto 58
53: _t53 = n - 1
53: PushParameter values = values
54: PushParameter l = 0
56: PushParameter r = _t53
57: Call (30, quickSortImpl), 3
58: Return
59: array numbers = [7]
60: numbers[0] = 6
61: numbers[1] = 2
62: numbers[2] = 4
63: numbers[3] = 3
64: numbers[4] = 7
65: numbers[5] = 1
66: numbers[6] = 5
67: PushParameter values = numbers
68: Call (49, quickSort), 1
69: _t69 = numbers as string
70: Print _t69
71: End

@Stepami
Copy link
Owner Author

Stepami commented Sep 19, 2022

В приведённой программе видно дублирующиеся адреса, которые приводят к бесконечному циклу внутри виртуалки

@Stepami
Copy link
Owner Author

Stepami commented Sep 19, 2022

Сейчас, вся кодогенерация размазана по узлам AST. Возможно, рефакторинг в #4 решит проблему.
Иначе, придётся изобретать новую систему адресации.

@Stepami Stepami linked a pull request Sep 19, 2022 that will close this issue
@Stepami Stepami added the Bug Something isn't working label Oct 20, 2022
@Stepami Stepami added the Blocked Can't be implemented because of dependency label Nov 14, 2022
@Stepami
Copy link
Owner Author

Stepami commented Mar 3, 2023

Новую систему адресации всё же пришлось изобрести

@Stepami Stepami added the BackEnd Working on backend of the interpreter label Apr 18, 2023
Stepami added a commit that referenced this issue Jul 19, 2024
Stepami added a commit that referenced this issue Jul 20, 2024
* Добавил пакет с контрактом паттерна "Посетитель", на который переведу AST

* migration to Visitor.NET 2.0.0

* базис внедрения шаблона Посетитель

* move folder

* merge

* small refactoring + two nodes

* fix build

* Новая система адресации инструкций (#21)

* initial of the branch

* контракт адреса

* Переезд на .NET 7 (#24)

* обновление sdk в проекте

* обновление sdk в ci

* переход на json raw string literal

* обновление nuget пакетов

* Генерация отчёта о покрытии на уровне конфигурации проекта

coverlet-coverage/coverlet#1391

* Генерация отчёта о покрытии на уровне конфигурации проекта

coverlet-coverage/coverlet#1391

* versioning

* Update Readme.md

* draft алгоритма работы коллекции

* Использование последних наворотов шарпа (#26)

* versioning

* enabling implicit usings (#25)

* local scoped namespaces (#27)

* after merge

* разработка алгоритма вставки в коллекцию

* пакетная вставка

* доработка алгоритма вставки

* индексатор

* прямая итерация над коллекцией

* важная доработка вставки - сгенерированный адрес проставляется инструкции, больше не требуется создавать адрес для создания инструкции

* переименовал сущность адреса

* доработка массовой вставки

* алгоритм удаления инструкции

* unit tests

* more tests

* переписал новые визиторы на AddressedInstructions

* удаление конструкта "номер инструкции"

* допиливание работы с Label.cs

* удаление конструкта номера из алгоритмов инструкций

* прогон инструкций в виртуальной машине по адресу

* переписывание алгоритмов инструкций на работу с адресами

* текущая реализация не требует такой сложной конструкции инструкции возврата

* remove unused

* подправил контракт AST

* block statement

* Proper HasReturnStatementImplementation

* removed unused code

* перегруппировка

* address system refactoring

* HashedAddress.cs fix

* AddressedInstructions.cs fix

* introducing brand new visitor architecture

* unary expression visitor

* refactoring + error removal

* Simple.cs fix

* BinaryExpression refactoring

* move AddressedInstructions.cs back

* remove unused

* as string code gen

* Constant.cs refactoring

* доработка генерации существующих функций ExpressionInstructionProvider.cs

* ArrayLiteral.cs visit

* TypeStatement.cs fix

* InsideLoopStatement.cs visit

* ExpressionStatement.cs visit

* ReturnStatement.cs visit

* Label.cs fix

* remove redunant override

* Property.cs refactoring

* ObjectLiteral.cs + FunctionDeclaration.cs visitor refactoring & decoupling

* WhileStatement.cs visit refactoring

* IfStatement.cs refactoring with visitor

* IfStatement.cs fix

* ConditionalExpression.cs visit fix

* AssignmentExpression.cs visitor

* fix

* fix tests

* ComplexLiteral.cs

* AssignmentExpression visit fix

* Исправление некорректной грамматики (#28)

* new grammar.txt content

* format grammar.txt

* grammar fix

* MemberExpression.cs visiting

* refactoring

* fix

* replacement function in AddressedInstructions.cs

* AssignmentExpression visiting fix

* fix

* call expr print

* fix parser

* parser fix 2

* restructuring

* script body visit fix

* formatting

* parser fix

* refactoring

* semantic assertion draft

* break support in if statatement

* enum rename

* rename

* exceptions excluded from codecov

* some semantic analysis rework

* removed some tests

* supress code cov

* suppress

* ReturnStatement.cs semantic

* renane

* parser fix

* rename

* move

* mv SemanticChecker.cs

* new visitor

* region

* SymbolTableBuilder.cs completed

* module refactoring

* removed symbol table construction from parsing

* SymbolTableInitializer fix

* integration with symbol table initializer

* refactoring

* DeclarationVisitor.cs

* usage of decl visitor

* fix recursion

* - Visiting type decl
- New type symbol
- Removed types dict from symbol table

* fix

* small fix

* update  nuget

* symbol refactoring

* some work stuck long time ago

* symbol state

* предварительная версия инициализатора имён

* fix ci

* complete type loading system rework

* type resolving example

* refactoring of default js types consuming and custom types resolving

* fix function codegen bug - end label was not emitted

* type domain refactored

* pre-load built types before reference resolving

* fix bug in object type ref resolving

* hierarchy enhancement

* guard of type duplicates and built-in types declaration

* initialized/declared type symbols

* some new checks

* more refac

* proper render of type values

* guard declarations from duplicates

* do not return null

* binary and unary expressions check

* fix bug sequence has no elements

* guard against no initializer

* formatting

* there is not symbol without initializer thus symbol cannot be not initialized

* working with assignments

* checking access expressions

* check object literal without methods

* реструктуризация сервисов посетителей

* рефакторинг после реструктуризации

* удалил ненавистный Utils

* рефакторинг объектного типа

* сохранение функций в хранилище, для которых не был сразу выведен возвращаемый тип, чтобы впоследствии его вычислить

* call expr check v1

* fix

* перенос проверок функции статическим анализом

* Починил бекенд при работе с анонимными массивами и объектами

* доработка вывода типов

* поправил вывод типов в части необработанных функций

* обновление версий экшенов

* вторая волна обновлений

* upd workflows

* global using visitor.net

* fix func decl gen

* Revert "fix func decl gen"

This reverts commit ef97623.

* visit fix

* Имеет ли функция пустое тело

* исправил ошибку кодогенерации if statement при отсутствии else блока

* базовая кодогенерация для вызова функции без учета метода объекта

* доработка вывода типов

* починил статический анализ доступа к элементу массива по индексу

* fix

* rename to hydrascript

* #15 - удалил методы из объекта

* #15 - удалил концепцию метода из бекенда

* #15 - удалил FunctionType.cs

* #15 - статический анализ вызова метода

* #15 - кодогенерация вызова метода

* #15 - актуализация лексической структуры

* #15 - доработка "забытого" статического анализа

* #15 - поправил кодген if-else

* rm

* #15 - если у функции не прописан тип и нет return'ов, то она void

* #15 - корректировка примеров

* #23 - рабочий пример
@Stepami Stepami added this to the hydrascript 2 milestone Jul 21, 2024
Stepami added a commit that referenced this issue Aug 11, 2024
* Переезд на паттерн "Посетитель" (#4)

* Добавил пакет с контрактом паттерна "Посетитель", на который переведу AST

* migration to Visitor.NET 2.0.0

* базис внедрения шаблона Посетитель

* move folder

* merge

* small refactoring + two nodes

* fix build

* Новая система адресации инструкций (#21)

* initial of the branch

* контракт адреса

* Переезд на .NET 7 (#24)

* обновление sdk в проекте

* обновление sdk в ci

* переход на json raw string literal

* обновление nuget пакетов

* Генерация отчёта о покрытии на уровне конфигурации проекта

coverlet-coverage/coverlet#1391

* Генерация отчёта о покрытии на уровне конфигурации проекта

coverlet-coverage/coverlet#1391

* versioning

* Update Readme.md

* draft алгоритма работы коллекции

* Использование последних наворотов шарпа (#26)

* versioning

* enabling implicit usings (#25)

* local scoped namespaces (#27)

* after merge

* разработка алгоритма вставки в коллекцию

* пакетная вставка

* доработка алгоритма вставки

* индексатор

* прямая итерация над коллекцией

* важная доработка вставки - сгенерированный адрес проставляется инструкции, больше не требуется создавать адрес для создания инструкции

* переименовал сущность адреса

* доработка массовой вставки

* алгоритм удаления инструкции

* unit tests

* more tests

* переписал новые визиторы на AddressedInstructions

* удаление конструкта "номер инструкции"

* допиливание работы с Label.cs

* удаление конструкта номера из алгоритмов инструкций

* прогон инструкций в виртуальной машине по адресу

* переписывание алгоритмов инструкций на работу с адресами

* текущая реализация не требует такой сложной конструкции инструкции возврата

* remove unused

* подправил контракт AST

* block statement

* Proper HasReturnStatementImplementation

* removed unused code

* перегруппировка

* address system refactoring

* HashedAddress.cs fix

* AddressedInstructions.cs fix

* introducing brand new visitor architecture

* unary expression visitor

* refactoring + error removal

* Simple.cs fix

* BinaryExpression refactoring

* move AddressedInstructions.cs back

* remove unused

* as string code gen

* Constant.cs refactoring

* доработка генерации существующих функций ExpressionInstructionProvider.cs

* ArrayLiteral.cs visit

* TypeStatement.cs fix

* InsideLoopStatement.cs visit

* ExpressionStatement.cs visit

* ReturnStatement.cs visit

* Label.cs fix

* remove redunant override

* Property.cs refactoring

* ObjectLiteral.cs + FunctionDeclaration.cs visitor refactoring & decoupling

* WhileStatement.cs visit refactoring

* IfStatement.cs refactoring with visitor

* IfStatement.cs fix

* ConditionalExpression.cs visit fix

* AssignmentExpression.cs visitor

* fix

* fix tests

* ComplexLiteral.cs

* AssignmentExpression visit fix

* Исправление некорректной грамматики (#28)

* new grammar.txt content

* format grammar.txt

* grammar fix

* MemberExpression.cs visiting

* refactoring

* fix

* replacement function in AddressedInstructions.cs

* AssignmentExpression visiting fix

* fix

* call expr print

* fix parser

* parser fix 2

* restructuring

* script body visit fix

* formatting

* parser fix

* refactoring

* semantic assertion draft

* break support in if statatement

* enum rename

* rename

* exceptions excluded from codecov

* some semantic analysis rework

* removed some tests

* supress code cov

* suppress

* ReturnStatement.cs semantic

* renane

* parser fix

* rename

* move

* mv SemanticChecker.cs

* new visitor

* region

* SymbolTableBuilder.cs completed

* module refactoring

* removed symbol table construction from parsing

* SymbolTableInitializer fix

* integration with symbol table initializer

* refactoring

* DeclarationVisitor.cs

* usage of decl visitor

* fix recursion

* - Visiting type decl
- New type symbol
- Removed types dict from symbol table

* fix

* small fix

* update  nuget

* symbol refactoring

* some work stuck long time ago

* symbol state

* предварительная версия инициализатора имён

* fix ci

* complete type loading system rework

* type resolving example

* refactoring of default js types consuming and custom types resolving

* fix function codegen bug - end label was not emitted

* type domain refactored

* pre-load built types before reference resolving

* fix bug in object type ref resolving

* hierarchy enhancement

* guard of type duplicates and built-in types declaration

* initialized/declared type symbols

* some new checks

* more refac

* proper render of type values

* guard declarations from duplicates

* do not return null

* binary and unary expressions check

* fix bug sequence has no elements

* guard against no initializer

* formatting

* there is not symbol without initializer thus symbol cannot be not initialized

* working with assignments

* checking access expressions

* check object literal without methods

* реструктуризация сервисов посетителей

* рефакторинг после реструктуризации

* удалил ненавистный Utils

* рефакторинг объектного типа

* сохранение функций в хранилище, для которых не был сразу выведен возвращаемый тип, чтобы впоследствии его вычислить

* call expr check v1

* fix

* перенос проверок функции статическим анализом

* Починил бекенд при работе с анонимными массивами и объектами

* доработка вывода типов

* поправил вывод типов в части необработанных функций

* обновление версий экшенов

* вторая волна обновлений

* upd workflows

* global using visitor.net

* fix func decl gen

* Revert "fix func decl gen"

This reverts commit ef97623.

* visit fix

* Имеет ли функция пустое тело

* исправил ошибку кодогенерации if statement при отсутствии else блока

* базовая кодогенерация для вызова функции без учета метода объекта

* доработка вывода типов

* починил статический анализ доступа к элементу массива по индексу

* fix

* rename to hydrascript

* #15 - удалил методы из объекта

* #15 - удалил концепцию метода из бекенда

* #15 - удалил FunctionType.cs

* #15 - статический анализ вызова метода

* #15 - кодогенерация вызова метода

* #15 - актуализация лексической структуры

* #15 - доработка "забытого" статического анализа

* #15 - поправил кодген if-else

* rm

* #15 - если у функции не прописан тип и нет return'ов, то она void

* #15 - корректировка примеров

* #23 - рабочий пример

* Feature/net 8 (#62)

* #50 - .NET 8

* #44 - mac m1

* upd Readme.md

* #32 - CommandLineSettings.cs теперь обычный dto с опциями (#63)

* Update develop.yml - накинул фиксированных permissions

* Add unique Guid check to HashAddress.Equals (#65)

* Add unique Guid check to HashAddress.Equals

* Update develop.yml - накинул фиксированных permissions

---------

Co-authored-by: Степан <[email protected]>

* Update develop.yml

* Feature/nrt (#66)

* #46 - nrt 1

* #46 - nrt 2

* #46 - nrt 3

* #46 - after merge

* #46 - fix

* Feature/lexer issue 58 (#67)

* fix warnings

* #58 - feature

* #58 - tests

* #58 - fix tests

* рефакторинг структуры проекта (#68)

* #31 - non code elements

* #31 - samples

* #31 - structure refac

* #31 - one more file

* rm cobertura

* new ignore rule

* Обновление Visitor.NET (#69)

* minor fix

* #31 - visitor.NET upgrade

* #59 - переход на IReadOnlyList (#70)

* #31 - change nullability of Parent

* #31 unbound ast node from segment

* #59 - переход на IReadOnlyList

* Draft: Выделение поддоменов (#72)

* #31 - IAbstractSyntaxTreeNode.cs

* #31 - tree internal

* #31 - separate ast from backend

* #31 - segment

* #31 - separate ast from backend 2

* #31 - value dto converter

* #31 - удалил Type из TypeValue

* #31 - fix test

* #31 - symbol contracts

* #31 - tuple -> dto

* #31 - End is property

* mv

* #31 - backend mv

* #31 - backend subdomain

* #31 - scope dto for ast

* #31 - rename

* #31 - rename

* #31 - ISymbolTable -> Scope

* #31 - SymbolTableStorage.cs

* #31 - fix bug

* #31 - remove IR from codegen

* Переход на чистую архитектуру и System.CommandLine (#73)

* #51 - Скелет Луковой Архитектуры

* #51 - удалил мусор

* #51 - перенос backend

* #51 - fix

* #51 - перенос FrontEnd

* #51 - Перенос IR

* #51 - перенос StaticAnalysis

* #51 - перенос Code Generation

* #51 - code gen di refac

* #51 - fix

* #51 - fix

* #51 - static analysis di refac

* #51 - fix

* #51 fix

* #51 - fix

* #51 - fix

* #51 - nuget upgrade

* #51 - infrastructure layer

* #42 - внедрил system command line

* di fix

* #51 - fix

* #47 - интеграционные тесты

* #47 - ci cd

* change ci cd setup

* update Readme.md

* Feature/generated lexer (#77)

* #57 - абстракция IStructure.cs

* #57 - token types provider

* #57 - DI refactoring

* #57 - json highlight

* #57 - абстракция IGeneratedRegexContainer

* fix

* #57 - SG project

* #57 - fix SG launch

* #57 - tests

* #57 - удаление динамического построения RegEx

* #57 - убрал лишнее из TokenType

* #57 - тест на проверку подстановки

* fix

* upd cvrg info

* Перевод на Source Gen Json (#80)

* #45 - тестовый workflow для проверки AOT publish на инфре GitHub Actions

* #45 - перевёл бекенд на json source gen

* fix

* #45 - перевёл SG на json source gen

* #45 - перевёл Infrastructure на json source gen

* Revert "#45 - тестовый workflow для проверки AOT publish на инфре GitHub Actions"

This reverts commit 3014c53.

* Актуализация Readme и перенос файла грамматики в более подходящее место

* small fix - return exit code

* важное уточнение в Readme.md

* logo

* re-arrange

* fix typo in logo

* Merge pull request #83

* Перейти на FrozenDictionary в Structure.

* Убран пробел.

* I have read the CLA Document and I hereby sign the CLA

* Remove cla (#85)

* removed cla

* fix

* #48 - внедрение GitVersion (#86)

* #48 - init GitVersion.yml

* #48 - внедрение git-version в ci-cd

* #48 - upload build

* #48 - use version option

* #48 - fix version

* #48 - push builds only for dev

* test

* fix

* fix

* fix

* fix

* #48 - пуш тега на мерже в мастер

* #48 - временное отключение релиз воркфлоу

* убрал codecov для master - в нём нет смысла, так как подстановка данных все равно происходит руками +semver:skip

* #48 - исключение release ветки из Develop Workflow

* #48 - вернул release.yml

* #48 - новый Release Workflow

---------

Co-authored-by: Sergey Nazarov <[email protected]>
Co-authored-by: Georgy Levchenko <[email protected]>
@Stepami Stepami added Breaking Change Functionality breaking changes and removed Breaking Change Functionality breaking changes labels Aug 11, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
BackEnd Working on backend of the interpreter Blocked Can't be implemented because of dependency Bug Something isn't working
Projects
None yet
1 participant