2010-08-06 14 views
8

Storicamente, perché sembra quasi che tutti e il loro fratellino definiscano le proprie convenzioni di chiamata? Hai C, C++, Windows, Pascal, Fortran, Fastcall e probabilmente un milione di altri che non pensavo di menzionare. Non dovrebbe una convenzione essere la più efficiente per la stragrande maggioranza dei casi d'uso? C'è mai una buona ragione per preferire l'una rispetto all'altra?Perché ci sono così tante diverse convenzioni di chiamata?

+0

+1 Secondo questa domanda! – Poni

risposta

10

Le convenzioni di chiamata citate sono state progettate nel corso dei decenni per diverse lingue e hardware diversi. Avevano tutti obiettivi diversi. cdecl supportava argomenti variabili per printf. stdcall ha prodotto un codice di codice più piccolo, ma senza argomenti variabili. Fastcall potrebbe velocizzare notevolmente le prestazioni di funzioni semplici con solo uno o due argomenti su macchine precedenti (ma raramente è una velocità attuale).

Nota che quando è stato introdotto x64, almeno su Windows, è stato progettato per una singola convenzione di chiamata.

Raymond Chen ha scritto una grande serie sulla storia delle convenzioni di chiamata, è possibile avviare here.

+2

Amo l'articolo di Raymond Chen. Ha risposto a molte domande. – dsimcha

1

Perché storicamente tutti e il loro fratello minore hanno definito le proprie convenzioni di chiamata. Sono stati tutti creati per scopi diversi e quindi guidati da diverse esigenze di prestazioni. Ad esempio, C++ favorisce le ottimizzazioni per il passaggio del parametro this.

1
  • Alcuni di questi sono più efficienti per quanto riguarda le prestazioni e altri più efficienti in termini di dimensioni del codice.
  • Alcune funzioni (conteggio di argomenti variabili) sono supportate solo con alcune convenzioni.

Ulteriori informazioni: http://en.wikipedia.org/wiki/X86_calling_conventions

0

Parte del motivo è l'architettura sottostante del microprocessore (o processore). La maggior parte delle lingue si avviano su una CPU specifica e restano un po 'invischiate con quell'architettura. Ad esempio, il vecchio computer della serie Univac 1100 non aveva nemmeno uno stack di chiamate!

Un'altra parte del motivo è che non è possibile prevedere la soluzione migliore finché non si sono tentati diversi modi di fare le cose.

0

Sono creati per scopi diversi e con diversi sistemi di ottimizzazione.

Ad esempio, per ridurre "Stack Overflow" (nessun gioco di parole) alcune persone hanno pensato a varie idee per chiamare la funzione per rendere impossibile lo stack overflow.

Un'altra istanza è il calcolo Lambda. Per non essere troppo vago, ma in Lambda, le funzioni possono solo passare un argomento e restituire un valore, e quindi hanno anche bisogno delle proprie convenzioni di chiamata.

Problemi correlati