Написание компилятора сложно; языки сложны, люди хотят хорошего кода, и они не хотят долго ждать. Это должно быть очевидно из вашего собственного опыта использования компиляторов C++. Написание компилятора C++ особенно сложно, потому что язык особенно сложный (новый стандарт C++ 11 делает его значительно более сложным), и люди ожидают, что действительно хороший код из компиляторов C++.
Вся эта сложность и недостаток фона в компиляторах предполагает, что вы вряд ли напишите компилятор C++, не говоря уже о параллельном. Сообщества GCC и CLANG имеют сотни людей и десятилетия прошедшего времени разработки. Возможно, стоит попытаться создать игрушечный компилятор, чтобы лучше понять проблемы.
Что касается параллелизма в самом компиляторе, можно сделать несколько подходов.
Первый - использовать стандартную библиотеку, как вы предложили, и попытаться модифицировать существующий компилятор с параллелизмом. Странно, что немногие, похоже, пытались выполнить эту задачу, учитывая, что GCC и CLANG являются инструментами с открытым исходным кодом. Но также очень трудно распараллелить программу, которая была разработана без параллелизма. Где можно найти единицы параллелизма (обрабатывая отдельные методы?), Как вы вставляете параллелизм, как вы гарантируете, что у модернизированного компилятора нет проблем с синхронизацией (если компилятор обрабатывает все методы параллельно, где гарантия что подпись из одного метода на самом деле готова и доступна для компиляции других методов?) Наконец, как можно гарантировать, что параллельная работа доминирует над дополнительными издержками инициализации/прерывания/синхронизации потока, так что компилятор на самом деле быстрее работает с несколькими процессорами? Кроме того, библиотеки потоков немного сложны в использовании, и относительно легко сделать немой ошибку кодирования потокового вызова. Если у вас их много в вашем компиляторе, у вас есть большая вероятность такой глупой ошибки. Отладка будет сложной.
Второй - это сборка нового компилятора с нуля с использованием таких библиотек. Это требует большой работы только для того, чтобы получить базовый компилятор на месте, но имеет то преимущество, что отдельные элементы компилятора могут учитываться при проектировании, а параллельные блокировки, разработанные в я не знаю ни одного компилятора, построенного таким образом (конечно есть некоторые исследовательские компиляторы, подобные этому), но его большая работа и, очевидно, больше работы, чем просто запись непараллельного компилятора. Вы по-прежнему страдают от неуклюжести библиотек потоков.
Третье - найти параллельный язык программирования и написать в нем компилятор. Это упрощает запись параллельного кода без ошибок и может позволить вам реализовать виды параллелизма, которые могут быть недоступны в библиотеке потоков (например, динамические команды вычислений, частичные заказы и т. Д.). Это также имеет то преимущество, что компилятор на параллельном языке может видеть параллелизм в коде и, таким образом, может генерировать операции с нижним потоком. Поскольку компиляторы выполняют множество вычислений разной продолжительности, вам не нужен язык с синхронизированными данными; вы хотите один с параллелизмом задач. Наш компилятор PARLANSE - это такой язык программирования, предназначенный для выполнения параллельных символических (например, нечисловых) вычислений, подходящих для компиляторов. Теперь вам нужен параллельный компилятор и энергия для создания нового компилятора с нуля.
Четвертый подход заключается в использовании параллельного языка и предопределенной библиотеки типичных для компилятора действий (разбора, поиска таблиц символов, анализа потока, генерации кода) и создания такого компилятора. Тогда вам не нужно заново изобретать базовые возможности компилятора и продолжать работу с созданием самого компилятора.
Наш DMS Software Reengineering Toolkit - это именно такой набор инструментов и библиотек, которые позволяют создавать сложные инструменты для генерации/преобразования кода или анализа. DMS имеет full C++11 front end, который использует все вспомогательные устройства DMS (параллельно).
Мы использовали DMS для выполнения массивных задач анализа и преобразования C++. Параллелизм есть, и он работает; мы могли бы сделать больше, если бы попытались. Мы не пытались создать настоящий параллельный компилятор; мы не видим на нем рынка, учитывая, что другие компиляторы C++ свободны и хорошо установлены. Я ожидаю, что когда-нибудь кто-то найдет место в нише, где нужен параллельный компилятор C++, и тогда этот механизм, как это, вероятно, станет основой; его слишком много работы, чтобы начать с нуля.
Я не совсем уверен, что понимаю. Вы думаете о том, чтобы реализовать свой * компилятор * многопоточно, или вы думаете о предоставлении многопоточных функций для языка, который вы разрабатываете? –
Мое основное намерение заключается в предоставлении многопоточных функций на языке, который я буду разрабатывать, но мой вопрос скорее касается реализации многопоточного компилятора. – motoku
Параллелизм как полезная языковая функция является предметом десятилетий академических исследований, поэтому это выходит за рамки вопроса SO. Вероятно, вам следует сосредоточиться на создании языка, адаптированного к вашим привычкам, прежде чем перейти к привычкам, которые вы намереваетесь развить позже: v). – Potatoswatter