Pull to refresh
273
0
Владимир @32bit_me

Программист

Send message

Мой первый компилятор на LLVM

Reading time4 min
Views25K
Это руководство посвящено написанию простейшего компилятора на LLVM. Никакой предварительной подготовки не требуется.



Входным языком нашего компилятора будет BF. Это классический «игрушечный» язык для компиляторов, и даже есть компилятор BF в примерах к LLVM! В этом посте я приведу процесс написания компилятора с пояснениями.
Читать дальше →
Total votes 37: ↑35 and ↓2+33
Comments11

UB-2017. Часть 1

Reading time14 min
Views9.5K
От переводчика:
Переводы статьи про неопределённое поведение в языке C от Криса Латтнера, одного из ведущих разработчиков проекта LLVM, вызвали большой интерес, и даже некоторое непонимание со стороны тех, кто не встречался с описываемыми явлениями на практике. В своей статье Крис даёт ссылку на блог Джона Реджера, и на его статью от 2010 года, посвящённую UB в C и C++. Но в блоге Реджера есть и гораздо более новые статьи на эту тему (что не отменяет ценность старых, однако).

Я хочу предложить вашему вниманию свежую статью «Undefined Behavior in 2017». Статья в оригинале имеет очень большой объём, и я разбил её на части.

В первой части речь пойдёт о разных инструментах поиска UB: ASan, UBSan, TSan и т.д.
ASan — Address Sanitizer от компании Google, разработанный на основе LLVM.
UBSan — Undefined Behavior Sanitizer, предназначен для обнаружения различных UB в программах на C и C++, доступен для Clang и GCC.
TSan — Thread Sanitizer, предназначен для обнаружения UB в многопоточных программах.
Если вам эта тема покажется далёкой от практики, я рекомендую дождаться продолжения, потому что в конце вас ждёт поистине огромный список UB языка С++ (их должно быть около 200!)
И я рекомендую прочитать также старые статьи Реджера, они не утратили актуальности.
Об авторе: Джон Реджер является профессором Computer Science в университете штата Юта в США.


Мы часто слышим, что некоторые люди утверждают, что проблемы, вытекающие из неопределённого поведения (UB) в C и C++ в основном решены путём широкого распространения инструментов динамической проверки, таких, как ASan, UBSan, MSan и TSan. Мы здесь покажем очевидное: несмотря на то, что в последние годы произошло множество прекрасных улучшений в этих инструментах, проблемы UB далеки от разрешения, и рассмотрим ситуацию в деталях.


Читать дальше →
Total votes 19: ↑19 and ↓0+19
Comments0

Что каждый программист на C должен знать об Undefined Behavior. Часть 3/3

Reading time9 min
Views11K
Часть 1
Часть 2
Часть 3

В первой части цикла мы рассмотрели неопределённое поведение в С и показали некоторые случаи, которые позволяют сделать С более быстрым, чем «безопасные» языки. В части 2 мы рассмотрели некоторые неожиданные баги, которые могут противоречить представлениям многих программистов об языке С. В этой части, мы рассмотрим проблемы, которые компилятор Clang решает, чтобы достичь высокого быстродействия, и устранить некоторые сюрпризы.
image
Читать дальше →
Total votes 19: ↑19 and ↓0+19
Comments11

Что каждый программист на C должен знать об Undefined Behavior. Часть 2/3

Reading time8 min
Views14K
Часть 1
Часть 2
Часть 3

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

Мне нравится называть это «Почему неопределённое поведение часто пугает и ужасает программистов на C».

image
Читать дальше →
Total votes 18: ↑18 and ↓0+18
Comments31

Что каждый программист на C должен знать об Undefined Behavior. Часть 1/3

Reading time7 min
Views30K
Часть 1
Часть 2
Часть 3

Люди иногда спрашивают, почему код, скомпиливанный в LLVM иногда генерирует сигналы SIGTRAP, когда оптимизация была включена. Покопавшись, они обнаруживают, что Clang сгенерировал инструкцию «ud2» (подразумевается код X86) — то же, что генерируется __builtin_trap(). В этой статье рассматривается несколько вопросов, касающихся неопределённого поведения кода на C и того, как LLVM его обрабатывает.

image

