32bit_me: (Default)
Прочитал интересный материал: Pooja Gupta "LLVM Backend Development for ReISC Architecture", 52 стр., англ. язык.

Это не книга и не статья, это магистерская работа студентки из университета Дели. В небольшом объёме изложены ключевые моменты работы компилятора. Разумеется, то же самое можно прочитать в других местах, но для этого придётся читать много разных источников.
Как ясно из названия, описывается компилятор для архитектуры ReISC. Однако подробной информации по этой архитектуре нигде нет. Есть сведения, что это ядро фирмы STMicroelectronics для 32-битного low-end микроконтроллера со сверхнизким портеблением. Видимо, в производство оно не попало.

В конце работы автор приводит сравнение нескольких результатов компиляции, полученных с помощью LLVM и GCC. Разбираться в них детально я не стал, т.к. для этого надо подробно разбирать ассемблерные исходники со справочником по системе команд. К сожалению, в работе нет исходников (и даже фрагментов) самого бэкенда. А это было бы очень интересно почитать.

В целом, впечатляет, студенческая работа такого хорошего уровня. У нас 99% студентов и 95% специалистов с опытом работы в этой теме просто не разберутся. А девушка из Индии не только разобралась, но и написала хорошую работу на английском языке.

Для техже, кто хочет разобраться в работе компилятора, знающие люди рекомендуют бэкенд LANai. Тоже загадочное ядро, упоминаний про него почти нет. Вроде бы, оно разработано компанией Google для своих внутренних нужд, архитектура основана на книге [1]. Какой-то документации найти не удалось. Тем не менее, компилятор доступен в исходниках, и, говорят, очень несложен и хорош для изучения.

[1]. David E. Culler, Anoop Gupta, and Jaswinder Pal Singh. 1997. Parallel Computer Architecture: A Hardware/Software Approach (1st ed.). Morgan Kaufmann Publishers Inc., San Francisco, CA, USA.
32bit_me: (Default)
Прочитал книгу "Язык программирования Rust", 340 стр., русск. язык.



Книга является переводом на русский язык официального учебника по Rust.
Итак:
- Rust - компилируемый язык, без всяких виртуальных машин и прочего. 
- Rust строго следит за безопасным использованием данных, причем весь контроль производится во время компиляции и не приводит к накладным расходам при выполнении программы.
- многопоточность есть, и реализуется через вызовы ОС, а не как в Go.
- нет полноценного ООП, но есть некоторые элементы ООП
- есть лямбды
- есть возможность вызова функций С и из С.
- реализован как фронтенд к LLVM, то есть можно прикрутить к чему угодно, к любой аппаратной платформе
- можно делать свои расширения синтаксиса (в виде плагинов к компилятору)

В целом понравилось гораздо больше, чем Go. Однако пока что заниматься этим серьёзно нет ни времени, ни желания. Я лично считаю, что классические языки, такие, как С и С++, переживут большую часть новомодных хипстерских языков.


32bit_me: (Default)
Написал статью для хабра, по clang-c API: https://habrahabr.ru/post/320074/

Как всегда, не стесняйтесь заходить, комментировать, ставить плюсики.
32bit_me: (Default)
В блоге PVS-Studio можно найти много примеров ошибок, совершаемых программистами, и много рекомендаций о том, как их избежать (http://www.viva64.com/ru/b/0391/).

Первый совет в этом документе: не берите на себя работу компилятора. Не оптимизируйте вручную то, что и так будет оптимизировано. В качестве примера приведён код из MySQL, в котором программист вручную развернул цикл, допустив при этом ошибку. Далее в статье написано, что если написать эту же функцию через цикл, то компилятор, скорее всего, её развернёт.
Давайте проверим это с помощью онлайн-компилятора. Я скопировал исходники функции из статьи, лишь немного подправив их так, чтобы они компилировались без дополнительных файлов.
Read more... )
32bit_me: (Default)
Немножко поигрался с онлайновым компилятором, про который я уже писал, и обнаружил немало интересного.
Во-первых, поддерживаются не только те процессоры, которые перечислены в списке, а вообще любые, которые поддерживает компилятор.
Во-вторых, можно выводить промежуточный код компилятора.
Всё это возможно благодаря тому, что мы можем сами задавать аргументы командной строки компилятора. Итак, выбираем из списка компилятор "x86-64 clang 3.9.0", и вводим в левое окно какую-нибудь функцию, например:

int foo(int x) {
    return !!x;
}


