hoc1hoc2hoc3lexhoc4hoc5hoc6Конечно, эти значения были вычислены программным способом: $
sed '/$/d' `pick *.[chyl]` | wc -lБезусловно, развитие языка может быть продолжено, и вам предоставляется такая возможность в приведенных ниже упражнениях.
Измените
hoc6$1Сейчас все переменные глобальны, за исключением параметров. Уже есть большая часть механизма для введения локальных переменных, хранимых в стеке. Одно из решений заключается во введении описания
autoКак бы вы ввели массивы в язык
hocОбобщите работу со строками так, чтобы переменные могли хранить строки, а не только числа. Какие операции потребуются для этого? Самая трудная часть управление памятью добейтесь динамичного хранения строк: память должна освобождаться, когда строки перестают быть нужными. В качестве промежуточного шага добавьте более развитые форматы печати, например, обеспечьте возможность использования некоторых форм стандартной Си функции
printf8.7 Оценка времени выполнения
Мы сравнивали
hocack(3,3)func ack() { if ($1 == 0) return ($2+1) if($2 == 0) return (ack($1 - 1, 1)) return (ack($1 - 1, ack($1, $2 - 1)))}ack(3,3)Второй тест — стократное вычисление чисел Фибоначчи со значениями, меньшими 1000. В этом случае выполнялись в основном арифметические операции с периодическим вызовом функций:
proc fib() { a = 0 b = 1 while (b < $1) { с = b b = a+b a = c }}i = 1while (i < 100) { fib(1000) i = i + 1}Тест выполнялся на четырех языках:
hocbc(1)basЧисла, приведенные в табл. 8.1, являются суммой пользовательского и системного времени процессора и вычислены с помощью функции
time| Программа | (3,3) | 100*fib(1000) |
|---|---|---|
hoc | 5.5 | 5.0 |
bas | 1.3 | 0.7 |
bc | 39.7 | 14.9 |
c | <0.1 | 0.1 |
Таблица 8.1: Время работы на PDP-11/70 (в секундах)
Можно также приспособить Си программу для определения количества времени, используемого каждой функцией. Программу нужно перетранслировать в режиме профилирования, введя флаг
-pmakefilehoc6: $(OBJS) сс $(CFLAGS) $(OBJS) -lm -о hoc6чтобы команда
ссCFLAGS$ make clean; make CFLAGS=-pто результирующая программа будет выполняться с профилированием. После выполнения программы остается файл
mon.outprofДля иллюстрации изложенного мы протестировали
hoc6$ hoc6 <fibtest $ prof hoc6 | sed 15q name %time cumsec #call ms/call_pop 15.6 0.85 32182 0.03_push 14.3 1.63 32182 0.02mcount 11.3 2.25csv 10.1 2.80cret 8.8 3.28_assign 8.2 3.73 5050 0.09_eval 8.2 4.18 8218 0.05_execute 6.0 4.51 3567 0.09_varpush 5.9 4.83 13268 0.02_lt 2.7 4.98 1783 0.08