A számítástechnikában a névtér olyan jelek (nevek) halmaza, amelyeket különböző típusú objektumok azonosítására és hivatkozására használnak. Ez biztosítja, hogy egy adott objektumkészlet minden eleme egyedi nevet kapjon, így könnyen azonosítható.
A névterek általában hierarchikus szerkezetben vannak kialakítva, hogy lehetővé tegyék a nevek újrafelhasználását különböző szövegösszefüggésekben. Analógiaként gondolhatunk például az emberek elnevezési rendszerére, ahol minden személynek van egy keresztneve és egy családneve, ami közös a rokonaival. Ha a családtagok keresztnevei csak a családon belül egyediek, akkor minden személyt egyértelműen azonosíthatunk a keresztneve és a családneve kombinációjával; csak egy Jane Doe van, bár lehet több Jane is. A Doe család névtérében a „Jane" elegendő a személy egyértelmű jelöléséhez, míg az „összes ember" globális névtéren belül a teljes név használata szükséges.
A névterekre jó példák a fájlrendszerek, amelyek neveket rendelnek a fájlokhoz. Egyes programozási nyelvek névterekbe rendezik változóikat és „szubrutinjaikat”. A számítógépes hálózatok és az elosztott rendszerek neveket rendelnek az erőforrásokhoz, például számítógépekhez, nyomtatókhoz, webhelyekhez és távoli fájlokhoz. Az operációs rendszerek feloszthatják a kernel erőforrásait elszigetelt névterekkel a virtualizációs tárolók támogatása érdekében.
Hasonlóan, a hierarchikus fájlrendszerek könyvtárakba szervezik a fájlokat. Minden könyvtár külön névtér, tehát a „levelek” és a „számlák” könyvtárban is lehet egy „to_jane” nevű fájl.
A programozásban a névtereket általában arra használják, hogy a szimbólumokat és azonosítókat egy adott funkcionalitás köré csoportosítsák, és elkerüljék a névütközéseket olyan azonosítók között, amelyek ugyanazt a nevet viselik.
A hálózati kommunikációban a Domain Name System hierarchikus névterekbe szervezi a webhelyeket (és más erőforrásokat).
Névütközések Az elemek nevét a fejlesztő határozza meg. Ez gyakran ütközést eredményez a különböző XML-alkalmazásokból származó XML-dokumentumokkal való keverésekor.
Ez az XML HTML-tábla információkat tartalmaz:<table> <tr> <td>Apples</td> <td>Oranges</td> </tr> </table>Ez az XML információkat tartalmaz egy „table”-ről, asztalról (azaz egy bútorról):<table> <name>Mahogany Coffee Table</name> <width>80</width> <length>120</length> </table>Ha ezeket az XML-töredékeket összeadnák, névütközés lépne fel. Mindkettő tartalmaz egy <table>...</table> elemet, de az elemek eltérő tartalommal és jelentéssel bírnak.
Az XML-elemző nem tudja, hogyan kezelje ezeket a különbségeket.
Megoldás előtaggal Az XML-ben előforduló névütközések könnyen elkerülhetők névelőtag használatával.
A következő XML megkülönbözteti a HTML-táblázat „table”-jét és a bútorokkal kapcsolatos „table”-t úgy, hogy az elemek elején „h" és „f" előtagot ír elő.<h:table> <h:tr> <h:td>Apples</h:td> <h:td>Oranges</h:td> </h:tr> </h:table>
<f:table> <f:name>Mahogany Coffee Table</f:name> <f:width>80</f:width> <f:length>120</f:length> </f:table>
Elnevezési rendszer A névtérben lévő név névtérnévből és helyi névből áll. A névtér nevét általában a helyi név előtagjaként alkalmazzák.
Kibővített Backus–Naur-formában: név = <névtér neve> elválasztó <helyi név> Ha a helyi neveket önmagukban használjuk, a névfeloldást használják annak eldöntésére, hogy egy adott helyi név melyik névre utal (ha van ilyen).
Példák +Példák nevekre egy névtérbenKontextusNévNévtér neveHelyi névElérési út/home/user/readme.txt/home/user (könyvtár)readme.txt (fájl név)Tartománynévwww.example.comexample.com (tartománynév)www (levéltartománynév)C++std::arraystd (C++ névtér)array (struktúra)UN/LOCODEUS NYCUS (ország vagy terület)NYC (helység)XMLxmlns:xhtml="http://www.w3.org/1999/xhtml" <xhtml:body>xhtml (korábban deklarált XML névtér xhtml="http://www.w3.org/1999/xhtml")body (elem)Perl$DBI::errstr$DBI (Perl modul)errstr (változó)Javajava.util.Datejava.util (Java névtér)Date (osztály)Egységes erőforrásnév (URN)urn:nbn:fi-fe19991055urn:nbn (National Bibliography Numbers)fi-fe19991055Handle System10.1000/18210 (névadó jogosultság kezelése)1000/182 (helyi név kezelése)Digitális objektumazonosító10.1000/18210.1000 (kiadó)182 (kiadvány)MAC-cím01-23-45-67-89-ab01-23-45 (szervezetileg egyedi azonosító)67-89-ab (NIC specifikus)PCI ID1234 abcd1234 (vendor ID)abcd (eszközazonosító)USB VID/PID2341 003f2341 (vendor ID)003f (termékazonosító)SPARQLdbr:Sydneydbr (korábban deklarált ontológia, pl. @prefix dbr megadásával: <http://dbpedia.org/resource/>)Sydney
Delegáció A felelősségek delegálása fontos az alkalmazásokban, mint például a World Wide Web szerkezetében. A névterek lehetővé teszik az azonosítók kiosztásának delegálását több neveket kibocsátó szervezetnek, miközben globális egyediséget biztosítanak. Egy központi regisztrációs hatóság regisztrálja a kiosztott névtérneveket. Minden névtérnév egy szervezethez van kiosztva, amely később felelős a nevek kiosztásáért a hozzájuk rendelt névtérben. Ez a szervezet lehet egy neveket kibocsátó szervezet, amely maga rendeli hozzá a neveket, vagy egy másik regisztrációs hatóság, amely további részeket delegál névterükből különböző szervezeteknek.
Hierarchia A hierarchikus névtér, olyan névképzési séma, amely lehetővé teszi a névtér részeknek történő aldelegálását harmadik feleknek.
Egy hierarchia rekurzív, ha a névtérnevek szintaxisa ugyanaz minden aldelegálás esetén. Egy példa a rekurzív hierarchiára a Domain névrendszer.
Egy nem rekurzív hierarchia példája az Internet Assigned Numbers Authority (IANA) számot reprezentáló Uniform Resource Name (URN). +Hierarchikus névtér felbontás példája az urn:isbn:978-3-16-148410-0 esetében, ami az „A tudományos felfedezés logikája" című Karl Popper könyv azonosítója, a 10. kiadásra vonatkozik." Iktató hivatal Regisztráló Példa azonosító Névtér neve Névtér Egységes erőforrásnév (URN)Internet Assigned Numbers Authority urn:isbn:978-3-16-148410-0 urna Formális URN névtér Formális URN névtérInternet Assigned Numbers Authority urn:isbn:978-3-16-148410-0 ISBN [rfc:3187 Nemzetközi szabványos könyvszámok, mint egységes forrásnevek] Nemzetközi cikkszám (EAN) GS1 978-3-16-148410-0 978 Bookland Nemzetközi szabványos könyvszám (ISBN)International ISBN Agency 3-16-148410-X 3 német nyelvű országok Német kiadói kód Agentur für Buchmarktstandards 16 Mohr Siebeck
Névterek és hatáskör (scope) közötti különbség A névtér neve kontextust biztosíthat (a számítástechnikában hatókört)a névhez, és a kifejezéseket néha felcserélhetően használják. A név kontextusát azonban más tényezők is megadhatják, például az előfordulási hely vagy a név szintaxisa. +Példák elnevezési rendszerekre helyi és globális hatókörrel, névterekkel és névterekkel Névtér nélkül Névtérrel Helyi hatókör Gépjármű rendszámtábla Fájlrendszer-hierarchia szabvány Globális hatókör Univerzálisan egyedi azonosító Domain Name System
Programozási nyelvekben Sok programozási nyelv esetén a névtér a neveik kontextusa. Egy operációs rendszerben a névtér példája lehet egy könyvtár. Egy könyvtárban minden név egyértelműen azonosít egy fájlt vagy alkönyvtárat.
Általános szabály, hogy a névterekben a neveknek nem lehet több jelentése; azaz különböző jelentések nem oszthatják meg ugyanazt a nevet ugyanabban a névtérben. A névtér emiatt kontextusnak is nevezhető, mert ugyanaz a név különböző névterekben más-más jelentéssel bír, amely megfelel az adott névtérnek.
A névtérnek további jellemzői a következők:
A névtérben lévő nevek objektumokat és fogalmakat is képviselhetnek, legyen a névtér természetes vagy etnikai nyelv, konstruált nyelv, dialektus, szociolektus vagy mesterséges nyelv (pl. programozási nyelv). A Java programozási nyelvben a névterekben megjelenő azonosítóknak van egy rövid (helyi) neve és egy egyedi hosszú „minősített" név a névtéren kívüli használatra. Egyes fordítók (például a C++ nyelvekhez)a névtereket és a neveket a fordító belső használatára egyesítik a name mangling nevű folyamatban .
A fent leírt absztrakt nyelvi technikai használaton túlmenően egyes nyelvek tartalmaznak egy speciális kulcsszót, amelyet többek között az explicit névtér szabályozására használnak. Az alábbiakban egy példa látható a C++ névterére:#include <iostream>
// This is how one brings a name into the current scope. In this case, it's // bringing them into global scope. using std::cout; using std::endl;
namespace box1 { int box_side = 4; }
namespace box2 { int box_side = 12; }
int main() { int box_side = 42; cout << box1::box_side << endl; // Outputs 4. cout << box2::box_side << endl; // Outputs 12. cout << box_side << endl; // Outputs 42. }
Számítástechnikai szempontok A számítástechnikában a névtér (néha névtartománynak is nevezik) egy absztrakt tároló vagy környezet, amelyet egyedi azonosítók vagy szimbólumok (azaz nevek) logikai csoportosítására hoztak létre. Egy névtérben definiált azonosító csak ahhoz a névtérhez tartozik. Ugyanaz az azonosító egymástól függetlenül definiálható több névtérben. Tehát egy azonosító, amely egy névtérben van definiálva, jelenti ugyanazt is vagy jelenti mást is, mint ugyanaz az azonosító egy másik névtérben. A névtereket támogató nyelvek leírják azokat a szabályokat, amelyek meghatározzák, hogy egy azonosító melyik névtérhez tartozik.
Ezt a fogalmat egy analógiával lehet szemléltetni. Képzeljük el, hogy két vállalat, X és Y, mindegyiküknek van dolgozóihoz hozzárendelve azonosítószám. Az X vállalatnak nem lehet két dolgozója ugyanazzal az azonosítószámmal, és ugyanez igaz a Y vállalatra is. Azonban nem probléma, ha ugyanaz az azonosítószám mindkét vállalatnál használatban van. Például, ha Bill az X vállalatnál dolgozik, és Jane az Y vállalatnál, akkor nem probléma, hogy mindketten a 123-as dolgozói azonosítót kapják. Ebben az analógiában az azonosító a dolgozói azonosítószám és a vállalat szolgál a névtérként. Nem okoz problémát, hogy ugyanaz az azonosító különböző személyeket azonosítson meg a különböző névterekben.
Nagy programokban vagy dokumentumokban gyakran száznál is több azonosító található. A névterek lehetővé teszik a helyi azonosítók elrejtését. Biztosítják a logikailag kapcsolódó azonosítók megfelelő névterekbe történő csoportosítását, ezáltal modulárisabbá téve a rendszert.
Adattároló eszközök és sok modern programozási nyelv támogatja a névtereket. Az adattároló eszközök könyvtárakat (vagy mappákat) használnak névterekként. Ez lehetővé teszi, hogy két azonos nevű fájl legyen tárolva az eszközön, feltéve, hogy különböző könyvtárakban vannak tárolva. Néhány programozási nyelvben (például C++, Python) a névtereket elnevező azonosítók maguk is kapcsolatban állnak egy beágyazó névtérrel. Így ezekben a nyelvekben a névterek egymásba ágyazódhatnak, létrehozva egy névtérfa struktúrát. Ennek a fának a gyökerénél található a globális névtér.
Használata a nyelvekben
C A C99 óta lehetőség van névtelen struktúrák névtérként való használatára C- ben.// helper.c static int _add(int a, int b) { return a + b; }
const struct { double pi; int (*add) (int, int); } helper = { 3.14, _add };
// helper.h const struct { double pi; int (*add) (int, int); } helper;
// main.c #include <stdio.h> #include „helper.h"
int main(){ printf("3 + 2 = %d\n", helper.add(3, 2)); printf("pi is %f\n", helper.pi); }
C++ A C++ nyelvben egy névteret egy névtérblokk határoz meg. namespace abc { int bar; }Ezen a blokkon belül az azonosítók pontosan úgy használhatók, ahogyan deklarálva vannak. Ezen a blokkon kívül a névtér-meghatározót előtaggal kell ellátni. A C++ tartalmaz egy másik konstrukciót is, amely szükségtelenné teszi ezt a bőbeszédűséget. Az alábbi hozzáadásával: using namespace abc; az abc:: előtagra már nincs szükség.
A névtérben kifejezetten nem deklarált azonosítók a globális névtérben találhatók.int foo;Ezek az azonosítók pontosan úgy használhatók, ahogyan deklarálva vannak, vagy mivel a globális névtér névtelen, a névtér-meghatározó :: előtagként is megadható. Például foo írható is ::foo.