Question

Notez que ce n'est pas sur le CLR .NET que Microsoft enfonçait dans l'atmosphère d'évangéliser le concept de code managé. La plupart d'entre vous savent que le code managé a été autour depuis un certain temps et est peu liée à la science des fusées.

Ce que je voudrais savoir est pourquoi le concept de sécurité d'exécution dans l'évolution des ordinateurs est venu si tard .

Je sais que c'est comme demander « pourquoi ne pas le premier modèle Ford T viennent avec des ceintures de sécurité et airbags? ». La pertinence de la question demeure malgré cela bien, parce qu'il est bien dans la nature humaine pour protéger againts dangers connus. Par exemple. le premier T-Ford ne va pas assez vite pour motiver la recherche d'airbag. Il ne va pas assez vite pour que les gens font des erreurs de jugement fatales si souvent que cela motiverait la ceinture de sécurité en tant que loi et norme dans de nombreux pays.

Dans l'évolution de l'ordinateur, il est presque l'inverse. Nous avons commencé avec l'assembleur, l'équivalent de la conduite d'un T-Ford à un oeil avec 200 mph-patch. J'ai eu le plaisir de conversating avec quelques vieux routiers de cette époque, entendant ces histoires sur le code de montage-assemblage main, débogueurs humains, lignes grillion de code, etc. Si nous faisons une erreur vraiment méchant en C, nous pourrions finir par avec un écran bleu. Il y a des décennies, vous pourriez finir avec le matériel endommagé et Dieu sait quoi. Mais il est un mystère pour moi -. Tant de décennies, et tout ce que nous avons fait faire écraser moins douloureux a été le bluescreen (désolé pour l'utilisation de MS comme archétype pour quoi que ce soit)

Il est non seulement dans la nature humaine pour protéger contre les dangers connus, il est également dans toute la nature de programmeur pour automatiser et systématiser les installations communes , comme la vérification des erreurs, des diagnostics de mémoire, les cadres de journalisation, la maintenance de sauvegarde, etc., etc.

Pourquoi ne pas les programmeurs / humains commencent à automatiser la tâche d'assurer que le code qu'ils alimentent le système ne sera pas nuire au système ?. Oui, bien sûr, performances . Mais bon, ce fut bien avant toute norme de matériel pénétrant au sérieux. Pourquoi ne pas les cartes mères conçues selon un modèle avec des architectures de bus et processeurs supplémentaires pour faciliter « le code managé »?

Y at-il métaphore pour Ford modèle T de ne pas être assez vite que je suis absent?

Était-ce utile?

La solution

Réfléchissons cela par des principes premiers.

Une plate-forme gérée fournit une surface relativement bac à sable pour exécuter un code de programme qui est créé à partir du langage de haut niveau en une forme plus adaptée à être exécutée par la plate-forme (IL bytecode). En il y a aussi des fonctions utilitaires comme la collecte des ordures et le chargement du module.

Pensons maintenant à une application native - le système d'exploitation fournit une zone relativement sandbox (un processus) pour exécuter le code de programme qui est créé à partir d'un langage de haut niveau à une forme plus appropriée à exécuter par la plate-forme (x86 opcodes). En il y a aussi des fonctions utilitaires comme la gestion de la mémoire virtuelle et le chargement du module.

Il n'y a pas beaucoup de différence, je pense que la raison pour laquelle nous avons réussi la plate-forme en premier lieu est tout simplement parce qu'il fait la plate-forme de codage plus facile. Il devrait rendre le code portable entre les systèmes d'exploitation, mais MS ne se souciait pas pour cela. La sécurité fait partie de la plate-forme gérée, mais devrait faire partie du système d'exploitation - par exemple. votre application gérée peut écrire des fichiers et similaires, tout comme un processus normal. La restriction qui est une fonction de sécurité, il est un aspect d'une plate-forme gérée qui n'existe pas native.

En fin de compte, ils auraient pu mettre toutes ces fonctionnalités gérées dans un ensemble de dll indigènes et mis au rebut l'idée du bytecode intermédiaire, JIT compiler en code natif au lieu. « Géré » des fonctionnalités telles que GC est facilement possible sur des tas indigènes -. Voir le Boehm C ++ un pour un exemple