В этой статье (первой из трёх) мы попытаемся объяснить некоторые из этих вопросов, чтобы вы могли лучше понять связанные с ними компромиссы и сложности, и возможно, изучить немного больше тёмные стороны С. Мы выясним, что C не является «высокоуровневым ассемблером», как многие опытные программисты на C (особенно те, кто сфокусирован на низком уровне) предпочитают думать, и что C++ и Objective-C напрямую унаследовали множество таких проблем.
Читать дальше →
Total votes 33: ↑32 and ↓1+31
Comments18

Почему LLVM может вызвать никогда не вызываемую функцию?

Reading time14 min
Views18K
Что бы ни сказал тебе твой дракон, он солгал. Драконы лживы. Ты не знаешь, что ждет тебя на другой стороне.
Майкл Суэнвик. «Дочь железного дракона»

Не так давно на Хабре был опубликован пост под названием "Как может вызваться никогда не вызываемая функция?". Выводы из статьи простые: в случае undefined behaviour компилятор вправе предпринимать любые действия, даже если они будут совершенно неожиданными. Однако меня заинтересовал сам механизм этой оптимизации. Результатом своего небольшого исследования я хочу поделиться с уважаемым сообществом хабра.


Читать дальше →
Total votes 88: ↑86 and ↓2+84
Comments21

Игрушечный фронтенд для LLVM, написанный на Rust: Руководство для начинающих

Reading time12 min
Views13K
Примечание переводчика
Приведённый в статье код скомпилирован с достаточно старыми версиями крейтов peg и peg_syntax_ext. Для текущих версий в исходники нужно внести минимальные изменения. Я вставил изменённые участки в спойлеры по тексту статьи. Для сборки кода установите компилятор nightly Rust.
Полный исходник с моими правками можно скачать здесь: https://github.com/arktur04/rust-llvm-toy-frontend


В настоящее время я работаю над компилятором, который написан на Rust, и порождает LLVM IR. LLVM API выглядит немного пугающе для новичков, и по нему не так много руководств (и все они на C++, поэтому не вполне очевидно, как сделать то же самое на Rust). Я бы хотел, чтобы кто-то протянул мне руку помощи, когда я начинал всё это, и эта статья является тем, что я хотел бы показать самому себе в то время.



В Rust наилучшая возможность взаимодействия с LLVM — через крейт llvm-sys. Один добрый человек разместил документацию к нему здесь. Конечно, вам следует также изучить руководство по LLVM, так как оно поможет вам понять, как LLVM “думает”. Этот пост, в основном, является переводом на Rust подмножества из этого руководства.

Полный исходный код для этого руководства находится здесь.
Читать дальше →
Total votes 42: ↑41 and ↓1+40
Comments20

Обзор плат на SoC ARM+FPGA. Часть 2. Мир Intel (Altera)

Reading time6 min
Views33K
Часть 1. Мир Xilinx
Часть 2. Мир Intel (Altera)

Продолжаем обзор девелоперских плат на основе SoC с ядром ARM. На этот раз мы рассмотрим платы на SoC Cyclone V. Это не единственный SoC компании Intel, есть ещё Arria V, Arria 10 и Stratix 10, но цена плат на их основе вас точно не обрадует.

К сожалению, плат на основе Cyclone V гораздо меньше, чем на Xilinx Zynq, и в основном они производятся одной компанией, Terasic. Есть ещё плата Arrow SocKit, но она полностью эквивалентна плате Terasic SoCKit. Основная информация по платам Terasic сосредоточена на сайте rocketboards.org. Там можно скачать разные полезные материалы, образы дистрибутивов Linux, там же находится форум. Форум довольно вялый, и на получение поддержки там я бы не рассчитывал, но лучше что-то, чем ничего.

Также компания Terasic продаёт некоторые платы по сниженной цене при наличии студенческого билета («academic price»). Насколько это реально для российских студентов, я не знаю, но если кто-то имел опыт такой покупки, будет интересно узнать. Пишут, что, например, Digilent при запросе покупки по академической цене отсылает к российсим дистрибьюторам, у которых цены завышены в 2-3 раза. Может быть, Terasic поступает иначе.

Кроме продукции компании Terasic мы рассмотрим также две платы производства компании EBV. Другие компании, выпускающие продукцию на Cyclone V, делают в основном модули SoM, а не девборды, и в обзор не попали.

Осторожно, много картинок!
Total votes 16: ↑16 and ↓0+16
Comments13

Обзор плат на SoC ARM+FPGA. Часть первая. Мир Xilinx

