Как стать автором
Обновить

Динамическая JIT компиляция C++

Уровень сложностиСредний
Время на прочтение12 мин
Количество просмотров5.2K


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


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


Так, на днях искал материалы про JIT компиляцию C++ в рантайме с помощью clang/llvm и поиск мне выдал мою же собственную статью трехгодичной давности: Динамическая JIT компиляция С/С++ в LLVM с помощью Clang / Хабр. В результате появилась уже эта новая статья про JIT компиляцию C/С++.

Читать дальше →
Всего голосов 11: ↑10 и ↓1+9
Комментарии4

Для ядра Linux предложили систему прозрачного переноса потоков на разные ядра и хосты: Popcorn Linux

Время на прочтение4 мин
Количество просмотров13K


Для ядра Linux представлен набор патчей Popcorn Linux. Это программный стек, который позволяет приложениям с общей кодовой базой выполняться на распределённых хостах. То есть приложение можно запустить на одном хосте, а во время его выполнения выполнить миграцию на удалённый хост. Многопоточные приложения могут переносить любой свой поток на любой удалённый хост.

Более продвинутая версия Popcorn Linux позволяет приложениям одновременно выполняться на ядрах разной архитектуры (например, x86 и ARM). То есть, теоретически, часть программы можно запустить на ARM-ядре с низким энергопотреблением, а другой поток отправить на высокопроизводительное ядро x86.
Читать дальше →
Всего голосов 36: ↑36 и ↓0+36
Комментарии20

Протектор и LLVM-обфускатор. Сравнение двух подходов к решению задачи запутывания кода

Время на прочтение7 мин
Количество просмотров6K

Добрый день, Хабр! 

В данной заметке я постараюсь сравнить два разных подхода к задаче запутывания машинного кода – это протектор и обфускатор, построенный на базе LLVM-фреймворка. Нам пришлось с этим столкнуться, когда возникла задача защиты библиотек Guardant под разные операционные системы и разные ARM-архитектуры. Для x86/x64 мы используем протектор Guardant Armor, который является полностью нашей разработкой. В случае ARM-архитектуры было принято решение параллельно посмотреть в сторону открытых обфускаторов на базе LLVM с целью их модификации и использования для защиты своих продуктов.

Читать далее
Всего голосов 21: ↑21 и ↓0+21
Комментарии4

Передавать пустые срезы между Rust и C/C++ на удивление сложно

Уровень сложностиСредний
Время на прочтение11 мин
Количество просмотров8.5K

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

В общих чертах она выглядит так:

  • В правила работы с указателями и memcpy в С не заложены грамотные способы представления пустого среза памяти.
  • В С++ с правилами указателей проблем нет, но поведение memcpy здесь аналогично её поведению в С.
  • Интерфейс внешних функций (Foreign Function Interface, FFI) в Rust не лишён накладных издержек. Rust использует несовместимое с C/C++ представление срезов, требуя их преобразования при передаче в обоих направлениях. При этом о преобразовании очень легко забыть.
  • Срезы в Rust также несовместимы с арифметикой указателей, что создаёт проблемы в работе итератора срезов стандартной библиотеки. (Обновление от 2024-01-16: похоже, над этой проблемой работают).

Поскольку проблемы FFI касаются нескольких языков, я писал статью в качестве общей справки, описывающей их несогласованность.
Читать дальше →
Всего голосов 64: ↑59 и ↓5+54
Комментарии53

Вышел Cling 1.0

Время на прочтение1 мин
Количество просмотров3K

Состоялся релиз открытого проекта Cling 1.0 (интерактивного интерпретатора C++), основанного на проектах Сlang/LLVM.

Читать далее
Всего голосов 3: ↑3 и ↓0+3
Комментарии1

Вышел язык программирования Rust 1.70

Время на прочтение3 мин
Количество просмотров4.6K

Опубликован релиз языка программирования общего назначения Rust 1.70. Также была опубликована серия статей о внутреннем устройстве Rust.

Читать далее
Всего голосов 13: ↑10 и ↓3+7
Комментарии1

Нейросеть помогла разработать улучшенный алгоритм сортировки

Время на прочтение1 мин
Количество просмотров3.5K

Google DeepMind сообщила, что благодаря системе ИИ AlphaDev, использующей обучение с подкреплением, удалось разработать усовершенствованные алгоритмы сортировки. В компании отмечают, что в отличие от общепринятых подходов, разработка велась с нуля при помощи игры, основанной на ассемблерных кодах.

Читать далее
Всего голосов 5: ↑5 и ↓0+5
Комментарии6

К концу месяца ожидается выход LLVM 2.0

