← All posts tagged C++

tilarids

Сделал PA9 за 11 часов до дедлайна. Ранее я писал о нём здесь: #lsm. Полноценный ассемблер с препроцессором, лейблами, условными операторами, целочисленной арифметикой и арифметикой с плавающей точкой.
Глубоко восхищен трудом, который был вложен в разработку системы машинных кодов для x86-64. Впечатляет масштаб и оправданность каждого решения.

tilarids

Доделал PA8. Удивительно, как много в 12.5к строк кода можно засунуть технического долга.
На текущий момент работает С++11 парсинг, в том числе контекстно-зависимый, генерация верхнеуровневого AST, генерация простейшего программного образа. Конца и края пока не видно. Это явно самый масштабный, великий и ужасный курс из всех мне известных.

tilarids

Знаете, почему и через 10 лет мы будем писать на С++, а не на каком-нибудь другом языке? Потому что современные компиляторы С++ оптимизируют так, что диву даёшься. Например, bit.ly
Я пытался обмануть компилятор так, чтобы он не оптимизировал пробрасывание временного значения в функцию bar. Что из этого вышло — сами видите.

tilarids

Закончил PA7, до дедлайна PA8 еще 8 дней. Если опоздаю — буду винить Новый Год.
Немного про C++: move семантика предоставляет новые прекрасные возможности выстрелить себе в ногу. Например, посмотрите на эту строку кода:
namespace->AddEntity(decls[i]->name, move(decls[i]));
К сожалению, подобный код работает на некоторых конфигурациях некоторых компиляторов. И не работает на других. Удачной отладки!

tilarids

Похоже, я не писал в жуйк о чудесном эксперименте с сортировкой флоатов, который я когда-то проводил. Предлагаю провести его и вам(@SannySanoff, например, тебе). Итак, основа для эксперимента — задачка с Ponder This: domino.research.ibm.com
Если очень кратко: представьте, что вы стоите в саду на плоскости, в точке 0,0. В каждой точке с целыми координатами растёт дерево определенного радиуса. Сам сад тоже имеет радиус — 9801, за пределами сада деревья не растут. Начиная с определенного радиуса деревьев вы не сможете увидеть край сада. Нужно определить радиус, начиная с которого это произойдёт.
Но я хотел рассказать о подзадаче, которая может возникнуть при решении в лоб. Для определённого радиуса деревьев для каждого дерева(если забить на остальные деревья) у вас есть угол, начиная с которого дерево блокирует зрение, и угол, начиная с которого дерево больше ничего не блокирует. Подзадача: для каждого дерева в первой кварте (половина первой четверти) построить пары таких флоатов и затем лексикографически эти пары отсортировать. Пар должно быть около 40 миллионов.
Интересны результаты для разных языков, если писать в лоб и использовать стандартные фичи. С++ очень шустр, требует мало памяти (около 300мб, ЕМНИП). СPython помедленней, но ест тоже совсем чуть-чуть, 500-600мб. PyPy намного быстрее CPython, но и памяти съедает больше гига. OCaml съедал два гига. Другая OCaml версия с чьей-то помощью приближалась к Python по потреблению памяти, обгоняя его по скорости. Java версия сжирала 4 гига, работала очень медленно. А если VM ограничить по памяти, то вообще ооочень медленно. Благодаря помощи джавистов удалось загнать Java в рамки 2-х гигов, но качество кода пострадало. Haskell версию заставить нормально работать я не смог, падала по памяти. JS версия тоже не пережила такие запросы по памяти.
Теперь дополнительно, по выразительности по версиям, которые показывали максимальную производительность при минимальном потреблении памяти:
1 место — Python. Никаких оптимизаций проводить не понадобилось. Сортируем стандартные таплы, получаем малое потребление.
2 место — С++. Никаких оптимизаций проводить не понадобилось. Сортируем пары, получаем скорость и малое потребление.
5 место — Java. Пришлось отказаться от использования стандартных средств языка для работы с парами как с объектами.
8 место — OCaml. После оптимизаций код на OCaml стал больше походить на С, чем на функциональщину.
Обратите внимание на отсутствие 3,4,6 и 7 места. Это из-за разрыва в читабельности. Вывод: Python и C++ — офигенные языки, в которых выразительность не принесена в жертву memory footprint, а в случае с С++ — и скорости. Функциональные языки очень расстроили своим непредсказуемым потреблением памяти. Java удивила тем, насколько простая задача может требовать ручных оптимизаций.
Если кто считает, что я не прав — пишите программы, сравнивайте. Буду рад почитать.

