web-dev-qa-db-fra.com

Quelles sont les cinq choses que vous détestez dans votre langue préférée?

Il y a eu un groupe de Perl-hate sur Stack Overflow récemment, alors j'ai pensé apporter ma question " Cinq choses que vous détestez au sujet de votre langue préférée " à Stack Overflow. Prenez votre langue préférée et dites-moi cinq choses que vous détestez à ce sujet. Celles-ci peuvent être des choses qui vous ennuient, des défauts de conception reconnus, des problèmes de performances reconnus ou toute autre catégorie. Vous devez juste le détester, et ce doit être votre langue préférée.

Ne le comparez pas à une autre langue et ne parlez pas de langues que vous détestez déjà. Ne parlez pas des choses que vous aimez dans votre langue préférée. Je veux juste entendre les choses que vous détestez mais tolérez afin que vous puissiez utiliser tous les autres trucs, et je veux en savoir plus sur le langage que vous souhaiteriez que d'autres personnes utilisent.

Je pose la question à chaque fois que quelqu'un essaie de transmettre sa langue préférée sur moi, et parfois comme question d'entretien. Si quelqu'un ne peut pas trouver cinq choses à haïr à propos de son outil préféré, il ne le sait pas assez bien pour le recommander ou en retirer les gros dollars. Il ne l'a pas utilisé dans suffisamment de situations différentes pour l'explorer pleinement. Il le préconise en tant que culture ou religion, ce qui signifie que si je ne choisis pas sa technologie préférée, je me trompe.

Je me fiche de la langue que vous utilisez. Vous ne voulez pas utiliser une langue particulière? Alors ne le fais pas. Vous faites preuve de diligence raisonnable pour faire un choix éclairé et vous ne l'utilisez toujours pas? Bien. Parfois, la bonne réponse est "Vous avez une équipe de programmation forte avec de bonnes pratiques et beaucoup d’expérience dans Bar. Passer à Foo serait stupide."


C'est aussi une bonne question pour les critiques de code. Les personnes qui connaissent vraiment une base de code auront toutes sortes de suggestions à faire, et ceux qui ne le connaissent pas aussi bien ont des plaintes non spécifiques. Je demande des choses comme "Si vous pouviez recommencer ce projet, que feriez-vous différemment?" Dans ce pays imaginaire, les utilisateurs et les programmeurs peuvent se plaindre de tout ce qui ne leur plaît pas. "Je veux une meilleure interface", "Je veux séparer le modèle de la vue", "J'utiliserais ce module à la place de celui-ci", "Je renommerais cet ensemble de méthodes", ou peu importe Je n'aime pas la situation actuelle. C'est ainsi que je peux comprendre à quel point un développeur en particulier connaît la base de code. C'est aussi un indice sur la part de l'ego du programmeur dans ce qu'il me dit.

La haine n'est pas la seule dimension permettant de déterminer combien de personnes sont au courant, mais j'ai trouvé que c'était une très bonne chose. Les choses qu'ils détestent me donnent également une idée de la manière dont ils réfléchissent au sujet.

403
brian d foy

PHP

  • Presque chaque fonction standard est dans la portée globale
  • Ordre des arguments incohérent
  • Nom de fonction incohérent
  • Fonctions insensibles à la casse
  • Le script peut se comporter différemment selon le fichier php.ini
  • Être capable d'utiliser des variables non définies
  • Dans certains cas, il faut assigner un résultat à une variable avant que celle-ci puisse être utilisée dans une fonction

Et beaucoup plus subjectivement:

  • Dactylographie dynamique
2
Yacoby

Python

  1. Il n'y a pas de Django pour Python 3.
  2. Typage statique. Oui, le typage dynamique est une bonne chose, mais parfois je souhaite le rendre statique.
  3. Support unicode correct (corrigé dans Python 3)
  4. Nom des constructeurs. Je déteste tout cela souligne __in__ mon code.
  5. Les fils ne sont pas très efficaces
2
Davinel

