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

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

  • Когда была идея пользовательского преобразования кода (перед интерпретацией или компиляцией) сначала описана (теоретически)?
  • Что первая реализация языка программирования должна была иметь подобные Шепелявости макросы ("подобным Шепелявости", я означаю "использовать читаемый полный по Тьюрингу язык, чтобы сделать преобразование кода")? (включая не шепелявит - Forth, например, довольно стар, но я не уверен, имела ли первая реализация Forth уже "НЕПОСРЕДСТВЕННЫЙ"),
  • Также, кто из тех был первым высокоуровневым языком программирования (исключите ассемблерные языки...),
  • Что первый диалект Lisp должен был иметь макросы?

Спасибо!

27
задан Ira Baxter 11 February 2016 в 17:04
поделиться

3 ответа

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

3.3 Макросы

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

Тимоти П. Харт, MACRO Definitions for LISP , октябрь 1963 г.

9
ответ дан 28 November 2019 в 05:32
поделиться

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

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

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

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

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

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

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

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

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

10
ответ дан 28 November 2019 в 05:32
поделиться

Чтобы узнать, как макросы появились в Лиспе, следует поискать упоминания о FEXPRs и FSUBRs, которые являются предшественниками современных макросов Лиспа (точнее, FEXPRs являются предшественниками макросов, определяемых пользователем). Они упоминаются в нескольких местах - например, в разделе От LISP 1 до LISP 1.5 книги Маккарти История Лиспа. Но на самом деле, это упоминается и раньше: на стр.48 LISP I PROGRAMMER'S MANUAL (от 1960 года) вы можете увидеть описание FEXPRs и FSUBRs.

BTW, сравнение макросов Лиспа со строковыми системами немного нелепо. Преимущество использования древовидного трансформатора по сравнению с манипуляциями со строками достаточно значительно, чтобы сделать его совершенно другой системой. Другим важным аспектом макросов Лиспа является то, что они являются локальным преобразованием по сравнению с глобальным преобразованием программы (наиболее очевидная статья, которую следует прочитать для этого, - On the Expressive Power of Programming Languages Феллейзена). И, конечно, здесь есть целая область - переход от FEXPR к современным, более хорошо себя ведущим макросам, затем к гигиеническим макросам в Scheme (которые имеют дело с представлением, более богатым, чем символьные деревья разбора), затем к комбинации макросов и системы модулей, фазам расширения синтаксиса, и т.д. и т.п. Здесь, вероятно, достаточно материала для нескольких лет чтения...

18
ответ дан 28 November 2019 в 05:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: