Onko ”call site” jonkinlainen kääntäjän tuottama automaattikoodi – törmään tähän termiin usein ja kuulostaa siltä, että soittomenetelmää kutsutaan yksinkertaisesti nimellä ”call site” – mikä kirjaimellisesti kuulostaa hyvältä, mutta uskon, että siinä on joitain syvempiä mutkia. Ja jos ”puhelusivusto” on kääntäjän luomaa koodia – missä olosuhteissa sitä vaaditaan?
Vaikka puhunkin C # .Net -yhteydessä, mutta tämä näyttää olevan tavallinen terminologia. Kiitän selkeästä ja tarkasta selityksestä, jossa on joitain esimerkkejä.
Kommentit
- Soitussivuston käsite on sekä lähdekoodissa että automaattisessa -luodun objektikoodin.
- Haluat ehkä tutkia, miten puhelusivustot luodaan dynaamista operaatiota varten C # 4: ssä ja sitä uudemmissa. Ne ovat varsin mielenkiintoisia.
- @EricLippert Kiitos. Onneksi löysin linkin , jossa kuvasit sitä melko kauniisti. En kuitenkaan löytänyt yhtään blogiasi, joka olisi tarkentanut puhelusivustojen luomista.
Vastaa
”Soita sivustolle ”Viittaa paikkaan, jossa funktiota tai menetelmää kutsutaan. Se on yleinen termi kääntäjän rakentamisessa, eikä se ole erityinen C #: lle.
foo(); // call site void foo() { ... } // function definition
Soittosivusto ei ole mikään erityinen luotu koodi. Mutta puhelupaikassa kääntäjä antaa ohjeita toiminnon kutsumiseksi. Yleensä nämä:
- Tallenna nykyinen konteksti pinokehykseen.
- Tallenna kaikki argumentit kohdefunktion kutsuvan käytännön mukaisesti.
- Kutsu kohdefunktio, joka saattaa edellyttää menetelmän lähettämistä.
- Hae palautusarvo kutsuvan käytännön mukaisesti.
- Palauta konteksti pinokehyksestä.
Menetelmän lähetys saattaa vaatia monimutkaisen koodin suorittamisen, jotta löydetään funktio, jota pitäisi kutsua. Tämä on tarpeen, kun kutsutaan virtual
-menetelmiä, erityisesti menetelmiä käyttöliittymän kautta. Menetelmän täydellinen lähetysmenettely voi olla melko kallista (usein O (n) toteutettujen rajapintojen määrässä tai O (n) käytettävissä olevien menetelmien lukumäärässä). Mutta suurimman osan ajasta (tyypillisesti 70–90%) puhelusivusto näkee samantyyppisiä esineitä. Sitten on järkevää tallentaa välimuisti menetelmän haun tulos. Kääntäjä saattaa sitten luoda tällaisen koodin soittosivustolle:
static lastType = null; static lastMethod = null; if (type(instance) != lastType) { lastType = type(instance); lastMethod = performMethodLookup(instance, methodName); } result = lastMethod(instance, args);
Tätä kutsutaan monomorfiseksi inline-välimuisti . .NET CLR kehitti hieman monimutkaisemman lähestymistavan nimeltä Virtual Stub Dispatch . Sen sijaan, että tekisit lähetyksen puhelupaikassa, suoritusaikainen JIT-kokoaa tynkämenetelmät. Koko menetelmän lähetysprosessin suorittamiseen ja välimuistiin tallennetun menetelmän käyttöön on olemassa erilaisia tukijalkoja. Soitussivustolla meillä on sitten puhelu vain tynkälle, ja tynkä välittää puhelun varsinaiselle kohteelle. Tämän puhelusivuston tilastoista riippuen puhelupaikan konekoodit korjataan käyttämään eri tynkeä.
Vastaa
Soitussivuston tyypillisin käyttö on todennäköisesti se, että kuten Wikipediassa tällä hetkellä ilmoitetaan : se ei ole muuta kuin paikka jossakin koodissa, johon puhelu toiminto tai aliohjelma tehdään. Se on täysin yleinen termi, jota voidaan soveltaa kaikentyyppisiin kieliin (eikä todellakaan mitään tekemistä dynaamisen ohjelmoinnin kanssa!).
Kuulen yleensä käytetyn termin (vastakohtana vain termi ”puhelu”), jotta voidaan tehdä selväksi, että keskustellaan koodin syntaksista ja semantiikasta, jossa funktiota / menetelmää / alirutiinia kutsutaan, vastakohtana puhelun taustalla olevalle semantiikalle tai semantiikalle toiminnon / menetelmän määrittelyssä: tällä tavalla ei ole kyse kääntäjästä tai mistään generoivasta koodista (vaikka termiä sovelletaan edelleen kääntäjän / ajonaikaisen koodin luomaan koodiin, kuten mielestäni amon on jo keskustellut), se on puheeksi käännetyn koodin tuomisesta kontekstiin ja joskus koodin välittömään läheisyyteen.
Tällainen kuva minulla on päähäni:
call-site call call-target/method definition --> --> int.TryParse(str, out i); (runtime) public static bool TryPars(...
” Puhelu-sivusto ”on hyödyllinen termi puhuaksesi puhelun syntaksista ja soittajalle vaikuttavista semantiikoista (yksityiskohtaisesti amonilla). Harkitaan esimerkiksi uutta in
-muunnosta C #: ssä. ”Kutsu”, joka välittää argumentin ”in” -tilaan, liittyy tiettyihin semantiikoihin (se välitetään viitteellä, mahdollisesti sen jälkeen, kun kopio), mutta tätä ei välttämättä poisteta syntaksista ”puhelupaikassa”, jossa in
ei ole pakollinen. Ajatuksena on, että puhelusivuston semantiikka (ts. Käyttäytyminen, joka vaikuttaa soittajaan / puhelusivustoon), jos argumentti välitetään viitteellä in
, on lähellä tarpeeksi niille, jotka kulkevat arvon mukaan, sitä ei tarvitse erottaa syntaksilla puhelupaikassa .En ole samaa mieltä tämän väitteen kanssa, ja minulla on vaikea keskustella siitä ilman termiä, kuten ”call-site”!
Toinen esimerkki: dynaamisella puhelulla (esim. Virtuaalinen / käyttöliittymämenetelmä) on jonkin verran monimutkaiset ajonaikaiset käyttäytymismallit (jälleen kerran, amon yksityiskohtaisesti) ja kääntöhetkellä ei tiedetä, mitä menetelmää kutsutaan, mutta kaikki ”puhelusivusto” välittää on kyseisen puhelun lähettämisen semantiikka: jos soitat ToString()
object
-kohdassa, et todellakaan välitä, että se on todella string
puhelupaikassa; välität vain siitä, että object
paljastaa virtuaalisen ToString()
-menetelmän (se kestää ajonaikaisesti selvittää mikä menetelmä todella kutsutaan). Itse asiassa puhelupaikassa (esim. C #: ssä) ei välttämättä syntaksista ole selvää, onko kyseessä virtuaalinen puhelu: Virtuaalisen ja ei-virtuaalisen puhelun eroa pidetään usein tarpeettomana puhelun aikana site että sitä ei tarvitse eritellä ohjelmoijalle puhelupaikassa (vaikka kääntäjän / ajonaikaisen on elintärkeää soittaa mielekäs puhelu)
Viimeinen esimerkki: ota huomioon C # ”s ref
ja C ++” s &
: molempien puhelupaikan semantiikka kieli ovat melkein samat molemmilla kielillä: viite välitetään arvon sijaan, mutta jokaisella kielellä on erilainen syntaksin kutsupaikassa, jossa C # vaatii ref
ja C ++ ei vaadi &
(tai jotain sellaista). Jälleen kielisuunnittelijat ovat tehneet joitain syntaksipäätöksiä siitä, kuinka puhelut esitetään puhelupaikassa, puhelupaikan semantiikan mukaan. (Pidän parempana C # -soittosivuston syntaksista, koska se paljastaa puhelu-sivuston semantiikan, joka mielestäni minun pitäisi ohjelmoijana tunnistaa, kun soitin tällaisen puhelun). Toivottavasti on selvää, että menetelmän määritelmän on tiedettävä, että se saa parametrin viitteenä, koska se muuttaa sen muokkaamisen käyttäytymistä (esim. =
). Voisit kuitenkin väittää, että ajonaikainen ei ”t välitä (sellaisilla staattisesti kirjoitetuilla kielillä, joissa ajonaikainen lähetys on ilmoitettu nimellisesti): sen on vain saatava tämä arvo soittajalta henkilölle , se ei välitä, onko se viite vai ei, se on huolenaihe puhelusivustolle ja puhelutavoitteelle.
Löysemmin sanottuna ”puhelusivusto” saattaa viitata koodi, joka ilmaisee puhelun, sekä sen ympärillä oleva ”liitetty” koodi (toisin kuin vain ”puhelu”). Esimerkiksi C #: ssä voidaan viitata näennäismuuttujan määrittelemiseen puhelupaikan kohdalla, esim. soitettaessa menetelmään TryParse
:
int dummy; bool looksLikeAnInt = int.TryParse(str, out dummy);
Koko tätä ”lohkoa” voidaan pitää osana puhelusivustoa. Pidän tätä vähemmän tarkana merkityksenä, mutta se ei estä minua käyttämästä sitä.