web-dev-qa-db-fra.com

Le langage de programmation C était-il considéré comme un langage de bas niveau à sa sortie?

Actuellement C est considéré comme un langage de bas nivea , mais dans les années 70 était-il considéré comme de bas niveau? Le terme était-il encore utilisé à l'époque?

De nombreuses langues populaires de niveau supérieur n'existaient qu'au milieu des années 80 et au-delà, je suis donc curieux de savoir si et comment la nature du bas niveau a changé au fil des ans.

152
joeyfb

Pour répondre aux aspects historiques de la question:

La philosophie de conception est expliquée dans Le langage de programmation C écrit par Brian Kernighan et le concepteur C Dennis Ritchie, le "K&R" dont vous avez peut-être entendu parler. La préface de la première édition dit

C n'est pas un langage "de très haut niveau", ni un "grand" langage ...

et l'introduction dit

C est un langage relativement "de bas niveau" ... C ne fournit aucune opération pour traiter directement des objets composites tels que des chaînes de caractères, des ensembles, des listes ou des tableaux. Il n'y a aucune opération qui manipule un tableau ou une chaîne entière ...

La liste continue pendant un certain temps avant que le texte continue:

Bien que l'absence de certaines de ces fonctionnalités puisse sembler une grave lacune, ... garder le langage à une taille modeste présente de réels avantages.

(Je n'ai que la deuxième édition de 1988, mais le commentaire ci-dessous indique que le texte cité est le même dans la première édition de 1978.)

Donc, oui, les termes "haut niveau" et "bas niveau" étaient utilisés à l'époque, mais C a été conçu pour se situer quelque part sur le spectre entre les deux. Il était possible d'écrire du code en C qui était portable sur toutes les plates-formes matérielles, et c'était le principal critère pour déterminer si un langage était considéré comme de haut niveau à l'époque. Cependant, C manquait de certaines fonctionnalités qui étaient caractéristiques des langages de haut niveau, et c'était une décision de conception en faveur de la simplicité.

142
gatkin

Cela dépend de votre définition du langage de haut niveau et de bas niveau. Lorsque C a été développé, tout ce qui était de niveau supérieur à Assembly était considéré comme un langage de haut niveau. C'est une barre basse à effacer. Plus tard, cette terminologie a évolué au point que certains considéreraient même aujourd'hui Java comme un langage de bas niveau).

Même dans le paysage linguistique de haut niveau des années 70, il convient de souligner que C est un niveau assez bas. Le langage C est essentiellement B plus un système de type simple, et B n'est pas beaucoup plus qu'une couche de syntaxe procédurale/structurée pratique pour l'assemblage. Étant donné que le système de type est un ajustement rétroactif au-dessus du langage B non typé, vous pouvez toujours laisser des annotations de type à certains endroits et int sera supposé.

C omet consciemment des fonctionnalités coûteuses ou difficiles à implémenter qui étaient déjà bien établies à l'époque, telles que

  • gestion automatique de la mémoire
  • fonctions ou fermetures imbriquées
  • de base OOP ou coroutines
  • systèmes de types plus expressifs (par exemple, types à plage restreinte, types définis par l'utilisateur tels que les types d'enregistrement, typage fort,…)

C a quelques fonctionnalités intéressantes:

  • prise en charge de la récursivité (en raison de ses variables automatiques basées sur la pile, par rapport aux langues où toutes les variables ont une durée de vie globale)
  • pointeurs de fonction
  • Les types de données définis par l'utilisateur (structures et unions) ont été implémentés peu de temps après la version initiale de C.
  • La représentation des chaînes de C (pointeur vers caractères) est en fait une énorme amélioration par rapport à B qui codait plusieurs lettres en un seul mot machine.
  • Les fichiers d'en-tête de C étaient un hack d'efficacité pour garder les unités de compilation petites, mais fournissaient également un système de modules simple.
  • Arithmétique de pointeurs et de pointeurs sans restriction de type assemblage, par rapport à des références plus sûres. Les pointeurs sont une fonctionnalité intrinsèquement dangereuse mais également très utile pour la programmation de bas niveau.

