Actuellement, le C est considéré comme une langue de bas niveau , mais était-il considéré dans les années 70 comme de bas niveau? Le terme était-il même utilisé alors?
Beaucoup de langues populaires de niveau supérieur n'existaient pas avant le 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.
programming-languages
c
history
Joeyfb
la source
la source
Réponses:
Pour répondre aux aspects historiques de la question:
La philosophie de conception est expliquée dans The C Programming Language écrit par Brian Kernighan et le concepteur C, Dennis Ritchie, le "K & R" dont vous avez peut-être entendu parler. La préface à la première édition dit
et l'introduction dit
La liste est longue avant que le texte continue:
(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.)
Alors, oui, les termes "haut niveau" et "bas niveau" étaient utilisés à l'époque, mais C était conçu pour se situer quelque part dans le spectre entre les deux. Il était possible d'écrire du code en C portable sur toutes les plates-formes matérielles, ce qui était le principal critère permettant de déterminer si un langage était considéré de haut niveau à l'époque. Cependant, C manquait de certaines caractéristiques caractéristiques des langages de haut niveau, ce qui était une décision de conception en faveur de la simplicité.
la source
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 à l’assemblage était considéré comme un langage de haut niveau. C'est une barre basse pour effacer. Plus tard, cette terminologie a évolué au point que certains considèrent aujourd'hui que même Java est un langage de bas niveau.
Même dans le paysage linguistique de haut niveau des années 70, il est utile de souligner que le C est un niveau assez bas. Le langage C est fondamentalement B plus un système de types simple, et B n’est guère plus qu’une couche de syntaxe procédurale / structurée pratique pour l’assemblage. Etant donné que le système de typage est un ajustement ultérieur au-dessus du langage B non typé, vous pouvez toujours omettre les annotations de type à certains endroits
int
.C laisse délibérément de côté des fonctionnalités coûteuses ou difficiles à implémenter qui étaient déjà bien établies à l’époque, telles que
C a quelques caractéristiques intéressantes:
Au moment du développement de C, d'autres langages innovants tels que COBOL, Lisp, ALGOL (dans divers dialectes), PL / I, SNOBOL, Simula et Pascal étaient déjà 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 en tant que langage de programmation universel, la technologie et l'informatique nécessaires à sa mise en œuvre n'existaient pas encore. Certains d'entre eux (certains dialectes ALGOL, PL / I, Pascal) étaient également destinés à la programmation de bas niveau, mais ils avaient tendance à avoir des compilateurs plus complexes ou étaient trop sûrs (par exemple, aucun pointeur non restreint). Pascal manque notamment d'un bon support pour les tableaux de longueur variable.
Comparé à ces langues, C rejette les fonctionnalités «élégantes» et coûteuses afin d’être plus pratique pour le développement de bas niveau. C n’a jamais été avant tout un projet de recherche sur la conception linguistique. Au lieu de cela, il s'agissait d'un dérivé du développement du noyau Unix sur le mini-ordinateur PDP-11, qui était comparativement soumis à des contraintes de ressources. Pour son créneau (un langage minimaliste de bas niveau pour écrire Unix avec un compilateur à passe unique facile à porter), C a absolument excellé - et plus de 45 ans plus tard, il est toujours la lingua franca de la programmation système.
la source
%r10
comme le "pointeur de chaîne statique", qui correspond exactement à ce dont vous parlez. Pour C, il ne s'agit que d'un autre registre de travail, mais j'imagine que Pascal s'en servirait. (Fonctions imbriquées GNU C utilisent pour passer un pointeur vers le champ extérieur lorsqu'une telle fonction n'inline pas (par exemple si vous faites un pointeur de fonction si le compilateur crée un trampoline de code machine sur la pile): Acceptabilité régulière utilisation de r10 et r11 )a = b;
pour copier toute une structure comme vous le pouvez dans ISO C89. Ainsi, au début du langage C, les types définis par l'utilisateur étaient définitivement de seconde classe et ne pouvaient être passés que par référence en tant que arguments de fonction. L'aversion de C pour les tableaux et pourquoiAu début des années 1970, C était une bouffée d’air frais utilisant des constructions modernes si efficaces que l’ensemble du système UNIX pouvait être réécrit du langage d’assemblage en C avec un encombrement ou une performance négligeable. À l'époque, de nombreux contemporains l'ont qualifié de langage de haut niveau.
Les auteurs de C, principalement Dennis Ritchie, étaient plus circonspects. Dans l'article du Bell System Technical Journal, il était écrit que "C n'est pas un langage de très haut niveau". Avec un sourire ironique et avec l’intention d’être provocateur, Dennis Ritchie dirait que c’est un langage peu développé. Chef parmi 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 l' article original de BSTJ:
Merci Dennis. Repose en paix.
la source
Comme je l'ai écrit ailleurs sur ce site, quelqu'un a qualifié le modèle de gestion malloc / free memory de "programmation de bas niveau".
Pour contexte, c'était au début des années 90, bien après la sortie de C.
la source
malloc()
en appelant directementbrk(2)
ou enmmap(2)
gérant vous-même la mémoire qui en résulte. C'est un PITA massif qui ne présente aucun avantage concevable (à moins que vous ne mettiez en œuvre un système similaire à celui d'un malloc), mais vous pouvez le faire.De nombreuses réponses ont déjà fait référence aux premiers articles qui disaient «C n’est pas un langage de haut niveau».
Cependant, je ne peux pas résister à la tentation: beaucoup, si ce n'est la plupart ou tous les HLL à l'époque - Algol, Algol-60, PL / 1, Pascal - fournissaient une vérification des limites de la matrice et une détection de dépassement numérique.
La dernière fois que j'ai vérifié les tampons et les débordements d'entiers étaient à l'origine de nombreuses failles de sécurité. ... Oui, toujours le cas ...
La situation en matière de gestion dynamique de la mémoire était plus compliquée, mais le style C malloc / free représentait 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», l’état déplorable de la cybersécurité serait très différent, probablement meilleur, si C et UNIX n’avaient pas existé.
la source
popcnt
.Considérons des langues plus anciennes et beaucoup plus anciennes que C (1972):
Fortran - 1957 (niveau légèrement supérieur à C)
Lisp - 1958
Cobol - 1959
Fortran IV - 1961 (niveau légèrement supérieur à C)
PL / 1 - 1964
APL - 1966
Plus un langage de niveau moyen tel que RPG (1959), principalement un langage de programmation destiné à remplacer les systèmes d’enregistrement d’unités basés sur un tableau de connexion.
Dans cette perspective, C semblait être un langage de très bas niveau, à peine supérieur aux assembleurs de macros utilisés à l’époque sur des mainframes. Dans le cas des ordinateurs centraux IBM, les macros assembleur étaient utilisées pour l’accès à la base de données, telle que BDAM (méthode d’accès de base au disque), car les interfaces de la base de données n’avaient pas été portées sur Cobol Les programmes Cobol sont encore utilisés aujourd'hui sur les ordinateurs centraux IBM.
la source
La réponse à votre question dépend du langage C concerné.
Le langage décrit dans le manuel de référence C de 1974 de Dennis Ritchie était un langage de bas niveau offrant une certaine commodité de programmation par rapport aux langages de niveau supérieur. Les dialectes dérivés de cette langue ont également tendance à être des langages de programmation de bas niveau.
Cependant, lors de la publication de la norme 1989/1990 C, elle ne décrivait pas le langage de bas niveau devenu populaire pour la programmation de machines réelles, mais décrivait un langage de niveau supérieur qui pouvait être - mais n'était pas obligé - -implémenté en termes de niveau inférieur.
En tant qu'auteurs de la note C, l'un des éléments qui ont rendu le langage utile est que de nombreuses implémentations peuvent être traitées comme des assembleurs de haut niveau. Parce que C était également utilisé comme alternative à d'autres langages de haut niveau et que de nombreuses applications n'exigeaient pas la capacité 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 ont essayé d'utiliser des constructions de bas niveau. Par conséquent, le langage décrit par le standard C n'a jamais été un langage de programmation bas niveau.
Pour comprendre cette distinction, considérons comment Ritchie's Language et C89 afficheraient l'extrait de code:
sur une plate-forme où "char" correspond à 8 bits, "int" à 16 bits big-endian, "float" à 32 bits et les structures n'ayant pas d'exigences de remplissage ou d'alignement particulières, la taille de "struct foo" est de 8 octets.
Dans la langue de Ritchie, le comportement de la dernière instruction prend l'adresse stockée dans "p", lui ajoute 3 * 8 + 2 [ie 26] octets, et extrait une valeur de 16 bits des octets de cette adresse et de la suivante. , ajoutez un à cette valeur, puis écrivez cette valeur de 16 bits sur les deux mêmes octets. Le comportement serait défini comme agissant sur les 26ème et 27ème octets suivant celui de l'adresse p sans tenir compte du type d'objet qui y était stocké.
Dans le langage défini par le standard C, dans le cas où * p identifie un élément d'un "struct foo []" suivi d'au moins trois éléments plus complets de ce type, la dernière instruction ajoute un membre à y le troisième élément après * p. Le comportement ne serait défini par la norme dans aucune autre circonstance.
Le langage de Ritchie était un langage de programmation de bas niveau car, s'il permettait au programmeur d'utiliser des abstractions telles que des tableaux et des structures lorsque cela convenait, 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 ne définit que le comportement du code qui est cohérent avec cela. Une mise en œuvre de qualité adaptée à la programmation de bas niveau se comportera de manière utile dans plus de cas que prévu par la norme, mais il n'existe aucun document "officiel" spécifiant ce qu'une mise en œuvre doit faire pour être adaptée à ces objectifs.
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é de normalisation 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.
la source