Предыдущая глава |
↓ Содержание ↓
↑ Свернуть ↑
|
Вместо того чтобы оценивать человека по его делам и качеству, стали оценивать человека по его одежде. Из средства защиты тела от агрессивной окружающей среды, одежда превратилась в статусную фишечку. Всякие птички, вроде попугаев, павлинов и петухов, ради привлечения внимания сексуальных партнёров, имеют ярко-пёструю окраску. Вот и люди, у которых нет ничего привлекательного, уподобляясь тем петухам, начали одеваться так же ярко и пёстро, чтобы привлекать к себе внимание. Но ведь компенсация нужна тому, кто чего-то лишён. Безногие не могли ходить и придумали костыли ради компенсации отсутствия ног. А всякие физические уроды, придумали одежды, чтобы скрыть и компенсировать своё физическое уродство. Но человеку со здоровыми ногами не нужны костыли. Так почему красивым людям всё же приходится ходить в одежде?
Интересно отметить закономерность, что свобода женщины в обществе, прямо коррелирует со свободой её одежды. Древние женщины ходили обнажёнными, а в обществе имели равные права с мужчинами. В современном мире, женщины имеют немалые права и могут свободнее одеваться. А вот в мусульманских странах, женщины почти не имеют прав и ходят в мусорных мешках, закутанные с головы до ног. В средние века, европейские женщины, так же не имели прав. А их одежда, как наряд куклы. Очень показательно, что средневековая европейская леди, без помощи служанок, даже не могла самостоятельно одеться или раздеться. Европейские лорды выбирали одежду для своих жён и наряжали их так как хотели сами.
Виктор смотрел на окружающих девчонок и гадал, что же скрывают их одежды. Например, пышные лифы платья, маскировали маленькую грудь, а длинные юбки маскировали кривые ноги. Вот на пляже, когда девушки в купальниках, там всё видно и ничего не скрыть. Впрочем, ведь купальник, тоже чего-то скрывает. А если он чего-то скрывает, то, наверное, это некие отвратно выглядящие физические недостатки. Ведь лоскутки ткани, никакой защиты или другой роли не могут выполнять, кроме скрытия определённых местечек от взгляда. Более того, купальники вредны, поскольку локально изменяют и тем самым нарушают баланс теплообмена тела. Обязательность ношения купальников кажется странной и даже нелогичной. Но почему то все, даже он, продолжают носить одежду, включая купальники, ссылаясь на некие общественные нормы.
Спортивный зал отапливали хорошо. Там временно возвращались легкомысленные наряды одноклассниц. А игра на контрастах пробуждала в мальчиках что-то тёмное и безжалостное. Виктор же помогая учителю, не только смотрел, но и ненароком касался девочек. И от этих прикосновений его бросало в дрожь. А похабные разговоры одноклассников в раздевалки очень его злили. Конечно, он сам бы с удовольствием проделал бы с одноклассницами многое. Но именно он, а не другие. Впрочем, девчонки ему не принадлежали, но и остальные мальчишки не могли ими распоряжаться. Злость же вызывала совокупность разнонаправленных и труднопонимаемых чувств.
Люди это животные. Ими управляют инстинкты. Возможно, если бы все люди ходили бы голыми, то и вели бы себя как животные. Впрочем, это кривое рассуждение. Люди, даже одетые, всё равно ведут себя как животные. А когда полностью раздеваются в душевой или бане, то их поведение остаётся прежним. Но если всё же представить, что все люди откажутся от одежд... В первую очередь мысли соскальзывают на красивых девушек. Но кроме девушек ещё существуют всякие мужики, старики, калеки и уроды. Они тоже окажутся голыми. А такую мерзость даже представлять противно. Для них одежда, которая скрывает физические уродства, нужна хотя бы из эстетических соображений. Но оставался открытым вопрос, почему молодые и красивые люди так же вынуждены ходить в одежде. А продолжать ломать мозг в размышлениях об одежде нет смысла, поскольку всё равно ничего не изменить.
Тем временем школьная четверть заканчивалась, напрягая всех учеников контрольными. Виктора тревожили собственные четвертные оценки по литературе и истории. Он не желал прогибаться и говорить ересь, за которую ему поставили бы двойку. Но с вопросами повезло и он получил четвёрки. Лишь тройка по музыке портила коллекцию пятёрок и четвёрок, выставленных за первую четверть.
к оглавлению
Фрагмент 44A
В книгах Виктор вычитал интересную идею. Существовали программки, которые автоматически заменяли слова специальным текстом. Эти препроцессоры заметно упрощали написание исходного кода за счёт сокращения повторного ввода длинных и сложных конструкций. Вместо скучных повторений одинаковых блоков кода писалось лишь название соответствующего макроса. А уже препроцессор заменял его блоком нужных инструкций и данных. А те инструкции набивались только один раз при создании макроса.
Препроцессор предоставлял возможность модифицировать вставляемый текст. Макрос мог принимать параметры, значение которых подставлялось в раскрываемый текст. То есть макрос с параметрами адаптировал содержимое для контекста, в котором оно применялось. Такой примитивный трюк значительно повышал гибкость и удобство использования макросов.
В результате применения препроцессора сокращалось число ошибок. Ведь многократно набирая длинные и сложные инструкции ошибиться проще, чем набирая лишь название макроса и его параметры. А если ошибка обнаруживалась в самом макросе, то её исправление автоматически распространялось на множество мест, где использовался соответствующий макрос.
Одна простенькая программка помогала генерировать исходный текст более сложных программ. Очень круто написать макрос, а в результате получить сложный код, который лениво набирать руками. Это железному компьютеру всё равно, что генерировать. А человеку скучно повторять одно и то же множество раз. Вите понравилось правило программистов: "автоматизируй всё, что можно".
Макропроцессор так же позволял адаптировать исходник программы под внешние условия. Например, условные блоки позволяли вставлять дополнительные инструкции. При обработке исходника утилите передавались параметры, конкретизирующие требования и в зависимости от них на выходе получалось несколько специализированных вариантов. Версия для отладочной сборки содержала инструкции, выводящие промежуточные значения, нужные лишь программисту. А версия для релизной сборки пропускала те инструкции и соответственно скрывала от пользователя всякий мусор. Таким образом, из одного исходника получалось два или более вариантов этой программы.
Конечно, с помощью любого интерпретируемого языка вроде Бейсика получилось бы сделать не меньше, а возможно даже больше за счёт развитого функционала. Но язык макросов прельщал наглядностью и примитивной простотой. Он интегрировался в исходный код, модифицируя, но сохраняя его читабельность. А используя сторонний язык программирования для генерирования исходного кода, пришлось бы смешивать сложные конструкции нескольких языков и потерять на этом читабельность текста.
Самый простой препроцессор использовался для подготовки исходного кода в языках C и C++. Более навороченный использовался в "Macro Assembler" и некоторых специальных программах. Препроцессор встраивался в компилятор для подготовки исходника программы. Но так же существовали отдельные программы макропроцессоров.
Подросток сравнил описания нескольких существующих программ для препроцессирования. Ему понравились отдельные идеи. Но отдать пальмовую ветвь первенства какой-то определённой программе мешали всякие мелочи. Например, в препроцессорах языков C и C++ использовали переносы строк, которые вносили излишнюю путаницу. Так же смущали сомнительные операторы, объединяющие два токена в один или превращающие токен в строку. Зато нравился синтаксис объявления макросов. В препроцессоре "Macro Assembler" многое казалось усложнённым, но нравился более серьёзный подход. Вите же хотелось получить всё самое лучшее. Красивый синтаксис объявления макросов и условий. Понятный синтаксис вызова встроенных функций, гарантирующий однозначность ожидаемого результата. Развитый или хотя бы легко расширяемый функционал. При всём этом хотелось сохранить общий стиль с используемым языком программирования, чтобы не путаться между разными синтаксисами.
Если бы Витя смог бы раздобыть уже готовый препроцессор, то, конечно же, он не стал бы заморачиваться с изобретением велосипеда. Но в книгах ему не удалось найти напечатанных исходников. А подростка весьма сильно заинтересовало применение нового инструмента, о котором он прочитал. А ещё ему банально хотелось написать, что-то прикольное и необычное, отвлекаясь от уже надоевших проектов. Мальчишка придумал простенький синтаксис препроцессора, немного напоминающий Бейсик. Для префиксов ключевых слов препроцессора зарезервировал восклицательный знак. [Специальный префиксный или суффиксный знак, очень спорный вопрос и дело личного вкуса. Некоторые считают, что он нужен, для различения элементов препроцессора от языковых сущностей.] В первой версии реализовал поддержку только символов, макросов и условных блоков.
Новые символы объявлялись командой "!def" и удалялись командой "!undef". Символы состояли только из названия и тела. От макросов они отличались тем, что не могли принимать параметров и записывались на одной строке. Когда препроцессор встречал в тексте программы название символа, то заменял его телом этого символа. Например, символы позволяли вставлять в исходник понятные названия констант вместо длинных чисел. Тело же могло содержать любые конструкций, в том числе состоять из других символов и макросов.
Новые макросы объявлялись командой "!macro" и удалялись командой "!unmacro". Тело макроса размещалось между строкой с командой "!macro" и строкой с командой "!endmacro". Оно могло состоять из одного или более строк. При этом в конце строк не требовались символы переносов. Кроме названия макрос принимал список параметров подобно функции. В тексте программы макрос вызывался по имени, за которым следовали параметры в скобочках. Когда в тексте исходника препроцессор встречал вызов макроса, то заменял его телом соответствующего макроса, подставляя в него переданные параметры. Например, макросы позволили писать красивые вызовы функций вместо нудных ассемблерных инструкций заполнения и последующего освобождения стека. Заранее подготовленные макросы для вызова функций позволяли вызывать эти функции одной командой, вместо набора инструкций занимающих несколько строк.
условные блоки в зависимости от выражения включали или выключали отдельные инструкции. Условие начиналось командой "!if" и завершались командой "!endif". Условные блоки позволяли вставлять в исходник программы дополнительные инструкции. Эти инструкции раскрывались, только если подтверждалось проверяемое условие. При необходимости добавлялся альтернативный блок командой "!else". Его содержимое вставлялось, когда проверяемое условие не подтверждалось. Так же допускалось произвольное число дополнительных блоков условия командой "!elif". Блок вставлялся, если его дополнительное условие подтверждалось, а все предшествующие выражения оказывались ложными.
Лабораторное испытание утилиты тут же выявило несколько её фатальных недостатков. Она спотыкалась о комментарии, поскольку ничего о них не знала. Так же утилита путалась с вложенными условиями и макросами. Витя взялся за переделку. Он добавил поддержку комментариев. Сделал учёт уровней вложенности сущностей. По ходу работы придумал, как сделать переменное число параметров макроса. Второй вариант получился гораздо функциональнее, но ещё глючнее. Мальчишка обдумал ошибки, допущенные в реализации утилиты, и почти полностью переписал её код. Он уже знал, как можно сделать многие функции и быстро набил код, лишь иногда заглядывая в предыдущий вариант. Третий вариант делал то же самое, что второй, но гораздо строже и аккуратнее. Кроме того, препроцессор научился игнорировать регистр символов букв. Лишь погоняв утилиту на тестах, подросток удовлетворился результатом. Он рассчитывал, что с новым инструментом сможет писать программы быстрее и проще.
В качестве боевого испытания препроцессора Виктор вернулся к исходнику Ассемблера. Постепенно, шаг за шагом исправил некоторые места, упраздняя повторы кода и сложные конструкции. Исходный текст получился гораздо читабельнее и понятнее. Заодно подросток слегка доработал синтаксис конструкций языка ассемблера ради единообразия. Исходный код волшебным образом преобразился, внешне уподобившись языку высокого уровня. А такой текст воспринимался гораздо легче. Сразу же в глаза кинулись несколько логических ошибок, которые Виктор незамедлительно исправил. Прежде эти ошибки прятались в каше из однообразных инструкций. В целом же получилось неоднозначно. С одной стороны, препроцессор действительно упрощал исходник. А с другой стороны — он скрывал некоторые нюансы. Мальчишка, стремясь заменить макросами, всё подряд, несколько раз запутался в написанном коде. Он понял, что с препроцессором нужно обращаться аккуратнее, соблюдая строгие правила.
Практическое применение препроцессора выявило недостаток возможностей сделанной утилиты. О некоторых Виктор читал, но ранее счёл их избыточными поленившись реализовывать. Например, он понял, что кроме формирования самого текста, хорошо бы отправлять сообщения. Во-первых, обычные сообщения о ходе обработки. Эти сообщения помогли бы отлаживать текст и понимать, какое условие сработало или во что раскрылся макрос. Во-вторых, специальные сообщения об ошибках, прерывающие генерацию программы. Некоторые ветки условных блоков принципиально недопустимы и о подобных ошибках хотелось бы знать сразу. А ещё сообщением об ошибке можно помечать недоделанный код. Остановившись и отвлёкшись от программы, потом трудно вспомнить, что какое-то место незакончено. Но откладывая исходник, можно вставить напоминающее сообщение, которое предупредит о недоделках.
Виктор вернулся к доработке препроцессора. Но первым делом переделал его исходник, внедрив макросы и по мере возможности упростив код. Затем добавил поддержку сообщений командами "!message" и "!error". Реализовал стек для скрытия и возвращения символов командами "!push_def" и "!pop_def". Для макросов сделал такой же стек управляемый командами "!push_macro" и "!pop_macro". Стек позволил использовать временные символы и макросы, не удаляя старые с такими же названиями. Расширил функции, проверяющие условные выражения.
В голове подростка бродила мысль встроить вычисление математических выражений, но он не знал, как подступится. Программа и без этого сильно увеличилась в размерах. Она с трудом влезла бы на "Спектрум". Мальчишка же привык к миниатюрным утилитам. Он, вынужденный писать программы на Ассемблере, ограничивался минимально необходимым функционалом. Ассемблер совсем не располагал к написанию больших и запутанных исходников. Поэтому подросток придерживался философии "Unix": "Пишите программы, которые делают что-то одно и делают это хорошо". А четвёртый вариант препроцессора получился очень даже годным, несмотря на простоту.
к оглавлению
Продолжение следует...
Предыдущая глава |
↓ Содержание ↓
↑ Свернуть ↑
|