Monthly Archives: September 2005

Баги PA-RISC 2.0 / HP-UX B.11.11

Берётся следующий код:
int main(int argc, char **argv)
{
char b[512];
b[2]=0;
b[3]=1;
b[4]=2;
b[5]=3;
long l=*(long*)(b+2);
return 0;
}
И транслируется на платформе HP-UX B.11.11 (HP-UX 11i v1). При выполнении получаем следующее:
Bus error (core dumped)
То есть сигнал SIGBUS, он же 10-й. Если вместо b+2 написать b или b+4, то всё нормально. С такой особенностью архитектуры мне довелось столкнуться впервые. И я и подумать не мог, что компилятор настолько туп, что не её учитывает. Самое интересное, что какой использовать компилятор – не важно, aCC, g++ или даже если переписать это дело на C и оттранслировать gcc или вообще родным cc, пофигу. Результат один и тот же. Спустя некоторое время обнаружилась в aCC опция +u1, позволяющая с этим злом бороться. В g++ аналогичную опцию я не нашёл, что обидно. Надо бы повнимательнее поискать.

Далее возник ещё один баг, совсем странного рода. Природа его пока не ясна, но суть в том, что некая программа вылетает с тем же самым 10-м сигналом где-то в начале своей работы. Где именно – выяснить точно не удалось, потому что стоит где-нибудь в её начале поставить отладочную диагностику perror и она тут же вылетать перестаёт и работает совершенно корректно. Спустя некоторое время удалось свести исправления до добавления строчки
fsync(2);
в начало main. Это помогает, но вот почему… Надо бы этот баг локализовать на всякий случай.

И почему мне вечно достаётся всякая экзотика? Никогда не думал, что перенос программ с HP-UX A.09 на HP-UX B.11.11 может оказаться столь геморным…

AESCrypt для шифрования файлов под FreeBSD

А вот за что я люблю UNIX. Ставится задача: обеспечить безопасное хранение некоторых зашифрованных файлов с возможностью последующего расшифрования.

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

Как мы поступаем в FreeBSD? Берём прогу, которая называется AESCrypt. Дистрибутив исходников весит аж 61 КБ, в установленном виде она занимает 68 КБ. Шифрование осуществляется с помощью алгоритма AES (advanced encryption standard), который заменил DES, бывший стандартом шифрования в США в течение около 20 лет, до тех пор пока не был взломан из-за безумного роста производительности компьютеров.

Прога типична для UNIX – умеет только шифровать и расшифровывать некоторый произвольный поток байт, используя файл с ключом. Всё остальное – а именно, генерацию ключей и удобный способ связывания всего на свете в одну команду нам даёт система. Например вот так:

скрипты

Java: PL/1 revived!

Ещё я очень люблю платформу Java. Заметьте: не язык, платформу! Язык я тоже очень люблю, но платформа мне ещё больше нравится.

Давным-давно был такой язык – PL/1. Делали его очень скромные люди, отсюда и такое название: PL значит “Programming Language”, а 1 – “номер один в мире”. Язык предназначался для всего на свете одновременно и потому получился очень сложным. Следовательно, его было крайне трудно изучить, а потому его начали постепенно упрощать. В результате этих упрощений он утратил свою универсальность и стал вообще ни на что не годен, а потому был успешно похоронён и ныне мало кто о нём вообще слышал.

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

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

Идея жабы проста. Язык – высокого уровня, объектно-ориентированный. Оба этих признака выражены до невозможности, в частности, уровень настолько высок, что написание на жабе чего-либо системного в принципе невозможно (не только из-за реализации платформы), а объектно-ориентированность достигла такого уровня, что объектные типы стали гибкими и сложными настолько, что иногда Хрен в них разберёшься. Но с языком-то как раз почти всё в порядке. В нём гораздо больше логики и порядка, чем, например, в C++. К немногим его маразмам относится отсутствие беззнаковых типов, отсутствие понятия перечисления (C++ enum) и дурацкая работа с памятью, которую экономить совершенно невозможно из-за частой необходимости копирования чего-нибудь, а также из-за отсутствия возможности выделенную память освободить, не дожидаясь пока прочухается сборщик мусора.

В общем, язык не без бзиков, но в целом очень хорош. Для написания чего-нибудь огромного и абстрактного при отсутствии необходимости высокого быстродействия и низкого потребления памяти – так вообще идеален. Но платформа! Идея такова: компиляция программы происходит не в исполняемый код, как в нормальных языках, а в некий байт-код, который затем интерпретируется виртуальной машиной. Представляете с какой скоростью это работает? Получается, мы имеем платформу, не существующую физически, которую поэтому нужно всюду эмулировать. Следствие: откомпилированная программа на жабе может быть перенесена куда угодно и работать где угодно без необходимости её перекомпилировать, но за это мы платим во-первых, быстродействием, а во-вторых, тем, что если на некоей платформе не существует реализации виртуальной машины жабы, то Хрен там наша программа пойдёт. Второй недостаток приводит к тому, что пресловутое “идёт где угодно и под чем угодно” оказывается весьма и весьма условным.

Об условности отдельное слово. Как известно, большинство существующих платформ можно поделить примерно на три класса: Windows, UNIX и Mac OS. Большинство существующих ОС являются вариантами UNIX и при некотором умении не составляет особого труда создавать программы, работающие под любым вариантом UNIX. Сообщество свободного ПО давно врубилось в эту фишку и сейчас большинство программ “под линух” идут на самом деле практически под чем угодно. С жабой же ситуация почему-то совсем иная – у неё существуют официальные реализации под Linux и Solaris. В FreeBSD уже большие проблемы с жабой, не смотря на то, что это – UNIX номер два в мире после Linux. И о какой кроссплатформенности жабы тут можно говорить? Да, существует неофициальная патченая жаба под FreeBSD, которая работает и вроде бы работает неплохо, но всё равно сам факт возникновения трудностей при переносе с Linux на столь похожую платформу – это нечто из ряда вон выходящее в современном мире. Прикол ситуации усиливается ещё и тем, что для компиляции жабы под некоторую платформу изначально необходимо наличие на этой платформе жабы. Эта проблема яйца и курицы во FreeBSD решается тем, что под ней с горем пополам идёт реализация жабы под Linux, но что делать с полностью несовместимыми системами?

Качество реализации, кстати, тоже оставляет желать лучшего. Я собственноручно обнаружил в ней как минимум две ошибки. Одна – в достаточно старой версии 1.1, другая – в версии 1.4, причём проверка показала, что в версии 1.5 (она же 5.0) эту ошибку не исправили. В результате становится непонятно, почему жаба, будучи бесплатной, не является свободной и открытой, что позволило бы ей исправлять подобные дурацкие ошибки не за несколько лет, а за несколько недель.

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

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