- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Журнал «Компьютерра» № 34 от 18 сентября 2007 года - Компьютерра
Шрифт:
Интервал:
Закладка:
Как только мы спускаемся уровнем ниже "общего плана" – до отдельных строк кода, параметров функций и времени жизни переменных [Знаменитый теоретик computer sciense Гради Буч называет это "археологией при помощи зубной щетки"], – никакого другого метода понять и разобраться, кроме чтения строки за строкой, не остается.
Более того, и чтение кода без готовых, заранее поставленных вопросов – то есть просто "просмотр для галочки" – практически бесполезно. Самый же эффективный метод исследования – «деятельное» чтение, то есть участие в работе исследуемых исходников. В зависимости от свойств исследуемых кусков кода и окружающей среды "деятельное чтение" может означать, например, многократное выполнение «древней» программы с постепенным изменением различных частей ее кода; или прогонку в отладчике, с отслеживанием значений разных переменных; или «заимствование» непонятного куска в «чистую» среду (программу-заглушку) для выяснения принципов работы этого куска. Здесь же могут помочь модульные тесты (специальный код, тестирующий различные аспекты функциональности) – если они прилагались к исходникам, это куда полезнее любой спецификации; если же нет – могут быть написаны с нуля как один из видов деятельности в процессе исследования.
Придирчивый читатель мог бы заметить, что автор упускает из виду "объективно древние" исходники, которые по той или иной причине – нет старого компилятора, нет старой ОС, нет старой библиотеки – просто не могут быть собраны и запущены. Автор не упускает. В этом случае "деятельное чтение" просто становится сложнее – приходится изучать "древнюю драгоценность" почти вслепую; в простейшем случае (чтение интереса ради) – «запуская» код в уме; в более сложном (необходимо таки заставить старую библиотеку работать; или переписать старый алгоритм на новом языке) – по кусочку переводя проект "на новые рельсы" и тщательно анализируя результат.
Короче говоря, практически единственный честный и полноценный способ исследования "археологических древностей" – полное переписывание; не обязательно «честное», оно может выглядеть просто как удаление частей исходника и постепенное их возвращение на место – тем не менее других вариантов "качественного ознакомления" с артефактом человечество пока не придумало [Другой вопрос, многие ли «древности» стоят таких трудов?].
Но самое смешное, что когда «старый» код [Или извлеченные из него идеи] станет «новым», твоим, родным, частью проекта, – он неизбежно начнет стареть, чуть только отведешь глаза, перестанешь обновлять и пересматривать эти части исходников. Остается лишь повторять, как и все, вслед за Черной Королевой: "Здесь, знаешь ли, приходится бежать со всех ног, чтобы только остаться на том же месте!"
Примеры и иллюстрацииПример довольно простого кода, который для понимания может потребовать длительных изысканий, – быстрый алгоритм нахождения обратного квадрата числа (1/яx), приписываемый разработчику Quake Джону Кармаку. Алгоритм использует метод быстрых приближений Ньютона и включает следующую «очевидную» строчку с использованием магического числа (сопутствующий ей комментарий, как правило, встречается во всех популярных описаниях алгоритма):
i = 0x5f3759df – (i >> 1); // what the f..k?
Пример переписывания «мнимо древнего» кода – одно из первых в истории веб-приложений бизнес-класса, Viaweb. Оно было написано знаменитыми хакерами Полом Грэмом и Робертом Моррисом на Lisp и через некоторое время куплено Yahoo и переименовано в Yahoo!Store. Впоследствии Yahoo, озабоченная экзотичностью Lisp’а, заставила своих программистов провести «археологические изыскания» для переписывания приложения с нуля на Perl и C++. По слухам, код современного Yahoo!Store очень похож на интерпретатор Lisp (иллюстрируя тем самым 10-е правило Гринспуна).
Пример проблемы объективной древности – Strongtalk, эффективная реализация языка Smalltalk с возможностью статической типизации была некогда куплена Sun, а через много лет возвращена программистскому сообществу как open source. Естественно, все исходники виртуальной машины (языки – C и ассемблер) требовали древних версий компиляторов. И если C-часть была «переведена» на современный диалект языка довольно быстро, то ассемблерные куски до сих пор требуют Borland TASM 4.0 (еще DOS’овская версия), поэтому приходится распространять как исходный код, так и скомпилированные «энтузиастами-археологами» файлы.
Пример «археологических изысканий ради понимания алгоритма» – мы знаем, что формат файла Microsoft Word как таковой существует. Спецификация на него известна и даже доступна публично (какой-то из антимонопольных процессов потребовал этого от корпорации), но ее стиль и степень подробности не позволяют «просто написать соответствующий код» – многие нюансы требуют экспериментирования. Поэтому гораздо более полезный справочник по форматам Microsoft – опенсорсные библиотеки для чтения этих форматов (например, antiword или Apache POI, а лучше – «перекрестный допрос» обеих библиотек, дабы лучше понять, что является особенностью формата, а что особенностью библиотеки).
Пример ситуации, где старение сильнее автора кода, – программа Sketchpad, созданная в 1963 году. Она была во многом революционной, еще бы – первая интерактивная CAD, первая объектно-ориентированная система… Но несмотря на то, что автор программы по-прежнему жив и в здравом уме, сомнительно, что сегодняшний вице-президент Sun Айвен Сазерленд смог бы подробно объяснить логику исходников, некогда написанных аспирантом Айвеном Сазерлендом на макроассемблере машины TX-2.
Ностальгируя по БЭСМ-6…
Автор: Юрий Романов
В Интернете на странице «Ностальгия по БЭСМ-6» Леонида Брухиса я встретил информацию о том, как однажды Сергей Вакуленко написал первую версию эмулятора БЭСМ-6. И мне очень захотелось включить в тему номера небольшой материал об этой работе. Обуреваемый сложными чувствами [Все очень просто: я сам неравнодушен к этой машине. Не как к «флагману парка советских ЭВМ», как ее когда-то называли. Очень много прекрасных часов любимой работы связаны для меня с аббревиатурой БЭСМ. Оказалось, не только у меня… Так что ностальгия налицо. – Ю.Р.], я списался с Сергеем и объяснил суть моих планов. Вот что он рассказал:
РЕАЛИИ
"Старые видеоархивы, записанные на «Кадр-103» и «Кадр-3ПМ», требуют срочного перевода на современный формат. Дело в том, что полностью прекращено производство запасных частей для этих аппаратов, что делает материалы в этих форматах практически непригодными для использования (не на чем воспроизводить)".
Директор Гостелерадиофонда России А. И. Высторобец
– Да, тема, конечно, интересная. Трудность в том, что я уже смутно помню, как было дело. Тексты первых версий программы, к сожалению, не сохранились. Архивные магнитные ленты тех лет перестали читаться… Основные факты, впрочем, известны.
В 1989 году я защитил диплом, темой которого был перенос Си-компилятора Джонсона (pcc) на БЭСМ-6 и Эльбрус-Б. В дальнейшем компилятор использовался командой Новосибирского ИТМиВТ при разработке Unix для этих машин. При отладке возникла определенная сложность: тестирование порожденного кода оказалось более трудоемким, чем хотелось бы. Чтобы выполнить «сгенеренный» бинарный код на реальной машине, надо было преодолевать не только несовместимость форматов носителей, но и несколько сот метров пространства между разными зданиями ВЦ института Курчатова. Кроме того, в ОС ДИСПАК для БЭСМ-6 не существовало диалогового отладчика с возможностью пошагового выполнения команд. Возникла мысль: а почему бы не сделать эмулятор? Со встроенным отладчиком. Система команд простая и известная, а тонкости команд деления и алгоритма нормализации меня тогда не интересовали [Через несколько лет эти команды доставят много хлопот любителям "археологических раскопок" БЭСМ-6. См., например, www.mailcom.com/besm6/emulnews_ru.shtml].
Для проверки компилятора достаточно было целочисленной арифметики. Эмулятор – программа простая, за неделю он был готов, еще за неделю дополнен всеми необходимыми режимами отладки и трассировки. Месяц-два активного использования – и следующие года три он пролежал в "долгом ящике". Тогда же я похвастался этим «чудом» перед народом из ИТМиВТ, и они этого не забыли.
Году в 1992-м (или в 1991-м?.. точно не помню) Миша Ярославцев, уезжая в Калифорнию, попросил у меня тексты. Перед отъездом он собрал все доступные образы системных дисков БЭСМ-6 и решил на чужбине, теплыми калифорнийскими вечерами, оживить ОС ДИСПАК вкупе с мониторной системой, трансляторами и прочими интересными вещами. В этом его активно поддержал Леня Брухис. С тех пор тексты уже мало похожи на мои: Миша все перелопатил, оптимизировал, а главное – дополнил реализацией экстракодов (системных вызовов). Что весьма нетривиально, так как ни документации по экстракодам, ни текстов ДИСПАК не сохранилось. Также они умудрились аутентичным образом реализовать все команды плавающей точки. Это большое достижение.

