Est-ce que l'utilisation de C pour mettre en œuvre d'autres langues contraint leurs conceptions de quelque façon?

StackOverflow https://stackoverflow.com/questions/3513780

Question

Il semble que la plupart des nouveaux langages de programmation qui sont apparus au cours des 20 dernières années ont été écrits en C. Cela prend tout son sens que C peut être considérée comme une sorte de langage assembleur portable. Mais ce que je suis curieux de savoir si cela a contraint la conception des langues en aucune façon. Ce qui a incité ma question de penser à la façon dont la pile C est utilisé directement en Python pour appeler les fonctions. Il est évident que le concepteur du langage de programmation peut faire ce qu'ils veulent dans la langue qu'ils veulent, mais il me semble que la langue que vous choisissez d'écrire votre nouvelle langue vous met dans un certain état d'esprit et vous donne certains raccourcis qui sont difficiles à ignorer. Y at-il d'autres caractéristiques de ces langues qui viennent d'être écrites dans cette langue (bon ou mauvais)?

Était-ce utile?

La solution

Même avec une implémentation C, vous êtes étonnamment libre en termes de mise en œuvre. Par exemple, système de poulet utilise C comme intermédiaire, mais parvient toujours à utiliser la pile comme une génération de pépinière le collecteur d'ordures.

Cela dit, il y a des cas où il y a des contraintes. Exemple: Le compilateur haskell GHC a un script perl appelé Mal Mangler pour modifier le code assembleur GCC à émis mettre en œuvre des optimisations importantes. Ils ont été en mouvement à l'assemblage et LLVM généré en interne en partie pour cette raison. Cela dit, cela n'a pas contraint la conception de la langue -. Que le choix du compilateur d'optimisations disponibles

Autres conseils

Je suis pas d'accord.

Je ne pense pas que ce soit tellement que le compilateur ou l'interprète d'une langue est implémenté en C - après tout, vous pouvez mettre en œuvre une machine virtuelle avec C qui est complètement différent de son environnement hôte, ce qui signifie que vous peut sortir d'une mentalité de langage C / quasi-assemblage.

