Выбрать главу

— Послушай, к какому решению я пришла. У каждого действия всегда есть две стороны и они должны уравновешивать друг друга. Например, если студент сидит за учебой, его параметр знаний растет. Но ровно на эту же «стоимость» нужно что-то списать — свободное время, энергию, состояние здоровья, настроение.

Первый закон термодинамики в чистом виде. И это крутой подход! Я чуточку представляю, как работает бухгалтерия — и в ее сторону дорога кодерских приключений заводила. Полагаю, «заднице Одина» все же однажды быть. Лет через десять или даже раньше. Все, что для нее нужно — хорошая СУБД, и простой скриптовый язык. Даже бейсик сойдет. Но, может быть, я уже нежно любимые мной за простоту Питон или Джаваскрипт изобрету.

Про встречу с Тоддом промолчал. Нефиг всякой ерундой от важного отвлекать. А язык Си — это ведь важно? Наверное, да. Он и для написания трехмерных движков отлично подойдет, так как работает быстро. Почти все культовые шутеры из 90-х — Вольфенштейн, Дум 2, Квейк, Халф-Лайф — это Си. Ну, кое-где еще и Си-Плюс-Плюс, но уже не суть. Одно вытекает из другого.

Итак, первый практикум. Аспирант Сэм мне приветливо кивнул. Бренду проигнорировал, но хотя бы заявлений в духе «курица не птица, женщина не программист» делать не стал.

Нас усадили за компьютеры, а точнее, терминалы, дающие доступ к мощному по нынешним временам PDP-11. На вид обычные моноблоки, похожие на TRS-80 третьей модели, но на самом деле это вообще не полноценные машины, а мониторы с клавиатурой. Вся магия творится за перегородкой из толстого стекла, где расположилась допотопная серверная размером со спортзал. Компьютеры — шкафы. Жесткие диски габаритами со стиральную машинку, толстые пучки кабелей, что-то подпаивающие ремонтники в белых халатах. Подозреваю, могли бы обойтись и без стекла, но нарочно оставили юзверям обзор, чтобы прониклись величием и богатством университета. Не бывай я пару раз в продвинутых дата-центрах, тоже, наверное, впечатлился бы.

Гарланд прошелся и раздал каждому листочки с логинами и паролями. Я оказался Си-Си-1965. То есть инициалы и год рождения.

— Предполагается, что все вы владеете минимальными навыками работы с операционной системой. Если у кого-то будут затруднения, позовите, помочь вам моя работа, — посмотрел парень при этом на Бренду, — надеюсь, что все вы хорошо слушали мою лекцию. Сегодняшнее практическое занятие максимально простое: вам нужно написать программу для копирования массива данных с одного имеющегося адреса на другой. Однако…

Сэм подошел к имеющейся в классе грифельной доске и написал «1.5 секунды». Еще и обвёл в несколько кружочков, показывая важность.

— Вот ваша цель. Попробуйте оптимизировать свой код так, чтобы уложиться в поставленные временные рамки. Это сложнее, чем вам кажется и справятся не все.

Казалось бы, ничего сложного. Выдернуть данные из памяти по указанному адресу, перебрать циклом и положить в новые ячейки, оперируя указателями. Решается в один проход. Ну и еще добавить замер времени исполнения и его вывод. Где тут можно накосячить?

И в чем тут вообще принято писать? Какой текстовый редактор? Vi, Emacs? Глянув на руки соседа по терминалу, убедился, что минималистичный Vi. Ну и хорошо. Здорово было бы еще его исходники дернуть, как и более навороченного Емакса.

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

2.2 секунды. Ох, Семён Семёныч, не просто так ты нам «элементарную» задачу поручил. Неподалеку чертыхнулся еще один студент, скорее всего, получивший тот же или похожий результат. И как тут оптимизировать?

— Мистер Гарланд, я могу использовать ассемблер? — спросил один из соучеников, парень с длинными, как у рокера, волосами, стянутыми в хвост.

