Qu'est-ce qui rend une langue «optimisée» pour une tâche spécifique?

15

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.

esote
la source
1
Il s'agit d'une question encyclopédique. Je vous suggère de le décomposer d'une manière ou d'une autre, de le rendre plus spécifique.
André Souza Lemos
5
Serait-il faux de dire "marketing"?
corsiKa
2
@corsiKa Oui, je pense que c'est plus qu'une question de marketing.
Jeremy West

Réponses:

18

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.

jmite
la source
8

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.

Mal
la source
9
La plupart des langues sont Turing complètes par spécification, car elles ne spécifient pas toutes des tailles d'adresse fixes dans leur spécification. Et c'est assez limitant de perdre la distinction entre des choses comme C, qui sont la taille d'adresse modulo de Turing Complete, et des choses comme Coq, Agda ou System F, qui ne sont pas du tout Turing Complete.
jmite
1
@jmite merci. J'espère que cela n'observe plus les différences
Evil
@Evil: Eh bien, je pense que votre déclaration sur les langues à ne pas optimiser pour les tâches est fausse. vous voyez le mot optimiser du point de vue de l'ordinateur. Mais certains langages sont conçus pour le rendre plus facile uniquement pour le programmeur et permettent aux implémenteurs de comprendre comment le faire fonctionner.
docteur
C'est sous l'angle de l'efficacité, donc ce n'est pas faux, je viens de prendre cet angle, vous pourriez considérer l'autre (optimisé ce qui signifie qu'il est plus facile d'y écrire certaines tâches spécifiques). "Qu'en est-il d'une langue qui la rend meilleure pour une tâche ou un objectif spécifique que d'autres langues [...]", je suis convaincu que: plus facile à écrire, plus rapide, moins cher, etc. pourrait être inclus dans le "meilleur". L'auteur n'a ni accepté de réponse, ni apporté de clarifications ou de commentaires selon lesquels aucune des réponses données ne concernait la question posée. En plus de cela, c'est l'un des facteurs, pour certaines personnes plus important que pour d'autres
Evil
5

À 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.

j_random_hacker
la source
4

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.

Michael Kay
la source
3

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()que struct class *klass = malloc(sizeof(struct class));klass->fn1 = ...;klass->fnN = ....

Phil Lello
la source
Eh bien, la réponse du jmite fournit avec une puce les choses que vous avez écrites manquantes. J'ai écrit sur des tâches spécifiques au domaine qui sont optimisées pour cette question. J'aime C, je connais des choses comme OCC, mais cela ne rend pas C orienté objet (le compilateur n'aide pas à cela et de nombreuses optimisations sont empêchées, il n'y a pas de garbage collector, etc.). Vous ne pouvez pas surcharger les fonctions C comme en C ++, mais bien sûr vous pouvez émuler n'importe quel comportement (jmite a également écrit à ce sujet). Je ne vois pas comment cela répond à la question posée.
Evil
2
@Evil: La programmation orientée objet et le langage de programmation orienté objet sont deux concepts différents. La programmation orientée objet ne nécessite pas de langage orienté objet. On peut dire que cela nécessite simplement l'existence de papier ou de tableaux blancs afin que vous puissiez faire votre conception UML.
slebetman
@slebetman Je ne l'ai pas vu venir. Sans doute vous n'avez pas besoin du papier et du tableau blanc, vous pouvez simplement imaginer des objets, et selon certaines personnes, c'est notre façon de penser, mais cela ne se rapproche pas du support linguistique des concepts OOP. Je suis désolé, mais c'est un différend que je ne veux pas prendre.
Evil
@Evil: Je ne suis pas sûr d'être en mesure de garder une trace de tout cela mentalement sans une certaine abstraction pour vous aider. Mon premier travail consistait à donner un gros morceau de code C qui ressemblait à tous les tableaux avec des pointeurs de fonction (il m'a fallu un certain temps pour comprendre ce que la syntaxe étrange signifiait - pas de google à l'époque) et je me débattais avec jusqu'à ce que je commence à voir un modèle et réalisé que ces tableaux étaient des objets et ces pointeurs de fonction étaient des méthodes. Je me suis acheté un petit tableau blanc et j'ai utilisé beaucoup de papier A4, mais finalement j'ai réussi à comprendre le code
slebetman
1
@slebetman Étant donné que la programmation orientée objet est antérieure à UML d'au moins 20 ans, votre affirmation selon laquelle les conceptions UML sont nécessaires pour l'orientation d'objet semble être complètement fausse.
David Richerby