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

Компиляторы *

Из исходного кода в машинный

Сначала показывать
Порог рейтинга
Уровень сложности

Что нужно знать, если вы хотите вызывать Go функции из ассемблера

Время на прочтение9 мин
Количество просмотров5.9K
You've run into a really hairy area of asm code.
My first suggestion is not try to call from assembler into Go. — Ian Lance Taylor

До тех пор, пока ваш ассемблерный код делает что-то простое, всё выглядит неплохо.


Как только у вас возникает задача вызвать из ассемблерного кода Go функцию, один из первых советов, который вам дадут: не делайте так.


Но что если вам это очень-очень нужно? В таком случае, прошу под кат.


Читать дальше →

C++20 утверждён! Чего ждать и к чему готовиться разработчикам в C++23

Время на прочтение6 мин
Количество просмотров63K
На днях в Праге прошла встреча международного комитета по стандартизации C++. И-и-и-и…



C++20 готов! Осталось поставить штампик от ISO, но это чисто формальный шаг, с которым не должно быть проблем.

Поздравляю всех с этим замечательным событием! Concepts, Coroutines, Modules, Ranges, std::format, constexpr new и constexpr алгоритмы+vector+string, datetime, jthread, span, bit_cast и многие другие мелкие и большие нововведения.

Что успели добавить и поправить в последний момент, что предложили разломать и что все хотят видеть в C++23 — обо всём этом под катом.
Читать дальше →

Выпуск Rust 1.41.0: новые гарантии для Box<T> в FFI, улучшения в cargo install, ослабление ограничений для типажей

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

Команда Rust рада сообщить о выпуске новой версии, 1.41.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.


Если вы установили предыдущую версию Rust средствами rustup, то для обновления до версии 1.41.0 вам достаточно выполнить следующую команду:


rustup update stable

Если у вас ещё не установлен rustup, вы можете установить его с соответствующей страницы нашего веб-сайта, а также посмотреть подробные примечания к выпуску на GitHub.


Что вошло в стабильную версию 1.41.0


Основными новшествами Rust 1.41.0 являются ослабление ограничений на реализацию типажей, улучшения cargo install, новый формат файла Cargo.lock более дружелюбный для работы с git, и новые гарантии для Box<T>, связанные с FFI. Смотрите подробности выпуска для дополнительной информации.

Читать дальше →

EBlink — GDB сервер для ARM Cortex-M микроконтроллеров

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

В сети не много информации о появившемся несколько лет назад GDB сервере EBlink. Этим постом постараюсь исправить ситуацию.


EBlink поддерживает большинство моделей микроконтроллеров STM32 (серии F0, F1, F2, F3, F4, F7, H7, L0, L1, L4, G0 и G4), а также EFR32.


Он интересен тем что поддерживает скрипты на Си-подобном языке Squirrel которые участвуют в процессе прошивки и отладки микроконтроллеров. Это позволяет отредактировав скрипты добавить новые микроконтроллеры или изменить работу с существующими не вмешиваясь в исходный код EBlink. Могу предположить таким образом возможно добавить микроконтроллеры с ядром ARM Cormex-M других производителей, например компании Миландр но это не было проверено.

Читать дальше →

Что под капотом компиляторных оптимизаций GraalVM?

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

Продолжаем разбираться с работой GraalVM, и на этот раз у нас перевод статьи Aleksandar Prokopec «Under the hood of GraalVM JIT optimizations», изначально опубликованной в блоге на Medium. В статье есть несколько интересных ссылок, позже мы постараемся перевести и эти статьи.





В прошлый раз на Medium мы рассматривали вопросы производительности Java Streams API на GraalVM в сравнении с Java HotSpot VM. GraalVM отличается высокой производительностью, и в тех экспериментах мы достигли ускорения от 1.7 до 5 раз. Конечно, конкретные значения выигрыша в производительности всегда будут зависеть от запускаемого кода и нагрузочных данных, поэтому, прежде чем делать какие-то выводы, стоит самостоятельно попробовать запустить ваш код на GraalVM.


В этой статье мы глубже проникнем во внутренности GraalVM и посмотрим, как происходит JIT-компиляция.


Читать дальше →

Mash — язык программирования, компилирует сам себя

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

Приветствую всех в новом 2020-м году.

С момента публикации первого поста про Mash прошел практически ровно 1 год.

За этот год язык был сильно доработан, были продуманы многие его аспекты и определен вектор развития.

Этим всем я рад поделиться с сообществом.
Читать дальше →

О некоторых проблемах микрооптимизаций

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

Предыстория


Как-то раз у меня с коллегой завязался разговор по поводу улучшения инструментария для работы с битовыми флагами в перечислениях C++. На тот момент у нас уже была функция IsEnumFlagSet, принимающая на вход первым аргументом тестируемую переменную, вторым — набор флагов для проверки. Чем же она лучше старого доброго побитового И?

if (IsEnumFlagSet(state, flag)) 
{

}
// vs
if (state & flag) 
{

}
Читать дальше →

ELFийские трюки в Go

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


