Quelle est la différence entre un langage de script et un langage de programmation normal?

20

Quelle est la différence entre un langage de programmation et un langage de script? Par exemple, considérons C contre Perl.

La seule différence est que les langages de script nécessitent uniquement l'interpréteur et ne nécessitent pas de compilation et de liaison?

SS Hegde
la source
4
J'ai peur que ce soit hors sujet ici; ce que vous voulez savoir est purement une question d'implémentation du langage. Il semble également attirer des réponses superficielles / d'opinion (pas votre faute en soi), ce qui est toujours un drapeau rouge.
Raphael
Le matériel est un "interprète" pour les langues compilées. La seule différence est donc le nombre d'interprètes que vous utilisez. Si la machine est équivalente à Turing et que vous utilisez une langue équivalente à Turing, vous pouvez écrire un interprète compilé Adans la langue, puis écrire un interprète Bdans la langue que l'interprète Apeut exécuter, puis un interprète Cdans la langue que l'interprète Bpeut exécuter , etc. Essentiellement, tout est une question d'indirection, qui a moins à voir avec la base théorique du calcul et plus à voir avec des préoccupations d'ingénierie pratiques.
Patrick87
Salaires (pré-DevOps)
Phil Lello

Réponses:

21

Je pense que la différence a beaucoup plus à voir avec l'utilisation prévue de la langue.

Par exemple, Python est interprété et ne nécessite pas de compilation et de liaison, tout comme Prolog. Je classerais ces deux langages comme des langages de programmation.

Les langages de programmation sont destinés à l'écriture de logiciels. Ils sont conçus pour gérer de grands projets. Ils peuvent probablement appeler des programmes, lire des fichiers, etc., mais ne sont peut-être pas aussi efficaces qu'un langage de script.

Les langages de script ne sont pas destinés au développement de logiciels à grande échelle. Leur syntaxe, leurs fonctionnalités, leur bibliothèque, etc. se concentrent davantage sur l'accomplissement rapide de petites tâches. Cela signifie qu'ils sont parfois plus "hackish" que les langages de programmation, et peuvent ne pas avoir toutes les mêmes fonctionnalités intéressantes. Ils sont conçus pour rendre les tâches couramment exécutées, comme l'itération dans un tas de fichiers ou l'exécution de tâches d'administrateur système, à automatiser.

Par exemple, Bash ne fait pas bien l'arithmétique, ce qui ferait probablement de l'écriture de logiciels à grande échelle un cauchemar.

Comme une sorte de référence: je n'écrirais jamais un lecteur de musique en perl, même si je le pouvais probablement. De même, je n'essaierais jamais d'utiliser C ++ pour renommer tous les fichiers d'un dossier donné.

Cette ligne devient de plus en plus floue. JavaScript, par définition une langue "scripting", est de plus en plus utilisé pour développer des "applications web" qui relèvent davantage du domaine logiciel. De même, Python correspond initialement à de nombreuses caractéristiques d'un langage de script, mais voit de plus en plus de logiciels développés en utilisant Python comme plate-forme principale.

jmite
la source
1
+1 pour l'exemple réel: je ne peux pas imaginer être obligé d'utiliser C ++ pour effectuer des tâches de renommage par lots!
Casey Kuball
3
Vous n'énoncez aucune différence conceptuelle, seulement une opinion populaire sur les cas d'utilisation respectifs.
Raphael
3
Souhaitez-vous également "ne pas écrire" le plus grand réseau social du monde en langage de script (FB en PHP), l'un des premiers services de blogs qui a promu toute la tendance (LJ en Perl), système de contrôle de version qui permet facilement à des milliers de développeurs de travailler ensemble (Mercurial en Python)? Désolé, mais ce "script est pour de petites tâches" est juste une poubelle populaire.
Oleg V. Volkov
1
@Raphael Je pense que les différences conceptuelles sont au mieux floues. La principale différence est dans l'utilisation populaire, l'OMI. La plupart de ces langages seront tous complets et suivront un modèle de calcul similaire. Je n'ai jamais rencontré de distinction ou de définition formelle, mais n'hésitez pas à modifier ma réponse si vous en avez une.
jmite
3
@Raphael Cela fait partie du point: il n'y a pas de différences conceptuelles. Ce que vous pouvez faire lors de la compilation vs l'exécution est principalement une question d'interprétation vs de compilation, et c'est une propriété de l'implémentation, pas du langage (bien que la conception du langage puisse rendre difficile un modèle d'implémentation particulier).
Gilles 'SO- arrête d'être méchant'
6

L'article classique sur les langages de script est John K. Ousterhout, Scripting: Higher-level programming for the 21st Century , publié dans Computer 31 (3), 1998. Il a établi une distinction entre les langages de script, d'une part, et les langages de programmation système sur L'autre.

Ousterhout a caractérisé les langages de programmation système comme ayant évolué pour remplacer les langages machine pour la programmation. Ils cachent des détails fastidieux comme l'affectation des registres et les séquences d'appels de sous-programmes, fournissent des constructions simples pour écrire des boucles et d'autres idiomes courants de contrôle et imposent une discipline de typage. Ils sont généralement implémentés par un compilateur (à l'avance). Ces langues sont destinées à l'écriture de logiciels à partir de zéro. Les exemples sont C, C ++ et Java.

En revanche, selon Ousterhout, les langages de script partent du principe qu'il existe déjà des programmes utiles, généralement écrits dans des langages de programmation système. Les langages de script, comme Perl, Python, Tcl, Visual Basic et les shells Unix, fournissent des outils pour combiner ces programmes existants dans de nouveaux programmes. Ousterhout a qualifié les langages de script de "sans type" (y compris ce que beaucoup appellent la frappe dynamique) et comme mettant l'accent sur un développement rapide; ils sont généralement mis en œuvre par des interprètes.

