Существует ли значимое различие между автономными и размещенными реализациями?

Вопрос, который у меня есть, в основном связан с частью четвертой статьи,.

Две формы согласованной реализации организованы и автономны. Соответствующая размещенная реализация должна принимать любую строго соответствующую программу.

Как я понимаю, это типичная среда приложения, с файловыми системами, выделенной памятью и потоками...

Соответствующая автономная реализация должна принимать любую строго соответствующую программу, в которой использование функций, указанных в разделе библиотеки (раздел 7), ограничивается содержимым стандартных заголовков <float.h>, <iso646.h>, <limits.h>, <stdalign.h>, <stdarg.h>, <stdbool.h>, <stddef.h>, <stdint.h> и <stdnoreturn.h>.

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

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

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

  • fopen, fgets и malloc могут возвращать NULL
  • fprintf, fscanf, fputc и fgetc могут возвращать EOF
  • thrd_create может возвращать thrd_error (указывая, что "запрос не может быть выполнен" )

Это подразумевает, что раздел 4 раздела различия, который дает шесть, практически не имеет смысла. Существуют ли какие-либо требования, гарантирующие некоторый фактический уровень функциональности для этих функций в размещенных и автономных реализациях? Например, требуется ли, чтобы эти функции, на самом деле, могли возвращать что-то иное, чем их соответствующие значения отказа?

Ответ 1

В приведенном параграфе уже сказано об этом довольно хорошо.

Поддерживаемая среда исполнения также является автономной, но не наоборот. Компилятор должен обеспечивать только автономную реализацию. Например, gcc, строго говоря, является автономным, поскольку стандартная библиотека не включена. Однако он предполагает, что он доступен при компиляции для размещенной среды (по умолчанию), предполагая, что lib доступен в системе (например, glibc). См. здесь

Проще говоря, свободен - это просто язык. Не требуется поддержка каких-либо библиотек и нескольких заголовков (в основном для обычных типов и конкретных приложений, таких как числовые ограничения и т.д.). Это означает, что стандартная библиотека не должна существовать - и не соответствующие заголовки. Разум - это автономная среда, которая, скорее всего, не будет иметь таких объектов, как файлы, отображение и т.д. Она используется для ядер, встроенных блоков и т.д.

Обратите внимание, что gcc, например, будет, если компиляция для размещенной среды (-fhosted), предполагает, что функции, используемые в стандартной библиотеке, имеют соответствующее значение и могут применяться очень агрессивные оптимизации (у нее есть много из этих встроенных функций), Для фристайлинга это на самом деле не так, поэтому вы можете использовать функцию strcmp, например, с совершенно другой семантикой. Тем не менее, предполагается, что функции mem... существуют, поскольку они используются для нормального кода, например. struct.

Итак, если вы строите для bare-metal, вы всегда должны пройти -ffreestanding.

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

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

5.1.2.1 далее говорится, что "любые библиотечные возможности, доступные для автономной программы, отличные от минимального набора, требуемого в соответствии с пунктом 4, - это реализация -определенный.". Это подтверждает мое утверждение. Sidenote: он также не требует main() в качестве точки входа в программу.

Ответ 2

Существует много видов реализаций C, предназначенных для разных типов платформ исполнения, многие из которых могут предоставить множество полезных функций и гарантировать, что другие не могут. Авторы Стандарта решили, что в большинстве случаев должно быть достаточно очевидно, какие функции и гарантии должны быть предоставлены реализацией, ориентированной на различные платформы и области приложений, и как они должны быть предоставлены, чтобы не было необходимости иметь стандартный заботиться о таких деталях. С другой стороны, количество приложений, которые потребуют таких вещей, как файловый ввод-вывод и количество платформ, которые могли бы обеспечить их, было достаточным, чтобы оправдать распознавание как "специальных" тех реализаций, которые включали такие функции.

В целом реализации, предназначенные для автономного использования, будут использоваться на платформах, которые не смогут с пользой справиться с размещенной реализацией. Хотя Стандарт накладывает некоторые требования, выходящие за рамки того, что было бы практичным на некоторых небольших платформах C, некоторые почти соответствующие реализации C могут быть весьма полезны для процессоров с достаточным объемом памяти для хранения 256 инструкций и 16 байтов переменных. Если что-то вроде цифрового кухонного термометра/таймера-гаджета не имеет файловой системы или консоли, зачем ему хранить хранилище на таких вещах, как дескрипторы для stdout?

Кроме того, поскольку стандарт не определяет стандартные средства, с помощью которых автономные приложения могут выполнять операции ввода-вывода, а также потому, что разные платформы обрабатывают операции ввода-вывода по-разному, почти автономные приложения будут нацелены на определенную целевую платформу или ряд платформ. Хостинг-реализация, которая не раскрывает естественные функции или гарантирует, что базовая платформа будет обеспечивать, может быть полезна для запуска программ, которые не требуют таких функций или гарантий. Однако встроенная программа не может делать что-либо, не используя специфические для платформы функции и гарантии, и, таким образом, автономная реализация, которая не позволяет программисту получить доступ к таким вещам, не сможет сделать многое. Реализации качества должны позволить программистам использовать любые функции или гарантии, которые могут помочь им выполнить то, что им нужно сделать, хотя некоторые из них могут потребовать использования параметров компиляции, чтобы гарантировать, что они не делают ничего глупого. По какой-то причине стало модно рассматривать решение Комитета по стандартам о том, что могут существовать некоторые реализации и области приложений, в которых ценность функции или гарантии не будет оправдывать стоимость, поскольку указание на то, что программистам не следует ожидать внедрения предоставляют функцию или гарантию, которые были бы полезны при программировании на низком уровне и которые платформа обеспечивала бы по существу нулевую стоимость.