2010-04-18 11 views
15

I linguaggi tipizzati staticamente e le lingue a dattilo dinamico in linea di principio sembrano concetti opposti. Tuttavia, come può un linguaggio come Objective-C ad esempio essere entrambe queste cose contemporaneamente? Mi sembra che Objective-C sia più statico che dinamico. Qualcuno può spiegare come sia possibile?Come può un linguaggio di programmazione essere sia tipizzato staticamente che digitato in modo dinamico?

+6

Come? A scapito di entrambi i paradigmi. –

risposta

9

Objective-C è realmente (concettualmente) solo un livello sul linguaggio C stesso e, come tale, può avere sia tipi statici che dinamici. Statico se usi la roba base-C, dinamica se usi le estensioni Objective-C.

Ma C offre anche questa funzione. Se pensi solo al tipo di vuoto * in C, vedrai che può puntare a qualsiasi tipo, dandoti quindi un linguaggio (molto approssimativo) tipizzato dinamicamente.

Ad esempio:

int i; 
float f; 
double d; 
void *p = &i; 
p = &f; 
p = &d; 

In tutte le assegnazioni a p sopra, è fatto per puntare a un tipo diverso. Se fate il vostro codice di abbastanza abilmente, si può anche emulare RTTI e polimorfismo in C.

vorrei prendere in considerazione una lingua principalmente statico o dinamico digitato, in base a ciò che è stato più utilizzato per.

1

Se stai chiedendo informazioni sulla capacità tecnica di supportare entrambi gli idiomi, non è una domanda particolarmente interessante. Basta guardare la maggior parte delle lingue moderne e vedere come lo fanno. Di solito, è tramite una sorta di tipo dinamico catch-all (Object in VB, dynamic in C#, void* in C e così via).

A livello metafisico/ontologica, questa domanda è molto più interessante ...

Una teoria in fisica potrebbe suggerire un comportamento che sfida l'intuizione, che porta a chiedersi: "Come può essere?" Per esempio, la dualità onda-particella va al di là di qualsiasi nozione consensuale di come la realtà sia o dovrebbe essere, e così lascia che meditiamo sull'imponderabile.

I linguaggi di programmazione, tuttavia, non sono modelli di realtà. Sono invenzioni della mente, progettate per servire ai nostri scopi. Quindi non ha senso ponderare come un linguaggio di programmazione possa essere così com'è. È così perché volevamo che fosse così; perché si adatta ai nostri scopi. Nessun altro motivo è necessario o giustificato.

Quindi, per favore, capisci che non sono rincuorante o sprezzante quando rispondo che un linguaggio può essere sia dinamico che statico solo perché è possibile, e perché questo è utile. È inutile cercare di sondare ulteriormente.

+7

Questa è una delle risposte più odiose e inutili che abbia mai visto su SO. – jpswain

+1

@ orange80: prego. –

+0

quello che ho capito da tutto questo è che è perché le persone lo hanno fatto in quel modo ... in troppe parole forse. – madhukar93

0

C è un linguaggio tipizzato staticamente, ma ha la flessibilità di ri-convertire i tipi in altri tipi e di utilizzare puntatori generici (il tipo void *). Il tipo void * significa "puntatore a un tipo di dati non specificato". Objective-C implementa i suoi tipi dinamici attraverso l'uso di questi tipi void *, anche se di solito questo si astrae via da livelli multipli di definisce, typedef, ecc

21

Credo che stai confondendo statico digitando e dinamico risoluzione metodo. L'Objective-C è decisamente fortemente, tipizzato staticamente. Come C, tutte le variabili devono essere dichiarate e digitate (non c'è nemmeno inferenza di tipo come in altre lingue moderne, tipizzate staticamente). Il compilatore genera codice in base al tipo di variabili e questo tipo non può essere modificato in fase di esecuzione.

Tuttavia, le chiamate al metodo Objective-C utilizzano un paradigma di passaggio dei messaggi, in cui il nome e la destinazione del messaggio sono codificati in fase di compilazione, ma l'indirizzo del codice da eseguire viene cercato in fase di esecuzione dalle librerie di runtime Objective-C.

+0

In realtà mi stavo chiedendo questa stessa domanda perché nella documentazione Apple Objective-C si afferma che Objective-C è tipizzato dinamicamente a causa della risoluzione del metodo dinamico. Sono d'accordo che la documentazione non dovrebbe confondere le persone dicendo che è tipizzato dinamicamente in base a questa funzionalità. – Oscar

+1

Tuttavia, non è "facoltativamente digitato", considerando che si potrebbe, se lo si desidera, rendere tutti gli oggetti Obj-C tipo _id_ e completamente ignorare i tipi a parte i primitivi C, come _int_ se li si sta utilizzando? – jpswain

+0

@ orange80, 'id' * è * un tipo. In effetti, tutte le istanze dell'oggetto in Objective-C sono-al 'id' del tipo di compilatore (una' struct objc_object * '). La tipizzazione statica non è facoltativa in C, né in Objective-C. –

0

Objective-C ha una combinazione di tipizzazione statica e dinamica. Gli oggetti C semplici sono tipizzati staticamente, ma gli oggetti Objective-C sono digitati in modo dinamico. Il runtime Objective-C non si preoccupa di che tipo è un oggetto fintanto che i messaggi che invii ai tuoi oggetti sono riconosciuti dall'oggetto.

-1

I linguaggi tipizzati staticamente e le lingue con dattilografia dinamica sono in effetti degli opposti, almeno nel modo in cui questi termini vengono normalmente utilizzati.

Un linguaggio tipizzato staticamente è uno che include una fase di verifica (e segnalazione) del tipo durante la compilazione (o almeno prima dell'esecuzione del codice). L'obiettivo C ha certamente questo, quindi è tipizzato in modo statico.

Un linguaggio tipizzato in modo dinamico è privo di una fase di controllo del tipo. Quindi l'obiettivo C non è digitato dinamicamente da questa definizione - e penso che questa sia la definizione più standard.

Tuttavia, Objective C è talvolta chiamato dinamicamente tipizzato (in aggiunta a tipizzazione statica) perché permette al programmatore di specificare ridotto controllo di tipo statico in alcune parti del loro codice - in particolare per gli oggetti tramite il tipo statico speciale id. Personalmente penso che sarebbe meno confusionario dire che è un linguaggio tipizzato staticamente con un buon supporto per gli oggetti tipizzati dinamicamente.

Nota che quasi tutti i linguaggi con tipizzazione statica includono un supporto per la digitazione dinamica, poiché ad esempio utilizzano controlli di runtime per rilevare errori di divisione per zero, errori di allineamento di array, errori di downcast, ecc. Tali cose non giustificano chiamare una lingua digitata dinamicamente, altrimenti quasi tutte le lingue dovrebbero essere chiamate digitate dinamicamente.

Problemi correlati