суббота, 7 марта 2009 г.

Наткнулся на прошлогоднее интервью с Дональдом Кнутом

Искал в Интернете высказывания Дональдом Кнута по поводу его отношения к отладчикам и наткнулся на интервью, которое он дал в прошлом году. Прочел его с удовольствием (хотя временами были у меня смутные подозрения, что какие-то фрагменты этого интервью я уже видел раньше, в особенности про рак и возраст). Не смотря на то, что интервью уже довольно старое, своей актуальности оно совершенно не утратило. Вероятно потому, что Кнут на удивление умный и адекватный товарищ. Некоторые части захотелось процитировать.

Об OpenSource и закрытом ПО:

Успех программ с открытыми текстами - это, вероятно, единственное явление в компьютерной области, которому я в последние несколько десятилетий не удивляюсь…
…Тем не менее, я думаю, что небольшая часть программ, таких как Adobe Photoshop, будет всегда превосходить конкурентов из категории open source, таких как Gimp, по неизвестной мне причине.

Кнут развенчал в этом интервью легенду о том, как он выиграл соревнования программистов с помощью программы, которая заработала после первой же компиляции:

Все участники соревнования, кроме меня, работали в его лаборатории искусственного интеллекта, которая располагалась на холмах выше Стэнфорда, и использовали систему разделения времени WAITS. Я сидел внизу, на основной территории университета, и единственным доступным для меня компьютером был мейнфрейм, для которого я должен был пробивать перфокарты и отдавать их на обработку в пакетном режиме. Я пользовался системой Вирта ALGOL W (предшественником Pascal). Моя программа не заработала с первого раза, но, к счастью, я смог воспользоваться замечательной оффлайновой системой отладки Эдда Саттертвейта (Ed Satterthwaite), так что мне понадобилось всего два захода. Тем временем, ребята, пользовавшиеся WAITS, не смогли получить достаточного машинного времени, поскольку их машина была перегружена. (Я думаю, что программист, занявший второе место, который использовал этот “современный” подход, пришел к финишу почти через час после того, как я представил работающую программу, полученную с применением старомодных методов.) Это соревнование не было справедливым.

По поводу перехода к многоядерным архитектурам:

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

В этих словах я нашел подтверждение своим опасениям о том, что многопоточное программирование грозит превратиться в кошмар.

О том, почему literate programming не получило широкого признания:

Literate programming - это очень личная вещь. Мне оно кажется бесподобным, но это, может быть, потому, что я очень странный человек. У этого подхода имеются десятки тысяч поклонников, но не миллионы…
…Тем не менее, лично для меня literate programming - это наиболее важная вещь, вышедшая из проекта TeX. Этот подход не только позволил мне писать и поддерживать программы быстрее и надежнее, чем когда бы то ни было раньше, и он не только был для меня самым большим источником удовольствия, начиная с 1980-х гг. - он иногда оказывался незаменимым. Некоторые из моих основных программ, такие как метасимулятор MMIX, не могли бы быть написаны с применением любой другой методологии, о которой я когда-либо слышал. Сложность была просто чересчур устрашающей, чтобы с ней можно было справиться на основе моих ограниченных умственных возможностей; без применения literate programming все предприятие потерпело бы полную неудачу.
Если люди действительно обнаружат хорошие способы использования новомодных многоядерных машин, то я думаю, что это сделают те люди, которые повседневно используют literate programming. Literate programming - это то, что требуется для превышения обычного уровня достижений. Но я не считаю разумным навязывание идей кому бы то ни было. Если грамотное программирование - это не ваш стиль, забудьте о нем и делайте то, что вам нравится. Если этот подход не будет нравиться никому, кроме меня, пусть он умрет.

И еще одна цитата на эту тему:

Вероятно, правильно сказал Джон Бентли (Jon Bentley), когда его однажды спросили, почему грамотное программирование не овладело стремительно всем миром. Он заметил, что хорошо программировать умеет небольшая часть населения земного шара, а хорошо писать на естественном языке - другая небольшая часть. По-видимому, мне хотелось, чтобы каждый человек входил и в ту, в и другую группу.

