Perché alcuni linguaggi orientati agli oggetti consentono al programmatore di utilizzare tipi primitivi?

6

Perché alcuni linguaggi orientati agli oggetti consentono al programmatore di utilizzare tipi di dati primitivi?

Non ci sono abbastanza classi come Integer, Boolean, ecc.?

    
posta yfklon 12.04.2013 - 11:42
fonte

3 risposte

10

A volte è necessario il pieno controllo delle dimensioni che un numero occupa in memoria. Oppure potresti voler elaborare direttamente i dati binari che hai letto da un file o copiare dalla memoria video se elabori uno screenshot o prendi da qualche porta, connessione di rete, qualunque cosa.

In teoria potresti aggiungere più classi specializzate nell'elaborazione di dati binari, ma in base alla cronologia effettiva di una determinata lingua e quali sono esattamente le sue intenzioni di utilizzo in un determinato momento.

In alcuni casi, anche la performance può essere una ragione. Soprattutto con linguaggi compilati altamente ottimizzati.

Ci sono alcuni linguaggi che non hanno le primitive e sono "solo oggetto".

    
risposta data 12.04.2013 - 11:47
fonte
6

Poiché il 90% o più del tempo usa comunque oggetti primitivi con semantica primitiva, non la semantica degli oggetti tipici. Il compilatore deve ritagliare privilegi e restrizioni speciali per oggetti primitivi, come:

  • Vengono automaticamente istanziati per un valore letterale.
  • Devono essere immutabili, in modo da consentirgli di ottimizzare i tipi nativi dell'architettura di un computer.
  • Hanno semantica del valore per l'assegnazione, quando altri oggetti di solito hanno una semantica di riferimento per l'assegnazione.
  • Sono autorizzati a sovraccaricare o definire gli operatori, anche se altri oggetti non sono autorizzati a farlo.
  • Possono essere usati come costanti e come parte di espressioni costanti in fase di compilazione.

Se realizzerete un oggetto primitivo che il compilatore tratta in modo diverso da ogni altro tipo di oggetto, alcuni designer di linguaggi ritengono che si possa anche fornire una sintassi separata ed esplicita per le primitive. In altre parole, se int e Integer hanno un comportamento diverso e sono utilizzati in contesti diversi, ha senso renderli diversi tipi.

Rende la lingua più coerente internamente e semplifica la traduzione delle istruzioni native molto . È anche più coerente con il modello mentale della maggior parte dei programmatori. Anche nelle lingue in cui le primitive sono oggetti, la maggior parte dei programmatori non considera un'istruzione come int a = 0; per avere tutto il sovraccarico di oggetti regolari, e avrebbero ragione.

In altre parole, gli oggetti primitivi non sono "proprio come" altri oggetti, non importa quanto grande sia una somiglianza superficiale. Alcune lingue semplicemente non cercano di nascondere le differenze dal programmatore.

    
risposta data 12.04.2013 - 19:13
fonte
3

La ragione ultima sono le prestazioni. C'è un problema dei giorni nostri in cui le persone si sono abituate alle astrazioni di altissimo livello fornite da alcuni linguaggi e pensano che questo sia tutto quello che c'è da fare sul computer, purtroppo l'hardware del computer funziona ancora come negli anni '70.

Questo significa che, sebbene ti piacerebbe pensare che un linguaggio elegante non dovrebbe supportare le primitive e che tutto ha bisogno di una classe base predefinita e ogni tipo deve essere una classe, il livello di astrazione implicato ucciderebbe in modo assoluto le prestazioni del tuo programmi - semplicemente perché il computer funziona ancora sui tipi primitivi. Questo significa che le tue app di OO sono più lente di quelle di basso livello? Perché sì - e lo sono, c'è una ragione per cui cose come i driver di periferica sono ancora scritte in C e non in Ruby o Java (e non solo per i programmatori coinvolti)

Per la maggior parte, le app OO non notano troppi problemi di prestazioni quando sono scritte come app OO (anche se ho visto alcuni programmi andare in una modalità molto complicata dove ci sono così tante chiamate tra gli oggetti che il sistema spende tutti i suoi tempo a cercare vtables!) semplicemente perché la maggior parte dell'elaborazione dei dati viene eseguita su tipi primitivi. Sostituisci quindi con oggetti e vedrai una caratteristica di performance completamente diversa. Ad esempio, guarda solo domande come questo dove l'interrogante spiega che usando un doppio invece di una classe decimale ha reso il suo programma eseguito "circa 15 volte più veloce".

    
risposta data 12.04.2013 - 14:01
fonte

Leggi altre domande sui tag