Трудно ответить на вопросы типа «является X Y », если участники используют дебаты различных определений X и Y . Возможно, для некоторых определений ответ - «да», а для некоторых определений - «нет». Особенно, если ответ зависит от технических деталей, где разные определения отличаются. Также это обсуждение содержит некоторую дезинформацию, поэтому наберитесь терпения и дайте более длинный ответ.
Что мы подразумеваем под « языком программирования »?
Простым ответом может быть «язык, используемый для создания программ». Конечно, но: что за программы? А как насчет языка, который можно использовать для создания некоторых видов программ, но не других видов программ? Вот два конкретных примера, иллюстрирующих крайние случаи:
1) Мнимый язык под названием M работает следующим образом: если программа содержит одну букву «m», она создает игру «Сапер». Все остальное - синтаксическая ошибка.
Интуитивно, это не то, что мы имеем в виду, говоря «язык программирования». Но отдел маркетинга M может утверждать, что он технически соответствует определению, поскольку его можно использовать для создания программы. Конечно, компилятор делает некоторые важные части для вас, но это то, что делают компиляторы, не так ли? Компилятор языка C также переводит некоторые простые слова в десятки инструкций процессора. Компилятор M просто идет дальше и делает вашу работу еще проще.
2) Если вы устанавливаете оригинальную версию знаменитого Turbo Pascal, вы можете написать много разных программ. Но вы не можете написать игру, которая запускается в веб-браузере, потому что необходимого API просто нет.
Так что именно делает Turbo Pascal языком программирования, но у M его нет? Проще говоря, в Pascal вы можете сделать больше, чем в M. Но представьте, что у нас есть M.NET, которая создает игру Minesweeper, работающую в веб-браузере. Итак, теперь у нас есть кое-что, что может сделать Паскаль, а M.NET - нет, но у нас также есть кое-что, что может сделать М.NET, а Паскаль - нет. Почему мы должны считать преимущества Паскаля важными, а преимущества M.NET - несущественными?
Ответ в том, что вы можете писать все виды алгоритмов на Паскале, но вы не можете писать алгоритмы на M или M.NET. Конечно, M компилирует вашу команду «m», а C компилирует вашу команду «strcmp». Но вы можете поместить "strcmp" в более широкий контекст, например, сравнить два файла построчно, или прочитать тысячи строк и отсортировать их по алфавиту, или ... ну, миллионы других вещей. И именно эта способность использовать данные команды в любом алгоритме составляет суть языка программирования.
Что такое алгоритм, и что более важно, что такое «любой алгоритм»? В информатике мы используем слова полного по Тьюрингу . Идея состоит в том, что существует набор компьютерных языков, где каждый из них может имитировать все из них. Одним из таких языков является машина Тьюринга, поэтому их так и называют. Паскаль есть, C есть, Java есть, Python есть, Lisp есть, Smalltalk есть, даже XSLT есть. Наши гипотетические M и M.NET не существуют. Вы можете узнать об этом больше в любом университете, предлагающем достойный курс информатики, но идея в том, что полный по Тьюрингу язык может делать все что угодночто может сделать другой язык, полный Тьюринга, если вы предоставите им минимально необходимый API. (Если вы дадите какой-нибудь API веб-браузера для Pascal, вы сможете создавать все виды игр в веб-браузере. Если вы дадите API веб-браузера для M, вы все равно сможете создавать только Сапер.) Мы можем метафорически сказать, что если вы удаляете все API из языка программирования, важная вещь - это то, что остается.
Что мы подразумеваем под « регулярными выражениями »?
Различные языки программирования реализуют их немного по-разному. Но оригинальная идея состояла в том, что регулярные выражения выражают так называемые регулярные языки . Обратите внимание, что здесь мы говорим не о языках программирования, а о (псевдо) человеческих языках. Представьте, что вы обнаружите какое-то экзотическое племя, говорящее на языке, состоящем только из слов «ба», «баба», «бабаба» и так далее. Вы можете описать этот язык устно как «слог« ba », повторенный один или несколько раз» или используя регулярное выражение как «(ba) +».
Предполагается, что регулярные выражения выражают: «ничего», «это письмо», «это, затем то», «то или это», «это, повторяется один или несколько раз» и «не это». - Это математическое определение. Все остальное - это просто удобный ярлык, созданный из предыдущих компонентов. Например, «это, повторяется два или три раза» можно перевести как «это, затем следует, затем (это или ничего)», но было бы удобнее написать «ba {2,3}», чем «baba (ба)?».
В реальной жизни типичная реализация «регулярных выражений» реализует больше, чем это. Например, используя математическое определение, язык «aba», «aabaa», «aaabaaa» и т. Д. - любое число «a», за которым следует «b», за которым следует то же число «a» с - это не обычный язык. Однако многие «регулярные выражения», используемые сегодня, могут обнаружить это, используя дополнительную концепцию «того же, что мы нашли раньше», записанную как «(a +) b \ 1». Используя эту дополнительную концепцию, мы можем сделать несколько интересных вещей, например, обнаружить слова, состоящие из простого числа букв. Тем не менее, мы не можем сделать какой-либо алгоритм ... для объяснения, почему,
Итак, вернемся к исходной теме: являются ли регулярные выражения (определяемые как: выражения, описывающие обычные языки в иерархии Хомского, или как: первый плюс операция \ 1) языком программирования (определяемым как: полный по Тьюрингу)? Ответ - нет . Нет, вы не можете реализовать какой-либо алгоритм с использованием регулярных выражений, а возможность реализовать любой алгоритм - это то, что люди, изучающие информатику, обычно понимают как сущность языка программирования.
Конечно, любой может изменить ответ, настаивая на другом определении . Как я писал в начале, здесь важны технические детали. Если вы ошибаетесь, вы получите неправильный ответ.
И если вас не интересуют технические детали, ответ может быть следующим: можете ли вы использовать регулярные выражения (и ничего больше) для создания программы? Так зачем называть это языком программирования? (Однако такой ответ был загружен и удален здесь, поэтому я написал эту более длинную версию.)
РЕДАКТИРОВАТЬ: Кроме того, любой может создать библиотеку, реализующую свой новый вариант «регулярных выражений» с некоторыми новыми функциями. В какой-то момент новых функций может быть достаточно для того, чтобы вся система стала завершенной по Тьюрингу. Тривиальным примером будет встраивание языка, полного по Тьюрингу, с использованием некоторого нового синтаксиса; но это также может произойти менее очевидно. Может быть, это уже случилось.