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

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

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

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

Тысячи вещей, которые в Java стоило бы поправить с первой версии: большое интервью с Сергеем Куксенко из Oracle

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


Сергей Куксенко — перформанс-инженер, видевший Java еще версии 1.0. За это время успел поучаствовать в разработке мобильных, клиентских, серверных приложений и виртуальных машин. Производительностью Java занимается c 2005 года и в данный момент в Oracle работает над улучшением производительности JDK. Один из самых популярных докладчиков на Joker и JPoint.


Этот хабрапост — большое интервью с Сергеем, посвященное следующим темам:


  • Культ Производительности;
  • Когда и что нужно оптимизировать, изначальный дизайн языка и библиотеки;
  • Перспективные направления для дальнейшей оптимизации;
  • Как можно поучаствовать в разработке и что можно сломать оптимизациями;
  • Компиляторные трюки, размещение регистров;
  • Можно ли собрать кошку из фарша;
  • Когда тесты работают пять дней подряд и прочая бытовуха;
  • Как стать перформанс-инженером;
  • Подготовка доклада на следующий Joker.
Читать дальше →

История с продолжением: собственный компилятор Паскаля для Windows с чистого листа

Время на прочтение5 мин
Количество просмотров23K
Неожиданно тёплый приём, оказанный публикой Хабра моему посту о самодельном компиляторе XD Pascal для MS-DOS, заставил меня задуматься. Не досадно ли, что любительский проект, которому я отдал немало сил, лежит у меня мёртвым грузом с тех самых пор, как из Windows полностью исчезла виртуальная машина DOS? Итогом размышлений стал компилятор XD Pascal для Windows. Возможно, он лишился некоторой доли ностальгического шарма и утратил возможность наивной работы с графикой через прерывания BIOS. Однако переход на Windows вдохнул новую жизнь в проект и открыл дорогу к давней мечте — самокомпиляции.

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


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

Библиотека генератора ассемблерного кода для микроконтроллеров AVR. Часть 3

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

← Часть 2. Начало работы
Часть 4. Программирование периферийных устройств и обработка прерываний →


Библиотека генератора ассемблерного кода для микроконтроллеров AVR


Часть 3. Косвенная адресация и управление потоком исполнения


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

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

Профессиональный лексический анализ на регулярных выражениях

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

Синтаксический анализ текста всегда начинается с лексического анализа или tokenizing-а. Существует простой способ решить эту задачу практически для любого языка с помощью регулярных выражений. Еще одно применение старым добрым regexp-ам.

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

Библиотека генератора ассемблерного кода для микроконтроллеров AVR. Часть 2

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

← Часть 1. Первое знакомство


Часть 3. Косвенная адресация и управление потоком исполнения →


Библиотека генератора ассемблерного кода для микроконтроллеров AVR


Часть 2. Начало работы


Как и планировалось, в этой части рассмотрим более подробно особенности программирования с использованием библиотеки NanoRTOS. Те, кто начал чтение с этого поста, могут ознакомиться с общим описанием и возможностями библиотеки в предыдущей статье. В силу ограниченности планируемого объема публикации предполагается, что уважаемый читатель хотя бы в минимальном объеме знаком с программированием на C#, а так же имеет представление об архитектуре и программировании на языке ассемблер для контроллеров AVR серии Mega.

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

Библиотека генератора ассемблерного кода для микроконтроллеров AVR. Часть 1

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

Часть 2. Начало работы →


Библиотека генератора ассемблерного кода для микроконтроллеров AVR


Часть 1. Первое знакомство


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


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

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

Вулканический поросенок, или SQL своими руками

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


Сбор, хранение, преобразование и презентация данных — основные задачи, стоящие перед инженерами данных (англ. data engineer). Отдел Business Intelligence Badoo в сутки принимает и обрабатывает больше 20 млрд событий, отправляемых с пользовательских устройств, или 2 Тб входящих данных.


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


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

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