Время на прочтение2 мин
Количество просмотров895
Чего бы ради писать сюда о проекте, который сегодня едва ли разрывает будущее на куски своим неуёмным развитием? Дело в том, что наверняка в будущее можно въезжать также и неспешно, — но всерьёз и надолго.

Low Level Virtual Machine (LLVM) — это основа для разработчиков языков. Может back-end, может middleware — решайте сами.

итак, ещё вчера в разговорах за бокалом чая с друзьями ИТ-ишниками вы ...
Всего голосов 4: ↑4 и ↓0+4
Комментарии0

Обзор LLVM

Время на прочтение13 мин
Количество просмотров85K
LLVM (Low Level Virtual Machine) — это универсальная система анализа, трансформации и оптимизации программ или, как её называют разработчики, «compiler infrastucture».

LLVM — не просто очередной академический проект. Его история началась в 2000 году в Университете Иллинойса, а теперь LLVM используют такие гиганты индустрии как Apple и Adobe. В частности, на LLVM основана подсистема OpenGL в MacOS X 10.5, а iPhone SDK использует GCC с бэкэндом на LLVM. Apple является одним из основных спонсоров проекта, а вдохновитель LLVM — Крис Латтнер — теперь работает в Apple.

В основе LLVM лежит промежуточное представление кода (intermediate representation, IR), над которым можно производить трансформации во время компиляции, компоновки (linking) и выполнения. Из этого представления генерируется оптимизированный машинный код для целого ряда платформ, как статически, так и динамически (JIT-компиляция). LLVM поддерживает генерацию кода для x86, x86-64, ARM, PowerPC, SPARC, MIPS, IA-64, Alpha.

LLVM написана на C++ и портирована на большинство *nix-систем и Windows. Система имеет модульную структуру и может расширяться дополнительными алгоритмами трансформации (compiler passes) и кодогенераторами для новых аппаратных платформ. Пользовательский фронтенд, как правило, линкуется с LLVM и использует C++ API для генерации кода и его преобразований. Однако LLVM включает в себя и standalone утилиты.

Для тех, кто не без оснований считает C++ не лучшим языком для написания компиляторов, с недавних пор в LLVM включена обертка API для OCaml.

Чтобы понять, что можно сделать с помощью LLVM, и на каком уровне придётся работать, давайте разберёмся,
что из себя представляет LLVM IR.
Всего голосов 52: ↑51 и ↓1+50
Комментарии25

Слияние и поглощение

Время на прочтение2 мин
Количество просмотров1.4K
Тихо и незаметно возникло желание написать ещё один пост про Unladen Swallow и опять начать его словами «тихо и незаметно». Причём в данном случае эти слова будут намного более уместны…

Мы все скучаем без новостей о «ласточке». На главной странице проекта в последних новостях сообщается про выпуск очередного ежеквартального релиза — 2009Q3, октябрь прошлого года. На Хабре пробегают новости от самих разработчиков, вызывающие сомнения в перспективах использования Python-а внутри Google-а, и, соответственно, в заинтересованности Google-а в «ласточке». Всё плохо и безрадостно, казалось бы, не видать нам годного JIT-компилятора в Python-е…

Ан нет. Сегодня, случайно зайдя на канал #unladenswallow на OFTC, с меня слетела шляпа меня встретила надпись: PEP 3146 approved! А этот самый PEP 3146 — это, между прочим, описание плана интеграции Unladen Swallow с CPython, имеющее теперь статус Accepted/Standards Track.
Читать дальше →
Всего голосов 56: ↑52 и ↓4+48
Комментарии17

ClangBSD собирает себя

Время на прочтение1 мин
Количество просмотров1K
Процесс, описываемый на wiki.freebsd.org/BuildingFreeBSDWithClang, казалось, идет слишком медленно, или же совсем заглох. Однако недавно в рассылке появилось сообщение от Roman Divacky о том, что ClangBSD успешно собирает саму себя на tier 1 платформах (i386 и amd64).

Вкратце ClangBSD — попытка собрать ядро и мир FreeBSD с помощью компилятора clang, который, в свою очередь, является фронтендом к LLVM. Как известно, FreeBSD до сих пор использует GCC версии 4.2.1, т.к. последующие версии сменили лицензию. Clang же имеет BSD-лицензию, а так же имеет много других вкусностей.
У проекта были проблемы со сборкой libstdc++, однако теперь они преодолены. Единственный известный баг — загрузчик ОС превышает допустимый размер исполняемого файла. Пока что имеется workaround — собирать загрузчик без поддержки UFS1.

Сообщение разработчиков:
permalink.gmane.org/gmane.os.freebsd.current/124678

Low Level Virtual Machine:
llvm.org

Clang:
clang.llvm.org
Всего голосов 34: ↑26 и ↓8+18
Комментарии71

