Il existe souvent des langages de programmation spécialisés pour des tâches spécifiques. Certains langages de programmation sont excellents en arithmétique des tableaux (tels que les matrices et l'utilisation de tableaux multidimensionnels), mais certains sont bien meilleurs en mathématiques de niveau supérieur qui sont difficiles à reproduire dans d'autres langages (mais toujours possibles tout de même).
Qu'en est-il d'un langage qui le rend meilleur pour une tâche spécifique ou un objectif final que d'autres langages, étant donné que la plupart se compilent tout simplement jusqu'à l'assemblage?
Je parle des langages complets de Turing, ceux qui sont équivalents à Turing.
Réponses:
Il y a quelques points à considérer:
Abstraction: qu'est-ce que la langue considère comme "spéciale"? Les matrices sont-elles des valeurs de première classe, comme dans Matlab, ou les codez-vous en utilisant des types plus simples comme des tableaux, comme en C? C vous fait penser à la façon dont les matrices sont implémentées, pas Matlab.
De même, si vous avez un système compliqué de communications asynchrones, vous voulez probablement des fonctions de première classe afin de pouvoir effectuer des rappels.
Plus il y a de fonctionnalités ajoutées, plus la langue devient complexe. Ainsi, bien qu'il existe des langages «multi-paradigmes» comme C ++ et D, la plupart des langages choisissent un créneau, choisissent les éléments qui sont importants pour ce créneau et priorisent ceux-ci comme leurs principales abstractions.
Performance: toute abstraction a un coût, qu'il s'agisse de la compilation ou de l'exécution. Certaines langues se limitent d'une manière qui les rend moins abstraites mais plus performantes.
Le début de Fortran ne permettait pas les pointeurs ou la récursivité, il était donc excellent pour le calcul des nombres, plus rapide qu'un langage comme C, où vous exécutiez beaucoup de boucles. Mais c'était terrible pour encoder de grandes structures de données, comme des arbres, où vous aviez besoin de pointeurs pour l'indirection. (Notez que je ne connais pas grand-chose au Fortran moderne.)
Essentiellement, il y a toujours des compromis. Plus abstrait signifie soit un temps d'exécution plus lent, soit plus de complexité au moment de la compilation. Plus de fonctionnalités signifie un langage plus complexe. Certaines fonctionnalités rendent certaines choses rapides et d'autres lentes, comme les pointeurs et la récursivité. Il n'y a pas de langue parfaite, donc chaque langue atteindra une sorte de maximum local dans l'espace des qualités linguistiques.
la source
Les contraintes de certains langages facilitent l'implémentation de code plus rapide (par exemple Fortran vs C et l'aliasing des pointeurs) qui est un compromis entre les performances et les possibilités prêtes à l'emploi).
Le langage n'est pas "optimisé" pour des tâches spécifiques, mais l'implémentation, les compilateurs et les contraintes qui facilitent la compréhension du code par le compilateur le font. La vraie affaire concerne des bibliothèques spécifiques, des algorithmes mis en œuvre pour accélérer le processus avec des commutateurs en fonction de la longueur du problème le rendent optimal.
Par exemple, la multiplication utilise divers cas (voir Multiplication GMP .
Lorsque le langage spécifie les opérations mathématiques de niveau supérieur, son implémentation est optimale (efficace dans ce cas), mais cela ne fait pas partie de la spécification du langage.
Veuillez jeter un œil au calcul du classement matriciel dans Matlab, Mathematica et Maple (je ne peux pas effectuer tous les tests moi-même pour le moment, mais ceux-ci sont cohérents avec mes tests). Tous ces langages (environnements) implémentent la même opération de niveau supérieur mais les détails d'implémentation diffèrent, ce qui donne des moments différents.
Lorsqu'une tâche spécifique à un domaine (ici aussi un langage spécifique à un domaine) est orientée vers des calculs particuliers, elle est améliorée et optimisée (au fil des ans) pour le public cible. Mais être optimal n'est pas toujours le cas. Par exemple, Perl a une longue histoire de gestion des chaînes, mais les PCRE (ici simplement les expressions régulières de Perl) ne sont pas les plus rapides existantes (et utilisent beaucoup de mémoire), mais sont extrêmement expressifs et puissants.
Les contraintes du langage font une différence dans le processus de compilation, l'aliasing de pointeur mentionné empêche la possibilité de réorganisation du code et impose le rechargement des variables.
la source
À mon avis, cela peut être formulé de façon assez précise: un outil (par exemple, un langage de programmation avec ses bibliothèques standard) est l'outil optimal pour une classe particulière de problèmes lorsqu'il minimise, par rapport à tous les outils possibles qui pourraient être employés, le coût attendu de l'obtention d'une solution suffisamment correcte et performante, où l'attente est prise en compte dans une distribution de probabilité donnée pour tous les problèmes de la classe de problèmes. Généralement, ce coût se présente sous la forme de temps de programmation et comprend le temps de conception prévu, le temps de débogage attendu, le temps prévu nécessaire pour éduquer quelqu'un qui ne connaît pas déjà l'outil, etc.
En pratique, presque aucune de ces quantités ne peut être réellement mesurée. Pourtant, je pense que c'est la bonne façon de penser au problème.
la source
C'est une excellente question à laquelle il n'est pas facile de répondre. Y a-t-il quelque chose dans le langage Erlang qui le rend approprié pour les applications de télécommunications en temps réel? Ou s'agit-il du compilateur Erlang? Ou s'agit-il de la communauté et de l'écosystème d'Erlang? C'est peut-être que les gens qui savent comment écrire des applications de télécommunications sont experts en Erlang, et les gens qui connaissent Erlang sont experts en applications de télécommunications? Je soupçonne que tous ces facteurs jouent un rôle.
Il y a probablement deux fonctionnalités dans Erlang qui le rendent adapté à de telles applications (mise en garde: je n'ai jamais utilisé le langage moi-même) - il a un bon support pour la concurrence, et un support pour la mise à niveau logicielle dynamique. Ces fonctionnalités seraient également utiles dans de nombreux autres domaines, mais les ingénieurs télécoms sont fanatiques de la disponibilité. Peut-être que si les gens qui construisaient des sites Web étaient aussi préoccupés par la haute disponibilité que les gens qui construisaient des centraux téléphoniques, Erlang serait également populaire là-bas.
la source
Les autres réponses ne permettent pas d'optimiser un langage pour une tâche spécifique - il ne s'agit pas seulement de rendre le code plus rapide sur du matériel donné; il s'agit de la façon dont une langue particulière vous permet d'exprimer clairement et succinctement la solution à un problème. Cela dépend beaucoup du domaine du problème et (avec le battage publicitaire, l'ignorance des solutions existantes et le voyage de l'ego pour écrire un nouveau langage), c'est pourquoi nous avons plusieurs langues - l'objectif est que le programmeur écrive moins de code, ce qui est à la fois moins sujet aux erreurs et plus facile à lire / comprendre / corriger / améliorer pour le prochain programmeur.
Par exemple, les deux C et C ++ peuvent être utilisés pour la programmation orientée objet - et en effet, la bibliothèque GObject est un bon exemple de OO C. struct AC contenant des pointeurs de fonction peut servir le même but que les méthodes virtuelles sur une classe C ++, et peut effectuer mieux; la pénalité de développement est le code de colle pour allouer de la mémoire, initialiser les pointeurs de fonction et choisir une stratégie pour appeler les méthodes «parent». La plupart du temps, il est plus clair / plus sûr de taper
Class klass * = new class()
questruct class *klass = malloc(sizeof(struct class));klass->fn1 = ...;klass->fnN = ...
.la source