Comment les programmeurs gèrent-ils le développement de logiciels de bas niveau dans des langages de haut niveau?

20

Je suis un peu nouveau dans la programmation et la meilleure façon de poser cette question est avec un exemple.

Je sais comment faire des choses basiques en Java et C #. Des choses comme une petite application Windows Forms ou faire une classe générique. J'ai essentiellement appris et je n'ai encore rien fait de grand. Quoi qu'il en soit, j'ai toujours été curieux de savoir comment les choses se font "sous le capot", je suppose que vous pourriez dire.

Je sais que tout se résume à 1 et à 0 et que les langages d'assemblage donnent essentiellement des commandes aux modèles de 1 et de 0, mais il semble qu'il y ait ce saut à partir de là: utiliser une bibliothèque pour cela une bibliothèque pour cela. Il me semble que tout ce que C # peut faire sans bibliothèque est une logique arithmétique et binaire. Pour obtenir des entrées ou des sorties, vous utilisez des bibliothèques, etc ...

Je sais que cette question semble probablement évidente pour certains et je sais que j'ai beaucoup à apprendre, mais je ne sais même pas par où commencer avec une question comme celle-ci. Je vous remercie.

Voici donc ma question:

Si quelqu'un devait créer une machine virtuelle ou un émulateur Playstation, ou un système d'exploitation, ou un pilote, ou ajouter un support mp3 à un lecteur multimédia, ou créer votre propre type de fichier, etc ... Comment? Je ne vois pas comment cela se ferait avec C # ou Java.

En d'autres termes, si je lis un livre comme Professional C # de WROX ou Programming C # de OReilly, saurais-je faire ces choses? Ou devez-vous apprendre le langage d'assemblage ou quelque chose de plus bas niveau comme C ++?

fender1901
la source
7
Une astuce pour comprendre ce qui se passe «sous le capot» consiste à se concentrer et à utiliser des paragraphes pour faciliter la lecture et la compréhension. Veuillez modifier cette question pour qu'elle soit plus facile à lire.
S.Lott
1
Compte tenu de votre intérêt, vous voudrez peut-être prendre une copie du code de Charles Petzold: Le langage caché du matériel informatique et des logiciels. C'est une bonne lecture. amazon.com/Code-Language-Computer-Hardware-Software/dp/…
DKnight
@ S.Lott À la rescousse :-)
Martin Wickman
@Martin Wickman: Bien que le travail soit très agréable, at-il aidé @ fender1901 à modifier ou à se concentrer?
S.Lott
1
@Martin Wickman: Annuler les modifications n'est pas la question. Encourager les autres à apprendre en faisant est mon point. Vous le savez clairement déjà. @ fender1901 a besoin d'apprendre en faisant. Ma question est la suivante: "cela at-il aidé @ fender1901 à modifier ou à se concentrer?" Qu'est-ce que tu penses?
S.Lott

Réponses:

9

Question interessante! Vous constaterez que des langages comme Java et C # supportent en fait une programmation de niveau assez bas. Par exemple, regardez une partie du code source d'E / S dans OpenJDK pour Java. Vous verrez que les méthodes de niveau supérieur sont implémentées avec des technologies de socket de niveau inférieur, des tableaux d'octets et un twiddling de bits.

En ce qui concerne C # et Java, ces langages se compilent en bytecode, qui est exécuté sur une machine virtuelle. Vous pouvez en fait visualiser et apprendre très facilement du bytecode (par exemple, voir comment Java traite la concaténation des objets String).

Si l'environnement dans lequel vous développez n'héberge pas l'une de ces machines virtuelles de niveau supérieur (souvent en raison de besoins d'espace et de performances), vous devez utiliser un langage de «niveau inférieur».

Je crois que C / C ++ gouverne toujours le perchoir dans le domaine de l'écriture de pilotes de bas niveau, etc., car vous pouvez modifier la gestion de la mémoire et les structures de données au nième degré.

L'assemblage est assez spécialisé ces jours-ci, il est bon de suivre au moins un cours rapide pour apprécier ce qui se passe à ce niveau. Lorsque vous écrivez un assemblage pour remplir un registre en cours de vidage, vous commencez à apprécier le type de longueur à laquelle chaque couche de langage de programmation doit aller.