C++20 укомплектован, C++23 начат. Итоги встречи в Кёльне

Время на прочтение7 мин
Количество просмотров34K
На днях прошла встреча международного комитета по стандартизации C++ в Кёльне. В прошлый раз был принят feature freeze на C++20, так что комитет должен был обсуждать только исправления уже принятых вещей, а добавлять новинки уже в C++23…

… но всё было не так!



Что сделали с std::flat_map; останутся ли страшные ключевые слова co_return, co_await и co_yield; успели ли доделать std::format; в каком виде будут контракты в C++20? Всё это вас ждёт под катом.
Читать дальше →

Вышел Embarcadero RAD Studio 10.3.2 или то что мертво… умерло

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

Привет, Хабр!


Присаживайтесь поудобней, заварите себе чайку, ибо я пишу немного затянуто и через правое ухо. Итак, Вы готовы? Отлично, тогда приступаем.


ВНИМАНИЕ! Информация, описанная ниже, написана исключительно в исследовательских целях и не предназначена для использования в корыстных целях!


Начну, пожалуй с предыстории.


А именно, c конца 2013 года. Тогда перед мной, как помню, возникла проблема поиска удобной IDE для быстрой и главное простой реализации прикладных задач. Надо сказать, что на тот момент я перегорел к JAVA и, хоть NetBeans мне нравилась, хотелось скорости работы и простоты разработки (Не забываем, что Java SE 6 была ну ооочень медленной). Короче, захотелось С/C++. Многие мои знакомые тогда использовали VS 2012 и, конечно, рекомендовали её мне с пеной у рта, мол лучшая IDE и бла-бла-бла. Ага, весила она на тот момент (развернутой) 15-20Gb и съедала почти всю оперативку (4Gb под Windows + VS), и ещё при всем при этом глючила безбожно. Но я готов был закрыть на это глаза, основной-то код я всегда пишу в Notepad++. Но "грязь" в IDE я пережить так и не смог (когда ради консольного приложения программа пишет 100500+ строк кода — это меня бесит и по сей день, я же не форму прошу сделать....) В итоге, удалил я VS 2012 и забыл о ней до 2017 года.

LLVM IR и Go

Время на прочтение10 мин
Количество просмотров16K
В этой статье мы рассмотрим, как построить программу на Go, такую, как компилятор или статический анализатор, которая взаимодействует с фреймворком компиляции LLVM, используя язык ассемблера LLVM IR.

TL;DR мы написали библиотеку для взаимодействия с LLVM IR на чистом Go, см. ссылки на код и на пример проекта.
Читать дальше →

Самые частые грабли при использовании printf в программах под микроконтроллеры

Время на прочтение8 мин
Количество просмотров24K
Время от времени в моих проектах приходится применять printf в связке с последовательным портом (UART или абстракция над USB, имитирующая последовательный порт). И, как обычно, времени между его применениями проходит много и я успеваю напрочь забыть все нюансы, которые требуется учитывать, чтобы он нормально работал в крупном проекте.

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

Использование верилятора как средства быстрого моделирования RTL проектов. Введение в UVM

Время на прочтение8 мин
Количество просмотров17K
В данной статье будут описаны установка и применение бесплатного ПО для моделирования схем цифровой логики на языке Verilog как альтернативы коммерческих продуктов Incisve от компании Cadense и ModelSim от компании MentorGraphics. Сравнение моделирования в ModelSim и Verilator. Так же будет рассмотрена универсальная методолгия верификации — UVM.

Установка ПО для SystemC UVM


1. Верилятор


Одним из языков описания аппаратуры является verilog. На этом языке можно написать модуль.

Например, есть схема счетика:

image

Его код будет выглядеть так:

reg [3:0]counter;
always @(posedge clk or posedge reset)
  if(reset)
    counter <= 4'd0;
  else
    counter <= counter + 1'd1;

