Per chiunque abbia programmato per un lungo periodo di tempo, è più che probabile che si sia utilizzato un certo numero di linguaggi di programmazione diversi. Dato il panorama del software oggi, è anche probabile che tu abbia lavorato con entrambe le lingue fortemente tipizzate e con le lingue poco tipizzate.
Cioè, hai lavorato in linguaggi di programmazione che richiedono di specificare il tipo di dati delle variabili, quali funzioni restituiranno e così via, e hai lavorato in linguaggi di programmazione che non è necessario che tu abbia impostato esplicitamente tali informazioni.
Se sai esattamente di cosa sto parlando, allora questo articolo della serie probabilmente non fa per te; tuttavia, se ti stai avvicinando alla programmazione o stai appena iniziando a utilizzare un nuovo linguaggio digitato in modo dinamico (o debolmente digitato), allora ci sono un certo numero di cose che vale la pena notare in relazione al lavoro con i tipi di dati.
In questa serie, daremo un'occhiata ai linguaggi dinamici di un principiante, come vengono definite le variabili, come vengono inferti i loro tipi di dati e sono diversi rispetto alle loro controparti statiche e come evitare alcune delle maggiori insidie che derivano dal lavorare con queste lingue.
Prima di esaminare effettivamente le insidie della coercizione di tipo e siamo più propensi a sperimentare le loro insidie, è importante capire quali sono i tipi di dati e in che modo variano da linguaggi fortemente tipizzati e lingue digitate dinamicamente.
In generale, è più probabile trovare linguaggi fortemente tipizzati nella famiglia di linguaggi di programmazione che sono compilati. Ciò include linguaggi come C e C++.
Tuttavia, lì siamo eccezioni.
Ci sono alcuni linguaggi compilati in qualche forma di bytecode o un tipo di linguaggio intermedio e quindi vengono elaborati da un interprete. Java è una di queste lingue. Queste lingue sono fortemente tipizzate. Sono anche compilati. Ma non sono necessariamente compilati in eseguibili binari, ma bytecode interpretato da un software di terze parti.
So che suona un po 'confuso, quindi forse un codice aiuterà a chiarire questo. Nei linguaggi fortemente tipizzati, si dichiara sempre il tipo di dati che una variabile sta per rappresentare.
Per esempio:
string example = "La volpe marrone veloce salta sul cane pigro."; numero int = 42; doppia cassa = 99,99; booleano esiste = vero;
Anche se il codice dovrebbe essere abbastanza semplice da essere auto-esplicativo, si noti che mostra variabili che contengono stringhe, tipi numerici e valori booleani.
Nelle lingue fortemente tipizzate, è necessario anche indicare il tipo di informazioni restituite da una funzione. Prendi i seguenti esempi:
public string getGreeting () return "Ciao mondo!"; public booleano isAlive () return true; public void doSomething () for (int i = 0; i < 10; i++ ) // Perform something
Nota che nell'esempio sopra, la funzione finale ha un tipo di ritorno di vuoto
. Ciò significa che la funzione non ritorna nulla. Quando inizieremo a guardare le lingue dinamiche, vedremo come questo differisce.
Ovviamente, questi sono estremamente semplici, ma va bene così come sono per fare un punto: quei linguaggi fortemente tipizzati hanno variabili e funzioni che hanno il loro tipo di dati impostato in modo esplicito.
Quando si tratta di lingue digitate dinamicamente, ci sono una serie di lussi che derivano dalla capacità di definire variabili e di creare funzioni.
Negli esempi precedenti, la variabile esempio
può contenere solo un stringa
. Ciò significa che non può contenere un numero in virgola mobile o un valore booleano dovere tenere una stringa. Nelle lingue digitate dinamicamente, non è così.
Invece, le variabili possono fare riferimento a una stringa in un punto durante la vita del programma, un intero in un altro punto e un valore booleano in un altro punto. Naturalmente, questo può creare confusione se non vengono adottati alcuni standard di codifica, ma questo va oltre lo scopo di questo punto.
Il punto è che le variabili definite in linguaggi tipizzati dinamicamente possono riferirsi a diversi tipi di dati attraverso l'esecuzione di un programma.
Per esempio:
esempio var; example = "La volpe marrone veloce salta sul cane pigro."; esempio = 42; esempio = 99,99; esempio = true;
Si noti che queste variabili non hanno un tipo di dati - sono semplicemente dichiarati come tipo var e quindi sono impostati secondo necessità. Alcuni linguaggi definiscono le variabili in modo diverso rispetto a quello che vedi sopra, ma il punto non è mostrare come una lingua fa l'una sull'altra. È per mostrare come le variabili semplicemente non si riferiscono a un tipo specifico di dati.
Le funzioni funzionano in modo simile. Cioè, piuttosto che definire il tipo di ritorno dei dati, è sufficiente definire la funzione e fare in modo che restituisca un valore.
function getGreeting () return "Ciao mondo!"; function isAlive () return true; function doSomething () for (var i = 0; i < 10; i++ ) // Perform something
Anche in questo caso, lingue diverse richiedono che le funzioni siano definite in modi diversi (ad esempio, alcune lingue non usano il funzione
parola chiave ma invece usa il DEF
parola chiave), ma l'essenziale è che non è necessario indicare esplicitamente il tipo di dati che verranno restituiti dalla funzione.
Questo può essere uno strumento davvero potente; tuttavia, può anche rendere difficile la lettura del codice, difficile capire cosa restituirà la funzione e / o difficile sapere come impostare il codice esterno per chiamare le funzioni (ad esempio nel caso di confronti, condizioni e così via sopra).
Questo è il motivo per cui gli standard di codifica e le convenzioni di denominazione chiare sono importanti. Di nuovo, però, questo è un argomento che non rientra negli scopi di questa serie.
Ora che abbiamo preso in esame in che modo linguaggi fortemente tipizzati e linguaggi tipizzati dinamicamente gestiscono variabili, funzioni e tipi di dati in generale, possiamo rivolgere la nostra attenzione a come la coercizione di tipo funziona all'interno del più ampio contesto di applicazioni scritte in modo dinamico lingue digitate.
Nello specifico, guardiamo a come possiamo sfruttare le prestazioni a nostro vantaggio e possiamo vedere come possiamo finire introducendo bug non essendo esplicitamente chiari nel nostro codice. Quindi, a partire dal prossimo articolo, faremo esattamente questo.
Nel frattempo, aggiungi tutti i commenti, le domande e i feedback generali al feed sottostante!