— Это было бы неспортивно. Не все тут изучали машинный язык PDP-11. Но это возможный выход. При использовании ассемблера вы бы получили порядка 1.2 секунды.

И как? Что-то такое на краю сознания зудело. Основные потери времени здесь не в копировании байтов памяти, а на самом цикле. А как быстрее? Убрать накладные расходы на обслуживание цикла можно через goto! Но чувствую, меня за его применение расстреляют на месте без суда и следствия.

«Не использовать метки и переходы по ним» — одна из первых заповедей программиста. Я бы сам всех собак на джуна спустил, примени он настолько грязное решение. Хотя в данном случае оно смотрелось бы не так и плохо.

Если goto — это выход, то надо, чтобы работало как с ним, но без него. Закрыл глаза и погрузился в недра воспоминаний. Решение продолжало напрашиваться, но никак не рождалось.

А стоит ли мне вообще напрягаться? Ну не совершу я невозможное. И что? С занятий меня не выгонят, двойку не поставят. Уважение не вычтут. Подозреваю, что в учебный план это занятие вписано специально, чтобы избавить нас от иллюзий о всемогущем Си. Но выпендриться-то хочется! Грешен — немного тщеславен и люблю купаться в лучах обожания коллег. Нравится мне, когда вокруг кодеры паникуют, и тут я весь такой из себя Д’Артаньян и решаю проблему парой строк кода.

— Да это невозможно! — воскликнул парень позади меня.

— Профессор Гарланд, а можете вы показать своё решение? — обратился еще один.

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

Да что же они все так орут! Еще и дышат громко! И сердцами стучат. Или это у меня самого тахикардия началась?

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

Я провалился в огненное кольцо и буду падать, падать, падать… Гори, гори, гори…

Провалился! Ай, карамба! Вспомнил! Переход по веткам конструкции выбора switch-case компилятор Си преобразовывает в машинный код, аналогичный goto. Но за использование кейза никто предателем заветов дедушек Кнута и Вирта меня не назовёт. Спасибо вам, мистер Кэш. Ваша музыка здорово прочищает мозги. Я на ваш концерт схожу, чтобы свой респект высказать.

В приступе кодерского вдохновения я положил руки на клавиатуру и родил выносящий мозг нормальному человеку код. Уродца с циклом while, вложенным в switch и начинающемся в первом ветвлении, а заканчивающимся после последнего. Восемь веток, немного копипаста и готово. Я восхитителен.

Точнее, не я. Вспомнил, что это придумал инженер Лукасфильма, будущей студии Пиксар. Нам в политехе приводили его код, как пример странного случая, когда все считают, что программа вообще не скомпилируется, а она исполняется и очень быстро. Тот парень — настоящий гений. А я всего лишь плагиатор, вовремя вспомнивший чужое решение.

— Это не будет работать. Компилятор выкинет тебе ошибку, — сказал мне подглядевший через плечо аспирант Гарланд.

Точь-в-точь мои мысли, когда доцент написал на доске странную конструкцию с огромным количеством фигурных скобочек, за которыми попробуй уследи. Эх… где там моя IDE c подсветкой. На мощном университетском серваке отлично крутилась бы. Моник, правда, монохромный, с зеленым люминофором.

— Спорим, что заработает, профессор? — я еще раз окинул код взглядом и не нашел в нашем с пиксаровцем уродце явного изъяна. Мы просто сокращаем накладные расходы на цикл… ну, не в восемь раз, но очень сильно. Можно и еще несколько ветвлений добавить, добить до 10 или 16. Больше, скорее всего, лишено смысла.

— Заключать пари со студентами непрофессионально.

— На шоколадку, сэр. Это мелочь.

Уместнее было бы на пиво, по-«одмински». Но от одной мысли всего передернуло и в ногу кольнуло. Психосоматика — она такая.

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