tilarids

Занятная статья по С++: bartoszmilewski.com
Очень понравилось сравнение c Эдвардом-Руки-Ножницы — Edward-C++-Hands. Программисты на С++ справляются с большими количеством задач легко и непринуждённо. Но некоторые вещи делать опасно, как, например, Эдварду-Руки-Ножницы опасно обнимать девушек.

tilarids

Чтобы успеть к дедлайну PA6 пришлось сразу после яхты, перелётов и поездов устроить себе нон-стоп кодинг марафон на 16 часов. В результате было дописано 2500 строк довольно сжатого кода.
Парсер будущего компилера занимает 3100 строк, переписан на функциях, биндах и лямбдах, минимизировано количество исключений. Почти до самого конца удавалось держать функции pure, но из-за особенностей стандарта в условиях ограничений времени пришлось этим пока поступиться.
Вывод: я всё больше и больше люблю С++11. Но он всё больше и больше меня пугает.

tilarids

Контест закончился, судя по всему мы в десятке, подробней будет позже. Вынесено из контеста — С++11 очень классный. Брутфорс был написан на лямбдах и в довольно красивом с моей точки зрения стиле, и при этом работал весьма и весьма шустро.

tilarids

Добил всё же PA4. Давно я так много не думал и не тратил столько времени на простые с виду задачи. В голове шумно, новые знания интенсивно пробиваются в мозг. Вывод: это один из лучших программерских курсов что я пробовал. Будет жаль, если я не успею по дедлайнам(например, PA5 нужно сделать до 14-го) и не смогу продолжать.
Еще один вывод: здесь лучше переписать всё с нуля, а не пытаться починить мёртвое. 1500 строк кода я писал неделю. Если бы начал заново, когда их было только 700, закончил бы раньше, а код был бы в 10 раз лучше.

tilarids

Человеки, которые писали emscripten, большие молодцы. Умудрился часа за 4-5 портировать часть большого С++ проекта в JS. Даже под Android с его Native Development Kit я провозился несколько дней (хотя в итоге у меня и работал там весь UI, а не только proof of concept как в вебе). Все тулзы работают неплохо, хоть и приходится порою юзать Google дабы обойти ту или иную ошибку.
Из минусов — я так и не научился генерить производительный код. Генерация в asm.js и -O2 помогают, но не кардинально
Вердикт: можно юзать уже сейчас и даже стартовать проекты. К моменту релиза браузеры подтянутся и наконец смогут это относительно быстро запускать. Но работать так же быстро, как и нативный код, вряд ли будет. Так что от standalone никуда не деться. И это хорошо!

tilarids

Если у вас когда-нибудь под ARMами будет наблюдаться явный stack corruption при входе в функцию, в которой применяется RVO, обязательно проверяйте, что возвращаемый и оптимизируемый объект собран тем же компилятором, которым собирается и возвращающая функция. Оптимизации clang и llvm-gcc отличаются, и хоть обычно можно часть кода собирать одним компилятором, а часть — другим, это чревато странностями поведения

tilarids

Пока в жуйке обсуждают вопросы на собеседованиях (#1902916), я одному из любимейших всеми интервьюерами вопросов посвятил целую статейку в блоге. Если вам интересно, как быстро посчитать количество бит в байте, вы можете начать отсюда: tilarids.blogspot.com

tilarids

Получилось запустить наше большое Qt приложение на настоящем Android девайсе версии 2.2. Больше всего проблем было с правами доступа и установкой нужных библиотек. Но оно работает! Медленно, конечно (виновата отрисовка Qt, как я понимаю), но работает!
Теперь объясняю, зачем здесь *позитив. До недавнего момента мой experience в разработке софта для мобильных платформ ограничивался платформами, которые поддерживают С++(Windows Mobile, Symbian, iOS). Java никогда не была рабочим инструментом для меня. И поэтому Android платформа была недоступна. Появление и развитие Android NDK и Necessitas (Qt for Android) знаменует глобальные изменения на рынке mobile software development. И эти изменения меня очень радуют.