Введение

Контейнер для набора идентификаторов

В вычислительной технике пространство имен — это набор обозначений (имен), используемых для идентификации и обращения к объектам различных типов. Пространство имен обеспечивает уникальность имен для всех объектов в заданном наборе, что позволяет легко их идентифицировать. Пространства имен обычно структурированы иерархически, что позволяет повторно использовать имена в разных контекстах. В качестве аналогии можно рассмотреть систему именования людей, где каждый человек имеет имя и фамилию, которую он разделяет со своими родственниками. Если имена членов семьи уникальны только в пределах семьи, то каждого человека можно однозначно идентифицировать по сочетанию имени и фамилии; существует только одна Джейн Доу, хотя Джейн может быть много. В пространстве имен семьи Доу достаточно использовать имя "Джейн", чтобы однозначно указать этого человека, в то время как в "глобальном" пространстве имен всех людей необходимо использовать полное имя. Наглядные примеры пространств имен включают файловые системы, которые присваивают имена файлам. Некоторые языки программирования организуют свои переменные и подпрограммы в пространствах имен. Компьютерные сети и распределенные системы присваивают имена ресурсам, таким как компьютеры, принтеры, веб-сайты и удаленные файлы. Операционные системы могут разделять ресурсы ядра изолированными пространствами имен для поддержки контейнеров виртуализации. Аналогично, иерархические файловые системы организуют файлы в каталогах. Каждый каталог представляет собой отдельное пространство имен, поэтому каталоги "письма" и "счета" могут содержать файл "для Джейн". В компьютерном программировании пространства имен обычно используются для группировки символов и идентификаторов вокруг определенной функциональности и для предотвращения конфликтов имен между несколькими идентификаторами с одинаковым именем. В сетевой сфере система доменных имен (DNS) организует веб-сайты (и другие ресурсы) в иерархические пространства имен.

Примеры

