— Хорошо, — он слабо улыбнулся. — Если верны предсказания, через двенадцать часов в Раме снова станет светло. Тогда, я думаю, можно будет и отправиться.
— Возможно, — ответила она, — но сперва придется переговорить с Брауном и Хейльманом. Мне кажется, что нам лучше отправиться прямо с утра.
Потянувшись, он прикоснулся к ее руке.
— Спасибо, Николь.
Она отвернулась. Второй раз за этот час на глаза навернулись слезы. Оставив Такагиси, Николь направилась к домику доктора Брауна.
— Николь, это вы, — услышала она из темноты голос Ричарда Уэйкфилда. — А я был уверен, что вы спите. У меня есть для вас кое-какие новости.
— Привет, Ричард, — поздоровалась Николь, когда тот с фонариком в руках вынырнул из темноты.
— Я не мог уснуть, — пояснил он, — слишком много всякой пакости в голове. И решил поразмыслить над вашим делом. — Он улыбнулся. — Все оказалось куда проще, чем я предполагал. Не заглянете ли ко мне, поговорим?
Николь смутилась. Она уже обдумывала, что будет говорить Брауну и Хейльману о Такагиси.
— Или вы забыли, — напомнил Ричард, — всю эту историю с программным обеспечением „Рохира“ и ручными командами?
— Значит, вы работали над этим? — переспросила она. Прямо здесь?
— Конечно. Пришлось только попросить О'Тула передать сюда все данные. Пойдемте, я покажу.
Николь решила, что встреча с доктором Брауном может и подождать. Она шла рядом с Ричардом. По пути тот стукнул в стенку одной из хижин.
— Эй, Табори, угадай-ка, кого я нашел? — воскликнул он. — Нашу прекрасную докторшу и в самых густых потемках. Ты не хочешь к нам присоединиться? — И обратился к Николь. — Ему я кое-что уже объяснил, а в вашем домике было темно, и я решил, что вы уже спите.
Через минуту в двери появился Янош, приветствовавший Николь улыбкой.
— Отлично, Уэйкфилд, — ответил он, — только не затягивай, я и так засыпаю.
Когда они оказались в его хижине, британский инженер с явным удовольствием поведал, что случилось с роботом-хирургом при внезапном развороте „Ньютона“.
— Вы были правы, Николь, — проговорил он, — в „Рохир“ были введены ручные команды. Они действительно отключили защитные алгоритмы, и ни один из них не сработал во время маневра Рамы.
Улыбаясь, Уэйкфилд продолжил, убедившись, что Николь следит за его объяснением.
— По-видимому, когда Янош упал и ударил рукой по клавиатуре, он отдал три команды. Так по крайней мере решил „Рохир“, он принял последовательность из трех ручных команд. Естественно, получилась бессмыслица, но „Рохир“ не знал этого.
— Быть может, вы теперь представите, какие кошмары терзают душу того, кто создает программное обеспечение. Всех вариантов никто не может предвидеть. И программисты предусмотрели защиту от одной случайной команды — ну если кто-то неумышленно прикоснется к пульту во время операции, — но не от нескольких. Все ручные команды система считает экстренными. И, поскольку они обладают высоким приоритетом в программном обеспечении „Рохира“, принимаются к исполнению немедленно. Однако программа знает, что одиночная ручная команда может оказаться „плохой“, и способна отвергнуть ее и обратиться к следующему приоритету, в том числе и к защите от ошибок.
— Извините, — сказала Николь. — Я не поняла. Как это может программа отвергнуть одну плохую команду, а несколько пропустить? Я считала, что процессор оперирует с рядами.
Обернувшись к своему портативному компьютеру, Ричард по заметкам вывел на монитор ряды и колонки цифр.
— Вот операции, которые „Рохир“ выполнял после этих ручных команд.
— Они повторяются, — заметил Янош, — через семь операций.
— Правильно, — ответил Ричард. — Три раза „Рохир“ пытался исполнить первую ручную команду и каждый раз неудачно, потом он перешел к следующей команде, как это и предусмотрено программой…
— Но почему, — осведомился Табори, — он вернулся потом к первой команде?
— Потому что программисты не предусмотрели возможности поступления многократной ошибочной команды. Закончив обработку каждой команды, программа всякий раз спрашивает у себя — нет ли на буфере другой ручной команды. Если ее нет, программа отвергает первую команду и происходит прерывание. Если она есть, программа запоминает отвергнутую команду и считывает следующую. И если последовательно не прошли уже две команды, программа решает, что сломан процессор, и переключается на дублирующий и вновь пытается обработать те же ручные команды. Понимаете. Пусть одна…