
Компиляторы *
Из исходного кода в машинный
Межмодульный анализ C и C++ проектов в деталях. Часть 1

Начиная с PVS-Studio 7.14, для C и C++ анализатора появилась поддержка межмодульного анализа. В этой статье, которая будет состоять из двух частей, мы расскажем, как устроены похожие механизмы в компиляторах и раскроем некоторые технические подробности реализации в нашем статическом анализаторе.
PureBasic для Raspberry PI

Не так давно состоялся релиз PureBasic версии 6.00, в котором среди прочего добавлена поддержка ARM процессоров. В списке поддерживаемых платформ присутствует Raspberry PI, но вероятно должны поддерживаться и другие похожие одноплатные компьютеры. Мною была проверена работа на большинстве моделей Raspberry PI включая самую простую - Zero и топовую на текущий момент - 4B. На всех была установлена Raspberry Pi OS April 4th 2022. Как и ожидалось, PureBasic запустился и нормально работал на всех тестовых Raspberry PI.
Немного о «мертвом коде»

Термин «мертвый код» - это, скорее, жаргонное, чем научное название участков программы, на которые не может попасть управление и, таким образом, они никогда не выполняются. Разумеется, в нормальных программах таких участков быть не должно. Но поскольку языки программирования становятся все сложнее и сложнее (а программисты все тупее и тупее, шутка!) в кодах программ может быть все, что угодно.
Rust 1.62.0: cargo add, #[default] для перечислений, быстрые мьютексы на Linux и поддержка bare metal x86_64 платформ
Команда Rust рада сообщить о новой версии языка — 1.62.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.
Если у вас есть предыдущая версия Rust, установленная через rustup, то для обновления до версии 1.62.0 вам достаточно выполнить команду:
rustup update stableЕсли у вас ещё нет rustup, то можете установить его со страницы на нашем веб-сайте, а также ознакомиться с подробным описанием выпуска 1.62.0 на GitHub.
Если вы хотите помочь нам протестировать будущие выпуски, вы можете использовать beta (rustup default beta) или nightly (rustup default nightly) канал. Пожалуйста, сообщайте обо всех встреченных вами ошибках.
JIT-компилятор Python в 300 строк

Может ли студент второго курса написать JIT - компилятор Питона, конкурирующий по производительности с промышленным решением? С учётом того, что он это сделает за две недели за зачёт по программированию.
Как оказалось, может, но с нюансами.
Релиз языка программрования NewLang

NewLang — это язык программирования высокого уровня, в котором можно сочетать стандартные алгоритмические конструкции с декларативным программированием и тензорными вычислениями для задач машинного обучения.
Основной особенностью языка является простой, логичный и не противоречивый синтаксис, который основан не на использовании зарезервированных ключевых слов, а на строгой системе грамматических правил с использованием знаков препинания (в список которых входят и операторы языка).
Новое по сравнению с прошлым выпуском:
- Реализованы все основные алгоритмические конструкции: проверка условий, различные варианты циклов, сравнение по образцу, прерывание последовательности команд и возврат данных, обработка ошибок и т.д.
- Переработан основной синтаксис для отдельных языковых конструкций.
- Реализованы большинство операций с переменными, включая операторы раскрытие списков и тензоров.
- Серьезно переработана система встроенных типов, реализованы функции для их преобразования и для определения данных (последнее можно назвать data comprehensions).
- Добавлены новые тесты и пр.
Как защищать границы массива без команды BOUND

Я уже плакался по поводу исключения в x86-64 команд двоично-десятичной арифметики DAA/DAS и плакался по поводу отмены команды проверки целочисленного переполнения INTO. Теперь настала очередь плакаться по поводу выброшенной команды BOUND. Как говорится, леди и джентльмены, подставляйте свои жилетки и декольте. Начинаю плач.
Лето 2022 года: крутые игровые ноутбуки, которые помогут приятно провести время

Наступило лето, а значит, можно отдохнуть от трудов праведных. Если не полностью, то хотя бы частично, отвлекаясь от рабочих будней. Понятно, что способов сделать это много, один из них — компьютерные игры.
Для игры в ААА тайтлы нужна мощная игровая система, и производители предлагают интересные ноутбуки, на которые стоит обратить внимание. В подборке — те устройства, которые мы бы купили сами. Если у вас есть другие предпочтения, то расскажите о них в комментариях, оценим вместе. Ну а пока приступаем.
Tree-sitter: обзор инкрементального парсера

Некоторые IDE и текстовые редакторы парсят исходный файл целиком при каждом изменении, что может тормозить на больших файлах, а некоторые делают это построчно с помощью регулярных выражений, что тоже тормозит и не даёт качественной подсветки кода, т.к. теряется контекст. Для решения этих проблем в недрах GitHub был создан tree-sitter - инкрементальный парсер, который используют всё больше и больше проектов. Давайте разбираться зачем и почему.
Прокачиваем kotlin: используем AST лямбд в рантайме

История о том, как сделать свой LINQ для kotlin, и как сделать так, чтобы кода вида
data.filter { it.age > 30}.map { it.name }.toList()
мог и выполняться для данных в памяти, и превращаться в SQL запрос для базы данных.
Контроль переполнения. Как уменьшить длину, увеличивая путь

