Les compilateurs sont-ils utilisés en dehors du développement?

14

Pour autant que je sache, les compilateurs sont destinés aux développeurs qui compilent leur code dans des fichiers exécutables (code machine). Les compilateurs ne s'étendent pas à la machine d'un client ou au système de l'utilisateur final.

Au lieu de cela, les développeurs utilisent simplement le compilateur pour convertir leur code en code machine, qui est ensuite transporté vers les autres machines pour être utilisé comme applications.

Les compilateurs ont-ils une fonction en dehors de ce processus? Si oui, quand sont-ils utilisés?

Pankaj Upadhyay
la source
21
Oui, les compilateurs compilent du code.
Tom Squires
@Tom: J'ai lu quelque part que les compilateurs C sont installés sur diverses machines, y compris les consoles de jeux. Est-ce à dire que nous écrivons du code en C, qui est ensuite livré à ces appareils, où sont compilés par le compilateur puis exécutés par l'interpréteur?
Pankaj Upadhyay
3
@Pankaj Upadhyay: Il est possible que le code pourrait obtenir envoyé à une machine, puis compilé par un processus interne. Il est peu probable que l'utilisateur de l'appareil puisse voir cela se produire ou le savoir. Cela peut être fait si des parties de code doivent être compilées pour du matériel spécifique et que les solutions qui testent le matériel au moment de l'exécution sont trop lentes, ce qui entraîne la nécessité de distribuer du code et de compiler pendant l'installation. Peut-être ...
FrustratedWithFormsDesigner
3
@Pankaj Aucune console de jeu n'est livrée avec des compilateurs, mais certains peuvent y être installés. Sony a fourni une version de Linux et GCC qui pourrait être installée sur la PS2 par exemple. D'autres personnes ont craqué / piraté leur chemin pour obtenir d'autres systèmes d'exploitation et logiciels sur les consoles.
IronMensan
4
@Stargazer: Vouliez-vous dire: "Non, les compilateurs traduisent d'une langue source vers une langue cible"? L'omission de la virgule fait que votre phrase signifie le contraire de votre sens.
Daniel Pryden

Réponses:

19

Oui et non. Oui, le scénario classique est un développeur utilisant un compilateur pour générer du code machine à partir du code source, et le code machine est ensuite distribué aux utilisateurs.

Il y a cependant quelques exceptions. Tout d'abord, de nombreux projets open source sont distribués principalement (ou même exclusivement) sous forme de code source, et attendent de l'utilisateur final qu'il les installe en tapant quelques commandes comme make, puismake intall. Cela invoquera le compilateur, l'éditeur de liens, etc., pour générer le code machine à partir du code source de l'ordinateur de cet utilisateur. Dans ces cas, cependant, le processus de construction et d'installation est (au moins destiné à être) automatisé au point que l'utilisateur a rarement besoin de beaucoup de connaissances au-delà du fait que s'il n'a jamais installé un package de code source uniquement auparavant , leur gestionnaire de packages répertorie généralement certains packages de "développement" comme une condition préalable à l'installation de l'application qui leur tient vraiment à cœur (bien que certains considèrent toujours cela comme hostile pour les utilisateurs finaux).

Une autre exception (à laquelle on a fait allusion, mais qui n'est pas très bien expliquée dans les autres réponses que j'ai vues) concerne les compilateurs juste à temps (JIT). Quelques exemples évidents de compilateurs JIT sont le Microsoft Common Language Runtime (CLR) et la machine virtuelle Java (JVM). Dans ces cas, il y a normalement deux compilateurs entièrement distincts impliqués dans la traduction du code source en code machine. L'un est utilisé par le développeur. Cependant, plutôt que de générer directement du code machine, il génère un code octet indépendant de la machine. Le CLR / JVM comprend ensuite un deuxième compilateur, entièrement distinct du premier, qui convertit ces codes d'octets en code machine pour l'ordinateur cible.

Je dois ajouter que le deuxième compilateur n'est pas strictement nécessaire. Les premières versions de la JVM (par exemple) venaient d'interpréter les codes d'octets au lieu de les compiler. Cependant, cela entraîne souvent une pénalité de performances assez grave, de sorte que la plupart des machines virtuelles Java relativement récentes destinées à la production incluent un compilateur JIT.

