Что такое наборы символов источника и выполнения?

Я просматривал изменения в C23 и нашел это в Приложении M проекта C23:

добавлены @ (U+0040, COMMERCIAL AT), $ (U+0024, ЗНАК ДОЛЛАРА) и ` (U+0060, GRAVE ACCENT, "Backtick") в исходный и исполняемый набор символов;

В чем разница между «исходным набором символов» и «набором символов выполнения»? Разрешены ли $, @ и ` в идентификаторах в C23?

Я нашел вопрос по C++: stackoverflow.com/q/3768363/20017547, но не по C.

Harith 27.05.2024 10:43

Оба они описаны в настройках соответствующего параметра на странице Параметры компилятора перечислены в алфавитном порядке.

OldBoy 27.05.2024 10:48
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
2
150
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

В C23 (и старше) 5.2.1 есть прямое объяснение, где термины формально определены:

Должны быть определены два набора символов и связанные с ними последовательности сортировки: набор, в котором записываются исходные файлы (исходный набор символов), и набор, интерпретируемый в среде выполнения (набор символов выполнения). Каждый набор далее делится на базовый набор символов, содержимое которого дано. в соответствии с этим подпунктом, а также набор из трех или более элементов, специфичных для локали (которые не являются членами базового набора символов), называемых расширенными символами.

Базовый набор символов — ASCII/UTF-8.

В C23 добавлен подраздел 5.2.1.1, позволяющий базовому набору символов содержать многобайтовые символы, включая те, которые вы упомянули.

Исходный набор символов может содержать многобайтовые символы, используемые для представления членов расширенный набор символов. Набор исполняемых символов может также содержать многобайтовые символы, которые не обязательно иметь ту же кодировку, что и исходный набор символов. Для обоих наборов символов следующее должен содержать:

— Должен присутствовать базовый набор символов @ (U+0040 Commercial At), $ (U+0024 Знак доллара) и [SIC] (U+0060 Grave Accent, «Backtick»), и каждый символ должен быть закодирован как один байт.
...

Я считаю, что 5.2.1.1 является необязательным/определяемым реализацией, учитывая «может».

Наборы символов исходного кода и исполнения представляют собой набор символов, которые должны быть «распознаны» средой компиляции и выполнения соответственно. Например, символы в базовых наборах символов исходного кода должны правильно интерпретироваться любым строго соответствующим компилятором.

$, @, ` нельзя использовать в идентификаторе, поскольку они не обладают свойствами XID_start и XID_continue. Они добавляются в базовый набор символов исходного кода только для того, чтобы компилятор знал, что 0x40, 0x24 и 0x60 — это $, @ и ` соответственно (при условии кодировки ASCII). Например, следующий код вызовет ошибку компиляции (нарушение синтаксического ограничения) в C23, но неопределенное поведение (Приложение J.2 (6)) до C23.

int main()
{
    @
}

В исходном файле встречается символ, не входящий в базовый исходный набор символов, за исключением идентификатор, символьную константу, строковый литерал, имя заголовка, комментарий или предварительную обработку. токен, который никогда не конвертируется в токен (5.2.1).

Программы могут быть кросс-компилированы. Машина и среда, в которой компилируется программа, могут иметь другой набор символов, чем среда, в которой выполняется скомпилированная программа.

В принципе, мы могли бы работать с программой C, исходный код которой написан в ASCII, в операционной системе ASCII, такой как Unix, но выполнять кросс-компиляцию ее на машине, которая использует другое представление текста, например EBCDIC.

Так, например, в исходном коде символьная константа 'A' представлена ​​символом ASCII 65, но кросс-компилятор должен сопоставить ее со значением EBCDIC A, которое равно 193.

Спецификация языка, поддерживающего кросс-компиляцию, должна быть тщательно сформулирована. Например, требование не может быть сформулировано так: «значение символьной константы, состоящей из одного неэкранированного символа, заключенного в одинарные кавычки, является значением кодовой точки этого символа». Вместо этого мы определяем это с точки зрения сопоставления между наборами символов перевода и выполнения.

Что касается $, @ и `, то простой факт заключается в том, что они не используются в языке: они не служат знаками препинания и не являются частью идентификаторов. Эти символы могут встречаться в комментариях, если они являются частью набора символов перевода, а также в символьных константах и ​​строковых литералах, если они сопоставлены с набором символов перевода.

Язык C можно реализовать в гипотетической среде, в которой отсутствуют эти символы. Поэтому строго соответствующая программа не может использовать их ни для каких целей, даже в комментариях. Когда они используются в программе и программа принимается, это расширение. Другими словами, когда вы используете полный набор символов ASCII в своих программах на языке C, вы полагаетесь на расширение языка (очень распространенное).

Реализации C также могут использовать эти символы для расширений. Например, некоторые компиляторы допускают использование $ в идентификаторах, и это может быть необходимо для связи с некоторыми внешними именами (например, в языке ассемблера). Диалект Objective C использовал @ в качестве префикса для своих расширений.

Другие вопросы по теме