Reading time14 min
Views64K
Часть 1. Мир Xilinx
Часть 2. Мир Intel (Altera)

В опубликованном ранее переводе обзора 98 «хакерских» плат немалый интерес аудитории вызвали платы на базе SoC, сочетающих в себе ядра ARM и FPGA, такие, как Parallella. И это неудивительно, ведь такая комбинация даёт воистину потрясающие возможности по сравнению с «просто» процессором или «просто» FPGA. На таких SoC можно строить системы, сочетающие в себе алгоритмичски сложные задачи, поддержку сетевых стеков, GUI и прочих вещей, проще поддающихся реализации на процессоре, и задачи, требующие жесткого реального времени, обработки сигналов, обработки изображений и другие задачи, для реализации которых удобны FPGA. Разумеется, для многих задач можно использовать простые FPGA (возможно, включив в них IP-ядро процессора типа NIOS II или MicroBlaze), многие задачи можно решить на процессоре достаточной мощности, используя операционные системы реального времени (типа RTEMS), но всё же, SoC являются в настоящее время очень привлекательным вариантом для решения множества задач, как в профессиональных областях, так и для хобби.


Осторожно, много картинок!
Total votes 39: ↑38 and ↓1+37
Comments33

Создание языка программирования с использованием LLVM. Часть 10: Заключение и другие вкусности LLVM

Reading time8 min
Views8.9K
Оглавление:
Часть 1: Введение и лексический анализ
Часть 2: Реализация парсера и AST
Часть 3: Генерация кода LLVM IR
Часть 4: Добавление JIT и поддержки оптимизатора
Часть 5: Расширение языка: Поток управления
Часть 6: Расширение языка: Операторы, определяемые пользователем
Часть 7: Расширение языка: Изменяемые переменные
Часть 8: Компиляция в объектный код
Часть 9: Добавляем отладочную информацию
Часть 10: Заключение и другие вкусности LLVM



9.1. Заключение


Добро пожаловать в заключительную часть руководства “Создание языка программирования с использованием LLVM”. На протяжении этого руководства, мы вырастили наш маленький язык Калейдоскоп с бесполезной игрушки до довольно интересной (хотя, возможно, по-прежнему бесполезной) игрушки.
Читать дальше →
Total votes 15: ↑15 and ↓0+15
Comments4

Создание языка программирования с использованием LLVM. Часть 9: Добавляем отладочную информацию

Reading time32 min
Views6.9K
Оглавление:

Часть 1: Введение и лексический анализ
Часть 2: Реализация парсера и AST
Часть 3: Генерация кода LLVM IR
Часть 4: Добавление JIT и поддержки оптимизатора
Часть 5: Расширение языка: Поток управления
Часть 6: Расширение языка: Операторы, определяемые пользователем
Часть 7: Расширение языка: Изменяемые переменные
Часть 8: Компиляция в объектный код
Часть 9: Добавляем отладочную информацию
Часть 10: Заключение и другие вкусности LLVM

9.1. Введение


Добро пожаловать в главу 9 руководства “Создание языка программирования с использованием LLVM”. В главах с 1 по 8, мы построили маленький язык программирования с функциями и переменными. Что случится, если что-то пойдёт не так, как тогда отлаживать программу?
Читать дальше →
Total votes 19: ↑19 and ↓0+19
Comments13

Создание языка программирования с использованием LLVM. Часть 8: Компиляция в объектный код

Reading time23 min
Views7.5K
Оглавление:
Часть 1: Введение и лексический анализ
Часть 2: Реализация парсера и AST
Часть 3: Генерация кода LLVM IR
Часть 4: Добавление JIT и поддержки оптимизатора
Часть 5: Расширение языка: Поток управления
Часть 6: Расширение языка: Операторы, определяемые пользователем
Часть 7: Расширение языка: Изменяемые переменные
Часть 8: Компиляция в объектный код
Часть 9: Добавляем отладочную информацию
Часть 10: Заключение и другие вкусности LLVM



8.1. Введение


Добро пожаловать в главу 8 руководства “Создание языка программирования с использованием LLVM”. Эта глава описывает, как компилировать программы на нашем языке в объектные файлы.
Читать дальше →
Total votes 28: ↑27 and ↓1+26
Comments0

Создание языка программирования с использованием LLVM. Часть 7: Расширение языка: Изменяемые переменные

Reading time37 min
Views7.9K
Оглавление:

