Quelles fonctionnalités linguistiques sont considérées comme nuisibles? [fermé]


20

Veuillez expliquer pourquoi et répertorier les langues dans lesquelles la (mauvaise) fonctionnalité est implémentée.

Publiez ce que vous considérez comme une fonctionnalité nuisible, pas ce que vous n'aimez pas.



2
@sbi Vous pouvez également lire dans la même page "XMLHttpRequest considéré comme nuisible" ...
HoLyVieR

1
Tous sont considérés comme nuisibles, par quelqu'un ou une autre, à l'exception peut-être des expressions de base.
David Thornley


3
@David Thornley: a = 1/0- expression basique, nocive. ;-)
Orbling

Réponses:


37

Enregistrer Globals en PHP

Informations: http://php.net/manual/en/security.globals.php

Il s'agit de loin de la pire fonctionnalité jamais mise en œuvre pour des raisons de lisibilité et de sécurité. Fondamentalement, tous les paramètres GET reçus sont transformés en variables.

Par exemple avec cette URL: /index.php?value=foobar

Vous pouvez effectuer les opérations suivantes:

<?php
echo $value; // return foobar
?>

Lorsque vous lisez du code, il est très déroutant de savoir d'où vient la variable.

De plus, si la fonction est utilisée à mauvais escient, elle peut entraîner un trou de sécurité. Voici un exemple de code de php.net qui montre comment il peut être mal utilisé:

<?php
// define $authorized = true only if user is authenticated
if (authenticated_user()) {
    $authorized = true;
}

// Because we didn't first initialize $authorized as false, this might be
// defined through register_globals, like from GET auth.php?authorized=1
// So, anyone can be seen as authenticated!
if ($authorized) {
    include "/highly/sensitive/data.php";
}
?>

C'est horrible. Bien que je puisse comprendre le besoin, le garder par défaut n'a absolument aucun sens
TheLQ

14
Il convient de noter et a souligné que register globals n'a pas été activé par défaut depuis PHP 4.2 (tout le dos de manière en 2000), est désapprouvée en PHP 5.3 (2009) et sera supprimée entièrement en PHP 6, mais les gens toujours garder retourner aux "registres mondiaux OMG" bien même après 10 ans.

1
Pretty Hopeless PHP
Ming-Tang

@SHiNKiROU Ce n'est pas désespéré, cette fonctionnalité a été dépréciée et sera supprimée en PHP 6.
HoLyVieR

1
Ce n'est pas désespéré, il est tellement loin derrière tant d'autres langues que la seule raison pour laquelle quelqu'un l'utilise est qu'il était jusqu'à récemment beaucoup plus facile d'obtenir un hébergement web bon marché que d'autres langues.
intuition

22

Autoriser Null par défaut, l'erreur "trillion" * dollar. Désolé Tony Hoare. Presque toutes les langues disponibles sur la planète.

Tony Hoare explique

* J'ai ajusté l'expression inventée par Tony Hoare pour refléter la perte réelle de ces jours :-)


Ce n'est pas une fonctionnalité ou une erreur, mais plutôt un manque de fonctionnalité. Avoir des types de référence non annulables n'est pas quelque chose que vous pouvez légèrement déposer dans une langue; Cela nécessite beaucoup de réflexion et une bonne conception, et est très difficile à faire d'une manière qui ne ressemble pas à se battre avec le compilateur. Spec # et Singularity montrent à quel point c'est difficile.
imgx64

@ imgx86, non, c'est définitivement une erreur. Les types de référence non nullables sont une fonctionnalité ajoutée en réponse à l'erreur null pour permettre la compatibilité avec un système de types qui autorise généralement null.
Matt Olenik

@ Kyralessa: Peut-être qu'il veut être sûr que HoLyVieR obtient l'insigne populiste? :-) Je suis d'accord, cela n'a aucun sens d'accepter votre propre réponse comme celle-ci.
Macneil

18

MACROS C et C ++. Si jamais je dois voir une autre erreur du compilateur à cause de quelqu'un qui choisit un nom de fonction standard pour sa macro qui fout mon code, je vais crier. Voyons le dernier coupable:

#define vector(int) new VARIANT[int];

Aaarg! Qu'avez-vous fait avec mon vecteur STL!?


L'espace de noms est l'une des choses qui rendent les typedefs et les modèles immédiatement plus conviviaux.
Shog9

4
D'accord, mais seulement parce que les langues modernes ont trouvé des remplacements pour la fonctionnalité des macros textuelles. À l'époque où elles ont été inventées, les macros étaient une bonne chose parce que la technologie du compilateur était si primitive.
dsimcha

où avez-vous trouvé cette macro?
rwong

@dsimcha - Je n'en sais rien. Les macros Lisp existent depuis longtemps.
Jason Baker

2
@Jason: Je ne frappe pas les "vraies" macros AST de style Lisp, qui sont toujours utiles et cool. Je déteste seulement les macros de style C / C ++ qui fonctionnent uniquement au niveau textuel, n'ont aucune notion de portée, permettent de créer des abstractions ridiculement fuyantes et du code obscurci, et peuvent être complètement rendues obsolètes par des fonctionnalités plus modernes, dont une, ironiquement , est de "vraies" macros.
dsimcha

14

Fallthrough par défaut dans les instructions de commutateur C et C ++.


18
C'est toujours une fonctionnalité utile dans tout le code que j'ai écrit. En quoi est-ce une erreur?
greyfade

6
@greyfade: Cela peut être utile jusqu'à ce que vous oubliez la breakdéclaration ou que quelqu'un ajoute un cas entre deux cas (ou les réordonne), sans remarquer qu'il y a eu une rupture entre eux. Je ne vois aucun moyen que la solution soit meilleure que la manière C # d'exiger une pause ou un cas de goto, etc.
Tim Goodman

9
L'appareil de Duff se moque de votre impunité!
Jesse C. Slicer

3
je suis d'accord. Par défaut, ce n'est pas une bonne fonctionnalité.

11
Personne ne lit? Il a dit la solution PAR DÉFAUT
Matt Olenik

13

Les conversions de types implicites lorsque les types en cours de conversion entre n'ont aucune relation évidente. Par exemple, convertir un aléatoire non numérique stringen un int, comme en PHP.


7
Il convient de noter qu'une fois que vous avez compris, ce genre de chose devient un problème. Ce n'est vraiment un problème que si vous ne faites aucune vérification dans les zones critiques pour les valeurs saisies par l'utilisateur, mais il est infiniment utile si, par exemple, vous savez que quelque chose sera un nombre, mais se présente sous la forme d'une chaîne. Par exemple, un champ d'une base de données sera probablement renvoyé sous forme de chaîne, et vous ne voulez pas vous soucier de le caster.
Tarka

2
@Slokun: Pouvez-vous trouver un meilleur exemple? Pourquoi stocker des valeurs intégrales dans une base de données en utilisant un type de chaîne?
Steven Evers

@SnOrfus Obtenir un nombre transmis dans une URL, une entrée utilisateur, des fonctions et d'autres choses communes aux langages à saisie non statique.
TheLQ

C'est également un problème en C, car la valeur d'une chaîne entre guillemets est un pointeur, qui peut être converti en un entier, et cela peut faire que les constructions qui semblent avoir du sens soient compilées correctement mais produisent un non-sens. En C ++, vous pouvez définir des fonctions de conversion avec le mot clé explicit, qui arrête les conversions de type implicites, mais il y a toujours des problèmes.
David Thornley

@TheLQ: S'il s'agit d'une entrée utilisateur, vous devez la valider pour déterminer s'il s'agit d'un nombre. Comme l'a dit @Slokun. Si vous lisez des données à partir d'un fichier, vous pouvez vous attendre à ce que les données numériques soient là où elles sont censées, mais avoir une exception déclenchée dans le cas d'une corruption de disque est souvent mieux que d'avoir simplement un aléatoire 0pour une certaine valeur.
intuition

12

