"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comprendre les runtimes : du C aux langages modernes

Comprendre les runtimes : du C aux langages modernes

Publié le 2024-11-08
Parcourir:568

Understanding Runtimes: From C to Modern Languages

À l'ère du développement et de la programmation de logiciels modernes, le terme « runtime » peut signifier différentes choses selon le contexte et le langage discuté. Je suis ici pour clarifier ces différences, en me concentrant sur le fonctionnement des environnements d'exécution en C par rapport aux langages plus modernes comme Java ou Python. J'ai l'intention de garder cet article destiné aux programmeurs débutants, j'éviterai donc de me plonger dans des concepts complexes.

Qu'est-ce qu'un environnement d'exécution ?

À la base, un runtime est un programme lui-même qui lit et exécute du code écrit par un développeur. Mais cela devient déroutant lorsque certains développeurs utilisent le runtime avec le langage C.

Durées d'exécution en langage moderne

Dans des langages comme Java ou Python, le runtime est un programme lui-même qui lit votre fichier myfile.js, c'est pourquoi vous exécutez des programmes nodejs comme : node myfile.js et le moteur v8 (est le moteur JavaScript, il analyse et exécute JavaScript code.) gère tout, que vous créiez un nouveau fichier, démarriez un processus enfant, etc. et surtout, vous ne pouvez rien faire que la v8 ne vous permet pas de faire.
Mais lorsque vous exécutez un programme c, vous ne faites pas c myfile.c, vous n'avez qu'à le compiler une fois et maintenant vous n'avez plus besoin de gcc, exécutez-le directement.

Le "Runtime" C

En C, il n'existe pas de programme distinct s'exécutant parallèlement à votre code de la même manière qu'en Java ou Python. Au lieu de cela, ce qu'on appelle souvent le "runtime" C est en fait un ensemble de code inséré statiquement et d'instructions ajoutées lors de la compilation. Il s'agit d'un ensemble minimal d'instructions incluses dans le binaire final pour gérer certaines tâches nécessaires au niveau CPU/OS. Il gère la création et le démontage du cadre de pile pour les appels de fonction (en utilisant des instructions telles que PUSH, POP, CALL, RET dans l'assembly). Même cela peut être remplacé en fournissant votre propre fonction __start à l'aide de l'assembly en ligne, donnant ainsi aux développeurs un contrôle total sur le point d'entrée et l'initialisation du programme.


void __start() {
// Custom entry point, no standard library initialization
// You have no access to argc and argv here unless you access them manually from registers
// you can create you own custom stack setup, initialization and etc here.

// Exit directly using a syscall
asm("mov $60, %rax; mov $0, %rdi; syscall"); // exit(0) syscall
}


Cela ne ressemble pas du tout à du runtime, c'est juste du code en langage Assembly ajouté par le compilateur afin que les développeurs n'aient pas à le faire.

Le pouvoir et la responsabilité de C

En C, vous pouvez appeler des appels système directement à l'aide de l'assembly en ligne pour interagir avec le noyau d'une manière généralement non autorisée par le système d'exploitation, c'est ainsi que les malwares sont créés. L'assemblage en ligne permet aux développeurs d'écrire des instructions en langage assembleur dans le code C. Ceci est souvent utilisé pour le code critique en termes de performances ou pour accéder à des fonctionnalités matérielles spécifiques.

Assemblage en ligne en C

  • L'assemblage en ligne permet aux développeurs d'écrire des instructions en langage assembleur dans le code C. Ceci est souvent utilisé pour le code critique en termes de performances ou pour accéder à des fonctionnalités matérielles spécifiques.
  • Il fournit un moyen d'exécuter directement les instructions du processeur.

Interaction directe avec le noyau

  • en utilisant l'assemblage en ligne, un programmeur peut appeler des appels système directement sans passer par des bibliothèques de niveau supérieur.
  • Par exemple, nous pouvons utiliser l'assembleur en ligne pour configurer des registres avec les paramètres appropriés pour un appel système, puis le déclencher.
  • Étant donné que l'assemblage en ligne permet un contrôle de bas niveau sur les ressources système, il peut être utilisé pour contourner les mécanismes de sécurité ou manipuler directement le noyau. C'est ainsi que les logiciels malveillants peuvent effectuer des actions non autorisées, telles que l'accès à la mémoire protégée, l'interception d'appels système ou la manipulation de processus et de leur mémoire.
  • Les logiciels malveillants peuvent exploiter les vulnérabilités du système d'exploitation ou utiliser ces interactions de bas niveau pour effectuer des tâches telles que l'enregistrement de frappe, l'élévation de privilèges ou des opérations furtives.

Sous Linux, C a un FLAG qui vous permet d'écrire directement des données de fichier sur un périphérique de stockage, en contournant certains des mécanismes de mise en cache du noyau, appelé indicateur O_DIRECT qui est utilisé en combinaison avec les appels système d'ouverture et d'écriture. Cet indicateur garantit que les données ne sont pas mises en mémoire tampon dans la RAM ou gérées par le noyau dans l'espace du noyau. Cela écrit directement les données sur le disque dur, la JVM ne vous le permettra pas, et ce n'est qu'un exemple simple.
voici un exemple simple :


asm volatile (
"syscall"
: "=a" (written)
: "0" (1),
"D" (fd),
"S" (buffer),
"d" (BLOCK_SIZE)
: "rcx", "r11", "memory"
);


*Remarque : * (écrit) est une variable créée dans main(), (1) est le numéro d'appel système pour l'écriture, (fd) est l'endroit où le fichier sera écrit, c'est-à-dire int fs = open("path .log",O_WRONLY; (BLOCK_SIZE) est un autre nom de variable. C'est plus complexe que cela.

L'évolution des temps d'exécution

Il est important de comprendre que le concept de runtime a évolué au fil des années. Le « runtime » C des années 70 est très différent des environnements d’exécution robustes que nous voyons dans les langages des années 2000. Cette évolution peut prêter à confusion lors des discussions sur les runtimes, en particulier entre développeurs familiers avec différentes époques de programmation.

Conclusion

Je pense que les gens comparent maintenant le temps d'exécution des années 1970 avec celui des années 2000, ce qui confond les nouveaux développeurs avec les anciens développeurs.
Résoudre un problème spécifique est la tâche principale de tout langage de programmation. Vous ne voulez pas écrire un framework complet pour créer des API en C, nous avons nodejs et il est bon dans ce domaine et vous n'avez pas besoin d'écrire du code bare metal en javascript car nous j'ai déjà C et c'est fabuleux. Pourquoi réinventer la roue, utilisons les roues et créons une voiture fabuleuse, sauf si vous ne voulez pas la conduire sur Mars.

Déclaration de sortie Cet article est reproduit à l'adresse : https://dev.to/bossysmaxx/understanding-runtimes-from-c-to-modern-linguals-3fkj?1 ​​​​​​En cas de violation, veuillez contacter [email protected] pour supprimer il
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3