Итак, мы завершили разработку программы hoc
hoc1
hoc2
hoc3
lex 229)hoc4
hoc5
hoc6
Конечно, эти значения были вычислены программным способом: $
sed '/$/d' `pick *.[chyl]` | wc -l
Безусловно, развитие языка может быть продолжено, и вам предоставляется такая возможность в приведенных ниже упражнениях.
Измените hoc6
$1 и т.д.Сейчас все переменные глобальны, за исключением параметров. Уже есть большая часть механизма для введения локальных переменных, хранимых в стеке. Одно из решений заключается во введении описания auto
Как бы вы ввели массивы в язык hoc
Обобщите работу со строками так, чтобы переменные могли хранить строки, а не только числа. Какие операции потребуются для этого? Самая трудная часть управление памятью добейтесь динамичного хранения строк: память должна освобождаться, когда строки перестают быть нужными. В качестве промежуточного шага добавьте более развитые форматы печати, например, обеспечьте возможность использования некоторых форм стандартной Си функции printf
8.7 Оценка времени выполнения
Мы сравнивали hoc
ack(3,3), — хороший тест для отработки механизма вызова функций. Здесь происходят 2432 вызова, причем некоторые из них достаточно глубоко вложены.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 = 1
while (i < 100) {
fib(1000)
i = i + 1
}
Тест выполнялся на четырех языках: hoc
bc(1), bas (древний диалект Бейсика, который существует только на PDP-11) и Си (использовался тип PDP-11 для всех переменных) .Числа, приведенные в табл. 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 (в секундах)
Можно также приспособить Си программу для определения количества времени, используемого каждой функцией. Программу нужно перетранслировать в режиме профилирования, введя флаг -p
makefile для чтения:hoc6: $(OBJS)
сс $(CFLAGS) $(OBJS) -lm -о hoc6