Au moment où C a été développé, d'autres langages innovants tels que COBOL, LISP, ALGOL (dans divers dialectes), PL/I, SNOBOL, Simula et Pascal avaient déjà été publiés et/ou étaient largement utilisés pour des domaines de problèmes spécifiques. Mais la plupart de ces langues existantes étaient destinées à la programmation mainframe, ou étaient des projets de recherche académique. Par exemple. lorsque ALGOL-60 a été conçu pour la première fois comme un langage de programmation universel, la technologie et l'informatique nécessaires pour le mettre en œuvre n'existaient pas encore. Certains d'entre eux (certains dialectes ALGOL, PL/I, Pascal) étaient également destinés à une programmation de bas niveau, mais ils avaient tendance à avoir des compilateurs plus complexes ou étaient trop sûrs (par exemple, pas de pointeurs illimités). Pascal manque notamment un bon support pour les tableaux de longueur variable.

Par rapport à ces langages, C rejette les fonctionnalités "élégantes" et coûteuses afin d'être plus pratique pour un développement de bas niveau. C n'a jamais été principalement un projet de recherche en conception de langage. Au lieu de cela, c'était une ramification du développement du noyau Unix sur le mini-ordinateur PDP-11 qui était comparativement limité en ressources. Pour sa niche (un langage minimaliste de bas niveau pour écrire Unix avec un compilateur en un seul passage facile à porter), C a absolument excellé - et plus de 45 ans plus tard, il est toujours le lingua franca de la programmation des systèmes.

157
amon

Au début des années 1970, C était une bouffée d'air frais éblouissante utilisant des constructions modernes si efficacement que l'ensemble du système UNIX pouvait être réécrit du langage d'assemblage en C avec un espace ou une pénalité de performance négligeable. À l'époque, de nombreux contemporains l'appelaient une langue de haut niveau.

Les auteurs de C, principalement Dennis Ritchie, étaient plus circonspects et, dans l'article du Bell System Technical Journal, ils ont déclaré que "C n'est pas un langage de très haut niveau". Avec un sourire ironique et ayant l'intention d'être provocateur, Dennis Ritchie dirait que c'était un langage de bas niveau. Le principal de ses objectifs de conception pour C était de garder le langage proche de la machine tout en assurant la portabilité, c'est-à-dire l'indépendance de la machine.

Pour plus d'informations, consultez le article original du BSTJ:

Merci Dennis. Repose en paix.

37
bud wonsiewicz

Comme je l'ai écrit ailleurs sur ce site lorsque quelqu'un a qualifié le modèle de gestion de la mémoire malloc/libre de "programmation de bas niveau"

C'est marrant comme la définition de "bas niveau" change avec le temps. Lorsque j'ai appris à programmer pour la première fois, tout langage qui fournissait un modèle de segment standardisé qui rend possible un modèle d'allocation/libération simple était en effet considéré comme de haut niveau. Dans la programmation de bas niveau, vous devez garder une trace de la mémoire vous-même, (pas les allocations, mais les emplacements de mémoire eux-mêmes!), Ou écrivez votre propre allocateur de tas si vous vous sentez vraiment chic.

Pour le contexte, c'était au début des années 90, bien après la sortie de C.

21
Mason Wheeler

De nombreuses réponses ont déjà fait référence à de premiers articles qui disaient des choses comme "C n'est pas un langage de haut niveau".

Je ne peux pas résister à l’empilement, cependant: de nombreux, sinon la plupart ou tous les HLL à l’époque - ALGOL, ALGOL-60, PL/1, Pascal - ont fourni une vérification des limites du tableau et une détection de débordement numérique.

Enfin, j'ai vérifié que les débordements de tampon et d'entiers étaient à l'origine de nombreuses failles de sécurité. ... Ouais, toujours le cas ...

La situation pour la gestion dynamique de la mémoire était plus compliquée, mais malgré tout, le style C malloc/free était un grand pas en arrière en termes de sécurité.

Donc, si votre définition de HLL inclut "empêche automatiquement de nombreux bogues de bas niveau", eh bien, l'état désolé de la cybersécurité serait très différent, probablement mieux, si C et UNIX ne s'étaient pas produits.

15
Krazy Glew

Considérez les langues plus anciennes et beaucoup plus élevées qui ont précédé C (1972):

Fortran - 1957 (niveau pas beaucoup plus élevé que C)

LISP - 1958

Cobol - 1959

Fortran IV - 1961 (pas beaucoup plus élevé que C)

PL/1 - 1964

