10
votes

Quelles sont les raisons historiques que les langues sont pré-incréments et post-incréments?

(Remarque: je ne pose pas de questions sur les définitions de pré-incraction par rapport au post-incrément, ou comment elles sont utilisées en C / C ++. Par conséquent, je ne pense pas que ce soit une question en double.)

Développeurs de C (Dennis Ritchie et al) a créé des opérateurs d'incrément et de décrémentation pour de très bonnes raisons. Ce que je ne comprends pas, c'est pourquoi ils ont décidé de créer la distinction de pré-incréments de post-incréments / décréments?

Mon sens est que ces opérateurs étaient beaucoup plus utiles lorsque C était en cours d'élaboration que d'aujourd'hui. La plupart des programmeurs C / C ++ utilisent l'un ou l'autre et les programmeurs d'autres langues trouvent la distinction aujourd'hui bizarre et déroutant (NB: Ceci est basé uniquement sur des preuves anecdotiques).

Pourquoi ont-ils décidé de le faire et ce qui a changé de calcul que cette distinction n'est pas aussi utile aujourd'hui?

Pour l'enregistrement, la différence entre les deux peut être vue dans C ++ Code: xxx

donnera en tant que sortie Xxx


11 commentaires

Le développement du langage C (par Ritchie) contient un paragraphe sur Les opérateurs d'incrémentation ainsi que postfix / préfixe, mais ne vont pas dans beaucoup de détails.


L'effet secondaire est ce qui est utile.


[Avertissement de spéculation] Lors de la programmation de systèmes en C ou C ++, vous finissez par écrire beaucoup de code. Tout ce qui vous aide à rester succinct est bon. Les opérateurs de préfixes et de postfix permettent aux programmeurs de perdre moins d'espace pour une jonglerie variable. Je pense que c'est pourquoi ils l'ont ajouté. Je suis surpris que C n'a pas d'opérateur de swap de valeur variable, cependant.


@Dai Quand j'ai commencé à apprendre C, j'utiliserais des astuces qui ont regardé L33T, aujourd'hui, je respecte la Pola et divers autres principes. tout imbécile peut écrire du code qu'un ordinateur peut comprendre. Les bons programmeurs écrivent du code que les humains peuvent comprendre. ~ Martin Fowler


@ V.Oddou Il y a une différence entre être succinct et être incertain ou cryptique.


Qu'est-ce qui vous fait dire "Qu'est-ce qui a changé de calcul que cette distinction n'est pas aussi utile aujourd'hui"? Pour les processeurs dépourvus d'instructions simples Inc / déc , ils peuvent être remplacés trivialement avec Ajouter R0, R0, n ° 1 (exemple de bras). La distinction entre post et pré est aussi importante aujourd'hui que jamais.


Ma théorie a à voir avec Stack Management . Pour pousser sur une pile vous avez besoin incrément après et pour faire sauter cet élément, vous avez besoin Décrément avant .


@Shanzhengyang Avez-vous des statistiques - Dites-lui une analyse d'un groupe de projets open source ou de programmeurs - pour soutenir les présomptions dans cette question? Et appeler une variable trois plutôt que dire x lorsque vous envisagez de muter, il semble un effort délibéré pour décrire ces opérateurs comme déroutant.


@Tonyd, vous êtes invité à éditer le code. C'est assez clair dans mon livre, mais vous êtes le lecteur. En outre, il s'agit d'une discussion sur Internet et non d'une publication. Il n'est pas nécessaire que je m'aide à mener une enquête en dollars multimillionnaires afin de présenter la manière dont les programmeurs pensent de PrevS Post-. Je basse cela uniquement sur l'expérience personnelle, les conversations personnelles et le fait que Stackexchange a des dizaines de postes en discutant. En outre, il serait préjudiciable si j'ai posté des questions si et si seulement j'avais des statistiques substantielles que vous recommandez. Ce n'est pas la façon dont les tiges discutent des problèmes entre eux.


@Shanzhengyang: code édité; Appréciez votre note de «preuves anecdotiques». À votre santé.


Connexes: programmeurs.stackexchange.com/q/331870/33478


6 Réponses :


10
votes

