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

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

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

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

Об одной мета-оптимизации

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

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

Мета-оптимизация (или, еще проще, над-оптимизация) - это оптимизация, примененная к другим методам оптимизации. Мне очень нравится придумывать в компиляторе, который я сопровождаю, всякие оптимизации. Но применить мета-оптимизацию как-то не приходило в голову. Натолкнул случай.

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

Считаем 2+2×2

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

Статья-туториал для тех, кто хочет узнать, как из заголовка получается «6» методом рекурсивного спуска. Начнём с самого простого и дойдём до вычисления -1.82 или около того из строки -2.1+ .355 / (cos(pi % 3) + sin(0.311)).

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

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

Управление временем жизни объектов: почему это важно и почему для этого пришлось создать новый язык «Аргентум»

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

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

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

Пишем виртуальную машину (интерпретатор) простого байткода + JIT компиляция

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

На Хабре есть две статьи, автор которых пишет виртуальную машину для исполнения простого байткода, а потом применяет различные оптимизации для ускорения этой виртуальной машины. Кроме того, есть и компилятор простого С‑подобного языка в этот самый байткод. Ознакмившись со статьями и этим компилятором, я подумал, что будет интересно изучить, как написать виртуальную машину этого языка, которая сможет делать JIT‑компиляцию байткода с помощью библиотеки libjit. Опыт этого я и описываю в настоящей статье. В интернете есть статьи, описывающие испльзование этой библитеки, но все, что я видел, описывают генерацию машинного кода с помощью libоit для конкретных программ, а не произвольного байткода: есть официальный tutorial, серия статей и ещё серия сравнений на Хабре.

Весь мой код приведён в моём репозитории.

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

Истории

Реализуем Type inference на Rust — Часть #1: Unification

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

Если вы пишете свой язык программирования, то вы наверное слышали о type inference. В этом цикле статей, без лишней теории, мы наглядно разберем как это работает и реализуем свой на Rust.

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

Немного об оптимизации кода путем «свертки»

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

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

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

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

Рассмотрим некоторые приемы оптимизации «сверткой» на простейшем примере.

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

Rust 1.71.0: C-unwind ABI, атрибуты визуализации отладчика и константная инициализация thread local

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

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


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


rustup update stable

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


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

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

Команда AArch64, о которой вам нужно знать

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

Сегодня я бы хотел поговорить о недооценённой особенности архитектуры набора команд AArch64, на неё часто не обращают внимания, но её активно используют компиляторы. Это хорошая короткая история о том, как Arm стал лучше и «ещё более CISC» с точки зрения условных переходов. История csinc заслуживает подобной статьи.

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

Немного про «ПИ» и другие встроенные константы

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

Нет-нет, я не собираюсь рассказывать все прибаутки о константах, вроде того, как связано число E и год рождения Льва Толстого. Речь о другом.
Как-то один мой коллега попросил меня «свежим взглядом» посмотреть его программу. Он проводил проверочный расчет, и в итоге должна была получиться единичная матрица. На месте нулевых элементов оказались величины, близкие к нулю – что-то около 10**-17, что можно объяснить погрешностью расчета и исходных данных. Но у трех элементов было значение 10**-7. Вопрос состоял в том, а, собственно, почему так? ведь все формулы «симметричны».

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

Современный TLS/SSL в Windows 3.11

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

В последнее время происходит ренессанс новых программ для ретро-компьютеров — для них пишут клиенты Slack, клоны Wordle, клиенты Mastodon. Однако большинству этих программ при подключении к Интернету требуется запущенный на современном компьютере прокси для работы с SSL/TLS, которых требуют сегодня практически все API. Но заставлять Gateway 4DX2-66 с установленной Windows 3.11 for Workgroups использовать для подключения к Интернету современную машину — это довольно грустное решение, поэтому я решил изменить статус-кво.

Нельзя сказать, что Windows 3.1 не поддерживала защищённые соединения; например, в Internet Explorer 2 была поддержка SSL. Но со временем и клиенты, и серверы перешли на новые версии протокола и алгоритмов SSL (теперь называемого TLS), и отказались от поддержки старых версий, потому что в них обнаружены уязвимости наподобие POODLE.
Читать дальше →
Всего голосов 56: ↑55 и ↓1 +54
Комментарии 10

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

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

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

Зациклиться
Всего голосов 30: ↑30 и ↓0 +30
Комментарии 8

История T

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

Олин Шиверс


T был одной из лучших реализаций языка программирования Lisp и установил стандарт лаконичного дизайна, который был превзойдён лишь немногими более новыми диалектами. В этой статье Олин Шиверс вспоминает историю T.

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

Подводные камни С++. Решаем загадки неопределённого поведения, ч. 1

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

Изучение и понимание неопределённого поведения — важный шаг для разработчика C++, поскольку undefined behavior бывает источником серьёзных ошибок и проблем в программах. UB может проявляться в разных аспектах языка, включая операции с памятью, многопоточность, арифметические вычисления, работу с указателями и так далее.