Я уже упоминал, каким неприятным сюрпризом оказалось исключение команды INTO из системы команд x86-64, когда я переводил компилятор на эти команды. Давайте разберемся, нужна ли сейчас команда, которая отвечала за контроль целочисленного переполнения еще со времен процессора 8086.
Кстати, а чего вообще прицепились к этому целочисленному переполнению? И зачем для него иметь еще какую-то отдельную проверку? Например, ну, нет же никакой отдельной команды INTD проверки деления на число с нулевым значением.
Rust 1.61.0: пользовательские коды возврата в main, расширение возможностей const fn и изменение IO-блокировок
Команда Rust рада сообщить о новой версии языка — 1.61.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.
Если у вас есть предыдущая версия Rust, установленная через rustup, то для обновления до версии 1.61.0 вам достаточно выполнить команду:
rustup update stableЕсли у вас ещё нет rustup, то можете установить его со страницы на нашем веб-сайте, а также ознакомиться с подробным описанием выпуска 1.60.0 на GitHub.
Если вы хотите помочь нам протестировать будущие выпуски, вы можете использовать beta (rustup default beta) или nightly (rustup default nightly) канал. Пожалуйста, сообщайте обо всех встреченных вами ошибках.
Ближайшие события
Как помочь компилятору повысить быстродействие вашей программы

Современные компиляторы весьма далеко продвинулись в области оптимизации ПО. Но иногда им бывает трудно подобрать наилучший способ оптимизации. К счастью, мы можем помочь им в этом выборе.
Под катом старший разработчик ПО компании Google, Minhaz A V*, рассказывает об оптимизации производительности кода. Менее чем за час работы автор ускорил код на 18%, добавив в него всего пару строк. Несмотря на то, что в большинстве примеров этого материала используется C++, статья может быть полезна широкому кругу читателей.
*Обращаем ваше внимание: позиция автора не всегда может совпадать с мнением МойОфис.
Когда разница адресов имеет значение

Среди бесчисленных режимов адресации архитектуры х86 существует один такой…
Впрочем, почему «бесчисленных» режимов? Если разобраться, то их немного. Со времен первого процессора 8086 адресация укладывалась в байт, который имел аббревиатуру MODRM, где «MOD» - это собственно режим адресации (т.е. mode), «R» - регистр и «M» - очевидно, память (memory).
Если не рассматривать дальнейшее совершенствование системы адресации с помощью SIB-байта, то, поскольку под MODE в MODRM-байте выделено всего два бита, получается, что возможны всего-навсего четыре режима адресации.
Лексический анализ в 11l
Задача лексического анализатора заключается в том, чтобы разбить исходный текст программы на лексемы или токены.
Так, например, код
print(1 + 2)
будет разбит на лексемыprint, (, 1, +, 2 и )В апреле выйдет GNU Compiler Collection 12

Смягчение уязвимости Trojan Source, оптимизация функций приведения типов, многомерный оператор [], подавление предупреждений о вендорных атрибутах — вот лишь некоторые возможности GCC 12. Подробностями делимся к старту курса по разработке на C++.
Меняем std::sort для Google

Мы меняем
std::sort в библиотеке libcxx проекта LLVM. В этой статье мы подробно расскажем о том, как мы пришли к этому решению и какими будут возможные последствия, о багах, с которыми вы можете столкнуться в примерах из open source. Мы покажем несколько бенчмарков, объясним, почему вообще это сделали и чего это нам стоило, на примерах закона Хайрама и обучения с подкреплением. Все изменения выложены в open source, поэтому я свободно могу о них рассказывать.Эта статья разделена на три части. Первая — это подробная история недавнего прошлого сортировки в стандартных библиотеках C++. Вторая расскажет об усилиях, необходимых для перехода от одного алгоритма сортировки к другому с различными багами. В третьей мы объясним выбранную нами реализацию и все внесённые нами оптимизации.
Как собрать зловредный компилятор

А вы знали, что бывает такая атака на компилятор через бэкдор, защититься от которой невозможно? В этом посте я покажу вам, как реализовать такую атаку менее чем в 100 строках кода. Кен Томпсон, создатель операционной системы Unix, рассказывал о такой атаке еще в 1984 году в своей лекции по поводу присуждения Премии Тьюринга. Такая атака по-настоящему опасна и сегодня, причем, не известно решений, которые обеспечивали бы полную неуязвимость от нее. Вирус XcodeGhost, открытый в 2015 году, проводит атаку через бэкдор по методу, предложенному именно Томпсоном. Я покажу здесь атаку Томпсона на языке C++, но этот пример легко адаптировать для любого другого языка. Дочитав эту статью, вы крепко задумаетесь, а осталось ли у вас вообще какое-то доверие компилятору.
Представляю, сколь скептически вы можете отнестись к моим заявлениям – и, возможно, у вас уже возникли вопросы. Ниже приведу примерный диалог, который мог бы состояться у нас с вами, снять некоторые ваши сомнения и помочь вам почувствовать суть атаки Томпсона.
Создание игр для NES на ассемблере 6502: скроллинг фона

Оглавление
Часть I: подготовка
- Введение
- 1. Краткая история NES
- 2. Фундаментальные понятия
- 3. Приступаем к разработке
- 4. Оборудование NES
- 5. Знакомство с языком ассемблера 6502
- 6. Заголовки и векторы прерываний
- 7. Зачем вообще этим заниматься?
- 8. Рефакторинг
Часть II: графика
Содержание:
- Использование PPUSCROLL
- Системы камер
- Подготовка фонов к скроллингу
- Реализация автоскроллинга
- Логические фильтры
- Подводим итог
- Домашняя работа
Мы уже рассмотрели отрисовку и перемещение спрайтов, но фоны мы пока только отрисовывали. NES имеет возможность плавного скроллинга фонов с точностью до одного пикселя в кадр.
Вклад авторов
antoshkka 1399.0olegchir 910.0Andrey2008 821.2RustLangRu 602.032bit_me 525.4tangro 449.4quasilyte 441.0zzeng 408.0haqreu 399.0