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

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

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

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

Из серии: заглянем под капот clang-e2k/llvm-e2k из штатного дистрибутива для Эльбруса

Время на прочтение 12 мин
Количество просмотров 542
Программирование *C++ *Компиляторы *C *Процессоры
Из песочницы

Тема непосредственно самого процессора Эльбрус уже достаточно хорошо раскрыта в различных статьях, в том числе, в статьях, опубликованных на habr.ru. Кроме самого процессора Эльбрус время от времени на просторах рунета можно встретить обсуждения, посвященные вопросу портирования компилятора clang/llvm на Эльбрус. Пожалуй, данная тема еще не получала подробного освещения. Данная заметка призвана заполнить этот «пробел».

Если вкратце, то llvm из e2k-дистрибутива портируется на базе оптимизирующего компилятора LCC. Ну а тем, кому нужно больше подробностей, то добро пожаловать «под кат».

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

Новости

Что в имени тебе моём? Часть 2

Уровень сложности Простой
Время на прочтение 7 мин
Количество просмотров 515
Совершенный код *Компиляторы *Отладка *Разработка под Windows *

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

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

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

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

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

Поговорим об оптимизирующих компиляторах. Сказ второй: Доминирование

Уровень сложности Средний
Время на прочтение 10 мин
Количество просмотров 4K
Компиляторы *
Обзор

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

Сегодня мы поговорим о доминировании. Это одна из фундаментальных вещей, на которых стоит как теория компиляторов вообще, так и многие компиляторные оптимизации в частности. Пристегните ремни и запишите стоп-слово на бумажке, чтобы не забыть.

Причаститься
Всего голосов 43: ↑43 и ↓0 +43
Комментарии 9

Приручение WinAPI

Уровень сложности Простой
Время на прочтение 8 мин
Количество просмотров 2.1K
Программирование *Компиляторы *Разработка под Windows *

Позапрошлую заметку я начинал словами «вот уже 10 лет прошло…», а эту можно было бы начать «вот уже 20 лет прошло…». Хотя там речь шла лишь о выравнивании стека, а здесь – о целой организации взаимодействия программы с WinAPI. Помнится, здесь недавно в комментариях кто-то наивно удивлялся: зачем вы приводите устаревший и никому не интересный способ программирования через WinAPI? А как же иначе программа вообще может взаимодействовать со средой Windows, как не через вызовы ее стандартных функций? Через имеющиеся надстройки над WinAPI не все можно сделать.

Конечно, было бы прекрасно все время оставаться в рамках парадигмы используемого языка программирования и чтобы «на фотографии не торчали уши фотографа», т.е. чтобы в исходных текстах никак не проявлялись бы особенности взаимодействия со средой. Например, в большинстве языков есть понятие файла. Чтобы открыть файл не обязательно явно описывать стандартную функцию из WinAPI CreateFile или OpenFile, поскольку компилятор переведет встроенный в язык оператор открытия или прямо к обращению к этой функции или к вызову системной библиотеки, которая где-то внутри себя и вызовет требуемую функцию. В любом случае программист не обязан знать, как именно это реализовано в Windows.

В системной библиотеке языка PL/1-KT, который я использую, имеется обращение лишь к 28 функциям WinAPI и это вполне покрывает «обычные» возможности языка и можно было бы не заботиться о явных вызовах. Но увы, часто этого мало. И хотя нормальные люди ходят в двери, а не в окна (ах, какая свежая, искрометная шутка!), приходится в программах явно обращаться к функциям типа CreateWindow или CloseWindow. А это уже ну никак не входит в понятия языка.

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

Истории

Поговорим об оптимизирующих компиляторах. Сказ первый: SSA-форма

Уровень сложности Средний
Время на прочтение 9 мин
Количество просмотров 7.1K
Компиляторы *

Всем привет. Сегодня я хотел бы поговорить об устройстве современных оптимизирующих компиляторов. Я никогда не публиковался на Хабре ранее, но надеюсь, что мне удастся написать серию статей, которая просуммирует мой опыт в этой области.

Коротко обо мне. Меня зовут Макс, и так получилось, что я вот уже 10 лет, почти с самого начала своей карьеры, занимаюсь оптимизирующими компиляторами. Я начинал в Intel, потом перешёл в Azul Systems, год провёл в Cadence и вернулся обратно, всё это время занимаясь компиляторными оптимизациями для Java, C++ и нейросетевых моделей. На момент написания статьи у меня чуть за 900 патчей в LLVM, большинство из них посвящено цикловым оптимизациям.