Очень точное наблюдение. На удивление сложно встретить программиста, который был бы способен писать и качественный код, и хорошую документацию.

О его подходе к работе:

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

Мне кажется, что не зря здесь упомянута большая корзина для мусора :) Чем-то напоминает вот эту историю о китайском художнике.

О том, насколько тщательно Кнут подходит к созданию удобной именно для него рабочей среды:

У меня имеется несколько самодельных инструментов, таких как мой собственный спел-чекер для TeX и CWEB внутри Emacs. Я разработал собственный растровый шрифт для использования с Emacs, потому что я терпеть не могу то, как символы ASCII “апостроф” и “левая открывающая кавычка” эволюционировали в независимые символы, не соответствующие друг другу визуально. В Emacs у меня имеются специальные режимы, помогающие мне классифицировать все мои десятки тысяч файлов со статьями и заметками, а также специальные “быстрые клавиши”, наличие которых превращает писание книги в некоторое подобие игры на органе.

О том, какую работоспособность имеет человек в 70(!) лет:

Сейчас я чувствую себя таким же здоровым, как и всегда, с поправкой на то, что мне уже 70 лет. Когда я пишу TAOCP, мои слова текут легко, и я пишу грамотные программы, предшествующие вариантам TAOCP. Я просыпаюсь утром с идеями, которые меня радуют, и некоторые из этих идей нравятся мне и позже, днем, когда я ввожу их в свой компьютер…
…Что касается текущих каталогов в моей машине, в этом году я пока написал 68 разных CWEB-программ. В 2007-м году их было 100, в 2006-м - 90, в 2005-м - 100, в 2004-м - 90 и т.д. Кроме того, в CWEB имеется исключительно удобный механизм <изменения файлов>, с помощью которого я быстро создаю несколько версий и вариаций на одну и ту же тему; пока в 2008-м г. я создал 73 вариации этих 68 тем. (Некоторые из вариаций являются совсем короткими, всего несколько байт; другие имеют размер в 5 Кб и больше. Некоторые CWEB-программы имеют значительный размер, как, например, 55-страничный пакет BDD, работу над которым я завершил в январе.)

Просто удивительно! Вероятно, именно то, что Кнут настолько серьезно и плодотворно работает каждый день и является залогом его долголетия.

Он так же раскрывает секрет экономии времени:

Я выигрываю важное время, работая в пакетном режиме: я не приступаю к глубокому чтению статьи до тех пор, пока у меня не набираются десятки статей на ту же тему. Когда, в конце концов, я оказываюсь готов прочитать все, что накопилось на данную тему, я часто обнаруживаю, что большая часть этого материала мне совершенно не нужна, и мне не требуется его глубокая проработка.

Интересно, может ли подобная методика пригодиться при работе с большим количеством блог-постов на тему многопоточности и модели актеров (которые сейчас плодятся в великом множестве, в том числе и с моей помощью)?

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

пятница, 6 марта 2009 г.

Выпустил Mxx_ru 1.4.9

В последнее время развитие Mxx_ru доказывает, что пользователи для программного продукта – это все. Если пользователи есть, то среди них найдутся достаточно активные люди, чтобы высказать автору продукта свои пожелания и заставить его (автора то бишь) воплотить эти пожелания. Тем более, когда пользователи делают значительную часть работы вместо автора :)))

Вот так и произошло с Mxx_ru 1.4.9. Сначала Тимур Найрулин захотел скомпилировать проект CGRU под MacOS X. Затем он выяснил, почему это не получается с Mxx_ru 1.4.8. Затем он разузнал, что нужно указать компилятору/линкеру под MacOS. И мне осталось только вставить все это дело в Mxx_ru в виде нового тулсета gcc_darwin.