Maintenant, il faut faire attention de ne pas supposer que le modèle conceptuel d'un seul auteur fait autorité. Même si nous, les informaticiens, aimons prétendre que nous sommes des mathématiciens donnant des définitions précises à tous les termes, dans la pratique, la plupart des terminologies informatiques sont socialement construites avec des significations floues et hétérogènes; il existe un consensus approximatif à un niveau très élevé sur la plupart des termes, mais les détails dépendent souvent de la personne qui écrit. Ainsi, prenez son article, ma réponse et toutes les autres réponses ici avec un gros tas de sel.

Je contesterais personnellement l'existence d'un langage de programmation "normal", comme vous le dites dans votre question. Cependant, je pense que le concept que vous essayez de transmettre correspond grosso modo aux langages de programmation système d'Ousterhout.

ibid
la source
2

Tous les langages de script sont également des langages de programmation. L'inverse est pas vrai. Les langues qui "nécessitent uniquement l'interpréteur" sont des langues interprétées (par opposition à une langue compilée - notez que certaines langues, comme Java, entrent dans les deux catégories).

Un langage catégorisé comme langage de script implique qu'il est utile comme langage "glue". Les scripts ne sont généralement pas des programmes complets, mais remplissent plutôt les lacunes entre les autres logiciels.

Les scripts sont généralement utilisés pour connecter plusieurs programmes ensemble, pour effectuer des tâches subalternes très rapidement / facilement, ou même dans un environnement intégré où les problèmes de performances et de sécurité ont été résumés dans un langage de niveau inférieur. Les langages de script mettent l'accent sur la réduction du temps de développement, d'où la raison pour laquelle la plupart sont interprétés et de très haut niveau.

Casey Kuball
la source
Vous n'énoncez aucune différence conceptuelle, seulement une opinion populaire sur les cas d'utilisation respectifs.
Raphael
1

L'ensemble des «langages de script» est un sous-ensemble de l'ensemble des «langages de programmation». La différence entre C et Perl est la différence entre le langage de programmation système et le langage d'application et entre le langage interprété et le langage compilé.

Les langages de programmation système sont de bas niveau et orientés vers la gestion de la mémoire, des E / S prévisibles, etc. Les langages d'application sont orientés vers une résolution rapide des problèmes de niveau supérieur, comme «lire les paramètres du fichier, ouvrir le socket et traiter les demandes en fonction des paramètres».

Ainsi, les langages d'application ont tendance à être de niveau beaucoup plus élevé que les langages système, c'est-à-dire qu'ils fournissent une grande quantité de fonctions d'abstraction et d'aide intégrées et ajoutent souvent une gestion automatique de la mémoire.

Les programmes dans les langages compilés sont traités dans un certain code complètement avant l'exécution du programme. Les langages de script sont traduits dynamiquement en cours d'exécution et comprennent souvent des fonctionnalités de génération de code dynamique et d'inclusion de fichiers avec du code source.

Ainsi, tous les langages de script sont des langages d'application, mais l'opposé n'est pas vrai. Les langages système sont toujours des langages compilés, car les langages de script incluent généralement des fonctionnalités qui ne sont pas pragmatiques à implémenter en termes de langage lui-même. Notez cependant que la différence script (interprété) / compilé concerne davantage l'implémentation: pour certains langages, les deux types d'implémentations peuvent exister, comme pour haskell.

permeakra
la source
Je pense que c'est une erreur de tirer cette dichotomie interprétée / compilée. Je ne pense pas non plus que ce soit une relation de sous-ensemble, bien que les ensembles aient certainement une intersection non vide. De même, les niveaux haut et bas ne savent pas décrire avec précision la distinction. Prolog est de très haut niveau, mais n'est pas un langage de script comme le script bash ou java.
jmite
1

D'autres ont couvert des attributs qui ont tendance à être associés aux langages de script et aux langages sans script. C'est utile pour avoir une idée de ce que les gens veulent dire lorsqu'ils utilisent le terme «langage de script», mais je pense qu'il est plus important de comprendre qu'il n'y a tout simplement pas de frontière bien définie: deux personnes bien informées pourraient ne pas être d'accord sur le fait qu'un langage particulier X soit langage de script. Le terme «langage de script» a néanmoins une utilité car il existe un large consensus sur les langages qui sont loin à l'intérieur, ou bien à l'extérieur de la frontière.

Comparez «voiture familiale» vs «voiture de sport» ou «magazine» vs «journal». J'ose dire qu'il serait difficile de trouver une règle 100% fiable pour différencier chaque voiture familiale de chaque voiture de sport généralisable (ce qui signifie qu'elle ne revient pas à énumérer toutes les voitures existantes dans chaque catégorie) et au moins potentiellement objective ( ce qui signifie qu'il serait acceptable pour tout le monde). Mais ces termes sont toujours utiles dans la pratique, car même si certains cas sont difficiles à décider, de nombreuses voitures sont clairement dans une catégorie et non dans l'autre.

j_random_hacker
la source
0

Une différence que je n'ai pas encore vue mentionnée est que lorsqu'elle est utilisée comme prévu, le temps d'exécution de la plupart des scripts sera dominé par des opérations "macroscopiques", et les performances des opérations microscopiques n'auront pas d'effet significatif sur le temps d'exécution global. Par exemple, si un programme d'animation de lancer de rayons peut inclure un langage de script avec une instruction "render image", un script pour produire 240 images d'animation peut passer quatre heures dans l'instruction "render image" et un total de quatre secondes pour tout le reste. Même si l'on devait tout accélérer d'un facteur un million en dehors du moteur de rendu, cela aurait moins d'effet sur les performances globales que d'accélérer le moteur de rendu de 0,1%.

supercat
la source