Est-ce parce que Pascal a été conçu pour l'être, ou existe-t-il des compromis? p>
ou quels sont les avantages et les inconvénients pour interdire ou non interdire la modification du comptoir à l'intérieur d'un blocage? IMHO, il est peu utilisé pour modifier le compteur à l'intérieur d'un blocage de bloc. P>
Modifier strong>: Il est
Pourriez-vous fournir un exemple dans lequel nous devons modifier le compteur à l'intérieur du blocage? P>
7 Réponses :
de pour la boucle P>
Dans certaines langues (pas C ou C ++) la la variable de boucle est immuable dans le portée du corps en boucle, avec tout tenter de modifier sa valeur considéré comme une erreur sémantique. Tel les modifications sont parfois un conséquence d'une erreur de programmeur, qui peut être très difficile à identifier une fois fait. Cependant seulement manifeste Les changements sont susceptibles d'être détectés par le compilateur. Situations où le L'adresse de la variable de boucle est passée comme argument à un sous-programme, faites-le très difficile à vérifier, parce que le Le comportement de la routine est en général inconnaissable au compilateur. P> blockQuote>
Donc, cela semble être de vous aider à ne pas vous brûler votre main plus tard. P>
Le plus gros problème que j'ai avec ça est que au moins quand je les ai fait Pascal / Delphi, ceci n'était pas i> documenté dans l'aide. Assez drôle, je pense que cela a fonctionné à Turbo Pascal 6 mais plus sur Delphi.
Oui, Loopvar n'est pas immuable dans Delphi (l'utiliser en fait un plus coûteux). Loopvar est toujours indéfini après Afaik
Il peut faciliter certaines optimisations (boucle déroulante par exemple): pas besoin d'une analyse statique compliquée pour déterminer si le comportement de la boucle est prévisible ou non. P>
Clause de non-responsabilité: Cela fait des décennies depuis que je faisais la dernière fois Pascal, alors ma syntaxe peut ne pas être exactement correcte.
Vous devez vous rappeler que Pascal est l'enfant de Nicklaus Wirth, et WIRTH se souciait très fortement de la fiabilité et de la compréhensibilité lorsqu'il a conçu Pascal (et tous ses successeurs). P>
Considérez le fragment de code suivant: p> sans regarder la procédure foo, répondez à ces questions: cette boucle jamais fini? Comment le sais-tu? Combien de fois la procédure est-elle appelée dans la boucle? Comment savez-vous? P> Pascal interdit la modification de la variable d'index dans le corps de la boucle afin qu'elle soit possible de connaître les réponses à ces questions et sachez que les réponses ne changeront pas quand et si la procédure foo change . p> p>
Bien entendu, donner à la sémantique Pascal ne garantit pas que le corps de la boucle de la boucle sera terminé ...
Pascal a été conçu à l'origine comme une langue d'enseignement pour encourager la programmation structurée de blocs. Kernighan (le K de K & R) a écrit un essai (naturellement biaisé) sur les limitations de Pascal, pourquoi Pascal n'est pas mon langage de programmation préféré em> .
L'interdiction de modifier ce que Pascal appelle la variable de contrôle em> d'un sans Celles-ci et une autre différence entre Pascal et C reflètent les différentes philosophies avec lesquelles ils ont été conçus pour la première fois: Pascal d'appliquer un concept de "correct" de conception "correcte", C à PE rmit plus ou moins quelque chose, peu importe la dangereuse. p> (Remarque: Delphi a une instruction code> code>, ainsi que clairement nous n'avons jamais besoin fort> pour pouvoir modifier la variable de contrôle dans un Bien que cela utilise un pointeur La variable de boucle, elle aurait également pu être écrite avec un indice entier dans la chaîne: P> pour Code> Boucle, combinée à l'absence d'un énoncé code> Break code> signifie qu'il est possible de savoir combien de fois le corps de la boucle est exécuté sans étudier son contenu. P>
Pause code> instruction, et ne pas pouvoir utiliser la variable de contrôle après la fin de la boucle est plus une restriction que de ne pas pouvoir modifier la variable de contrôle à l'intérieur de la boucle car elle empêche d'être écrit de certaines chaînes et des algorithmes de traitement de la chaîne et des algorithmes de traitement de la chaîne. dans la voie "évidente". p>
Continuer code> et < code> Quitter code> qui est comme
retour code> en c.) p>
pour code> boucle, car nous pouvons toujours réécrire à l'aide d'un
pendant code> boucle. On trouvera un exemple en C où un tel comportement est utilisé dans la section K & R 7.3, où une simple version de
printf () code> est introduite. Le code qui gère
'%' code> séquences dans une chaîne de format
FMT code> est: p>
'Turbo Pascal` Support Break Code> Il y a longtemps.
Oui, mais Turbo Pascal est pris en charge Break code> en tant qu'extension de langue non standard: il ne fait pas partie de Standard Pascal (ISO 7185). J'ai mentionné les extensions dans le contexte de Delphes, alors que Turbo Pascal n'est maintenant que de l'intérêt historique (il aurait peut-être été la première langue compilée que j'ai jamais utilisée).
Oui.J'ai mentionné Turbo Pascal Code> uniquement pour démontrer que
Pourquoi Pascal n'est pas mon langage de programmation préféré code> est obsolète.
Légèrement injuste de rejeter Turbo Pascal, car seulement de «intérêt historique» lorsqu'il est pratique Delphi, Turbo Pascal (-: Il y a eu beaucoup d'évolution et de croissance depuis que j'ai eu mon (premier) copie dans ~ 1983, mais c'est essentiellement que celui-ci a augmenté ( via l'ajout d'objets, erm, il y a quelque temps) dans l'autre.
Il est probablement sûr de conclure que Pascal a été conçu pour empêcher la modification d'un indice de boucle à l'intérieur de la boucle. Il convient de noter que Pascal n'est en aucun cas le seul langage qui empêche les programmeurs de le faire, Fortran en est un autre exemple. P>
Il y a deux raisons convaincantes pour concevoir une langue de cette façon: p>
Pour de nombreux algorithmes, ce comportement est le comportement requis; Mise à jour de tous les éléments dans un tableau par exemple. Si la mémoire sert Pascal fournit également des boucles à faire et répétez jusqu'à ce que des boucles. La plupart, je suppose que des algorithmes implémentés dans des langages de style C avec des modifications de la variable d'indice de boucle ou des ruptures de la boucle pourraient être aussi facilement implémentées avec ces formes alternatives de boucle. P>
J'ai gratté ma tête et j'ai échoué à trouver une raison impérieuse permettant de permettre la modification d'une variable d'index de boucle à l'intérieur de la boucle, mais j'ai toujours considéré le fait de le faire en tant que mauvaise conception et la sélection de la bonne construction de boucle comme élément de bon design. p>
considère p>
marque p>
Dans la théorie de la programmation de la théorie des langues (et dans la théorie de la calculation) tandis que pour les boucles ont des propriétés théoriques différentes forte>: p>
La boucle pour la boucle présente en C ne comporte pas techniquement comme une boucle car vous ne savez pas nécessairement combien de fois la boucle itération avant d'exécuter. (C'est-à-dire que vous pouvez pirater le compteur de boucle pour courir pour toujours) P>
La classe de problèmes que vous pouvez résoudre avec tandis que les boucles sont strictement plus puissantes que celles que vous auriez pu résoudre avec le strict pour la boucle trouvée à Pascal. p>
Pascal est conçu de cette manière afin que les étudiants disposent de deux constructions de boucle différentes avec différentes propriétés de calcul forte>. (Si vous avez mis en œuvre pour le C-Way, la boucle de la boucle sera simplement une syntaxe alternative pour ...) P>
en termes strictement théoriques, vous n'avez pas besoin de modifier le compteur dans A pour la boucle. strong> Si vous pouviez vous en sortir, vous auriez juste une syntaxe alternative pendant une boucle de temps . p>
Vous pouvez en savoir plus sur "tandis que la calculabilité de la boucle" et "pour la calculabilité de la boucle" dans ces notes de conférence CS: http://www-comppsci.swan.ac.uk/~csjvt/jvtteaching/tpl.html p>
Une autre propriété de ce type BTW est que la bouclevariable est indéfinie après la boucle. Cela facilite également l'optimisation P>
C'est la meilleure réponse jusqu'à présent.
"La déclaration est utilisée lorsque le nombre d'itérations connues à l'avance" - WIRTH 1973, le langage de programmation Pascal (rapport révisé) MABEN.HomeIP.net/static/s100/software/pascal/...
Où avez-vous trouvé ces informations: Vous êtes censé savoir que pour que les boucles se terminent toujours. Code>
J'ai découvert que dans un cours sur les langages de programmation au cours de ma deuxième année de premier cycle de diplôme en CS. Je devrais qualifier cela en disant que nous parlions spécifiquement de "pour" des boucles à Pascal. C ne met pas en œuvre les boucles de style Pascal "pour". En C "pour" Les boucles sont vraiment "alors que" des boucles ;-)
Pascal a été mis en œuvre pour la première fois pour les CDC Cyber-A 1960s et 1970s Mainframe - qui, comme de nombreux processeurs d'aujourd'hui, disposaient d'excellentes performances d'exécution de l'instruction séquentielle, mais aussi une pénalité de performance significative pour les branches. Ceci et d'autres caractéristiques de l'architecture de cyber-cyber-architecture ont probablement fortement influencé la conception de Pascal de La réponse courte forte> forte> est que permettre l'attribution d'une variable de boucle nécessiterait un code de protection supplémentaire et une optimisation de la boucle pour les variables de boucle qui pourraient normalement être manipulées dans des registres d'index 18 bits. À cette époque, la performance logicielle était très appréciée en raison des frais du matériel et de l'incapacité à accélérer toute autre manière. P>
La famille de Data Corporation 6600, qui comprend le cyber, est une architecture RISC utilisant des mots de mémoire centrale de 60 bits référencés par des adresses de 18 bits. Certains modèles avaient une option (coûteuse, donc rare), l'unité de comparaison-déplacement (CMU), permettant d'adresser directement des champs de caractères à 6 bits, mais sinon il n'y avait aucun support pour "octets" de tout type. Étant donné que la CMU ne pouvait pas être comptée en général, la plupart des cybercédents ont été générés pour son absence. Dix caractères par mot constituaient le format de données habituel jusqu'à ce que la prise en charge des caractères minuscules cédait une représentation de caractère de 12 bits provisoire. P>
Les instructions sont de 15 bits ou 30 bits de longue durée, à l'exception des instructions de la CMU étant efficacement de 60 bits de long. Ainsi, jusqu'à 4 instructions emballées dans chaque mot, ou deux 30 bits, ou une paire de 15 bits et un 30 bits. Les instructions 30 bits ne peuvent pas couvrir les mots. Étant donné que les destinations de branche ne peuvent faire que référer des mots, les cibles de saut sont alignées par Word. P>
L'architecture n'a pas de pile. En fait, l'instruction d'appel de procédure Le fichier de registre comporte huit instances chacune des trois types de registre, A0..a7 pour la manipulation d'adresse, B0..b7 pour l'indexation et X0..x7 pour l'arithmétique générale. Les registres A et B sont de 18 bits; Les registres x sont 60 bits. Le réglage A1 via A5 a l'effet secondaire de chargement du registre correspondant X1 à X5 avec le contenu de l'adresse chargée. Le réglage A6 ou A7 écrit le contenu X6 ou X7 correspondant à l'adresse chargée dans le registre A. A0 et X0 ne sont pas connectés. Les registres B peuvent être utilisés dans pratiquement toutes les instructions en tant que valeur pour ajouter ou soustraire de tout autre registre A, B ou X. Par conséquent, ils sont parfaits pour les petits comptoirs. P>
Pour le code efficace, un registre B est utilisé pour les variables de boucle car les instructions de comparaison directe peuvent être utilisées sur elles (B2 <100, etc.); Les comparaisons avec X registres sont limitées aux relations à zéro, la comparaison d'un enregistrement X à 100, par exemple, nécessite de soustraire 100 et de tester le résultat pour moins de zéro, etc. Si une affectation à la variable de boucle était autorisée, une valeur de 60 bits devraient être vérifiés avant d'être attribués au registre B. C'est un vrai tracas. HERR WIRTH a probablement pensé que le tracas et l'inefficacité ne valaient pas l'utilitaire - le programmeur peut toujours utiliser un Plusieurs caractéristiques linguistiques uniques à Pascal se rapportent directement à des aspects de la cyber: p>
pour code> boucles. P>
rj code> est intrinsèquement non ré-entrante.
RJ CODE> Modifie le premier mot de la procédure appelée en écrivant un passer à l'instruction suivante em> après où l'instruction RJ est. Les procédures appellées renvoient à l'appelant en sautant à leur départ, ce qui est réservé pour le lien de retour. Les procédures commencent au deuxième mot. Pour mettre en œuvre la récursion, la plupart des compilateurs ont utilisé une fonction d'assistance. P>
pendant code> ou
répéter code> ...
jusqu'à < / code> boucle dans cette situation. P>
Alfa code> Type:
Array emballé [1..10] de caractère code> li>
Pack () Code> et
Déballez () Code> Pour faire face aux caractères emballés. Celles-ci n'activent aucune transformation sur les architectures modernes, seule la conversion de type. Li>
texte code> fichiers vs. code> fichier de char code> li>
witeln code> li>
jeu de caractères code> était très utile sur les CDCS, il n'était pas pris en charge sur de nombreuses machines de 8 bits ultérieures en raison de la consommation de mémoire excédentaire (variables / constantes de 32 octets pour l'ASCII 8 bits). En revanche, un seul cyber-mot pourrait gérer le jeu de 62 caractères natif en omettant nouvelle ligne et autre chose. Li>
Merci, mais Mel me prédate quelques années. (Il était difficile de résister à la description des unités de traitement des pépins-périphériques.)