Затем Игорь Мирончик сделал патч для Mxx_ru, в котором реализовал поддержку инструмента lupdate из состава Qt4. И мне осталось только накатить этот патч.

За что им от меня большое человеческое спасибо! ;)

В результате, на RubyForge появилась новая версия Mxx_ru. Мне остается только сделать обновления в документации…

среда, 4 марта 2009 г.

SObjectizer и C++: вместе навсегда!

На C++ я программирую уже очень давно. Наверное, года с 1992-го, а может и с 1991-го. Блин, столько не живут :)

Так вот на C++ я программирую уже настолько долго, что периодически хочу сменить его на что-нибудь другое. Более лаконичное и безопасное. В первую очередь – безопасное. Со сборкой мусора. С проверками выхода за пределы буфера. Со stacktrace-ми в исключениях (да, я знаю, что в C++ с помощью дополнительных велосипедов и отладочной информации это можно получить). Пока ничего такого же быстрого и, как бы сказать, дающего возможность поизвращаться (трех-этажные шаблоны – это же увлекательное извращение) не нашел.

Через два месяца SObjectizer-4 будет семь (блин, вдуматься – СЕМЬ!) лет. Это достаточно долго. Хотя бы для того, чтобы всерьез заниматься проектированием SObjectizer-5.

Временами желания выбросить C++ и написать SObjectizer-5 “с нуля” совпадают во времени и пространстве. И я начинаю обдумывать, как мог бы выглядеть SObjectizer-5 на другом языке. На D. Или на Eiffel. Или на Scala. Ada. OCaml. C#. Вот в минувшие выходные опять смотрел в сторону Scala…

Но, практически всегда я останавливаюсь на одном вопросе: “А нужен ли будет SObjectizer на этом языке вообще?”

Для JVM-языков (Java и Scala в первую очередь) он вообще не нужен. Во-первых, потому, что для JVM сейчас и так только не ленивый клепает свои actor framework-и. Во-вторых, потому, что в мире JVM почему-то очень силен пиетет перед “правильными” решениями и технологиями. Вот J2EE и EJB – это правильные веши. Остальное – велосипедостроение.

Платформа .NET пока для меня загадка. В каких задачах она широко используется? Будет ли там востребован? Пока не понятно.

Eiffel и Ada сами по себе достаточно маргинальные языки (по крайней мере в нашей стране). Так что даже если SObjectizer-5 окажется восстребованным на Eiffel или Ada, то речь будет идти разве что об единичных применениях. Поскольку вряд ли Eiffel/Ada сами по себе применяются чаще :)

Очень хорошо могло бы быть с D. Поскольку для D сейчас вообще мало чего есть, а интерес он к себе привлекает изрядный. А тут бы мы с SObjectizer-5 подсуетились. Здорово могло бы быть, тем более, что на D приятно программировать. Одна сверхзвуковая скорость компиляции чего стоит! Но… Но пока сам D все еще в стадии формирования. И лично у меня уже нет больших надежд на то, что он когда-нибудь из этой стадии вырастет во что-то стабильное и надежное.

Так что остается C++. Со всеми его прелестями.

Положительным моментом в выборе C++ является то, что для C++ не так уж много проектов, подобных SObjectizer-у. Подтверждение чему я получил буквально вчера.

Вчера я получил письмо от француза (судя по имени и фамилии), который просил помочь в компиляции SObjectizer под Linux-ом. Я офигел. Поскольку мало того, что я не давал каких-либо анонсов в англоязычных изданиях, так еще нигде нет никакой документации по SObjectizer на английском. А тут человек нашел SObjectizer, скачал его, разобрался, что нужны еще ACE, Ruby, RubyGems и Mxx_ru. Установил все это и даже наполовину скомпилировал! Офигеть!!! (Оказалось, что он переводил документацию по SObjectizer с помощью Google Translate).

Когда же я у него спросил, откуда он узнал о SObjectizer, он ответил:

