ОД/Я
В этой статье есть несколько проблем. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти шаблонные сообщения )
|
ML/1 ( Macro Language/One ) — мощный макропроцессор общего назначения . [1]
Типичные варианты использования ML/1 включают:
- редактирование, изменение, исправление или переформатирование текстовых файлов
- перевод исходного кода с одного языка программирования на другой
- действует как препроцессор исходного кода, позволяя пользователю добавлять новые синтаксические формы в существующий язык программирования.
- поддержка параметризации исходного кода программы (например, параметр может определять, следует ли включать операторы отладки в исходный код программы, передаваемый компилятору)
ML/1 был разработан в 1966 году Питером Дж. Брауном в рамках докторской диссертации в Кембриджском университете в Англии. [2]
В 1984 году Роберт Д. Игер, один из коллег Питера Брауна в Кентском университете , переписал ML/I сначала на BCPL в 1981 году, а затем на C в 1984 году, что повысило его переносимость.
- Обратите внимание, что первоначальное название языка Питера Брауна было ML/I, где (как в IBM PL/I ) последним символом является римская цифра «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 чувствителен к регистру, поэтому не поддерживает обработку текста без учета регистра.
Ссылки
[ редактировать ]- ^ Эй Джей Коул (26 ноября 1981 г.). Макропроцессоры . Архив Кубка. п. 85. ИСБН 978-0-521-28560-5 .
- ^ Браун, П.Дж. (1967). «Макропроцессор ML/I» . Коммуникации АКМ . 10 (10): 618–623. дои : 10.1145/363717.363746 . ISSN 0001-0782 .
- ^ Таненбаум, А.С. (1976). «Макропроцессор общего назначения как компилятор-компилятор для бедняков». Транзакции IEEE по разработке программного обеспечения . СЭ-2 (2): 121–125. дои : 10.1109/TSE.1976.233539 . ISSN 0098-5589 . S2CID 16317510 .