web-dev-qa-db-fra.com

Qu'est-ce qu'un langage dynamique et pourquoi le C # n'est-il pas éligible?

En écoutant un podcast, j'ai entendu dire que C # n'était pas un langage dynamique, contrairement à Ruby.

Qu'est-ce qu'un "langage dynamique"? L'existence de langages dynamiques implique-t-il qu'il existe des langages statiques?

Pourquoi C # est-il un langage dynamique et quelles autres langues sont dynamiques? Si C # est pas dynamique, pourquoi Microsoft le pousse-t-il fortement sur le marché?

En outre, pourquoi la plupart des programmeurs .NET en deviennent fous et laissent d’autres langages pour passer au C #?

Pourquoi Ruby est-il "la langue du futur"?

31
egyamado

Qu'est-ce qu'un langage dynamique?

Le fait qu'un langage soit dynamique ou non fait généralement référence au type de liaison que fait le compilateur: liaison statique ou liaison tardive. 

La liaison statique signifie simplement que la méthode (ou la hiérarchie des méthodes virtuelles) est liée au moment de la compilation. Une répartition virtuelle est peut-être impliquée au moment de l'exécution, mais le jeton de méthode est lié à la compilation. Si une méthode appropriée n'existe pas au moment de la compilation, vous recevrez une erreur. 

Les langues dynamiques sont le contraire. Ils font leur travail au moment de l'exécution. Ils vérifient peu ou pas l'existence de méthodes au moment de la compilation, mais le font tous à l'exécution. 

Pourquoi C # n'est-il pas un langage dynamique?

Avant 4.0, C # est un langage lié statiquement et n'est donc pas un langage dynamique. 

Pourquoi Ruby est-il le langage du futur?

Cette question est basée sur une fausse prémisse, à savoir qu'il existe un langage qui constitue l'avenir de la programmation. Il n’existe pas de langage de ce type aujourd’hui, car il n’existe pas de langage unique qui permette de faire tous les types de programmation nécessaires. 

Par exemple, Ruby est un excellent langage pour de nombreuses applications: le développement Web est populaire. Cependant, je n’écrirais pas de système d’exploitation.

68
JaredPar

Dans un langage dynamique, vous pouvez faire ceci:

var something = 1;
something = "Foo";
something = {"Something", 5.5};

En d'autres termes, le type n'est pas statique. Dans un langage à typage statique, cela entraînerait une erreur du compilateur.

Les langages tels que C, C++, C # et Java sont typés de manière statique.

Les langages tels que Ruby, Python et Javascript sont typés de manière dynamique.

En outre, ce n'est pas la même chose que "fortement ou faiblement". C'est quelque chose de différent tous ensemble.

26
Brian Genisio

Je suis renversant de voir comment c # embrasse un ensemble fondamental de paradigmes de programmation.

Nous pouvons dire que c # permet une programmation orientée objet riche, Une programmation orientée composant riche, Une programmation fonctionnelle bien intégrée, Un ensemble complet d'opérations de requête sur différents types de données sources (linq), une élégante approche de programmation à co-courant via pLinq et des extensions parallèles, dans la prochaine version (c # 4.0) aura des capacités dynamiques puissantes, et il est presque certain que dans c # 5.0 aura un ensemble solide de méta-programmation fonctionnalités.

Avec juste peut dire que c # fait un excellent travail en intégrant toutes ces choses puissantes Dans une seule boîte à outils. À mon avis, c’est comme ça que ça doit être, , Car passer d’un langage de programmation à l’autre est presque toujours très pénible.

6
Alberto

C # est un langage à typage statique, car le type de chaque objet avec lequel vous travaillez doit être connu au moment de la compilation. Dans un langage dynamique, vous n'avez pas besoin de savoir quel type d'objet est lors de la compilation. Peut-être importez-vous des classes que vous ne connaissez pas auparavant, comme toutes les classes d'un dossier, comme des plugins ou quelque chose du genre. Ou peut-être même que le type d'un objet dépend de l'interaction de l'utilisateur.

Vous pouvez obtenir un effet similaire en utilisant des interfaces ou des classes de base, mais ce n'est pas tout à fait pareil car vous êtes limité à l'utilisation de classes qui héritent ou implémentent explicitement cette interface.

Dans les langages à typage dynamique, peu importe le type utilisé lors de la compilation, il essaiera d'appeler la méthode que vous avez spécifiée par son nom. Si cette méthode n'existe pas sur l'objet, elle lève une exception d'exécution. Il appartient donc au programmeur de s’assurer que cela ne se produit pas ou de le gérer de manière appropriée. Vous gagnez en flexibilité, mais perdez un peu sur la vérification des erreurs au moment de la compilation.

3
Davy8

En regardant l'entrée Wikipedia , nous constatons qu'un langage dynamique est un langage qui exécute des tâches que la plupart des utilisateurs exécutent au moment de la compilation. En règle générale, dans un langage dynamique, une variable peut changer de type rapidement et facilement, et il n’ya généralement pas d’étape de compilation distincte (mais plutôt une exécution interprétée ou une compilation très rapide). C # est un langage plus conventionnel, utilisant des déclarations de variables et en cours de compilation.