Since a long time, I search C++ toolbox make to create agents (and MAS). The majority of development made under java, but I want to use C++ for the speed execution. It seems that the majority of laboratory teams prefer java. So I try to search also under sourceforge, and I found sobjectizer existence.

Вот оно как. Дела с агентными фрейворками для C++ настолько плохи, что приходится брать инструмент с русскоязычной документацией и изучать его с помощью автоматических переводчиков. Лично я бы никогда не взялся смотреть на инструмент с французкой или португальской документацией.

А посему можно смело ориентировать SObjectizer на C++. Ведь не смотря на все свои недостатки, C++ уже давно достиг состояния immortality. Поэтому на нем пишут сейчас и еще долго будут писать. В том числе и SObjectizer ;)

вторник, 3 марта 2009 г.

Из непонятого: публичные личные телефонные разговоры

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

Меня вообще поражает способность некоторых людей отключаться от окружающего их мира и целиком погружаться в телефонный разговор, совершенно не заботясь о том, что их слушают. В первый раз я столкнулся с этим, когда мне было лет 18 и я месяц просидел в комнате у теток-бухгалтеров на маминой работе. Каждая их них минут по сорок в день тратила на разговоры с подругами/родственниками совершенно не смущаясь ни своих коллег, ни меня. За это время я узнал состав их семей, где, кто и с кем живет (включая породы и клички собак и кошек), кто и чем занимается, и какие события происходили у них в последнее время.

Одно время я думал, что к подобным явлениям предрасположенны, в основном, женщины. Но, как раз мобильные телефоны убедили меня, что здесь царит полное равноправие – наткнуться в маршрутке/автобусе на мужика, десять минут трындящего какую-то бытовую муру в телефон, не сложнее, чем на такого же экземпляра женского пола. Причем, если к публичным телефонным разговорам в транспорте больше склонны дамы лет сорока и старше, то у мужчин ситуация обратная – в основном треплются молодые ребята.

Собственно, что подвигло меня на написание сего опуса?

Во-первых, я искренне не понимаю, как можно не стесняясь, находясь среди посторонних людей (не важно, в транспорте или на работе), вести личные разговоры? Задумываются ли они, например, о своей безопасности? Вот прокричишь на всю маршрутку, что завтра уезжаешь в Куршавель на недельку, а рядом с тобой окажется домушник ;) Проводит тебя до дома, узнает где живешь, а через пару дней навестит твою квартиру… Или, что вероятнее, нервы у невольного слушателя лопнут, и влепит он тебе хук справа в челюсть…Ну, а если не быть параноиком, то почему люди не думают о своих попутчиках? Вам самим вряд ли было бы приятно выслушивать сагу об удачно купленных зимних сапожках, в трех разных изложениях. Так почему же вы ставите в такое положение других людей?

Во-вторых, когда-то я читал книгу по тайм-менеджменту. Кажется, это была “Тайм-драйв. Как успевать жить и работать” Глеба Архангельского. Если мне не изменяет мой склероз, автор дает совет рационально использовать время, которое мы проводим в дороге (в метро, такси, автобусе, маршрутке). В частности, тратить его на необходимые телефонные разговоры. Так вот, хочется обратиться с просьбой к тем, кто последует этой рекомендации: пожалуйста, подумайте о людях, которые оказались рядом с вами. Нервы у меня не железные, могу и хук справа залепить! ;)

Из непонятого: превратим программы в криптограммы?

Определенно, у программистов есть и желание, и способность изобретать нечитаемый синтаксис для своих программных творений. Ранее я об этом уже говорил в юмористической форме. Вчера, читая блог команды разработчиков Maestro в очередной раз в этом убедился. Так, в Maestro для поддержки flow-based подхода изобрели следующие операторы:

==>
-<<
>>-
-<:
&>-

Попробуйте догадаться, какой из них что обозначает. Хотя бы вот в этом примере:

{ a ==> TraceNumber, b ==> TraceNumber } 
   &>- join -<: { GetSum, GetSum } >>- sum;

