Quasi tutti i linguaggi di programmazione moderni utilizzano in modo estensivo sotto la cappa: ogni istanza di un tipo Java derivato da Object
viene referenziata tramite un puntatore (o un oggetto simile a un puntatore), ad esempio.
La differenza è che quei linguaggi di programmazione non espongono alcun tipo di puntatore o operazioni sui valori del puntatore al programmatore. Non puoi prendere l'indirizzo di un'istanza Java Object
ed esaminarlo direttamente, né puoi usarlo per compensare un numero arbitrario di byte nell'istanza (anche se la JVM lo fa internamente). Il linguaggio semplicemente non fornisce alcun meccanismo al programmatore per farlo. Non definisce un metodo o un operatore per ottenere l'indirizzo di un oggetto; non definisce un metodo o un operatore per esaminare il contenuto di un indirizzo arbitrario; non definisce gli operatori binario +
o -
per lavorare con i tipi di indirizzo. L'operatore []
non si sposta solo da un indirizzo di base; è abbastanza intelligente da lanciare un'eccezione se si tenta di indicizzare oltre la fine dell'array.
Ricorda che C è stato sviluppato (almeno in parte) per implementare il sistema operativo Unix; poiché qualsiasi sistema operativo deve gestire la memoria, la lingua necessaria per fornire operazioni su indirizzi di memoria e altri tipi.
C divenne popolare per la programmazione delle applicazioni perché i compilatori C erano piccoli, veloci e producevano codice veloce. Essere in grado di manipolare la memoria ha accelerato un certo numero di operazioni. Sfortunatamente, essere in grado di manipolare direttamente la memoria ha anche aperto una latta enorme di worm per quanto riguarda la sicurezza, la correttezza, ecc. Tutto dal worm Morris al bug Heartbleed è stato abilitato dalla capacità di C di manipolare la memoria. Inoltre, la sintassi del puntatore di C potrebbe essere fonte di confusione, soprattutto perché unary *
ha precedenza inferiore rispetto agli operatori postfix come []
, ()
, ++
, .
, ->
, ecc. Il fatto che le espressioni di matrice " decadere "per puntare i tipi porta anche a problemi per le persone che non conoscono veramente bene la lingua.
Quindi i moderni linguaggi di programmazione non espongono i puntatori come fa C per evitare molti di questi problemi. Tuttavia, si noti che la maggior parte dei contemporanei di C (Pascal, Fortran, BASIC, ecc.) Non espone le operazioni sui valori del puntatore, anche se hanno usato la semantica del puntatore sotto il cappuccio (passando argomenti per riferimento, blocchi COMMON, ecc. ).