Декларация (компьютерное программирование) - Declaration (computer programming)

В компьютерное программирование, а декларация это языковая конструкция который определяет свойства идентификатор: объявляет, что означает слово (идентификатор).[1] Объявления чаще всего используются для функции, переменные, константы, и классы, но также может использоваться для других сущностей, таких как перечисления и определения типов.[1] Помимо имени (самого идентификатора) и типа объекта (функция, переменная и т. Д.), В объявлениях обычно указывается тип данных (для переменных и констант) или подпись типа (для функций); типы также могут включать измерения, например для массивов. Объявление используется для сообщения о существовании объекта компилятор; это важно в тех строго типизированный языки, которые требуют, чтобы функции, переменные и константы, а также их типы были указаны с объявлением перед использованием, и используется в предварительная декларация.[2] Термин «декларация» часто противопоставляется термину «определение»,[1] но значение и использование значительно различаются между языками; см. ниже.

Заявления особенно заметны на языках в АЛГОЛ традиции, в том числе BCPL семья, в первую очередь C и C ++, а также Паскаль. Ява используется термин «объявление», хотя Java не требует отдельных объявлений и определений.

Декларация против определения

Одна основная дихотомия заключается в том, содержит ли объявление определение: например, указывает ли объявление константы или переменной значение константы (соответственно, Первоначальный значение переменной) или только ее тип; и аналогично, определяет ли объявление функции тело (реализация ) функции или только сигнатуру ее типа.[1] Не все языки делают это различие: на многих языках объявления всегда включают определение и могут называться либо «объявлениями», либо «определениями», в зависимости от языка.[а] Однако эти концепции различаются в языках, которые требуют объявления перед использованием (для которых используются предварительные объявления), и в языках, где интерфейс и реализация разделены: интерфейс содержит объявления, реализация содержит определения.[b]

В неформальном использовании «объявление» относится только к чистому объявлению (только типы, без значения или тела), а «определение» относится к объявлению, которое включает значение или тело. Однако в формальном использовании (в языковых спецификациях) «декларация» включает и то и другое этих смыслов с более тонкими различиями по языку: в C и C ++ объявление функции, не включающей тело, называется прототип функции, в то время как объявление функции, которая действительно включает тело, называется «определением функции». В Java объявления встречаются в двух формах. Для общедоступных методов они могут быть представлены в интерфейсах как сигнатуры методов, которые состоят из имен методов, типов ввода и типа вывода. Аналогичные обозначения можно использовать в определении абстрактных методов, не содержащих определения. Можно создать экземпляр включающего класса, а для создания экземпляра класса потребуется создать новый производный класс, который предоставляет определение метода. Начиная с Java 8, в язык было включено лямбда-выражение, которое можно было рассматривать как объявление функции.

Заявления и определения

В семействе языков программирования C объявления часто собираются в файлы заголовков, которые включены в другие исходные файлы, которые ссылаются на эти объявления и используют их, но не имеют доступа к определению. Информация в файле заголовка обеспечивает интерфейс между кодом, который использует объявление, и кодом, который его определяет, в форме скрытие информации. Объявление часто используется для доступа к функциям или переменным, определенным в разных исходных файлах или в библиотека. Несоответствие между типом определения и типом объявления приводит к ошибке компилятора.

Для переменных определения присваивают значения области памяти, которая была зарезервирована на этапе объявления. Для функций определения предоставляют тело функции. Хотя переменную или функцию можно объявлять много раз, обычно она определяется один раз (в C ++, это известно как Одно правило определения или ODR).

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

Вот несколько примеров объявлений, которые не являются определениями в C:

внешний char example1;внешний int пример2;пустота example3(пустота);

Вот несколько примеров объявлений, которые являются определениями, снова в C:

char example1; / * Вне определения функции она будет инициализирована нулем. * /int пример2 = 5;пустота example3(пустота) { / * определение в фигурных скобках * / }

Неопределенные переменные

В некоторых языках программирования неявное объявление предоставляется при первом обнаружении такой переменной в время компиляции. На других языках такое использование считается ошибкой, которая может привести к диагностическому сообщению. Некоторые языки начали с неявного описания поведения, но по мере развития они предоставили возможность отключить его (например, Perl "s"использовать строгий" или Visual Basic "s"Вариант явный").

Смотрите также

Заметки

  1. ^ Например, Java использует «объявление» (объявление класса, объявление метода), а Python использует «определение» (определение класса, определение функции).[3]
  2. ^ Это различие наблюдается в «единицах» (модулях) Паскаля и в традиционной организации кода C и C ++, которая имеет файлы заголовков состоящий в основном из чистых деклараций, и исходные файлы состоит из определений, хотя это не всегда строго соблюдается и не поддерживается языком.

использованная литература

  1. ^ а б c d "Объявление определяет интерпретацию и атрибуты набора идентификаторов. A определение идентификатора - это объявление для этого идентификатора, которое:
    • для объекта [переменной или константы] вызывает резервирование памяти для этого объекта;
    • для функции включает тело функции;
    • для константы перечисления - (единственное) объявление идентификатора;
    • для имени typedef - первое (или единственное) объявление идентификатора. "
    Спецификация C11, 6.7: Заявления, параграф 5.
  2. ^ Майк Банахан. «2.5. Объявление переменных». http://publications.gbdirect.co.uk/c_book/: GBdirect. Получено 2011-06-08. [A] объявление [...] вводит только имя и тип чего-либо, но не выделяет памяти [...].
  3. ^ 7. Составные заявления, Справочник по языку Python

внешние ссылки