Я, конечно, понимаю, что для свободного чтения программ требуется знание языка программирования, на котором программа написана. Но я так же уверен, что чем меньше тонкостей языка нужно помнить и чем интуитивнее будут используемые языком обозначения, тем проще будет язык. Как в изучении, так и в работе.

Возможно, причины возникновения таких криптограмм были как-то озвучены Артемием Лебедевым в его Бизнес-линче: “Физики, химики, математики, кибернетики, программисты — все они не в состоянии нарисовать себе приличные логотипы”. Т.е. нет у программистов способностей к графическому дизайну. А, поскольку выбор понятных и простых обозначений для операций – это и есть дизайн, то неудивительно, что что получаются вот такие результаты.

PS. Пользуясь случаем, не могу не бросить еще раз камешек в огород хардкорных функциональных языков. Цитата из статьи про монады:

choose p d1 d2 = Dist {support = s, gen = g, expect = e}
   where
      s = support d1 ++ support d2
      g sg = let (x,sg') = randomR (0.0,1.0) sg in if x < p then gen d1 sg' else gen d2 sg'
      e f = p * expect d1 f + (1-p) * expect d2 f

Попробуйте с ходу сказать, что происходит в выделенной жирным строке ;)

PPS. Да, у меня с дизайном все замечательно. Я без труда придумываю удачные идентификаторы и графические обозначения :)))

суббота, 28 февраля 2009 г.

Поток сознания: альтернативный вариант «Хроник Мутантов»

Временами, когда посмотришь какой-нибудь фильм или прочтешь какую-нибудь книгу, начинаешь фантазировать на тему о том, как бы я сам выстроил в ней сюжет. Вот подобными фантазиями я сейчас и помучаю своих читателей :)

Итак, фильм «Хроники Мутантов». Сюжет, вкратце таков. Когда-то давным-давно на Землю из космоса прилетела Машина. Посланная сюда, как нам говорят, самим Дьяволом. Машина превращала убитых людей в мутантов, которые затем ходили, убивали людей, притаскивали трупы к Машине, а та из доставленных тел тут же лепила мутантов. И так должно было продолжаться до тех пор, пока все живое не будет уничтожено.

Но древние люди, только что пережившие ледниковый период, смогли таки объединится, перебить всех мутантов и закрыть вход в бездну с этой машиной здоровенной каменной плитой. При этом люди носили одеяния монахов средних веков и были вооружены мечами, по виду той же исторической эпохи. И веровали в Бога. Очень похоже, что в Христа.

Основное же действие фильма происходит в 2707-м году. Когда во время боя между войсками двух враждующих корпораций взрывом разрушается каменная плита, закрывавшая Машину, и монстры выбираются наружу, начиная свое черное дело.

Даже после прекращения войн между корпорациями и объединения их военных сил против монстров, людям ничего не удается противопоставить мутантам. Властьпридержащие решают провести эвакуацию части населения на другие планеты, а оставшуюся часть бросить на произвол судьбы. И только настоятель древнего-древнего монастыря, в котором тщательно скрывалась все это время тайна Машины, знает, что только уничтожение Машины может спасти человечество. Для чего он собирает отряд смельчаков и направляется в бездну для выполнения своей исторической миссии. А уничтожить Машину можно только специальной бомбой со специальным взрывателем, которые хранились в древнем-древнем монастыре со времен первой битвы с Машиной. Понятно, что практически все герои геройски погибают, но самый главный герой все-таки доводит свою геройскую миссию до успешного конца. Не вынесшая такого позора Машина запускает свои реактивные двигатели и улетает с Земли, видимо, в поисках более безопасной планеты.

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

Во-первых, сама Машина. Если ее можно было уничтожить, то почему наши предки, располагая специальной бомбой, не уничтожили ее, а только закрыли каменной плитой? Надо полагать, принцип «После нас хоть потоп!» появился гораздо раньше династии Людовиков. Хотя предки все-таки озаботились оставить после себя книгу хроник с детальным планом подхода к Машине, схемой закладки бомбы и инструкцией по приведению бомбы в действие.