Cependant, il est plus difficile de prétendre que le langage C se n'a pas eu d'influence sur la conception des langues plus tard. Prenons par exemple l'utilisation des accolades { } aux états de groupe en blocs, la notion que les espaces et le retrait est la plupart du temps sans importance, les noms de type natif (int, char, etc.) et d'autres mots-clés, ou la manière dont les variables sont définies (ie. déclaration de type premier, suivi du nom de la variable, l'initialisation en option). Un grand nombre des populaires et des langues très répandues aujourd'hui (C ++, Java, C #, et je suis sûr qu'il ya encore plus) partagent ces concepts avec C. (Ce sont sans doute pas complètement nouvelle avec C, mais AFAIK C est venu avec cette mélange particulier de la syntaxe du langage.)

Non, en bref. La réalité est, regarder autour des langues qui sont écrites dans C. Lua, par exemple, est à peu près aussi loin de C que vous pouvez obtenir sans devenir Perl. Il a des fonctions de première classe, la gestion de la mémoire entièrement automatisée, etc.

Il est rare que les nouvelles langues d'être affectés par leur langue de mise en œuvre, à moins que ladite langue contient de sérieuses limites. Bien que je désapprouve sans aucun doute de C, ce n'est pas une langue limitée, juste très sujette aux erreurs et lent à programme par rapport aux langues les plus modernes. Oh, sauf dans le CRT. Par exemple, Lua ne contient pas la fonctionnalité de répertoire, car il ne fait pas partie du tube cathodique afin qu'ils ne puissent portably mettre en œuvre dans la norme C. C'est une façon dont C est limitée. Mais en termes de fonctionnalités linguistiques, il ne se limite.

Si vous voulez construire un argument en disant que les langues mises en œuvre en C ont des limites de XYZ ou des caractéristiques, vous devez montrer que faire les choses d'une autre manière est impossible en C.

La pile C est juste la pile du système, et ce concept C par un antidate peu. Si vous étudiez la théorie de calcul, vous verrez que l'utilisation d'une pile est très puissant.

Utilisation de C pour mettre en œuvre des langues a probablement eu très peu d'effet sur ces langues, bien que la familiarité avec C (et d'autres C comme langues) des personnes qui conçoivent et mettent en œuvre des langues a sans doute influencé leur conception beaucoup. Il est très difficile de ne pas être influencé par des choses que vous avez vu avant, même si vous ne copiez pas activement les meilleurs morceaux d'une autre langue.

De nombreuses langues font usage C comme la colle entre eux et d'autres choses, cependant. Une partie de cela est que de nombreux systèmes d'exploitation fournissent une API C, ainsi que l'accès est facile à utiliser C. De plus, C est tellement commun et simple que beaucoup d'autres langues ont une sorte de passage à l'interface avec elle. Si vous voulez coller deux modules ensemble qui sont écrits dans différentes langues puis en utilisant C comme l'homme du milieu est probablement la solution la plus simple.

Si la mise en œuvre d'une langue dans C a probablement influencé d'autres langues le plus est sans doute des choses comme la façon dont les évasions sont faites dans les chaînes, ce qui est sans doute pas que la limitation.

La seule chose qui a contraint la conception du langage est l'imagination et l'habileté technique des concepteurs de langage. Comme vous l'avez dit, C peut être considéré comme un « langage assembleur portable ». Si cela est vrai, alors demander si C a contraint une conception est semblable à demander si l'assemblage a la conception du langage contrainte. Étant donné que tout le code écrit dans une langue est finalement exécuté comme l'assemblage, chaque langue souffrirait les mêmes contraintes. Par conséquent, le langage C s'impose pas de contraintes qui serait résolu en utilisant une autre langue.

Cela étant dit, il y a certaines choses qui sont plus facile à faire dans une langue autre vs. De nombreux concepteurs de langue prennent en compte. Si la langue est conçu pour être, par exemple, puissant au traitement de chaîne, mais les performances ne sont pas une préoccupation, puis en utilisant une langue avec de meilleures installations de traitement de chaîne intégré (comme C ++) pourrait être plus optimale.

De nombreux développeurs choisissent C pour plusieurs raisons. Tout d'abord, C est un langage très commun. Les projets open source, en particulier, comme il est relativement plus facile de trouver un développeur C-langue expérimenté que de trouver un dans d'autres langues développeur qualifiés. équivalente En second lieu, C se prête généralement à micro-optimisation. Lors de l'écriture d'un analyseur pour un langage scripté, l'efficacité de l'analyseur a un impact important sur les performances globales des scripts écrits dans cette langue. Pour les langages compilés, un compilateur plus efficace peut réduire les temps de compilation. De nombreux compilateurs C sont très bons à générer un code extrêmement optimisé (qui fait également partie de la raison pour laquelle de nombreux systèmes embarqués sont programmés en C), et le code de performance critiques peuvent être écrites en assembleur en ligne. En outre, C est normalisée et est généralement une cible statique. Le code peut être écrit à la norme ANSI / C89 et ne pas avoir à se soucier de ce qui est incompatible avec une version future de C. Les modifications apportées à la fonctionnalité add norme C99 mais ne pas casser le code existant. Enfin, C est extrêmement portable. Si au moins un compilateur existe pour une plate-forme donnée, il est très probablement un compilateur C. L'utilisation d'un langage hautement portable comme C facilite de maximiser le nombre de plates-formes qui peuvent utiliser la nouvelle langue.

La seule limitation qui vient à l'esprit est l'hébergement et l'extensibilité compilateur. Prenons le cas de C #. Le compilateur est écrit en C / C ++ et est tout à fait du code natif. Cela rend très difficile à utiliser dans le processus avec une application C #.

Cela a des implications pour la chaîne d'outillage de C #. Tout code qui veut profiter du réel analyseur C # ou moteur de liaison doit avoir au moins un composant qui est écrit dans le code natif. Cela a finalement conduit à la plupart de la chaîne d'outillage pour le langage C # sont écrites en C ++ qui est un arrière de bits pour une langue.

Cela ne limite pas la langue par exemple, mais a certainement un effet sur l'expérience autour de la langue.

Collecte des ordures ménagères. implémentations de langue sur le dessus de Java ou .NET utilisent GC de la machine virtuelle. Ceux au-dessus de C ont tendance à compter de référence d'utilisation.

Une chose que je peux penser est que les fonctions ne sont pas nécessairement les premiers membres de la classe dans la langue, et cela ne peut être attribué à C seul (je ne parle pas de passer un pointeur de fonction, mais il peut faire valoir que C vous fournit cette fonctionnalité).

Si l'on devait écrire un DSL Groovy (/ système / Lisp / haskell / lua / javascript / et un peu plus que je ne suis pas sûr), les fonctions peuvent devenir la première classe de membres. Faire les premiers membres de la classe des fonctions et permettant des fonctions anonymes permet d'écrire un code concis et plus lisible humaine (comme démontré par LINQ).

Oui, finalement tous ces éléments sont en cours d'exécution en C (ou un ensemble si vous voulez arriver à ce niveau), mais en termes de fournir à l'utilisateur de la langue la possibilité de s'exprimer mieux, ces abstractions font un travail merveilleux.

La mise en œuvre d'un compilateur / interpréteur en C n'a pas de limites importantes. D'autre part, la mise en œuvre d'une langue X au compilateur C fait. Par exemple, selon le article de Wikipédia sur C--, lors de la compilation d'un niveau supérieur langue C vous ne pouvez pas faire la collecte des ordures précis, la gestion des exceptions efficace, ou l'optimisation de récursion de queue. C'est le genre de problème que C-- était destiné à résoudre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top