APL - 1966

De plus, un langage de niveau intermédiaire comme RPG (1959), principalement un langage de programmation pour remplacer les systèmes d'enregistrement d'unité basés sur des fiches.

De ce point de vue, C semblait être un langage de très bas niveau, juste un peu au-dessus des macro-assembleurs utilisés sur les mainframes à l'époque. Dans le cas des ordinateurs centraux IBM, des macros d'assembleur ont été utilisées pour l'accès à la base de données, telles que BDAM (méthode d'accès au disque de base), car les interfaces de la base de données n'avaient pas été portées sur Cobol (à l'époque), ce qui a entraîné un héritage d'un mélange d'assemblage et de Programmes Cobol toujours utilisés aujourd'hui sur les mainframes IBM.

8
rcgldr

La réponse à votre question dépend du langage C sur lequel elle pose la question.

Le langage décrit dans le manuel de référence C de Dennis Ritchie de 1974 était un langage de bas niveau qui offrait une partie de la commodité de programmation des langages de niveau supérieur. Les dialectes dérivés de ce langage avaient également tendance à être des langages de programmation de bas niveau.

Cependant, lorsque la norme C 1989/1990 a été publiée, elle ne décrivait pas le langage de bas niveau qui était devenu populaire pour la programmation de machines réelles, mais décrivait plutôt un langage de niveau supérieur qui pouvait être - mais n'était pas tenu de l'être - -implémenté en termes de niveau inférieur.

Comme le notent les auteurs de la norme C, l'une des choses qui ont rendu le langage utile était que de nombreuses implémentations pouvaient être traitées comme des assembleurs de haut niveau. Parce que C était également utilisé comme alternative aux autres langages de haut niveau, et parce que de nombreuses applications ne nécessitaient pas la possibilité de faire des choses que les langages de haut niveau ne pouvaient pas faire, les auteurs de la norme ont permis aux implémentations de se comporter de manière arbitraire. si les programmes essayaient d'utiliser des constructions de bas niveau. Par conséquent, le langage décrit par la norme C n'a jamais été un langage de programmation de bas niveau.

Pour comprendre cette distinction, considérez comment Ritchie's Language et C89 afficheraient l'extrait de code:

struct foo { int x,y; float z; } *p;
...
p[3].y+=1;

sur une plate-forme où "char" est de 8 bits, "int" est de 16 bits big-endian, "float" est de 32 bits et les structures n'ont pas de remplissage spécial ou d'alignement, la taille de "struct foo" est donc de 8 octets.

Sur Ritchie's Language, le comportement de la dernière instruction prendrait l'adresse stockée dans "p", ajouter 3 * 8 + 2 [c.-à-d. 26] octets, puis récupérez une valeur de 16 bits à partir des octets à cette adresse et à la suivante, ajoutez-en un à cette valeur, puis réécrivez cette valeur de 16 bits dans les deux mêmes octets. Le comportement serait défini comme agissant sur les 26e et 27e octets suivant celui à l'adresse p sans tenir compte du type d'objet qui y était stocké.

Dans le langage défini par la norme C, dans le cas où * p identifie un élément d'une "struct foo []" qui est suivi d'au moins trois autres éléments complets de ce type, la dernière instruction ajouterait un au membre y de le troisième élément après * p. Le comportement ne serait en aucun cas défini par la norme.

Le langage de Ritchie était un langage de programmation de bas niveau car, même s'il permettait à un programmeur d'utiliser des abstractions comme des tableaux et des structures quand cela était pratique, il définissait le comportement en termes de disposition sous-jacente des objets en mémoire. En revanche, le langage décrit par C89 et les normes ultérieures définit les choses en termes d'abstraction de niveau supérieur et définit uniquement le comportement du code qui est cohérent avec cela. Des implémentations de qualité adaptées à une programmation de bas niveau se comporteront utilement dans plus de cas que ne l'exige la norme, mais il n'y a pas de document "officiel" spécifiant ce qu'une implémentation doit faire pour convenir à de telles fins.

Le langage C inventé par Dennis Ritchie est donc un langage de bas niveau, et a été reconnu comme tel. Cependant, le langage inventé par le Comité des normes C n'a jamais été un langage de bas niveau en l'absence de garanties fournies par la mise en œuvre qui vont au-delà des mandats de la norme.

6
supercat