>>/2647/
> программы
Что ты описал это тоже хорошо, но не всегда. Иногда нужно прописать классы, их методы и просто функции, чтобы определиться с архитектурой. И вот только тогда будет возможно определить, если решение неправильное и вовремя исправить свою ошибку.
И в случае с разработкой ЯП, письмо кода на нём, до его выпуска, позволяет хорошо отшлифовать стандарт, чтобы было удобно. А то выпустил бы я laisi с процедурно генерируемыми типами, во время исполнения и это было бы очень сложно реализовать.
> Паинте
Нет, такое не использую.
Что насчёт стека, то вроде бы как, представляю как он работает. При вызове функции в стек заносится адрес инструкции, с которой был call, чтобы при возврате поместить этот адрес в регистр указателя инструкции. Внутри функций регистр стека сдвигается на столько байт, сколько нужно для локальных переменных. Во время возврата он отодвигается обратно, освобождая память стека, а потом совершает возврат из функции. Возвращая значние он может либо положить его в регистр, в несколько регистров, либо, если возвращаемое значение велико в размере, компилятор генерирует функцию не которая возвращает значение, а которая принимает указатель на некоторое количество байт в в памяти. И тогда перед ретурном по указателю помещается возвращаемое значение.
Как работают исключения и генераторы в других компилируемых языках программирования я не имею понятия. Но я планировал, что будет в функцию будет пересылаться указатель на структуру исключения, которая состоит из структуры которую функция бросает и немного памяти для результат выхода из функции, при raise она будет в эту структуру записывать данные и возвращаеться. В зависимости от результата (return, raise или yield) в ту структуру пересылается номер типа выхода. И дальше в зависимости от этого результата зависит поведение программы. Если исключение, то это исключение пересылается в исключение верхнего уровня, если это не в try {} и так далее, пока не выйдет из программы. В случае если это простая исполняемая программа с _start, то функция _start содержит обработчик исключения, который выведет сообщение об ошибке, либо просто возвратит ненулевой результат.
Хотя я ещё планировал ввести такой модификатор кода, который позволит в структуру исключения заносить названия функций, номера строк и столбцов в коде. Для дебаггинга.
Как я планировал генераторы сделать, я уже писал выше. Либо все локальные переменные пересылаются в аргументы, либо, если платформа поддерживает потоки, то внутри потока будет и мьютексом останавливаться когда надо, а yieldить в опредлённый адрес. Если платформа однопоточная и не поддерживает потоки (микроконтроллеры, например), а генератор не рекурсивный, то переменные вообще можно хранить в глобальной памяти.