Si le travail d'un compilateur traduit essentiellement un code source en code de niveau de la machine, peut-il y avoir un problème dans un compilateur, c'est-à-dire une "traduction" défectueuse? "
Il en va de même pour un interprète: peut-il ne pas émettre le contenu requis parfois?
Je n'ai entendu parler de bugs dans les compilateurs/interprètes, mais existent-ils?
Vous avez tendance à les trouver plus dans des langues qui sont en cours de développement activement que chez celles qui sont relativement matures (et ne voient donc pas beaucoup de changement sur une base fréquente). C'est probablement pourquoi la plupart des langues sont libérées à diverses "étapes" de la stabilité. Une construction nocturne est beaucoup moins susceptible d'être stable qu'a Candidate de libération, qui est moins susceptible d'être stable qu'une version entièrement libérée et activement utilisée.
Heureusement, la plupart de ces langues (en particulier celles qui sont open source) auront un système de suivi de bogues public que vous pouvez soumettre des rapports.
Dans ma propre expérience, j'ai couru dans un n bogue assez obscur mais grave dans Scala sur Windows . J'ai soumis mes conclusions au suivi de l'insecte et que le problème a été fixé assez rapidement. . Dans ce cas, les développeurs de langue étaient suffisamment intelligents pour inclure une note utile dans la sortie du journal des erreurs, ce qui suggère que ce que j'avais exécuté était en fait une erreur de compilateur et a déclaré où soumettre le rapport.
dans les mots de layman :
Tous les programmes peuvent avoir des bugs.
Les compilateurs sont des programmes.
Ergo, les compilateurs peuvent avoir des bugs.
Il y a des bugs même dans le matériel; Un exemple célèbre est le Pentium FDIV Bug . Sans aucun doute, il est possible que les compilateurs contiennent des bugs.
Les compilateurs et les interprètes sont également des logiciels et ils ne sont donc pas libres d'aucun des problèmes d'autres logiciels.
Ceci est un exemple d'un compilateur aussi récent que MSVC 11 (2012) , et voici un article sur la manière dont ils testent le backend .
Bien sûr, parce que les compilers sont des logiciels.
En 2005, j'ai eu un morceau de code échoué dans un logiciel très critique que j'avais écrit pour une grande entreprise. Depuis que cela coûte littéralement l'entreprise des millions de dollars à rectifier, ils ont bien sûr lancé une enquête de grande culture.
Heureusement (de mon point de vue), la question s'est avérée être un problème de compilateur à Delphi. Dans l'essai enfin, la valeur de retour d'une fonction a été détruite et aboutit à des résultats absolument aléatoires à l'appelant. Cela a été documenté et reconnu par Borland.
.Net était bien connu pour avoir littéralement des centaines de fuites de mémoire différentes, en particulier dans ses premières implémentations.
Je soutiendrais qu'il n'y a pas de logiciel sans bug. Les compilateurs ne font pas exception. Cependant, ils sont testés plus approfondis que la plupart des logiciels d'affaires, et sont consommés par des personnes intelligentes, critiques, controversées, de sorte que leur bilan ait fait, dans l'ensemble, a été assez bonne.
Non seulement les insectes, mais aussi des logiciels malveillants délibérés.
Le Troie "Connexion" mis en œuvre par Brian Kernighan au compilateur d'origine Unix C est le plus connu de ceux-ci; L'article http://cm.bell-labs.com/who/ken/trust.html a de l'arrière-plan à ce sujet.
Oui, bien sûr, comme tous les compilateurs logiciels ont des bogues, par exemple, la liste des bugs GCC est ici
Oui.
De plus, non seulement avec les compilateurs, mais également avec des interpréteurs/debuggers et tout outil logiciel tiers.
Nous utilisons actuellement certains logiciels tiers et avons eu une partie de la question. Parfois, ils nous remercient, pour avoir trouvé et signaler un bogue. :)
Certains d'entre eux ont également des fuites de mémoire, ce qui conduit à un crash. La question importante ici pourrait être, comment déterminer si l'outil tiers, ou le compilateur a des bugs pour votre application pour fonctionner correctement?
Compiler est un programme qui lit un programme écrit dans une langue (la langue source) et le traduit par un autre programme équivalent dans une autre langue (la langue cible), principalement la langue de la machine.
Il existe différentes phases de compilateur à travers lesquelles votre code de langue source est numérisé en ligne par ligne. Il existe une table de symboles qui conserve la piste de tous les mots-clés numérisés pour le code de langue source.
Phase 1: Analyseur lexical - lit tout le caractère dans le programme source et forme la séparation logique des jetons (int, char, flotteur, if-ele, pour, etc.)
Phase 2: Analyseur de syntaxe - Analysez la structure du flux de jetons. Analyse hiérarchique des expressions qui inclut postfix/préfixe, etc. (A = B + C * D)
Phase 3: Analyseur sémantique - Type de vérification des jetons (entier à réel, flotteur, etc.) et de nombreuses choses comme la préséance de l'opérateur, etc.
Phase 4: Générateur de code intermédiaire - A = B + C * D-E (TEMP1 = C * D, TEMP2 = TEMP1 + B, TEMP3 = TEMP2-E)
Phase 5: Optimisation du code - Analyse diverses (flux de contrôle, flux de données, transformations)
[.____] qui élimine: Code de redondance, Constantes Propogation, code mort partiel, Subexpression commune, code invariant de boucle
Phase 6: génération de code - génération de code cible (principalement du langage d'assemblage) mettant des valeurs dans des registres
Toutes ces phases ne sont rien que des programmes bien écrits et il pourrait y avoir n nombre de défauts dans ce domaine ..