7
votes

Le logiciel C / C ++ peut-il être compilé en byTecode pour une exécution ultérieure? (ARCHITECTURE Software Unix indépendant.)


4 commentaires

Géré c ++ semble être quelque chose comme ce que vous recherchez


@Ankur: C'est le matériel de réponse. Comme cela se produit, la seule réponse que je puisse vraiment penser à l'heure actuelle (ou quelque chose devrait être caché dans les marécages de LLVM?)


Géré C ++ semble intéressant. D'ailleurs. Toute réflexion sur quel niveau LLVM IR est et que peut-on faire avec compilé LLVM Bytecode?


Vous pourriez trouver Néhévm intéressant. Boîte à outils de compilation MIPS avec une bibliothèque d'exécution personnalisée et un interpréteur / compilateur Java. Néhévm.ibex.org


6 Réponses :


4
votes

C compilé au code de bit LLVM n'est pas indépendant de la plate-forme. Consultez google Portable Native Client , ils essaient de résoudre ce problème .

Adobe a Alchemy qui vous permettra de compiler C pour clignoter.

Il y a c à Java ou même JavaScript compilateurs. Cependant, en raison de différences de gestion de la mémoire, elles ne sont pas très utilisables.


0 commentaires

2
votes

LLVM n'est pas une bonne solution pour ce problème. Aussi belle que LLVM IR est, ce n'est en aucun cas indépendante de la machine, ni celle qui était censée être. Il est très facile, et bien nécessaire dans certaines langues, de générer une liste dépendante de la cible LLVM IR: la taille de la taille de (vide *), par exemple, sera de 4 ou 8 ou peu importe lorsqu'il est compilé dans IR.

LLVM ne fait pas non plus pour fournir à l'indépendance du système d'exploitation.

Une possibilité intéressante pourrait être QEMU. Vous pouvez compiler un programme pour une architecture particulière, puis utiliser l'émulation de l'espace utilisateur QEMU pour l'exécuter sur différentes architectures. Malheureusement, cela pourrait résoudre le problème de la machine cible, mais ne résout pas le problème du système d'exploitation: l'émulation du mode utilisateur QEMU Linux ne fonctionne que sur les systèmes Linux.

JVM est probablement votre meilleur choix pour la cible et l'indépendance du système d'exploitation si vous souhaitez distribuer des binaires.


2 commentaires

Le mode utilisateur QEMU pourrait fonctionner. Il suffirait d'apporter une cartographie du système par lui-même et non seulement de les transmettre au système hôte.


C'est ce qu'il fait pour Linux. Cela pourrait également le faire pour d'autres OSES. Un gros travail, cependant.



1
votes

Le vrai problème est que C et C ++ ne sont pas des langues indépendantes de l'architecture. Vous pouvez écrire des choses qui sont raisonnablement portables en eux, mais le compilateur code essora également les aspects de la machine via votre code. Pensez à, par exemple, taille de (long). De plus, comme Richard mentionne, il n'y a pas d'indépendance du système d'exploitation. Donc, à moins que les bibliothèques que vous utilisez devaient avoir les mêmes conventions et existent sur plusieurs plates-formes, vous ne pourriez pas exécuter l'application.

Votre meilleur pari serait d'écrire votre code dans une langue plus portable ou de fournir des fichiers binaires pour les plates-formes que vous aimez.


2 commentaires

Mon agenda caché est de pouvoir courir un environnement Unix un peu virtualisé sans aller au fond de l'émulation. Il serait correct de compiler pour une architecture unique tant qu'elle peut être imitée dans Userland. Je voudrais vraiment trouver une arche et un interpréteur non so-Lowlevel et un compilateur Jit pour émourciner les fichiers binaires sur x86.


Je comprends, vous devrez simplement limiter votre choix de langue à quelque chose qui est conçu pour fonctionner sur plusieurs plates-formes ou concevoir un sous-ensemble de C / C ++ ayant le même effet.



2
votes

As Ankur mentionne, C ++ / CLI peut être une solution. Vous pouvez utiliser Mono pour l'exécuter sous Linux, tant qu'il n'a pas de bits indigènes. Mais à moins que vous n'ayez déjà une base de code, vous essayez de porter au coût minimal, il serait peut-être de l'utiliser. Si cela a du sens dans votre situation, vous devriez aller avec Java ou C #.

La plupart des gens qui vont avec C ++ le font pour des raisons de performance, mais à moins que vous ne jouiez avec des trucs de niveau très bas, vous aurez effectué le codage plus tôt dans une langue de niveau supérieur. Cela vous donne à son tour le temps d'optimiser de sorte que, au moment où vous auriez été effectué en C ++, vous aurez une version encore plus rapide dans la langue de niveau supérieur que vous choisissez d'utiliser.


0 commentaires

6
votes

Il existe plusieurs compilateurs JVM répertoriés sur Page JVM de Wikipedia . Je n'ai jamais essayé d'entre eux, mais ils sonnent comme un exercice intéressant à construire.

En raison de son association étroite avec la langue Java, la JVM effectue les contrôles d'exécution stricts mandatés par la spécification Java. Cela nécessite des compilateurs de C pour fournir leur propre "abstraction de la laxiste", par exemple produisant du code compilé qui utilise un réseau Java pour représenter la mémoire principale (les pointeurs peuvent donc être compilés aux entiers) et relier la bibliothèque C à une classe Java centralisée qui émule des appels système. La plupart ou tous les compilateurs énumérés ci-dessous utilisent une approche similaire.


4 commentaires

Si vous utilisez l'un d'entre eux, vous aurez les problèmes de GC et de mémoire / décalage de Java?


Je n'ai jamais essayé d'entre eux, mais je ne pense pas que vous le feriez. La description dit qu'ils utilisent un tableau pour représenter la mémoire principale, donc il n'y aurait pas de collecte des ordures. Je suis presque certain que ce serait moins efficace de la mémoire que de la compilation de Nativement C, cependant.


Sera-t-il en mesure d'utiliser des optimisations pour les CPU de l'utilisateur comme des applications Java normales (SSE4, AVX, etc.)?


Je ne sais pas, @suicidoga, je n'ai jamais essayé d'entre eux.



3
votes

Assemblage Web tente de résoudre ce problème en créant un format de bytecode standard pour le Web, mais contrairement à la JVM Bytecode, l'assemblage Web est plus bas niveau, travaillant au niveau de l'abstraction de C / C ++ et non Java, c'est donc plus comme ce que l'on appelle généralement une "langue d'assemblage", ce que C / C ++ code est normalement compilé.


0 commentaires