LISP commun

  • les conditions ne sont pas des classes (car les classes sont arrivées plus tard), même si leur interface est presque identique
  • certains noms sont simplement étranges, par exemple flet/labels (seule différence: scope) et defvar/defparameter (seule différence: comportement déjà défini), ou n’importe laquelle des fonctions de modification de bits (dpb, ldb, etc.)
  • les paquets sont ... vraiment difficiles à comprendre - chaque fois que je pense les comprendre, ils ne font pas ce que je veux
  • les structures de données et les fonctions intégrées ne sont pas aussi génériques qu'elles pourraient l'être (par exemple, pourquoi ne puis-je pas définir ma propre fonction de hachage de manière portable?)
  • plusieurs espaces de noms pour des fonctions, des variables, etc. (je ne suis pas opposé à cela en principe, mais CL l'a rendu trop complexe; Norvig a dit qu'il ne pouvait pas dire à partir de la spécification, mais il semble qu'il y ait au moins 7 espaces de noms)
2
Ken

De loin la chose que je déteste le plus de ma langue préférée est que mon choix ne cesse de changer. Chaque fois que je pense avoir trouvé The One, je trouve cinq (ou plus) choses que je déteste à ce sujet. Et puis l'herbe a l'air plus verte là-bas ...

2
WReach

Python:

Je suis toujours un utilisateur modéré de python. Par conséquent, mes plaintes pourraient bien être un verrou de connaissance ou un mauvais usage. Les commentaires sont les bienvenus. J'aime cette langue.

  1. Support de fil médiocre et GIL. Si vous souhaitez utiliser la plate-forme multicœur, la plupart des programmeurs python devraient probablement recommander le multitraitement ou une sorte de traitement, n'utilisez pas de threading. Cela ne vous donnerait pas la performance que vous attendez.
  2. propriété seulement par exemple variable. _class_var = property (classmethod (some_method)) ne fonctionnerait tout simplement pas. Comment puis-je obtenir une variable de classe enveloppée par une propriété?
  3. pas de contrôle d'accès. Tous les contrôles d'accès sont syntaxiques. Tout comme private est __private, protect est _protected, etc ... Et espérons que tout le monde programme python respecte la convention de dénomination. Allez, on peut faire mieux que ça.
  4. Je suis d'accord avec la philosophie python d'être une syntaxe simple et claire, mais une syntaxe simple et claire qui n'est pas prise en charge semble constituer un verrou de bon sens, à mon avis. Tels que, a ++, ++ a, a-- et --a, auto-de/incrément, qu'est-ce qui ne va pas avec ceux-ci? foo = (a> b? a: b) opération unaire, quel est le problème avec ceux-ci? (Je sais que py2.6 a introduit quelque chose de similaire, mais étant donné le soutien massif de presque toutes les autres langues pour cette syntaxe simple, pourquoi réinventer la roue? Pourquoi ne pas simplement suivre la meilleure pratique? Une bonne chose ne devrait-elle pas rester juste "forme"?)
  5. Programme d'interface. Python n'a pas de concept d'interface ou de classe abstraite (py3k a quelque chose appelé abc), tout est concret. Fournir un mot clé "interface" ou "abstrait" pour construire une extension de classe squelette et une classe de garde ne serait pas une mauvaise idée, je pense. Cela aide à la conception descendante. Actuellement, je dois juste remplir chacune des méthodes avec NotImplementedError, un travail fastidieux.
  6. Je dois ajouter ceci. la version inférieure à 3.x contient les types str et unicode. C'est un vrai cauchemar. Cela rend les mélanges ascii et non ascii/unicode plus susceptibles d’échouer (mauvais, mauvais)

J'ai vu des gens se plaindre de la vitesse. Je ne comprends pas ça. C'est un langage d'interprétation, le code n'est pas compilé en code machine avant l'exécution, c'est tout simplement sa nature. Vous ne pouvez pas comparer la vitesse d'un langage interprété à un langage compilé. Autant que je sache, parmi les langages d'interprétation/de script, python n'est pas lent.

2
jimx

PHP:

  • Assur () fonction absurde ... il exécute eval () sur le code à l'intérieur
  • ?> tag supprime les retours à la ligne qui le suivent?!
  • Étrange gestion des chaînes numériques (essayez-les en tant que clés de tableau)
  • Le support unicode douloureux qui semble plus maintenant sera résolu par PHP 6
  • Un faible coût d’entrée signifie que 95% donnent à PHP programmeurs un nom horrible - et essayer de trouver quelqu'un dans les 5% à embaucher est dingue.
2
user350443

LISP commun

  • Manque de bibliothèques standard pour des fonctionnalités plus modernes (sockets, threads, ...)
  • Pourrait utiliser une interface utilisateur normalisée qui correspond au système de fenêtrage natif
  • La capacité de Scheme à affecter une expression lambda à une variable et à utiliser cette variable directement en tant qu'appel à une fonction semble plus pratique que celle appliquée par FUNCALL. Effet secondaire d'avoir plusieurs espaces de noms, je suppose
  • Système d'empaquetage standardisé au niveau source pour les bibliothèques afin qu'elles puissent être facilement utilisées à partir de plusieurs implémentations

Je me demande à quoi ressemblerait un LISP fortement typé

2

Je suis sur une branche parce que je ne peux pas vraiment l'utiliser à plein temps, mais je vais essayer quand même!

Perl 6

  1. func ("frew")! = func ("frew")
    • Cela m'agace, mais il y a de bonnes raisons pour cela. En Perl 5 print (5 + 6) * 10 still me procure de temps en temps
  2. Il peut être plus facile d’analyser que Perl 5 dans beaucoup d’endroits, mais ça tue encore parfois mon éditeur
  3. Il a encore beaucoup de bruit de ligne Perl 5 qui effraie beaucoup de gens. Cela signifie qu'il est plus difficile de les exciter, etc.
  4. Il n'y a pas encore de bibliothèque.
    • Ce ne sera pas un problème si Perl 6 finit effectivement par supporter Perl 5, mais cela pourrait ne pas être un fardeau à porter.
  5. Il n'y a pas de REPL, ou ce que les rubyists appelleraient irb.
    • Un Perl 6 interactif solide avec remplissage des onglets, codage des couleurs, etc. rendrait l’utilisation et l’apprentissage beaucoup plus agréables.
  6. Actuellement, le documentation est fondamentalement la spécification anglaise. Pas vraiment une lecture facile.
  7. Je sais que c'est un cliché stupide, mais il n'est pas encore sorti!
    • (J'ai le droit de me plaindre parce que j'aide :-P)

Les trois premiers sont la langue; les autres ne sont pas vraiment la langue elle-même mais le fait que ce ne soit pas encore sorti.

2
Frew Schmidt

Perl

J'aime ce langage et je ne veux pas ajouter de choses déjà utilisées, mais personne n'en a encore parlé, alors je vais le jeter sur le pot. Lorsque j'ai utilisé cette fonctionnalité, j'ai trouvé l'expérience la plus horrible de ma vie (et j'ai travaillé dans le langage d'Assembly):

  • Les fonctions write() et format().

Ils ont la pire, la plus laide et la plus horrible syntaxe imaginable, et pourtant ils ne parviennent pas à vous donner plus de fonctionnalités que celles que vous pouviez déjà obtenir avec certains (infiniment plus jolis) printf() fonctionnent. Personne ne devrait jamais essayer d'utiliser ces deux fonctions pour produire une sortie , tout simplement à cause de leur gravité.

Je suis sûr que quelqu'un ne sera pas d'accord, mais quand je les ai examinés, espérant qu'ils régleraient mon problème, je les ai trouvés comme un "monde de souffrance" (pour citer Big Lebowski), et j'espère que Perl6 a soit éliminé ou mieux, complètement réécrites pour les rendre un peu plus utilisables et utiles.

2
Chris Lutz

Python

  1. La bibliothèque standard respecte leurs propres règles de style dans de nombreux endroits. (PEP-8)
  2. Le mot clé super de Py3k est plein de magie indésirable (vous ne pouvez pas l'attribuer à un nom différent, fonctionne sans self , pourquoi avons-nous ce paramètre explicite à tout?)
  3. Le support Unicode est incomplet dans Py2k et aspire dans Py3k (entrée standard en Unicode, pas de données binaires! WTF? La création d'un nouveau standard WSGI est compliquée.)
  4. Le GIL. Support multi-threading très limité (avec CPython)
  5. PyPI (Python Package Index) est nul. Coup d'œil sur Rubygems
2
passy

Haskell

  1. Parfois, le système de types se sent en arrière. Que faire si je ne veux pas que le compilateur déduise des types pour mes variables? Et si je veux le contraire, où il vérifie les contraintes sur lesdites variables? Par exemple, au lieu de déduire le type des éléments d'une liste, il s'assure qu'ils appartiennent tous à une classe de types particulière. Il s'agit d'une différence subtile mais énorme qui rend difficile la programmation des interfaces utilisateur. Cela peut être fait, mais cela demande plus d’efforts que dans d’autres langues. Haskell bascule pour les parties non-UI, mais l'interface je laisse à une langue non typée.

  2. Permettre la construction de valeurs infinies conduit parfois à des erreurs vraiment frustrantes.

  3. NoMonomorphismRestriction.

  4. La manipulation bytestring me mord parfois dans le cul et vous ne le saurez pas jusqu'à ce que votre programme se bloque parce que vous les avez mal mélangés. Quelque chose ne va pas ici, lorsque nous perdons des informations de type qui auraient dû empêcher cela.

  5. Les classes de types doivent être automatiquement dérivées pour les cas triviaux, comme les types de témoins, mais il existe un risque potentiel d’abus.

2
user350201

C

  • Il est tellement flexible et puissant qu’il est très facile d’écrire un code vraiment horrible ou carrément dangereux (ou, si vous préférez, "avec un grand pouvoir vient une grande responsabilité").
  • '=' pour l'affectation et '==' pour l'égalité; facile à confondre dans les déclarations 'if'.
  • L'implémentation d'un certain nombre de parties fondamentales du langage dépend du compilateur; par exemple. la taille des types de base, l'ordre des bits dans les champs de bits, le remplissage et l'ordre des octets dans les unions.
  • Les champs de bits ne sont pas paramétrables (vous pouvez par exemple avoir un tableau d'ints, mais vous ne pouvez pas avoir un tableau de bits).
  • La gestion des cordes pourrait être améliorée.
2
Steve Melnikoff

c #:

1) les méthodes statiques doivent être membres d'une classe

2) les méthodes d'extension statique ne peuvent être ajoutées qu'à des classes statiques

3) L'implémentation des fonctions d'interface n'est pas marquée avec quelque chose comme 'override' pour montrer qu'elles proviennent d'une classe ou d'une interface de base (il est donc difficile de vous assurer de surcharger la méthode que vous attendez (avec la signature correcte) avec juste une révision du code) .

Je viens d'avoir 3. Je suppose que c'est assez bon.

2
Frank Schwieterman

C #

Je sais que c'est stupide, mais j'aimerais que les types de données se convertissent en ce que je veux, sans que je doive ajouter (int) ou Convert.ToInt32 ou peu importe. Cela me ferait gagner du temps. Et ça me dérange que si j'écris quelque chose pour sortir un int et qu'il s'avère que j'ai besoin d'un long, alors souvent je dois passer et changer tout ce que j'ai fait pour que ça marche . Fais le juste pour moi!

Désolé, je ne pouvais pas penser à cinq, mais je suis nouveau dans ce domaine, alors je reviendrai peut-être et en ajouterai plus tard: P

2
Sir Graystar

Cinq choses que je déteste à propos de C++

  • Temps de lien. Avec les versions distribuées, je peux reconstruire l'intégralité de notre projet en même temps qu'il faut notre éditeur de liens pour s'exécuter.
  • Pas de moyen standard pour empêcher la réorganisation des opérations en mémoire. L'utilisation de la mémoire combinée en écriture nécessite généralement l'utilisation abusive du mot clé volatile. La prévention de la réorganisation des lectures (souvent essentielle pour l'optimisation lors de l'utilisation de pipelines mathématiques SIMD) est généralement réalisée via l'injection d'un bloc ASM nul au milieu d'une routine.
  • Macros en plusieurs étapes pour résoudre les problèmes de stringification:
#define STR_LINE2(x) #x#define STR_LINE(x)   STR_LINE2(x)#define LINE_NUMBER STR_LINE(__LINE__)
  • C'est généralement pénible de manipuler des cordes.
  • Prolifération des variantes printf non standardisées (vsnprintf_s vs _vsnprintf_s).
2
Vorlauf

Python, encore une fois:

  1. Aucun mot clé de commutateur. Et NON, le dictionnaire ne remplace pas celui-ci. Pas même un tas de déclarations Elif.

  2. Traitement incohérent des sauts de ligne. Pourquoi puis-je faire:

     test = (1,
             2,
             3)
    

    Et pas:

    from itertools import cycle,
                          islice,
                          izip
    

    Pourquoi je ne peux pas faire:

    if stuff \
       and foo \
       or bar:
        return "Formated string with %(arg)s" % \
               {'arg': "bloody slash"}
    

    sans utiliser de slash?

  3. Il n'y a pas une seule façon évidente de le faire. Python échoue sur sa devise, tout comme Java échoue sur "Écrire une seule fois n'importe où".

    # what somebody from an another language would do
    if not test.has_key('foo'):
        test['foo'] = 0
    n = test['foo'] = test['foo'] + 1
    

    contre

    # what an agnostic beginer would do 
    try:
        test['foo'] += 1
    except KeyError:
        test['foo'] = 1
    n = test['foo']
    

    contre

    # what you end up after looking for dictionary default value in the python doc
    test.setdefault('foo', 0)
    n = test['foo'] = test['foo'] + 1
    

    contre

    # what I would do
    n = test['foo'] = test.get('foo', 0) + 1
    

    Et le pire, c'est qu'ils ne font pas exactement la même chose. Il y a des différences subtiles.

  4. Choix entre les espaces et les onglets. Il ne devrait y avoir aucun choix. Choisissez, fixez-le dans la pierre et arrêtez de vous battre.

  5. Pourquoi pouvez-vous faire cela:

    test = {}
    test['foo'] = 0
    

    mais non:

    test = []
    test[] = 0
    

P.S: " ".join(l) est un homme bien. Arrêtez de vous plaindre à ce sujet, ce n'est pas évident, mais avec le modèle d'itérateur en tête, c'est juste la bonne façon de le faire.

2
e-satis

C #

  • Absence de répartition multiple basée sur le type d'exécution des arguments de la méthode. dynamic devrait résoudre la plupart de ces problèmes, mais il n'a pas encore été publié.
    • L'implémentation d'interface est déclarative et non structurelle. J'aime vraiment la façon dont Google utilise la langue Go
    • Faire des appels de méthodes asynchrones est vraiment encombrant (et je suis presque sûr que tous les threads sont des threads de système d'exploitation, pas des threads légers)
    • Pas de système macro. Je ne parle pas de macros de style C ici; Je parle de macros de style LISP/Scheme
    • Les opérateurs sont des méthodes statiques et leurs signatures sont trop contraignantes (et vous ne pouvez pas en créer de nouvelles).
  • 2
    Robert Davis

    EL - Langage d'expression, l'élément ${...} et #{...} dans les pages JSP et JSF 2.0 Facelets, utilisé pour extraire des données du code Java sous-jacent.

    • Toutes les fonctionnalités amusantes, telles que les appels de méthode avec paramètres et la dénomination basée sur des annotations, sont uniquement présentes dans EL dans Java EE 6, disponible uniquement dans Glassfish v3.
    • Il est extrêmement pénible de 1) se procurer les bons pots pour un conteneur Servlet 2.5 antérieur et 2) de les faire fonctionner sans interférer avec aucune implémentation antérieure disponible dans le conteneur.
    • N'ayant qu'une version antérieure de JSF comme 1.2, supprime les appels de méthode et vous permet de travailler avec f: setPropertyActionListener - http://weblogs.Java.net/blog/2009/07/22/say-sayonara -spal - qui, croyez-moi, n’est pas très gentil.
    • L'analyseur EL n'a aucune idée d'où provient l'extrait à analyser et à interpréter. Vous avez donc tendance à donner à tout l'identifiant de sorte que vous puissiez au moins identifier quelle balise l'a rendue grincheuse.
    • Eclipse donne un avertissement à chaque appel de méthode EL car il s’agit de JSF 1.2. seulement aussi.

    C #

    • Les types de référence sont nullables par défaut; le mot clé null en langue n'est pas typé.
    • Absence de syndicats discriminés
    • Les exceptions comme par défaut , méthode de traitement des erreurs non exceptionnelle - il n'y a pas vraiment d'alternative.
    • syntaxe et limitations des instructions de commutateur archaïques
    • Distinction inutile entre constructeurs + méthodes statiques
    • Les méthodes statiques ne peuvent pas faire partie d'une interface
    • Absence d'implémentation d'interface by-shape plutôt que d'implémentation d'interface explicite - ce qui a entraîné de nombreux piratages de conception de langage tels que la syntaxe de requête linq, foreach, la collection et les initialiseurs d'objet - dont aucun ne peut être réutilisé de manière flexible. Par exemple, la syntaxe d'initialisation de l'objet peut être Nice, mais joue mal avec les objets immuables.
    • Impossible d'hériter de "l'interface" d'une classe indépendamment de l'implémentation - conduisant à des duplications de code et à un code hiérarchisé fournissant des interfaces, des classes de base abstraites, quelques implémentations courantes et aucun moyen de choisir les bits à utiliser. Aussi; conduit à trop de code étroitement associé à une implémentation particulière, car il est courant de faire explicitement référence au type d'implémentation plutôt qu'à une interface.
    • Impossible de multiplier l'héritage via la composition car une "interface" de classes est étroitement liée à sa mise en œuvre; effectivement manque de mixins.
    • Les limitations susmentionnées des interfaces entraînent une prolifération d'interfaces pratiquement identiques qui ne se chevauchent pas naturellement dans aucune sorte de hiérarchie de types. IComparable vs. IEquatable vs. IComparable<T> vs objet.Equals ou opérateur == etc. etc. Par extension, créer un type personnalisé satisfaisant toutes ces choses demande plus nécessaire (en particulier pour les classes de collection). De toute évidence, les concepteurs de langage le réalisent, d’où les diverses solutions de contournement, comme linq, foreach et les initialiseurs de collection, qui fonctionnent par forme plutôt que par interface.
    • Utilisation redondante de parenthèses et d'accolades plutôt que de layout-is-structure.
    • Les valeurs renvoyées peuvent être ignorées, ce qui limite l'efficacité de l'inférence de type.
    • Les énumérations ne sont pas un type normal et ne peuvent pas avoir de méthodes. De plus, les valeurs enum ne sont pas typesafe et peuvent être initialisées à 0 bien qu'elles n'aient pas de valeur 0. Mélangez des métaphores en assemblant des enums drapeau et non drapeau.
    • Absence de prise en charge appropriée du type de valeur. Les types de valeur ne peuvent pas être hérités, ont une sémantique de constructeur différente et fonctionnent mal à cause des limitations du CLR. Sémantique confuse concernant les types de valeur: certaines valeurs sont réellement des valeurs (et ne peuvent pas être modifiées), tandis que d'autres sont vraiment des références non-aliasées et non nulles (variables). Cela devient particulièrement déroutant en ce qui concerne le prochain numéro:
    • Distinction sémantique entre les champs et les propriétés, en particulier en liaison avec le manque de modificateur de mutabilité (ala de C++, const)
    • Ne peut pas spécialiser les génériques
    • Impossible de fournir des paramètres de type générique par défaut (par exemple, des génériques d'usine)
    • le manque de typedef rend les génériques difficiles à utiliser (using est un substitut limité mais bon à savoir!)
    • Impossible de généraliser sur des éléments autres que des types (par exemple, des fonctions, des valeurs claires ou des noms). Cela signifie que vous ne pouvez pas faire quelque chose comme créer une implémentation générique d'une propriété de dépendance conduisant à des implémentations désagréables d'éléments tels que les propriétés de dépendance et à l'utilisation excessive d'extraits de code et de code mal lisible en conséquence.
    • Capacité limitée à spécifier des exigences de type génériques, par exemple. méthode de somme générique qui prend à la fois int, double et un bigint (sans hacks difficiles et souvent lents).
    • Une implémentation de méthode d'interface ou un remplacement de méthode virtuelle ne peut pas renvoyer un type plus spécifique ni accepter un type plus général; c.-à-d. un support limité de co/contravariance même en C # 4.
    2
    Eamon Nerbonne

    Cinq choses que j'ai ressenties dans Nemerle:

    • Les fonctions locales ne peuvent pas céder
    • La capacité de compiler un lambda dépend parfois du fait qu’il soit en ligne ou non
    • Sémantique de type valeur/référence incohérente pour les tuples
    • Ambiguïté occasionnelle entre les index de tableau et les arguments de type
    • Absence d'adoption générale
    2
    Don Reba

    C++

    • messages d'erreur cryptiques lorsque des modèles sont impliqués
    • manque de contraintes sur les modèles (beaucoup de cas peuvent être contournés avec une métaprogrammation des modèles, mais cela entraînera un code illisible (du moins pour les programmeurs moyens) dans la plupart des cas)
    • pointeur sur la syntaxe de la fonction membre
    • le comité des normes c ++ devrait publier plus souvent des normes officielles (ou au moins publier des mises à jour séparées de la bibliothèque standard elle-même), ce qui signifie que TR1 a été réellement publié en 2005 et que nous n’avons toujours pas de shared_ptr, bind et similaire dans la bibliothèque standard.
    • -
    2
    smerlin

    C

    1. champs de bits - ils ne sont pas bien spécifiés par le langage et leur fonctionnement dépend du compilateur et de l'architecture.
    2. Il est souvent difficile de trouver où un symbole particulier est défini dans une grande masse de code, en particulier. si ce symbole est produit par une macro. Ce qui me rappelle...
    3. Le pré-processeur est un bidon plutôt laid, sujet à toutes sortes d’abus.
    4. manque de nombres entiers de taille standard (corrigé par uint * _t récemment, mais il y a beaucoup de vieux codes qui flottent partout avec des typedefs ou des définitions personnalisées pour DWORD, Word, BYTE, etc.)
    5. Absence de quelque chose qui ressemble à cpan.org de Perl (j'adorerais me tromper à ce sujet.)

    Edit: Tout en pensant à un CPAN pour C, je pensais ... comment appellerais-je une telle chose, et pensais-je à "ccan", et en le cherchant sur Google, je suis tombé sur ceci: http: //ccan.ozlabs .org /

    Il semble être encore à ses balbutiements cependant.

    2
    smcameron

    R (Projet R pour les statistiques)

    1. Terrible, terrible soutien des cordes
    2. Étonnamment difficile pour certaines tâches descriptives simples, comme la tabulation croisée
    3. La manipulation de grands ensembles de données est effectuée en mémoire.
    2
    Gregg Lind

    VBA (parce que vous pensiez que votre langue était mauvaise)

    1. Les espaces dans une ligne sont strictement appliqués.
    2. Les instructions se terminent simplement et nécessitent un "_" pour passer à la ligne suivante, mais toutes les lignes ne peuvent pas être cassées.
    3. Aucune déclaration ++, -, + =, - =. Sérieusement?
    4. Les tableaux peuvent commencer à n’importe quel index, pas seulement 0.
    5. Certains types (par exemple: valeur "décimale" à virgule fixe) doivent être des sous-types de Variant et ne sont pas disponibles sous leur propre type.
    6. ! = et <>.
    7. "=" est utilisé à la fois comme comparateur et assignation, au lieu de se scinder en "=" et "==".
    8. "Option Explicit".
    9. L'interface utilisateur n'a pas été mise à jour depuis 2000.
    10. Office2k7 n'a pas été mis à niveau vers VB.NET
    11. La plupart des modèles d'objet sont non-sensuels et trop verbeux.
    2
    Andrew Scagnelli

    Python

    • Aucune instruction dans lambdas. GRRRR
    • foo( a for b in c if d ) ne se sent pas bien, cela me surprend chaque fois que je m'en sors. Ça ne devrait pas être foo( (a for b in c if d) )?
    • Puis-je avoir une compréhension dictée?
    • les opérateurs map et filter ont une syntaxe spéciale dans la compréhension des listes, pourquoi ne pas utiliser quelque chose pour réduire? ou sorte?
    • Simplement en ayant une instruction yield, une fonction est transformée comme par magie en un générateur et son interface change complètement. En outre, ce générateur ne peut effectuer aucun travail avant la première next(). du moins, non sans utiliser une fonction qui renvoie un générateur.

    JavaScript

    • Pas de syntaxe brève pour créer des bibliothèques de code modulaires. Vous devez appeler une fonction qui retourne un dictionnaire de méthodes publiques. Et vous devez éditer cela à (au moins) deux endroits chaque fois que vous modifiez l'interface de votre module.
    • La création de fermetures implique le renvoi d'une fonction qui renvoie une fonction de la fonction ('sup dog) yo'. Désordre!
    • for each ( foo ) la syntaxe et le comportement semblent être une réflexion après coup.
    • Savoir quand votre code fonctionnera réellement (et dans quel ordre) est plus un art sombre. La seule façon de bien faire les choses est de tout mettre (oui, ça aussi) dans un seul gros fichier. et même dans ce cas, vous devez encore attendre un document.onload
    • Est-ce que je manque quelque chose? n'y a-t-il aucun moyen trivial d'obtenir des valeurs sérialisées JSON sans les construire à la main? (oui, jQuery peut le faire, en quelque sorte).

    Clojure

    • Manque de syntaxe intégrée pour les paramètres facultatifs et les mots clés dans les définitions de fonction. Bien sûr, vous pouvez l'ajouter assez facilement, mais cela signifie que les rédacteurs de bibliothèques ne l'utilisent pas. La déstructuration généralisée n'a pas encore été un bon substitut
    • Absence de combinaison de méthodes (méthodes avant/après/autour de celles trouvées dans Common LISP)
    • Une trop grande dépendance sur Java interop, par exemple. il n'y a pas de fichier IO intégré
    • Parfois, je veux taper statique. Celui-ci n'est pas une pure haine; Je préfère généralement dynamique, et les tentatives pour mélanger les deux ont été largement insatisfaisantes
    • Il n'y a pas de format de sérialisation binaire rapide intégré pour les structures de données intégrées, bien que des personnes y travaillent.
    2
    Zak

    En ce qui concerne C #:

    1. Je déteste le fait qu'il n'y ait pas de mot clé pour spécifier quelles exceptions sont levées à partir d'une méthode comme en Java. C'est un bien meilleur moyen de documenter les exceptions que d'utiliser un commentaire XML.
    2. Je voudrais aussi une syntaxe bien meilleure pour les contraintes génériques telles que oring et anding of contraintes.
    3. Pourquoi une méthode ne peut pas renvoyer plus d'une valeur?
    4. Absence de prise en charge de la programmation orientée aspect dans le langage.
    5. Pourquoi ne pouvez-vous pas annoter chacun des accesseurs de propriété avec un attribut?
    6. Manque de support regexp intégré comme en Perl.
    2
    Ikaso

    C++ manque de bons outils de refactoring, manque d'exceptions vérifiées

    Java manque de modèles, manque de const mot-clé

    2
    quant_dev

    Java - pas de prise en charge de la composition au niveau de la langue

    1
    Rostislav Matl

    C #

    1. Pas de moyen facile de vérifier si un type est numérique
    2. Cela signifie que vous êtes probablement bloqué avec la majeure partie de la pile Microsoft, IIS et MSSQL
    3. Au lieu d’être un outil spécifique à un problème spécifique, C # essaie d’être un langage pour chaque paradigme.
    4. Manque de communauté. Bien sûr, il commence à y avoir des frameworks et des bibliothèques open-source pour C #. Les mêmes que ceux qui sont disponibles pour Java développeurs depuis des années.
    5. Difficile de trouver une bonne aide. Internet est jonché de pauvres exemples de solutions aux problèmes de C #. Cela nous ramène au problème n ° 3.
    1
    CountCet

    REBOL

    REBOL est parmi mes langues préférées. Je ne peux pas dire que j'ai un favori, même si Haskell se classe également très haut.

    1. Sa syntaxe étrange effraie de nombreux développeurs avant même de l'essayer.

      utilisez [email rules url] 
       
      
      ; A small DSL that sends email to people about URLs.
      rules: [
          some [
              into [
                  set email email!
                  set url url!
                  (send/subject email url reform [ "Check Out" url ])
              ]
          ]
      ]
      
      ; Global context
      notify: func [ [catch] dsl [block!] ] [
          unless parse dsl rules [
              throw make error! "You screwed up somehow."
          ]
      ]
      
       
       
       
       notifier [[[email protected] http://www.google.com] [[email protected] http: // www .yahoo.com]]
    2. Les dialectes récursifs sont très faciles à valider avec PARSE mais très difficiles à évaluer. (Les piles peuvent être utiles ici.)

    3. REBOL a une intégration très médiocre avec de nombreuses technologies populaires, en particulier XML. Je soupçonne que ceci est en partie arrogant, parce que le type de données REBOL BLOCK! peut faire presque tout ce que XML peut faire. Cependant, le monde réel contient du XML.
    4. Pas d'Unicode.
    5. Grâce à AltMe, la communauté d'utilisateurs de REBOL est très insulaire. Je peux comprendre pourquoi ils veulent utiliser AltMe. C'est écrit en REBOL et montre ses forces. Malheureusement, cela les met également sur leur propre petite île.

    Espérons que le prochain REBOL 3 résoudra nombre de ces problèmes, à l’exception du dernier.

    1
    Gregory Higley

    Je pense qu’une langue favorite est impossible à choisir. Le typage dynamique et le typage statique ne peuvent pas être comparés, je vais donc simplement énumérer ceux que j'utilise

    C++:

    • La syntaxe de métaprogrammation des modèles est laide. Un ::value implicite le rendrait beaucoup plus concis
    • ->. Pourquoi le compilateur ne peut-il pas comprendre que je fais un ptr.thing et que je fais juste -> pour moi?
    • Je déteste les espaces blancs. Donc tout le vector<vector<int>> doit être vector<vector<int> > me fait ressentir les tremblements et alors je ne peux plus me concentrer lorsque je vois cette ligne de code et que je finis par essayer de trouver un moyen d'utiliser int[][] ou quelque chose
    • Macros Personnellement, j'adore le concept de macros. Mais avec C++, je pense que le système est un hack
    • Je déteste ;

    Python:

    • Les chaînes étant immuables. Cela fait en sorte que je ne peux pas juste faire string [4] = "b"
    • Les listes étant implicitement copiées par référence. Quelle fuite dans [[0] * width] * hauteur
    • Absence de récursion de la queue (j'ai dû gréer IDLE pour ne pas cracher des milliers de messages d'erreur chaque fois que j'utilisais mal une fonction récursive)
    • Dictionnaires n'acceptant pas les listes/dict
    • Manque de profondeurs. Quand je fais une compréhension de liste, je ne veux pas que la variable qu'elle contient affecte la portée externe
    1
    Demur Rumed

    Python: La sélection partielle de tableaux ne vous donne pas ce que vous avez demandé.

    un [1] vous donne un élément
    a [1: 2] vous donne un élément, pas [a [1], a [2]]
    a [1: 3] donne 2 éléments

    Je déteste ça, mais c'est peut-être juste parce que je travaille principalement à Verilog.

    1
    Marty

    Java est lent selon beaucoup mais j'accepte un certain degré d'utilisation.

    Java est dramatique. Ils ont beaucoup de cours pour une seule chose que vous vouliez faire. Mais vous connaissez la propriété de flexibilité XD.

    Java est difficile au début mais amusant comme toujours.

    Lorsque vous écrivez un code simple pour imprimer "Hello, World!" VEUILLEZ NE PAS UTILISER Java! XD Je suis sûr que je suis justifié.

    Java est un mélange, ne dites donc pas qu'il s'agit simplement d'un langage OOP.

    Il y en a beaucoup plus, mais je ne suis limité qu'à cinq XD. Merci!

    1
    Richeve Bebedor

    C #

    Le numéro un de tous les temps la haine des animaux de compagnie de C # doit être:

    (1) Les événements ont de fortes références à tous les écouteurs, empêchant ainsi la récupération de place de tout ce qui écoute un événement. Si vous voulez voir les problèmes que cela a causés, il vous suffit de rechercher sur le net toutes les personnes qui ont essayé de résoudre le problème en créant une sorte de "gestionnaire d’événements faiblement référencé".

    (2) Besoin de vérifier si un événement est égal à null avant que vous l'appeliez, cela semble être quelque chose qui devrait être géré par la langue.

    (3) Le sérialiseur XML n'a aucun moyen de lire/écrire des commentaires dans un fichier XML. Pas génial dans un environnement où les fichiers XML sont modifiés manuellement et par l’outil écrit en C #. Peut être contourné en utilisant simplement un XmlDocument brut, mais il serait plus agréable de pouvoir le résumer en une classe.

    (4) Le processus de construction ne vous permet pas d'accéder directement à des éléments tels que les fichiers xsd. Vous avez plutôt besoin d'une étape intermédiaire dans laquelle vous créez une classe partielle C #. Cela entraîne également des problèmes avec les fichiers XAML, dans lesquels vous devez parfois reconstruire deux fois pour que les modifications soient correctement transférées.

    (5) Pas de prise en charge des composants intrinsèques du processeur, tels que MMX et SSE 1,2,3,4. Ces précieuses fonctionnalités du processeur ne sont donc pas utilisées lors de l'exécution d'applications C #.

    D'autres qui n'ont pas fait mon top 5:

    (6) Impossible de marquer les champs en tant que propriétés, toutes les propriétés doivent être explicitement implémentées dès le départ:

    Par exemple. a actuellement:

    public class MyClass {
        private int someInt;
    
        public int SomeInt {
            get {
                    return someInt;
            }
            set {
                    someInt = value;
            }
        }
    }
    

    Voudrais

    public class MyClass {
        [IsProperty(public, get, set)]
        private int someInt;
    }
    

    (7) Pas de prise en charge de plusieurs valeurs de retour, par exemple:

    public int, string, double MyFunction()
    {
        ....
        return x,y,z;
    }
    
    
    public void TestMyFunction()
    {
        int x, string y, double z = MyFunction();
    }
    

    (8) Pas de support pour les types de retour covariants

    Je suis un peu décontenancé par la mise en œuvre des génériques, mais je vais y revenir. Je pense que C # est un excellent langage pour faire toute l’interface graphique, la mise en réseau et la plomberie de configuration. Il s’agit de mon langage numéro un pour faire avancer les choses rapidement, d’une manière qui puisse être supportée à long terme.

    1
    John Stewien

    C++

    1. Il faut beaucoup de temps pour créer un extrait de code simple.
    2. pour (std :: vector :: const_iterator iter = [...]
    3. vector.remove () ne supprime pas.
    4. vector.Push_front () n'existe pas.
    5. fichiers d'en-tête
    6. Pas de lambda
    7. Aucun destructeur virtuel vide automatique s'il existe au moins une fonction virtuelle.
    1
    user35978

    MEL (langage d'expression maya):

    • tableaux à une seule dimension: Me forcer à synchroniser manuellement deux listes ou plus, ou à utiliser des chaînes délimitées pour simuler des structures de données plus complexes. Naturellement, ils sont également immuables.
    • Single threaded and slow: Causer toute l'application Maya à se bloquer pendant qu'elle termine une tâche. Des points bonus pour ne pas pouvoir tuer de longues opérations, mais plutôt pour fermer et rouvrir Maya.
    • Les chemins d’approvisionnement en scripts ne sont pas récursifs: Ce qui signifie que tous les répertoires dans lesquels vous voulez stocker des scripts doivent tous être ajoutés au chemin du script.
    • Aucun espace de nom: Forcer l'utilisation incohérente des conventions de dénomination pour éviter les conflits de procédures globales.
    • Commandes modales: Chaque commande est modale, ce qui signifie que les opérations Créer, Modifier et Interroger sont toutes gérées en définissant des indicateurs. Cela a également obligé les développeurs à faire en sorte que la plupart des commandes renvoient des tableaux
    • Style de commande incohérent: La plupart des commandes de tableau renvoient en réalité des tableaux, mais la commande Tokenize doit prendre un tableau comme référence, qu'elle remplit ensuite, plutôt que de cracher un tableau. Ceci parmi d'autres incohérences.

    Celles-ci et plusieurs autres raisons expliquent pourquoi AutoDesk a adopté Python comme langage de script secondaire, ce qui évoque quelques autres facteurs gênants:

    • Toutes les commandes MEL ne sont pas supportées: La plupart le sont, mais de temps en temps, vous vous retrouvez dans l'obligation d'utiliser la fonction mel () pour exécuter du code arbitraire. Ce qui est pire, c’est toute l’évasion agaçante que vous devez faire.
    • hérité du style de commande modal: Il faut utiliser le même objet create = True, query = True, edit = True.
    1
    Soviut

    Python:

    • la vitesse
    • analyse statique (manque de)
    • fonctions anonymes limitées à une expression
    1
    orip

    Mon 5 pour Delphi:

    1. Les procédures et les fonctions ne sont pas nécessairement distinguées des variables si elles ne sont pas paramétrées (par exemple, je peux avoir une instruction telle que x: = GetPositionOnScreen; au lieu de x: = GetPositionOnScreen ();)
    2. Try/Finally et Try/Except doit être imbriqué (indiqué une fois auparavant, mais il fait toujours partie des miens).
    3. Pas sensible à la casse.
    4. Plusieurs objets (fonctions, variables globales, variables locales) peuvent porter le même nom et Delphi essaiera avec plaisir de comprendre ce que vous voulez dire. les noms doivent être uniques.
    5. Impair si la condition règne. une seule vérification conditionnelle ne nécessite pas de () autour de celle-ci, mais si je fais plusieurs vérifications, j'ai besoin d'un () autour de chacune, et parfois de plusieurs ensembles imbriqués pour des vérifications plus importantes.
    6. Aucun hérité comprend. Si j'ai besoin de référencer des fonctionnalités de l'unité Windows dans une base et une forme héritée, je dois inclure Windows dans les deux.
    1
    Tom A

    Le quenya

    • La communauté est trop petite. Il est pratiquement impossible de lancer un bon programme d'immersion linguistique lorsqu'il est difficile de trouver un autre orateur à proximité.
    • Verbes irréguliers. Oui, je sais que l'anglais et l'espagnol les ont aussi mentionnés, mais le quenya était inventé. Pourquoi faut-il encore des verbes irréguliers?
    • Pas de support Unicode. Je dois avoir trois polices Tengwar différentes sur mon ordinateur avant de pouvoir lire la plupart des messages, et plusieurs d'entre eux sont mal kernés. Ce ne serait pas vraiment un problème énorme étant donné l’existence d’une transcription romanisée, mais Tengwar est si beau que vous ne voulez pas l’utiliser.
    • Tous les concepts ne peuvent pas être facilement référencés en quenya, ce qui conduit à des circonlocutions gênantes, ou au recours au sindarin, au númenórean ou au (au secours de Manwë Klingon) pour me faire comprendre.

    1
    user218368

    JavaScript

    D'après la spécification ECMAScript 5:

    • 7.6.1.2 Futurs mots réservés:

      classe, énumération, étend, super, exportation, importation

      En mode strict: implémente, laisse, privé, public, interface, package, protégé, statique, rendement

    • 11.9.4 L’opérateur Strict Equals (===) et 11.9.1 TheEqualsOperator (==)
    • 11.9.6 Algorithme de comparaison d'égalité stricte (NaN === NaN est faux)
    • 8.5 Le type de nombre - Pas de vrais entiers, tout est un float.
    • 4.2.1 Objets - héritage prototypique

    OK, j'aime bien le dernier, mais il y a 7 sortes de confusion

    1
    thejefflarson

    C #

    1) Manque de capacité pratique à écrire des génériques pour les types de valeur. Par exemple, n'importe quel idiot (ou la plupart des idiots) peut écrire une routine qui calcule l’écart-type d’une liste d’entiers int, float, double, etc. en C++, il est simple à écrire, facile à lire et fonctionne aussi rapidement que du code non générique. . Je pense que si vous pouvez écrire quelque chose en C # qui soit proche de frapper l’un de ces 3 sans être ridicule sur les 2 autres, vous êtes un très bon programmeur.

    2) Covariance et contra variance, bien que ceci soit ajouté à 4.

    3) Documentation extrêmement pauvre de LINQ (d'accord, cela ne fait pas vraiment partie de la langue).

    4) Essayer d’utiliser foreach/iterators quand je veux faire la même chose à chaque fois, sauf quelque chose de légèrement différent la dernière fois (comme concatater un tas de chaînes avec des virgules entre eux et le mot et entre les deux derniers). Si je l'écris avec un IEnumerable, il est difficile à écrire et à lire, et avec un pour (int i = 0 i <...), ce n'est pas beaucoup mieux et c'est moins efficace.

    5) Je sais que je vais recevoir des plaintes à ce sujet, mais le manque d'exceptions vérifiées. Cela n’a pas besoin d’être implémenté tel quel dans Java (les développeurs de l’infrastructure soulèvent de très bons arguments sur les raisons pour lesquelles ils ne l’ont pas fait), mais je serais heureux de pouvoir compter sur un compilateur n'aime pas les exceptions vérifiées peuvent désactiver.

    1
    Brad

    Devoir assumer que nous avons une langue. Est-ce que nous?

    1

    Python

    Ceux que je ne comprends pas ...

    • math.ceil() et math.floor() renvoient des valeurs float, et non des entiers (probablement pour éviter un débordement d'entier dans la fonction C sous-jacente - mais pourquoi ne pas transtyper sur un Python long?)
    • len() est une fonction, pas une méthode
    • reload() est très limité, ne recharge pas un module 9 fois sur 10, recharge uniquement une étiquette importée s'il s'agit d'un module - c'est-à-dire ne peut pas faire from bar import foo; reload(foo) si foo n'est pas lui-même un module
    • Les arguments par défaut mutable ont une seule référence (pourquoi pas une nouvelle instance à chaque appel de fonction?!)
    • Toutes ces variables soulignées - si elles sont si privées, comment se fait-il que nous en voyions autant dans le code? Obtenez un espace de noms!
    • Les cordes ne sont pas modifiables - peut-être y a-t-il une bonne raison à cela, mais j'ai rencontré de nombreuses situations dans lesquelles j'aimerais modifier un personnage en particulier ...

    Celles qui ont du sens en fonction de la mise en œuvre mais qui sont ennuyeuses ...

    • array.sort() ne retourne pas un tableau (je suppose que cela se passe sur place)
    • Les compréhensions liste/générateur ne définissent pas une nouvelle portée (est-ce juste un sucre syntaxique pour une boucle for, non?)

    et un couple qui est corrigé dans Python 3

    • Division entière par défaut
    • global ne peut faire référence qu'à l'espace de noms de premier niveau
    1
    Brendan

    Python:

    1. Pas de boîte à outils graphique standard (la communauté tourne autour de cela mais ne semble jamais rien régler).

    2. L'évolution des outils et des méthodes pour distribuer et installer Python applications et bibliothèques a été, bien, rocheuse. (Bien que récemment, cela semble se rapprocher de la résolution.)

    3. CPython est toujours lent en ce qui concerne les interprètes (bien que PyPy semble bien paraître de nos jours, si cela devient le "standard" Python, ce problème disparaît).

    4. Vous ne pouvez pas sous-classer des classes intégrées (par exemple, list et dict) sans surcharger un grand nombre de méthodes, même si vous souhaitez simplement accrocher un événement (par exemple, accrocher un élément ajouté ou supprimé Dans la liste, vous devez remplacer delitem, ajouter, étendre, insérer, extraire et supprimer - il n'y a pas de notification d'événement "changer" de sous-classable, ni de méthode "protégée" qui élimine le code commun utilisé par toutes les méthodes ci-dessus).

    5. Jusqu'à l'invention de virtualenv, il était très pénible de garder Python environnements distincts à des fins différentes sur une même machine.

    1
    user350432

    C #

    Je suis très content de C # mais ces deux-là m'énervent vraiment:

    • L'initialisation basée sur le constructeur pour les classes immuables est moins pratique, moins intuitive (lorsque vous lisez le code, vous ne comprenez pas ce que vous affectez à quoi), elle a moins de sauvegarde IDE que l'initialisation d'objet en ligne. Cela vous pousse inévitablement vers des classes mutables. Je sais que cela a déjà été mentionné, mais la syntaxe d’initialisation pour les classes immuables me pose problème.

    • switch est trop prolixe. Chaque fois que je vois une situation dans laquelle un commutateur serait approprié, je suis vraiment enclin à utiliser un if..else if.. simplement parce qu'il est plus concis (environ 30% moins de dactylographie). Je pense qu’il ne devrait pas y avoir de substitution pour switch, break devrait être impliqué, et case devrait permettre une liste de valeurs séparées par des virgules.

    1
    Sedat Kapanoglu

    Scala:

    • bizarreries de bibliothèque standard: il ne montre pas toujours les meilleures pratiques et est bien sous-documenté
    • les classes codées en dur FunctionX, TupleX
    • manque de propriétés: les getters et les setters sont séparés, ce qui constitue une violation de la norme DRY et rend presque impossible le FRP, par exemple.
    • besoin de = _ pour initialiser les propriétés
    1
    thSoft

    Rubis:

    • Espaces blancs significatifs. Pour l’interprète, fin de ligne = fin d’instruction, sauf s’il semble que l’instruction doit continuer (ou que vous échappiez explicitement à la nouvelle ligne).
    • Lent
    • La documentation en ligne n'est pas aussi bonne que celle de Python (en défense, celle de Python est excellente)
    • Ai-je mentionné lent?
    1
    Joshua Swink

    Java:

    1. Très incohérent.
    2. Les API graphiques sont parfois difficiles à utiliser
    3. NullPointerExceptions ne vous dit pas ce qui est null
    4. Les programmes que j’écris ne fonctionnent parfois pas sur une machine virtuelle différente, ce qui est très pénible et contredit l’instruction "Écrire une fois, courir n’importe où" de Java.
    5. Swing n'est pas aussi bon qu'il devrait l'être.
    1
    TomLisankie

    VB .NET, mais uniquement parce que VB6 a empoisonné toute une génération de programmeurs

    Je travaille dans un VB .NET magasin qui était auparavant un magasin VB6, et toute personne travaillant ici qui était développeur VB6 refuse obstinément d'apprendre quoi que ce soit à propos de .NET. Ils codent comme si c’était toujours du VB6 et leurs applications étaient nulles comme les applications de VB6. Ma patronne décourage activement toute utilisation de LINQ car elle craint que les autres ne comprennent trop, ce qui est vrai car personne ne veut le comprendre.

    Je pense que nous aurions tous été mieux lotis si MS optait pour C #, ce qui me tue, car je pense que les accolades sont bien inférieures aux déclarations de clôture verbales de VB.

    1
    Bremer

    Rubis.

    1. Règles de portée étranges - les variables, les constantes et les méthodes se comportent différemment les unes des autres. Les règles changent également en fonction du mot clé que vous avez utilisé pour créer une fermeture. Ou si vous êtes dans une classe, une classe propre, un objet, un module ou son module. Puis il y a instance_eval, qui modifie les règles en un ensemble de règles différent. Et ils changent à nouveau lorsqu'un module est "inclus" ou "étendu", ce qui fait des choses différentes à la portée. Et certains ensembles de règles ne peuvent pas être émulés par la métaprogrammation, vous devez donc utiliser eval. Sauf si vous êtes sur Ruby 1.9, où tout cela est différent.
    2. L'espacement des noms est pratiquement inutile. Si vous avez Foo :: File, le fichier stdlib est probablement cassé pour tout Foo.
    3. besoin de déclaration est cassé. Si deux fichiers s’imposent, le comportement de ces fichiers peut changer considérablement en fonction du fichier chargé en premier.
    4. les bibliothèques changent brutalement et soudainement les API, vous devez donc demander des numéros de révision mineurs spécifiques pour toutes vos dépendances. Pour chaque application Ruby de votre système.
    5. Le système de paquetage rubygems remplace "require" plutôt que de mettre des fichiers dans le chemin de recherche - car pourquoi utiliser un système quand vous pouvez le remplacer?
    1
    jes5199

    Python 3

    • les deux onglets et les espaces autorisés pour l'indentation
      Et vous penseriez que les gens apprennent du passé (Makefile). Il suffit de choisir des espaces et interdire les onglets. YAML a eu raison.
    • manque de bibliothèques tierces populaires
      La bibliothèque standard est excellente, mais beaucoup de ce qui rend Python 2 aussi puissant réside dans le domaine des tiers. Python 2 a eu ce droit: -).
    • float IEEE
      Les points flottants dans les langages de programmation sont source de confusion car ils diffèrent de la façon dont nous les utilisons en mathématiques. Au lieu de cela, les opérations sur les nombres doivent être considérées comme des expressions qui ne sont converties au format décimal que lorsque cela est nécessaire (c'est-à-dire lors de l'impression sur un écran). Maple et Mathematica l’ont bien fait, je pense.
    • le jeu de caractères pour les identificateurs est trop restreint
      list.empty? est meilleur que list.is_empty ou même len(list) != 0. De même, process.kill! serait meilleur que process.kill. Ruby et LISP ont eu raison.
    • lorsque vous appelez une fonction, vous devez toujours écrire des parenthèses
      Ce serait bien si nous pouvions les omettre dans des cas non ambigus. Comment est-il encore? dict.items ou dict.items()? Ruby a eu ce droit, aussi.
    1
    Tomas Sedovic

    Ruby

    1. Aucune inférence de type
    2. Les méthodes/fonctions ne sont pas des objets de première classe
    3. La portée des variables n'est pas lexicale, alors que la portée des variables de bloc est lexicale
    4. def dedans def
    5. la différence entre super et super ()
    1
    jmuk

    Réécrit ceci après un peu plus de réflexion ...

    Cinq choses que je déteste à propos de PHP bien que je l'aime (sans ordre particulier):

    • Nom et ordre des paramètres incohérents dans les fonctions intégrées.
    • Approche orientée objet des tableaux grâce au SPL mais malheureusement pas aux chaînes (pour le moment).
    • Pas de réelle concurrence dans PHP lui-même, uniquement via le multitraitement des serveurs Web d'hébergement
    • Pas d'appels asynchrones comme en JavaScript
    • Mise en cache opcode uniquement via des extensions. Pas vraiment mauvais mais juste énervant.

    Ce sont les fonctionnalités de la langue (ou le manque de) qui m'agacent mais les problèmes beaucoup plus gros sont ces choses plus liées aux personnes/à la communauté:

    1. Le fait que beaucoup de personnes qui utilisent PHP ne connaissent rien à la programmation et aux bonnes pratiques en général et produisent un code très compliqué. JavaScript a le même problème.

    2. L'énorme quantité de tutoriels/livres qui enseignent les mauvaises pratiques et le style. Cela peut être la cause principale de # 3.

    3. La mauvaise réputation qu’il a développée s’explique principalement par les n ° 3 et n ° 4.

    1
    selfawaresoup

    C #

    • Les paramètres génériques sont invariants Cari 4.0 introduit covariance et contravariance pour les types génériques
    • Les membres de la classe overridable doivent être explicitement marqués comme virtual

    Java

    • Types de données numériques non signés manquants
    • Les types de données primitifs ne sont pas des objets
    1
    Enrico Campidoglio

    C est mon préféré mais cʻest aussi horrible.

    • C'est le pire pré-processeur de tous les temps. Pourquoi n'ont-ils pas utilisé quelque chose comme m4?
    • L'intégralité de l'en-tête par rapport au modèle de fichier source est cassée. Pascal a eu raison avec les unités.
    • Il a besoin de plages de cas dans l'instruction switch.
    • Les unions et les jets de void * rompent le système de typage. Cela rend les éboueurs impossibles.
    • Aucune fonction imbriquée. GNU C a cela, mais il devrait être standard.
    • Pas de vérification des limites pour la mémoire allouée. Il existe des outils qui découvrent cela, mais ils ne détectent pas les erreurs lorsqu'un morceau de code calcule mal une adresse et écrit dans une région allouée qui n'est pas du tout liée. Je déteste toute l'arithmétique du pointeur.
    • Pas de limite pour vérifier les tableaux.
    • Trop de problèmes de portabilité. Même wchar_t diffère d'une plate-forme à l'autre.
    1
    ahmet demir

    Je peux en ajouter un autre pour Python:

    Soit une liste l = [l1, l2, ..., ln], puis repr(l) = [repr(l1), repr(l2), ..., repr(ln)], mais str(l) != [str(l1), str(l2), ..., str(ln)] (str(l) = repr(l)). Cela a été décidé parce que pourrait avoir des entrées obscures dans la liste comme l = ["foo], [bar,", "],["] et str(l) renverrait "[foo], [bar, ], []" qui "pourrait dérouter les utilisateurs". Cependant, cela rend str impossible à utiliser uniquement pour le vidage de données, car list élimine le "vidage juste des données dans un format lisible". Augh!

    1
    Tetha

    Objective-C 2.0

    S'en tenir strictement à la langue et à l'exécution, et non aux bibliothèques, et non dans un ordre particulier:

    1. Manque de cVars.
    2. Pas de modules. Je ne suis pas très mécontent du manque d'espaces de noms, mais les modules seraient bien d'avoir.
    3. La syntaxe de propriété basée sur Ivar nécessite des déclarations utilisant le nom de la variable à 3 endroits. C'est assez hideux.
    4. C patrimoine. Tout ce que vous détestez à propos du langage C, à l'exception de OO et de GC, est présent.
    5. Les objets ne peuvent pas vivre sur la pile. Ce n'est pas un problème avec Obj-C, mais plutôt avec les pratiques de programmation dans d'autres langues. Je trouve cela étrange lorsque je reçois une valeur de retour sur la pile en C++, par exemple. Si je ne regarde pas réellement la documentation de la bibliothèque lorsque j'écris le code, je suppose que chaque fonction renvoie un pointeur, ce qui permet souvent un nettoyage significatif ultérieurement.
    0
    icodestuff
    • La propriété length est facilement confondue avec la fonction length (); utilisez plutôt la taille ()
    • La syntaxe pour interpoler la variable dans les chaînes de sélecteur ('"+ $. Month +"') pue
    • $ (event.currentTarget) ne fonctionne pas toujours pour bouillonner et capturer
    • la syntaxe d'attribut fonctionne ("[class = 'foot']") aux endroits où la syntaxe de sélecteur (".foot") ne renvoie rien
    • Le sélecteur de contenu ([class ~ = done]) échoue parfois lorsque JavaScript (this.className.search ("done")> 0) fonctionne
    0
    user350176

    Python:

    1) C’est un langage de script et non un compile (je préférerais pouvoir compiler des binaires, je me fiche du bytecode). C’est très gênant si je dois utiliser de très nombreuses bibliothèques (c’est-à-dire que tous ceux qui utilisent mon programme doivent installer toutes les bibliothèques, ce qui signifie qu’aucune personne normale ne sera en mesure de le configurer correctement, à moins d’avoir la patience de le configurer. Je fais une tonne de travail qui devrait être inutile). Je connais des façons de créer des fichiers binaires, mais ils ne toujours fonctionnent, et je suppose qu'ils regroupent l’interprète dans les fichiers binaires de toute façon (et je ne le veux pas). Maintenant, si je pouvais obtenir un compilateur de bytecode qui inclurait des copies de tous les fichiers que j’ai importés (et seulement de ceux-ci) à placer dans le dossier de mon programme, cela pourrait constituer un compromis convenable (personne n’aurait alors à télécharger des bibliothèques supplémentaires et tel). Il serait également intéressant que les fichiers python compilés puissent être compressés en un seul fichier, l'un d'entre eux étant spécifié comme fichier permettant d'exécuter le programme avant que cette opération soit effectuée.

    2) Cela semble parfois un peu buggé; il y a eu quelques fois où le code censé fonctionner ne fonctionnait tout simplement pas (il n'y avait pas d'erreur de programmeur), en particulier le code relatif à "tel que" from moduleX import * "et d'autres problèmes liés à l'importation, ainsi que certains problèmes relatifs à aux variables globales et locales.

    3) La profondeur de récursion maximale pourrait être plus élevée. Il y a eu au moins une fois où j'ai senti que j'en avais besoin pour aller plus haut.

    4) Aucune instruction switch (sans parler de celle qui autorise les nombres, les chaînes et les plages)

    5) Les nouvelles versions de Python semblent supprimer beaucoup d'opérations de chaîne utiles et ne semblent pas disposer d'une documentation simple sur la manière de faire les mêmes choses sans ces opérations.

    6) Collecte automatique des ordures forcée (j'aimerais être capable de le faire manuellement, mais pas nécessairement obligé de le faire).

    7) Aucune classe pré-programmée de minuteur sans l'utilisation d'une interface graphique (bon, il y en a peut-être un, mais après toutes les recherches que j'ai effectuées, ce n'est certainement pas pratique à trouver! J'ai effectivement trouvé quelque chose, mais ce n'est pas le cas fonctionne quand je l’essaye.) Par minuterie, je veux dire le type qui exécutera une fonction spécifiée toutes les x secondes, avec la possibilité de l’éteindre à volonté, etc.

    8) Les membres de la communauté qui donnent des exemples indiquent rarement quels modules ils ont importés et comment ils les ont importés.

    9) Il n'y a pas beaucoup de soutien pour l'intégration avec Lua.

    10) Il ne semble pas y avoir de moyen d'ajouter une fonction supplémentaire à une instance particulière d'une classe (et non à la classe entière dans son ensemble), sauf si vous ajoutez de manière dynamique une variable d'objet à cette classe avec l'objet ayant la fonction nécessaire. (mais quand même, il faut faire une autre classe rien que pour ça).

    0
    Cordilow

    Python:

    • l'absence de délimiteur signalant la fin des blocs introduit une ambiguïté telle que l'indentation automatique ne fonctionnera pas avec du code mal formaté.
    • pas de macros (les décorateurs ne comptent pas)
    • aucune bibliothèque ne récupère automatiquement comme la cabale de haskell ou le CPAN de Perl
    • ne peut pas déclarer des variables const (oui, il est possible de jouer le vôtre mais ...)
    • la méta-programmation est nerfée
    • presque oublié le verrou d'interprète global
    0
    drhodes

    L'absence de préprocesseur en C #.

    Je sais qu'ils l'ont laissé de côté parce que certaines personnes peuvent en abuser, mais je pense qu'ils ont jeté le bébé avec l'eau du bain. La génération de code est considérée comme une bonne chose et, en C++, le préprocesseur était mon générateur de code de première ligne.

    0
    Mike Dunlavey

    C #

    5. L'opérateur à coalescence nulle

    Le ?? l'opérateur vous permet d'écrire:

    x = y ?? z;
    

    au lieu de:

    x = (y == null) ? y : z;
    

    J'aime cet opérateur, mais j'en veux un autre:

    x = y ??? y.foo() : z.foo();
    

    au lieu de

    x = (y == null) ? y.foo() : z.foo();
    

    J'utilise ce genre de chose tout le temps, et je trouve ennuyeux de taper la partie == null.


    4. Les égaux devraient avoir un meilleur support

    Je dois commencer chaque méthode Equals(object obj) avec: MyClass other = obj as MyClass; if (other == null) renvoie false;

    Vous devriez seulement avoir à écrire:

    public override bool Equals(MyClass other) {...}
    

    Et le langage devrait fournir la méthode Equals(object obj).
    NOTE: il devrait être garanti que les autres ne sont pas nuls.


    . Impossible d'utiliser un opérateur ternaire avec différents types

    Cela ne compile pas, et je pense que ça devrait!

    string foo = "hello";
    int bar = 4;
    object baz = foo == null ? foo : bar;
    

    2. Absence d'espace de noms privé

    J'aime la protection internal, mais j'aimerais qu'il existe une protection permettant uniquement l'accès depuis le même espace de noms. Ce serait bien de mieux contrôler l'accès dans les grandes bibliothèques de classes.


    1. Pas d'héritage multiple

    En réalité, je n'utilise l'héritage d'implémentation (classe) que pour l'implémentation par défaut d'une interface, mais je souhaite souvent le faire.

    0
    tster

    VB.NET

    1) Si pas x est "foo" (au lieu de <> "foo")
    2) "OrElse" et "AndAlso" également court-circuités (au lieu de "Or" et "And", qui agissent différemment)
    3) Rien (au lieu de Null)

    0
    Techgration

    Je viens de découvrir que je ne peux pas utiliser Enum comme contrainte de type lors de la création d'une méthode générique en c #.

    Microsoft a une bonne explication quant à pourquoi, mais quand même. Je suis en colère

    public static T MyFunc<T>(string arg) where T:Enum //wont work :(
    
    0
    Midhat

    Je n'en ai qu'un mais je crois que ça vaut la peine d'être partagé.

    CSharp/.NET

    Nous avons la propriété Length pour obtenir le nombre d'éléments dans array et la propriété Count pour obtenir le nombre d'éléments dans la collection. Cela semble plus étrange si vous considérez le fait que CLR ajoute automatiquement IList, ICollection, IEnumerable aux tableaux unidimensionnels à base zéro en arrière-plan.

    Je pense que les équipes CLR et BCL ont eu de la difficulté à discuter de ce sujet;)

    0
    Andrey Taptunov

    C

    • Traitement des cordes
    • Gestion de la mémoire (décider qui doit allouer et qui doit le libérer)
    • Aucun espace de noms (le plus grand)
    • Pas de listes/tableaux et autres DS de base dans la bibliothèque standard


    JavaScript

    • L'utilisation d'une variable sans var la rend automatiquement globale
    • Les points-virgules ne sont pas obligatoires
    • Opérateurs de comparaison "==" et "===" et confusions quant à leur utilisation
    • Pas de support adéquat pour travailler sur des données binaires
    • Encore une fois .. Pas d'espaces de noms
    • Les variables n'ont pas de portée de bloc. (Assez irritant venant du monde C)
    0
    Manish

    Python

    • Aucun espace de noms.
    • Attributs/pseudo-privés pseudo-privés (principalement avec getattr).
    • La manipulation du chemin de fichier est répartie sur plusieurs modules. Il est moche, difficile à lire et, dans la plupart des cas, viole DRY. Les opérations courantes sur les chemins de fichiers n'ont toujours pas de fonctions pratiques, comme obtenir une liste de fichiers dans un répertoire. Le module de type path - pour résoudre ce problème a été rejeté.

    ([f for f in os.listdir('/file/path') if os.path.isfile(os.path.join('/file/path', f))])

    • Documentation Python (je vous suis très reconnaissante de la documentation existante et de son format si agréable, mais je déteste parcourir 5000 lignes d’exemples d’utilisation rapide pour trouver la documentation de fonction individuelle pour des modules particuliers (I regarde vous optparse et se connectant)). Les types intégrés sont documentés au coup par coup dans près de 10 endroits différents.
    0
    user297250

    HyperTalk:

    • Décédé il y a longtemps
    • Pas de tâche simple (vous ne pouvez pas simplement dire a := 3, vous devez dire put 3 into a
    • Pas de fonctions imbriquées
    • Pas de structures de données réelles, juste des chaînes. Pour créer des "listes", vous devez délimiter les éléments avec la variable itemDelimiter et les échapper manuellement. Vous pouvez également obtenir des lignes et des mots tels que get Word 2 of line 5 of txt

    En passant, je pense que l’une des fonctionnalités les plus intéressantes propres à HyperTalk est la variable spéciale it:

    ask "How many years old are you?"
    answer "You are " & it*12 & " months old."
    
    0
    Joey Adams

    JavaFX

    • L'inférence de type ne se comporte parfois pas comme prévu, vous devez donc déclarer explicitement le type.
    • def se comporte comme const en C et non final en Java
    • vous pouvez insérer une valeur dans une séquence en accédant à un index> = seq.length, ce qui devrait provoquer une erreur du compilateur (selon la référence).
    • si vous affectez la valeur null à une chaîne, sa valeur par défaut est "". Si vous affectez null à un entier, une erreur du compilateur est renvoyée (contrairement à ce que dit la référence).
    • gère CheckedExceptions de la même manière que RuntimeExceptions
    0
    helpermethod

    Lua

    • Si vous faites foo.bar (1,2), alors 'self' est nul dans la méthode des barres. Vous devez vous rappeler de faire foo: bar (1,2) à la place. Je préférerais que ce soit commuté ("self" devrait être défini par défaut sauf si vous utilisez l'opérateur ":" ou appelez une fonction qui n'est pas une méthode).
    • Les variables sont globales par défaut. Je préférerais abandonner le mot clé "local" et en utiliser un autre "global".
    • Les variables non déclarées se voient attribuer la valeur nil. Je préfère recevoir un message d'erreur. Vous pouvez éviter cela en manipulant le métatable de l'env global, mais je préférerais qu'il soit implémenté par défaut et pouvoir le désactiver.
    • Les valeurs renvoyées multiples sur les paramètres ne sont pas gérées très bien. Supposons que vous ayez une fonction foo () qui renvoie 1,2,3 (trois valeurs) et bar () renvoie 4,5 (deux valeurs). Si vous imprimez (foo (), bar ()), vous obtiendrez "1,4,5" ... seul le "dernier" Tuple sera développé pour les appels.
    • L'opérateur # (longueur de la table) ne fonctionne que dans les tables indexées avec des entiers continus. Si votre table n'est pas comme ça et que vous voulez savoir le nombre d'éléments qu'elle contient, vous devez soit l'analyser avec une boucle, soit mettre à jour un compteur chaque fois que vous insérez/enlevez un élément.
    0
    kikito

    Java:

    • Pas de codage procédural, il compile en code procédural, alors laissez-moi l'utiliser!
    • Pas d'héritage multiple, essayer de faire la même chose avec 15 000 interfaces, c'est nul.
    • Date de classe, dois-je en dire plus.
    • Que je ne peux pas utiliser pleinement le polymorphisme. Java ne se substituera pas à différents types de paramètres à déclencher.
    • Je ne peux pas penser à une cinquième raison, si je le fais je reviens et éditer ce post.
    0
    WolfmanDragon

    C #

    • Impossible de créer une référence (var & t = struct)
    • Aucun destructeur de portée locale (IDispose se rapproche mais ce n'est pas la même chose)
    • ToString, je n'aime presque pas que chaque objet l'ait mais il s'avère que je n'aime pas tout ce qui l'utilise comme le fait string.format. J'ai plutôt des choses qui acceptent un certain type (comme ints, floats, text, chars seulement). Ainsi, au lieu de transmettre un objet, je dois transmettre quelque chose avec un transtypage ou une interface implicite. J'ai fini par écrire quelque chose comme ceci pour échapper en toute sécurité au texte HTML qui fonctionnait très bien.
    • Impossible d'utiliser une conversion de typage virtuelle (blah) obj; ne fonctionne pas si obj n'hérite pas/a une interface de blah. La solution de contournement simple consiste à fournir une interface avec une fonction de conversion.
    • N'a pas de création locale. Au lieu d'écrire var o = new Item (); Je voudrais écrire (quelque chose comme) Item o() (avec une disposition automatique si elle en a une).
    0
    user34537

    Python:

    1) Syntaxe de continuation de ligne: "... \" fonctionne, mais "... \" pas, et cet espace de fin est généralement invisible, sans marquage inhabituel de la part de l'éditeur.
    2) une "augmentation" nue est invisible dans la trace de pile, car la trace de pile ressemble à la précédente exception levée.
    3) lent
    4) mauvaise intégration dans les serveurs Web (mod_python: mort, mod_wsgi: portée de fonctionnement limitée). Ceci est compliqué par 3], nécessitant une démonisation ou une sorte de persistance en mémoire pour fonctionner correctement.
    5) une tolérance excessive aux onglets et aux espaces mixtes, ce qui permet aux modifications de contrôler le flux de rester parfois masquées. (peut-être corrigé dans les versions récentes)

    0
    Rdbhost

    Lua:

    • Le système d'erreur intégré est absolument horrible

      Vous pouvez implémenter un système try-catch en modifiant l’interpréteur Lua; mais il n’a aucune compatibilité avec les erreurs générées par les fonctions intégrées.

    • Le fait qu'ils aient __newindex au lieu de __setindex en tant que passeur

      ... et __newindex n'est déclenché que lorsque la clé n'existe pas déjà. Si c'est le cas, aucune metamethod n'est appelée du tout.

    • Pas de bon système de comparaison de types.

      Il y a la fonction type () mais elle ne gère que les types de base (toutes les tables sont des tables). Il faut vraiment avoir une metamethod pour les comparaisons de types. J'ai déjà implémenté cela avec un opérateur 'est' et une métaméthode __type et cela fonctionne vraiment bien.

    • C'est une chienne de définir de nouveaux mots-clés.

      Vous pouvez le faire, mais le code dans Lua n’est pas bien documenté, c’est donc une sorte d’essai et d’erreur de trouver comment obtenir le résultat souhaité. Il s'agit d'un problème majeur lorsque vous souhaitez implémenter vous-même les éléments que j'ai mentionnés ci-dessus (pas tellement __setindex, c'est une modification facile).

    • Je ne peux pas l'utiliser dans un navigateur Web.

      Ouais pas vraiment un problème avec la langue elle-même, mais bon sang, j'aimerais pouvoir utiliser Lua à la place de Javascript ... :)

    0
    June Rhodes

    Object Pascal:

    • Le fichier que vous êtes en train de modifier va et vient beaucoup, car l'interface et la mise en œuvre sont divisées en deux parties, mais restent néanmoins intégrées dans le même fichier.
    • Indexation dynamique des tableaux, les chaînes commencent à 1, vous spécifiez l'index de départ lors de la déclaration de tableaux fixes et les tableaux alloués dynamiquement commencent toujours à 0.
    • Les classes et les objets (sans parler des interfaces) sont superposés au langage et, entre autres choses, ne peuvent pas être empilés comme les enregistrements.
    • Lorsque vous appelez des fonctions sans paramètre, les () sont optionnels, ce qui est très pénible lorsque vous utilisez des pointeurs de fonction ou essayez de faire référence au résultat d'une fonction utilisant le nom de la fonction.
    • Les listes de paramètres ne peuvent pas gérer les types de tableaux fixes ou les types de pointeurs de fonctions sans définitions de types externes.

    Ceci est juste la langue, le prétexte désolant pour une bibliothèque standard et IDE flaky mérite leurs propres listes.

    0
    user350677