Простой тест libjit vs llvm

Время на прочтение20 мин
Количество просмотров2.1K
«И опыт, сын ошибок трудных» (с) Сами знаете кто

С самого детства меня интересовали вопросы типа "кто победит — слон или кит". Или, например, "кто сильнее — тигр или лев". Теперь, когда я стал взрослым, вопросы немного изменились. Теперь меня интересует в частности — что круче libjit или llvm.

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

Итак. Простая задача — решето Эратосфена, или поиск простых чисел.


Читать дальше →
Всего голосов 10: ↑7 и ↓3+4
Комментарии5

Automatic Reference Counting: часть 1

Время на прочтение7 мин
Количество просмотров32K
Здравствуйте, коллеги.

Давно читаю блоги и статьи зарубежных разработчиков под iOS. И на днях попалась любопытная, довольно подробная статья об Automatic Reference Counting от разработчика по имени Mike Ash.
Статья довольно большая, потому перевод, сделанный мною, рискну разбить на несколько частей. Надеюсь, что уложусь в 2 части.
Часть первая
Всего голосов 34: ↑31 и ↓3+28
Комментарии15

Обзор нововведений в Xcode 4.2 для iOS-разработчика

Время на прочтение4 мин
Количество просмотров4.4K
Одновременно с релизом iOS5 разработчики получили в свое распоряжение обновленный Xcode 4.2, в котором ожидаемо обнаружились некоторые новые «фичи». Под катом кратко рассмотрим основные нововведения, представленные в XCode 4.2.
Читать дальше →
Всего голосов 37: ↑33 и ↓4+29
Комментарии8

H.264 декодер на JavaScript

Время на прочтение1 мин
Количество просмотров7.7K
Прежде чем отправить публикацию, крепко задумался, какой блог выбрать: JavaScript или Ненормальное программирование. Так или иначе круг задач, которые можно решить на детище Нетскейпа расширяется с каждым днем.

Так например разработчики из команды Mozilla смеха ради сделали H.264 декодер на JavaScript. Любопытно, что скрипт при этом не был написан вручную.

Читать дальше →
Всего голосов 72: ↑61 и ↓11+50
Комментарии51

LLVM 3.0 Release

Время на прочтение2 мин
Количество просмотров2.1K
1 декабря состоялся релиз LLVM 3.0 (Low Level Virtual Machine) — «инфраструктуры для компиляторов», которая генерирует платформонезависимый оптимизированный байткод низкого уровня (см. обзор на Хабре). LLVM используется в том числе в официальных средствах разработки для Mac OS X и iOS.

С момента выхода LLVM 2.9 прошло шесть месяцев, новшеств довольно много, в том числе новый «жадный» аллокатор регистров. Он применяет интересные способы оптимизации и способен значительно улучшить производительность кода.
Читать дальше →
Всего голосов 36: ↑31 и ↓5+26
Комментарии7

Nvidia открыла исходный код компилятора CUDA

Время на прочтение1 мин
Количество просмотров2.7K
Nvidia открыла исходный код нового компилятора CUDA на базе LLVM. Сорцы не раздаются направо и налево, а доступны только для «квалифицированных исследователей и разработчиков». Для их получения нужно зарегистрироваться, заполнить форму и указать, для каких проектов вы намерены применять компилятор. Так что пока непонятно, под какой лицензией опубликован компилятор и вообще — свободная ли это лицензия. В пресс-релизе компания намекает на более открытый доступ к исходникам в будущем.



С помощью компилятора и нового CUDA Toolkit 4.1 можно будет приспособить платформу GPGPU для других архитектур и процессоров, в том числе AMD GPU и x86 CPU, а также создавать гетерогенные суперкомпьютерные системы.
Всего голосов 28: ↑24 и ↓4+20
Комментарии18

Уменьшаем размер своего iOS приложения

Время на прочтение3 мин
Количество просмотров7K
Хочу поделиться способом, который позволит сэкономить несколько мегабайт «лишнего» веса в вашем iOS приложении. Зачем это может понадобиться? Во-первых, если ваше приложение чуть больше 20 Мб, то его нельзя будет скачать по 3G, а только используя Wi-Fi или синхронизацию c iTunes (ограничение со стороны Apple). Ну, а во-вторых, если вы любите все оптимизировать или просто хотите чуть-чуть сократить время загрузки вашего апа.
Все нижеперечисленные пункты я проверял и использовал в своем апе, сэкономив суммарно около 4 Мб. Кажется не очень то и много, но если, например, умножить на 5000 тысяч загрузок в день, то уже получим около 20 Гб сэкономленного трафика. Итак, приступим.
Читать дальше →
Всего голосов 27: ↑20 и ↓7+13
Комментарии20
1
23 ...