Как стать автором
Поиск
Написать публикацию
Обновить
9.25

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

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

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

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

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

КДПВ


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


Основной особенностью языка является простой, логичный и не противоречивый синтаксис, который основан не на использовании зарезервированных ключевых слов, а на строгой системе грамматических правил с использованием знаков препинания (в список которых входят и операторы языка).


Новое по сравнению с прошлым выпуском:


  • Реализованы все основные алгоритмические конструкции: проверка условий, различные варианты циклов, сравнение по образцу, прерывание последовательности команд и возврат данных, обработка ошибок и т.д.
  • Переработан основной синтаксис для отдельных языковых конструкций.
  • Реализованы большинство операций с переменными, включая операторы раскрытие списков и тензоров.
  • Серьезно переработана система встроенных типов, реализованы функции для их преобразования и для определения данных (последнее можно назвать data comprehensions).
  • Добавлены новые тесты и пр.
Читать дальше →

Как защищать границы массива без команды BOUND

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

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

Читать далее

Лето 2022 года: крутые игровые ноутбуки, которые помогут приятно провести время

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

Наступило лето, а значит, можно отдохнуть от трудов праведных. Если не полностью, то хотя бы частично, отвлекаясь от рабочих будней. Понятно, что способов сделать это много, один из них — компьютерные игры.

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

Tree-sitter: обзор инкрементального парсера

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

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

Читать далее

Прокачиваем kotlin: используем AST лямбд в рантайме

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

История о том, как сделать свой LINQ для kotlin, и как сделать так, чтобы кода вида

data.filter { it.age > 30}.map { it.name }.toList()

мог и выполняться для данных в памяти, и превращаться в SQL запрос для базы данных.

Читать далее

Контроль переполнения. Как уменьшить длину, увеличивая путь

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

Я уже упоминал, каким неприятным сюрпризом оказалось исключение команды INTO из системы команд x86-64, когда я переводил компилятор на эти команды. Давайте разберемся, нужна ли сейчас команда, которая отвечала за контроль целочисленного переполнения еще со времен процессора 8086.

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

Читать далее

Rust 1.61.0: пользовательские коды возврата в main, расширение возможностей const fn и изменение IO-блокировок

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

Команда 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) канал. Пожалуйста, сообщайте обо всех встреченных вами ошибках.

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

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

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

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

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

*Обращаем ваше внимание: позиция автора не всегда может совпадать с мнением МойОфис.

Читать далее

Когда разница адресов имеет значение

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

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

Читать далее

Лексический анализ в 11l

Время на прочтение7 мин
Количество просмотров9.1K
В данной статье говорится о лексическом анализаторе, который является неотъемлемой частью любого компилятора.

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

Так, например, код
print(1 + 2)
будет разбит на лексемы
print, (, 1, +, 2 и )
Читать дальше →

В апреле выйдет GNU Compiler Collection 12

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

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

Читать далее

Меняем std::sort для Google

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

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

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

Как собрать зловредный компилятор

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

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

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

Читать далее

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

Создание игр для NES на ассемблере 6502: скроллинг фона

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


Содержание:

  • Использование PPUSCROLL
  • Системы камер
  • Подготовка фонов к скроллингу
  • Реализация автоскроллинга
  • Логические фильтры
  • Подводим итог
  • Домашняя работа

Мы уже рассмотрели отрисовку и перемещение спрайтов, но фоны мы пока только отрисовывали. NES имеет возможность плавного скроллинга фонов с точностью до одного пикселя в кадр.
Читать дальше →

Создание игр для NES на ассемблере 6502: движение спрайтов

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


14. Движение спрайтов


Содержание:

  • Zero-Page RAM
  • Подпрограммы
  • Управление регистрами для подпрограмм
  • Наша первая подпрограмма: отрисовка игрока
  • Соединяем всё вместе
  • Домашняя работа

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

Создание игр для NES на ассемблере 6502: графика фона

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


13. Графика фона


Содержание:

  • Таблица паттернов фона
  • Составление таблицы имён
  • Таблица атрибутов
  • Дополнительные изменения
  • Использование проектов NES Lightbox
  • Домашняя работа

Прежде чем мы начнём перемещать спрайты по экрану, я хотел бы рассказать, как на NES работает графика фона. Мы изучили механику графики фона в Главе 9, а в этой главе мы рассмотрим код, необходимый для отображения фонов на экране.
Читать дальше →

Создание игр для NES на ассемблере 6502: ветвление и циклы

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


11. Ветвление и циклы


Содержание:

  • Управление потоком в языке ассемблера
  • Ветвление
  • Обзор опкодов циклов и ветвления
  • Ещё один пример ветвления
  • Выполнение сравнений
  • Использование сравнений в циклах

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

Создание игр для NES на ассемблере 6502: спрайтовая графика

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


10. Спрайтовая графика


Содержание:

  • Спрайтовые данные
  • Object Attribute Memory (OAM)
  • Работа с NES Lightbox
  • Отображение спрайтов в игре

Итак, мы рассмотрели устройство PPU на высоком уровне, и теперь готовы изучить подробности отрисовки спрайтов. К концу этой главы вы будете знать, как создавать тайлы спрайтов и отрисовывать их на экране.
Читать дальше →

Создание игр для NES на ассемблере 6502: Picture Processing Unit (PPU)

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


9. Picture Processing Unit (PPU)


Содержание:

  • Палитры
  • Таблицы паттернов
  • Спрайты
  • Фоны

«Игра» для NES состоит из трёх компонентов: отображаемой на экране графики, пользовательского ввода через какой-нибудь контроллер и звука для музыки и звуковых эффектов. Игра использует пользовательский ввод для изменения отображаемой графики и воспроизводимого звука, пока пользователь не отключит систему. В этой серии глав мы рассмотрим каждый из этих трёх компонентов, начав с того, как NES отображает графику.
Читать дальше →

Создание игр для NES на ассемблере 6502: рефакторинг

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


8. Рефакторинг


Содержание:

  • Константы
  • Файл заголовка
  • Импорт и экспорт ca65
  • Собственная конфигурация компоновщика
  • Соединяем всё вместе
Читать дальше →

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