С--
Эта статья нуждается в дополнительных цитатах для проверки . ( апрель 2016 г. ) |
Парадигма | императив |
---|---|
Разработано | Саймон Пейтон Джонс и Норман Рэмси |
Впервые появился | 1998 |
Дисциплина набора текста | статический , слабый |
Веб-сайт | https://www.cs.tufts.edu/~nr/c--/index.html |
Под влиянием | |
С |
C-- (произносится как C минус минус ) — это C -подобный язык программирования , предназначенный для создания в основном компиляторами языков высокого уровня , а не для написания программистами-людьми. Его создали функционального программирования исследователи Саймон Пейтон Джонс и Норман Рэмси. В отличие от многих других промежуточных языков, он представлен в виде обычного текста ASCII , а не байт-кода или другого двоичного формата. [1] [2]
Есть две основные ветви:
- C — исходная ветка, финальная версия 2.0 выпущена в мае 2005 г. [3]
- Хм, форк активно используется в качестве промежуточного представления (IR) в компиляторе Glasgow Haskell (GHC). [4] [5]
Дизайн
[ редактировать ]C — «переносимый язык ассемблера », [6] разработан для облегчения реализации компиляторов, создающих высококачественный машинный код . [7] Это делается путем делегирования низкоуровневой генерации кода и оптимизации программы компилятору C--. языка Синтаксис в значительной степени заимствован из C, но при этом отсутствуют или изменяются стандартные функции C, такие как функции с переменным числом аргументов , синтаксис указателей и аспекты системы типов C, поскольку они затрудняют основные функции C и простоту генерации кода.
Название языка является шуткой, указывающей на то, что C-- является сокращенной формой C, точно так же, как « C++ » было выбрано для обозначения улучшенной версии C. (В C --
и ++
означают «уменьшение» и «приращение» соответственно.) [8]
Работа над C началась в конце 1990-х годов. Поскольку написание собственного генератора кода само по себе является сложной задачей, а серверные части компилятора , доступные исследователям в то время, были сложными и плохо документированными, в нескольких проектах были написаны компиляторы, которые генерировали код C (например, оригинальный компилятор Modula-3 ). Однако C — плохой выбор для функциональных языков: он не гарантирует оптимизацию хвостовых вызовов , не поддерживает точную сборку мусора или эффективную обработку исключений . C — это четко определенная, более простая альтернатива C, которая поддерживает все это. Его самой инновационной особенностью является интерфейс времени выполнения, который позволяет писать портативные сборщики мусора, системы обработки исключений и другие функции времени выполнения, которые работают с любым компилятором C--.
Первая версия C была выпущена в апреле 1998 года как документ MSRA. [1] сопровождается статьей о сборе мусора за январь 1999 года. [2] Пересмотренное руководство было опубликовано в форме HTML в мае 1999 года. [9] Два набора крупных изменений, предложенных в 2000 году Норманом Рэмси («Предлагаемые изменения») и Кристианом Линдигом («Новая грамматика»), привели к созданию C-версии 2, которая была завершена примерно в 2004 году и официально выпущена в 2005 году. [3]
Типовая система
[ редактировать ]C Система типа разработана с учетом ограничений, налагаемых аппаратным обеспечением, а не соглашений, налагаемых языками более высокого уровня. Значение, хранящееся в регистре или памяти, может иметь только один тип: битовый вектор . Однако битовый вектор — это полиморфный тип, который имеет несколько значений ширины, например биты8 , бит32 или бит64 . Поддерживается отдельное 32- или 64-битное семейство типов с плавающей запятой. В дополнение к типу битового вектора C-- предоставляет логический тип. bool , который можно вычислять с помощью выражений и использовать для потока управления, но нельзя хранить в регистре или памяти. Как и в языке ассемблера, любая более высокая дисциплина типов, такая как различие между знаковыми, беззнаковыми, числами с плавающей запятой и указателями, налагается операторами C-- или другими синтаксическими конструкциями. C-- не проверяется тип, а также не применяется и не проверяет соглашение о вызовах. [3] : 28
C — версия 2 устраняет различие между битовыми векторами и типами с плавающей запятой. Эти типы могут быть аннотированы строковым тегом «вид», чтобы отличать, среди прочего, целочисленный тип переменной от типа с плавающей запятой и ее поведение при хранении (глобальное или локальное). Первое полезно для целей, которые имеют отдельные регистры для целых чисел и значений с плавающей запятой. Были введены специальные типы для указателей и собственного слова, хотя они отображаются в битовый вектор с длиной, зависящей от цели. [3] : 10
Пример кода
[ редактировать ]Следующий код C- вычисляет сумму и произведение целых чисел от 1 до n. [10] (n принимается в качестве аргумента). Он демонстрирует две особенности языка:
- Процедуры могут возвращать несколько результатов.
- Хвостовая рекурсия явно запрашивается с помощью ключевого слова jump.
/* Tail recursion */
export sp;
sp( bits32 n ) {
jump sp_help( n, 1, 1 );
}
sp_help( bits32 n, bits32 s, bits32 p ) {
if n==1 {
return( s, p );
} else {
jump sp_help( n-1, s+n, p*n );
}
}
Реализации
[ редактировать ]На странице спецификации C-- перечислены несколько реализаций C--. От «наиболее активно разрабатываемого» компилятора Quick C-- отказались в 2013 году. [11]
Хаскелл
[ редактировать ]Некоторые разработчики C--, в том числе Саймон Пейтон Джонс, Жоао Диаш и Норман Рэмси, работают или работали над GHC, чья разработка привела к расширениям языка C--, формируя диалект Cmm , который использует препроцессор C для эргономики. . [4] [12]
Бэкэнды GHC отвечают за дальнейшее преобразование C-- в исполняемый код через LLVM IR, медленный C или напрямую через встроенный собственный бэкэнд. [13] [14] [15] Несмотря на первоначальное намерение, GHC выполняет многие из своих общих оптимизаций на C--. Как и в случае с другими IR компилятора, представление C-- можно сохранить для отладки. [16] Оптимизация для конкретных целей выполняется позже серверной частью.
Системы обработки
[ редактировать ]Эта статья была переведена из статьи C-- в японской Википедии и требует корректуры . ( ноябрь 2023 г. ) |
По состоянию на 2023 год большинство систем обработки не поддерживаются, включая выпуск исходного кода.
- Quick C-- — это компилятор, разработанный командой Quick C--. Он компилирует версию 2 кода C- в машинный код Intel x86 Linux. Компиляция в машинный код для других платформ доступна в качестве экспериментальной функции. Ранее Quick C-- разрабатывался параллельно с развитием спецификации языка C--. Однако исходный код теперь доступен только на GitHub, и разработка прекратилась.
- cmmc — это компилятор C--, реализованный Фермином Рейгом на языке программирования ML. Он генерирует машинный код для архитектур Alpha, Sparc и x86. [17]
- Trampoline C- Compiler — это транспилятор C--C, разработанный Сергеем Егоровым в мае 1999 года. Он транслирует код C-- в код C, что позволяет компилировать его с использованием стандартных компиляторов C.
- Компилятор C-- (OGI C-- Compiler) Орегонского института последипломного образования — самый ранний прототип C-- компилятора, реализованный на языке программирования ML в 1997 году. Поддержка OGI C--компилятора была прекращена после разработки Quick C-- началось.
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Jump up to: а б Нордин, Томас; Джонс, Саймон Пейтон; Иглесиас, Пабло Ногейра; Олива, Дино (23 апреля 1998 г.). «Справочное руководство по языку C–» .
{{cite journal}}
: Для цитирования журнала требуется|journal=
( помощь ) - ^ Jump up to: а б Рейг, Фермин; Рэмси, Норман; Джонс, Саймон Пейтон (1 января 1999 г.). «C–: переносимый язык ассемблера, поддерживающий сборку мусора» : 1–28.
{{cite journal}}
: Для цитирования журнала требуется|journal=
( помощь ) - ^ Jump up to: а б с д Рэмси, Норман; Джонс, Саймон Пейтон. «Спецификация языка C, версия 2.0» (PDF) . Проверено 11 декабря 2019 г.
- ^ Jump up to: а б Комментарий GHC: Что, черт возьми, такое файл .cmm?
- ^ «Улучшенный бэкэнд LLVM» . Апрель 2019.
- ^ Олива, Дино; Нордин, Т.; Пейтон Джонс, Саймон (1 января 1997 г.). «C-: портативный язык ассемблера» . Материалы семинара 1997 г. по реализации функциональных языков - через Microsoft.
- ^ Джонс, Саймон Пейтон; Нордин, Томас; Олива, Дино (1998). Клак, Крис; Хаммонд, Кевин; Дэви, Тони (ред.). «C--: переносимый язык ассемблера» . Реализация функциональных языков . Берлин, Гейдельберг: Springer: 1–19. дои : 10.1007/BFb0055421 . ISBN 978-3-540-68528-9 .
- ^ «Операторы увеличения и уменьшения в C с приоритетом» . unstop.com . Проверено 20 июня 2024 г.
- ^ Нордин, Томас; Джонс, Саймон Пейтон; Иглесиас, Пабло Ногейра; Олива, Дино (23 мая 1999 г.). «Справочное руководство по языку C–» .
- ^ Рэмси, Норман; Джонс, Саймон Пейтон; Линдиг, Кристиан (23 февраля 2005 г.), Спецификация языка C, версия 2.0 (CVS Revision 1.128) (PDF) , стр. 7 , получено 22 июня 2023 г.
- ^ «C-- Загрузки» . www.cs.tufts.edu . Проверено 11 декабря 2019 г.
- ^ «5.10. Серверные части GHC — Руководство пользователя компилятора Glasgow Haskell 9.8.1» . downloads.haskell.org . Проверено 20 июня 2024 г.
- ^ Серверные части GHC
- ^ «Мнение о бэкэндах GHC» . andreaspk.github.io . 25 августа 2019 года . Проверено 20 июня 2024 г.
- ^ «Использование компилятора Glasgow Haskell (GHC)» . ПрогДоер . Проверено 20 июня 2024 г.
- ^ Отладка компиляторов с использованием топлива для оптимизации.
- ^ «C-- Загрузки» . www.cs.tufts.edu . Проверено 20 июня 2024 г.
Внешние ссылки
[ редактировать ]- Архив старого официального сайта (cminusminus.org)
- Быстрый архив C-кода (эталонная реализация)