Языковой дизайн: объединение Gotos и функций - PullRequest
0 голосов
/ 09 апреля 2010

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

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

Итак, я попытался выяснить что-то между функцией и goto, которая способна

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

Подумав, у меня возникла идея подпрограмм:

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

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

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

Ответы [ 3 ]

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

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

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

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

Я использовал этот метод в некоторых примерах Vedit Macro Language в Rosetta Code, см., Например, Towers of Hanoi и Кривая Безье .

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

Хороша ли идея выше?

номер

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

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

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


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

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

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

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

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

...