Ну типа.
Я имею в виду, что это не так сложно или причудливо, как то, что используют, например, Python, C или Java. Это то, что можно было бы назвать маленьким языком программирования, имеющим ограниченную функциональность, но, тем не менее, работающим.
Но он работает (довольно прилично), обрабатывает ошибки и служит цели.
Что оно делает?
Я большой любитель математики. Но что касается языков программирования специально для математики, я не смог найти ничего, кроме MATLAB и Mathematica, оба из которых являются платными программами. И даже в популярных языках, таких как Java и Python, вам нужно пройти обучение и изучить весь базовый синтаксис, прежде чем перейти к библиотекам, которые вы можете использовать для математических операций.
Хотя GNU Octave — это язык, ориентированный на математику и бесплатный для использования, его синтаксис поначалу может показаться немного пугающим. В результате я придумал бесплатный язык программирования, который был бы максимально простым до такой степени, что любой мог бы определить, что делает каждая строка кода.
Начало (не совсем)
Вскоре я понял, что никто не придумывает язык программирования просто потому, что это сложно.
Во-первых, вам нужно определить синтаксис языка; имена переменных, литералы, типы данных и функции.
Как только вы преодолеете этот барьер, вам нужно сделать следующее:
- Разработайте лексер. Лексер — это простой инструмент, который считывает написанный вами код и разбивает его на токены, которые являются частями вашего синтаксиса, упомянутыми выше.
- Разработайте синтаксический анализатор: синтаксический анализатор — это инструмент, который берет токенизированные данные и использует их логическим образом, вставляя их в абстрактное синтаксическое дерево (AST). (Я не собираюсь объяснять каждую концепцию, которая использовалась при создании этого, потому что 1. У меня нет на это времени или энергии и 2. Я недостаточно квалифицирован для этого).
Поскольку я решил создать интерпретируемый язык, а не компилируемый (поскольку создание компилятора с использованием LLVM или libgccjit непросто), остальное было довольно просто. Тем не менее, три шага выше были довольно сложной задачей.
Я решил использовать Python из-за своего опыта работы с ним, но в будущем я надеюсь перенести исходный код на такой язык, как C или C++, который идеально подходит для интерпретируемых языков.
О моем языке
Я решил назвать его AdvAnalysis (сокращение от Advanced Analysis).
Вы можете определить до двух переменных; одна — это функция с именем func, а другая — число с плавающей запятой с именем a (для последнего имя может быть произвольным).
В языке есть некоторые предопределенные функции для обоих типов переменных, которые я описал ниже:
differentiate(func) %% returns the derivative of the function
Ах да, в AdvAnalysis комментарии даются с использованием %%.
Функция Differentiate(func) делает то, что вы ожидаете; это дает вам производную функции. На данный момент он ограничен только полиномами, но в будущем я планирую расширить его до всех типов функций (логарифмических, экспоненциальных и с несколькими переменными).
Далее:
integrate(func, A, B) %% return integral
Еще раз, назначение вышеприведенной функции довольно очевидно: она вычисляет интеграл функции «func» от x = A до x = B. Однако, в отличие от предыдущей, эта функция работает для всех функций с одной переменной (т. е. больше удобства использования).
det(A, B, C, D) %% return determinant
Из всех функций этого языка функция det(), пожалуй, наименее интересная, поскольку для матрицы 2x2 она вычисляет определитель, который, как вы все знаете, просто ad — bc. Однако в будущем я планирую добавить дополнительный параметр, относящийся к размерам матрицы, чтобы можно было легко вычислять определитель матриц любого размера.
graph(func, A, B)
Эта функция graph() позволяет нарисовать любую функцию между интервалами A и B. На самом деле довольно просто. Например, если бы вы делали это на Python, вам нужно было бы сначала изучить Python, а затем изучить matplotlib, чтобы сделать это. С другой стороны, AdvAnalysis делает графические функции тривиальной задачей.
Вот и все функции, связанные с аналитической стороной математики. Я также добавил несколько функций, оперирующих одной числовой переменной a.
double(a) %% return 2 * a square(a) %% return a * a cube(a) %% return a * a * a exp(a) %% return e ^ a log(a) %% return ln(a)
Опять же, это довольно тривиально и подчеркивает цель языка в целом: простота, но переход на следующий уровень.
Обработка ошибок
Одним из многих ограничений языка является отсутствие обработки ошибок, будь то логические или связанные с синтаксисом. Тем не менее, это есть до некоторой степени. Во-первых, вы должны закрыть все функции правильными круглыми скобками, иначе будет возвращено сообщение об ошибке. Также язык выдает соответствующие сообщения при неправильном написании функций, а также неверном количестве параметров (это еще в разработке).
Использование языка
В обозримом будущем я опубликую документацию и процесс установки AdvAnalysis.
Все файлы программы AdvAnalysis заканчиваются расширением .adv. Чтобы запустить программу, вам необходимо убедиться, что установленный файл .exe находится в том же каталоге, что и файл(ы) программы, а затем использовать командную строку для запуска исполняемого файла. Через несколько минут результаты ваших программ .adv будут возвращены вам.
Двигаемся дальше отсюда
Это была одна из самых сложных, но полезных вещей, над которыми я когда-либо работал. В ближайшие месяцы (а может быть, даже годы) я надеюсь расширить возможности языка, включив в него более продвинутые логические операторы и математические функции, сохранив при этом его дух. Кроме того, я постараюсь исправить любые заметные ошибки в синтаксисе языка и, возможно, даже пригласить еще несколько человек, чтобы помочь в его дальнейшей разработке.