Подтвердить что ты не робот

Когда появилась идея макросов (пользовательское преобразование кода)?

Я прочитал статью Маккарти 1960 года о LISP и не нашел ссылки на что-либо, похожее на пользовательские макросы или оценку нормального порядка. Мне было интересно, когда макросы впервые появились в истории языка программирования (а также в истории LISP):

  • Когда была впервые описана (теоретически) идея пользовательского преобразования кода (перед интерпретацией или компиляцией)?
  • В чем была первая реализация языка программирования с Lisp -подобными макросами (под "Lisp -like". Я имею в виду "используя читаемый язык Turing для полного преобразования кода" )? (в том числе не Lisps - Forth, например, довольно старый, но я не уверен, что первая реализация Forth уже имела "IMMEDIATE" ).
  • Также из них был первый высокоуровневый язык программирования (исключить языки ассемблера...)
  • Каким был первый диалект LISP, чтобы иметь макросы?

Спасибо!

4b9b3361

Ответ 1

Из Эволюции Lisp (Стил/Габриэль):

3.3 Макросы

Макросы, по-видимому, были введены в Lisp Тимоти П. Хартом в 1963 году в короткой записке MIT AI [Hart, 1963],

Тимоти П. Харт, MACRO Определения для LISP, октябрь 1963

Ответ 2

Чтобы узнать, как макросы, введенные в Lisp, следует искать упоминания о FEXPR и FSUBR, которые предшественники современных макросов Lisp (или, точнее, FEXPR являются предшественниками пользовательских макросов). Они упоминаются в нескольких местах - например, в От Lisp от 1 до Lisp 1,5 раздела McCarthy История Lisp. Но на самом деле это также упоминалось ранее: в с .48 LISP я ПРОГРАММИРОВАНИЕ РУКОВОДСТВА (с 1960 года) вы можете увидеть описание FEXPR и FSUBR.

BTW, немного подделка для сравнения макросов Lisp со строковыми системами. Преимущество использования трансформатора дерева и строковых манипуляций достаточно значимо, чтобы сделать его совершенно другой системой. Еще один важный аспект макросов Lisp заключается в том, что они являются локальными преобразованиями и глобальным программным преобразованием (наиболее очевидная статья для чтения - это Felleisen О выраженной силе Языки программирования). И, конечно же, здесь есть целая область: от FEXPR до современных, более хорошо управляемых макросов, затем до гигиенических макросов в Scheme (которые имеют дело с представлением, более богатым, чем символические деревья синтаксического анализа), затем сочетание макросов и модульной системы, фаз расширения синтаксиса и т.д. и т.д. Там, вероятно, достаточно материала для нескольких лет чтения...

Ответ 3

Я думаю, что идея восходит к Post systems, переписывая строки ( "если вы видите эту строку, замените ее на эту строку" ), Почтовые системы являются способными к Тьюрингу, и поэтому могут вычислять все (включая тексты программ!). Сообщение Эмиля Поста об этом датировано 1943 годом, но, предположительно, он сделал оригинальную концептуализацию в 1920-х годах.

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

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

Оба из них - макропроцессоры с поддержкой Turing.

SNOBOL также относится к тому же периоду.

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

Я знаю, что COBOL имеет так называемые библиотеки COPY, которые являются перекрестком между макросами и включенными файлами. Я не знаю, когда это было введено в COBOL, но langauge восходит к 1958 году.

Интересно отметить, что макросы LISP можно рассматривать как частный случай перезаписывания дерева-дерева ( "если вы видите s-выражение, которое выглядит так, замените его на s-выражение, которое выглядит так" ). Деревья могут быть легко смоделированы как строки (см. "LISP":) и, таким образом, макросы LISP являются особым случаем перезаписи строк.

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