2009-05-14 9 views
1

Dans l'esprit du latest podcast où Joel a mentionné qu'il aimerait quelques questions simples avec des réponses peut-être intéressant ...Est-ce que 30 GOTO 10 vont toujours à 10?

Dans les environnements que nous devons programmer aujourd'hui, nous ne pouvons pas compter sur l'ordre d'exécution de notre déclarations langauage. Est-ce vrai? Devrions-nous être concernés?

Will 30 GOTO 10 aller toujours à 10 *

* Je n'ai pas utilisé 20 exprès;)

[modifier] pour les quatre personnes votant pour la fermeture de cette question ...

"Les compilateurs d'exécution utilisent des informations de profilage pour optimiser le code compilé.La JVM est autorisée à utiliser des informations spécifiques à l'exécution pour produire un meilleur code, ce qui signifie que la méthode de compilation M peut générer un code différent. compiler M dans un autre "

(de concurrency Java dans la pratique, 2006, Goetz et al)

.. un coup d'oeil à la "transformation d'appel monomorphe"

[modifier]

et une autre modification, votre processeur est autorisé à échanger l'ordre d'exécution des déclarations ...

+0

Um, quels sont ces environnements? – mquander

+0

Eh bien, si vous regardez dans des machines virtuelles comme la JVM, le modèle de mémoire pour lui est permise d'échanger l'ordre d'exécution des déclarations en fonction des circonstances dans lesquelles il se trouve – blank

+0

Je ne connais pas les détails sur la JVM, mais sûrement il ne peut le faire que s'il est déjà décidé qu'il n'y a aucune chance qu'il puisse changer la fonctionnalité observable de votre code en changeant l'ordre d'exécution. – mquander

Répondre

25

Non, ce ne sera pas le cas. Mais il va toujours se comporter comme si c'était le cas. L'une des règles de base dans la conception de compilateur est la règle "as if". Votre compilateur peut faire les changements qu'il souhaite, tant que le résultat se comporte comme si vous aviez suivi les règles de langue.

GOTO 10 peut décider de passer à un autre emplacement, tant que le compilateur peut garantir qu'il ne changera pas le résultat du programme.

Donc non, cela ne devrait pas vous inquiéter.

+1

Par exemple, si 10 GOTO 100, le compilateur est susceptible de le compiler comme 30 GOTO 100. (Cela n'arrive pas souvent dans du code écrit à la main, mais ce genre de chose arrive tout le temps dans le code intermédiaire généré par le compilateur.) –

+0

+1 pour le moment c'est la seule réponse sensée ici – blank

13

Pas si vous avez

40 COMEFROM 30 

quelque part dans votre code.

+3

Vous avez oublié de dire "SVP" –

+3

La description de la langue spécifie une certaine plage de ratios de clauses "PLEASE" (IIRC), de peur que votre programme semble impoli ou obséquieux pour le compilateur. Est-il défini si un programme monoligne nécessite un "S'IL VOUS PLAÎT"? –

+0

J'avoue, mon INTERCAL-fu fait défaut. C'est bien sûr la variation BASIC. Dans ITERCAL ce serait "S'IL VOUS PLAÎT COMEFROM .3" ou quelque chose comme ça. –

1

Eh bien, ce ne sera pas si elle ne s'exécute pas, par exemple s'il y a un 20 GOTO 40.

1

En BASIC, oui. Dans d'autres langues, il générera une erreur de compilation.

+0

quoi? Je suis sûr que le code est en train de compiler – vedant1811

0

Qu'est-ce que vous essayez de dire? Toute personne prétendant être programmeur doit savoir (surtout après votre indice) que cela dépend de ce qui est sur les lignes 10 et 20, et toute personne qui a été sur SO pendant plus d'une semaine devrait se rendre compte que cette question ne semble pas ajouter beaucoup.

Nous devrions nous fier au code pour faire exactement ce que nous lui disons. Si nous le disons à GOTO 10 sur la ligne 30, mais lui disons aussi de sauter la ligne 30, nous ne devrions pas être la moindre surprise lorsque la ligne 30 est ignorée. Nous avons dit au programme de.

+0

Votre compilateur est autorisé à apporter des modifications à l'ordre d'exécution de vos instructions. Ainsi est votre processeur. Etes-vous conscient de cela? – blank

+0

Comme jalf l'a souligné, cela n'a pas d'importance pour les résultats. Pourquoi s'embêter? –

+0

Parce que c'est une question vaguement intéressante? – blank

8

alt text

0

Il est vrai que si l'on considère les processeurs multi-core exécution d'un programme BASIC, l'un des noyaux pourrait accidentellement manquer le GOTO (indice: « TLB Bug ») et continuer comme si elle était pas là.