Снобол
Снобол (SNOBOL) — язык программирования, разработанный в начале 1960-х годов и предназначенный преимущественно для обработки текстовых строк и манипуляций с символьными данными. Язык характеризуется исключительно высоким уровнем абстракции и применением аппарата математической лингвистики для анализа текстов. Будучи интерпретируемым языком, Снобол заложил основы для многих последующих инструментов обработки строк, став концептуальным предшественником таких языков, как AWK и Perl.
Общие сведения и парадигма
Отличительной особенностью архитектуры языка является практическое отсутствие традиционной системы типов данных. Единственным фундаментальным типом в Сноболе выступает строка. Любые вычисления, включая математические операции и работу с формулами, интерпретируются и реализуются как операции над строками или преобразование одной строки в другую. Понятие числа в классическом понимании машинной архитектуры в языке изначально отсутствовало.
В основе работы языка лежит мощный механизм сопоставления с образцом (pattern matching). В отличие от более поздних скриптовых языков, использующих регулярные выражения, Снобол опирается на формальные грамматики, в частности на форму Бэкуса — Наура (БНФ). Этот математический аппарат, тесно связанный с теорией формальных языков и иерархией Хомского, позволяет задавать сложнейшие правила синтаксического анализа. Шаблоны поиска в языке могут быть рекурсивными, что делает его аппарат сопоставления значительно мощнее традиционных регулярных выражений, в которых классическая рекурсия недопустима.
Из-за своего высокого уровня абстракции и специфического подхода к данным Снобол часто сравнивали с языком Лисп и относили к категории языков искусственного интеллекта. Язык предоставляет встроенные высокоуровневые операции: поиск подстроки, замена, конкатенация и разделение строки на части. Ввиду того, что Снобол не был приспособлен для сложных математических вычислений, в практической среде он часто использовался в связке с языком Фортран, который брал на себя числовую обработку.
История создания и развитие
Разработка языка началась в 1962 году. Изначально Снобол создавался математиками для работы с аналитическими математическими формулами, которые плохо поддавались обработке средствами Фортрана. Однако с развитием вычислительной техники парадигма сместилась: язык стали позиционировать как инструмент для специалистов гуманитарных дисциплин, в частности лингвистов, работающих с большими массивами текстов.
Эволюция языка включает в себя четыре основные версии: Первая версия, Снобол 1 (1962 год), была реализована для ЭВМ IBM 7090. Она отличалась предельно простым синтаксисом: в ней отсутствовали функции, декларации и существовал только один тип данных — строка. Снобол 2 стал промежуточной версией, в которой обкатывались новые синтаксические решения. В версии Снобол 3 были добавлены стандартные и пользовательские функции, что сделало язык по-настоящему рабочим инструментом. Эта версия получила широкую популярность, однако её использование по-прежнему ограничивалось компьютерами серии IBM 7090. Массовое распространение языка началось примерно в 1967 году. Снобол 4 (конец 1960-х — 1970-е годы) стал окончательной и наиболее известной реализацией. Интерпретатор был написан на ассемблере и адаптирован для вычислительной техники нового поколения. В эту версию была внедрена полная поддержка рекурсивных шаблонов.
Несмотря на интерпретируемую природу, некоторые реализации Снобола поддерживали многопоточность, модульность и имели развитые средства для работы с файловой системой (открытие, закрытие файлов и запись данных).
Синтаксис и примеры
Синтаксис языка отличается лаконичностью. Программы на Сноболе, как правило, очень короткие, поскольку большинство сложных операций сокрыто внутри встроенного механизма обработки шаблонов. Управление вводом и выводом осуществляется через присваивание значений специальным системным переменным.
Пример простейшей программы вывода текста:
OUTPUT = 'Hello world'
Считывание пользовательского ввода и ветвление также реализуются через работу с переменными без необходимости явного объявления типов:
USER_NAME = INPUT
Логика ветвлений во многих алгоритмах базируется исключительно на строковых сравнениях. Например, программа может считать имя пользователя, сопоставить его со списком известных имен и, в зависимости от совпадения, записать в буферную переменную значение-статус (например, маркер вежливого или грубого обращения). Затем с помощью меток осуществляется переход к нужному блоку формирования ответной строки. По умолчанию, если условия не выполняются, программа может вывести стандартное приветствие.
В качестве демонстрации вычислительной мощности языка часто приводится алгоритм поиска палиндромов (например, поиск максимального палиндрома нечетной длины, состоящего только из нулей и единиц). Структура такой программы включает:
- Задание грамматики (шаблона) в начале программы, описывающей структуру искомого слова из нулей и единиц.
- Организацию цикла, который считывает строки и отсекает завершающие пробелы.
- Проверку строки на соответствие заранее заданной грамматике.
- Использование специальных функций для проверки текущей позиции в строке и цикличного смещения курсора.
- Использование меток для перехода в конец программы в случае неудачного сопоставления или для печати результата в случае успеха.
Применение и современное состояние
Пик популярности Снобола пришелся на 1970-е годы. Он активно использовался в математической лингвистике, при разработке компиляторов, анализе графов и текстовых данных. Наличие исчерпывающей документации способствовало формированию академического сообщества вокруг языка.
Спад популярности начался в 1980-е и 1990-е годы. Снобол отличался высокой абстрактностью и сложностью заложенного в него математического аппарата грамматик. В индустрии обработки текстов он был вытеснен языком Perl (и в меньшей степени утилитой AWK). Perl во многом наследовал философию Снобола, однако отказался от громоздкой концепции формальных грамматик в пользу более легких в освоении и быстрых регулярных выражений, что сделало его более прагматичным инструментом для повседневных задач. Тем не менее, язык Снобол до сих пор поддерживается сообществом энтузиастов, существуют рабочие трансляторы, позволяющие запускать исторический код на современных вычислительных системах.