Quelle langue, à votre avis, permet au programmeur moyen de générer des fonctionnalités avec le moins de bogues difficiles à trouver? Il s’agit bien entendu d’une question très vaste, et j’intéresse des réponses et des idées très larges et générales.
Personnellement, je trouve que je passe très peu de temps à rechercher des bogues étranges dans les programmes Java et C #, alors que le code C ++ a son ensemble distinct de bogues récurrents, et que Python / similar possède son propre ensemble de bogues communs et stupides qui seraient détectés par le compilateur. dans d'autres langues.
De plus, j'ai du mal à envisager les langages fonctionnels à cet égard, car je n'ai jamais vu un programme volumineux et complexe écrit en code entièrement fonctionnel. Votre entrée s'il vous plaît.
Éditer: Clarification complètement arbitraire d'un bogue difficile à trouver: Il faut plus de 15 minutes pour reproduire ou plus d'une heure pour trouver la cause et la correction.
Pardonnez-moi s'il s'agit d'un doublon, mais je n'ai rien trouvé sur ce sujet spécifique.
la source
Réponses:
Plus le système de types du langage est puissant, plus nombreux seront les bogues détectés au moment de la compilation.
La figure suivante compare certains des langages de programmation bien connus en termes de puissance, de simplicité et de sécurité de leurs systèmes types. [ Source ]
* Prise en compte de la capacité à utiliser des constructions non sécurisées.
la source
(let ((itbe '())) ... )
...À mon avis, Haskell vous aide à éviter certaines sources d'erreur communes:
null
ne fait pas partie des définitions de type de valeur: vous évitez ainsi l' erreur d'un milliard de dollarsla source
null
, il yundefined
en a un qui est un membre de tous les types.)Les bogues les plus difficiles à trouver sont généralement les conditions de concurrence dans les applications multithreads,
Par conséquent, vous avez besoin de langues qui gèrent le parallélisme pour vous le plus possible et le moins intrusif possible. Ce ne sont pas encore grand public. Java en fait, mais vous laisse avec la partie difficile.
À ma connaissance, vous avez besoin d'un langage fonctionnel, car "l'absence d'effets secondaires" est la chose qui fait en premier lieu la disparition des deux points. J'ai constaté que le travail est en cours pour faire de Haskell un langage multi-thread efficace et transparent, et je pense que Fortress est conçu dès le départ pour être un langage parallèle efficace.
Edit: En Java,
Executors
manipulez encore plus de parties difficiles. Vous devez adapter les tâches individuelles à l'Callable
interface.la source
Ada est conçu pour que le plus grand nombre possible soit capturé au moment de la compilation plutôt qu'au moment de l'exécution. Cela signifie qu'il faut souvent environ 10 fois plus de temps pour compiler un programme dans Ada que son équivalent en Java, mais quand il compile, vous pouvez être beaucoup plus sûr que des classes entières de bogues ne se manifesteront pas lorsque le programme courir.
la source
Tout d’abord une définition: un bogue difficile à trouver, si je comprends bien, est un bogue qui peut être reproduit mais dont la cause est difficile à trouver.
L'aspect le plus important est probablement ce que j'appellerais l' étroitesse , c'est-à-dire jusqu'où un bogue peut-il échapper, quelle est la portée d'un bogue pouvant potentiellement influencer. Dans des langages tels que C, un bogue, par exemple un index de tableau négatif ou un pointeur non initialisé, peut affecter littéralement tout le contenu du programme. Dans le pire des cas, vous devez tout vérifier partout pour trouver la source de votre problème.
Les bonnes langues à cet égard prennent en charge les modificateurs d'accès et les appliquent de manière à rendre difficile, voire impossible, de les contourner. Les bons langages vous encouragent à limiter la portée de vos variables au lieu de rendre trop facile l’utilisation de variables globales (par exemple, "tout ce qui n’est pas explicitement déclaré est une variable globale avec un type et une valeur par défaut").
Le deuxième aspect important est la concurrence . Les conditions de course sont généralement difficiles à reproduire et donc difficiles à trouver. Les bonnes langues offrent des mécanismes de synchronisation faciles à utiliser et leurs bibliothèques standard sont thread-safe si nécessaire.
Cela complète déjà ma liste; D'autres choses, comme la frappe forte, aident à attraper les bogues au moment de la compilation, mais ces bogues ne seront probablement pas difficiles à trouver plus tard.
Compte tenu de tout cela, je dirais que Java et C #, ainsi que de nombreux autres langages dans le monde de la JVM et du .net, sont appropriés pour éviter les bogues difficiles à trouver.
la source
Comme Excel est le DSL le plus utilisé, je choisirai Excel. (hors VBA bien sûr)
Cela correspond à la facture:
la source
123
ouABC
) ou une fonction (=SUM(A2:A5)
). Excel évalue ensuite toutes les variables, déterminant l'ordre dans lequel résoudre les dépendances, etc. Il ne s'agit certainement pas que de données.C'est une question difficile, car la plupart des bogues ne sont pas la faute du langage lui-même, mais plutôt la faute des développeurs qui font des erreurs dans leur utilisation du langage.
Je pense que plusieurs aspects des fonctionnalités du langage affectent la probabilité de bugs:
Interactivité - les langages dynamiques avec REPL encouragent l'interaction / l'expérimentation avec des programmes en cours d'exécution et des cycles de code / tests beaucoup plus petits. Si vous pensez que l'itération est un bon moyen de découvrir des solutions simples et propres et de détecter / éliminer les bogues, cela favoriserait les langages interactifs.
Expressivité - Si le code est plus court et moins complexe, il est alors plus facile de détecter les bogues / les erreurs de logique.
Sécurité des types - plus le temps de compilation est long, plus le nombre de bogues détectés sera élevé, donc la sécurité des types est une bonne chose. Cependant, ils ne sont généralement pas difficiles à trouver - même dans un langage totalement dynamique, un type incorrect dans une structure de données provoquera généralement une erreur d'exécution très évidente, et TDD détecte presque toujours ce type de bogues.
Immutabilité - beaucoup de bugs durs sont dus à des interactions complexes entre des états mutables. Les langues qui mettent l’accent sur l’immutabilité (Haskell, Clojure, Erlang) ont un énorme avantage en évitant la mutabilité
Programmation fonctionnelle - les approches fonctionnelles pour écrire du code tendent à être plus "prouvées correctes" que le code orienté objet avec des séquences complexes d’effets / interactions. Mon expérience est que la PF aide à éviter les bugs difficiles - je crois qu'il y a des recherches universitaires quelque part que je ne trouve pas actuellement qui corroborent cela.
Prise en charge des accès simultanés - les problèmes d’accès simultané sont particulièrement difficiles à détecter et à déboguer, raison pour laquelle c’est si important. Tout ce qui nécessite un verrouillage manuel est finalement voué à l'échec (et cela inclut à peu près toutes les approches orientées objet de la simultanéité). Le meilleur langage que je connaisse à cet égard est Clojure - il a une approche unique en matière de gestion de la simultanéité qui associe une mémoire transactionnelle logicielle à des structures de données immuables pour obtenir un nouveau cadre de concurrence simultanée fiable et composable. Voir http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey pour plus d'informations.
la source
Moins une langue est puissante, moins elle vous donne le choix de tirer votre propre pied.
Les langages de haut niveau tels que Java et C # produiront moins de bogues que les langages de bas niveau tels que C ++.
Cela dit, j’estime que Java est plus sécurisé que C #. Java est limité artificiellement afin qu'un programmeur moyen sans connaissances avancées puisse le maîtriser et produire des programmes stables.
la source
À mon avis, Delphi. Basé sur le langage Pascal, le langage est assez simple et intuitif pour que le programmeur moyen (ou même les codeurs inexpérimentés) le découvre facilement. Son support riche en outils et en bibliothèques facilite la recherche de la plupart des bogues.
if (alert = RED) {LaunchNukes;}
ne sera pas compilé, par exemple.)la source
var I: Integer; Pointer(I)^ := $00;
Une chose à prendre en compte est le délai d'exécution.
Au cours des cinq dernières années environ, j'ai principalement développé des applications Web en Java (JSF, Seam, etc.). Récemment, j'ai eu un nouvel emploi et nous utilisons Perl (avec Catalyst et Moose).
Je suis beaucoup plus productif en Perl qu'en Java.
Ne pas avoir besoin de compiler et de déployer (à chaud), en est une des raisons. Je trouve également que l'écriture de cas d'utilisation est plus facile, car cela peut être fait de manière plus itérative. Et les frameworks en Java semblent être un complexe inutile, au moins pour les projets dans lesquels j'ai été impliqué.
Je suppose que le nombre de bogues dans mon code Perl est plus ou moins le même que le nombre de bogues dans mon code Java, il pourrait même être plus élevé. Mais, je trouve et plus facile et plus rapide de trouver et de corriger ces bugs.
la source
Peut-être qu'une analyse du nombre d'outils disponibles pour l'analyse de code statique et dynamique pour chaque langage de programmation pourrait donner une idée. Plus il y a d'outils pour une langue, plus il est probable que la langue soit très populaire parmi les utilisateurs ou très populaire pour générer des bogues difficiles à trouver. Mais je ne parviens pas à me faire indiquer par Google aucune étude réalisée à ce sujet. Il convient également de noter que certaines langues telles que le langage C peuvent être utilisées pour contourner les bogues matériels sous-jacents, ainsi que pour éviter l'usure du matériel à mesure qu'il vieillit.
la source
Au lieu de parler de langues, qu'en est-il de parler de fonctionnalités linguistiques?
la source