+ Примеры имен в пространстве имен Контекстное имя Имя пространства имен Локальное имя Путь /home/user/readme.txt /home/user (директория) readme.txt (имя файла) Доменное имя www.example.com example.com (доменное имя) www (доменное имя листа) C++ std::array std (пространство имен C++) array (структура) UN/LOCODE US NYC US (страна или территория) NYC (населенный пункт) XML xmlns:xhtml="http://www.w3.org/1999/xhtml" <xhtml:body> xhtml (ранее объявленное пространство имен XML xhtml="http://www.w3.org/1999/xhtml") body (элемент) Perl $DBI::errstr $DBI (модуль Perl) errstr (переменная) Java java.util.Date java.util (пространство имен Java) Date (класс) Универсальное имя ресурса (URN) urn:nbn:fi fe19991055 urn:nbn (Национальные библиографические номера) fi fe19991055 Система Handle 10.1000/182 10 (авторитет именования Handle) 1000/182 (локальное имя Handle) Идентификатор цифрового объекта 10.1000/182 10.1000 (издатель) 182 (публикация) MAC-адрес 01 23 45 67 89 ab 01 23 45 (организационно уникальный идентификатор) 67 89 ab (специфичный для NIC) PCI ID 1234 abcd 1234 (ID поставщика) abcd (ID устройства) USB VID/PID 2341 003f 2341 (ID поставщика) 003f (ID продукта) SPARQL dbr:Sydney dbr (ранее объявленная онтология, например, с помощью префикса @prefix dbr: <http://dbpedia.org/resource/>) Sydney

Делегирование

Делегирование обязанностей между сторонами важно в реальных приложениях, таких как структура Всемирной паутины. Пространства имен обеспечивают делегирование полномочий по присвоению идентификаторов множеству организаций, выдающих имена, при сохранении глобальной уникальности. Центральный регистрирующий орган регистрирует присвоенные имена пространств имен. Каждое имя пространства имен выделяется организации, которая впоследствии несет ответственность за присвоение имен в пределах выделенного ей пространства имен. Эта организация может быть организацией, выдающей имена, которая сама присваивает их, или другим регистрирующим органом, который, в свою очередь, делегирует части своего пространства имен другим организациям.

Иерархия

Схема именования, позволяющая субделегирование пространств имен третьим сторонам, является иерархическим пространством имен. Иерархия считается рекурсивной, если синтаксис имен пространства имен одинаков для каждой субделегации. Примером рекурсивной иерархии является система доменных имен. Примером нерекурсивной иерархии является универсальное имя ресурса (URN), представляющее номер, выданный Internet Assigned Numbers Authority (IANA). + Разбор иерархического пространства имен для urn:isbn:978 3 16 148410 0, идентификатора книги "Логика научного исследования" Карла Поппера, 10-е издание. Реестр Регистратор Пример идентификатора Имя пространства имен Универсальное имя ресурса (URN) Internet Assigned Numbers Authority urn:isbn:978 3 16 148410 0 urn Формальное пространство имен URN Формальное пространство имен URN Internet Assigned Numbers Authority urn:isbn:978 3 16 148410 0 ISBN Международный стандартный номер книги в качестве универсального имени ресурса Международный номер статьи (EAN) GS1 978 3 16 148410 0 978 Bookland Международный стандартный номер книги (ISBN) Международное ISBN агентство 3 16 148410 X 3 Страны немецкого языка Код немецкого издателя Agentur für Buchmarktstandards 16 Mohr Siebeck

Рассмотрение информатики

В информатике пространство имен (иногда также называемое областью видимости имен) — это абстрактный контейнер или среда, созданная для хранения логической группы уникальных идентификаторов или символов (то есть имен). Идентификатор, определенный в пространстве имен, связан только с этим пространством имен. Один и тот же идентификатор может быть независимо определен в нескольких пространствах имен. Это означает, что идентификатор, определенный в одном пространстве имен, может иметь другое значение, чем тот же идентификатор, определенный в другом пространстве имен. Языки программирования, поддерживающие пространства имен, определяют правила, по которым определяется, какому пространству имен принадлежит идентификатор (а не его определение). Это можно проиллюстрировать аналогией. Представьте, что две компании, X и Y, присваивают идентификационные номера своим сотрудникам. В компании X не должно быть двух сотрудников с одинаковым идентификационным номером, и то же самое в компании Y; однако использование одного и того же идентификационного номера в обеих компаниях не является проблемой. Например, если Билл работает в компании X, а Джейн — в компании Y, то для каждого из них не является проблемой быть сотрудником № 123. В этой аналогии идентификационный номер — это идентификатор, а компания — пространство имен. Отсутствие проблем, когда один и тот же идентификатор идентифицирует разных людей в каждом пространстве имен, является ключевым моментом. В больших компьютерных программах или документах обычно используются сотни или тысячи идентификаторов. Пространства имен (или аналогичная техника, см. Эмуляция пространств имен) предоставляют механизм для сокрытия локальных идентификаторов. Они позволяют группировать логически связанные идентификаторы в соответствующие пространства имен, что делает систему более модульной. Устройства хранения данных и многие современные языки программирования поддерживают пространства имен. Устройства хранения используют каталоги (или папки) в качестве пространств имен. Это позволяет хранить на устройстве два файла с одинаковым именем, если они находятся в разных каталогах. В некоторых языках программирования (например, C++, Python) идентификаторы, обозначающие пространства имен, сами связаны с внешним пространством имен. Таким образом, в этих языках пространства имен могут быть вложенными, образуя дерево пространств имен. В корне этого дерева находится безымянное глобальное пространство имен.

Ява

В Java идея пространства имен реализована в виде пакетов Java. Весь код принадлежит к пакету, хотя этот пакет не обязательно должен быть явно указан. Доступ к коду из других пакетов осуществляется путем добавления имени пакета перед соответствующим идентификатором, например, класс String в пакете java.lang можно ссылаться как java.lang.String (это называется полным именем класса). Как и в C++, Java предоставляет механизм, избавляющий от необходимости указывать имя пакета (импорт). Однако некоторые возможности (например, рефлексия) требуют от программиста использования полного имени. В отличие от C++, пространства имен в Java не являются иерархическими с точки зрения синтаксиса языка. Тем не менее, пакеты именуются иерархически. Например, все пакеты, начинающиеся с java, являются частью платформы Java – пакет содержит основные классы языка, а пакет содержит основные классы, относящиеся конкретно к рефлексии. В Java (и Ada, C# и других) пространства имен/пакеты выражают семантические категории кода. Например, в C# пространство имен System содержит код, предоставляемый системой (платформой .NET). Степень детализации этих категорий и глубина иерархий различаются в зависимости от языка. Области видимости функций и классов можно рассматривать как неявные пространства имен, неразрывно связанные с видимостью, доступностью и временем жизни объектов.

XML-пространство имен

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