Обновить
95.15

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

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

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

Внутреннее представление и оптимизации строк в JavaScript-движке V8: «отмываем» строки, «обгоняем» C++

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

С самого рождения JavaScript в каком-то смысле был языком для манипулирования текстом — от веб-страничек в самом начале до полноценных компиляторов сейчас. Неудивительно, что в современных JS-движках достаточно много сил уделено оптимизации внутреннего представления строк и операций над ними.

В этой статье я хочу рассмотреть, как могут быть представлены строки в движке V8. Попытаюсь продемонстрировать их эффект, обогнав C++ в очень честном бенчмарке. А также покажу, в каких случаях они могут, наоборот, привести к проблемам с производительностью, и что в таких случаях можно сделать.
Читать дальше →

Реализуем Type Inference на Rust — Часть #2: Простой Lambda Calculus

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

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

Читать далее

Реализация ссылочной модели в языке программирования Аргентум

Уровень сложностиСредний
Время на прочтение18 мин
Охват и читатели2.4K

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

Читать далее

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

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

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

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

Читать далее

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

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

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

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

Читать далее

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

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

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

Читать далее

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

Время на прочтение11 мин
Охват и читатели10K

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

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

Читать далее

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

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

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

Читать далее

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

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

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

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

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

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

Читать далее

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

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

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


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


rustup update stable

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


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

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

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

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

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

Читать далее

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

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

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

Читать далее

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

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

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

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

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

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

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

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

Зациклиться

История T

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

Олин Шиверс


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

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

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

Время на прочтение11 мин
Охват и читатели19K

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

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

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

Читать далее

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

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

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

Ключевой тезис статьи таков: типы – это очень развёрнутые подсказки, и иногда они врут.
Читать дальше →

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

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

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

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

На дно

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

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

Архитектура 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.

Читать далее

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

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

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

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

Читать далее

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