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

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

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

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

Я на дереве сижу, препроцессинг провожу

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

Согласно описанию,


Tree-sitter — это инструмент для генерации синтаксических анализаторов и библиотека инкрементного синтаксического анализа. Он может создавать конкретное синтаксическое дерево для исходного файла и эффективно обновлять синтаксическое дерево по мере редактирования исходного файла.

Но как Tree-sitter справляется с языками, в которых необходима стадия препроцессинга?

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

Новости

Как поделить не деля или оптимизация деления компиляторам(и)

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

Если вы никогда не пробовали смотреть как код на C++ разворачивается компилятором в код Assembly – вас ждёт много сюрпризов, причём, не нужно смотреть какой-то замудренный исходный код полный templates или других сложных конструкций: рассмотрите следущий snippet:

Смотреть код
Всего голосов 40: ↑40 и ↓0+48
Комментарии28

Как устроены условные точки останова

Время на прочтение9 мин
Количество просмотров2.7K
Условные точки останова (conditional breakpoints) – исключительно полезный инструмент. Но всем известно, насколько они замедляют работу кода, так, что из-за этого некоторые даже бросают ими пользоваться. В Visual Studio в своё время удалось значительно улучшить ситуацию с ними, что не помешало пользователю @ryanjfleury высмеивать их крайнюю медлительность. Но даже у raddbg уходит около 2 секунд на выполнение 10000 итераций простого цикла, если внутри него расставлены точки останова. Для сравнения: без точек останова тот же самый цикл выполняется менее чем за 1 мс. Почему же так чертовски медленно?

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

Обратите внимание: в этой статье речь идёт об отладчиках, работающих с нативным кодом – например, GDB, LLDB, Visual Studio C++. Отладчики для управляемых и скриптовых языков работают примерно так же, но могут отличаться детали реализации.
Читать дальше →
Всего голосов 5: ↑5 и ↓0+10
Комментарии10

Rust 1.80.0: типы LazyCell, LazyLock, проверяемые имена и значения cfg, эксклюзивные диапазоны в шаблонах

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров2.5K

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


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


$ rustup update stable

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


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

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

Истории

Как Проинициализировать Микроконтроллер [часть 2]

Уровень сложностиПростой
Время на прочтение8 мин
Количество просмотров3.8K

Программа это реализация алгоритма. А алгоритм это упорядоченная последовательность действий. Поэтому очень большое значение имеет правильный порядок исполнения программы.

В этом тексте я написал как автоматически выявить правильную последовательность инициализации

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

Квантовый искусственный интеллект: пересечение квантовых вычислений и машинного обучения

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

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

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

Компилятор за выходные: наконец-то ассемблер

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

Продолжаем разговор об игрушечном компиляторе мной придуманного простейшего языка wend. На этот раз мы добрались до определённой вехи: наконец-то будем генерировать не питоновский код, а ассемблерный.

Ну а когда оно заработает, предлагаю решить задачу: как сэмулировать побитовые операции and-not-xor-or при помощи четырёх арифметических.

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

Побеждаем компилятор в скорости при помощи ассемблера

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

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

Тем не менее, иногда до нас доносятся слухи.

Написанные в древних томах, подслушанные в тайных покоях, начертанные на стенах разрушенных храмов, упоминаемые в загадочных текстах, они рисуют чёткую картину:

Компиляторы плохо справляются с генерацией кода для интерпретаторов, и можно превзойти их, написав интерпретатор на языке ассемблера.
Читать дальше →
Всего голосов 42: ↑40 и ↓2+56
Комментарии41

У меня нет конструктора, но я должен инициализироваться

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

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

Главная ошибка была в том, что ты в это вообще ввязался — в этом никаких сомнений.

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

Читать далее
Всего голосов 15: ↑13 и ↓2+21
Комментарии16

UB или не UB – вот в чём вопрос: как gcc и clang обрабатывают статически известное неопределённое поведение

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