L'entrée Wikipedia répertorie de nombreuses langues dynamiques.

"X est le Y du futur", en revanche, signifie que quelqu'un essaie de vous vendre quelque chose. (Pas nécessairement littéralement, mais en essayant d'influencer vos croyances d'une manière qui convient à l'orateur.)

3
David Thornley

Saviez-vous que VB6 est à la fois statique et dynamique?

Si vous déclarez des variables avec un type donné, vous obtenez un comportement statique:

Dim name as Label

Vous pouvez désormais accéder uniquement aux membres de nom Labels et intellisense le sait.

Si vous avez une classe et ajoutez le mot clé implements, votre classe peut alors implémenter les méthodes d'une autre classe. C'est l'héritage d'interface que VB6 permet. Vous pouvez obtenir un polymorphisme à l'exécution.

Vous pouvez aussi déclarer des variables comme ceci:

Dim proxy As Object

Maintenant, intellisense ne vous donne aucune aide et VB6 vous permettra de faire tout ce que vous voulez avec proxy:

proxy.foo()

Cette ligne peut rester dans un programme compilé et en cours d'exécution et ne pas causer d'infraction, surtout si elle ne s'exécute pas elle-même. Ce n'est que lorsque la ligne est exécutée que la recherche a lieu.

Vous pouvez également effectuer:

set proxy = <any instance>

et cela fonctionnera. Peu importe que <any instance> ait ou non une méthode foo

Et ensuite n'importe quelle instance d'une classe qui implémente foo peut être assignée et la méthode appelée and VB6 sera contente.

Notez qu'il existe des pénalités de performances d'exécution lorsque vous devenez de plus en plus dynamique.

3
quamrana

Les mots statique et dynamique ne sont pas clairement définis.

Cependant, on entend le plus souvent deux problèmes:

1) Dans les langages statiques, le type d'une variable (c'est-à-dire le type de valeur que la variable peut contenir ou pointer) ne peut pas changer en cours de programme. Par exemple, en C #, vous déclarez le type d'une variable lorsque vous la définissez, par exemple:

int a;

Désormais, a ne peut contenir qu'une valeur int; si vous essayez de lui affecter une chaîne ou d'appeler une méthode dessus, vous obtiendrez une erreur de type compilation. 

2) En langage statique, le type d'un objet ne peut pas changer. Dans les langages dynamiques, un objet peut changer en ce sens que vous pouvez attacher ou supprimer des méthodes et des propriétés, le transformant ainsi en un objet complètement différent.

2
JacquesB

Dans C # 3.0, les types de tout doivent être connus au moment de la compilation. C'est un langage statique. Un langage dynamique utilise la répartition dynamique au moment de l'exécution pour décider du type d'éléments et des méthodes à utiliser. Les deux types de langues ont leurs avantages et leurs inconvénients. C # 4.0 va ajouter une capacité dynamique. Anders Hejlsberg a donné une excellente conférence sur les v statiques. langages dynamiques et C # 4.0 chez PDC.

2
JP Alioto

c # est statiquement typé, c'est-à-dire int i = 0; essayez de définir i pour être une chaîne. le compilateur va se plaindre,

où, en python, une variable qui contenait un entier peut alors être définie pour contenir une chaîne,

Statique: les types sont finaux, Dynamique: les types peuvent être modifiés,

c # essaie d'ajouter des fonctionnalités plus dynamiques, comme var par exemple 

1
Fusspawn

Il n’existe pas de véritable "langue du futur". Différentes langues ont des objectifs différents. Tout au plus, vous pourriez dire que Ruby est une langue du futur.

Selon Wikipedia:

Le langage de programmation dynamique est un terme Largement utilisé en informatique pour Décrire une classe de langages de programmation de haut niveau Qui s'exécutent à À l'exécution de nombreux comportements courants qui d’autres langues peuvent s’exécuter pendant la compilation de , voire pas du tout. Ces comportements Peuvent inclure l’extension de Du programme, en ajoutant un nouveau code, en , en développant des objets et des définitions, ou En modifiant le système de types, tous pendant l'exécution du programme. Ces comportements Peuvent être imités dans presque N'importe quel langage suffisamment complexe, , Mais les langages dynamiques fournissent des outils Directs pour les utiliser. La plupart des langages dynamiques sont typés de manière dynamique, mais pas tous.

Ruby est un langage dynamique et C # ne l’est pas, puisque Ruby est interprété et que C # est compilé. Cependant, C # inclut certaines fonctionnalités qui le rendent dynamique.

1
luiscubal

Un langage dynamique est généralement considéré comme un langage capable d'interpréter et de générer de manière dynamique du code au moment de l'exécution. C # ne peut pas faire ça. 

Il existe également des langages typés dynamiquement et statiquement. Typiquement, signifie que le type d'une variable n'est pas défini et peut changer tout au long de l'exécution du programme.

1
Steven

Une langue est typée dynamiquement, ce qui signifie qu'une variable peut être utilisée pour n'importe quoi. Les variables ne sont pas typées, les valeurs le sont. Une variable peut avoir la valeur de n'importe quel type primitif ou faire référence à n'importe quel objet. 

0
user9045232