Лингвофорум

Лингвоблоги => Личные блоги => Блоги => Марбол => Тема начата: Марбол от ноября 24, 2013, 21:40

Название: Интерпретаторы и жизнь.
Отправлено: Марбол от ноября 24, 2013, 21:40
Здравствуйте!

Недавно я решил следующую прикладную задачу: написать на VBA программу, которая получает на входе текстовый файл, содержащий набор алгебраических формул и числовые значения всех величин в них, и выдает массив с результатами вычислений по этим формулам.
Формулы могут включать в себя: 0) вещественные и целочисленные переменные (их числовые значения указываются в том же исходном файле); 1) бинарные операции: алгебраические, логические и другие (их состав и взаимный порядок выполнения могут несложно изменяться); 2) общеизвестные элементарные функции одного переменного: синус, косинус, тангенс, котангенс, логарифм, модуль, знак, корень квадратный, арктангенс (их перечень может изменяться); 3) условную конструкцию вида "формула при условие" (пока рассматривается не наравне с бинарными операциями); 4) задание одномерных массивов: как поэлементно, так и по начальной и конечной точкам и числу элементов (массив первого типа возможен только один).

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

Например, исходный файл может иметь следующий вид (с употреблением всех возможностей):

a = 1
b = -0.5
c = 1.2345
d = 2.22
e = 3
f = 444
n1 = 10
n2 = 222
n3 = 5
dn = 3

fff1 = arctg(a+b*c/f)^d- |e| при e+sin(ln(cos(f+g/(e*d)-f^2)))>=e или (c-d<b и a<=b*c)
fff1 = |e| при -e+sin(ln(cos(f+g/(e*d)-f^n3)))<e
bububu = a*b ... c-d/f*R(a-c+d-e+f) N n1+dn
ssss = a ... b N n2
t = a ... b N n3
cond1 = (a>=b и c-d<f*e) или a>b=c>=d>e>=f
cond2 = a=f
массив = a; b; c; fff1; t при cond1
массив = a*b; c-d; sss при cond2

Этот пример исходного файла совершенно вымышленный. Жирным шрифтом выделены ключевые слова этого языка программирования.
Сверху задаются числовые значения всех используемых величин; затем идут формулы.

Сперва идут две условные формулы для вычисления fff1 при том или ином условии; оно может содержать алгебраические выражения, логические операции и операции сравнения.

Формулы bububu, ssss и t определяют одномерные массивы, для каждого из которых задаются начальная, конечная точки и количество интервалов разбиения отрезка.

Формулы cond1 и cond2 задают некоторые логические условия, используемые ниже
Формулы массив и массив поэлементно определяют состав массива в зависимости от того, выполняются ли условия cond1, cond2 (т. е. равны ли единице числа cond1, cond2).

Использование этого интерпретатора организовано так, чтобы оставались доступными все массивы, созданные при выполнении такой программки. Но фактически массив массив используется потом по-другому, чем массивы bububu, ssss и t.
Название: Интерпретаторы и жизнь.
Отправлено: Python от ноября 24, 2013, 21:52
Выкладывайте исходники, посмотрим. Может, у кого-то какие-то идеи появятся, как улучшить алгоритм.
Название: Интерпретаторы и жизнь.
Отправлено: Марбол от ноября 24, 2013, 22:19
Цитата: Python от ноября 24, 2013, 21:52
Выкладывайте исходники, посмотрим. Может, у кого-то какие-то идеи появятся, как улучшить алгоритм.

На мой взгляд, читать чужие исходники и, соответственно, выкладывать свои нужно в крайнем случае. Лучше я дам описание этого алгоритма, словесное с необходимыми рисунками. Но я разрабатывал программу по мере её написания, так что на чистовое описание алгоритма понадобится ещё некоторое время.
Название: Интерпретаторы и жизнь.
Отправлено: Марбол от ноября 24, 2013, 22:29
Возможно, это неотчётливо видно, но к ключевым символам не относятся только те, что хотя бы раз оказались в программе слева от операции присвоения " = ". Эту операцию следует отличать от операции сравнения "=".
Название: Интерпретаторы и жизнь.
Отправлено: Марбол от января 6, 2014, 21:15
Возможно, я непрофессионально выражаюсь, но под "языком" я имел в виду систему формальных правил, по которым следует писать нужную программу в виде текста, а под "интерпретатором" - систему программ, обеспечивающую пошаговое выполнение этой программы (как таковой или в преобразованном виде), без предварительного составления исполняемого двоичного файла.