За это время я провёл десятки собеседований на позиции как интернов, так и инженеров сеньорного уровня, и довольно часто люди, приходя на эти собеседования, многих вещей не знают или знают поверхностно. И я подумал: а мог бы я написать такой цикл статей, чтобы человек, прочитав их, узнал бы всю ту базу, которая, на мой собственный взгляд, необходимо начинающему компиляторному инженеру? Очень бы хотелось, чтобы новичку в этой области можно бы было дать один (относительно небольшой по объёму) набор текстов, чтобы он получил оттуда всё необходимое для старта. Это не перевод, текст оригинальный, поэтому в нём могут быть ошибки и неточности, которые я буду рад исправить, если вы мне их укажете.

Итак, поехали.

Погрузиться
Всего голосов 120: ↑118 и ↓2 +116
Комментарии 58

Реализация генераторов в языке программирования Ü

Уровень сложности Средний
Время на прочтение 24 мин
Количество просмотров 2.9K
Программирование *Компиляторы *

Некоторое время назад я добавил в свой язык программирования Ü такой функционал, как генераторы. В этой статье я хочу поведать, как это было сделано и зачем.


Данная статья будет полезна как интересующимся компиляторостроением, так и тем, кому интересно внутреннее устройство генераторов в частности и корутин вообще.

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

Язык Umka 1.0 и игровой фреймворк Tophat

Время на прочтение 4 мин
Количество просмотров 5.6K
Разработка игр *Компиляторы *C *

После трёх лет неторопливой разработки вышла версия 1.0 моего скриптового языка Umka. Это статически типизированный язык, предназначенный для встраивания в программы на C/C++. Синтаксис и некоторые особенности семантики Umka были вдохновлены языком Go, однако Umka никак не зависит от экосистемы Go и не требует для работы ничего, кроме стандартной библиотеки C.

Основным применением языка стал игровой фреймворк Tophat, созданный Марком Машкаринцем. Версия Tophat 1.0 вышла одновременно с Umka. Это очень простой модульный фреймворк для создания 2D игр. Несколько мини-игр на нём были написаны для участия в джемах. Сейчас в разработке находятся два более крупных игровых проекта — платформер-головоломка и игра о диспетчеризации железнодорожного движения.

Читать далее
Всего голосов 24: ↑22 и ↓2 +20
Комментарии 8

Полезен ли сегодня быстрый обратный квадратный корень из Quake III?

Время на прочтение 23 мин
Количество просмотров 62K
Работа с 3D-графикой *Разработка игр *Алгоритмы *Компиляторы *Математика *
Перевод

В 2005 году id Software опубликовала под лицензией GPL-2 исходный код своей игры 1999 года Quake III Arena. В файле code/game/q_math.c есть функция для вычисления обратного квадратного корня числа, которая на первый взгляд выглядит очень любопытным алгоритмом:

float Q_rsqrt( float number )
{
    long i;
    float x2, y;
    const float threehalfs = 1.5F;

    x2 = number * 0.5F;
    y  = number;
    i  = * ( long * ) &y;                       // зловещий хакинг чисел с плавающей запятой на уровне битов
    i  = 0x5f3759df - ( i >> 1 );               // какого чёрта?
    y  = * ( float * ) &i;
    y  = y * ( threehalfs - ( x2 * y * y ) );   // первая итерация
//  y  = y * ( threehalfs - ( x2 * y * y ) );   // вторая итерация, можно удалить

    return y;
}

Об этом алгоритме написано множество статей, и ему посвящена хорошая страница Википедии, где он назван fast inverse square root (быстрым обратным квадратным корнем). На самом деле, этот алгоритм упоминался на различных форумах ещё до публикации исходного кода Q3. Ryszard из Beyond3D провёл в 2004-2005 годах исследование и в конечном итоге выяснил, что первоначальным автором алгоритма был Грег Уолш из Ardent Computer, который создал его десятью годами ранее.
Читать дальше →
Всего голосов 196: ↑194 и ↓2 +192
Комментарии 52

Вся правда о редакторе связей

Время на прочтение 8 мин
Количество просмотров 2.2K
Программирование *Совершенный код *Компиляторы *

Сначала я хотел назвать эту заметку «Редактор связей? Это очень просто». Именно так называл свои прекрасные книжки Евгений Айсберг: «Радио? Это очень просто!», «Телевидение? Это очень просто!» Но поскольку я уже использовал эту шутку в статье о планировщике Windows, чтобы не повторяться, теперь использую любимую формулу многих журналистов: «Вся правда о…».

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

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

Читать далее
Всего голосов 15: ↑12 и ↓3 +9
Комментарии 10

Rust 1.69.0: автоматические исправления предупреждений, отсутствие информации об отладке в скриптах сборки