Je pense que MS a fait en partie parce qu'il a fait le compilateur plus facile à écrire, et en partie parce que c'est la façon dont Java a été fait (et .NET est très bien un descendant de Java, si seulement dans l'esprit), bien que Java a fait cette façon pour faire multiplateformes de codage possible, quelque chose MS ne se soucie pas.

Alors, pourquoi ne pas nous obtenons du code managé depuis le début - parce que toutes les choses que vous mentionnez comme faisant partie du code « géré », sont le code natif. plates-formes gérées que nous avons aujourd'hui sont tout simplement une abstraction supplémentaire au-dessus d'une plate-forme déjà abstraire. langues de haut niveau ont eu plus de fonctionnalités pour les ajouter pour vous protéger contre vous-même, les dépassements de tampon sont une chose du passé, mais il n'y a aucune raison qu'ils ne pouvaient pas avoir été mis en œuvre en C lorsque C a été inventé. Il est juste qu'ils n'étaient pas. Peut-être que le recul fait croire que ces caractéristiques ont été portées disparues, mais je suis sûr que dans 10 ans, nous allons demander « pourquoi ne pas C # implémenter la fonctionnalité évidemment utile XYZ comme aujourd'hui »

Autres conseils

Le code managé construit dans la sécurité, etc. a été autour depuis longtemps.

Il était tout simplement pas de place pour elle dans la plate-forme PC d'origine et il n'a jamais obtenu ajouté plus tard.

Le vénérable mainframe IBM a protégé adressage, intouchable bibliothèques Kernal, la sécurité basée sur les rôles, etc., etc., depuis les années 70. De plus tout ce code Assembleur a été géré par un système sophistiqué (pour le moment) système de gestion du changement. (Univac, Burroughs etc avait quelque chose de similaire.)

Unix avait la sécurité assez décent construit depuis le début (et il n'a pas beaucoup changé au fil des ans).

Je pense donc cela est très bien un windows / problème d'espace web.

Il n'y a jamais eu un virus mainframe! La plupart des transactions financières dans le monde passent par ces systèmes à un moment donné si ce ne est pas comme si elles werent une cible attrayante.

Le système interne de messagerie IBM a fait l'hôte de la première « cheval de Troie » bien!

En fait, le code managé a été autour depuis très longtemps. Considérez:

  • LISP
  • Smalltalk
  • BASIC (saveur originale)

Tous les environnements de système fourni comme exploitation qui protégeaient l'utilisation de la mémoire et d'autres problèmes de contrôle des ressources. Et tous ont été des échecs relatifs (BASIC seulement vraiment réussi lorsque des fonctionnalités telles que PEEK & POKE qui vous a permis de jouer avec le système sous-jacent ont été introduits).

Les ordinateurs ne sont pas assez puissants et assez puissant qui les rend était trop cher. Lorsque vous avez seulement des ressources limitées à votre disposition, chaque octet et du cycle CPU compte.

Le premier ordinateur j'ai utilisé était un Sinclair ZX Spectrum en 1982. Il avait moins de RAM (16K) que la taille du fichier de police aujourd'hui d'un seul sous Windows. Et ce fut tout récemment, l'âge de l'ordinateur à la maison. Avant le milieu des années 1970, l'idée d'avoir un ordinateur dans votre maison était inconcevable.

Pour le compte rendu, nous assembly compilé à la main jamais. Nous montage code de langue assemblé à la main. Maintenant que cela est clair ...

Votre analogie est obscurcit la question parce que la vitesse de la voiture n'est pas analogue à la vitesse de l'ordinateur dans ce sens: La vitesse croissante de la voiture a nécessité des changements dans la sécurité automobile, mais ce n'est pas la vitesse accrue de l'ordinateur qui entraîne la nécessité de changements dans la sécurité informatique, il est l'augmentation de la connectivité. D'un angle légèrement différent: Pour la voiture, la vitesse croissante est le conduite la technologie pour accroître la sécurité. Pour les ordinateurs, en augmentant la vitesse est permettant la technologie pour accroître la sécurité.

Ainsi, les premières voitures étaient en sécurité dans des accidents parce qu'ils ont été lents. Les premiers ordinateurs étaient en sécurité parce qu'ils ne sont pas en réseau.

Maintenant, les voitures sont plus sûres grâce à des ceintures de sécurité, coussins gonflables, ABS, dispositifs anti-collision, et ainsi de suite. Les ordinateurs sont sécurisés grâce à des techniques supplémentaires, bien que vous ne pouvez toujours pas battre débranchant le câble réseau.

Ceci est une simplification, mais je pense qu'il obtient au cœur de celui-ci. On n'a pas besoin de ce genre de choses à l'époque, parce que les ordinateurs ne sont pas connectés au réseau.

La même raison pour laquelle Il n'y avait pas de trains il y a 300 ans. La même raison pour laquelle Il n'y avait pas de téléphones cellulaires il y a 30 ans. La même raison pour laquelle nous ne disposons toujours pas la machine de téléportation.

La technologie évolue au fil du temps, on l'appelle l'évolution.

Les ordinateurs ne suffisaient pas à l'époque puissant. l'exécution d'un collecteur d'ordures à l'arrière-plan aurait vous tuer les performances des applications.

En parlant à votre question de savoir pourquoi les ordinateurs ne disposaient pas des mécanismes de protection au niveau du code managé, plutôt que pourquoi les machines virtuelles ne pouvait pas fonctionner sur du matériel lent (déjà expliqué dans d'autres postes). La réponse courte est qu'il était. Processeurs ont été conçus pour lancer une exception lorsque du mauvais code est arrivé pour que ce ne serait pas endommager le système. Windows gère ce notoirement mal, mais il existe d'autres systèmes d'exploitation là-bas. Unix passe sous forme de signaux afin que les programmes se résiliés sans arrêter le système. Vraiment si vous utilisez le code managé ou non, une exception de pointeur nul ou non entraînera la même façon - à la fin du programme. La mémoire virtuelle assure que les programmes ne salissent pas avec autre code, tout ce qu'ils peuvent faire eux-mêmes est blessé.

Ce qui me amène à mon deuxième point. Tout cela est inutile si vous savez ce que vous faites. Si je veux garder mes meubles propres, je simplement ne pas laisser tomber la nourriture là-dessus. Je ne ai pas besoin pour couvrir ma maison en plastique, je dois juste faire attention. Si vous êtes un codeur bâclé le meilleur VM dans le monde ne va pas vous sauver, il va simplement vous permettre d'exécuter votre code bâclée sans aucun bruit. En outre, le code est le portage facile si vous utilisez l'encapsulation appropriée. Lorsque vous êtes un bon codeur, le code managé ne permet pas largement. C'est pourquoi ne pas tout le monde utilise. Il est tout simplement une question de préférence, pas mieux / pire.

En ce qui concerne la sécurité d'exécution va, il n'y a rien un compilateur P-code peut prévoir qu'un code machine ne peut pas, et rien d'un interpréteur de code managé peut gérer que le système d'exploitation ne peut pas (ou ne fonctionne pas) déjà . Cartes mères avec des bus supplémentaires, des jeux de processeurs et d'instruction coûtent beaucoup plus d'argent - Il est tout au sujet du rapport coût / performance

.

En 1970, le coût de la mémoire était environ 1 $ / bit (sans inflation). Vous ne pouvez pas se permettre la collecte des ordures de luxe avec des coûts comme ça.

Je pense que la plupart des questions: « Pourquoi nous n'avions pas X dans la programmation il y a quelques années Y » la réponse est allocation vitesse / ressource. Avec des ressources limitées dont ils ont besoin pour gérer le plus efficacement possible. Le type de gestion à usage général associé à code managé aurait été trop consomme beaucoup de ressources pour avoir été bénéfique dans la performance des applications critiques de l'époque. Cela fait également partie des raisons pour lesquelles la performance d'aujourd'hui code critique est toujours écrit en C, Fortran ou assembleur.

Pourquoi didn'we simplement construire à la fois des vaisseaux spatiaux et des avions, au lieu de bidouiller avec cheval et chariot et tout ça ennuyeux?

L'utilisation d'un langage intermédiaire nécessite une des deux choses:

  1. interprétation d'exécution, ce qui aura une pénalité de performance importante (très variable - parfois 2x ou moins, mais parfois 100x ou plus)
  2. Un compilateur juste à temps, ce qui nécessitera la RAM supplémentaire, et qui ajoutera à peu près retard proportionnel à la taille du programme, plutôt que le nombre d'instructions exécutées

Une chose qui a changé au fil des années est que de nombreux programmes fonctionnent les parties les plus fortement utilisées leur mode beaucoup plus souvent qu'auparavant. Supposons que la première fois une déclaration particulière est exécutée encourra une pénalité de 1000 fois plus longtemps que les exécutions ultérieures. Quel sera l'effet de cette peine dans un programme où chaque instruction est exécutée en moyenne 100 fois? Quel sera l'effet de cette pénalité sur un programme dans lequel chaque instruction est exécutée en moyenne 1.000.000 fois?

Juste à temps la compilation a été possible depuis longtemps, mais dans les années 1980 ou 1990, le coût de la performance aurait été inacceptable. Alors que les technologies ont changé, les coûts pratiques de compilation JIT sont parvenues au point qu'ils sont tout à fait pratique.

La réponse devient plus claire - les humains ne sont pas construits pour écrire des programmes. Les machines devraient être le faire et nous laisser détendre en jouant pacman.

Pour ce que ça vaut, je l'ai lu quelques papiers pour mon langages informatiques classe (un par CAR Hoare et un autre par Nicholas Wirth) préconisant exactement ce retour dans les années 60 et 70 entre autres.

Je ne peux pas parler exactement pourquoi ces choses ne se produisent pas, mais je pense que c'est juste une de ces choses qui ressemble évident avec le recul qui était pas évident à l'époque. Il n'est pas que les compilateurs précédents ne sont pas préoccupés par la sécurité. Il est qu'ils avaient des idées différentes sur la façon de le faire.

Hoare mentionne l'idée d'un « compilateur de commande ». Pour autant que je peux dire, cela est essentiellement un compilateur qui fait l'analyse statique. Pour lui, ce fut une technique populaire qui a échoué (ou au moins ne pas résoudre autant de problèmes qu'il était inteneded à résoudre). La solution lui était de rendre les langages de programmation plus sûre en créant le code managé (ou du moins c'est la façon dont il l'aurait dit en termes modernes).

J'imagine qu'une fois C (et plus tard C ++) pris sur, l'idée de code managé était essentiellement morte. Ce n'est pas que C était une mauvaise langue, juste qu'il était destiné à être un langage assembleur au lieu d'un langage de programmation d'application.

Si vous obtenez une chance, vous pouvez lire Conseils sur la conception de la langue de programmation . Il est une très bonne lecture si vous êtes intéressé par ce genre de chose.

Meilleure réponse à cette question est, à mon humble avis, personne n'a eu une idée de code managé à ce moment-là. La connaissance évolue réellement au fil du temps. Par rapport à des domaines tels que l'architecture ou l'agriculture, la science informatique est un domaine très jeune. Ainsi, la connaissance collective sur le terrain est aussi jeune et évoluera au fil du temps. Peut-être que dans quelques années, nous rencontrons un nouveau phénomène et quelqu'un poserons la même question, « pourquoi ne pas quelqu'un pense de XYZ Beofore? ».

Je dirais que c'est en grande partie été la résistance au changement associé à la perception fausse de l'inefficacité de la collecte des ordures qui a retardé l'adoption de GC et des techniques connexes. Bien sûr, la mort cérébrale segmenté modèle de mémoire sur Intel 8086 n'a pas exactement aider à promouvoir la gestion de la mémoire saine d'esprit sur le PC.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top