ML / 1 ( Macro Language / One ) - мощный макропроцессор общего назначения . [1]
Типичное использование ML / 1:
- редактирование, изменение, исправление или переформатирование текстовых файлов
- перевод исходного кода с одного языка программирования на другой
- действует как препроцессор исходного кода, чтобы позволить пользователю добавлять новые синтаксические формы к существующему языку программирования
- поддержка параметризации исходного кода программы (например, параметр может определять, должны ли операторы отладки быть включены в исходный код программы, который передается компилятору)
ML / 1 был разработан в 1966 году Питером Дж. Брауном в рамках докторского исследования Кембриджского университета в Англии. [2]
В 1984 году Роберт Д. Игер, один из коллег Питера Брауна по Кентскому университету , переписал ML / I сначала на BCPL в 1981 году, а затем на C в 1984 году, что повысило его переносимость.
- Обратите внимание, что первоначальное название языка Питером Брауном было ML / I, где (как в PL / I IBM ) последний символ - это римская цифра «I», а не арабская цифра «1». Однако большинство последующих реализаций были названы ML / 1 (где последний символ - арабская цифра «1»).
С тех пор ML / 1 был перенесен на многие платформы и операционные системы, включая VMS , MVS , MS-DOS , OS / 2 и UNIX . В своих реализациях ML / 1 Боб Игер добавил функции и возможности в дополнение к тем, которые изначально были указаны в диссертации Питера Брауна.
Эта версия доступна для нескольких платформ на веб-сайте ML / 1 http://www.ml1.org.uk . Веб-сайт ML / 1 предоставляет дополнительную информацию о ML / 1, а также документацию (включая учебное пособие, простое вводное руководство и полное руководство пользователя).
Хотя общее количество пользователей ML / 1 в мире невелико, пользователи ML / 1 есть по всему миру, и Боб переписывался с пользователями ML / 1 в США, Канаде, Австралии, Новой Зеландии, Германии, Голландии. и Индия.
В статье 1976 года Эндрю С. Таненбаум описывает использование ML / I в качестве компилятора-компилятора . [3]
Обзор
ML / I принимает ввод в полностью свободной форме, обрабатывая данные как поток байтов, а не как серию строк или записей. Он не требует какой-либо особой маркировки вызовов макросов, что делает его особенно полезным для обработки произвольного текста. Замены текста могут быть простыми (например, PIG следует заменить на DOG) или сложными (например, заменять элемент между третьей и четвертой запятыми после последней точки на содержимое некоторого счетчика).
ML / I использовался для реализации нескольких элементов портативного программного обеспечения, включая его самого. Первоначально он был написан на специальном описательном языке, а затем преобразован в подходящий язык для каждой целевой системы. Это сопоставление было выполнено с использованием самого ML / I. Существовали две разные формы этого описательного языка; высокий уровень и низкий уровень.
После этого сопоставления ML / I часто использовался для реализации SIL (языков реализации системы, таких как C) для нового поколения мини-компьютеров с 16-разрядной архитектурой .
Как работает ML / 1
В общих чертах вот как работает ML / 1.
- Пользователь предоставляет ML / 1 файл, содержащий вводимый текст.
- В другом файле (или, необязательно, в том же файле) пользователь предоставляет набор макросов ML / 1. Макросы сообщают интерпретатору ML / 1, какие вставки, удаления, расширения, переводы и другие изменения пользователь хочет внести во вводимый текст.
- Когда ML / 1 запускается с вводимым текстом, ML / 1 следует инструкциям макроса ML / 1, изменяет текст и записывает новый файл, содержащий измененный текст.
Отличительные особенности ML / 1
Есть несколько способов сделать ML / 1 более мощным, чем простые утилиты «сканировать и заменять».
ML / 1 не обрабатывает текст на основе символьной строки за символьной строкой; он обрабатывает текст пословно (или, в терминологии ML / 1, «атом за атомом»). Для многих приложений чрезвычайно полезно иметь возможность обрабатывать текст как последовательность атомов, а не как последовательность символов. Предположим, например, что мы хотим перевести программу с языка программирования с синтаксисом DO ... END на язык с синтаксисом BEGIN ... END. Поэтому мы хотим заменить «DO» на «BEGIN». Если мы выполним замену с помощью обычной утилиты сканирования и замены, все вхождения строки «DO» будут заменены на «BEGIN», включая любые «DO», встроенные в такие слова, как «DOCUMENT» (что приведет к стать "НАЧАЛО"). Напротив, с ML / 1 этого не произойдет, потому что строка «DO» будет запускать замену текста только тогда, когда она встречается как слово (то есть когда ей предшествуют и следуют разделители, такие как пробелы, табуляции, новые строки, или знаки препинания).
ML / 1, вместо того, чтобы работать построчно, распознает шаблоны текста, которые могут быть довольно сложными, вложенными, с несколькими разделителями и занимать много строк. ML / 1 может, например, обрабатывать шаблон, такой как общий язык программирования IF ... THEN ... ELSE ... ENDIF, которая охватывает несколько строк и содержит встроенный текст, который сам может включать вложенный IF ... THEN ... ELSE ... ENDIF структура.
ML / 1 может распознавать встроенные комментарии и буквальные цитаты и защищать их от изменений. Обычные утилиты сканирования и замены изменяют строки без разбора, независимо от того, встречаются ли они в тексте программы как ключевое слово или имя переменной, встроены в комментарий или заключены в кавычки.
Чтобы иметь дело с такими сложными шаблонами, ML / 1 должен быть самостоятельным языком программирования. Как и другие языки программирования, ML / 1 поддерживает переменные и операторы присваивания, GOTO и метки, тесты IF ... THEN и циклы. Эти особенности придают ML / 1 необычайную мощность и гибкость.
Ограничения
ML / 1 чувствителен к регистру, поэтому он не поддерживает обработку текста без учета регистра.
Рекомендации
- ↑ AJ Cole (26 ноября 1981 г.). Макро процессоры . CUP Архив. п. 85. ISBN 978-0-521-28560-5.
- ^ Браун, П.Дж. (1967). «Макропроцессор ML / I». Коммуникации ACM . 10 (10): 618–623. DOI : 10.1145 / 363717.363746 . ISSN 0001-0782 .
- ^ Таненбаум, А.С. (1976). «Макропроцессор общего назначения как компилятор-компилятор для бедняков». IEEE Transactions по разработке программного обеспечения . SE-2 (2): 121–125. DOI : 10.1109 / TSE.1976.233539 . ISSN 0098-5589 .