Подпрограмма и дизайн GoTo - PullRequest
       31

Подпрограмма и дизайн GoTo

0 голосов
/ 02 апреля 2010

У меня странный вопрос относительно подпрограмм: поскольку я создаю минимальный язык и не хочу добавлять высокоуровневые циклы, такие как while или for, я планировал просто добавить gotos, чтобы сохранить его Тьюринг-Полное завершение.

Теперь я подумал, г-н - gotos - я бы не хотел программировать на этом языке, если бы мне приходилось так часто использовать gotos.Поэтому я подумал о добавлении подпрограмм вместо этого.

Я вижу разницу в следующем:

  • gotos

    • Перейти к (очевидный капитан)предварительно определенную точку и продолжить выполнение программы оттуда.Приводит к трудно понятному и ошибочному коду, я думаю, что это факт.
  • подпрограммы

    • Похоже: вы определяете их отправную точку где-то, как выназовите их, программа переходит туда - , но подпрограмма может вернуться к точке, из которой она была вызвана, с помощью return .

Хорошо.Почему я просто не добавил более функциональные, приятные на вид подпрограммы?Потому что:

Чтобы заставить возврат работать, если я вызываю подпрограммы из подпрограмм из других подпрограмм, мне нужно будет использовать стек , содержащий точку, откуда пришла текущая подпрограмманаверху.

Это означало бы, что, если бы я создавал циклы с использованием подпрограмм, я получал бы чрезвычайно переполняющий стек переполненные места возврата.Не хорошо.

Не думайте о моих подпрограммах как о функциях.Они просто goto, которые возвращаются к точке, из которой они были вызваны, на самом деле они не возвращают значения, подобные выражению return x;, почти на всех современных языках.

Теперь к моим актуальным вопросам:

  • Как решить вышеуказанную проблему с переполнением стека в циклах с подпрограммами?Нужно ли добавлять отдельную языковую конструкцию goto без опции return?

  • Ассемблер не имеет циклов, но, как я видел, myJumpPoint :, jnz, jz, retn.Для меня это означает, что также должен быть стек, содержащий все места возврата.

    • Прав ли я с этим?
    • А как насчет длинных циклов?Разве они не переполняют память стека / еды?
    • Я неправильно получаю символ retn на ассемблере?Если да, пожалуйста, объясните мне.

Ответы [ 2 ]

1 голос
/ 03 апреля 2010

jnz, jz - это просто "goto".

Кроме того, я думаю, что реализация всех циклов как подпрограмм является менее изящным решением, чем просто добавление goto. Вы, кажется, предвзято против Гото. Это просто слово. Это не навредит тебе.

0 голосов
/ 02 апреля 2010

Ну, не могли бы вы решить эту проблему с помощью условного перехода? Цикл проверяет некоторое условие, чтобы увидеть, должен ли он снова работать. Пойдите со своими подпрограммами, но добавьте условный возврат, который либо возвращается к точке вызова, либо возвращается к началу процедуры в зависимости от оценки условия.

...