79 votes

Le C est-il fortement typé ?

Je cite Wikipedia :

Deux langages couramment utilisés que qui supportent de nombreux types de implicites sont le C et le C++, et il s'agit d'un langage de conversion. parfois prétendu que ce sont des langages faiblement typés. Cependant, d'autres soutiennent que ces langages imposent suffisamment de restrictions sur la façon dont opérandes de différents types peuvent être mélangés, que ces deux langages doivent être considérés comme des langages fortement typés.

Y a-t-il une réponse plus définitive ?

145voto

Norman Ramsey Points 115730

"Fortement typé" et "faiblement typé" sont des termes qui n'ont pas de signification technique largement reconnue. Les termes qui ont une signification bien définie sont les suivants

  • Typage dynamique signifie que les types sont attachés aux valeurs au moment de l'exécution, et qu'une tentative de mélanger des valeurs de types différents peut provoquer une "erreur de type d'exécution". Par exemple, si dans Scheme vous essayez d'ajouter un à true en écrivant (+ 1 #t) cela provoquera une erreur. Vous ne rencontrez l'erreur que si vous tentez d'exécuter le code incriminé.

  • Typage statique signifie que les types sont vérifiés au moment de la compilation, et qu'un programme qui ne possède pas de type statique est rejeté par le compilateur. Par exemple, si en ML vous essayez d'ajouter un à true en écrivant 1 + true le programme sera rejeté avec un message d'erreur (probablement cryptique). Vous obtenez toujours l'erreur, même si le code ne sera jamais exécuté.

Les gens préfèrent des systèmes différents, en fonction notamment de l'importance qu'ils accordent à la flexibilité et de l'importance qu'ils accordent aux erreurs d'exécution.

Parfois, l'expression "fortement typé" est utilisée de manière vague pour signifier "statiquement typé", et l'expression "faiblement typé" est utilisée de manière incorrecte pour signifier "dynamiquement typé". Une meilleure utilisation du terme "fortement typé" est que "vous ne pouvez pas contourner ou subvertir le système de types", alors que "faiblement typé" signifie "il y a des failles dans le système de types". De façon perverse, la plupart des langages avec des systèmes de types statiques ont des failles, alors que de nombreux langages avec des systèmes de types dynamiques n'ont pas de failles.

Aucun de ces termes n'est lié de quelque manière que ce soit au nombre de conversions implicites disponibles dans une langue.

Si l'on veut parler précisément des langages de programmation, il vaut mieux éviter les termes "fortement typé" et "faiblement typé". Je dirais que le C est un langage qui est statiquement typé mais qui présente de nombreuses failles. L'une d'entre elles est que vous pouvez librement convertir n'importe quel type de pointeur en n'importe quel autre type de pointeur. Vous pouvez également créer une faille entre deux types de votre choix en déclarant une union C qui comporte deux membres, un pour chacun des types en question.

J'ai écrit plus sur le typage statique et dynamique à l'adresse suivante pourquoi-les-langues-interprétées-sont-majoritairement-ducktypées-alors-que-les-compilées-sont-strongues-typées .

21voto

Adam Rosenfield Points 176408

Il est difficile de classer tous les langages dans la catégorie "faiblement" ou "fortement" typés - il s'agit plutôt d'un continuum. Mais, en comparaison avec d'autres langages, le C est assez fortement typé. Chaque objet a un type au moment de la compilation, et le compilateur vous fera savoir (bruyamment) si vous faites quelque chose avec un objet que son type ne vous permet pas de faire. Par exemple, vous ne pouvez pas appeler des fonctions avec des paramètres de type incorrect, accéder à des membres de structures ou d'unions qui n'existent pas, etc.

Mais il y a quelques faiblesses. L'une des principales faiblesses est le typecast - il signifie essentiellement que vous allez jouer avec les types d'objets, et que le compilateur devrait être silencieux (quand il le peut). void* est également une autre faiblesse : il s'agit d'un pointeur générique vers un type inconnu, et lorsque vous les utilisez, vous devez faire très attention à ce que vous fassiez la bonne chose. Le compilateur ne peut pas vérifier statiquement la plupart des utilisations de void* . void* peut également être converti en un pointeur de n'importe quel type sans cast (uniquement en C, pas en C++), ce qui constitue une autre faiblesse.

11voto

mipadi Points 135410

Le C est considéré comme faiblement typé, car vous pouvez convertir n'importe quel type en n'importe quel autre type par le biais d'un cast, sans erreur de compilation. Vous pouvez lire plus sur ce sujet aquí .

9voto

Jules Points 3603

La littérature n'est pas claire à ce sujet. Je pense que fortement typé n'est pas oui/non, il y a différents degrés de fort typage.

Un langage de programmation a une spécification de la façon dont il exécute les programmes. Parfois, le mode d'exécution de certains programmes n'est pas clair. Par exemple, les programmes qui essaient de soustraire une chaîne de caractères d'un nombre. Ou les programmes qui divisent par zéro. Il existe plusieurs façons de traiter ces conditions. Certains langages ont des règles pour traiter ces erreurs (par exemple, ils lèvent une exception). D'autres langages n'ont tout simplement pas de règles pour gérer ces situations. Ces langages ont généralement des systèmes de types pour empêcher la compilation de programmes qui conduisent à un comportement non spécifié. Il existe aussi des langages qui ont un comportement non spécifié et qui n'ont pas de système de types pour empêcher ces erreurs au moment de la compilation (si vous écrivez un programme qui a un comportement non spécifié, il peut lancer les missiles).

Donc :

Les langages qui spécifient ce qui se passe à l'exécution dans chaque cas (comme l'ajout d'un nombre à une chaîne de caractères) sont dits typés dynamiquement. Les langages qui empêchent l'exécution de programmes contenant des erreurs au moment de la compilation sont typés statiquement. Les langages qui ne spécifient pas ce qui se passe et qui n'ont pas non plus de système de types pour prévenir les erreurs sont dits faiblement typés.

Alors, Java est-il statiquement typé ? Oui, car son système de types interdit de soustraire une chaîne de caractères d'un nombre. Non, car il permet de diviser par zéro. Vous pourriez empêcher la division par zéro au moment de la compilation avec un système de types. Par exemple, en créant un type de nombre qui ne peut pas être zéro (par exemple NonZeroInt), et en autorisant uniquement la division par des nombres qui ont ce type.

Le C est-il fortement typé ou faiblement typé ? C est fortement typé parce que le système de type interdit certaines erreurs de type. Mais il est faiblement typé dans d'autres cas où ce qui se passe n'est pas défini (et le système de types ne vous protège pas).

7voto

Michael Burr Points 181287

Le C est plus fortement typé que le Javascript et moins fortement typé que l'Ada.

Je dirais qu'il se situe plutôt du côté fortement typé du continuum. Mais quelqu'un d'autre pourrait ne pas être d'accord (même s'il a tort).

C'est définitif, non ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X