Уровень сложности Простой
Время на прочтение 2 мин
Количество просмотров 2.3K
Open source *Программирование *Системное программирование *Компиляторы *Rust *
Перевод

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


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


rustup update stable

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


Если вы хотите помочь нам протестировать будущие выпуски, вы можете использовать beta (rustup default beta) или nightly (rustup default nightly) канал. Пожалуйста, сообщайте обо всех встреченных вами ошибках.

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

Создаем свой собственный язык программирования с использованием LLVM. Часть 5: Поддержка классов и перегрузки функций

Время на прочтение 84 мин
Количество просмотров 3K
Open source *Программирование *Компиляторы *

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

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

Неестественное выравнивание

Время на прочтение 5 мин
Количество просмотров 5.2K
Совершенный код *Assembler *Компиляторы *

Вот уже 10 лет прошло, как я переводил свои средства программирования в среду x86-64 для Windows 7. А как будто вчера было! Поскольку тогда многие особенности этой среды были для меня внове, они вызывали недоумение. Вот типичный пример.

Читать далее
Всего голосов 24: ↑22 и ↓2 +20
Комментарии 4

Rust 1.69

Уровень сложности Простой
Время на прочтение 2 мин
Количество просмотров 4K
Программирование *Системное программирование *Компиляторы *Rust *
Перевод

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

Cargo теперь предлагает автоматически исправлять некоторые предупреждения.

Rust 1.69.0 добавил команду cargo fix, чтобы автоматически исправлять некоторые простые предупреждения компилятора. Кроме того, была добавлена поддержка автоматического исправления некоторых простых предупреждений Clippy. Чтобы привлечь больше внимания к этим возможностям, Cargo теперь будет предлагать запустить cargo fix или cargo clippy --fix при обнаружении автоматически исправляемых предупреждений:

Читать далее
Всего голосов 18: ↑13 и ↓5 +8
Комментарии 2

Поиск констант-«матрешек» для сокращения размера данных в программе

Время на прочтение 3 мин
Количество просмотров 1.6K
Совершенный код *Assembler *Компиляторы *

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

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

Читать далее
Всего голосов 9: ↑8 и ↓1 +7
Комментарии 25

Kotlin 1.8.20

Уровень сложности Простой
Время на прочтение 1 мин
Количество просмотров 2.7K
Программирование *Компиляторы *Kotlin *WebAssembly *
Перевод

3 Апреля, вышло очередное обновление Kotlin 1.8.20

Вот некоторые изменения:

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

Создаем свой собственный язык программирования с использованием LLVM. Часть 4: Поддержка составных типов

Время на прочтение 54 мин
Количество просмотров 3K
Open source *Программирование *Компиляторы *

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

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

Ускорение компиляции КОМПАС-3D в 4 раза при помощи PCH

Уровень сложности Средний
Время на прочтение 7 мин
Количество просмотров 1.8K
Блог компании АСКОН Высокая производительность *C++ *Компиляторы *
Аналитика

Время сборки проекта имеет немалое значение в процессе разработки. Начиная с "комфорта" разработчика, при внесении изменений, заканчивая стоимостью оборудования, необходимого для организации CI.


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

Неожиданная проблема с макросами (точнее без макросов)

Уровень сложности Средний
Время на прочтение 3 мин
Количество просмотров 4.8K
Ненормальное программирование *Программирование *C++ *Компиляторы *C *
Мнение

image


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


Возможности макросов зависят от конкретного языка программирования (макропроцессора) и некоторые из языков программирования позволяют себя расширять новыми синтаксическими конструкциями, фактически, реализуя парадигму DSL для конкретной решаемой задачи. Подобные возможности добавляют новые области применения и способы разработки больших программных системы, например, за счет использования языково-ориентированного программирования.


Если же говорить о простых реализациях макросов, например как для языков С и С++, то умные люди и умные книжки советуют избегать использования макросов и по возможности заменять их шаблонами, константами и inline-функциями. Ведь с помощью макросов можно не только упростить код, но и не менее изящно стрелять в ноги себе или своих товарищей.


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

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

Rust 1.68.0: разреженный протокол cargo, локальный pin, обработчик ошибок аллокации

Время на прочтение 3 мин
Количество просмотров 4K
Open source *Программирование *Компиляторы *Rust *
Перевод

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


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


rustup update stable

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


Если вы хотите помочь нам протестировать будущие выпуски, вы можете использовать beta (rustup default beta) или nightly (rustup default nightly) канал. Пожалуйста, сообщайте обо всех встреченных вами ошибках.

Читать дальше →
Всего голосов 34: ↑32 и ↓2 +30
Комментарии 0

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