Когда появилась идея макросов (преобразование пользовательского кода)? - PullRequest
27 голосов
/ 18 июня 2010

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

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

Спасибо!

Ответы [ 3 ]

18 голосов
/ 18 июня 2010

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

Кстати, немного странно сравнивать макросы Lisp со строковыми системами. Преимущество использования древовидного преобразователя перед строковыми манипуляциями достаточно существенно, чтобы сделать его совершенно другой системой. Другим важным аспектом макросов Lisp является то, что они являются локальным преобразованием по сравнению с глобальным преобразованием программы (наиболее очевидная статья, которую можно прочитать для этого, - «1017 * о выразительной силе языков программирования» Феллайзена ). И, конечно, здесь есть целая область - от FEXPR до современных макросов с более хорошим поведением, затем до гигиенических макросов в Схеме (которые имеют дело с представлением, которое более богато, чем символические деревья разбора), затем комбинация макросов и модульная система, фазы расширения синтаксиса и т. д. и т. д. и т. п. Здесь, вероятно, хватит материала на несколько лет чтения ...

10 голосов
/ 18 июня 2010

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

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

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

Оба эти макропроцессора с поддержкой Тьюринга.

СНОБОЛ также датируется тем же периодом.

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

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

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

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

9 голосов
/ 18 июня 2010

С Эволюция Лиспа (Стил / Габриэль):

3,3 Макросы

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

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

...