Разработчики Sparse, семантического парсера для языка Си, объявили о создании LLVM-бэкенда sparse-llvm. Конечной целью проекта является создание рабочего компилятора Си, способного собрать ядро Linux. Код проекта распространяется под лицензией MIT.

LLVM-бэкенд уже способен генерировать код для простых примеров на языке Си для различных платформ, но проект ещё находится на ранней стадии развития и не способен осуществить сборку реальных проектов. Созданный на базе Sparse LLVM-бэкенд, пока ограничен поддержкой таких возможностей языка Си, как вызов функций, разбор выражений Switch и if-else, выполнение арифметических, бинарных и операций с плавающей запятой. Тем не менее автор проекта считает, что sparse-llvm сможет достигнуть стадии пересборки ядра Linux раньше, чем Clang, так как Sparse, на базе которого развивается sparse-llvm, изначально полностью поддерживает парсинг кода всего ядра.

Sparse был создан Линусом Торвальдсом в 2003 году, во время его работы в компании Transmeta, в качестве замены стандартному препроцессору GCC, который не мог выявлять многие проблемы в коде ядра. В итоге, Sparse длительное время использовался для дополнительного статического анализа кода ядра Linux и позволял выявлять такие проблемы, как смешивание указателей на адресное пространство ядра и уровень пользователя (в коде ядра для разделения областей используется атрибут "__user").

Впоследствии, к проекту подключились другие разработчики, которые расширили возможности Sparse и подготовили рабочий фронтэнд для компилятора, способный осуществлять парсинг большей части ANSI C и различных расширений GCC. Sparse предоставляет набор аннотаций, предназначенных для выявления семантической информации о типах, например, о том, на какое адресное пространство указывает указатель или какие блокировки будут установлены/сняты при вызове функции.

В качестве причины создания LLVM-бэкенда указывается то, что без рабочего бэкенда (генератора кода) невозможно гарантировать полную работоспособность фронтэнда (синтаксический разбор). Ранее уже был создан тестовый бэкенд, но он был ограничен возможностью генерации кода для архитектуры i386, не был доведен до конца и содержал множество недоработок. Так как Sparse в роли фронтэнда уже полностью поддерживает парсинг кода ядра, создание LLVM-бэкенда позволит обеспечить генерацию биткода, который сможет быть преобразован в машинные инструкции для различных аппаратных архитектур. Иными словами, задача LLVM-бэкенда sparse-llvm сводится к преобразованию уже генерируемого силами Sparse промежуточного представления кода в биткод LLVM.

Источник: http://www.opennet.ru/opennews/art.shtml?num=31636