После симуляции получим вейвформы:

image

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

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

Для тестирование кода проекта помимо таких языков как Verilog, SystemVerilog, Python (для написания моделей), можно использовать язык SystemC. SystemC — язык проектирования и верификации моделей системного уровня, реализованный в виде C++ библиотеки с открытым исходным кодом.

Один из способов верификации Verilog модулей с помощью SystemC является трансляция verilog файлов в С++. Поможет нам в этом Verilator.

Verilator — это самый быстрый бесплатный симулятор Verilog HDL, который превосходит большинство коммерческих симуляторов. Verilator компилирует синтезируемый SystemVerilog (обычно это не код тестового стенда), а также некоторые утверждения SystemVerilog и Synthesis в однопоточный или многопоточный код C ++ или SystemC. Verilator был разработан для больших проектов, где быстродействие симуляции имеет первостепенное значение, и особенно хорошо подходит для генерации исполняемых моделей процессоров для групп разработчиков встроенного программного обеспечения. Verilator используется для имитации многих очень больших многомиллионных конструкций шлюзов с тысячами модулей и поддерживается многими поставщиками IP-технологий, включая IP от Arm и всех известных поставщиков RISC-V IP.
Читать дальше →

Делаем процесс разработки тяжеловесного программного обеспечения под микроконтроллеры более удобным (нет)

Время на прочтение18 мин
Количество просмотров10K
Сейчас уже никого не удивить микроконтроллерами с энергонезависимой (чаще всего Flash) памятью объемом 512 килобайт и более. Их стоимость постепенно снижается, а доступность напротив, растет. Наличие такого объема энергонезависимой памяти дает возможность писать «тяжелые» по объему занимаемой памяти приложения, облегчая при этом последующее сопровождение кода за счет использования готовых решений из различных стандартных библиотек. Однако это ведет к росту объема файла прошивки целевого устройства, который требуется каждый раз целиком заново загружать в энергонезависимую память микроконтроллера при малейшем изменении в коде.

Цель статьи — рассказать о методе построения проекта на C и/или C++, при котором, в случае изменения участка кода, отладка которого производится чаще всего, большая часть проекта не нуждалась в повторной перезаписи. А так же показать, почему данный метод не всегда является эффективным решением.
Читать дальше →

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

Пишем кастомный трансформер AST на TypeScript

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

Команда TestMace снова с вами. На этот раз мы публикуем перевод статьи о преобразовании кода TypeScript, используя возможности компилятора. Приятного чтения!


Введение


Это мой первый пост, и в нём мне бы хотелось показать решение одной задачи с помощью API компилятора TypeScript. Чтобы найти это самое решение, я долгое время копался в многочисленных блогах и переваривал ответы на StackOverflow, поэтому, чтобы уберечь вас от такой же участи, я поделюсь всем тем, что я узнал о таком мощном, но слабо документированном наборе инструментов.

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

LLVM для Tensorflow, или компилятор эпохи конца закона Мура

Время на прочтение4 мин
Количество просмотров8.6K
Экосистема TensorFlow содержит ряд компиляторов и оптимизаторов, работающих на различных уровнях программного и аппаратного стека. Для тех, кто использует Tensorflow ежедневно, этот многоуровневый стек может порождать трудные для понимания ошибки, как времени компиляции, так и в рантайме, связанные с использованием разного рода железа (GPU, TPU, мобильных платформ и пр.)

Эти компоненты, начиная с графа Tensorflow, могут быть представлены в виде такой диаграммы:



На самом деле всё сложнее
Читать дальше →

Сравнение одинакового проекта в Rust, Haskell, C++, Python, Scala и OCaml