Часть 1: Введение и лексический анализ
Часть 2: Реализация парсера и AST
Часть 3: Генерация кода LLVM IR
Часть 4: Добавление JIT и поддержки оптимизатора
Часть 5: Расширение языка: Поток управления
Часть 6: Расширение языка: Операторы, определяемые пользователем
Часть 7: Расширение языка: Изменяемые переменные
Часть 8: Компиляция в объектный код
Часть 9: Добавляем отладочную информацию
Часть 10: Заключение и другие вкусности LLVM



7.1. Введение


Добро пожаловать в главу 7 руководства “Создание языка программирования с использованием LLVM”. В главах 1-6 мы построили полноценный, хотя и простой, функциональный язык программирования. На этом пути мы изучили некоторые техники парсинга, изучили, как строить и и как представлять AST, как построить LLVM IR, и как оптимизировать результирующий код, и как JIT компилирует его.
Читать дальше →
Total votes 25: ↑24 and ↓1+23
Comments0

Язык Terra — низкоуровневый партнёр Lua

Reading time12 min
Views17K
Terra — низкоуровневый язык системного программмирования, встраиваемый и имеющий возможность метапрограммирования с помощью языка Lua.

Читать дальше →
Total votes 57: ↑57 and ↓0+57
Comments28

Создание языка программирования с использованием LLVM. Часть 6: Расширение языка: Операторы, определяемые пользователем

Reading time33 min
Views12K
Оглавление:
Часть 1: Введение и лексический анализ
Часть 2: Реализация парсера и AST
Часть 3: Генерация кода LLVM IR
Часть 4: Добавление JIT и поддержки оптимизатора
Часть 5: Расширение языка: Поток управления
Часть 6: Расширение языка: Операторы, определяемые пользователем
Часть 7: Расширение языка: Изменяемые переменные
Часть 8: Компиляция в объектный код
Часть 9: Добавляем отладочную информацию
Часть 10: Заключение и другие вкусности LLVM



6.1. Введение


Добро пожаловать в главу 6 руководства “Создание языка программирования с использованием LLVM”. К данному моменту у нас есть полнофункциональный язык, хотя и минимальный, но, тем не менее, полезный. Но по-прежнему осталась одна проблема. В нашем языке мало полезных операторов (нет, например, деления, логического отрицания, и даже сравнений, за исключением оператора сравнения «меньше»).
Читать дальше →
Total votes 47: ↑47 and ↓0+47
Comments5

Обзор 98 одноплатных компьютеров. Часть 4

Reading time14 min
Views46K
Часть 1
Часть 2
Часть 3
Часть 4

Parallella



Компания/проект — Adapteva, Parallella.org
Обзор LinuxGizmos
Страница продукта
CPU — Xilinx Zynq-7020 или -7010 SoC (2x Cortex-A9 @ 667MHz plus FPGA); 16-core Epiphany RISC chip
Память — 1GB DDR3 RAM
Цена — $99

Плата предназначена для построения энергоэффективных серверных кластеров и исследований в области параллелизма, и построена на базе Zynq ARM/FPGA SoC работающего под управлением дистрибутива Ubuntu 15.04, названного Parabuntu, а также «доморощенного» 16-ядерного сопроцессора Epiphany. Порты включают microSD, GbE, micro-HDMI, и два USB. Четыре 60-pin разъёма служат для расширения ввода-вывода и связаны с FPGA и с чипом Epiphany. Adapteva также предлагает за $75 версию Micro-Server с Zynq-7010, у которой нет USB, HDMI, и расширений I/O. В прошлом году также был выпущен корпус Parallella Aluminum Case за $29.50 с теплорассеивающей пластиной, но сейчас его нет в продаже. Новый чип Epiphany-V, содержащий 4.5 млрд. транзисторов должен был выйти уже несколько месяцев назад.
Читать дальше →
Total votes 22: ↑22 and ↓0+22
Comments28

Обзор 98 одноплатных компьютеров. Часть 3

Reading time11 min
Views54K
Часть 1
Часть 2
Часть 3
Часть 4

NanoPC-T3



Компания/проект — FriendlyElec (FriendlyARM)
Обзор LinuxGizmos
Страница продукта
CPU — Samsung S5P6818 (8x Cortex-A53 @ 400MHz to 1.4GHz); Mali-400 MP GPU
Память — 1GB или 2GB DDR3 RAM; 8GB eMMC
Цена — $60