Под катом мы погрузимся в мир неопределённого поведения в C++ и рассмотрим некоторые примеры ситуаций, в которых оно может возникать.

P.S.: Часть приведённых в статье примеров вдохновлены материалами, которые можно посмотреть в разделе «Полезные ссылки».

Читать далее
Всего голосов 48: ↑46 и ↓2 +44
Комментарии 44

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

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн

Как можно компилировать типизированный Python

Время на прочтение 15 мин
Количество просмотров 8.4K
Прошло уже целых 9 лет с тех пор, как состоялся документ PEP 484, в котором сообществу Python были ниспосланы типы. Многих это сильно разозлило, и в широких массах этот ход осуждался (1). С тех пор жители Интернета неоднократно заявляли, что стремятся выяснить: в самом ли деле это означает, что теперь можно компилировать Python в нативный код и таким образом его ускорять? Вопрос совершенно оправданный. Он возник у меня на самом раннем этапе моих разработок, касающихся Python-компиляторов. Итак, осуществимо ли это?

Нет. Но в каком-то роде и «да», с оговорками. Сейчас объясню. Разберём этот вопрос на примере «компиляции перед исполнением» (AOT) в коде на CPython или в смежном с ним коде. В настоящее время CPython – основная подобная реализация в коде на Python. Средства динамической (JIT) компиляции – уже другая категория, и они также будут подробнее описаны ниже. Совершенно новой информации в этом посте нет, я всего лишь постараюсь помочь вам разобраться в ворохе известных академических и отраслевых знаний.

Ключевой тезис статьи таков: типы – это очень развёрнутые подсказки, и иногда они врут.
Читать дальше →
Всего голосов 12: ↑12 и ↓0 +12
Комментарии 2

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

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

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

Наверное, многие слышали, что неопределённое поведение (undefined behavior, UB) -- постоянный источник разнообразных багов, иногда очень забавных, иногда довольно жутких. Тема также неоднократно освещалась и на Хабре, навскидку раз, два, три (и даже целый тег есть). Однако чаще всего статьи по данной теме посвящены тому, как можно отстрелить себе ногу, голову или случайно сжечь свой жёсткий диск, исполнив какой-нибудь опасный код. Я же намерен сделать акцент на том, зачем авторы языков программирования надобавляли всей этой красоты, и как оптимизатор может её эксплуатировать. Всё будет проиллюстрировано наглядными примерами из LLVM и присыпано байками из собственного опыта, так что наливайте себе чай, располагайтесь поудобнее, и погнали.

На дно
Всего голосов 52: ↑52 и ↓0 +52
Комментарии 96

Кросс-компиляция под RISC-V для самых маленьких

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

Архитектура RISC-V корнями уходит к началу 1980-х годов, группа под руководством Дэвида Паттерсона в стенах университета Беркли разработала архитектуры RISC-I и RISC-II. Долгое время архитектуре приходилось существовать в тени лицензируемых ARM и MIPS ядер. Архитектура RISC-V появилась в 2010 году, и поддерживается Linux Foundation. Отметка в 10 миллиардов произведенных ядер была преодолена за 12 лет. 

Сейчас RISC-V может сыграть большую роль в становлении российской микроэлектроники. Компании CloudBEAR и Syntacore  работают над процессорами собственной микроархитектуры, совместимыми с системой команд RISC-V. Архитектура RISC-V позволяет нашим разработчикам создавать энергоэффективные процессоры сравнимого с мировым уровня и сохранять программную совместимость со всеми программами, созданными для экосистемы RISC-V во всем мире.

В данной статье мы попробуем на примере RISC-V платы MangoPi разобраться, как выполняется кросс-компиляция под RISC-V.

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

Говорим про системное программирование и дизайн микропроцессоров простым языком

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

Системное программирование и разработка процессоров — область достаточно узкая, из-за чего её часто воспринимают как что-то непонятное и недоступное. Хотим поделиться новым подкастом «Битовые маски», который планирует исправить это впечатление. В каждом выпуске будем общаться с инженерами, причастными к созданию продуктов, которыми многие программисты пользуются ежедневно, и разбирать с ними интересные нюансы, мифы и задачи отрасли.

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

Читать далее
Всего голосов 23: ↑17 и ↓6 +11
Комментарии 8

Ломаем хаскелем Brainfuck

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

Немного о bfc


Brainfuck — очень глупый язык. Там есть лента из 30к ячеек, по байту каждая. Команды bfc это:


  • Передвижение по ленте влево и вправо (символы < и >)
  • Увеличение и уменьшение значения в ячейке (символы + и -)
  • Ввод и вывод текущей ячейки (символы . и ,)
  • И цикл while, который продолжается пока значение в текущей ячейке не ноль. [ и ] это начало и конец цикла соответственно

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

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

Rust 1.70.0: протокол ''sparse'' для crates.io, OnceCell и OnceLock, лейблы отладочной информации

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

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


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


rustup update stable

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


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

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

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

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

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

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

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

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