Недавно у нас в команде зашла дискуссия о неопределённом поведении (UB) в C. Напомню для тех, кто не знает: если мы пишем такой код, эффект от выполнения которого (и события в процессе его выполнения) строго не определён в спецификации языка, то возникает неопределённое поведение. Таким образом, встретив такой код, компилятор может действовать по собственному усмотрению, и нет никаких гарантий, что выполнение этого кода пойдёт по предсказуемому пути. Следовательно, нужно избегать неопределённого поведения любой ценой, поскольку мало того, что оно может приводить к глюкам программы, но и часто становится источником уязвимостей и угрозой безопасности. Примеры кода, в котором проявляется неопределённое поведение: выход за границы массива при его индексировании, целочисленное переполнение, деление на ноль, разыменование указателя на null [1].

Компиляторы нередко пользуются неопределённой семантикой языка, чтобы делать те или иные допущения о программе. Например, если написать что-то вроде int x = y/z, компилятор может предположить, что z не может быть равно нулю, так как деление на ноль приводит к неопределённому поведению, а программист явно не собирался писать такой код. На основе этой информации он может попытаться далее оптимизировать программу так:

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

Насекомое 13 лет сидит в вашем компиляторе и не собирается оттуда вылезать

Уровень сложностиПростой
Время на прочтение4 мин
Количество просмотров9.6K

Представим, что у вас идеальный проект. Таски пилятся, компилятор компилирует, статические анализаторы анализируют, релизы релизятся. В какой‑то момент вы принимаете волевое решение открыть древний файл, в который никто не залезал уже много лет, и видите, что он в кодировке Windows-1251. При том, что весь проект уже давно перешёл на UTF-8. «Непорядок!» — думаете вы, и лёгким движением руки меняете кодировку. На следующий день на вашем тестовом сервере случается локальный апокалипсис. Думаете, такого не может быть? Тогда предлагаю это обсудить.

Читать далее
Всего голосов 33: ↑32 и ↓1+40
Комментарии70

Компиляторные оптимизации сложны, так как компиляторы забывчивы

Уровень сложностиСложный
Время на прочтение10 мин
Количество просмотров6.4K

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

Читать далее
Всего голосов 36: ↑28 и ↓8+32
Комментарии6

А что если исходные коды программ хранить в бинарном формате?

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

Эта статья — просто идея, не судите строго.


TLDR: предлагаю рассмотреть хранение исходных кодов программ в некоем бинарном формате вместо голого текста.


Компилятор и IDE


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


И только потом идут этапы, приводящие в конце концов к появлению исполняемого файла.


Как работает типичная IDE: да точно так же. Лексический анализ, синтаксический анализ, семантический анализ, вывод типов, и всё прочее. Т.е. по сути ребята пишут полкомпилятора, чтобы вы могли получить все современные возможности IDE.


Т.е. сам текст программы нужен только человеку на этапе ввода информации. Потому что ему для понимания происходящего AST-дерево не подойдёт.


Но что если хранить исходный код по-другому?

Читать дальше →
Всего голосов 75: ↑35 и ↓40+7
Комментарии240

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

19 сентября
CDI Conf 2024
Москва
24 сентября
Конференция Fin.Bot 2024
МоскваОнлайн
30 сентября – 1 октября
Конференция фронтенд-разработчиков FrontendConf 2024
МоскваОнлайн

Rust 1.79.0: встроенные const, ограничения в ассоциированном типе, продление автоматического времени жизни

Уровень сложностиПростой
Время на прочтение4 мин
Количество просмотров2.3K

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


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


$ rustup update stable

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


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

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

Поясняю за React Сompiler

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

В 2024 году команда React готовит множество нововведений, приуроченных к выходу React 19.

Одним из таких нововведений является React Сompiler — новый JavaScript-компилятор для оптимизации вычислений. Главной целью разработчиков была оптимизация и автоматизация мемоизации в React-приложениях. Если раньше фронтендерам приходилось использовать такие хуки, как useCallback и useMemo, то вскоре React сам возьмёт на себя ответственность за мемоизацию, чтобы избежать повторных вычислений при каждом рендеринге.

Не будем затягивать со вступлением и сразу перейдём к пересказу.

Читать далее
Всего голосов 15: ↑11 и ↓4+8
Комментарии42

Macroni: рецепт поступательного улучшения языка программирования

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


