Языковой дизайн: сочетание Gotos и функций

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

Очень скоро я столкнулся с проблемой решения функций/циклов/gotos и подумал, что если такие циклы, как while и for, будут слишком высокоуровневыми и неподходящими, то gotos будут слишком низкоуровневыми, неподдерживаемыми и, как правило, снова злобными. Функции, известные вам по большинству языков, которые имеют возвращаемые значения и аргументы, также не вписываются в концепцию языка.

Поэтому я попытался найти что-то среднее между функцией и переходом, способным

  • Рекурсия
  • Эффективные циклы

После некоторого размышления я пришел к идее подпрограмм:

  • У них есть начало и конец, как у функции
  • У них есть имя, но нет аргументов, таких как goto
  • Вы можете войти в один с помощью прыжка и выйти из него снова до его окончания с помощью return (не возвращает никакого результата, только останавливает подпрограмму)
  • Обрабатывается как обычный код -> Глобальная область видимости, как goto

Итак, я хотел узнать:

  • Идея выше хороша? Каковы (не)преимущества?
  • Будет ли лучшее сочетание функции и перехода или даже совершенно новая идея?

person sub    schedule 09.04.2010    source источник
comment
Итак, вы в основном реализуете GOSUB?   -  person David    schedule 09.04.2010
comment
Ты имеешь в виду ту штуку из Бейсика? Возможно, но я не знаю, поддерживает ли GOSUB рекурсию.   -  person sub    schedule 09.04.2010
comment
Если ваша подпрограмма не имеет параметров или переменных, вопрос о рекурсии неактуален.   -  person PauliL    schedule 09.04.2010
comment
@PauliL: То, что вы говорите, совершенно неверно.   -  person sub    schedule 09.04.2010


Ответы (3)


Идея выше хороша?

No.

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

Каковы (не)преимущества?

Никакой функциональной абстракции, никакой рекурсии, программирование только с использованием изменяемого состояния. Очень слабый композиционный принцип. Трудно использовать программисту-человеку и не имеет смысла в качестве цели компилятора.


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

Вы можете попробовать поискать в Google «переносимый язык ассемблера» и посмотреть, не наткнетесь ли вы на что-нибудь интересное.

person Norman Ramsey    schedule 10.04.2010

Я думаю, что когда вы находитесь на уровне ассемблера, GOTO перестает быть злом, а становится просто тем, как на самом деле работают программы.

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

person Mr. Boy    schedule 09.04.2010
comment
Я использую стек с позициями переходов, чтобы интерпретатор знал, куда вернуться после подпрограммы. Однако, чтобы избежать потребления памяти, замедления и переполнения, стек не используется, когда подпрограмма вызывает саму себя -› цикл. - person sub; 09.04.2010
comment
Sub, если вы не сохраняете адрес возврата, когда подпрограмма вызывает себя, это не рекурсия. И нет смысла реализовывать цикл с помощью рекурсии. Вместо этого используйте goto. - person PauliL; 09.04.2010

Подпрограмма, которую вы реализуете, точно такая же, как GOSUB в Basic или CALL в ассемблере.

Рекурсия имеет смысл только в том случае, если вы используете ее для рекурсивных алгоритмов. Для этого требуются функции с параметрами, локальными переменными и возвращаемым значением.

Однако в некоторых простых языках сценариев, которые имеют только глобальные переменные, есть инструкции PUSH и POP для сохранения переменных в стеке (точно так же, как регистры вставляются и извлекаются в языке ассемблера). . Их можно использовать для низкоуровневой реализации локальных переменных и рекурсии.

Я использовал этот метод в некоторых примерах макроязыка Vedit в Rosetta Code, см., например, Ханойские башни и кривая Безье.

person PauliL    schedule 09.04.2010