Un linguaggio interpretato in modo statico può essere considerato sicuro?

4

In primo luogo lasciatemi spiegare quale è la mia comprensione dei termini linguaggio tipizzato staticamente e sicurezza del tipo:

Lingua tipizzata staticamente: una lingua che non ti consente di modificare il tipo di una variabile in fase di esecuzione.

Sicurezza del tipo: sicurezza del tipo significa che non ti è consentito mescolare tipi di dati incompatibili. Ad esempio, non puoi assegnare float a int e non puoi assegnare int a un puntatore di funzione e non puoi aggiungere un oggetto definito dall'utente a int (a meno che non usi l'overloading dell'operatore) , ecc.

Tornando alla mia domanda, diciamo che esiste un linguaggio interpretato staticamente, in questo linguaggio posso scrivere codice che assegna un float a un int , ma quando questo codice viene eseguito, un tempo) si verificherà l'errore di tipo.

Un tale linguaggio è considerato sicuro per tipo, o le lingue sicure per il tipo possono essere solo digitate in modo statico e compilate , quindi gli errori di tipo devono essere rilevati in fase di compilazione?

    
posta user247763 27.09.2016 - 22:14
fonte

2 risposte

11

Statically typed language: a language that does not allow you to change the type of a variable at run-time.

Questa non è la definizione di tipizzazione statica. La tipizzazione statica significa che il controllo del tipo (e l'inferenza del tipo) avviene prima del runtime. L'opposto è la digitazione dinamica, in cui il controllo dei tipi avviene in fase di runtime.

È perfettamente possibile progettare un linguaggio tipizzato staticamente in cui entrambi gli identificatori possono cambiare tipi o tipi possono cambiare.

Type safety: type safety means that you are not allowed to mix incompatible data types. For example, you cannot assign a float to an int, and you cannot assign an int to a function pointer, and you cannot add a user-defined object to an int (unless you use operator overloading), etc.

Non esiste una definizione universalmente accettata di sicurezza del tipo. Il tuo è molto sensato.

Back to my question, let's say that there is an interpreted statically typed language,

Non esiste una lingua interpretata tipicamente, semplicemente perché non esiste una lingua interpretata, un periodo. Interpretazione e compilazione sono tratti del, bene, interprete o compilatore (duh!), Cioè l'implementazione , non la lingua. Ogni lingua può essere implementata con un interprete e ogni lingua può essere implementata con un compilatore. In effetti, molte lingue hanno entrambe le interpretazioni interpretate e compilate. Ad esempio, Haskell ha diverse implementazioni compilate (Ghc, Jhc, Yhc, Lhv) e un'implementazione interpretata (Hugs). ECMAScript ha implementazioni compilate pure (V8) e implementazioni ibride in modalità mista (ad esempio SpiderMonkey AOT-compila ECMAScript a SpiderMonkey bytecode, quindi entrambi compila e interpreta questo bytecode)

Dire che una lingua è un "linguaggio interpretato" non è solo sbagliato , è persino più che sbagliato , è semplicemente non sensoriale. L'idea del "linguaggio" e l'idea di "interpretazione" vivono su due diversi livelli di astrazione. Se l'inglese fosse una lingua tipizzata, il "linguaggio interpretato" sarebbe un errore di tipo.

in such a language I can write code that assigns a float to an int, but when this code is executed, a (run-time) type error will occur.

Sei incoerente con te stesso qui.

Dici "staticamente digitato" significa "non permette di cambiare il tipo di una variabile", il che significa che puoi non scrivere tale codice. Ma ora dici che puoi scrivere tale codice in un linguaggio tipizzato staticamente.

Ma se puoi scrivere tale codice, quindi con la tua definizione, è non tipizzato staticamente. E se è tipizzato in modo statico, quindi in base alla propria definizione, non è possibile scrivere tale codice.

Quindi non sorprende che tu abbia una contraddizione, perché ti stai contraddittando.

Is such a language considered to be type safe, or are type safe languages can only be statically typed and compiled, and so type errors must be caught at the compilation stage?

Indipendentemente dal fatto che il tipo di lingue sicure possa essere solo tipizzato staticamente o meno dipende solo da come si definisce "sicuro per tipo". Un'altra definizione comune di "tipo sicuro" è che non è possibile sovvertire il sistema di tipi. Ruby è digitato in modo dinamico, ma di solito è descritto come sicuro. D'altra parte, C è tipizzato staticamente ma nessuno lo descriverà come sicuro.

Per quanto riguarda la possibilità di compilare un linguaggio sicuro per tipo, ho già spiegato sopra che la compilazione è un dettaglio di implementazione, non è una proprietà del linguaggio stesso.

    
risposta data 27.09.2016 - 23:04
fonte
2

Invece di rispondere alla tua domanda, ho intenzione di attirare un po 'le tue definizioni. Questo perché ho la sensazione che questa domanda deriva principalmente dal confronto tra idee diverse di "tipo" e "sicurezza di tipo" come se fossero identiche.

In primo luogo, un linguaggio tipizzato in modo statico non ti permette di cambiare il tipo di un assegnabile in fase di esecuzione non è del tutto vero: infatti c'è una classe di lingue ben studiata con una funzionalità chiamata "aggiornamenti forti" che fanno solo Questo. Inoltre, una visione comune delle lingue digitate dinamicamente è che hanno solo un particolare "tipo" nel senso della parola usata dai sistemi tipizzati staticamente. Un linguaggio dinamico significa "tipo" nel senso di un tag o di una parte di dati persistenti in fase di esecuzione che fornisce informazioni sul tipo di valore con cui è abbinato. In un linguaggio statico, i tipi sono una separazione dei programmi in classi diverse in base al loro comportamento o ad altre metriche. In particolare, se pensiamo al "tipo di cose etichettate con un tag in fase di esecuzione", arriviamo proprio al tipo di dati che incontriamo in un linguaggio dinamico.

Inoltre, i tipi o i linguaggi statici in generale non hanno nulla a che fare con la loro implementazione . Se scrivo un interprete per C, è ancora C. Se scrivo un compilatore per Python, è ancora Python. Pertanto, la domanda che una lingua può essere sicura dal testo e non compilata deve essere sì, se accettiamo l'esistenza di qualsiasi tipo di lingua sicura, poiché qualsiasi lingua che posso compilare può essere interpretata e viceversa.

Ora, per quanto riguarda le nozioni di sicurezza del tipo, direi che questa non è nemmeno la definizione che si desidera. Ogni singola lingua che i popoli usano per il software ha qualche possibilità di uscire con un'eccezione, lanciare un errore o, in generale, solo lamentarsi in qualche modo. La solita definizione di sicurezza del tipo è che se accettiamo un programma ben formato, quel programma arriverà a un valore o terminerà in un modo ben definito, come lanciando un'eccezione. Ad esempio, potrebbe non essere segfault, rimanere bloccato in qualche modo o semplicemente fare ciò che vuole. Con questo in mente, molti linguaggi dinamici sono sicuri per il tipo semplicemente perché assicurano che se un programma è ben formato, ha un comportamento ben definito. Le lingue tipizzate staticamente possono essere di tipo non sicuro: considerate C. Non tutti i programmi C hanno un comportamento definito, semplice e semplice.

TLDR: la risposta alla tua domanda è no, se interpreti le parole come hai fatto tu o come preferirei.

    
risposta data 27.09.2016 - 22:27
fonte

Leggi altre domande sui tag