Espacio de nombres
En informática, un espacio de nombres es un conjunto de signos (nombres) que se utilizan para identificar y referirse a objetos de varios tipos. Un espacio de nombres garantiza que todos los objetos de un conjunto dado tengan nombres únicos para que puedan identificarse fácilmente.
Los espacios de nombres se estructuran comúnmente como jerarquías para permitir la reutilización de nombres en diferentes contextos. Como analogía, considere un sistema de nombramiento de personas donde cada persona tiene un nombre de pila, así como un apellido compartido con sus parientes. Si los nombres de los miembros de la familia son únicos solo dentro de cada familia, entonces cada persona puede identificarse de manera única mediante la combinación de nombre y apellido; solo hay una Jane Doe, aunque puede haber muchas Janes. Dentro del espacio de nombres de la familia Doe, solo "Jane" basta con designar inequívocamente a esta persona, mientras que dentro del "global" espacio de nombres de todas las personas, se debe utilizar el nombre completo.
Ejemplos destacados de espacios de nombres incluyen sistemas de archivos, que asignan nombres a los archivos. Algunos lenguajes de programación organizan sus variables y subrutinas en espacios de nombres. Las redes informáticas y los sistemas distribuidos asignan nombres a los recursos, como computadoras, impresoras, sitios web y archivos remotos. Los sistemas operativos pueden particionar los recursos del núcleo por espacios de nombres aislados para admitir contenedores de virtualización.
Del mismo modo, los sistemas de archivos jerárquicos organizan los archivos en directorios. Cada directorio es un espacio de nombres separado, por lo que los directorios "letras" y "facturas" ambos pueden contener un archivo "to_jane".
En la programación informática, los espacios de nombres suelen emplearse con el fin de agrupar símbolos e identificadores en torno a una funcionalidad particular y para evitar colisiones de nombres entre varios identificadores que comparten el mismo nombre.
En las redes, el Sistema de nombres de dominio organiza los sitios web (y otros recursos) en espacios de nombres jerárquicos.
Conflictos de nombres
Los nombres de los elementos los define el desarrollador. Esto a menudo genera un conflicto al intentar mezclar documentos XML de diferentes aplicaciones XML.
Este XML lleva información de la tabla HTML:
■table - No. IdentificadoApplesIdentificado/td IdentificadoNaranjasIdentificado/td ■/tr título■/table
Este XML contiene información sobre una mesa (es decir, un mueble):
■table NombreAfrican Coffee TableIdentificado/nombre Identificado80■/width Identificado120Identificado/izquierda■/table
Si estos fragmentos XML se agregaran juntos, habría un conflicto de nombres. Ambos contienen un elemento <table>...</table>
, pero los elementos tienen diferente contenido y significado.
Un analizador XML no sabrá cómo manejar estas diferencias.
Solución vía prefijo
Los conflictos de nombres en XML se pueden evitar fácilmente usando un prefijo de nombre.
El siguiente XML distingue entre la información sobre la tabla HTML y los muebles con el prefijo "h" y "f" al comienzo de los elementos.
- No. - No. - No.Apples- No. - No.Naranjas- No. - No.- No.- No. ■f:nombreAfrican Coffee TableIdentificado/f:nombre - No.80■/f:width ■f:izquierda120■/f:izquierda■/f:table
Sistema de nombres
Un nombre en un espacio de nombres consta de un nombre de espacio de nombres y un nombre local. El nombre del espacio de nombres suele aplicarse como prefijo del nombre local.
En formato Backus-Naur aumentado:
nombre = > Nombre del espacio >
Cuando los nombres locales se usan solos, la resolución de nombres se usa para decidir a qué nombre en particular (si lo hay) se alude con algún nombre local en particular.
Ejemplos
Contexto | Nombre | Nombre del espacio | Nombre local |
---|---|---|---|
Camino | /home/user/readme.txt | /home/user (directorio) | readme.txt (nombre del fichero) |
Nombre de dominio | www.example.com | example.com (domain name) | www (leaf domain name) |
C++ | std::array | std (C++ namespace) | array (struct) |
UN/LOCODE | US NYC | Estados Unidos (país o territorio) | NYC (localidad) |
XML | xmlns:xhtml="http://www.w3.org/1999/xhtml" ■xhtml:body | xhtml (previously declared XML namespace xhtml="http://www.w3.org/1999/xhtml") | cuerpo (elemento) |
Perl | DBI: | DBI (Perl module) | errstr (variable) |
Java | Java.util. Fecha | java.util (Java namespace) | Fecha (clase) |
Uniform Resource Name (URN) | urn:nbn:fi-fe19991055 | urn:nbn (Números Nacionales de Bibliografía) | fi-fe19991055 |
Handle System | 10.1000/182 | 10 (autoridad de nombres de mano) | 1000/182 (nombre local de la manija) |
Identificador de objetos digitales | 10.1000/182 | 10.1000 (publicador) | 182 (publicación) |
Dirección del MAC | 01-23-45-67-89-ab | 01-23-45 (identificador orgánico único) | 67-89-ab (NIC specific) |
PCI ID | 1234 abcd | 1234 (ID de proveedores) | abcd (d. de dispositivo) |
USB VID/PID | 2341 003f | 2341 (ID de proveedores) | 003f (ID del producto) |
SPARQL | Sidney | dbr (previously declared ontology, e.g. by specifying @prefix dbr: iere http://dbpedia.org/resource/año) | Sydney |
Delegación
La delegación de responsabilidades entre las partes es importante en las aplicaciones del mundo real, como la estructura de la World Wide Web. Los espacios de nombres permiten la delegación de la asignación de identificadores a múltiples organizaciones emisoras de nombres al tiempo que conservan la unicidad global. Una autoridad de registro central registra los nombres de espacios de nombres asignados. Cada nombre de espacio de nombres se asigna a una organización que posteriormente es responsable de la asignación de nombres en su espacio de nombres asignado. Esta organización puede ser una organización emisora de nombres que asigne los nombres por sí misma, u otra autoridad de registro que delegue partes de su espacio de nombres a diferentes organizaciones.
Jerarquía
Un esquema de nombres que permite la subdelegación de espacios de nombres a terceros es un espacio de nombres jerárquico.
Una jerarquía es recursiva si la sintaxis de los nombres de los espacios de nombres es la misma para cada subdelegación. Un ejemplo de jerarquía recursiva es el sistema de nombres de dominio.
Un ejemplo de una jerarquía no recursiva es el Nombre de recurso uniforme que representa un número de la Autoridad de números asignados de Internet (IANA).
Secretaría | Secretario | Ejemplo de identificación | Nombre del espacio | Namespace |
---|---|---|---|---|
Uniform Resource Name (URN) | Internet Assigned Numbers Authority | urn:isbn:978-3-16-148410-0 | urn | Formal URN namespace |
Formal URN namespace | Internet Assigned Numbers Authority | urn:isbn:978-3-16-148410-0 | ISBN | Números de libros estándar internacionales como nombres de recursos uniformes |
Número de artículo internacional (EAN) | GS1 | 978-3-16-148410-0 | 978 | Bookland |
International Standard Book Number (ISBN) | International ISBN Agency | 3-16-148410-X | 3 | Países de habla alemana |
German publisher code | Agentur für Buchmarktstandards | 3-16-148410-X | 16 | Mohr Siebeck |
Espacio de nombres versus alcance
Un nombre de espacio de nombres puede proporcionar contexto (alcance en informática) a un nombre, y los términos a veces se usan indistintamente. Sin embargo, el contexto de un nombre también puede ser proporcionado por otros factores, como la ubicación donde aparece o la sintaxis del nombre.
Sin un espacio de nombres | Con un espacio de nombres | |
---|---|---|
Alcance local | Plato de registro de vehículos | Sistema de archivos Hierarquía Estándar |
Alcance mundial | Identificador universalmente único | Sistema de nombres de dominio |
En lenguajes de programación
Para muchos lenguajes de programación, el espacio de nombres es un contexto para sus identificadores. En un sistema operativo, un ejemplo de espacio de nombres es un directorio. Cada nombre en un directorio identifica de forma única un archivo o subdirectorio.
Por regla general, los nombres en un espacio de nombres no pueden tener más de un significado; es decir, diferentes significados no pueden compartir el mismo nombre en el mismo espacio de nombres. Un espacio de nombres también se denomina contexto, porque el mismo nombre en diferentes espacios de nombres puede tener diferentes significados, cada uno apropiado para su espacio de nombres.
Las siguientes son otras características de los espacios de nombres:
- Los nombres en el espacio de nombres pueden representar objetos, así como conceptos, ser el espacio de nombres un lenguaje natural o étnico, un lenguaje construido, la terminología técnica de una profesión, un dialecto, un sociolecto o un lenguaje artificial (por ejemplo, un lenguaje de programación).
- En el lenguaje de programación Java, los identificadores que aparecen en los espacios de nombres tienen un nombre corto (local) y un nombre "calificado" único para usar fuera del espacio de nombres.
- Algunos compiladores (para idiomas como C++) combinan espacios de nombres y nombres para uso interno en el compilador en un proceso llamado nombre mangling.
Además de su uso técnico de lenguaje abstracto como se describió anteriormente, algunos lenguajes tienen una palabra clave específica que se usa para el control explícito del espacio de nombres, entre otros usos. A continuación se muestra un ejemplo de un espacio de nombres en C++:
#include ■iostream// Así es como uno lleva un nombre al alcance actual. En este caso, es// traerlos a alcance global.utilizando std::Cout;utilizando std::endl;namespace box1 {} int box_side = 4;}namespace box2 {} int box_side = 12;}int principal() {} int box_side = 42; Cout .. box1::box_side .. endl; // Productos 4. Cout .. box2::box_side .. endl; // Productos 12. Cout .. box_side .. endl; // Productos 42.}
Consideraciones informáticas
Un espacio de nombres en informática (a veces también llamado ámbito de nombre) es un contenedor o entorno abstracto creado para albergar una agrupación lógica de identificadores o símbolos únicos (es decir, nombres). Un identificador definido en un espacio de nombres está asociado solo con ese espacio de nombres. El mismo identificador se puede definir de forma independiente en varios espacios de nombres. Es decir, un identificador definido en un espacio de nombres puede o no tener el mismo significado que el mismo identificador definido en otro espacio de nombres. Los idiomas que admiten espacios de nombres especifican las reglas que determinan a qué espacio de nombres pertenece un identificador (no su definición).
Este concepto se puede ilustrar con una analogía. Imagine que dos empresas, X e Y, cada una asigna números de identificación a sus empleados. X no debe tener dos empleados con el mismo número de cédula, y lo mismo para Y; pero no es un problema que se utilice el mismo número de identificación en ambas empresas. Por ejemplo, si Bill trabaja para la empresa X y Jane trabaja para la empresa Y, entonces no hay problema para que cada uno de ellos sea el empleado #123. En esta analogía, el número de identificación es el identificador y la empresa sirve como espacio de nombres. No causa problemas que el mismo identificador identifique a una persona diferente en cada espacio de nombres.
En grandes programas o documentos informáticos es común tener cientos o miles de identificadores. Los espacios de nombres (o una técnica similar, consulte Emulación de espacios de nombres) proporcionan un mecanismo para ocultar identificadores locales. Proporcionan un medio para agrupar identificadores relacionados lógicamente en espacios de nombres correspondientes, lo que hace que el sistema sea más modular.
Los dispositivos de almacenamiento de datos y muchos lenguajes de programación modernos admiten espacios de nombres. Los dispositivos de almacenamiento utilizan directorios (o carpetas) como espacios de nombres. Esto permite que dos archivos con el mismo nombre se almacenen en el dispositivo siempre que se almacenen en directorios diferentes. En algunos lenguajes de programación (por ejemplo, C++, Python), los identificadores que nombran los espacios de nombres están asociados con un espacio de nombres adjunto. Por lo tanto, en estos lenguajes los espacios de nombres pueden anidarse, formando un árbol de espacios de nombres. En la raíz de este árbol se encuentra el espacio de nombres global sin nombre.
Usar en idiomas comunes
C
Es posible usar estructuras anónimas como espacios de nombres en C desde C99.
// helper.cestática int _add()int a, int b) {} retorno a + b;}const struct {} doble pi; int ()*añadir) ()int, int);} helper = {} 3.14, _add };// helper.hconst struct {} doble pi; int ()*añadir) ()int, int);} helper;// main.c#include Identificado.h#include "ayuda.h"int principal(){ printf()3 + 2 = %dn", helper.añadir()3, 2)); printf()"pi es %fn", helper.pi);}
C++
En C++, un espacio de nombres se define con un bloque de espacio de nombres.
namespace abc {} int bar;}
Dentro de este bloque, los identificadores se pueden usar exactamente como se declaran. Fuera de este bloque, el especificador de espacio de nombres debe tener un prefijo. Por ejemplo, fuera de namespace abc
, bar
debe escribirse abc::bar
para poder acceder. C++ incluye otra construcción que hace innecesaria esta verbosidad. Al agregar la línea
utilizando namespace abc;
a una pieza de código, el prefijo abc::
ya no es necesario.
Los identificadores que no se declaran explícitamente dentro de un espacio de nombres se consideran en el espacio de nombres global.
int Foo;
Estos identificadores se pueden usar exactamente como se declaran o, dado que el espacio de nombres global no tiene nombre, se puede anteponer el especificador de espacio de nombres ::
. Por ejemplo, foo
también se puede escribir ::foo
.
La resolución del espacio de nombres en C++ es jerárquica. Esto significa que dentro del espacio de nombres hipotético comida::sopa
, el identificador pollo
se refiere a comida::sopa::pollo
. Si comida::sopa::pollo
no existe, se refiere a comida::pollo
. Si no existen ni comida::sopa::pollo
ni comida::pollo
, pollo
se refiere a ::pollo
, un identificador en el espacio de nombres global.
Los espacios de nombres en C++ se usan con mayor frecuencia para evitar colisiones de nombres. Aunque los espacios de nombres se utilizan mucho en el código C++ reciente, la mayoría de los códigos antiguos no utilizan esta función porque no existía en las primeras versiones del lenguaje. Por ejemplo, toda la biblioteca estándar de C++ se define dentro de namespace std
, pero antes de la estandarización, muchos componentes estaban originalmente en el espacio de nombres global. Un programador puede insertar la directiva using
para eludir los requisitos de resolución del espacio de nombres y obtener compatibilidad con el código anterior que espera que todos los identificadores estén en el espacio de nombres global. Sin embargo, el uso de la directiva using
por motivos distintos a la compatibilidad con versiones anteriores (por ejemplo, conveniencia) se considera contrario a las buenas prácticas de código.
Java
En Java, la idea de un espacio de nombres está incorporada en los paquetes de Java. Todo el código pertenece a un paquete, aunque ese paquete no necesita ser nombrado explícitamente. Se accede al código de otros paquetes anteponiendo el nombre del paquete al identificador apropiado, por ejemplo, class String
en package java.lang
se puede denominar java.lang.String
(esto se conoce como el nombre de clase completo). Al igual que C++, Java ofrece una construcción que hace innecesario escribir el nombre del paquete (import
). Sin embargo, ciertas funciones (como la reflexión) requieren que el programador use el nombre completo.
A diferencia de C++, los espacios de nombres en Java no son jerárquicos en lo que se refiere a la sintaxis del lenguaje. Sin embargo, los paquetes se nombran de manera jerárquica. Por ejemplo, todos los paquetes que comienzan con java
son parte de la plataforma Java: el paquete java.lang
contiene clases básicas para el lenguaje y java.lang. reflect
contiene clases básicas específicamente relacionadas con la reflexión.
En Java (y Ada, C# y otros), los espacios de nombres/paquetes expresan categorías semánticas de código. Por ejemplo, en C#, namespace System
contiene código proporcionado por el sistema (the.NET Framework). La especificidad de estas categorías y la profundidad de las jerarquías difieren de un idioma a otro.
Los ámbitos de funciones y clases se pueden ver como espacios de nombres implícitos que están inextricablemente vinculados con la visibilidad, la accesibilidad y la vida útil del objeto.
C#
Los espacios de nombres se utilizan mucho en el lenguaje C#. Todas las clases de.NET Framework están organizadas en espacios de nombres, para que se utilicen con mayor claridad y para evitar el caos. Además, los programadores utilizan ampliamente los espacios de nombres personalizados, tanto para organizar su trabajo como para evitar colisiones de nombres. Al hacer referencia a una clase, se debe especificar su nombre completo, lo que significa espacio de nombres seguido del nombre de la clase,
Sistema.Consola.WriteLine()"¡Hola Mundo!");int i = Sistema.Convertir.ToInt32()"123");
o agregue una instrucción using. Esto elimina la necesidad de mencionar el nombre completo de todas las clases en ese espacio de nombres.
utilizando Sistema;Consola.WriteLine()"¡Hola Mundo!");int i = Convertir.ToInt32()"123");
En los ejemplos anteriores, System es un espacio de nombres, y Console y Convert son clases definidas dentro de System.
Pitón
En Python, los espacios de nombres están definidos por los módulos individuales y, dado que los módulos pueden estar contenidos en paquetes jerárquicos, los espacios de nombres también son jerárquicos. En general, cuando se importa un módulo, los nombres definidos en el módulo se definen a través del espacio de nombres de ese módulo y se accede a ellos desde los módulos que llaman utilizando el nombre completo.
# asumir modulea define dos funciones: func1() y func2() y una clase: Class1importación MóduloMódulo.func1()Módulo.func2()a = Módulo.Clase1()
La declaración from... import...
se puede usar para insertar los nombres relevantes directamente en el espacio de nombres del módulo que llama, y se puede acceder a esos nombres desde el módulo que llama sin el nombre calificado:
# asumir Modulea define dos funciones: func1() y func2() y una clase: Class1desde Módulo importación func1func1()func2() # esto fallará como un nombre indefinido, al igual que el nombre completo Modulea.func2()a = Clase1() # esto fallará como un nombre indefinido, al igual que el nombre completo Modulea. Clase1()
Dado que esto importa nombres directamente (sin calificación), puede sobrescribir nombres existentes sin advertencias.
Una forma especial de la declaración es from... import *
que importa todos los nombres definidos en el paquete nombrado directamente en el espacio de nombres del módulo de llamada. El uso de esta forma de importación, aunque admitida dentro del lenguaje, generalmente se desaconseja ya que contamina el espacio de nombres del módulo que realiza la llamada y hará que los nombres ya definidos se sobrescriban en el caso de conflictos de nombres.
Python también admite importar x como y
como una forma de proporcionar un alias o un nombre alternativo para que lo use el módulo de llamada:
importación numposo como npa = np.arange()1000)
Espacio de nombres XML
En XML, la especificación del espacio de nombres XML permite que los nombres de los elementos y atributos en un documento XML sean únicos, similar a la función de los espacios de nombres en los lenguajes de programación. Utilizando espacios de nombres XML, los documentos XML pueden contener nombres de elementos o atributos de más de un vocabulario XML.
PHP
Los espacios de nombres se introdujeron en PHP desde la versión 5.3 en adelante. Se puede evitar la colisión de nombres de clases, funciones y variables. En PHP, un espacio de nombres se define con un bloque de espacio de nombres.
# File phpstar/foobar.phpnamespace phpstar;clase FooBar{} público función Foo(): vacío {} eco ' Hola mundo, desde la función foo '; } público función bar(): vacío {} eco ' Hola mundo, de la barra de funciones '; }}
Podemos hacer referencia a un espacio de nombres de PHP de las siguientes maneras diferentes:
# Índice de archivo.php# Incluye el archivoincluir "phpstar/foobar.php";# Opción 1: prefija directamente el nombre de clase con el espacio de nombres$obj_foobar = nuevo phpstarFooBar();# Opción 2: importar el espacio de nombresuso phpstarFooBar;$obj_foobar = nuevo FooBar();# Option 2a: import " alias the namespaceuso phpstarFooBar como FB;$obj_foobar = nuevo FB();# Acceso a las propiedades y métodos de forma regular$obj_foobar-Foo();$obj_foobar-bar();
Emular espacios de nombres
En los lenguajes de programación que carecen de soporte de lenguaje para espacios de nombres, los espacios de nombres se pueden emular hasta cierto punto mediante el uso de una convención de nomenclatura de identificador. Por ejemplo, las bibliotecas de C, como libpng, suelen utilizar un prefijo fijo para todas las funciones y variables que forman parte de su interfaz expuesta. Libpng expone identificadores como:
png_create_write_struct png_get_signature png_read_row png_set_invalid
Esta convención de nomenclatura proporciona una seguridad razonable de que los identificadores son únicos y, por lo tanto, se pueden usar en programas más grandes sin colisiones de nombres. Asimismo, muchos paquetes originalmente escritos en Fortran (por ejemplo, BLAS, LAPACK) reservan las primeras letras del nombre de una función para indicar a qué grupo pertenece.
Esta técnica tiene varios inconvenientes:
- No escala bien para anidar espacios de nombres; los identificadores se vuelven excesivamente largos ya que todos los usos de los identificadores deben estar completamente calificados del espacio-nombre.
- Las personas u organizaciones pueden utilizar convenciones nombradas incoherentes, que pueden introducir la obfuscación no deseada.
- Las operaciones compuestas o "basadas en cuadrículas" en grupos de identificadores, basadas en los espacios de nombres en los que se declaran, se hacen inmutiles o inviables.
- En idiomas con longitud de identificación restringida, el uso de prefijos limita el número de caracteres que se pueden utilizar para identificar lo que hace la función. Este es un problema particular para los paquetes originalmente escritos en FORTRAN 77, que ofrece sólo 6 caracteres por identificador. Por ejemplo, el nombre de la función BLAS
DGEMM
la función indica que opera en números de doble precisión ("D") y matrices generales ("GE"), y sólo los dos últimos caracteres muestran lo que realmente hace: multiplicación de matriz-matrix (la "MM").
Hay varias ventajas:
- No se requieren herramientas de software especiales para localizar nombres en archivos código fuente. Un simple programa como grep basta.
- No hay conflictos de nombre.
- No hay necesidad de usar nombres, y por lo tanto no hay problemas potenciales de incompatibilidad.
Contenido relacionado
Identificador uniforme de recursos
Microsoft Word
Mac OS