Во-вторых, нам было сказано, что Машина прибыла очень давно, вскоре после ледникового периода. Хотя победили ее уже воинствующие монахи-христиане, вооруженные средневековым оружием. Да еще и оставили после себя книгу хроник.

Ну и, в-третьих, весь антураж в фильме стилизован под времена Первой мировой войны. Особенно в первых минутах фильма, когда показывается окопная жизнь, амуниция, оружие и военная техника. Да и потом, реактивные дирижабли с паровыми котлами и кочегарами, истово закидывающими уголь в топки, никак не способствуют попыткам авторов фильма убедить нас, что действие происходит в 2707-м году. Конечно, стрелковое оружие не развивается такими стремительными темпами, как компьютеры и автомату Калашникова уже больше шестидесяти лет. Но чтобы через семьсот (СЕМЬСОТ!) лет солдатами использовались наши современные противогазы и каски времен 1914-го года - в это поверить совершенно невозможно.

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

Я бы, раз уж создатели фильма так хотели использовать в фильме антураж Первой мировой, и действия перенес туда же. Представьте себе: 1916-й год, Альпы, бои локального значения между австрийскими и итальянскими войсками в каком-нибудь богом забытом ущелье. Которое местные жители из покон веков считают проклятым местом.

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

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

Так, тема возникновения камня в фильме, можно сказать, раскрыта. Теперь нужно ввести сюда пушечное мясо. Т.е. людей, из которых судьбой будут выбраны жертвы, монстры и герои. Ну, например, пусть это будет небольшой австрийский отряд, конвоирующий группу пленных итальянцев. Или наоборот, не суть важно. Им потом все равно придется объединиться.

Итак, ведут одни солдаты других солдат в плен. А поскольку путь долгий, им придется остановиться на ночлег. Как раз недалеко от торчащего из груды камней артефакта. И, естественно, поздней-поздней ночью, отойдя по нужде в кустики (наверное, за камешки, откуда кустикам взяться в каменном ущелье?) один из солдат совершенно случайно дотрагивается до артефакта. О-о-пс! Первый монстр готов. Он раскапывает артефакт полностью, ну чтобы остальных было проще прикладывать, ну и чтобы излучению артефакта ничего не мешало.

Поскольку превращение в монстра и извлечение здоровенного артефакта из-под груды камней поздней ночью это очень шумное занятие, все просыпаются и пытаются понять, что происходит. Пленные (пусть это все-таки будут итальянцы) надеются, что это пришли их освобождать. Не пленные (т.е. австрийцы) боятся, что их сейчас замочат и сами собираются замочить пленных, пока такая возможность еще есть. Тут выясняется, что одного из австрийцев нет. Куда он делся и что с ним не понятно. Зато пленные выглядят уж очень подозрительно. «Не они ли укокошили нашего боевого товарища?» -- думают австрийцы, недобро озираясь вокруг. Самый горячий из них даже собирается порубить всех итальянцев в капусту. Но его останавливает офицеришка, потомственный аристократ, фон Какой-то-Там. Мол, пленные это и не по конвенциям мочить их темной ночью, безоружных, да еще когда вокруг шум падающих камней да непонятное звериное рычание. В общем, огромный злой австриец волком глядит на хлипкого вида офицеришку, офицеришка целит в живот оппоненту, сбившиеся в кучу пленные итальянцы ждут своей участи. И тут...

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