В этой заметке мы научимся получать машинный код Go функции прямо в рантайме, распечатаем его с помощью дизассемблера и по пути узнаем несколько фокусов вроде получения адреса функции без её вызова.


Предупреждение: ничему полезному эта мини-статья вас не научит.

Читать дальше →

Как работает panic в Rust

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

Как работает паника в Rust


Что именно происходит, когда вы вызываете panic!()?
Недавно я потратил много времени на изучение частей стандартной библиотеки, связанных с этим и оказалось, что ответ довольно сложный!


Мне не удалось найти документы, объясняющие общую картину паники в Rust, так что это стоит записать.

Читать дальше →

ruleguard: динамические проверки для Go

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


В этой статье я расскажу о новой библиотеке (и утилите) статического анализа go-ruleguard, которая адаптирует gogrep для использования внутри линтеров.


Отличительная особенность: правила статического анализа вы описываете на особом Go-подобном DSL, который на старте ruleguard превращается в набор диагностик. Возможно, это один из самых легко конфигурируемых инструментов для реализации кастомных инспекций для Go.


В качестве бонуса, мы поговорим об go/analysis и его предшественниках.

Читать дальше →

О проблемах транслятора Python и переосмысление языка

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

Сколько нужно архитекторов, чтобы реализовать язык программирования?
Сто. Один будет писать реализацию, а 99 — говорить, что могут сделать лучше.


В этой статье я хочу затронуть не столько сам язык, сколько детали реализации CPython и его стандартной библиотеки, которые гарантируют, что у вас не будет никаких простых способов сделать приложение на питоне ни многопоточным, ни быстрым, ни легко поддерживаемым, и почему было создано столько альтернативных реализаций (PyPy, Cython, Jython, IronPython, Python for .NET, Parakeet, Nuitka, Stackless, Unladen Swallow), половина из которых уже умерла; и мало кто понял, почему у альтернатив не было шансов победить в борьбе за выживание против других языков. Да, есть GDScript, который призван решить проблемы с производительностью, есть Nim, который призван решить вообще все проблемы, не обязывая при этом пользователя чрезмерно явно объявлять типы. Однако, учитывая огромную инертность индустрии, я осознаю, что в ближайшие 10 лет новые языки точно не займут значимой ниши. Однако, я верю в то, что питон возможно сделать эффективным, изменив стиль написания кода, по большей части сохранив оригинальный синтаксис, и полностью сохраняя возможность взаимодействия кода нового и старого стиля. Я буду концентрироваться на проблемах CPython, а не ближайшего его конкурента, PyPy, поскольку PyPy на самом деле прыгает вокруг всё тех же проблем CPython.

Читать дальше →

Выпуск Rust 1.40.0: #[non_exhaustive], усовершенствования макросов и прочие улучшения

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

Команда Rust рада сообщить о выпуске новой версии, 1.40.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.


Если вы установили предыдущую версию Rust средствами rustup, то для обновления до версии 1.40.0 вам достаточно выполнить следующую команду:


$ rustup update stable

Если у вас ещё не установлен rustup, вы можете установить его с соответствующей страницы нашего веб-сайта, а также посмотреть подробные примечания к выпуску на GitHub.


Что вошло в стабильную версию 1.40.0


Основными новшествами являются введение атрибута #[non_exhaustive], улучшения macros!() и #[attribute]. Наконец, миграционные предупреждения анализатора заимствований стали ошибками в Rust 2015. Смотрите подробности выпуска для дополнительной информации.

Читать дальше →

Как я 12 лет создавал свой ЯП и компилятор к нему

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


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

Здравствуй, читатель! Меня зовут Александр, родился я в небольшом городке (меньше 10000 человек) в Беларуси. Моя семья была бедной, игрушек крайне мало, про компьютер и какие либо приставки вообще можно не заикаться. Не смотря на то, что семья была бедной, у матери были не бедные родственники, которые иногда дарили нам какие либо не дешевые вещи. И вот однажды (где то в 2001 году) эти самые родственники, дарят нам компьютер «Байт»(советский аналог ZX Spectrum 48k). Радости моей не было предела! Сразу же я начал, запускать на нем игры. Игры на этом компьютере загружались с обычных аудиокассет с магнитной лентой. Загрузка одной игры длилась примерно 5 минут и с не малой вероятностью, могла прекратиться из-за некачественного сигнала. Чтобы увеличить вероятность успешной загрузки, мне приходилось протирать спиртом и регулировать положение считывающей головки магнитофона. Весь этот шаманизм при загрузке, длительность загрузки и невозможность сохраняться в играх, привели к тому, что постепенно я начал терять интерес к играм. Но вместе с «Байт»-ом мне также подарили книгу, по работе с этим компьютером. Я решил прочитать эту книгу, чтобы узнать больше о возможностях «Байт»-а. В книге оказался учебник по встроенному в «Байт» языку программирования «Бэйсик».
Читать дальше →

Ближайшие события

Развитие компилятора C для нового мультиклета-нейропроцессора

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


