У меня странный вопрос относительно подпрограмм: поскольку я создаю минимальный язык и не хочу добавлять высокоуровневые циклы, такие как while
или for
, я планировал просто добавить gotos, чтобы сохранить его Тьюринг-Полное завершение.
Теперь я подумал, г-н - gotos - я бы не хотел программировать на этом языке, если бы мне приходилось так часто использовать gotos.Поэтому я подумал о добавлении подпрограмм вместо этого.
Я вижу разницу в следующем:
gotos
- Перейти к (очевидный капитан)предварительно определенную точку и продолжить выполнение программы оттуда.Приводит к трудно понятному и ошибочному коду, я думаю, что это факт.
подпрограммы
- Похоже: вы определяете их отправную точку где-то, как выназовите их, программа переходит туда - , но подпрограмма может вернуться к точке, из которой она была вызвана, с помощью return .
Хорошо.Почему я просто не добавил более функциональные, приятные на вид подпрограммы?Потому что:
Чтобы заставить возврат работать, если я вызываю подпрограммы из подпрограмм из других подпрограмм, мне нужно будет использовать стек , содержащий точку, откуда пришла текущая подпрограмманаверху.
Это означало бы, что, если бы я создавал циклы с использованием подпрограмм, я получал бы чрезвычайно переполняющий стек переполненные места возврата.Не хорошо.
Не думайте о моих подпрограммах как о функциях.Они просто goto, которые возвращаются к точке, из которой они были вызваны, на самом деле они не возвращают значения, подобные выражению return x;
, почти на всех современных языках.
Теперь к моим актуальным вопросам:
Как решить вышеуказанную проблему с переполнением стека в циклах с подпрограммами?Нужно ли добавлять отдельную языковую конструкцию goto
без опции return
?
Ассемблер не имеет циклов, но, как я видел, myJumpPoint :, jnz
, jz
, retn
.Для меня это означает, что также должен быть стек, содержащий все места возврата.
- Прав ли я с этим?
- А как насчет длинных циклов?Разве они не переполняют память стека / еды?
- Я неправильно получаю символ
retn
на ассемблере?Если да, пожалуйста, объясните мне.