Погоня обнаруживает беглеца как раз в тот момент, когда первый монстр сидит недалеко от артефакта и наблюдает за тем, как из пленного итальянца формируется второй монстр, а артефакт сияет ярко-красным светом. Такого сверхъестественного зрелища наши герои выдержать не в состоянии и кто-то из них громко вскрикивает и сразу становится замеченным первым монстром. Монстр бросается к кричавшему, по монстру начинают палить из винтовок. Видно, что монстру больно, но не смертельно. В общем, добирается он до своей второй жертвы и хватает ее. На него набрасывается один солдатик, начинает колоть своим штыком, получает по кумполу и падает с раскроенным надвое черепом (даже каска не спасла). Тут поспевают еще один солдатик (пусть это будет тот самый злой австриец) и офицеришка. Злой австриец не смотря на свои внушительные габариты и недюжинную силу быстренько получает пару тумаков от монстра и с не смертельными травмами, укладывается на камнях наблюдать за дальнейшим ходом битвы со стороны. Зато офицеришка творит чудеса. Как потомственный военный и аристократ он отлично фехтует и своей сабелькой лихо кромсает монстра. Ну, не совсем кромсает, но хотя бы руку отрубает точно. Что на какое-то время лишает монстра возможности наступать и дает возможность оценить нам обстановку. А обстановка следующая: первый монстр, хоть и изрядно покалеченный, уползает к артефакту с захваченным солдатиком (ну тем, кого он схватил первым и не выпускал все это время), второй солдат лежит с раскроенной головой и не подает признаков жизни, злой австриец потихоньку пытается встать, и в сторону этой заварухи смотрит второй монстр, превращения которого уже почти завершилось.

Офицеришка быстренько подхватывает побитого злого австрийца и они шустро возвращаются в свой лагерь. Там они рассказывают свои собратьям по несчастью об увиденном. Им, понятное дело, не особо верят. Но все-таки лица вернувшихся из погони (особенно вид побитого злого австрийца), их забрызганные кровью и мозгами мундиры, а так же раздающийся из темноты звериные вопли заставляют всех понять, что их не разыгрывают. А тут еще офицеришка дает приказ освободить пленных и дать им оружие. Робкие попытки протестовать тут же пресекаются, поскольку сейчас главное выжить, а у нас каждый штык не лишний, ну и тому подобная лабуда.

В общем, не успевают итальянцев развязать и отдать им какие-то винтовки, сабли и пр., как опять все стихает. Становится понятно, что скоро состоится очередная атака монстров. И она не заставляет себя ждать. Два полноценных монстра и один однорукий лихо врываются в расположение теперь уже сводного отряда, начинают шустренько разбрасывать, крушить и кромсать всех, кто попадается им под руку. В этой свалке часть отряда красочно и смачно убивается, часть отряда уволакивается монстрами в темноту, к артефакту, остальная часть орет, палит куда только может, мечется и вообще создает необходимую атмосферу животного ужаса. Одного монстра, тем не менее, совместными усилиями удается замочить (наверное, однорукого, его проще). Что дает нашим героям надежду на спасение.

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

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

Можно сделать другой сюжетный ход. После отбитой атаки оставшиеся в живых люди решают не добивать монстров, а делать ноги. В принципе, решение, противоречащее здравому смыслу. Ведь понятно, что монстры вернутся, догонят и кокнут всех выживших - убежать не получится. Однако, если все самые смелые бойцы были убиты в ночной атаке (офицеришку вообще могли бы утащить живым, чтобы превратить в монстра), то выжившие могли бы оказаться достаточно малодушны, чтобы жажда жизни пересилила здравый смысл и люди бы разбежались.

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

Наверное, я бы развернул сюжет так: офицеришка таки ведет своих солдат после ночной атаки на двоих оставшихся в живых монстров. В результате чего рядом с артефактом разворачивается нехилая резня. Поскольку патроны и гранаты у людей быстро заканчиваются (что понятно, т.к. не могли же они таскать с собой по горам целый арсенал), то приходится идти с монстрами в рукопашную, а это уже совсем другой расклад сил. Ну а поскольку кровища в этом мочилове льется рекой, то мощность артефакта многократно усиливается - он начинает действовать на расстоянии и гораздо быстрее. Тут-то ситуация и меняется - офицеришка видит, что его солдатики, опрометчиво приблизившиеся к артефакту, начинают превращатся в монстров. И все, что остается в данной ситации, это спешно ретироваться и сохранить свои жизни, хотя бы временно. Для усиления интереса к дальнейшим событиями, я бы превратил в монстра того злого австрийца, который в начале конфликтовал с офицеришкой. А поскольку сам австриец был громадным, то и монстр из него получится бы соответствующим.

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