Read more... )
32bit_me: (Default)
Важной частью компилятора является аллокатор регистров. Он выполняется после планировщика (scheduler), который генерирует уже практически финальный код в машинных инструкциях, но вместо физических регистров используются виртуальные регистры.
Работа аллокатора регистров заключается в том, чтобы назначить физические регистры вместо виртуальных. Количество физических регистров ограничено, виртуальных регистров потенциально неограниченное число, поэтому физических регистов может не хватить, тогда аллокатор должен сделать спиллинг (spill) виртуального регистра, то есть вставить команду, сохраняющую значение регистра в стеке, а перед использованием этого регистра извлечь значение из стека.
Также аллокатор регистров применяет множество техник оптимизации, таких, как рематериализация констант, изменение порядка выполнения инструкций, разделение виртуального регистра на несколько и т.п.
Хорошая новость состоит в том, что в LLVM есть готовый аллокатор (и не один), не требующий доработок со стороны разработчика бэкенда, то есть он работает просто на основании описания набора регистров.
Плохая новость состоит в том, что в ряде случаев, если у вас необычная архитектура, вообще нет регистров (2-х или 3-х адресная архитектура), стековая машина или что-то такое, он работать не будет.
Вторая хорошая новость состоит в том, что даже в таких тяжёлых случаях вы можете написать свой аллокатор, причём он будет даже проще стандартного. Намного проще, ведь не нужны будут сложные алгоритмы раскраски графа, реордеринга, сплиттинга и прочего. Можно просто назначать виртуальным регистрам смещения в стеке, например.

Ниже небольшой список литературы, в которой описывается аллокатор регистров:

1. Jakob Stoklund Olesen. Register Allocation in LLVM 3.0.
2. Jakob Stoklund Olesen. Greedy Register Allocation in LLVM 3.0.
3. How To Write An LLVM Register Allocator (https://github.com/nael8r/How-To-Write-An-LLVM-Register-Allocator)
4. The LLVM Target-Independent Code Generator (раздел Register Allocation)
32bit_me: (Default)
Прочитал главу 11 (LLVM, Chris Lattner), 15 стр, англ. язык.



Книга "The Architecture of Open Source Applications" содержит краткое описание множества open-source продуктов, включая LLVM. Автор главы про LLVM даёт описание архитектуры системы, уделяя особое внимание преимуществам LLVM перед другими open-source компиляторами. Также рассматриваются различные необычные применения  LLVM, например, в системе обработки изображений.
32bit_me: (Default)
 Прочитал книгу Suyog Sarda, Mayur Pandey "LLVM Essentials", 166 стр., англ. язык.



Ничего нового для себя не почерпнул, книга очень маленькая, но если вы решили начать изучение инфраструктуры компиляторов LLVM, то эта книга может дать некоторое начальное представление.
32bit_me: (Default)
Опубликовал новый пост на Хабре: https://habrahabr.ru/post/277717/.

В статье рассматривается применение инфраструктуры компиляторов LLVM для построения собственных решений на её основе.

32bit_me: (Default)
Прочитал книгу Gabriel S. Hjort Blindell "Survey on Instruction Selection", 139 стр, англ. язык.
Книга про то, как осуществляется одна из самых важных стадий работы компилятора, выбор инструкций. Рассмотрены различные подходы и алгоритмы решения этой задачи, от первых компиляторов 1950-х годов до современных.



Немного написано и про алгоритм, используемый в LLVM. К сожалению, ничего особенно нового эта информация мне не дала. Этот участок компилятора весьма сложен, и возможности для ручного вмешательства в его работу очень ограничены (хотя и существуют). 
32bit_me: (Default)
Книга по LLVM, единственная в своём роде книга, детально описывающая процесс разработки бэкенда.



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

Проблема ещё и в том, что все процессоры разные, и нельзя просто скопировать исходник одного бэкенда, подправить там пару строк и получить другой. Они настолько различны, что вряд ли вы вообще найдёте в двух разных бэкендах похожие куски кода. Поэтому чтение этой книги не заменит вам собственного опыта.
Желающим разработать свой компилятор с шахматами и балеринами, я могу посоветовать следующее:
не бояться разбираться в существующем коде, как бэкендов, так и Core Library.
не бояться экспериментировать и писать с нуля собственные алгоритмы оптимизаций.
не пытаться изобрести велосипед. Если нужные функции есть в Core Library, их необходимо изучить и использовать. Если, напротив, каких-то функций нет ни в Core Library, ни в других бэкендах, значит, скорее всего, вы хотите странного, и, скорее всего, на самом деле это вам не нужно. Хотя могут быть исключения из этого правила.
32bit_me: (Default)

Originally published at 32 bit.me. You can comment here or there.

Прочитал книгу Mayur Pandey, Suyog Sarda «LLVM Cookbook», 284 стр, англ. язык.

Хорошая книга, описывает много интересных вещей об архитектуре и внутреннем устройстве инфраструктуры компиляторов LLVM.

Она дополняет другую книгу, «Getting Started with LLVM Core Libraries», про которую я уже писал. Кстати,  Getting Started with LLVM Core Libraries переведена на русский язык и сейчас есть в продаже (я читал в оригинале).


32bit_me: (Default)
Весьма хорошая книга, прояснила некоторые моменты. Конечно, инфраструктура LLVM слишком велика, чтобы ее можно было описать в одной книге, но она дает понимание и направление для дальнейших экспериментов.
812KZWXZ8VL._AA1500_

Profile

32bit_me: (Default)
32bit_me

July 2017

S M T W T F S
      1
2345678
9101112131415
16171819202122
232425262728 29
3031     

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 25th, 2017 09:47 am
Powered by Dreamwidth Studios