среда, 31 августа 2011 г.

задача компилятора

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

Думаю что это очень опасное заблуждение - компилятор в большинстве случаев не может оптимизировать даже куда более простые конструкции. Возьмем для примера библиотеку хешей FEHASHMAC и посмотрим какой код генерируется для хеша blake. Мой выбор пал на fehashmac например потому что она написана на plain C, генерация кода для которого намного проще чем для C++

Как это в open-source принято под windows на visual studio она не собирается. Если вас испугали чуть более 600 ошибок при компиляции - никогда вам не удастся приспособить open-source для чего-нть полезного, бгг. Ошибки впрочем все практически одинаковы и легко фиксятся за пол-часа примерно

Рассмотрим например такую операцию как конвертацию dword из big-endian в little-endian. Традиционно такой код пишут примерно так (файл include/blake_opt32.h):

#define U8TO32_BE(p) \
  (((u32)((p)[0]) << 24) | \
   ((u32)((p)[1]) << 16) | \
   ((u32)((p)[2]) <<  8) | \
   ((u32)((p)[3])      ))

А теперь посмотрим что нам сгенерировали компиляторы (смотреть проще всего в самом начале ф-ции compress32)

хабр все

пишет нам например нечеловеческим голосом
QRATOR HTTP 500 - Oops, something went terribly wrong. Try again.
QRATOR, ога, мы все понели. Не выдержал хабраэффекта™, бгг

И чтоб два раза не вставать - нас коварно разоблачили:
является патологическим фанатом перла
my ass, на чем еще можно скрипты писать в наше тяжелое время ? питон не предлагать, бгг

вторник, 30 августа 2011 г.

python 3

а вот например поскольку мне тут в последнее время приходится править разнообразные скрипты на питоне, решил внятно сформулировать, почему писон мне активно не нравится

Задумка в принципе неплоха - ф-ции как первокласные объекты, множественное наследование (которое впрочем все равно правильно умеет использовать хорошо если один программист из ста), наличие исключений и все такое. Дьявол впрочем как обычно кроется в деталях
  1. Использование отступов как элемент синтаксиса. Не надо мне заливать про то, что это несерьезная предъява в наше тяжелое время окончательно победивших IDE. Я например большую часть времени провожу в windbg far, и там эта фича дико раздражает каждую минуту. В python 3 для усугубления проблемы еще и табуляция была предана анафеме. Так что программиста на питоне можно безошибочно распознать по стертым в пыль кнопкам del & space, бгг
  2. С отказом от префикса типа переменной (как в perl - $,@,%) их типы приходится тупо запоминать. И снова здравствуй, проклятая венгерская нотация
  3. Клозуры ни разу не первокласные объекты. Например без ипользования nonlocal значение переменных во внешних ф-циях изменять нельзя ! По моему это уже не совсем клозуры. По крайней мере совершенно элементарные примеры из higher-order perl без мата, отладки и напильника не переносятся. Бедные студенты MIT, как же они теперь осилят курс SICP без антидепрессантов
  4. переход на python 3 по моему нескромному мнению не дал в плане удобства практически ничего - ну привели всякие внутренние методы к единообразному виду, range теперь ведет себя как xrange и все остальное - сущие мелочи. Зачем было полностью отказываться от обратной совместимости ? Полагаю исключительно в силу врожденной злобности автора
  5. С другой стороны вот за такое например
    В Python 3, при одинаковой близости к двум кратным значениям, округление будет выполнено до ближайшего четного кратного (например, значение 0.5 будет округлено до 0.0,  а значение  1.5 – до  2.0). Эта особенность представляет серьезную проблему переноса математических программ на Python 3.
     в нормальном обществе принято молча бить канделябром
  6. Исключения часто используются не по делу и даже встроенными ф-циями. Что хуже всего - нет никакого механизма узнать, какие именно исключения может выкинуть вызов ф-ции, так что написание долгоиграющих программ становится многословным и параноидальным занятием. Я не понимаю что мешало сделать аннотацию всех возможных типов исключений функции, как это сделано в java например
  7. в python 3 возможность перезапустить модуль с диска выпилена (ф-ции reload больше нету). Соотв-но невозможно писать всяких долгоживущих демонов, поведение которых должно время от времени меняться в полете
Есс-но это далеко не полный список претензий. Если мне не лень будет - допишу еще

Резюме - не взлетит. Отъест некоторую долю у php например, но в силу врожденной злобности и нестабильности психики автора никаких серьезных вещей на питоне делать строго не рекомендуется

воскресенье, 28 августа 2011 г.

botan vs crypto++

а вот например собрал давеча на vs2010 под 64битную windows7 две криптолибы с целью померить их производительность и победителя заюзать во всяких своих прожектах

Сборка

Как это в open-source принято, без напильника военного образца ни одна либа из коробки под windows не собирается

botan 1.10.1

Например поскольку у меня установлен python 3.2.1, нужно в configure.py заменить все конструкции вида
except OSError, e: на except OSError as e:
после чего под администратором (иначе оно не может симлинки создать) запустить python configure.py --enable-sse2 --enable-ssse3

crypto++ 5.6.1

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

суббота, 27 августа 2011 г.

чтиво на выходные

гражданину было не лень разобрать до винтиков MS11-058
и про MS11-034 & MS11-054 еще тут

Art of Concurrency

я канешна давно забыл закон Ома все те крайне немногочисленные алгоритмы, которым меня пытались научить во времена молодости царя гороха, но есть мнение, что алгоритм Блюма-Флойда-Пратта-Ривеста-Тарьяна реализован в главе 6 дико неоптимально. Например совершенно непонятно зачем выделять массив целых чисел markS чтобы положить туда флаг принадлежности к множеству. Меня например также учили, что выделение памяти достаточно дорогая операция и в данном случае можно было бы обойтись без нее, переписав функцию ArrayPack без использования этого массива с парой лишних сравнений для каждого элемента. Кроме того, выделенная память нигде не освобождается.
Что еще угарнее - название использованного алгоритма так и не приводится в книжке. Пребываю в легком недоумении

Update: а реализация барьеров в главе 7 совершенно безобразна. Вместо того чтобы сначала взвести все переменные и только потом вызывать pthread_cond_broadcast, гражданин вводит лишнюю сущность color. Только это не работает
Предположим что после вызова pthread_cond_broadcast текущий поток вытесняется и один из проснувшихся потоков повторно входит в барьер, уменьшая значение счетчика (который становится -1). Поток соотв-но встает на pthread_cond_wait. Затем исходный поток оживает, сбрасывает count в numThreads и идет по своим делам. Итого - один поток потерялся навсегда и
все последующие потоки будут тупить на его реализации барьера вечно
И еще было бы неплохо объявить поле numThreads в структуре pth_barrier_t как volatile, а то малоличо

четверг, 25 августа 2011 г.

crypto lib with avx

а вот скожите мне - есть ли в природе крипто-либы, позволяющие утилизировать AVX ?
я тут давеча собрал botan например - он умеет только ssse3
OpenSSL также имеет для некоторых алгоритмов вставки на asm, но они не первой свежести (2005-2007 годов и в основном под 586 & x86_64, что является весьма размытым понятием в наше время)
неужто все авторы opensource нищеброды никто не озаботился до сих пор поддержкой AVX ?