Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

LLVM

Глава 11 из книги "Архитектура приложений с открытым исходным кодом", том 1.

Оригинал: LLVM
Автор: Chris Lattner
Дата публикации: 7 Июля 2012 г.
Перевод: А.Панин
Дата перевода: 14 Марта 2013 г.

Creative Commons. Перевод был сделан в соответствие с лицензией Creative Commons. С русским вариантом лицензии можно ознакомиться здесь.


В данной главе описываются некоторые технические решения, принятые в ходе работы над проектом LLVM1, в рамках которого ведется разработка набора тесно связанных друг с другом низкоуровневых компонентов (ассемблеров, компиляторов, отладчиков, и.т.д.), которые в свою очередь разрабатываются с учетом совместимости с существующими и обычно использующимися в Unix-системах инструментами. Название "LLVM", изначально являющееся акронимом, на сегодняшний день стало брэндом. Хотя проект LLVM и предоставляет некоторые уникальные возможности, а также известен замечательными инструментами, поставляемыми в его составе (такими, как компилятор Clang2, который работает с кодом на языках C/C++/Objective-C и имеет ряд преимуществ перед компилятором GCC), основным отличием LLVM от других компиляторов является его внутренняя архитектура.

С начала декабря 2000 года проект LLVM разрабатывался как набор библиотек для многоразового использования с хорошо проработанными интерфейсами [LA04]. В то время компиляторы с открытым исходным кодом разрабатывались как инструменты специального назначения, представленные монолитными исполняемыми файлами. Например, было очень сложно повторно использовать парсер из монолитного компилятора (к примеру, GCC) для проведения статического анализа или рефакторинга. Хотя интерпретируемые языки обычно и предоставляли возможность для включения их окружений времени исполнения и интерпретаторов в состав более сложных приложений, это окружение было представлено отдельным монолитным кодом, который мог либо включаться полностью, либо не включаться в состав приложений. Не было возможности повторного использования отдельных частей, разделение кода между реализациями языков программирования было крайне мало.

При проектировании самих компиляторов для популярных языков программирования, занимающиеся этим сообщества обычно были крайне поляризованы: реализации компиляторов обычно были представлены либо в традиционной форме статических компиляторов, таких, как GCC, Free Pascal и FreeBASIC, либо в в форме компиляторов времени исполнения, представленной интерпретатором или компилятором Just-In-Time (JIT). Было очень сложно найти реализацию компилятора, предусматривающую работу в двух описанных выше режимах, а если она и находилась, то совместное использование кода между компиляторами разных типов было мало.

В течение последних десяти лет проекту LLVM удалось в значительной степени изменить этот порядок вещей. В настоящее время LLVM используется в качестве стандартной инфраструктуры для реализации компиляторов, работающих с большим количеством статически- и динамически-компилируемых языков (т.е. с семейством языков, поддерживаемых GCC, Java, .NET, Python, Ruby, Scheme, Haskell, D, а также с огромным количеством менее известных языков). Он также заменил собой множество компиляторов специального назначения, таких, как система специализации времени исполнения в стеке OpenGL компании Apple и библиотека обработки изображений в продукте After Effects компании Adobe. Наконец, LLVM также использовался при создании множества различных новых продуктов, наиболее известным из которых, скорее всего, является язык программирования для GPU OpenCL и окружение времени исполнения.

Сноски

  1. http://llvm.org
  2. http://clang.llvm.org
  3. Chris Lattner and Vikram Adve: "LLVM: A Compilation Framework for Lifelong Program Analysis & Transformation". Proc. 2004 International Symposium on Code Generation and Optimization (CGO'04), Mar 2004.

Далее: 11.1. Краткое описание классической архитектуры компиляторов