Jerry Coffin
la source
24

Oui, les compilateurs sont principalement utilisés par les développeurs, à quelques exceptions notables près. Les utilisateurs finaux utilisent parfois des compilateurs pour compiler et installer les derniers logiciels open source, même s'ils n'apportent aucune modification au code. De plus, certains langages de programmation n'ont pas de compilateurs. Ils utilisent plutôt des interprètes qui "compilent" à la volée. Dans ce cas, les utilisateurs finaux doivent avoir installé l'interpréteur sur leurs machines.

Karl Bielefeldt
la source
4
Si nous devions restreindre la définition de "compilateurs" aux programmes qui génèrent des fichiers exécutables, alors ce serait une bonne réponse. Cependant, ce n'est qu'un sous-ensemble de la vraie définition de "compilateur"
riwalk
16
@Jan Soltis: Je ne suis pas d'accord. J'ai compilé le noyau Linux à partir des sources: cela signifie-t-il que je suis un développeur de noyau Linux ? Je n'ai jamais modifié le code du noyau Linux ni soumis de correctif - je dirais que cela signifie que je ne suis pas développeur du noyau. De plus, depuis plusieurs années que j'utilise Gentoo comme système d'exploitation principal, j'ai compilé chaque logiciel sur la machine. Cependant, la grande majorité de ceux-ci ont été compilés automatiquement par le système de gestion des packages Portage. Je dirais que dans ce cas, j'agissais en tant qu'utilisateur final mais pas en tant que développeur .
Daniel Pryden
8
@Jan Soltis: Je suis conscient que c'est votre avis. Je suis respectueusement en désaccord. J'ai fourni des contre-arguments pour appuyer ma position, pendant que vous continuez à faire des affirmations non étayées. Vous semblez penser qu'il existe une frontière nette entre "développeur" et "utilisateur final" qui, je ne crois pas, existe.
Daniel Pryden
6
Télécharger des sources puis exécuter "make install" n'est pas un développeur. Il s'agit définitivement d'une opération pour l'utilisateur final.
Kristopher Johnson
3
@Jan: Je pourrais accepter que l' aide d' une distro comme Gentoo qui compile les paquets qui vous fait au moins une puissance utilisateur, mais qui est encore clairement un type d'utilisateur. Compiler le code des autres sans le modifier, y ajouter ou même le lire ne fait pas de vous un développeur.
Carson63000
10

Oui

Un compilateur est défini comme un programme qui traduit le code d'une langue dans une autre (voir Wikipedia ). L'utilisation la plus courante des compilateurs est de traduire le langage source en code machine, mais cela définit le mot "compilateur".

Par exemple, Python génère du code d'octet lorsqu'il importe un module et correspond ainsi à la définition d'un compilateur (car il convertit du langage source, Python, en langage cible, le code d'octet Python).

Un autre exemple est le moteur JavaScript V8. Il convertit JavaScript en code machine x86 , et s'inscrit donc également dans la définition d'un compilateur. Non seulement V8 correspond à la définition d'un compilateur, mais il est inclus dans Chrome et est très largement utilisé sur les machines clientes.

riwalk
la source
4

Un cas serait pour une application qui a généré dynamiquement du code lors de l'exécution, puis a exécuté le code généré. Ce code devrait être compilé au moment de l'exécution.

Edit: Il existe d'autres exceptions, mais elles avaient déjà été mentionnées dans d'autres réponses.

Morgan Herlocker
la source
+1 dit simplement JIT
gnat
1
Le moteur V8 dans Chrome ne fait pas exception à la règle.
riwalk
Mis à jour pour clarifier. Je me rends compte qu'il y a d'autres exceptions.
Morgan Herlocker
3

les compilateurs sont destinés uniquement aux développeurs pour compiler leur code de langage de programmation en fichiers exécutables (code machin)

Je dirais que "les compilateurs sont destinés principalement aux développeurs ...". Mais j'ai vu des exemples où des programmes génèrent du nouveau code de langage de programmation à la volée et ont donc besoin d'un compilateur à installer sur la machine des utilisateurs finaux. Cela ne signifie pas que l'utilisateur final doit travailler seul avec le compilateur.