L'incrémentation et la décrémentation de 1 ont été largement prises en charge dans le matériel à l'époque: un seul opcode, et rapide . Ceci parce que "incrémenter de 1" et "décrémentation par 1" était une opération très courante dans le code (fidèle à ce jour).

Les formes post-et de prefrementation n'ont affecté que l'endroit où cet outil a été inséré dans le code de la machine généré . Conceptuellement, ces émissions "augmentent / diminuent avant ou après en utilisant le résultat". Dans une seule déclaration xxx

le concept "avant / après" n'est pas utilisé (et il fait de même que ++ i; ), Mais dans xxx

c'est. Cette distinction est aussi importante que celle-ci que lorsque la langue C a été conçue (cet idiome particulier a été copié de son précurseur nommé "B").

de

Cette fonctionnalité [PDP-7 ''s "" Les cellules de mémoire "auto-incrément"] ont probablement suggéré de tels opérateurs à Thompson [Ken Thompson, conçu "B", le précurseur de C]; La généralisation de leur faire le préfixe et le postfix était la sienne. En effet, les cellules auto-incréments n'ont pas été utilisées directement dans la mise en œuvre des opérateurs et une motivation plus forte pour l'innovation était probablement son observation que la traduction de ++ x était inférieure à celle de x = x + 1.

grâce à @Dyp pour mentionner ce document.


8 commentaires

Ritchie, le développement du langage C: "Les gens devinent souvent qu'ils ont été créés pour utiliser les modes d'adresses d'auto-incrément automatique et de décrémentation automatique fournis par le PDP-11 décembre sur lequel c et Unix sont devenus populaires. Ceci est historiquement impossible, car il n'y avait pas de PDP-11 quand B a été développé. " Le PDP-7 semble avoir des caractéristiques qui auraient pu jouer un rôle, bien que je ne pense pas que cela soit tout à fait clair du document qu'ils étaient la principale raison de l'existence du préfixe et du postfix ++ .


@DYP: C'est vrai comme ça peut être, je ne crois pas qu'ils l'ont inventé "de rien". Une instruction inc x peut avoir existé avant le PDP-11.


J'ai révisé mon commentaire. La performance aurait pu être un aspect, mais je ne pense pas que les opcodes peuvent montrer toute la photo.


@DYP: merveilleuse lecture. J'ai inclus la citation concernée car elle semble totalement appropriée.


La traduction était plus petite . Voici donc votre raisin hystérique: manque d'optimiseur dans les premiers compilateurs .


B "activement" couru sur un honeywell 6070 , qui avait AOS (ajoutez un à stockage) instruction vers au moins 1967. Il n'a pas eu une opération de soustraction similaire, et Le PDP-7 n'est pas non plus le PDP-7 B est allé ensuite . Au moment où C a frappé un PDP-11, l'équipe DEC avait introduit Adresse des modes .


Étant donné que l'ajout d'ajouter un au stockage était une "chose" dès 1967 et "modes d'adressage" complets étaient disponibles après environ 1970, je soupçonne qu'il y avait une reconnaissance générale de la communauté de la valeur de ces opérations à la fois basse (ensembles d'instructions). et à un niveau élevé (B, C).


Cette réponse associée a une extraction plus longue du "développement du langage C".



0
votes

Le PDP-11 avait une seule instruction correspondant à * p ++ , et une autre pour * - p (ou éventuellement l'inverse de l'autre côté).


1 commentaires

S'il vous plaît voir Le développement du langage C (par Ritchie) . Les opérateurs étaient en B, qui était pré-PDP-11.



2
votes

Pour obtenir une réponse qui va au-delà de la spéculation, vous devez probablement demander à Dennis Ritchie et Al personnellement.