goto : bien qu'ok dans de rares cas, il est plus souvent mal utilisé et conduit à des programmes difficiles à lire.


Bon dieu oui. xkcd.com/292
TheLQ

3
J'ai vu le contraire où permettre l'utilisation judicieuse de goto aurait sauvé un programme de 3 millions de lignes de code.
Dave

2
Ah, hyperbole ... Une technique littéraire valable.
Robert Harvey

11

AUCUN

Le simple fait qu'une fonctionnalité soit fréquemment utilisée à mauvais escient ne la rend pas nuisible.

À mon humble avis, l'ensemble "est considéré comme nuisible" est la Reductio ad Hitlerum des discussions sur les langages de programmation.

La plupart, sinon la totalité, des fonctionnalités "nuisibles" ont, ou avaient à l'origine, un cas d'utilisation très valide ou sont tout simplement des méthodes de commodité en premier lieu. Il appartient aux développeurs de comprendre les avantages et les inconvénients et de coder en conséquence.

Si vos questions étaient censées être quelque chose du genre "quelles sont les caractéristiques du langage qui ont des pièges communs ou des effets secondaires malheureux", ma réponse serait différente.

[modifier] Pour être clair: je ne parle pas de l'utilisation continue de méthodes obsolètes. Si les développeurs déprécient / suppriment une fonctionnalité, vous devez utiliser le remplacement. Je fais référence au concept selon lequel une partie actuelle du langage est considérée comme nuisible parce que certains n'aiment pas ce qu'elle encourage ou le compromis impliqué dans son utilisation dont beaucoup de gens discutent.


13
Je ne suis pas d'accord, un bon contre-exemple est ma réponse. Le registre PHP mondial était tout simplement mauvais, peu importe comment vous les utilisez. C'est pourquoi il est obsolète et déconseille vivement de l'utiliser sur une ancienne version de PHP.
HoLyVieR

5
+1 Entre de mauvaises mains, toute construction de langage est nuisible.
mouviciel

5
Bon point ... même si 95% des gotos sont mauvais, la fonctionnalité elle-même vaut quand même la peine d'être utilisée pour les 5% restants
eds

1
Je pense que c'est plus comme mettre le bouton du siège éjectable à côté du bouton marche / arrêt de la radio. La fonctionnalité elle-même n'est peut-être pas mauvaise, mais elle ne prévient pas les dommages causés par une utilisation accidentelle.
LennyProgrammers

1
Je pense que c'est l'équivalent en programmation de "les armes à feu ne tuent pas les gens, les gens le font".
Orbling

7

L'autovivification (ou une autre fonctionnalité bind-variable-on- (assign | use)) est la fonctionnalité que j'ai trouvée pour me donner le plus de bugs.


+1 - Nous ne sommes peut-être pas d'accord sur le sucre de l'itérateur mais c'est quelque chose avec lequel je peux être d'accord à 100%.
ChaosPandion

7

PLEASEen INTERCAL. Ne l'utilisez pas assez, il se plaint. Utilisez-le trop, se plaint-il.


2
Cette langue n'est pas censée être utilisée sérieusement. Il a été créé pour être un langage de programmation très «unique», donc il est plein de choses (par exemple, venant de moi) qui n'ont pas de sens.
ShdNx

4
Je pensais que ce serait évident, mais oui, je suis conscient que ce n'est pas un langage sérieux.
Alan Pearce

2
Désolé, certaines personnes sont trop sérieuses ici.
Mark C

1
Je viens de découvrir la langue la semaine dernière sur Wikipédia et j'ai été stupéfait de sa popularité (et toujours de O_O).
Oliver Weiler

Il existe un certain nombre de langages «défi» et ils sont toujours populaires, car les codeurs ont tendance à faire le travail par amour de la chasse. Également très populaire pour les questions d'entrevue car elles sont délibérément obtuses, provoquant la réflexion et difficiles.
Orbling

7