В результате наши выжившие герои достигают, скажем, какой-то артиллерийской батареи. Итальянской, конечно. Чтобы офицера и других все еще живых австрийцев тут же посадили под замок, а единственный выживший итальянец безуспешно пытался доказать, что этого нельзя делать, т.к. придут злобные монстры и всех порешат. Понятно, что его не слушали. Может быть, даже посчитали шпионом и посадили туда же. Понятно, что совершенно напрасно. Поскольку монстры не заставили себя ждать: под покровом ночи напали на эту батарею и устроили настоящий ад. Однако, наши герои и тут проявили себя по-геройски. Они сумели выбраться и организовали достойное сопротивление.

К рассвету стало понятно, что на всей батарее не больше десятка живых людей. Множество красочно разбросанных повсюду трупов (как людей, так и монстров), лужи крови, дым, смрад и прочие красоты войны. Половина личного состава пропала. А недалеко, как раз под удачно нависшей над ущельем скалой, расположен артефакт, к которому монстры тащат захваченных людей. Наиболее крепких из захваченных жертв превращают в монстров, остальных съедают. В общем, апокалиптическая картина, по которой становится ясно, что ждет все человечество, если монстров не остановить прямо сейчас.

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

Не выдержав нескольких точных попаданий, скала рушиться и артефакт оказывается заваленным огромными камнями. Как и почти все монстры. Почти, но не все. С десяток выживших бросаются в последнюю атаку на батарею. Среди них и самый большой монстр, бывший злой австриец. Половина монстров погибает по дороге под меткими выстрелами осколочными снарядами. Но оставшиеся все-таки врываются на позиции артиллеристов и устраивают финальную бойню. Тут людям хорошо помогают и пулеметы (только вот сколько их может быть на артиллерийской батарее и могут ли они там быть вообще), и ручные гранаты. И, для полноты картины, снайперская винтовка (как же без нее показать, как можно одним метким выстрелом укакошить мутанта, влепив ему пулю прямо в лоб?).

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

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

Вот как-то так. Поток сознания иссяк. Спасибо всем, кто дочитал до этого места :)

четверг, 26 февраля 2009 г.

Бывает же!

Портировал сегодня Mxx_ru под MacOS X. Столкнулся с одной странностью. Запускаю полный набор тестов (через rake test) и один из них обламывается. Линкер не находит функцию a() в библиотеке MyA. Начинаю разбираться именно с этим тестом. А в тесте как раз и строится библиотека MyA с единственной функцией a(). Но тест не работает.

Странно, думаю. Смотрю, а в библиотеке одна функция - A(). Да именно с заглавной буквы. Заглядываю в исходный файл - точно, объявляется функция A(), с заглавной буквы:

#include <iostream>
void A() { std::cout << "a()" << std::endl; }

Ну, думаю, какие проблемы? Исправляю, запускаю тест в автономе - все нормально. Потом опять запускаю весь test suite. БАХ! Функция a() опять не найдена. Заглядываю в исходный файл - опаньки, а функция a() опять с заглавной буквы! Что за дела?...

Исправляю опять. Запускаю один тест. Все нормально. Запускаю весь test suite - ошибка и имя функции опять оказывается с заглавной буквы.

Почему это происходит и в чем причина - не знаю. Не было времени, да и желания разбираться. Но такого я раньше никогда не видел. Ведь ни Mxx_ru, ни компилятор даже не открывают исходных файлов на запись. А тут оказывается, что одна буква в одном файле таинственным образом меняется. Чудеса!

PS. Работал на 13" MacBook-е. Впечатления неоднозначные. Убило отсутствие клавиши Del. Зато очень порадовало, что в стандарной версии MacOS X сразу был vim!