Как научить научных сотрудников создавать лексер языка своей предметной области

Когда мы говорим о науке, мы часто представляем себе формулы, графики, эксперименты — но редко задумываемся, что язык, на котором ученый формулирует свою мысль, — это не просто средство коммуникации. Это инструмент мышления. И чем точнее, выразительнее и адаптированнее этот язык — тем глубже и эффективнее исследование.

С той точки зрения, создание формального языка предметной области (DSL — Domain Specific Language) перестало быть прерогативой программистов или теоретиков и становится насущной необходимостью для самого исследователя.

Это уже не «удобная запись для галочки», а настоящий интеллектуальный протез, расширяющий границы мышления и позволяющий учёному оперировать сложными идеями с лёгкостью, как будто они стали продолжением его руки.

Представьте: биолог, описывающий цепочку ДНК, вместо того чтобы вручную искать паттерны в последовательности ATGCGTACGTAGCT, пишет простую команду:

sequence: "ATGCGTACGTAGCT"; find "CGTA"

и получает мгновенный результат. Это не магия — это DSL.

Или финансист, которому нужно рассчитать сложный процент за 10 лет:

principal: 1000, rate: 5%, years: 10

и система сама выдаёт итоговую сумму, график роста, сравнение с инфляцией. Без Excel, без копипаста формул — только суть.

Или социолог, создающий анкету:

question: "Ваш возраст?", type: number, range: 18-99

и сразу получает валидированную форму, готовую к массовому опросу.

DSL — это не просто синтаксис. Это способ упаковать экспертизу в исполняемую форму, которая позволяет:Формализовать знания — превратить интуитивные правила в строгие конструкции языка.
Например, химик описывает реакцию как H2 + O2 → H2O, а система автоматически проверяет баланс атомов.

На основе DSL можно автоматизировать расчёты — избавиться от рутины и человеческих ошибок. Например, астроном фильтрует звёзды по яркости: filter stars where magnitude < 3.0 — и получает список без ручного просмотра каталога.

Язык поможет визуализировать данные — сделать сложное понятным одним взглядом. Например, математик пишет plot sin(x) from 0 to 2π — и видит график, а не таблицу чисел.

Можно воспроизводить эксперименты — любой коллега, запустив тот же код, получит тот же результат. Например, логист описывает маршрут from: "Склад А", to: "Магазин Б", max_time: 2h — и система моделирует доставку с учётом пробок и погоды.

Можно делиться методиками в машиночитаемом виде — ваш коллега в другом университете не будет гадать, как вы это сделали. Он просто запустит ваш DSL-код.

Такой язык — это не «ещё один инструмент». Это языковая среда, в которой наука становится быстрее, точнее и открытее. И самое прекрасное — сегодня для его создания не нужно быть гуру компиляторов. Достаточно понимать свою область — и иметь желание выразить её на языке, который поймёт и человек, и машина.

Ментальная карта с основными терминами и понятиями по проектированию и анализу языка предметной области
Ментальная карта с основными терминами и понятиями по проектированию и анализу языка предметной области

А первый шаг к этому — научиться писать лексер. Потому что именно с него начинается превращение текста в смысл.

И вот здесь возникает парадокс: почему большинство ученых до сих пор не создают свои языки? Ответ прост — они не знают, что это стало доступно.

Доступность библиотек Python, таких как sly, ply, lark, позволяет любому аспиранту, даже без глубокого знания теории компиляторов, за несколько часов создать работающий лексер — первый шаг к собственному языку.

Почему именно лексер — отправная точка?

Лексический анализатор — это фундамент. Он превращает «сырой» текст в структурированные токены — кирпичики, из которых строится всё здание языка.

Если вы научите ученого писать лексер, вы дадите ему:

  • понимание структуры языка — что есть ключевое слово, что — идентификатор, что — число;
  • навык формализации — как описать синтаксис регулярными выражениями;
  • практический инструмент — работающий код, который можно сразу использовать;
  • мотивацию — «я сделал язык!» — это мощный психологический триггер.

Лабораторная работа как путь от теории к практике

В рамках моего курса «Методы трансляции языков программирования» аспирантам предлагается выполнить лабораторную работу по созданию лексера для DSL своей предметной области.

