Névkötés - Name binding
A programozási nyelvek , név kötési az egyesület entitások (adatok és / vagy kód) a azonosítókkal . Egy objektumhoz kötött azonosítóról azt mondják, hogy hivatkozik arra az objektumra. A gépnyelvek nem tartalmazzák az azonosítók fogalmát, de a név-objektum összerendeléseket mint szolgáltatásokat és a programozó jelölését a programozási nyelvek valósítják meg. A kötés szorosan kapcsolódik a hatókörhöz , mivel a hatókör meghatározza , hogy mely nevek mely objektumokhoz kötődnek - a programkód mely helyein ( lexikailag ) és a lehetséges végrehajtási utak egyikén ( időbeli ).
Az azonosító idhasználatát olyan kontextusban, amely kötést hoz idlétre, kötésnek (vagy meghatározónak) nevezzük. Minden más esetben (például kifejezésekben, hozzárendelésekben és alprogramhívásokban) egy azonosító azt jelöli, amihez kötődik; az ilyen eseményeket alkalmazott eseményeknek nevezzük.
Kötési idő
- A statikus kötés (vagy korai kötés ) a program futtatása előtt végrehajtott névkötés.
- A dinamikus kötés (vagy késői vagy virtuális kötés ) névkötés, amelyet a program futása közben hajtanak végre.
A statikus kötés példája a közvetlen C függvényhívás: az azonosító által hivatkozott függvény futás közben nem változhat.
De a dinamikus kötés példája a dinamikus diszpécser , mint például a C ++ virtuális módszer hívásában. Mivel a polimorf objektum specifikus típusa futásidő előtt nem ismert (általában), a végrehajtott függvény dinamikusan kötött. Vegyük például a következő Java kódot:
public void foo(java.util.List<String> list) {
list.add("bar");
}
Listegy felület , ezért listkell vonatkoznia altípus belőle. Ez egy utalás egy LinkedList, egy ArrayList, vagy valamilyen más altípus az List? A tényleges módszer, amelyre hivatkozik, addfutásig nem ismert. A C-ben a dinamikus kötés ilyen példánya lehet egy olyan függvény hívása, amelyre egy olyan változó mutat, vagy egy olyan funkciómutatótípus kifejezése, amelynek értéke nem ismert, amíg a futás közben ténylegesen ki nem értékelik.
Visszacsatolás és mutáció
Az újrakötést nem szabad összekeverni a mutációval.
- Az újrakötés a hivatkozási azonosító megváltoztatása .
- A mutáció a hivatkozott entitás változása .
Vegye figyelembe a következő Java kódot:
LinkedList<String> list;
list = new LinkedList<String>();
list.add("foo");
list = null;
Az azonosító listkezdetben semmire sem hivatkozik ( inicializálatlan ); ezután visszavág egy objektum hivatkozására (a húrok összekapcsolt listája). A hivatkozott listát, listamelyre hivatkozik, ezután mutálják, hozzáadva egy karakterláncot a listához. Végül listvisszapattan null.
Késői statikus
A késői statikus kötés a kötés egyik változata a statikus és a dinamikus kötés között. Tekintsük a következő PHP példát:
class A
{
public static $word = "hello";
public static function hello() { print self::$word; }
}
class B extends A
{
public static $word = "bye";
}
B::hello();
Ebben a példában a PHP tolmács a selfbelsejében lévő kulcsszót A::hello()az osztályhoz köti A, és így a hívás a B::hello()"hello" karakterláncot eredményezi. Ha a szemantikája self::$wordkésői statikus kötésre épült volna, akkor az eredmény "viszlát" lett volna.
A PHP 5.3-as verziójától kezdve a késői statikus kötés támogatott. Pontosabban, ha self::$worda fentiekre static::$worda következő blokkban bemutatottak szerint módosítanánk , ahol a kulcsszó staticcsak futás közben lenne kötve, akkor a (z) hívás eredménye B::hello()"bye" lenne:
class A
{
public static $word = "hello";
public static function hello() { print static::$word; }
}
class B extends A
{
public static $word = "bye";
}
B::hello();
Lásd még
- Késői kötés
- Elágazótábla- módszer a névkötés alkalmazásához elágazótáblán vagy függvénymutatókon keresztül
- Dinamikus feladás
- Magasabb rendű absztrakt szintaxis (HOAS)