2014-11-05 12 views
6

Ho sempre considerato il linguaggio C++ come una delle lingue maggiormente tipizzate.
Quindi ero piuttosto scioccato per vedere Table 3 of this paper stato che C++ è tipizzato debolmente.Il C++ è considerato debolmente digitato? Perché?

Apparentemente,

C e C++ sono considerati debolmente tipizzato quanto, grazie al tipo di colata, si può interpretare un campo di una struttura che era un intero come un puntatore.

L'esistenza del tipo di trasmissione è tutto ciò che conta? L'esplicito di tali cast non importa?

Più in generale, è generalmente accettato che il C++ sia debolmente digitato? Perché?

+1

Se si programma in Haskell, si impara come il C++ è tipicamente debolmente digitato! ;-) – Claudix

+2

C++ non è stato digitato debolmente, ma è possibile sovvertire il sistema di tipi se lo si desidera. Quindi si potrebbe sostenere che non è completamente tipizzato. – juanchopanza

+0

.. e se lo consente (digitare la punzione è complicato) –

risposta

16

che la carta prima rivendicazioni:

Al contrario, una lingua è debolmente tipizzato se tipo-confusione può avvenire silenziosamente (inosservato), e infine causare errori difficili da localizzare.

E poi afferma:

Inoltre, C e C++ sono considerati debolmente tipizzato quanto, grazie al tipo di colata, si può interpretare un campo di una struttura che era un intero come un puntatore.

Questa mi sembra una contraddizione. In C e C++, la confusione di tipo che può verificarsi come risultato di cast non avverrà in silenzio - c'è un cast! Ciò non dimostra che entrambe queste lingue siano debolmente tipizzate, almeno non dalla definizione contenuta in quel documento.

Detto questo, con la definizione nel documento, C e C++ possono essere considerati debolmente tipizzati. Vi sono, come già osservato nei commenti sulla domanda, casi in cui la lingua supporta le conversioni di tipo implicito. Molti tipi possono essere convertiti implicitamente in bool, uno zero letterale di tipo int può essere convertito automaticamente a qualsiasi tipo di puntatore, ci sono conversioni tra interi di varie dimensioni, ecc, quindi questo sembra un buon motivo per considerare C e C++ debolmente tipizzati ai fini del documento.

Per C (ma non C++), ci sono anche conversioni più pericolosi implicite che vale la pena ricordare:

int main() { 
    int i = 0; 
    void *v = &i; 
    char *c = v; 
    return *c; 
} 

Ai fini della carta, che deve assolutamente essere considerati debolmente tipizzato. La reinterpretazione dei bit avviene silenziosamente e può essere peggiorata modificando l'uso di tipi completamente indipendenti, che ha un comportamento non definito silenzioso che tipicamente ha lo stesso effetto di reinterpretare i bit, ma esplode in modi misteriosi ma a volte divertenti quando le ottimizzazioni sono abilitate .

In generale, tuttavia, penso che non ci sia una definizione fissa di "tipizzato forte" e "debolmente tipizzato". Ci sono vari gradi, un linguaggio fortemente tipizzato rispetto all'assemblaggio può essere debolmente tipizzato rispetto a Pascal. Per determinare se C o C++ è tipizzato debolmente, devi prima chiedere cosa vuoi dire con debolmente tipizzato.

+0

+1 ottimo punto.Ma per rispondere alla domanda dovresti anche menzionare se il C++ è fortemente tipizzato da qualunque sia la definizione accettata! – Mehrdad

+1

+1 bella sorpresa e contraddizione! –

+1

@Mehrdad D'accordo, e ampliai la mia risposta. – hvd

5

"debolmente digitato" è un termine piuttosto soggettivo. Io preferisco i termini "strettamente digitati" e "tipizzazione statica" vs. "debolmente tipizzato" e "dinamicamente tipizzati", perché sono le parole più obiettiva e più preciso.

Da quello che posso dire, le persone usano generalmente "debolmente tipizzato" come termine diminutivo-peggiorativo che significa "Non mi piace la nozione di tipi in questa lingua". È una sorta di argumentum ad hominem (o meglio, argumentum ad linguam) per coloro che non possono portare argomenti professionali o tecnici contro una particolare lingua.

