web-dev-qa-db-fra.com

Pourquoi ne pas avoir un système d'exploitation basé sur un langage de haut niveau? Les langues de bas niveau sont-elles plus efficaces?

Sans être présomptueux, j'aimerais que vous envisagiez cette possibilité. Aujourd'hui, la plupart des systèmes d'exploitation sont basés sur des langages de bas niveau (principalement C/C++). Même les nouveaux tels que Android utilise JNI et l'implémentation sous-jacente est en C

En fait, (c'est une observation personnelle) de nombreux programmes écrits en C fonctionnent beaucoup plus rapidement que leurs homologues de haut niveau (par exemple: la transmission (un client bittorrent sur Ubuntu) est beaucoup plus rapide que Vuze (Java) ou Deluge (Python) ). Même les compilateurs python sont écrits en C, bien que PyPy soit une exception.

Y a-t-il une raison particulière à cela? Pourquoi est-ce que tous nos soi-disant "langages de haut niveau" avec les grands concepts "POO" ne peuvent pas être utilisés pour créer un système d'exploitation solide?

J'ai donc 2 questions essentiellement.

  1. Pourquoi les applications écrites dans des langages de bas niveau sont-elles plus efficaces que leurs homologues HLL? Les langages de bas niveau fonctionnent-ils mieux pour la simple raison qu'ils sont de bas niveau et sont plus facilement traduits en code machine?
  2. Pourquoi n'avons-nous pas un système d'exploitation à part entière entièrement basé sur un langage de haut niveau?
44
rtindru

Microsoft a fait des recherches très intéressantes dans ce sens, si vous examinez la singularité:

http://research.Microsoft.com/en-us/projects/singularity/

En outre, Mothy Roscoe et al ont travaillé sur Barrelfish qui utilise le langage de programmation de contraintes Eclipse en tant que service de système d'exploitation pour résoudre toutes sortes de problèmes de gestion du système d'exploitation et d'allocation des ressources:

http://www.barrelfish.org/

38
Rafe

Cela dépend beaucoup de l'endroit où vous placez la division entre les langues de bas niveau et de haut niveau. Par exemple, différentes personnes ont tendance à mettre un langage comme C++ de différents côtés de cette fracture.

Concernant vos questions:

  1. Je ne crois pas qu'il y ait une telle différence entre les langues de bas niveau et de haut niveau, mais plutôt une différence entre les langues interprétées et les langues qui se compilent en instructions natives.

    Mais il peut également y avoir une différence de culture entre les programmeurs, où ceux qui utilisent un langage de bas niveau se concentrent davantage sur les aspects de performance des choix (de conception) qu'ils font.

  2. Si vous considérez C++ comme étant de haut niveau, alors il y a au moins un OS écrit entièrement dans un langage de haut niveau (Symbian OS est écrit en C++). Ce qui vous empêche d'écrire un système d'exploitation dans la plupart des langues de haut niveau sont deux choses:

    • Un système d'exploitation a besoin d'un accès de bas niveau à la mémoire et au matériel et leur exécute des astuces. Ce type d'accès est généralement considéré comme dangereux pour les programmes de niveau application, donc de nombreuses langues de haut niveau ne le permettent pas.
    • Un système d'exploitation doit s'exécuter sans logiciel de support, comme des interprètes. Cela rend extrêmement difficile l'écriture d'un système d'exploitation dans une langue qui ne peut pas être facilement compilée dans des instructions natives.
38

Il y a plusieurs bonnes raisons à cela.

La langue de bas niveau d'aujourd'hui était la langue de haut niveau d'hier

Oui, croyez-le ou non, il était une fois même C était considéré comme un langage de haut niveau. Il y a environ 20 ans, il était assez courant de le voir décrit comme un langage de "niveau intermédiaire". C'était avant OO était aussi populaire qu'aujourd'hui, Java n'existait pas, C # n'existait pas, même C++ n'était pas correctement encore normalisé.

Inertie historique

Les systèmes d'exploitation que vous utilisez aujourd'hui ont des racines profondes et profondes dans l'histoire. Windows remonte au début/milieu des années 80, Unix remonte au début/milieu des années 70. Il y a BEAUCOUP d'ancien code de travail dans les systèmes d'exploitation, et vous ne voulez généralement pas réécrire l'ancien code de travail.

À un moment donné, vous devez descendre vers le matériel

Cela se produit dans le noyau, cela se produit dans les pilotes, cela se produit dans les sous-systèmes de gestion de la mémoire, cela se produit dans le système de fichiers. Bien sûr, vous pouvez superposer une langue de haut niveau, mais vous devez toujours pouvoir accéder plus directement au matériel offert par une langue de niveau inférieur.

Portabilité

Je ne parle pas de portabilité vers un matériel différent ou un système d'exploitation différent comme cela est plus communément compris aujourd'hui; c'est plus subtil. Il y a un avantage majeur à fournir une interface basée sur C pour quelque chose, et c'est le fait que pratiquement tous les autres langages qui existent peuvent être liés à C. Même l'API Windows est toujours une API basée sur C de nos jours pour cette raison.

Préférence personnelle

Certaines personnes préfèrent simplement programmer de cette façon, et cela peut être un facteur majeur. Par exemple, Linus Torvalds a un fameux coup de gueule contre C++ ce qui montre assez clairement qu'en ce qui le concerne, C sera toujours son outil de choix pour ce genre de travail (le contenu du coup de gueule et que vous soyez ou non d'accord avec cela n'est pas pertinent pour cette discussion; le fait que la diatribe existe suffit).

Pris ensemble, ceux-ci devraient clairement établir pourquoi un système d'exploitation a été écrit à l'origine dans quelque chose comme C dans le passé, et pourquoi des morceaux très importants - même aujourd'hui - le restent.

15
Maximus Minimus

Une des principales raisons de la domination de C pour les systèmes d'exploitation réside dans l'histoire - les systèmes d'exploitation courants comme Windows et toutes les formes d'Unix (BSD, Solaris, HP-UX, MacOS X, ... ainsi que des clones comme Linux) remontent longtemps, avant OO et d'autres constructions "de haut niveau" sont devenues courantes.

Pour le cœur du système d'exploitation, outre les performances, il est nécessaire de définir les instructions matérielles de manière très précise et il faut un contrôle total sur la mémoire, ce que les langues comme C font très bien.

Pour les systèmes embarqués, il existe parfois des systèmes d'exploitation utilisant des langages de niveau supérieur pour de plus grandes parties du système. Un exemple notable est JavaOS par Sun.

Pour les systèmes d'exploitation répandus, un exemple notable n'utilisant pas C est également le MacOS classique avant MacOS X - qui était en grande partie écrit en dialecte de Pascal qui permettait une certaine forme d'orientation d'objet.

13
johannes

Tout d'abord, il y a des problèmes de bootstrap. La plupart des fonctionnalités qui facilitent les langages de haut niveau sont basées sur des abstractions qu'un noyau doit se fournir. Comment écrivez-vous un gestionnaire de mémoire dans un langage qui nécessite un gestionnaire de mémoire? Comment écrire des pilotes d'E/S sans utiliser les bibliothèques standard Nice I/O de votre langue? Comment créer des primitives de threading et de synchronisation sans utiliser les bibliothèques du langage?

Deuxièmement, il est extrêmement utile et beaucoup plus lisible lors de l'écriture de systèmes d'exploitation pour pouvoir affecter une variable à un emplacement mémoire spécifique. C'est facile en C, et chaque programmeur C sait comment le faire. Si c'est même possible dans les langues de niveau supérieur, c'est tellement rare que seuls les gourous savent le faire.

En d'autres termes, lorsque vous tenez compte de toutes les limitations et modifications que vous devez accepter, C et C++ commencent à paraître beaucoup plus faciles.

12
Karl Bielefeldt

Tout d'abord, le bootstrapping nécessite au moins une petite partie à écrire en Assembly ou équivalent.

Deuxièmement, il y avait un OS écrit dans un HLL incontestable - LISP Machine . (Le fait qu'il ait échoué sur le plan commercial avait plus à voir avec le fait que d'autres matériels deviennent moins chers plus rapidement et le triomphe de Pire est mieux qu'avec des lacunes de sa philosophie ou de sa conception).

Troisièmement, C++ est assez orienté objet et de haut niveau, donc, comme d'autres l'ont souligné, Symbian OS est un autre exemple.

Quatrièmement, il n'y a guère besoin de nouveaux systèmes d'exploitation pour le moment. Nous avons déjà pas mal de versions Linux et BSD qui fonctionnent sur à peu près n'importe quel matériel, et créer un tout nouveau système d'exploitation à partir de zéro est assez cher.

6
sds

Pour mieux mettre en phase ce que j'ai écrit précédemment.

Les machines Burroughs 5xxx - 6xxx n'avaient pas de langage d'assemblage. La langue la plus basse disponible était une extension d'ALGOL. L'ALGOL a été implémenté dans le matériel. L'OS et toutes les langues ont été écrits en ALGOL. Il a surpassé toutes les machines concurrentes de l'époque. Il nécessitait également beaucoup moins de code, ce qui le rendait beaucoup plus facile à maintenir. Il avait un matériel de pile qui supportait un langage récursif tel qu'un ALGOL.

Le système d'exploitation Burroughs est devenu une version appelée MCP. MCP fonctionne actuellement sur les systèmes Unisys.

4
donleslie

La plupart des langues de niveau supérieur que vous mentionnez ont une fonctionnalité qui ne correspond pas bien aux systèmes d'exploitation: la gestion automatique de la mémoire. Vous ne pouvez pas compter sur un garbage collector lors de l'écriture d'un système en temps réel - soit doux (ce qui est un système d'exploitation) ou pire encore. Pour citer Tanenbaum [i]:

Certaines choses que C n'a pas incluent les chaînes intégrées, les threads, les packages, les classes, les objets, la sécurité des types et la récupération de place. Le dernier est un bouchon d'exposition pour les systèmes d'exploitation. Tout le stockage en C est statique ou explicitement alloué et libéré par le programmeur, généralement avec la fonction de bibliothèque malloc et gratuit . C'est cette dernière propriété - le contrôle total du programmeur sur la mémoire - avec des pointeurs explicites qui rend C attrayant pour l'écriture de systèmes d'exploitation. Les systèmes d'exploitation sont essentiellement des systèmes en temps réel dans une certaine mesure, même des systèmes à usage général. Lorsqu'une interruption se produit, le système d'exploitation peut ne disposer que de quelques microsecondes pour effectuer une action ou perdre des informations critiques. Il est intolérable de faire démarrer la collecte des ordures à un moment arbitraire.

Maintenant, vous pourriez faire valoir que C++ est également un bon candidat car il offre une gestion manuelle de la mémoire. C++ a déjà été utilisé dans certains systèmes d'exploitation tels que Symbian (mentionné par Bart ) et BeOS. Mais IMHO C est toujours le langage le plus rapide qui peut être porté dans de nombreuses architectures sans effort énorme (contrairement à l'assemblage d'une architecture spécifique).

[i]: Modern Operating Systems 3rd edition, page 73

3
sakisk

Comme d'autres l'ont souligné, plusieurs systèmes d'exploitation ont été écrits dans des langages de haut niveau. Peut-être que ce que vous voulez dire, c'est que tous les systèmes d'exploitation à succès, grand public et à usage général ont été écrits dans une combinaison d'assemblage, de C et de C++?

La plupart des langues de haut niveau ont des tonnes de fonctionnalités utiles qui entraînent un coût de performance associé. La gestion automatisée de la mémoire en est un exemple évident, la vérification des limites des tableaux en est un autre. Si vous écrivez un système d'exploitation à usage général, vous risquez de rencontrer des situations où la pénalité de performance de ces fonctionnalités utiles est supérieure à ce que vous êtes prêt à payer. À ce stade, vous souhaitez pouvoir les désactiver. Des langages tels que Python, C # et Java varient selon les fonctionnalités que vous pouvez désactiver, mais aucun n'est aussi polyvalent que C ou C++ à cet égard.

Dans cet aspect, le C et le C++ sont presque aussi polyvalents que le pur assemblage. Si vous décidez que vous avez besoin de dix gestionnaires de mémoire différents couvrant dix scénarios d'allocation de mémoire différents, vous pouvez tous les implémenter en C et C++, et les charger et décharger comme bon vous semble. Heck, vous n'avez même pas à vous lier aux bibliothèques d'exécution C standard ou au code de démarrage si vous ne le souhaitez pas.

2
Charles E. Grant

La vraie réponse est Argent . Il n'y a pas suffisamment d'avantages perçus d'un système d'exploitation de langage de haut niveau pour justifier de dépenser les ressources pour en créer un , puis le pousser dans le courant dominant. Il y a un coût énorme impliqué dans la construction d'un nouveau pilote pour chaque pièce de matériel qu'il doit prendre en charge, par exemple.

Il existe différents systèmes d'exploitation écrits dans des langages de haut niveau, dans le but principal de la recherche, tels que Oberon et Singularity .

0
Peter