1
votes

Pourquoi le Runtime a-t-il été introduit?

Avec les langages de très bas niveau comme Assembly, il n'y a pas de runtime, mais avec tout ce qui est en fait fréquemment utilisé comme Rust, C, C ++, C #, Java, Kotlin, Swift, etc., il y a un runtime qui va avec le langage. Pourquoi tout n'est-il pas fait au moment de la compilation avec ces langages? Est-ce simplement parce que ce serait plus difficile à faire que d'utiliser un runtime ou y a-t-il un avantage réel à avoir un runtime?


2 commentaires

Définissez «runtime». Il existe un système d'exécution associé à tous les langages ci-dessus assembler, car tous les langages ont besoin d'une bibliothèque pour effectuer des E / S, à part tout ce que le langage peut offrir en termes d'API. Certains langages ont interprété des implémentations où le système d'exécution comprend un interpréteur. Sur quoi porte votre question?


C fait tout au moment de la compilation, sauf pour exécuter réellement le programme et appeler les fonctions de la bibliothèque, que certaines implémentations en C appellent la "C Runtime Library". Êtes-vous confondu entre les machines virtuelles JIT et les liens dynamiques vers des bibliothèques de code machine compilées à l'avance?


3 Réponses :


2
votes

Eh bien, non il n'y a pas de 'runtime' avec C ou C ++ car ce sont des langages entièrement compilés. D'autres langages sont interprétés - essentiellement le runtime comme vous l'appelez est comme un super microcode dans le processeur qui interprète les instructions en Java, PHP, BASIC, ou autre, et les traduit en code machine au moment de l'exécution .

Quant à savoir pourquoi cela est fait - eh bien, pour accélérer le développement de code, je suppose. Je ne suis pas sûr que ce soit autant un facteur aujourd'hui qu'il l'était à l'époque d'un z80 à 4 MHz !!!

J'espère que d'autres personnes ajouteront des commentaires car c'est en fait une question intéressante


2 commentaires

Il existe une bibliothèque d'exécution C, et une bibliothèque d'exécution C ++, et une bibliothèque d'exécution Fortran, et un très grand système d'exécution Cobol, ...


Il n'est pas clair (pour moi) que la bibliothèque d'exécution soit sur quoi portait la question d'origine.



1
votes

Un langage de programmation est une spécification , donc un document écrit. Pour C11, lisez la norme n1570 . Pour Scheme, lisez R5RS .

Un langage de programmation peut avoir plusieurs implémentations. Pour C sous Linux, voir GCC , Clang , TinyCC , nwcc etc .... Il dispose de plusieurs bibliothèques d'exécution C ( GNU glibc , musl-libc , etc. ).

Toutes les implémentations n'ont pas de bibliothèque d'exécution, car certaines implémentations de langage sont de purs interpréteurs. Par exemple, GNU Guile (ayant en fait un bytecode pour Scheme).

Lisez le Dragon book pour en savoir plus.

Étudiez le code source de plusieurs implémentations, par exemple SBCL pour Common Lisp . Ou GNU Guile ou Bigloo ou Poulet / Scheme pour Scheme.

Faites attention aux programmes Quine .


0 commentaires

1
votes

La bibliothèque d'exécution signifie: le code que le compilateur ajoute à votre programme. En règle générale, il s'adapte entre le fonctionnement du système d'exploitation et la manière dont le langage souhaite que le système d'exploitation fonctionne.

Les personnes écrivant C aimeraient écrire int fd = open ("/ dev / null", O_RDWR); pour ouvrir un fichier. Ils n'aimeraient pas écrire int fd; asm volatile ("int 0x80": "= a" (& fd): "a" (1), "b" ("/ dev / null"), "c" (2)); . Le runtime inclut donc une fonction appelée open qui contient ce code d'assemblage.

Il serait possible pour le compilateur de convertir directement l'appel de fonction open en une instruction int 0x80 - auquel cas il ne le ferait pas être un moteur d'exécution - mais les rédacteurs du compilateur préfèrent le définir comme une fonction normale qui ne génère pas d'instructions spéciales lorsque vous l'appelez.


3 commentaires

Oui, mais contrairement à Java, la bibliothèque d'exécution C est entièrement compilée à l'avance en code machine. Je pense que l'OP est confus en utilisant le même mot ("runtime") dans la description des bibliothèques C par rapport à la description des environnements VM comme .NET et Java. Je pense qu'il serait bon de souligner explicitement ce fait. De plus, un autre bon exemple serait que open () n'est portable que sur les systèmes POSIX; C stdio fopen () doit être implémenté par-dessus tous les appels système de bas niveau fournis par le système d'exploitation.


@PeterCordes La bibliothèque standard C compte toujours comme "un runtime". C'est juste beaucoup plus petit que celui de Java.


La question demande "Pourquoi tout n'est-il pas fait au moment de la compilation avec ces langages?" - tout est fait au moment de la compilation en C et C ++. J'ai déjà commenté la question pour peut-être dissiper cette confusion, mais j'espérais que si quelqu'un allait répondre, il combinerait ce point avec des détails sur ce que fait une bibliothèque C. Bien que IDK si cela vaut plus d'efforts à ce stade. Je n'ai pas l'intention d'y répondre moi-même.