Хотя, Clang и используется в качестве инструмента для рефакторинга и статического анализа, у него есть серьёзный недостаток: в абстрактном синтаксическом дереве не предоставляется информации о происхождении конкретных расширений-макросов на CPP, за счёт которых может надстраиваться конкретный узел AST. Кроме того, Clang не понижает расширения-макросы на уровень LLVM, то есть, до кода в формате промежуточного представления (IR). Из-за этого оказывается запредельно сложно конструировать такие схемы статического анализа, при которых учитывались бы макросы. Сейчас эта тема активно исследуется. Но ситуация налаживается, поскольку прошлым летом был создан инструмент Macroni, упрощающий статический анализ именно такого рода.

В Macroni разработчики могут определять синтаксис новых языковых конструкций на C с применением макросов, а также предоставлять семантику для этих конструкций при помощи MLIR (многоуровневого промежуточного представления). В Macroni используется инструмент VAST, понижающий код C до MLIR. В свою очередь, инструмент PASTA позволяет выяснить, откуда те или иные макросы попали в AST, и на основании этой информации макросы также удаётся понизить до MLIR. После этого разработчики могут определять собственные MLIR-конвертеры для преобразования вывода Macroni в предметно-ориентированные диалекты MLIR, чтобы анализировать предмет с учётом многочисленных нюансов. В этой статье будет на нескольких примерах показано, как Macroni позволяет дополнять C более безопасными языковыми конструкциями и организовать анализ безопасности C.
Читать дальше →
Всего голосов 15: ↑15 и ↓0+26
Комментарии1

Сколько UB в моём компиляторе?

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

У C и C++ программистов две головные боли в плане ошибок: утечки памяти и неопределённое поведение. И как вы догадались из названия, речь пойдёт о неопределённом поведении. И каком‑то «моём» компиляторе. Если точнее, то о наборе компиляторов и инструментах для их разработки, а именно LLVM. Почему «моём»? Потому что мы очень любим Clang, входящий в состав LLVM, и пользуемся им на постоянной основе.

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

Укрощаем суммы с плавающей запятой

Уровень сложностиПростой
Время на прочтение9 мин
Количество просмотров9.1K

Допустим, у нас есть массив чисел с плавающей запятой, и мы хотим их суммировать. Можно наивно подумать, что их достаточно просто сложить, например, на Rust.

Однако это запросто может привести к произвольно большой накопленной погрешности. Давайте проверим:

naive_sum(&vec![1.0; 1_000_000]) = 1000000.0
naive_sum(&vec![1.0; 10_000_000]) = 10000000.0
naive_sum(&vec![1.0; 100_000_000]) = 16777216.0
naive_sum(&vec![1.0; 1_000_000_000]) = 16777216.0

Ой-ёй… Что произошло? Проблема в том .что следующее 32-битное число с плавающей запятой после 16777216 — это 16777218. Так что при вычислении 16777216 + 1, значение округляется до ближайшего числа с плавающей запятой, имеющей чётную мантиссу, то есть снова до 16777216. Мы зашли в тупик.

К счастью, есть более совершенные способы суммирования массива.

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

Мысли по поводу доклада на FPGA-Systems про маршрут ИРИС из МГУ

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

На конференции FPGA-Systems был предоставлен маршрут проектирования блоков микросхем на основе использования C++ под названием ИРИС. Докладчик - заведующий кафедрой Мехмата МГУ Эльяр Гасанов. Его группа имеет значительный опыт проектирования оптимизированных по производительности блоков, например LDPC декодера, и ведет свои истоки из сотрудничества с LSI Logic в середине 1990-х годов.

Мои мысли после просмотра презентации:

Читать далее
Всего голосов 20: ↑17 и ↓3+22
Комментарии36

Объявляю ошибку вида if (x = 42) вымирающей и заношу её в Красную книгу C и C++ багов

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров39K

Редкий вид бага
Если спросить программиста, какие баги чаще всего можно встретить в C и C++ коде, он назовёт разыменование нулевого указателя, неопределённое поведение, выход за границу массива и другие, на его взгляд, типовые паттерны ошибок. Скорее всего, он назовёт и случайное присваивание в условии. Но действительно ли эта ошибка распространена в наше время?

Читать дальше →
Всего голосов 61: ↑60 и ↓1+80
Комментарии109
1
23 ...

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