Не поленюсь и выпишу раздел целиком, выделяя курсивом и жирным шрифтом некоторые "ударные" с моей точки зрения места. А мои комментарии - красным.
9.4.4 За пределами файлов и синтаксиса
Как я вижу среду для разработки программ на С++? Прежде всего - инкрементная компиляция. Если вносится небольшое изменение, то система "понимает", что оно небольшое, и генерирует новую версию программы мгновенно. Моментальные ответы хотелось бы получать также на простые вопросы и указания типа: "Показать объявление f", "Какие еще f есть в области действия", "Как разрешен этот вызов оператора +?", "Какие классы произведены от Shape?" и "Какие деструкторы вызываются в конце этого блока?"
Инструмент, который давал бы возможность получать ответы на
подобные вопросы,- это в точности то, над чем я сейчас работаю.
Основой такой системы должно быть то самое промежуточное
представление программ на С++ (я предпочитаю говорить
о семантическом представлении), о котором он пишет далее.
В программе на С++ есть много информации, которая в типичной среде доступна только компилятору. Уверен, что она должна быть предоставлена программисту.
Не хочу, чтобы подумали о (само)рекламе, но наш компилятор
переднего плана устроен именно таким образом: он генерирует
промежуточное представление, в котором содержится вся семантика
исходной программы. Для этого промежуточного представления
имеется программный интерфейс. С помощью этого интерфейса -
не скажу, что так уж легко, но, в общем, нормальному программисту
вполне по силам - можно сделать, скажем, инструмент, отвечающий
на "смысловые" вопросы о программе вроде тех, которые
Страуструп приводит в первом абзаце.
Однако люди в большинстве своем смотрят на С++-программу как на набор исходных файлов или строк символов. Программа - это набор типов, функций, предложений и т.д. Данные понятия представляются в виде символов в файлах только для удобства изображения в традиционных средах программирования.
Прекрасно! Это в чистом виде семантический взгляд на программу!
Если появится система, которая в полной мере воплотит такой
подход к работе с С++, это будет весьма существенным прогрессом,
если не сказать прорывом... Продолжая тему "семантического"
подхода к С++, эксплуатируемому Интерстроном, могу сказать, что
у нас есть и реальное средство, работающее с семантическим
представлением: это визуализатор, который показывает исходную
программу в виде дерева семантических элементов - именно как
"набор типов, функций, предложений..." и/или в нотации UML.
То, что в основе реализаций С++ лежат символьно-ориентированные инструменты, всегда было главным препятствием на пути развития языка. Если нужно препроцессировать и перекомпилировать каждый заголовочный файл, прямо или косвенно включенный в файл, где находится слегка измененная функция, то для этого требовалось определенное, пусть и небольшое время. Существует несколько методов, позволяющих избежать ненужных перекомпиляций, но, по-моему, наиболее перспективный и интересный подход - отказаться от традиционного исходного текста и положить в основу инструментов абстрактное внутреннее представление. Ранний вариант такого представления можно найти в работах [Murray, 1992], [Koenig, 1992]. Естественно, текст все равно необходим - его вводят и читают пользователи - но он легко преобразуется системой во внутреннюю форму
Ну, насчет "легко" - это он погорячился. :-) Если то абстрактное
внутреннее представление, о котором он говорит выше, содержит
семантическую информацию об исходной программе, введенной
в текстовом виде, то построение такого представления - весьма
нетривиальнная задача. Но крайне... challenging, как говорят у них.
и реконструируется по запросу.
А вот реконструкция текста - это действительно несложно.
Форматирование текста с соблюдением некоторых правил отступа - лишь один из многих возможных взглядов на программу. Простейшее применение этого замечания: текст программы, который каждый из пользователей видит отформатированным в своем любимом стиле, а вы - в вашем.
Нетекстовое представление могло бы быть создано языками более высокого уровня, генераторами программ, инструментами визуального программирования и т.д.
Ну, и обычными компиляторами переднего плана, разумеется.
Это позволило бы таким инструментам работать в обход обычного синтаксиса С++ и даже помогло бы избавить язык от некоторых неудачных особенностей его синтаксиса. Я утверждаю, что система типов и семантика С++ чище, чем его синтаксис.
Из этого пассажа можно сделать такой вывод: семантику С++
можно представить в виде, не зависящем от конкретного
синтаксиса, который несет тяжелый груз языка-
предшественника, неудачного дизайна, за которым шлейф
философии и привычек миллионов программистов. Если для этого
использовать какую-нибудь систематическую общеупотребитель-
ную нотацию (например, XML), то может получиться нечто,
что можно назвать семантическим синтаксисом С++.
Более того: такое описание я как раз сейчас делаю. И должен сказать,
что получаю громадное удовольствие, на каждом шаге наглядно
наблюдая, как обсыпаются многочисленные корявые и громоздкие
синтаксические конструкции языка, обнажая естественное и стройное
здание семантики С++...
Я пока не знаю точно, каково может быть практическое применение
этого семантического синтаксиса. Впрочем, его можно
рассматривать, как формальную запись семантического представле-
ния С++, которое сейчас используется в продуктах Интерстрона.
Кроме того, на основе этой нотации разрабатывается новое
семантическое представление, которое будет использоваться
в системе программирования следующего поколения. :-)
Из представления о синтаксисе как об интерфейсе между языком и пользователем следует, что возможны и другие интерфейсы.
Например, графический интерфейс: программа "рисуется" -
с помощью ли нотации UML или как-то еще, а "рисовальный"
инструмент переводит картинку во внутреннее представление.
Или программный интерфейс: пытливый пользователь легко
и быстро пишет некий скрипт, который бы просмотрел программу
на предмет ее структуры, каких-либо свойств, особенностей или
метрик, и выдал бы отчет...
Единственная фудаментальная константа - это базовая семантика языка. Она не должна меняться ни при каких обстоятельствах, и, учитывая это, вполне можно выдать С++-код в обычной текстовой форме по запросу.
В среде, основанной на абстрактном представлении С++, можно было бы предоставлять альтернативные способы создания и просмотра программ, а равно и другие пути компоновки, компиляции и исполнения кода. Например, компоновка выполнялась бы до генерации кода, поскольку наличие объектного кода не являлось бы обязательным для доступа к информации о связях.
У Интерстрона есть линкер промежуточного представления,
который делает именно это: компоновку программы на этапе,
предшествующем генерации кода. Более того, согласно нашей
философии, генерация кода - это частный случай, одна из многих
операций, возможных над промежуточным представлением.
Можно это представление визуализировать, можно подвергнуть
его статическому анализу или оптимизировать, наконец, можно
его... исполнить (см. далее)!
Различие между интерпретатором и компилятором в значительной мере сгладилось бы, поскольку их работа была бы основана на одной и той же информации примерно в одном и том же формате.
В точности так! Виртуальная машина С++ (еще одна разработка
Интерстрона) непосредственно исполняет программу,
представленную в промежуточном представлении. Конечно,
это гораздо медленнее, чем выполнение сгенерированного
целевого кода, но в очень многих реальных и важных случаях
этой скорости бывает вполне достаточно (очевидный пример -
пошаговая отладка программы).