Ajout à la réponse déjà donnée, j'aimerais ajouter deux raisons possibles que j'ai proposées:

  • Lazyness / conservateur Espace:

    Vous pourriez être en mesure d'enregistrer quelques clés / octets dans le fichier d'entrée à l'aide de la version appropriée dans les constructions telles que tandis que (- i) vs. code> tandis que (i -) / code>. (Jetez un coup d'œil à la réponse de PMG pour voir, pourquoi faire une différence, si vous ne l'avez pas vu en première course)

  • esthétique

    Pour des raisons de symétrie, une seule version avant ou postincrètrait / décrément peut avoir envie de manquer quelque chose.

    Edit: Ajout de l'épargne quelques octets dans le fichier d'entrée dans la section de spéculation fournissant, fournissant également une assez belle raison "historique" aussi.

    Quoi qu'il en soit, le point principal de la mise en place de la liste donnait des exemples d'explications possibles qui ne sont pas trop historiques, mais qui tiennent toujours aujourd'hui.

    Bien sûr que je ne suis pas sûr, mais je pense que demander une raison "historique" autre que le goût personnel commence à partir d'une présumtion non cruciale vraie.


5 commentaires

Malheureusement, demander à Dennis, vous auriez besoin d'une planche de Ouija - il est décédé il y a 4 ans.


Mikyra, la main dans votre badge Nerd. Ensuite, vous vous informez que vous ne saviez pas sur Leonard Nimoy :-)


Et John Nash ... (mais au moment de la création de C (Eh bien, B en fait) "La paresse" peut ne pas avoir été un point, mais sauver quelques octets précieux dans le fichier Entrée . )


... Qu'en est-il d'Elvis? Ne me dis pas ... Bon point de toute façon que je vais ajouter cela aux spéculations.


... Quoi qu'il en soit, le point principal était la démonstration des raisons pourraient ne pas être trop historiques, comme pour les deux raisons données, je manquerais toujours la fonctionnalité aujourd'hui et reconnaissez plutôt une langue aussi étrange que cela ne les soutient pas.



5
votes

Lorsque vous comptez en bas de n Il est très important, qu'il s'agisse de pré-décrément ou de post-décrément xxx

voir le Code fonctionnant sur Ideone .


1 commentaires

Merci d'avoir partagé cette sagesse. J'ai ajouté une référence à votre message. Très probablement mon hypothèse de la différence entre les deux versons est la fausse et l'en quelque sorte surveille de ma réponse.



2
votes

pour C

Regardons Kernighan & Ritchie Justification originale (K & R originale Page 42 et 43):

Les aspects inhabituels sont que ++ et - peuvent être utilisés comme préfixe ou comme postfix. (...) Dans le contexte où aucune valeur n'est souhaitée (..) Choisir préfixe ou postfix selon le goût. Mais htere sont des situations où l'un ou l'autre est spécifiquement appelé pour.

Le texte continue avec quelques exemples qui utilisent des incréments dans l'indice, avec l'objectif explicite de l'écriture " plus compact ". Donc, la raison de ces opérateurs est donc une commodité de code plus compact.

Les trois exemples donnés ( Squeeze () , getline () et strcat () ) Utilisez uniquement Postfix dans les expressions utilisant l'indexation. Les auteurs comparent le code avec une version plus longue qui n'utilise pas d'incréments incorporés. Cela confirme que l'accent est mis sur la compacité.

Highlight K & R à la page 102, l'utilisation de ces opérateurs en combinaison avec la derréférance du pointeur (par exemple, * - P et * p - ). Aucun autre exemple n'est donné, mais à nouveau, ils précisent que l'avantage est la compacité.

pour C ++

Bjarne Stroustrup souhaitait avoir C compatibilité C, donc C ++ hérité de préfixes et d'incréments de postfix et de décrémentation postfix.

Mais il y en a plus: dans son livre " la conception et l'évolution de C ++ ", Stroustrup explique que, initialement, il prévoyait avoir une surcharge pour, postfix et préfixe, dans des classes définies par l'utilisateur. :

Plusieurs personnes, notamment Brian Kernighan, ont souligné que cela la restriction n'était pas naturelle d'un perspective C et des utilisateurs empêchés de définir une classe qui pourrait être utilisée comme remplacement pour un pointeur ordinaire.

qui l'a causé à trouver la différence de signature actuelle pour différencier le préfixe et le postfix.

D'ailleurs, sans ces opérateurs C ++ ne serait pas c ++ mais c_plus_1; -)


0 commentaires

1
votes

Considérez la boucle suivante:

for(uint i=5; i-- > 0;)
{
    //do something with i,
    // e.g. call a function that _requires_ an unsigned parameter.
}


0 commentaires