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.
PHP
Et beaucoup plus subjectivement:
Python
LISP commun
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 ...
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.
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.
PHP:
LISP commun
Je me demande à quoi ressemblerait un LISP fortement typé
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
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.
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):
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.
Python
Haskell
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.
Permettre la construction de valeurs infinies conduit parfois à des erreurs vraiment frustrantes.
NoMonomorphismRestriction.
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.
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.
C
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.
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
Cinq choses que je déteste à propos de C++
#define STR_LINE2(x) #x
#define STR_LINE(x) STR_LINE2(x)
#define LINE_NUMBER STR_LINE(__LINE__)
Python, encore une fois:
Aucun mot clé de commutateur. Et NON, le dictionnaire ne remplace pas celui-ci. Pas même un tas de déclarations Elif
.
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?
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.
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.
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.
C #
dynamic
devrait résoudre la plupart de ces problèmes, mais il n'a pas encore été publié. 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.
C #
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.const
)using
est un substitut limité mais bon à savoir!)Cinq choses que j'ai ressenties dans Nemerle:
C++
C
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.
R (Projet R pour les statistiques)
VBA (parce que vous pensiez que votre langue était mauvaise)
Python
lambda
s. GRRRRfoo( 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) )
?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
for each ( foo )
la syntaxe et le comportement semblent être une réflexion après coup.Clojure
En ce qui concerne C #:
C++ manque de bons outils de refactoring, manque d'exceptions vérifiées
Java manque de modèles, manque de const
mot-clé
Java - pas de prise en charge de la composition au niveau de la langue
C #
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.
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]]
Les dialectes récursifs sont très faciles à valider avec PARSE
mais très difficiles à évaluer. (Les piles peuvent être utiles ici.)
BLOCK!
peut faire presque tout ce que XML peut faire. Cependant, le monde réel contient du XML.Espérons que le prochain REBOL 3 résoudra nombre de ces problèmes, à l’exception du dernier.
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++:
::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?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;
Python:
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.
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!
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.
C++
MEL (langage d'expression maya):
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:
Python:
Mon 5 pour Delphi:
• 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.
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
OK, j'aime bien le dernier, mais il y a 7 sortes de confusion
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.
Devoir assumer que nous avons une langue. Est-ce que nous?
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éthodereload()
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 moduleCelles 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)for
, non?)et un couple qui est corrigé dans Python 3
global
ne peut faire référence qu'à l'espace de noms de premier niveauPython:
Pas de boîte à outils graphique standard (la communauté tourne autour de cela mais ne semble jamais rien régler).
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.)
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).
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).
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.
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.
Scala:
Rubis:
Java:
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.
Rubis.
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. dict.items
ou dict.items()
? Ruby a eu ce droit, aussi. Ruby
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):
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é:
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.
L'énorme quantité de tutoriels/livres qui enseignent les mauvaises pratiques et le style. Cela peut être la cause principale de # 3.
La mauvaise réputation qu’il a développée s’explique principalement par les n ° 3 et n ° 4.
C #
Java
C est mon préféré mais cʻest aussi horrible.
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!
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:
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).
Python:
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.
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.
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)
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 :(
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;)
C
JavaScript
Python
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))]
)
a := 3
, vous devez dire put 3 into a
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."
JavaFX
Lua
Java:
C #
Item o()
(avec une disposition automatique si elle en a une).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)
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 ... :)
Object Pascal:
Ceci est juste la langue, le prétexte désolant pour une bibliothèque standard et IDE flaky mérite leurs propres listes.