Il termine "tipizzato rigorosamente" ha anche interpretazioni leggermente diverse; il significato generalmente accettato, secondo la mia esperienza, è "il compilatore genera errori se i tipi non coincidono". Un'altra interpretazione è che "non ci sono o poche conversioni implicite". In base a ciò, il C++ può effettivamente essere considerato un linguaggio tipizzato rigorosamente e molto spesso viene considerato come tale. Direi che il consenso generale su C++ è che è un un linguaggio tipamente scritto.

Ovviamente potremmo provare un approccio più sfumato alla domanda e dire che alcune parti del linguaggio sono tipizzate rigorosamente (questa è la maggior parte dei casi), altre parti sono digitate in modo approssimativo (alcune conversioni implicite, ad esempio le conversioni aritmetiche e i quattro tipi di conversione esplicita).

Inoltre, ci sono alcuni programmatori, in particolare i principianti che non hanno familiarità con più di alcune lingue, che non intendono o non possono fare la distinzione tra "strict" e "static", "loose" e "dinamico" e confondono i due concetti, altrimenti ortogonali, in base alla loro limitata esperienza (di solito la correlazione tra dinamismo e digitazione libera nei linguaggi di scripting popolari, ad esempio).

In realtà, parti di C++ (chiamate virtuali) impongono il requisito che il sistema di tipi sia parzialmente dinamico, ma altre cose nello standard richiedono che sia rigoroso. Di nuovo, questo non è un problema, poiché questi sono concetti ortogonali.

Per riassumere: probabilmente nessuna lingua corrisponde allo completamente, perfettamente in una categoria o in un'altra, ma possiamo dire quale proprietà particolare di una determinata lingua domina. In C++, la rigidità sicuramente domina.

0

Al contrario, una lingua è debolmente tipizzato se tipo-confusione può avvenire silenziosamente (inosservato), e infine causare errori difficili da localizzare.

Beh, questo può accadere in C++, ad esempio:

#define _USE_MATH_DEFINES 
#include <iostream> 
#include <cmath> 
#include <limits> 

void f(char n) { std::cout << "f(char)\n"; } 
void f(int n) { std::cout << "f(int)\n"; } 
void g(int n) { std::cout << "f(int)\n"; } 

int main() 
{ 
    float fl = M_PI; // silent conversion to float may lose precision 

    f(8 + '0'); // potentially unintended treatment as int 

    unsigned n = std::numeric_limits<unsigned>::max(); 
    g(n); // potentially unintended treatment as int 
} 

Inoltre, C e C++ sono considerati debolmente tipizzato dal momento che, a causa del tipo-casting, si può interpretare un campo di una struttura che era un intero come un puntatore.

Ummmm ... non tramite alcuna conversione implicita, quindi è un argomento sciocco. Il linguaggio C++ consente il cast esplicito tra i tipi, ma questo è difficilmente "debole" - non accade accidentalmente/silenziosamente come richiesto dalla definizione del sito sopra riportata.

L'esistenza del tipo di trasmissione è tutto ciò che conta? L'esplicito di tali cast non importa?

Explicitness è una considerazione fondamentale IMHO. Lasciare che un programmatore scavalchi la conoscenza dei tipi del compilatore è una delle caratteristiche "potenti" del C++, non una debolezza. Non è soggetto ad un uso accidentale.

Più in generale, è generalmente accettato che il C++ sia debolmente digitato? Perché?

No, non penso sia accettato. Il C++ è ragionevolmente fortemente tipizzato, e i modi in cui è stato clemente che hanno causato storicamente problemi sono stati eliminati, come i cast impliciti da void* ad altri tipi di puntatori, e il controllo a grana fine con gli operatori e i costruttori di casting explicit.

-2

Vi faccio un semplice esempio:

if (a + b) 

C/C + = permette una conversione implicita da float a int a booleano.

Un linguaggio fortemente tipizzato non consente una conversione implicita.

Problemi correlati