Выбор области — осознанный: математика, биоинформатика, финансы, химия, социология и др. Это не абстрактное упражнение — это шаг к их собственному научному инструменту.

Шаг 1. Обоснование DSL: критерии языка

Прежде чем писать код, аспирант должен ответить: зачем нужен этот язык? Мы учим их формулировать требования:

  • Читаемость — язык должен быть понятен коллегам в области без программистского бэкграунда.
  • Лаконичность — минимум синтаксического мусора, чтобы не отвлекать от сути.
  • Однозначность — каждая конструкция должна трактоваться единственным образом.

Пример: для математики — plot sin(x) from 0 to 10 вместо plt.plot(np.linspace(0,10), np.sin(np.linspace(0,10))).

Шаг 2. Описание языка: синтаксис, семантика, вычисления

Аспирант описывает:

  • Синтаксис — как выглядит код (структура выражений, операторов).
  • Семантика — что означает каждая конструкция.
  • Вычисления — какие действия должны выполняться при интерпретации.

Пример ключевых слов для математического DSL: PLOT, FROM, TO, SIN, COS.

Шаг 3. Регулярные выражения — математика текста

Мы учим писать regex для:

  • Идентификаторов: [a-zA-Z_][a-zA-Z0-9_]*
  • Целых чисел: -?\d+
  • Вещественных чисел: -?\d+(\.\d+)?([eE][+-]?\d+)?
  • Строк: "([^"]*)"

Это не просто «копипаст» — это осознанное проектирование лексики языка.

Шаг 4. Конечный автомат — визуализация логики

Аспирант рисует ДКА для чисел с экспонентой — например, -123.45e-67. Это не формальность. Это момент, когда абстрактная теория становится осязаемой. Состояния, переходы, допускающие вершины — всё это учит думать алгоритмически.

Пример ASCII-диаграммы:

Как научить научных сотрудников создавать лексер языка своей предметной области

Шаг 5. Класс Token — структура данных как основа

Создание класса:

Как научить научных сотрудников создавать лексер языка своей предметной области

Это первый шаг к профессиональному коду — объектная модель, атрибуты, отладочный вывод.

Шаг 6. Ручной лексер — понимание изнутри

Написание функции manual_lexer(code) без библиотек — это как «собрать велосипед вручную». Это дает:

  • понимание, как работает токенизация,
  • навык обработки ошибок,
  • контроль над каждой позицией в тексте.

Шаг 7–12. Автоматизация с sly — переход на промышленный уровень

Здесь аспирант:

  • устанавливает sly,
  • наследует класс Lexer,
  • определяет токены через декораторы,
  • игнорирует пробелы,
  • обрабатывает ошибки,
  • считает строки,
  • распознает ключевые слова через словарь,
  • тестирует на корректном и ошибочном коде.

Пример теста:

Как научить научных сотрудников создавать лексер языка своей предметной области

Вывод:

Как научить научных сотрудников создавать лексер языка своей предметной области

Выводы: зачем всё это?

  1. Научное мышление требует языка. Формальный DSL — это не «игрушка программистов», а инструмент, расширяющий границы научного исследования.
  2. Python сделал создание языков доступным. Библиотеки вроде sly позволяют сосредоточиться на сути, а не на технических деталях.
  3. Лексер — это первый шаг, но очень важный. Он учит формализации, структурированию, проектированию — навыкам, которые пригодятся в любой научной дисциплине.
  4. Аспиранты, создавшие свой лексер, начинают мыслить иначе. Они видят, что могут не только использовать инструменты, но и создавать их. Это меняет их отношение к науке — от пассивного потребления к активному творчеству.

Заключение

Мы не учим аспирантов «писать компиляторы». Мы учим их формализовывать свою предметную область — превращать хаос идей в стройную систему, которую можно вычислить, проверить, повторить, улучшить. Лексер — это первый, но решающий шаг на этом пути.

Когда аспирант видит, как его строка plot sin(x) from 0 to 10 превращается в последовательность токенов, он понимает: он владеет языком своей науки.

А это — основа любой научной революции.

Доцент МГТУ им. Н.Э. Баумана, более 30 лет занимающийся исследованием и проектирование систем, увлечен философскими основами вычислительной техники и искусственного интеллекта. Специализируется на соединении абстрактных теорий с практической реализацией.

1
Начать дискуссию