Spec-Zone.ru › Ada 2005
Справочник по Ada 2005

Рекомендации по реализации M.3

В этом международном стандарте иногда даются рекомендации по обработке зависимостей от конкретной целевой машины. Каждая реализация Ada должна документировать, следуют ли они этим рекомендациям:
  • Программа_Ошибка должна быть поднята, когда в ходе выполнения используется неподдерживаемая функция Приложения для специальных потребностей. См. 1.1.3(20).
  • Реализационные расширения функциональности языковой библиотечной единицы должны предоставляться путем добавления потомков к библиотечной единице. См. 1.1.3(21).
  • Если обнаружена ограниченная ошибка или ошибочное выполнение, должна быть поднята Программа_Ошибка. См. 1.1.5(12).
  • Реализационные директивы должны не иметь никакого семантического эффекта для программ без ошибок. См. 2.8(16).
  • Реализационные директивы не должны делать некорректную программу корректной, если они не завершают объявление или не настраивают элемент_библиотеки в среде. См. 2.8(19).
  • Long_Integer должен быть объявлен в Standard, если целевая платформа поддерживает 32-разрядную арифметику. Никакие другие именованные целочисленные подтипы не должны быть объявлены в Standard. См. 3.5.4(28).
  • Для целевой платформы со знаком «два» должны поддерживаться модульные типы с бинарным модулем до System.Max_Int*2+2. Должна поддерживаться небинарная модуль до Integer'Last. См. 3.5.4(29).
  • Программа_Ошибка должна быть поднята для вычисления S'Pos для перечислимого типа, если значение операнда не соответствует внутреннему коду ни одной перечислительной константы типа. См. 3.5.5(8).
  • Long_Float должен быть объявлен в Standard, если целевая платформа поддерживает 11 или более цифр точности. Никакие другие именованные типы с плавающей запятой не должны быть объявлены в Standard. См. 3.5.7(17).
  • Многомерные массивы должны быть представлены в порядке следования строк, если у массива нет соглашения Fortran. См. 3.6.2(11).
  • Теги.Internal_Tag должен возвращать тег типа, внутренний мастер которого является мастером точки вызова функции.. См. 3.9(26.1/2).
  • Для вещественного статического выражения с неформальным типом, который не является частью более крупного статического выражения, должно выполняться округление, аналогичное целевой системе. См. 4.9(38.1/2).
  • Значение Duration'Small не должно быть больше 100 микросекунд. См. 9.6(30).
  • База времени для delay_relative_statement должна быть монотонной. См. 9.6(31).
  • Высокоскоростные секунды должны поддерживаться, если целевая система их поддерживает. В противном случае операции в Calendar.Formatting должны возвращать результаты, соответствующие отсутствию высокоскоростных секунд. См. 9.6.1(89/2).
  • При применении к обобщенному блоку, единица программы pragma, которая не является библиотечной директивой pragma, должна применяться к каждому экземпляру обобщенного блока, для которого не применена переопределяющая директива pragma непосредственно к экземпляру. См. 10.1.5(10/1).
  • Тип, объявленный в предварительно обработанном пакете, должен иметь такое же представление в каждом расширении данной версии пакета. См. 10.2.1(12).
  • Exception_Message по умолчанию должен быть коротким, предоставлять информацию, полезную для отладки, и не должен включать в себя Exception_Name. См. 11.4.1(19).
  • Exception_Information должен предоставлять информацию, полезную для отладки, и должен включать в себя Exception_Name и Exception_Message. См. 11.4.1(19).
  • Код, выполняемый для проверок, которые были подавлены, должен быть минимизирован. См. 11.5(28).
  • Должно соблюдаться рекомендуемый уровень поддержки всех элементов представления. См. 13.1(28/2).
  • Память, выделенная для объектов упакованного типа, должна быть минимизирована. См. 13.2(6).
  • Должен соблюдаться рекомендуемый уровень поддержки директивы Pack. См. 13.2(9).
  • Для массива X, X'Address должен указывать на первый компонент массива, а не на границы массива. См. 13.3(14).
  • Должен соблюдаться рекомендуемый уровень поддержки атрибута Address. См. 13.3(19).
  • Должен соблюдаться рекомендуемый уровень поддержки атрибута Alignment. См. 13.3(35).
  • Размер объекта массива не должен включать его границы. См. 13.3(41.1/2).
  • Если размер подтипа допускает эффективную независимую адресацию, то размер большинства объектов подтипа должен быть равен размеру подтипа. См. 13.3(52).
  • Определение размера для составного подтипа не должно влиять на внутреннее расположение компонентов. См. 13.3(53).
  • Должен соблюдаться рекомендуемый уровень поддержки атрибута Size. См. 13.3(56).
  • Должен соблюдаться рекомендуемый уровень поддержки атрибута Component_Size. См. 13.3(73).
  • Должен соблюдаться рекомендуемый уровень поддержки определения_представления_перечислимого_типа . См. 13.4(10).
  • Должен соблюдаться рекомендуемый уровень поддержки определения_представления_записи . См. 13.5.1(22).
  • Если компонент представлен указателем на фактические данные компонента, которые смежны с остальной частью объекта, то атрибуты места хранения должны отражать место фактических данных. Если компонент размещается несмежно с остальной частью объекта, то при обращении к одному из его атрибутов места хранения должно генерироваться предупреждение. См. 13.5.2(5).
  • Должен соблюдаться рекомендуемый уровень поддержки нестандартного порядка битов. См. 13.5.3(8).
  • Тип System.Address должен быть типом-данными. См. 13.7(37).
  • Операции в System и его потомках должны отражать целевую среду; операции, которые не имеют смысла, должны поднимать Program_Error. См. 13.7.1(16).
  • Поскольку размер объекта массива обычно не включает его границы, границы не должны быть частью преобразованных данных в экземпляре Unchecked_Conversion. См. 13.9(14/2).
  • Не должно быть ненужных проверок во время выполнения результата Unchecked_Conversion; результат должен возвращаться по ссылке, когда это возможно. Следует избегать ограничений на Unchecked_Conversions. См. 13.9(15).
  • Должен соблюдаться рекомендуемый уровень поддержки Unchecked_Conversion. См. 13.9(17).
  • Все случаи, когда динамически выделяется кучевая память, кроме как в рамках вычисления аллокатора, должны быть задокументированы. См. 13.11(23).
  • У пула памяти по умолчанию для типа доступа к константе не должно быть накладных расходов для поддержки освобождения отдельных объектов. См. 13.11(24).
  • Обычно пул памяти для дискриминанта доступа или параметра доступа создается в момент аллокатора, и освобождается, когда обозначенный объект становится недоступным. Для других анонимных типов доступа пул должен быть создан в момент обработки типа и не должен поддерживать освобождение отдельных объектов. См. 13.11(25).
  • Для стандартного пула памяти экземпляр Unchecked_Deallocation должен фактически освободить память. См. 13.11.2(17).
  • Должен соблюдаться рекомендуемый уровень поддержки атрибута Stream_Size. См. 13.13.2(1.8/2).
  • Если не указано иное, значение Stream_Size для элементарного типа должно быть равно количеству битов, соответствующему минимальному количеству элементов потока, требуемым первым подтипом типа, округлённому до ближайшего множителя или кратного размера слова, которое также является кратным размеру элемента потока. См. 13.13.2(1.6/2).
  • Если реализация предоставляет дополнительные именованные предопределённые целочисленные типы, то имена должны оканчиваться на «Integer». Если реализация предоставляет дополнительные именованные предопределённые типы с плавающей запятой, то имена должны оканчиваться на «Float». См. A.1(52).
  • Операции, определенные реализацией, для Wide_Character, Wide_String, Wide_Wide_Character и Wide_Wide_String, должны быть дочерними элементами Wide_Characters или Wide_Wide_Characters. См. A.3.1(7/2).
  • Объекты ограниченных строк не должны реализовываться с помощью неявных указателей и динамического выделения памяти. См. A.4.4(106).
  • Strings.Hash должна быть хорошей хеш-функцией, возвращающей широкий спектр значений для разных значений строк, а похожие строки редко должны возвращать одно и то же значение. См. A.4.9(12/2).
  • Любая память, связанная с объектом типа Generator пакетов генерации случайных чисел, должна быть возвращена при выходе из области видимости объекта. См. A.5.2(46).
  • Каждое значение Initiator, переданное в Reset для пакетов генерации случайных чисел, должно инициировать различную последовательность случайных чисел или, если это невозможно, по крайней мере, быть быстро изменяющейся функцией от значения инициатора. См. A.5.2(47).
  • Get_Immediate должна быть реализована с небуферизованным вводом; входные данные должны быть доступны немедленно; редактирование строк должно быть отключено. См. A.10.7(23).
  • Должна быть обеспечена возможность получения дополнительной информации о файле с помощью пакета Directories.Information. См. A.16(124/2).
  • Directories.Start_Search и Directories.Search должны вызывать Use_Error для неправильно сформированных шаблонов. См. A.16(125/2).
  • Directories.Rename должна поддерживаться, по крайней мере, когда и New_Name, и Old_Name являются простыми именами, и New_Name не идентифицирует существующий внешний файл. См. A.16(126/2).
  • Если среда выполнения поддерживает подпроцессы, текущие переменные среды должны использоваться для инициализации переменных среды подпроцесса. См. A.17(32/2).
  • Изменения переменных среды, сделанные вне контроля Environment_Variables, должны отражаться немедленно. См. A.17(33/2).
  • Containers.Hash_Type'Modulus должен быть не менее 2**32. Containers.Count_Type'Last должен быть не менее 2**31–1. См. A.18.1(8/2).
  • Временная сложность Element для Containers.Vector в худшем случае должна быть O(log N). См. A.18.2(256/2).
  • Временная сложность Append с Count = 1, когда N меньше, чем емкость для Containers.Vector, в худшем случае должна быть O(log N). См. A.18.2(257).
  • Временная сложность Prepend с Count = 1 и Delete_First с Count=1 для Containers.Vectors в худшем случае должна быть O(N log N). См. A.18.2(258/2).
  • Временная сложность вызова процедуры Sort экземпляра Containers.Vectors.Generic_Sorting в худшем случае должна быть O(N**2), а средняя временная сложность должна быть лучше, чем O(N**2). См. A.18.2(259/2).
  • Containers.Vectors.Generic_Sorting.Sort и Containers.Vectors.Generic_Sorting.Merge должны минимизировать копирование элементов. См. A.18.2(260/2).
  • Containers.Vectors.Move не должен копировать элементы и должен минимизировать копирование внутренних структур данных. См. A.18.2(261/2).
  • Если исключение распространяется из операции с вектором, память не должна быть потеряна, а элементы не должны быть удалены из вектора, если это не указано операцией. См. A.18.2(262/2).
  • Временная сложность Element, Insert с Count=1 и Delete с Count=1 для Containers.Doubly_Linked_Lists в худшем случае должна быть O(log N). См. A.18.3(160/2).
  • Вызов процедуры Sort экземпляра Containers.Doubly_Linked_Lists.Generic_Sorting должен иметь среднюю временную сложность лучше, чем O(N**2), а в худшем случае не хуже, чем O(N**2). См. A.18.3(161/2).
  • Containers.Doubly_Link_Lists.Move не должен копировать элементы и должен минимизировать копирование внутренних структур данных. См. A.18.3(162/2).
  • Если исключение распространяется из операции со списком, память не должна быть потеряна, а элементы не должны быть удалены из списка, если это не указано операцией. См. A.18.3(163/2).
  • Move для карты не должен копировать элементы и должен минимизировать копирование внутренних структур данных. См. A.18.4(83/2).
  • Если исключение распространяется из операции с картой, память не должна быть потеряна, а элементы не должны быть удалены из карты, если это не указано операцией. См. A.18.4(84/2).
  • Средняя временная сложность операций Element, Insert, Include, Replace, Delete, Exclude и Find, принимающих параметр ключа для Containers.Hashed_Maps, должна составлять O(log N). Средняя временная сложность подпрограмм Containers.Hashed_Maps, принимающих параметр курсора, должна составлять O(1). См. A.18.5(62/2).
  • Худшая временная сложность операций Element, Insert, Include, Replace, Delete, Exclude и Find, принимающих параметр ключа для Containers.Ordered_Maps, должна составлять O((log N)**2) или лучше. Худшая временная сложность подпрограмм Containers.Ordered_Maps, принимающих параметр курсора, должна составлять O(1). См. A.18.6(95/2).
  • Move для множеств не должен копировать элементы и должен минимизировать копирование внутренних структур данных. См. A.18.7(104/2).
  • Если исключение распространяется из операции с множеством, память не должна быть потеряна, а элементы не должны быть удалены из множества, если это не указано операцией. См. A.18.7(105/2).
  • Средняя временная сложность операций Insert, Include, Replace, Delete, Exclude и Find, принимающих параметр элемента для Containers.Hashed_Sets, должна быть O(log N). Средняя временная сложность подпрограмм Containers.Hashed_Sets, принимающих параметр курсора, должна быть O(1). Средняя временная сложность Containers.Hashed_Sets.Reserve_Capacity должна быть O(N). См. A.18.8(88/2).
  • Худшая временная сложность операций Insert, Include, Replace, Delete, Exclude и Find, принимающих параметр элемента для Containers.Ordered_Sets, должна быть O((log N)**2). Худшая временная сложность подпрограмм Containers.Ordered_Sets, принимающих параметр курсора, должна быть O(1). См. A.18.9(116/2).
  • Containers.Generic_Array_Sort и Containers.Generic_Constrained_Array_Sort должны иметь среднюю временную сложность лучше, чем O(N**2), и худший случай не хуже, чем O(N**2). См. A.18.16(10/2).
  • Containers.Generic_Array_Sort и Containers.Generic_Constrained_Array_Sort должны минимизировать копирование элементов. См. A.18.16(11/2).
  • Если для языка поддерживается pragma Export, главная программа должна быть написана на этом языке. Для разработки и завершения задачи среды должны быть предоставлены подпрограммы с именами «adainit» и «adafinal». См. B.1(39).
  • Автоматическое развитие предварительно разработанных пакетов должно быть обеспечено, когда поддерживается pragma Export. См. B.1(40).
  • Для каждой поддерживаемой конвенции L, отличной от Intrinsic, pragma Import и Export должны поддерживаться для объектов L-совместимых типов и подпрограмм, и pragma Convention должна поддерживаться для L-подходящих типов и подпрограмм. См. B.1(41).
  • Если предоставляется интерфейс к C, COBOL или Fortran, соответствующий пакет или пакеты, описанные в приложении B, «Интерфейс к другим языкам», также должны быть предоставлены. См. B.2(13).
  • Константы nul, wide_nul, char16_nul и char32_nul в пакете Interfaces.C должны иметь представление нуля. См. B.3(62.1/2).
  • Если поддерживается взаимодействие с C, должны поддерживаться соответствия интерфейсов между Ada и C. См. B.3(71).
  • Если поддерживается взаимодействие с COBOL, должны поддерживаться соответствия интерфейсов между Ada и COBOL. См. B.4(98).
  • Если поддерживается взаимодействие с Fortran, должны поддерживаться соответствия интерфейсов между Ada и Fortran. См. B.5(26).
  • Поддержка машинного кода или встроенных функций должна обеспечивать доступ ко всем операциям, обычно доступным программистам на языке ассемблера для целевой среды. См. C.1(3).
  • Должна поддерживаться связь с ассемблером; по умолчанию ассемблер должен быть связан с идентификатором конвенции Assembler. См. C.1(4).
  • Если сущность экспортируется в язык ассемблера, то реализация должна разместить ее по адресу, доступному для обращения, даже если она не ссылается на неё иначе из кода Ada. Вызов подпрограммы на языке машинного кода или ассемблера следует рассматривать так, как будто он может читать или обновлять каждый объект, указанный как экспортируемый. См. C.1(5).
  • Вызов встроенных и подпрограмм машинного кода не должен сопровождаться значительной или чрезмерной накладными расходами. См. C.1(10).
  • Должны быть предоставлены встроенные подпрограммы для доступа к любым операциям машины, которые предоставляют особые возможности или эффективность, обычно недоступные. См. C.1(16).
  • Если политика Ceiling_Locking не применяется, и целевая система позволяет более тонкий контроль блокировки прерываний, должен быть предусмотрен способ для приложения указать, какие прерывания должны быть заблокированы во время защищенных действий. См. C.3(28/2).
  • Обработчики прерываний должны вызываться напрямую аппаратным обеспечением. См. C.3.1(20).
  • Нарушения любых определённых реализацией ограничений для обработчиков прерываний должны обнаруживаться до выполнения. См. C.3.1(21).
  • Если поддерживаются определённые реализацией формы процедур обработчиков прерываний, то для каждой такой формы обработчика должен быть указан тип, аналогичный Parameterless_Handler, в дочернем пакете Interrupts, с теми же операциями, что и в предопределённом пакете Interrupts. См. C.3.2(25).
  • Предварительно разработанные пакеты должны быть реализованы таким образом, чтобы во время выполнения для разработки сущностей выполнялось мало или совсем не выполнялось кода. См. C.4(14).
  • Если pragma Discard_Names применяется к сущности, то объём памяти, используемый для хранения имён, связанных с этой сущностью, должен быть уменьшен. См. C.5(8).
  • Загрузка или сохранение переменного объекта, размер которого кратен System.Storage_Unit, а выравнивание которого не равно нулю, должно быть реализовано путём доступа точно к битам объекта и ни к каким другим. См. C.6(22/2).
  • Загрузка или сохранение атомного объекта должно быть реализовано одной командой загрузки или сохранения. См. C.6(23/2).
  • Финализация атрибутов задачи и освобождение связанной памяти должны выполняться как можно скорее после завершения задачи. См. C.7.2(30.1/2).
  • Если целевая область требует детерминированного использования памяти во время выполнения, память для атрибутов задачи должна быть предварительно выделена статически, и количество предварительно выделенных атрибутов должно быть задокументировано. См. C.7.2(30).
  • Имена, заканчивающиеся на «_Locking», должны использоваться для определённых реализацией политик блокировки. См. D.3(17).
  • Имена, заканчивающиеся на «_Queuing», должны использоваться для определённых реализацией политик очереди. См. D.4(16).
  • Оператор abort_statement не должен требовать блокировки задачи, выполняющей данное утверждение. См. D.6(9).
  • В многопроцессорной системе время ожидания, связанное с прерыванием задачи на другом процессоре, должно быть ограничено. См. D.6(10).
  • Когда это возможно, следует использовать указанные ограничения для создания более эффективной реализации. См. D.7(21).
  • По возможности, должны быть предусмотрены механизмы для изменения значения Tick. См. D.8(47).
  • Calendar.Clock и Real_Time.Clock должны быть преобразованиями одного и того же временного базиса. См. D.8(48).
  • «Лучший» временной базис, существующий в базовой системе, должен быть доступен приложению через Real_Time.Clock. См. D.8(49).
  • По возможности, реализации должны предоставить механизмы конфигурации для изменения значения Execution_Time.CPU_Tick. См. D.14(29/2).
  • Для события тайминга обработчик должен выполняться непосредственно механизмом прерывания реального времени. См. D.15(25).
  • PCS должен позволять нескольким задачам вызывать приемник RPC. См. E.5(28).
  • Операция System.RPC.Write должна генерировать Storage_Error, если при записи элемента закончится место. См. E.5(29).
  • Если COBOL (соответственно, C) поддерживается в целевой среде, то взаимодействие с COBOL (соответственно, C) должно поддерживаться в соответствии со спецификациями в приложении B. См. F(7).
  • Упакованное десятичное представление должно использоваться в качестве внутреннего представления для объектов подтипа S, когда S'Machine_Radix = 10. См. F.1(2).
  • Если Fortran (соответственно, C) поддерживается в целевой среде, то взаимодействие с Fortran (соответственно, C) должно поддерживаться в соответствии со спецификациями в приложении B. См. G(7).
  • Смешанные операции с вещественными и комплексными числами (а также чисто мнимые и комплексные операции) не должны выполняться путём преобразования вещественного (соответственно, чисто мнимого) операнда в комплексное число. См. G.1.1(56).
  • Если Real'Signed_Zeros истинно для Numerics.Generic_Complex_Types, должна быть предоставлена рациональная обработка знаков нулевых результатов и компонент результатов. См. G.1.1(58).
  • Если Complex_Types.Real'Signed_Zeros истинно для Numerics.Generic_Complex_Elementary_Functions, должна быть предоставлена рациональная обработка знаков нулевых результатов и компонент результатов. См. G.1.2(49).
  • Для элементарных функций, прямые тригонометрические функции без параметра Cycle не должны реализовываться путём вызова соответствующей версии с параметром Cycle. Log без параметра Base не должна реализовываться путём вызова Log с параметром Base. См. G.2.4(19).
  • Для комплексных арифметических операций функция Compose_From_Polar без параметра Cycle не должна реализовываться путём вызова Compose_From_Polar с параметром Cycle. См. G.2.6(15).
  • Solve и Inverse для Numerics.Generic_Real_Arrays должны быть реализованы с использованием устоявшихся методик, таких как LU-разложение, а результат должен быть уточнён итерацией по остаткам. См. G.3.1(88/2).
  • Оператор равенства должен использоваться для проверки того, что матрица в Numerics.Generic_Real_Matrix симметричная. См. G.3.1(90/2).
  • Solve и Inverse для Numerics.Generic_Complex_Arrays должны быть реализованы с использованием устоявшихся методик, а результат должен быть уточнён итерацией по остаткам. См. G.3.2(158/2).
  • Операторы равенства и отрицания должны использоваться для проверки того, что матрица является эрмитовой. См. G.3.2(160/2).
  • Смешанные операции с вещественными и комплексными числами не должны выполняться путём преобразования вещественного операнда в комплексный. См. G.3.2(161/2).
  • Информация, генерируемая pragma Reviewable, должна предоставляться в удобочитаемой и машиночитаемой форме, причём последняя форма должна быть задокументирована. См. H.3.1(19).
  • Списки объектного кода должны быть предоставлены как в символической, так и в числовой форме. См. H.3.1(20).
  • Если политика разработки раздела является Последовательной, и задача Среды становится постоянно заблокированной во время разработки, то раздел должен быть немедленно завершён. См. H.6(15/2).


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API