Время на прочтение16 мин
Количество просмотров45K
В последнем семестре университета я выбрал курс компиляторов CS444. Там каждая группа из 1-3 человек должна была написать компилятор из существенного подмножества Java в x86. Язык на выбор группы. Это была редкая возможность сравнить реализации больших программ одинаковой функциональности, написанных очень компетентными программистами на разных языках, и сравнить разницу в дизайне и выборе языка. Такое сравнение породило массу интересных мыслей. Редко можно встретить такое контролируемое сравнение языков. Оно не идеально, но намного лучше, чем большинство субъективных историй, на которых основано мнение людей о языках программирования.

Мы сделали наш компилятор на Rust, и сначала я сравнил его с проектом команды на Haskell. Я ожидал, что их программа будет намного короче, но она оказалась того же размера или больше. То же самое для OCaml. Затем сравнил с компилятором на C++, и там вполне ожидаемо компилятор был примерно на 30% больше, в основном, из-за заголовков, отсутствия типов sum и сопоставлений с образцом. Следующее сравнение было с моей подругой, которая сделала компилятор самостоятельно на Python и использовала менее половины кода, по сравнению с нами, из-за мощности метапрограммирования и динамических типов. У другого товарища программа на Scala тоже была меньше нашей. Больше всего меня удивило сравнение с другой командой, которая тоже использовала Rust, но у них оказалось в три раза больше кода из-за разных дизайнерских решений. В конце концов, самая большая разница в количестве кода оказалась в пределах одного языка!
Читать дальше →

Компиляция C в WebAssembly без Emscripten

Время на прочтение11 мин
Количество просмотров14K
Компилятор — часть Emscripten. А что, если удалить все свистелки и оставить только его?

Emscripten необходим для компиляции C/C++ в WebAssembly. Но это гораздо больше, чем просто компилятор. Цель Emscripten в том, чтобы полностью заменить ваш компилятор C/C++ и запустить в вебе код, который изначально не предназначен для Сети. Для этого Emscripten эмулирует всю операционную систему POSIX. Если программа использует fopen(), то Emscripten предоставит эмуляцию файловой системы. Если используется OpenGL, то Emscripten предоставит С-совместимый контекст GL, поддерживаемый WebGL. Это немалая работа, и немало кода, который придётся внедрить в итоговый пакет. Но можно ли просто… удалить его?
Читать дальше →

Стажировка в JetBrains и как мне почти удалось попасть на неё

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

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

Недавно я попробовал попасть в ряды JetBrains и под катом готов поделиться полученным опытом.
Читать дальше →

Часть 0. Требуется эльф для работы в Матрице. Возможна релокация

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

Внимание: содержит системное программирование. Да, в сущности, ничего другого и не содержит.


Давайте представим, что вам дали задание написать фэнтезийно-фантастическую игру. Ну там про эльфов. И про виртуальную реальность. Вы с детства мечтали написать что-нибудь эдакое и, не раздумывая, соглашаетесь. Вскоре вы понимаете, что о мире эльфов вы знаете по большей части из анекдотов со старого башорга и прочих разрозненных источников. Упс, неувязочка. Ну, где наша не пропадала… Наученный богатым программистским опытом, вы отправляетесь в Гугл, вводите «Elf specification» и идёте по ссылкам. О! Вот эта ведёт на какую-то PDF-ку… так, что тут у нас… какой-то Elf32_Sword — эльфийские мечи — похоже, то что нужно. 32 — это, по-видимому, уровень персонажа, а две четвёрки в следующих столбцах — это урон, наверное. Точно то, что нужно, да к тому же как систематизировано!..

Ну-с, приступим...

EFORTH для МК-161: Структуры данных

Время на прочтение8 мин
Количество просмотров3.1K
Эта статья — окончание цикла статей про eForth на программируемом калькуляторе. Начало здесь.

Команды входного языка «Электроники МК-161» занимают только половину файла eForth0.mkl. Вторую половину занимают таблицы, разработать которые был не меньший труд, чем написать алгоритмическую часть транслятора. Попробуем разобраться, как эти таблицы используются.

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

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