index , prev , next

gener.ref

8. Пример порождения программы

Исходный текст любой программы на любом языке программирования является последовательностью символов. Язык рефал предназначен для обработки символьных данных произвольной структуры. Поэтому на рефале удобно обрабатывать тексты программ на любых языках, в том числе тексты рефал-программ.

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

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

Пример. Исходными данными является формула в символьном виде F, зависящая, скажем, от переменной t. Требуется вычислить в некоторых точках t1, t2, ... , tn значения формулы F, а также значения ее производной .

Ясно, что на языках программирования типа Basic, Pascal, Fortran очень трудно решить эту задачу, поскольку затруднительно вычислять производную .

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

Поэтому предлагается следующий способ решения задачи.

Программа на рефале, назовем ее gener.ref , вводит формулу F, затем дифференцирует ее и, наконец, порождает текст программы GN.BAS на языке Basic, в которую вставлены формула F и формула производной. Basic-программа, которая получилась, транслируется и выполняется. Ниже приведен вид программы GN для функции F(t) = sin(t) * cos(t)

10 t = 0.0
20 FOR I=1 TO 100
30 t = t + 0.01
40 F = sin(t)*cos(t)
50 FDt = (cos(t)*(1))*cos(t) + sin(t)*(-sin(t))*(1)
60 PRINT "t="; t, "F="; F, "FD="; FDt
70 NEXT I
80 END

Мы предполагаем, что функция и ее производная будут вычисляться в точках 0.01, 0.02, ... , 0.99, 1.00. От этого предположения можно легко избавиться за счет непринципиального удлинения текста программы .

Предположим, что формула F записывается в нескольких строчках, признаком конца формулы пусть будет символ "&", стоящий в конце формулы. Все пробелы должны игнорироваться.

gener.ref.

index , prev , next