Raisons possibles de cette conception de programme:

  • performances: pensez à une application pilotée par des règles où les règles sont stockées dans une sorte de magasin de données d'utilisateur final et vous avez des données de masse à traiter par ces règles. Au lieu d'interpréter les règles encore et encore, un programme génère d'abord le code de traitement, le compile et l'exécute par rapport aux données à traiter

  • pensez à un programme où l'utilisateur final peut ajouter une sorte de formule mathématique et le développeur du programme ne veut pas implémenter son propre analyseur / interprète pour cela. Au lieu de cela, le programme prend cette formule, fait quelques ajouts pour le transformer en un morceau de code de programme valide, laissez le compilateur le compiler et l'exécuter ensuite.

Doc Brown
la source
hmm .... Cela ne signifie pas que l'utilisateur final doit travailler seul avec le compilateur . Cela explique et clarifie à peu près.
Pankaj Upadhyay
2

C'est vrai - les compilateurs compilent le code source sous forme exécutable, qui est ensuite lié dans un fichier binaire exécutable par un éditeur de liens. Le code source peut également être exécuté directement par un interpréteur tel que l'un des nombreux shells en ligne de commande (shell C, bash, zsh, etc.), awk, sed, etc.

Il peut être difficile de tracer une ligne claire entre «développeur» et «utilisateur final», sauf si vous limitez votre discussion à un produit spécifique. Les développeurs sont tous des "utilisateurs finaux" des outils qu'ils utilisent, et les "utilisateurs finaux" peuvent avoir des outils de développement tels que des compilateurs et des interprètes installés sur leurs machines.

Caleb
la source
2
Ok, je vais -1 celui-ci, car il y a beaucoup de malentendus ici sur les compilateurs. Les compilateurs traduisent le code d'une langue source dans une langue cible. Dire qu'ils génèrent du code machine revient à dire que les véhicules ont 4 roues (oui, la plupart des véhicules ont 4 roues, mais une moto est aussi un véhicule. De la même manière, la plupart des compilateurs génèrent du code machine, mais un convertisseur C # -> VB est un compilateur aussi)
riwalk
1
@ Stargazer712, je vous assure qu'il n'y a pas de malentendu - je sais très bien ce que font les compilateurs, merci. Mais si quelqu'un qui ne sait pas me demande ce qu'est une voiture, je dirais probablement qu'une voiture a quatre roues malgré le fait que certains ne le font pas . Une définition pédante confond souvent plus qu'elle n'explique à une personne essayant de saisir un concept. "Compilateur" peut aussi être une description de poste, mais mentionner cela n'aiderait pas ici.
Caleb
1

Les administrateurs peuvent également avoir besoin d'utiliser des langages de programmation pour écrire des scripts afin d'effectuer diverses tâches automatisées. Par exemple, avoir un script qui supprime les anciens fichiers journaux d'un serveur après 90 jours pour libérer de l'espace disque. Le langage utilisé pour écrire le script doit être interprété ou compilé pour pouvoir être exécuté sur le système.

JB King
la source
1

Certains programmes sont des méta-programmes : en cours d'exécution, ils peuvent générer un autre programme (ou du code source) et le compiler puis l'exécuter d'une manière ou d'une autre. Lisez aussi la programmation en plusieurs étapes .

Donc, pour utiliser ce genre de programmes, un compilateur serait nécessaire, même si l'utilisateur ne sait pas se programmer lui-même (car l'ordinateur générerait du code qui doit être compilé).

Pour un exemple, voir MELT (qui génère du code C ++ pour étendre GCC ) ou le système d'intelligence artificielle CAIA de J.Pitrat (qui génère du code C - notamment son propre code - pour résoudre les problèmes combinatoires).

De plus, certains langages et certaines implémentations nécessitent presque qu'un compilateur soit présent partout (dans chaque programme codé dans ce langage et implémentation). Premièrement, plusieurs navigateurs Web contiennent un moteur Javascript JIT (comme V8 ). De plus, la plupart des implémentations Common Lisp -eg SBCL - contiennent un compilateur (même utile pour exécuter des applications, qui peuvent générer et évaluer des expressions). Lisez aussi les langues homoiconiques et les programmes Qine .

Basile Starynkevitch
la source