На конференции разработчиков системного и инструментального ПО – OS DAY 2016, которая прошла в г. Иннополис 9-10 июня 2016 (Казань) при обсуждении доклада о мультиклеточной архитектуре была высказана мысль, что она будет наиболее эффективной при решении задач искусственного интеллекта. Условия для разработки нового процессора общего назначения, ориентированного на задачи ИИ, сложились в текущем году.

Нейропроцессор Мультиклет S2, проект которого был впервые представлен на Huawei Innovation Forum 2019 является дальнейшим развитием мультиклеточной архитектуры. От ранее созданных мультиклетов он отличается системой команд, а именно вводом новых типов малоразмерных данных (с фиксированной и плавающей запятой) и операций с ними. Увеличено количество клеток – 256 и частота – 2,5 ГГц, что должно обеспечить пиковую производительность 81,9 TФлопс на 16F и, соответственно, сделать его сравнимым, в части нейровычислений, с возможностями современных специализированных ASIC TPU (TPU-3: 90 Тфлопс на 16F).

Так как эффективность использования процессоров в значительной мере зависит от оптимальности компилятора разработана развиваемая схема оптимизации кода.
Рассмотрим ее более подробно.
Читать дальше →

Clang-format тормозит работу программы

Время на прочтение11 мин
Количество просмотров5.5K
Сегодня мы будем измерять производительность разных реализаций функции toupper, ведь именно этим и занимаются по вторникам.

Вообще-то мне нет никакого дела до функции toupper, просто я недавно писал другой пост и мне нужен был какой-то общий сюжетный стержень, а toupper кажется вполне интересным и безобидным кандидатом в бенчмарки. Я старался выбрать что-то максимально простое, что не увело бы меня в сторону, но так уж получилось, что в этом тесте я столкнулся со странной проблемой.
Читать дальше →

Паскаль играет в Go. Реализация методов и интерфейсов в любительском компиляторе

Время на прочтение3 мин
Количество просмотров3.8K
If I could export one feature of Go into other languages, it would be interfaces. — Russ Cox



Мой предельно простой компилятор Паскаля уже становился предметом двух публикаций на Хабре. Со времени их написания язык обзавёлся всеми недостающими средствами, положенными стандартному Паскалю, и многими плюшками, добавленными в Паскаль компанией Borland в её золотую пору. Компилятор также научился ряду простейших локальных оптимизаций, достаточных хотя бы для того, чтобы глаза не кровоточили при взгляде на листинг дизассемблера.

Тем не менее дебри объектно-ориентированного программирования остались совершенно нетронутыми. Так почему бы компилятору не послужить теперь полигоном для экспериментов в этой области? И почему бы нам не почерпнуть вдохновение из слов Расса Кокса, вынесенных в эпиграф? Попробуем реализовать в Паскале методы и интерфейсы в стиле Go. Затея интересна хотя бы тем, что все популярные в прошлом компиляторы Паскаля (Delphi, Free Pascal) по сути заимствовали объектную модель из C++. Любопытно посмотреть, как на той же почве приживётся совсем иной подход, позаимствованный из Go. Если вы вслед за мной готовы запастись изрядной долей иронии, отбросить вопрос «Зачем?» и воспринять происходящее как игру, добро пожаловать под кат.
Читать дальше →

Универсальный DSL. Возможно ли это?

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

Язык предметной области. Не перегружен конструкциями языка общего назначения. При этом позволяет всего несколькими строчками реализовать весьма сложную логику. Все это — DSL.

Однако создание DSL требует от разработчика соответствующей квалификации. Регулярное использование этого подхода превращается в рутину разработки очередного языка. Решением может стать создание универсального инструмента — движка, который будет применим к совершенно разным задачам и прост в модификации. В этой статье мы на C# разработаем простейший с точки зрения реализации, но при этом достаточно мощный языковой движок, при помощи которого можно решить достаточно широкий круг задач.
Читать дальше →

Проверка кода компилятора Ark Compiler, недавно открытого компанией Huawei

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

Во время презентаций летом 2019 года Huawei анонсировала технологию Ark Compiler. По заверениям представителей компании, этот проект с открытым исходным кодом позволяет существенно повысить плавность и отзывчивость Android и сторонних приложений. Новый интересный открытый проект по традиции должен пройти проверку качества кода с помощью PVS-Studio.

Введение


Впервые компилятор Huawei Ark был представлен вместе с запуском смартфонов Huawei P30 и P30 Pro. По заявлению Huawei, компилятор Ark повышает плавность работы Android на 24%, а скорость отклика – на 44%. При этом сторонние приложения для Android, после перекомпиляции с помощью Ark, могут работать на 60% быстрее. Открытый проект имеет название OpenArkCompiler. Его исходный код доступен на китайском аналоге сайта GitHub – Gitee.
Читать дальше →

Процесс компиляции программ на C++

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

Цель данной статьи:


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

Читать дальше →

Как работает оптимизирующий компилятор

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

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

В этой статье мы рассмотрим некоторые из основных методик приведения (inference techniques) в оптимизирующих компиляторах: как спроектировать программу, с которой компилятору будет легко работать; какие приведения можно сделать в вашей программе и как использовать их для её уменьшения и ускорения.
Читать дальше →

Вклад авторов