212 votes

Comment une langue se développe-t-elle?

Je suis en train d'apprendre le C++, et j'ai juste commencé à apprendre à propos de certains de Qt's les capacités de code de programme avec une interface graphique. Je me suis posé la question suivante:

Comment est-ce que C++, qui, auparavant, n'avait pas de syntaxe capable de demander à l'OS d'une fenêtre ou d'un moyen de communiquer à travers les réseaux (avec des Api qui je ne comprends pas complètement non plus, j'avoue) soudain obtenir de telles capacités, par le biais des bibliothèques écrites en C++? Tout cela semble terriblement circulaire pour moi. Ce que le C++ instructions pourriez-vous éventuellement venir dans les bibliothèques?

Je me rends compte que cette question peut sembler trivial à une expérience de développeur de logiciel, mais j'ai fait des recherches pendant des heures sans trouver de réponse directe. Il est arrivé au point où je ne peux pas suivre le tutoriel sur Qt parce que l'existence de bibliothèques est incompréhensible pour moi.

198voto

Joachim Pileborg Points 121221

Un ordinateur est comme un oignon, il a beaucoup de plusieurs couches, à partir de la graine de pure matériel pour l'extérieur de la couche application. Chaque couche expose certaines parties de lui-même à la prochaine couche externe, de sorte que la couche externe est possible d'utiliser certains des couches internes de la fonctionnalité.

Dans le cas, par exemple, de Windows le système d'exploitation expose le soi-disant WIN32 API pour les applications s'exécutant sur Windows. La bibliothèque Qt utilise cette API pour fournir des applications à l'aide de Qt pour sa propre API. Vous l'utilisation de Qt, Qt utilise WIN32, WIN32 utilise les niveaux inférieurs du système d'exploitation Windows, et ainsi de suite jusqu'à ce que des signaux électriques dans le matériel.

62voto

hvd Points 42125

Vous avez raison, en général, les bibliothèques ne peuvent pas faire quelque chose de possible qui n'est pas encore possible.

Mais les bibliothèques n'ont pas à être écrit en C++ afin d'être utilisable par un programme C++. Même si elles sont écrites en C++, il peut, en interne, utiliser d'autres bibliothèques écrites en C++. Donc, le fait que le C++ n'a pas de moyen de le faire ne signifie pas l'empêcher d'être ajoutée, tant qu'il y a quelque moyen de le faire à l'extérieur de C++.

À un très faible niveau, certaines fonctions appelées par le C++ (ou C) sera écrite dans le montage et l'assemblage contient les instructions requises pour faire ce que n'est pas possible (ou n'est pas facile) en C++, par exemple pour appeler une fonction du système. À ce point, que le système d'appel peut faire quelque chose de votre ordinateur est capable de faire, tout simplement parce que il n'y a rien de l'arrêter.

43voto

doron Points 10296

Le C et le C++ ont 2 propriétés qui permettent cette extensibilité que l'OP est en train de parler.

  1. Le C et le C++ peut accéder à la mémoire
  2. Le C et le C++ peut appeler du code assembleur pour des instructions pas dans le langage C ou C++.

Dans le noyau ou dans une base de non-protégés mode de plate-forme, des périphériques comme le port série ou un lecteur de disque sont mappés en mémoire carte de la même manière que la RAM est. La mémoire est une série de commutateurs et en tournant les commutateurs du périphérique vous permet de vous port série ou un lecteur de disque pour faire des choses utiles.

Dans un mode protégé du système d'exploitation, lorsque l'on veut accéder au noyau de l'espace utilisateur (dire lors de l'écriture dans le système de fichiers ou de dessiner un pixel sur l'écran), on doit effectuer un appel système. C n'a pas reçu pour instruction de faire un appel système, mais C peut appeler du code assembleur qui peuvent déclencher le bon appel système qui permet de la C code de parler au noyau.

Afin de rendre la programmation d'une plate-forme plus simple, les appels système sont enveloppés dans des fonctions plus complexes que peuvent effectuer certaines fonctions utiles au sein de son propre programme. On est libre d'appeler le système des appels directement (à l'aide de l'assembleur), mais il est probablement plus facile de simplement utiliser l'une des fonctions wrapper que la plate-forme de fournitures.

Il existe un autre niveau de l'API qui sont beaucoup plus utile qu'un appel système. Prenez l'exemple de la fonction malloc. Non seulement cet appel au système pour obtenir de grands blocs de mémoire, mais sera de gérer cette mémoire en faisant de la tenue des livres sur ce qui est de prendre place.

Win32 Api enveloppez graphique fonctionnalité avec une plate-forme commune widget. Qt prend un peu plus loin en les enveloppant Win32 (X ou Windows) de l'API dans une plate-forme de façon.

Fondamentalement, si un compilateur C active C code en code machine et étant donné que l'ordinateur est conçu pour utiliser de code machine, vous devriez vous attendre C pour être en mesure d'accomplir la part de lions ou de ce que peut faire un ordinateur. Tout ce que le wrapper bibliothèques à faire est de faire le gros du travail pour vous afin que vous n'avez pas à.

23voto

Basile Starynkevitch Points 67055

Langues (comme le C++11) sont caractéristiques, sur le papier, généralement écrits en anglais. Regardez à l'intérieur de la dernière C++11 projet (ou d'acheter la coûteuse final spec de votre ISO vendeur).

Généralement, vous utilisez un ordinateur doté d'un langage de mise en œuvre (Vous pouvez en principe exécuter un programme C++, sans ordinateur, par exemple à l'aide d'un tas d'esclaves humains de les interpréter, ce qui serait contraire à l'éthique et inefficace)

Votre C++ mise en œuvre des travaux de général au dessus d'un certain système d'exploitation et de communiquer avec elle (à l'aide de certains de la mise en œuvre spécifique de code, souvent dans un système de bibliothèque). De façon générale, que la communication est effectué par des appels système. Regardez par exemple dans les syscalls(2) pour une liste des appels système disponible sur le noyau Linux.

À partir de l'application point de vue, un syscall est une école élémentaire de la machine instruction SYSENTER sur x86-64 avec certaines conventions (ABI)

Sur mon bureau Linux, les bibliothèques Qt sont au-dessus de X11 bibliothèques client communique avec le serveur X11 Xorg thru X protocoles Windows.

Sous Linux, utilisez ldd sur votre exécutable pour voir la (longue) liste des dépendances sur les bibliothèques. Utiliser pmap sur votre processus en cours d'exécution pour voir ceux qui sont "chargés" au moment de l'exécution. BTW, sur Linux, votre application est probablement en utilisant des logiciels libres, vous pouvez étudier son code source (à partir de Qt, de la Xlib, libc, ... le noyau) pour comprendre davantage ce qui se passe

19voto

Sahuagin Points 3209

Je pense que le concept vous manque, c'est des appels système. Chaque système d'exploitation fournit une énorme quantité de ressources et de fonctionnalités que vous pouvez profiter de bas niveau du système d'exploitation. Même lorsque vous appelez régulièrement une fonction de la bibliothèque, c'est sans doute faire un appel système derrière les coulisses.

Les appels système sont d'un faible niveau de la façon de faire usage de la puissance du système d'exploitation, mais peut être complexe et difficile à utiliser, et sont donc souvent "enveloppé" dans les Api de sorte que vous n'avez pas à traiter directement avec eux. Mais en dessous, juste au sujet de tout ce qui implique la O/S liées ressources l'utilisation des appels système, y compris l'impression, la mise en réseau et de prises de courant, etc.

Dans le cas de windows, Microsoft Windows a son interface graphique écrit dans le noyau, il y a donc des appels système pour la fabrication de fenêtres, peinture, graphisme, etc. Dans d'autres systèmes d'exploitation, l'interface graphique ne peut pas être une partie du noyau, auquel cas autant que je sache, il n'y aurait pas de système d'appels de l'interface, et vous ne peut fonctionner que même à un niveau inférieur à ce que de bas niveau des graphismes et de l'entrée, les appels sont disponibles.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X