C-- (произносится как C минус минус ) - это C- подобный язык программирования . Его создатели, исследователи функционального программирования Саймон Пейтон Джонс и Норман Рэмси, спроектировали его для создания в основном компиляторами для языков очень высокого уровня, а не для написания людьми-программистами. В отличие от многих других промежуточных языков, его представление представляет собой простой текст ASCII , а не байт-код или другой двоичный формат. [1] [2]
Парадигма | императив |
---|---|
Разработано | Саймон Пейтон Джонс и Норман Рэмси |
Впервые появился | 1997 г. |
Печатная дисциплина | статический , слабый |
Веб-сайт | https://www.cs.tufts.edu/~nr/c--/index.html |
Под влиянием | |
C |
Есть две основные ветки:
- C--, исходная ветка, последняя версия 2.0 выпущена в мае 2005 г. [3]
- Cmm, вилка, активно используемая в качестве промежуточного представления (IR) в компиляторе Glasgow Haskell (GHC) [4] [5]
Дизайн
C-- - это «переносимый язык ассемблера », разработанный для упрощения реализации компиляторов, которые производят высококачественный машинный код . Это делается путем делегирования низкоуровневой генерации кода и оптимизации программы компилятору C--. Средства языка синтаксис заимствует из C опуская или изменение стандартных C таких функций, как переменные число функций , указатель синтаксиса и аспекты системы типа C, потому что они мешают существенные черты C-- и легкость генерации коды.
Название языка - шутка, указывающая на то, что C-- - это сокращенная форма C, точно так же, как C ++ - это, по сути, расширенная форма C. («-» и «++» означают »декремент "и" приращение ".)
Работа над C-- началась в конце 1990-х годов. Поскольку написание собственного генератора кода само по себе является сложной задачей, а доступные исследователям в то время бэкенды компилятора были сложными и плохо документированными, в нескольких проектах были написаны компиляторы, которые генерировали код C (например, исходный компилятор Modula-3 ). Однако C - плохой выбор для функциональных языков: он не гарантирует оптимизацию хвостового вызова , не поддерживает точную сборку мусора или эффективную обработку исключений . C-- - это более простая альтернатива C, которая поддерживает все это. Его наиболее инновационная функция - это интерфейс времени выполнения, который позволяет писать переносимые сборщики мусора, системы обработки исключений и другие функции времени выполнения, которые работают с любым компилятором C--.
Первая версия C-- была выпущена в апреле 1998 года в виде статьи MSRA [1], сопровождаемой статьей января 1999 года о сборке мусора. [2] Пересмотренное руководство было опубликовано в формате HTML в мае 1999 года. [6] Два набора основных изменений, предложенных в 2000 году Норманом Рэмси («Предлагаемые изменения») и Кристианом Линдигом («Новая грамматика»), приводят к C-- версия 2, которая была завершена примерно в 2004 г. и официально выпущена в 2005 г. [3]
Система типов
Система типа C предназначена для отражения ограничений, налагаемых аппаратным обеспечением, а не соглашений, налагаемых языками более высокого уровня. Значение, хранящееся в регистре или памяти, может иметь только один тип: бит-вектор. Однако бит-вектор - это полиморфный тип, который бывает разной ширины, например, биты 8 , bit32 или бит 64 . Поддерживается отдельное 32- или 64-разрядное семейство типов с плавающей запятой. В дополнение к типу бит-вектор, C-- предоставляет логический тип bool , который может быть вычислен с помощью выражений и использоваться для потока управления, но не может быть сохранен в регистре или памяти. Как и в ассемблере, любая дисциплина более высокого типа, такая как различие между знаками, беззнаками, числами с плавающей запятой и указателем, накладывается операторами C-- или другими синтаксическими конструкциями. C-- не проверяется по типу, а также не обеспечивает и не проверяет соглашение о вызовах. [3] : 28
C - версия 2 устраняет различие между типами бит-вектор и с плавающей запятой. Эти типы могут быть аннотированы строковым тегом «kind», чтобы различать, среди прочего, целочисленную типизацию переменной и тип с плавающей запятой и ее поведение при хранении (глобальном или локальном). Первый полезен для целей, которые имеют отдельные регистры для целочисленных значений и значений с плавающей запятой. Были введены специальные типы для указателей и родного слова, хотя они отображаются в битовый вектор с длиной, зависящей от цели. [3] : 10
Реализации
На странице спецификации C-- перечислены несколько реализаций C--. «Наиболее активно разрабатываемый» компилятор Quick C-- был заброшен в 2013 г. [7]
Haskell
Некоторые разработчики C--, в том числе Саймон Пейтон Джонс, Жоао Диас и Норман Рэмси, работают или работали над GHC, разработка которого привела к расширению языка C--, формируя диалект Cmm, который использует препроцессор C для эргономики. . [4]
Бэкенды GHC отвечают за дальнейшее преобразование C-- в исполняемый код через LLVM IR, медленный C или напрямую через встроенный нативный бэкэнд. [8] Несмотря на первоначальное намерение, GHC действительно выполняет многие из своих общих оптимизаций на C--. Как и в случае с другими IR компилятора, представление C-- может быть сброшено для отладки. [9] Целевые оптимизации, конечно же, выполняются серверной частью позже.
Смотрите также
Рекомендации
- ^ a b Нордин, Томас; Джонс, Саймон Пейтон; Иглесиас, Пабло Ногейра; Олива, Дино (1998-04-23). «Справочное руководство по языку C» . Цитировать журнал требует
|journal=
( помощь ) - ^ а б Рейг, Фермин; Рэмси, Норман; Джонс, Саймон Пейтон (1999-01-01). «C–: переносимый язык ассемблера, поддерживающий сборку мусора» . Цитировать журнал требует
|journal=
( помощь ) - ^ а б в г Рэмси, Норман; Джонс, Саймон Пейтон. «Спецификация языка C - версия 2.0» (PDF) . Проверено 11 декабря 2019 .
- ^ a b Комментарий GHC: Что, черт возьми, такое файл .cmm?
- ^ «Улучшенный бэкэнд LLVM» .
- ^ Нордин, Томас; Джонс, Саймон Пейтон; Иглесиас, Пабло Ногейра; Олива, Дино (1999-05-23). «Справочное руководство по языку C» .
- ^ "C-- Загрузки" . www.cs.tufts.edu . Проверено 11 декабря 2019 .
- ^ GHC Backends
- ^ Отладка компиляторов с оптимизацией топлива
Внешние ссылки
- Архив старого официального сайта (cminusminus.org)
- Быстрый архив кода C-- (эталонная реализация)