2010-11-05 2 views
6

Come so che in C, possiamo usare il puntatore di funzione e questo viene chiamato durante l'esecuzione (1).Perché C non è un linguaggio dinamico?

Per definizione da Wikipedia:

dinamico linguaggio di programmazione è un termine utilizzato ampiamente in informatica per descrivere una classe di alto livello linguaggi di programmazione che eseguono a runtime molti comportamenti comuni che altro le lingue potrebbero essere eseguite durante la compilazione , se non del tutto ...

Quindi la mia domanda è, perché C non è un linguaggio dinamico p roviding la funzione in (1)?

risposta

5

Poiché la funzione nel puntatore funzione è ancora compilata in fase di compilazione.

Non è possibile aggiungere una nuova funzione o modificare una funzione "al volo" in fase di esecuzione.

+1

Ooooh .. ottimo punto +1. –

+0

Certo che puoi. C'è un codice auto-modificante là fuori in natura. Sì, voglio dire C. Il codice può ricompilare se stesso ed eseguire un nuovo binario o modificare il suo binario corrente. – samoz

+0

Puoi farlo con qualsiasi lingua. – winwaed

0

C non è un linguaggio di alto livello, è un livello molto basso.

Manca classi e altre funzionalità di alto livello e offre invece il bit-flipping diretto e la possibilità di manipolare direttamente la memoria.

In genere, i linguaggi dinamici eseguiti su alcune VM, come JVM o CLR, sono interpretati, a la Python, o utilizzano uno stack eseguibile, ovvero Haskell, per fornire funzionalità. Al contrario, C viene compilato direttamente sul codice macchina.

Ci sono modi per rendere C auto-modificabile, ma questa è una tecnica molto difficile e in realtà non si qualifica come un "linguaggio dinamico".

+2

Dinamico non è lo stesso livello alto –

+0

Caratteristiche? Più come distrazioni. Direct bit-flipping in opposizione a ... bitmap indiretto? Tutte le lingue manipolano la memoria, la maggior parte di esse molto più di C, e molto meno efficientemente. –

+0

Come si fa a capovolgere una distrazione? Per i sistemi funzionano, questo tipo di cose è inestimabile. – samoz

3

Il comportamento polimorfico non fa un linguaggio dinamico. In generale, qualcuno che si riferisce a un "linguaggio dinamico" si riferisce al suo sistema di tipi. PHP è un linguaggio dinamico, perché qualsiasi variabile può contenere qualsiasi tipo di dati e le conversioni tra i tipi di dati vengono gestite implicitamente. La determinazione di cosa e quando convertire viene eseguita in fase di esecuzione.

Inoltre, penso che C non superi la "classe di livello alto lingue di programmazione" parte della definizione che citi.

+0

Sì in questi giorni C sicuramente non è di alto livello, anche se ho pensato che fosse quando l'ho imparato: After BASIC, Pascal e Assembler; sembrava Pascal con una sintassi divertente! – winwaed

1

È possibile solo assegnare un puntatore a una funzione esistente in fase di compilazione. Non è possibile compilare una nuova funzione nel mezzo di un programma C e assegnare un puntatore a quella funzione.

1

Una lingua è generalmente considerata dinamica a causa del suo sistema di tipi. C è tipizzato staticamente. Ciò significa che ogni variabile ha un tipo assegnato alla creazione e quel tipo non può cambiare. Non puoi mettere i dati float in un puntatore int *. In un linguaggio dinamico come Python, i dati hanno un tipo ma le variabili no. Posso assegnare una stringa alla stessa variabile a cui assegno un intero.

Anche la definizione a cui si fa riferimento sembra parlare di programmazione dinamica, ovvero aggiungere codice in fase di esecuzione. In C è impossibile, senza pensare in termini di assemblaggio, aggiungere nuovo codice dopo il tempo di compilazione. Il tuo programma non può decidere di aver bisogno di una nuova funzione mentre è in esecuzione. In una lingua come Scheme, può.

* La trasmissione non viene eseguita poiché si sta convertendo in modo esplicito il tipo.