Компания FriendlyElec (также известная как FriendlyARM) предлагает сейчас как минимум дюжину одноплатников, что превышает наш порог в 10 устройств на компанию, и это заставило нас исключить некоторые из них из нашего первого списка. Несколько сходных продуктов мы объединили в один пункт, модель NanoPi. Размер платы NanoPC-T3 100 x 60mm. Это одна из наиболее развитых плат от FriendlyElec. Она оснащена восьмиядерным Samsung S5P6818. Плата NanoPC-T3 SBC практически идентична более ранним, четырёхядерным NanoPC-T2. В дополнение к более быстрому процессору, плата T3 добавляет опцию 2GB RAM. Также обе платы NanoPC имеют слот SD, GbE, WiFi, и Bluetooth 4.0. На платах установлены четыре USB host, micro-USB client, и медиапорты, включая HDMI, LVDS, LCD, MIPI-DSI, MIPI-CSI, и аудио. Вместо обычного разъёма 40-pin RPi, NanoPC-T3 имеет 30-pin разъём GPIO.
 
Читать дальше →
Total votes 26: ↑25 and ↓1+24
Comments30

Обзор 98 одноплатных компьютеров. Часть 2

Reading time12 min
Views36K
Часть 1
Часть 2
Часть 3
Часть 4

DE0-Nano-SoC Development Kit / Atlas-SoC Kit



Компания/проект — Terasic; RocketBoards.org
Страница продукта
CPU — Intel (Altera) Cyclone V SE (Cyclone V FPGA + 2x Cortex-A9 @ 952MHz)
Память — 1GB DDR3 RAM
Цена — $99

Плата DE0-Nano-SoC Development Kit выгладит как коммерческая отладочная плата, но имеет открытые спецификации и стоит всего $99, что выглядит разумной ценой для платы на основе Cyclone V. Плата DE0-Nano-SoC использует более low-end разновидность SE, которая примерно эквивалентна Xilinx Zynq-7020. Эта SoC объединяет FPGA и два ядра Cortex-A9 под управлением Angstrom v2014.12 Yocto 1.7 с ядром Linux 4.0. На плате есть GbE, USB OTG, порты micro-USB, и слот microSD катрочкой на 4GB. Также есть акселерометр, разъем расширения, подсоединённый к ARM, и различные интерфейсы, подсоединённые к FPGA, включая 40-pin разъём, совместимый с шилдами Ардуино. Есть идентичная версия Atlas-SoC, имеющая программное обеспечения, рассчитанное больше на программистов, чем на разработчиков железа. Есть сообщество на RocketBoards.org.
Читать дальше →
Total votes 15: ↑15 and ↓0+15
Comments5

Обзор 98 одноплатных компьютеров. Часть 1

Reading time14 min
Views137K
Часть 1
Часть 2
Часть 3
Часть 4

От переводчика: Предлагаю вашему вниманию перевод отчёта по одноплатным компьютерам, который был опубликован на сайте LinuxGizmos.com. В отчёт включены краткие описания 98 плат стоимостью до 200 долларов. В отчёте такие платы называют «хакерскими», чтобы подчеркнуть их пригодность для различного творчества.
Так как объем информации весьма велик, я разбил перевод на несколько частей.

Также хочу предупредить, что под катом очень много картинок!

Итак, часть 1.



КДПВ

В течение последнего года, LinuxGizmos сообщал о дюжинах новых одноплатных компьютерах с открытыми спецификациями, дружественных к разработчикам и «хакерам», на которых можно запустить Linux и Android. Мы добавили их в наш каталог вместе со старыми платами. Платы, попавшие в наш обзор, стоят меньше 200 долларов без учёта пересылки, доступны для доставки в июле этого года, и удовлетворяют нашим (весьма гибким) критериям открытости.
Читать дальше →
Total votes 29: ↑28 and ↓1+27
Comments34

Начинаем работать в STM32CubeMX. Часть 3

Reading time8 min
Views58K
Продолжаем цикл про основы работы STM32MXCube и программированию микроконтроллеров STM32.

Часть 1
Часть 2

В прошлых частях мы освоили базовые настройки микроконтроллера, работу с GPIO, таймером, DMA и DAC. В этой части мы познакомимся с ADC и USB.
Читать дальше →
Total votes 25: ↑25 and ↓0+25
Comments14

Information

Rating
Does not participate
Date of birth
Registered
Activity