Svantaggi dei puntatori [chiuso]

2

Mi chiedevo perché i puntatori non sono inclusi nelle lingue moderne ora a un giorno. Ho già fatto ricerche su questo su internet e ho scoperto poche teorie / ragioni:

  • La perdita di memoria è la preoccupazione maggiore durante l'utilizzo dei puntatori.
  • Se non gestito correttamente potrebbe rovinare l'intero progetto o applicazione.
  • Comprendere e utilizzare i puntatori nel modo migliore possibile richiede molto tempo.

Beh, ci sono alcuni problemi, ma se qualche lavoro è fatto correttamente su puntatori, ad esempio, gestione delle eccezioni, ecc. Penso che i puntatori possano ancora essere molto utili laddove richiesto. Gentilmente aiutami con questo.

    
posta FaizanRabbani 22.12.2014 - 16:38
fonte

2 risposte

9

Non sono sicuro di dove ti venga l'idea che le lingue moderne non hanno indicazioni. In Ruby, ad esempio, tutto è un puntatore. È vero che Ruby non ha una sintassi speciale o operazioni speciali per i puntatori, ma ciò non significa che non ce ne siano. Al contrario, infatti: poiché tutto è un puntatore, non è necessario distinguere tra puntatori e non puntatori, operazioni puntatore e operazioni senza puntatore. I puntatori sono così profondamente radicati nella lingua che non li vedi nemmeno.

Lo stesso vale per Python, Java, ECMAScript, Smalltalk e molti altri linguaggi.

Ciò che quelle lingue non supportano, è l'aritmetica del puntatore o la fabbricazione di un puntatore dal nulla. Ma poi di nuovo, alcune CPU non lo permettono neanche.

La CPU CISC originale per AS / 400 distingue tra puntatori e numeri interi. È possibile archiviare i puntatori e è possibile eseguire il puntatore di riferimento, ma non è possibile creare o modificare i puntatori. L'unico modo per ottenere un puntatore è se il kernel ne dà uno a te. Se si tenta di eseguire operazioni aritmetiche, si ottiene un numero intero che non può essere convertito o utilizzato come puntatore. Anche le moderne CPU PowerPC e POWER hanno una speciale modalità di indirizzo tag specificatamente per l'esecuzione di OS / 400 / i5 / OS / IBM i.

Go ha dei puntatori nel senso più tradizionale, come C. Ma non consente l'aritmetica del puntatore.

Altre lingue hanno puntatori e aritmetica dei puntatori, ma un insieme di restrizioni che garantiscono che i puntatori siano sempre validi, puntano sempre alla memoria inizializzata e puntano sempre alla memoria di proprietà dell'entità che esegue l'aritmetica.

    
risposta data 22.12.2014 - 17:29
fonte
3

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. ).

    
risposta data 22.12.2014 - 23:54
fonte

Leggi altre domande sui tag