Bien que certaines personnes soient en désaccord avec l'homme ou diverses choses qu'il dit, beaucoup de JavaScript de Douglas Crockford : The Good Parts est fondamentalement cette question appliquée à JS. Parmi les plaintes de Crockford:

  • Portée globale par défaut pour tout (DC montre comment utiliser la fonction / les objets en tant qu'espaces de noms et délimiteurs de portée pour résoudre ce problème.)

  • Des déclarations comme with, dont le comportement d'échec est de définir des choses à l'espace de noms global. (Gah! C'est comme la devise JS est que si vous échouez, échouez aussi fort que possible !)

  • Comportement inattendu avec l' ==opérateur, qui vous oblige essentiellement à toujours utiliser l' ===opérateur.

  • Insertion de point-virgule.

Vraiment beaucoup de JS devraient être considérés comme nuisibles, peut-être même tout le langage, mais les bonnes parties sont tellement bonnes qu'elles compensent en quelque sorte (au moins pour moi.)


6

"Échec en mode silencieux" dans Flash Player comme comportement par défaut

Ok, ce n'est pas vraiment une caractéristique de la langue elle-même, mais elle est toujours assez proche.

Soudain, votre application Flash / Flex cesse de fonctionner et personne ne peut vous donner la moindre indication de ce qui s'est passé. Pas de message d'erreur, pas de trace de pile, rien. C'est juste que soudainement, la transition d'écran ne se produit pas (ou se produit de manière complètement incorrecte), ou les boutons ne réagissent plus aux clics, ou les zones de liste déroulante sont vides au lieu d'être remplies avec certaines entrées.

Cette "fonctionnalité" à elle seule est responsable de plusieurs rapports de haussement d'épaules et de tout un tas de cheveux gris que j'ai reçus. -.- Bien qu'il ne soit pas souhaitable de faire apparaître un message crypté dans le visage de l'utilisateur, cela peut au moins aider le développeur à résoudre le problème.

Mais Flash Player vous laisse traîner dans le noir, en vous basant sur la description de l'utilisateur (alors que le problème peut en fait provenir d'un emplacement complètement différent dans le code qui n'a rien à voir avec ce que l'utilisateur faisait). Ce n'est que si vous utilisez le lecteur de débogage que vous obtenez réellement la fenêtre contextuelle avec un message d'erreur et une trace de pile.

Cependant, il peut être très intéressant de regarder des films Flash intégrés sur certains sites d'actualités et d'obtenir des messages répétés sur les références Null du SWF du lecteur intégré utilisé. :RÉ


Les applications iPhone se bloquent également parfois sans avertissement, à certains moments étranges
Ming-Tang

3
Ne rien faire en silence est assez nul.

6

En C / C ++: que les affectations sont également des expressions COMBINÉES AVEC les opérateurs d'affectation = et de comparaison == très similaires. Ce n'est pas une fonctionnalité nuisible en soi, mais c'est un moyen d'introduire facilement (parfois subtilement) des bogues en tapant accidentellement l'opérateur.

int i = 10;

someCode();

if(i = 5)
{
    /* We don't want this block to be executed, but it is */
    moreCode();
}

... combiné avec le fait qu'un entier ou un pointeur est une condition valide.
barjak

5

Modificateurs d'accès en Java avec package langage privé par défaut et convention de programmation privée par défaut.


5

Remplacement des variables non définies par une chaîne vide dans la coquille sans aucun avertissement: rm -rf $nosuchvar/*.


+1 Argh! LOL - horrible défaut (et exemple amusant / effrayant)
Orbling

@Orbler quelque chose comme ${varname:-/dev/null}peut être une solution de contournement ...
duros

Eh bien, cela montre la nécessité de toujours vérifier de manière défensive l'existence et le contenu des variables avant utilisation.
Orbling

4

La possibilité de tourner dans le sens antihoraire dans LOGO. Wtf, permet de simplement tourner les 360 - xdegrés dans le sens horaire .


Eh bien, cela fait un moment que je n'ai pas utilisé LOGO. Pourquoi est-ce nocif?
Mason Wheeler

5
Le logo peut être utilisé pour contrôler un véritable robot tortue physique. Parfois, vous voulez que la tortue tourne dans une direction spécifique ou tourne plusieurs fois. Par exemple, vous le programmez peut-être pour faire une sorte de danse.
Daniel Cassidy

@Mason, c'était censé être une blague.
jjnguy

3
Oui, en particulier dans LOGO For Clocks.
intuition

1
J'adore le logo (voir programmers.stackexchange.com/questions/21028/… ) et c'est une excellente langue d'enseignement, en particulier pour les jeunes. Quand j'ai dit 11 ans et que j'ai utilisé Logo pour la première fois, la plupart de mes élèves ne connaissaient pas beaucoup la géométrie, mais on leur a dit que 90 était un quart de tour et qu'ils savent de gauche à droite. Ce n'est donc pas une caractéristique négative - la même chose que la raison pour laquelle nous ne multiplions pas par des inverses au lieu d'avoir un opérateur de division. Oui, je sais que c'est une blague.
Orbling

4

Arrêt du fil d'un autre fil

En Java et dans d'autres langages, vous pouvez arrêter arbitrairement un thread d'un autre sans donner le temps au thread que vous avez arrêté de se terminer correctement. Cette capacité a été dépréciée compte tenu de l'énorme quantité de problèmes qu'elle pourrait entraîner dans presque toutes les situations.


Bien que je suppose que cela peut être nocif, il est parfois extrêmement utile (par exemple, un débogueur prenant en charge les points de progression et d'arrêt uniques).
Jerry Coffin

1
@Jerry Debugging est une tout autre chose, cela n'arrête pas le processus, il le met en pause.
HoLyVieR

au contraire, il arrête le fil. Apparemment, vous parlez de tuer le fil, pas seulement de l'arrêter. C'est un peu plus difficile à justifier ...
Jerry Coffin

Je ne pense pas que cela soit nécessairement une fonctionnalité linguistique. Plus une bibliothèque standard.
Jason Baker

4

Variables variables en PHP

Juste parce que tu $canne veux pas dire$$should


1
Comme d'habitude, Perl ... a la fonctionnalité (potentiellement dangereuse) disponible, a un moyen facile de le désactiver ( use strict) et un moyen facile de le réactiver dans exactement les cas où vous le souhaitez ( no strict 'refs').

1
Je n'ai jamais trouvé d'utilisation pour avoir un nom de variable dynamique. Et les seules fois où je l'ai fait, cela a rendu le code illisible et un moment WTF quelques mois plus tard lorsque j'ai revu le code.
TheLQ

Mmm, les applications incluent la métaprogrammation avec les variables de package odieux d'autres personnes ou la table des symboles (qui est un peu différente, je suppose).

1
@Joe, je vous mets au défi de me montrer un exemple où les variables variables rendent la solution plus claire.
Kendall Hopkins

1
Le commentaire était censé être une blague, désolé de ne pas l'avoir précisé, mais puisque vous demandez ici, c'est le meilleur exemple où les variables variables rendent la solution plus claire . J'avoue que c'est un assez mauvais exemple.
Joe D

3

La Withdéclaration de Delphi vient à l'esprit, bien qu'il y ait des cas où elle est utile.


Un bon cas lorsque j'ai porté quelque chose de Delphi vers Lazarus et que mon descendant TControl contenait "avec Canvas do ... Width, Height" faisant référence aux tailles de contrôle, mais Lazarus TCanvas avait sa propre largeur et Delphi, donc cela a conduit à du code compilé à tort
Maksee


2

En Perl, le contexte scalaire par rapport au contexte de liste peut être délicat. Il y a de bons points qui rendent certaines opérations pratiques, mais parfois vous rencontrez quelque chose de terrible, comme changer complètement la signification d'un opérateur (potentiellement à une distance significative dans le code).

sub foo { (1..5) }
my @list = foo();           # (1,2,3,4,5)
my $length = scalar @list;  # 5. the length of the list.
my $length2 = scalar foo(); # '' (the empty string. because it's false)

Ce n'est pas juste.

(Cela découle d'essayer de créer quelque chose qui agit un peu comme l'opérateur de plage régulière, vous pouvez donc dire quelque chose dans une boucle comme next if /start_regex/ .. /end_regex/).


Un homme tellement déroutant. La pire chose à propos de l'apprentissage de Perl était d'essayer de comprendre cela.
glenatron du

J'ai toujours pensé que tout ce qui permet à une fonction de revenir de plusieurs façons était pratique.
Orbling

2

Syntaxe d'importation relative de Python 2.x. Supposons que j'ai un package x.pluginsqui ajoute la prise en charge de diverses autres bibliothèques pour x. Et supposons que j'ai un sqlalchemymodule x.pluginspour pouvoir ajouter le support sqlalchemy à x. Que pensez-vous qu'il se passera si j'ajoute la ligne suivante à sqlalchemy.py?

import sqlalchemy

La réponse est que le module essaiera de s'importer. Ce que fait cette syntaxe, c'est essentiellement l'impossibilité d'importer le package sqlalchemy global réel. Python 2.5 a ajouté un moyen de spécifier qu'il s'agit d'une importation relative:

from . import sqlalchemy

... mais ce n'est qu'en Python 3 que la première syntaxe a été supprimée (bien qu'elle puisse être désactivée en Python 2.6+ avec from __future__ import absolute_import).


1

sun.misc.unsafe est mon préféré de tous les temps; la collection de "nous en avions besoin pour implémenter les choses, mais vraiment, vraiment ne pensez pas que vous devriez l'utiliser."


7
Chaque bonne langue devrait avoir un paquet dangereux dans la bibliothèque standard. L'importation de ce package montre clairement votre intention de faire des choses non transférables de bas niveau. Les alternatives sont: 1- Avoir des fonctionnalités dangereuses dans le langage lui-même (C ++ par exemple) et 2- Devoir utiliser un langage différent tel que C pour faire des choses de bas niveau (Python et Ruby par exemple). L'approche du paquet dangereux me semble bien meilleure.
imgx64

1

Blocs communs FORTRAN. Si vous avez fait une simple erreur, une partie d'une application pourrait encombrer les globaux d'une autre partie.

FORTRAN a affecté l'instruction goto / COBOL alter instruction. Code auto-modifiant. Danger, avertissement, voler des monstres spaghetti !!


FORTRAN n'avait pas d'instruction ALTER. FORTRAN avait l'instruction ASSIGN, avec le GOTO affecté. COBOL avait la déclaration ALTER, qui avait un objectif similaire.
John R. Strohm

@John - merci. Ma mémoire d'affectation / modification est faible ... notamment parce qu'on m'a appris à ne jamais les utiliser.
Stephen C

1

Orientation objet (de tous les langages typés statiquement). Je parie que cette fonctionnalité a coûté et continuera de coûter beaucoup plus cher que les pointeurs nuls. L'orientation des objets n'est bonne que dans un langage dynamique de transmission de messages . Donc, il devrait également être supprimé des langages dynamiques comme Python (car il n'utilise pas le passage de message mais l'appel de sous-programme conventionnel).


Python prend en charge (à toutes fins utiles) le message de passage de smalltalk idiome. Il n'est simplement pas nommé ainsi. Deuxièmement, je pense qu'il est au moins un peu discutable d'appeler une telle caractéristique du langage nuisible.
Jason Baker

L'orientation des objets améliore toujours la réutilisation du code et l'encapsulation du code / des données. Quelles que soient les utilisations statiques / dynamiques de la fonctionnalité.
Orbling

@Orbling: par rapport à quoi? À mon avis, les langages de programmation fonctionnels ont une réutilisation de code plus élevée et je pense que le système de modules de Haskell est assez bon pour l'encapsulation de code / données.
LennyProgrammers

@ Lenny222 Par rapport à la programmation impérative standard. Moi aussi, je préfère l'approche fonctionnelle, Haskell est ma langue préférée.
Orbling

@Jason Baker: c'est certainement discutable, mais être si omniprésent est précisément ce qui le rend si dangereux! Le PO a demandé mon avis et je l'ai donné. Tout simplement parce qu'un groupe de Lemmings saute d'une falaise ne rend pas le comportement sain d'esprit. Dans ce cas, il est mathématiquement prouvé que la POO ne fonctionne pas, et le paradigme correct est bien accepté: la théorie des catégories est un moyen de représenter les abstractions (c'est en fait la théorie des abstractions)
Yttrill

1

magic_quotesen PHP .

Les développeurs inexpérimentés comptent soit sur son activation et supposent donc que toutes les entrées utilisateur sont échappées pour être utilisées dans une requête SQL, soit sur la désactivation et échappent donc toujours à leur entrée.

En supposant qu'il est activé, puis en exécutant le code sur un système où il ne l'est pas, il ouvre de larges trous d'injection SQL béants.

En supposant qu'il est désactivé et qu'il ne l'est pas, cela entraînera le stockage de barres obliques inverses dans la base de données, provoquant des chaînes laides / incorrectes.

Il n'y a également aucun moyen extrêmement simple de gérer les deux cas - vous devez vérifier s'il est activé à l'aide de get_magic_quotes_gpc()puis appliquer stripslashes()sur toutes les valeurs dans les $_*tableaux - car array_mapn'est pas récursif, vous avez besoin d'une fonction personnalisée pour cela.


Ou vous pouvez simplement utiliser des requêtes paramétrées.
Pieter B

Même alors, vous obtiendrez des barres obliques inverses si les guillemets magiques sont activés et que vous ne vous y attendiez pas.
ThiefMaster

-3

Fonction de langage qui permet aux programmeurs d'écrire du code non commenté ou sans commentaire.


1
Et comment y remédier?
Maniero

1
@bigown: en implémentant la fonction commenter ou mourir: D.
tia

3
C'est ce qu'on appelle la programmation littéraire. en.wikipedia.org/wiki/Literate_programming
Barry Brown

2
Ce n'est pas une fonctionnalité, mais c'est un bogue extrêmement célèbre dans l'interface utilisateur, la plupart des gens le connaissent par son nom latin: Homo Sapiens.
Joe D

-3

sortir un peu sur un membre ici - fonctions vides. une fonction fait toujours quelque chose, elle doit donc renvoyer le résultat ou un autre élément d'information concernant son succès ou son échec.


3
Pascal avait des procédures (pas de valeur de retour) ainsi que des fonctions (valeur de retour).
Jon Onstott

Les fonctions font toujours quelque chose (eh bien, la fonction d'espace réservé n'importe qui?) , Mais il n'est souvent pas nécessaire d'en parler à personne.
Orbling

-4

POKE en BASIC ...


7
POKE était génial.
Shog9

2
Au début, le poke était le seul moyen raisonnable de réaliser certaines choses de base. Musique sur une pomme] [vient à l'esprit ...
Bill

2
Vous ne pourriez pas faire grand-chose sans POKE sur un Commodore 64, si je me souviens bien.
MetalMikester

1
N'oubliez pas le PEEK, tous deux essentiels.
Orbling

-5

Je devrais dire la collecte des ordures. Il n'élimine pas la nécessité de penser à la gestion de la mémoire, mais il élimine la perception de la nécessité de penser à la gestion de la mémoire, ce qui élimine trop souvent la pensée réelle, et ensuite vous obtenez d'énormes porcs de ressources et vous ne savez pas pourquoi. Surtout quand le comportement des GC générationnels modernes peut être décrit sans trop d'hyperbole comme «une grosse fuite de mémoire par conception» de toute façon.


2
Si vous avez des références quelque part dans une collection, vous avez d'autres problèmes.
Chinmay Kanchi

2
C'est pourquoi les langues gc'ed ont des références faibles :)
Chinmay Kanchi

4
Bien que GC ait certainement à la fois des forces et des faiblesses, je dois dire que Mason a beaucoup plus raison que tort sur celui-ci. En fait, j'ai vu des gens utiliser GC passer beaucoup de temps supplémentaire sur la gestion de la mémoire, car ils ont fini par essayer de pirater les choses après coup au lieu de le planifier à l'avance. GC empêche également généralement la destruction déterministe, ce qui entraîne un travail supplémentaire pour gérer toutes les ressources autres que la mémoire.
Jerry Coffin

3
@ChaosPandion: Suis-je vraiment un imbécile si je pense que, sur une machine multitâche moderne, afin d'empêcher la pagination de saccager les performances de votre système, la mémoire doit être libérée dès que possible? Aucun GC n'a jamais réussi à atteindre ce résultat, et en fait, le garbage collector générationnel, qui est censé être la meilleure variété la plus moderne qui soit, fait exactement le contraire: pour de meilleures performances, il doit libérer mémoire aussi tard que possible. Je ne pense pas que ce soit toujours le bon outil pour n'importe quel travail, pas quand cela ralentit mes autres programmes. Suis-je fou pour ça?
Mason Wheeler

2
@Barry: C'est déterministe dans le programme. Si j'en ai fini avec un bloc de mémoire de 5 Ko, demandez ensuite 5 Ko de plus peu de temps après, que se passe-t-il? Dans un système de récupération de place, il doit demander un nouveau bloc de 5 Ko, même s'il existe un bloc parfaitement bon inutilisé, sauf si le GC a été exécuté entre-temps, auquel cas vous pouvez recycler l'ancien bloc. Avec malloc et gratuit, vous pourrez toujours recycler l'ancien bloc. Multipliez cela par quelques centaines de milliers et cela devient un vrai problème.
Mason Wheeler

-5

C, et certainement C ++: arithmétique du pointeur. Permettre aux gens de convertir des entiers en adresses de mémoire pose problème.

Et peut-être même un accès brut aux pointeurs?

En C ++, vous avez des références qui rendent les pointeurs presque complètement inutiles. Pour les autres cas, les pointeurs intelligents devraient être considérés comme obligatoires.

Java prouve également que vous pouvez créer un langage de programmation qui utilise des pointeurs sans permettre aux utilisateurs d'accéder à la valeur du pointeur elle-même.

A part null... mais c'est une autre histoire.


5
Les pointeurs, bien que parfois difficiles à utiliser correctement, sont très nécessaires pour un grand nombre d'opérations de mémoire efficaces.
Bill

1
Vrai. Mais, à mon avis, permettre aux gens de convertir régulièrement des entiers en références de mémoire ou d'ajouter des nombres aux adresses de mémoire est principalement nuisible de nos jours. En C ++, vous avez des références comme une alternative parfaitement bonne, et des pointeurs intelligents / pointeurs automatiques lorsque vous en avez vraiment besoin pour être un pointeur.
Asgeir S. Nilsen du

4
Cette réponse est uniquement valable si vous travaillez sur une pile logicielle construit pour les pointeurs de masquage. Dans tous les autres cas, cette réponse est fausse.
Paul Nathan

3
Certains langages de programmation doivent disposer de pointeurs pour que vous puissiez écrire tous les systèmes d'exploitation et machines virtuelles pour les autres langages de programmation.

2
-1. Il y a une raison pour laquelle vous avez besoin de l'arithmétique ptr: itérer un point est rapide que l'indexer. for(int i=0;i<SIZE;++i) ++arr[i]est plus lent que for(int*i=arr;i<arr+SIZE;++i)*i++. Tout ce que java a réussi à prouver, c'est que vous avez besoin d'un pointeur, ou n'avez-vous jamais regardé sun.misc.Unsafe? Si vous n'avez pas besoin de pointeurs, veuillez expliquer comment écrire une fonction d'échange générique à l'aide de Java. (par exemple int a = 1, b = 2; swap (a, b); assert (a == 2 && b == 1);). Sans parler de tous les problèmes en c / c ++ que vous auriez si vous deviez utiliser des références. Comment appelleriez-vous une fonction virtuelle sur une structure opaque sans pointeurs?
KitsuneYMG
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.