HTH

Martijn Verburg
la source
Pouvez-vous réellement programmer avec les langages intermédiaires ou sont-ils juste là pour examiner?
fender1901
Demandez-vous si vous pouvez écrire du code source «bytecode»?
Martijn Verburg
Je pense. Je me demande si vous pouvez simplement commencer à coder en utilisant le bytecode ou il comme vous le feriez avec java ou c #?
fender1901
Java ou C #, très peu de gens sont en train de manipuler le bytecode, mais un plus grand nombre de personnes regardent le code d'octet de leur code de niveau supérieur
Martijn Verburg
4

La plupart des programmes de «bas niveau» reviennent à interfacer directement avec le système d'exploitation. La raison pour laquelle il ne vous semble pas qu'il existe une manière "évidente" de le faire est que, de manière générale, les langages de niveau supérieur comme Java visent la facilité d'utilisation et la portabilité. Le code qui s'interface directement avec le système d'exploitation est généralement beaucoup moins portable que le code de niveau supérieur, sauf s'il est enveloppé dans une abstraction.

Dans les langages de niveau inférieur comme C et C ++, l'API du système d'exploitation est directement accessible (principalement en raison du fait que la plupart des systèmes d'exploitation sont écrits en C, ils exposent donc une API via le langage C). Par exemple, en C sur un système UNIX, vous pouvez appeler la ioctlfonction pour interfacer directement avec un périphérique.

Bien sûr, les langages de niveau supérieur comme Java et C # doivent également communiquer avec le système d'exploitation. Chaque fois que vous ouvrez un fichier ou lisez à partir d'une prise réseau, vous vous connectez avec le système d'exploitation. C'est juste que Java et C # enveloppent les appels système de bas niveau du système d'exploitation dans des abstractions de niveau supérieur, comme un Socketobjet. Cette approche de niveau supérieur a l'avantage que le même code Java fonctionnera sur différentes plates-formes. Alors que la façon dont vous ouvririez un socket en C sous UNIX est très différente de la façon dont vous le feriez sous Windows.

En général, plus le langage est de niveau supérieur, moins vous aurez de contrôle sur la façon dont votre programme s'interface avec le système d'exploitation. Cela dit, beaucoup de choses que vous mentionnez sont possibles dans une langue de niveau supérieur. Par exemple, il n'y a aucune raison pour laquelle vous ne pouvez pas écrire une machine virtuelle en Java ou en C #.

Charles Salvia
la source
2

La bonne nouvelle est que cela peut être fait avec Java ou C #. Le seul problème que vous devez savoir est de savoir comment . Fondamentalement, vous devez connaître ces jolies petites choses sur l'architecture matérielle (pas un PC nécessaire, mais Playstation si c'est ce que vous voulez émuler). Et je crains que vous ne deviez approfondir, comme l'assembleur et le langage machine.
Toutes les ALU, les registres, les MMU et tout le reste peuvent être extraits et émulés avec un langage de haut niveau. Vous pouvez même appeler des fonctions de bas niveau pour obtenir une prise en charge matérielle (en savoir plus sur PInvoke et JNA par exemple).

Cependant, puisque vous êtes débutant, je ne recommanderais pas de commencer avec une tâche aussi énorme. Je suggérerais que vous appreniez le C / C ++, un peu sur Linux (ou tout autre OS de type Unix, c'est-à-dire FreeBSD), l'architecture informatique, puis l'assembleur ... Cela pourrait prendre quelques années, alors ...
Ce dont vous avez vraiment besoin est motivation et patience.

Paweł Dyda
la source
2

Ce que j'ai fait ce qui a appris un langage de haut niveau (Java) s'est ensuite intéressé, comme vous, aux langages et au matériel de bas niveau. Dans son état le plus primitif, un ordinateur est l'électronique. Les 1 et les 0 ne sont que des chiffres pour les charges électriques (marche et arrêt). Une fois que j'ai commencé à comprendre la logique derrière les processeurs et ce qui se trouve à l'intérieur d'une unité logique arithmétique, les choses se sont vraiment mises en place.
Je pense que tu devrais commencer tes étudesavec des choses comme la logique booléenne (AND, OR, XOR, etc.), puis commencez à concevoir de petites ALU et à regarder comment la mémoire et les registres jouent dans les choses. Après cela, apprenez un langage d'assemblage, puis vous comprendrez comment fonctionne une compilation. Bientôt, les langues de haut niveau sembleront ennuyeuses! :) Je rigole. C'est magnifique de voir comment tout se met en place et ça devrait être agréable d'apprendre. Une fois que vous commencez à suivre le chemin de la curiosité, vous reprendrez les choses en un rien de temps.

Trevor Arjeski
la source
2

Bien que vous puissiez faire des choses de bas niveau avec C # ou Java (ou la plupart des autres langages), la plupart des gens ne le font pas. Par conséquent, tout livre raisonnablement populaire que vous prenez sur l'un ou l'autre laissera de côté les trucs de bas niveau. Ils couvriront probablement les fonctionnalités linguistiques dont vous auriez besoin, mais ne les appliquent pas comme vous le souhaitez. De même, les livres sur les trucs de bas niveau seront probablement en C, avec peut-être un peu de langage d'assemblage.

Apprendre le C lui-même ne sera pas difficile pour un programmeur C #, à part la manipulation du pointeur, bien que l'apprentissage des choses prendra plus de temps. Étant donné que C est un langage moins expressif que C #, certaines choses que vous savez faire efficacement en C # devront être faites d'une manière très différente, et souvent plus maladroite, en C.

Ce que vous devriez rechercher ensuite, ce sont des livres sur les trucs de niveau inférieur que vous voulez apprendre. Il y a des livres sur le noyau Linux, par exemple, mais la programmation au niveau du noyau va être difficile à saisir sans quelques antécédents, donc vous voudrez peut-être d'abord étudier les principes fondamentaux du système d'exploitation.

David Thornley
la source
Je pense que mon plus gros problème en ce moment est que beaucoup de ces sujets vont être difficiles à saisir parce que je n'ai pas de contexte. J'ai besoin, je suppose, d'un pont dans ces domaines.
fender1901
@ fender1901: Cela pourrait être un problème. Le noyau Linux fait certaines choses qui sembleraient vraiment étranges à quelqu'un qui ne comprend pas ce que font les systèmes d'exploitation. L'émulateur, parmi les choses que vous avez mentionnées, serait probablement le plus facile à comprendre, et il existe de simples émulateurs, souvent pour les premiers micro-ordinateurs.
David Thornley
1

Vous devez savoir, qu'il est possible de faire la fonction de bas niveau avec la plate-forme / langue utilisée ou non:

  • stocker un octet dans une variable,
  • lecture / écriture de fichiers par octets,
  • mise en place d'un tableau d'octets, accès aux éléments,
  • utiliser de véritables fonctionnalités procédurales, POO,
  • accéder à l'écran, au clavier, aux prises.

Hm, sonne que le choix d'une langue doit être aléatoire.

ern0
la source
-2

La question a plusieurs réponses: 1. Java et C # sont des langages de haut niveau, ils sont développés pour le développement d'applications sur un système d'exploitation existant qui gère la mémoire (cela permet également de réaliser des programmes hybrides pouvant s'exécuter sur différents systèmes). 2. Les domaines où une programmation de bas niveau est nécessaire sont le développement de système d'exploitation, le développement de pilotes, le développement de jeux AAA, etc.

Avec seulement ces deux points, nous pouvons dire que la programmation de bas niveau se fait séparément et qu'il n'y a pas besoin de programmation de bas niveau dans la programmation de haut niveau. Les parties nécessitant une programmation faible comme les E / S sont exécutées par l'interpréteur qui est lui-même écrit dans un langage de bas niveau (par exemple, la JVM de Java est écrite en C).

La réponse principale à votre question est que ces choses ne sont pas développées en utilisant Java et C # ces choses sont faites en C et Assembly donc plutôt que de trouver des moyens de le faire en Java et C # vous devriez apprendre l'apprentissage de C et Assembly car ce sont les plus grands dudes de la programmation et oui le gros avantage est que le programme écrit en bas niveau est petit et rapide.

mur2501
la source
cela ne semble pas offrir quoi que ce soit de substantiel par rapport aux points soulevés et expliqués dans les 6 réponses précédentes qui ont été publiées il y a quelques années
gnat