Question:
Quel est le jeu d'instructions le plus simple qui a un compilateur C ++ / C pour écrire un émulateur?
user138530
2019-07-20 18:32:30 UTC
view on stackexchange narkive permalink

Je cherche à écrire un petit émulateur de logiciel qui émule / exécute des instructions.

Le plus simple serait d'inventer mon propre jeu d'instructions, mais j'ai pensé que ce serait plus amusant d'écrire un émulateur pour un jeu d'instructions qui a déjà un compilateur C ++ / C.

Quel est le jeu d'instructions / l'architecture le plus simple avec un compilateur C ++ et / ou C (espérons-le stable)?

Par plus simple, je veux dire le moins d'instructions.

émulateur pour quoi?Parce que ce que décrivez vous donne l'impression que vous voulez construire un processeur.
Voulez-vous dire "quel est le jeu d'instructions le plus simple qui ** pourrait avoir ** un compilateur C?", Ou "quel est le jeu d'instructions le plus simple qui ** existe déjà et a ** un compilateur C?"Les réponses sont différentes (la réponse à la première est "tout ce qui est complet de Turing").
@Marcus Müller Je veux émuler un processeur existant avec un jeu d'instructions qui a un compilateur c ++ / c.Non, je ne veux pas construire de CPU.Oui, je pense que ça pourrait être amusant d'essayer de l'implémenter sur un fpga, mais je ne pense pas en savoir assez sur les fpga pour cela.
cela peut vous donner quelques idées ... https://esolangs.org/wiki/Main_Page ... https://esolangs.org/wiki/Language_list
@jsotola qui concerne les langages de programmation, pas les processeurs!
@TimWescott Je veux dire un jeu d'instructions qui existe déjà et qui a un compilateur c / c ++.Il est donc préférable d'avoir un processeur existant avec un compilateur c ++ / c, où le processeur a de préférence un jeu d'instructions simple, il est donc plus facile pour moi de l'implémenter.
@appmaker1358 afin que vous souhaitiez écrire un émulateur de processeur multiplateforme logiciel.Bonne nouvelle: la première chose que vous faites lors de la conception de processeurs est pratiquement toujours d'écrire un émulateur, donc fondamentalement pour * chaque * ISA, vous pouvez obtenir un émulateur comme implémentation de référence.
@appmaker1358 si vous concevez un FPGA pour "émuler l'exécution d'un jeu d'instructions", ce que vous avez construit est un processeur avec ce jeu d'instructions, d'où ma confusion sur le terme "émulateur".
@Marcus Müller Oui, je pourrais peut-être une fois essayer de concevoir un processeur avec isa moi-même et porter gcc ou quelque chose comme ça, mais j'ai d'abord besoin d'en savoir plus.Par conséquent, je veux écrire un émulateur pour une architecture existante afin qu'il y ait beaucoup de code existant et d'autres informations pour m'aider.
oui, comme répondu dans ma réponse: il y a beaucoup de choix, et des choix modernes aussi, qui viennent avec plusieurs émulateurs existants que vous pouvez utiliser pour tester et vérifier votre propre émulateur.
@Marcus Müller vous avez raison de dire que si j'écris un processeur dans un fpga, il s'agit bien d'un processeur (il n'est plus émulé), désolé pour la confusion.
-1
@appmaker1358 Je ne sais pas pourquoi vous continuez à demander cela.J'en recommande littéralement un dans ma réponse.Veuillez relire ma réponse.
@appmaker1358 C est arrivé de 1969 à 1973, avec Unix.Au moment où je me suis impliqué dans le noyau Unix v6, vers 1978, Unix passait par une phase de «portabilité» et le premier livre publié sur C est également arrivé (j'ai toujours mon exemplaire original de cette année, car j'avais besoin d'apprendre le Cpour travailler sur le noyau Unix.) L'équipe de développement C a obtenu un PDP-11 (auparavant, C était en train de dériver de B sur le PDP-7) en 1970. On peut se demander d'où venaient les opérateurs ++ et -de.Mais je peux, à coup sûr, vous dire que générer du code d'assemblage pour le PDP-11 à partir de C est assez facile.
@jonk vous ne cessez jamais d'étonner!
@MarcusMüller J'ai juste eu la chance de travailler sur des projets amusants avec des personnes intéressantes.
Je ne peux que vous souhaiter que les projets amusants et les personnes intéressantes restent avec vous, @jonk :)
@MarcusMüller J'ai travaillé avec le Dr Ken Wickersheim sur la thermométrie au phosphore.J'ai travaillé avec le Dr Chris Gronet lorsque G-Squared venait tout juste de démarrer, avant l'acquisition par Applied Materials, et j'ai pu résoudre (en quelques minutes, immédiatement après avoir vu les problèmes de physique) comment mesurer la température dans leur unité RTP nouvellement développée.Je me souviens très bien du samedi après-midi!(Et je pense que j'ai grandement aidé leur vente à Applied.) J'ai travaillé avec l'équipe pour développer le premier CD réinscriptible réussi!J'ai travaillé sur des instruments pour la navette spatiale, des recherches sur le cerveau et d'autres éléments.J'ai eu beaucoup de chance.
@MarcusMüller Il n'y a pas de bon moyen de gagner de l'argent en étant un pur chercheur en physique de base.Un bon ami, le Dr Saul-Paul Sirag, a travaillé sur la théorie M (avec le Dr Ed Witten, parfois) et a gagné environ 3k USD / an!Vous ne pouvez pas vivre avec ça.J'ai gagné de l'argent en tant que programmeur.Mes intérêts restent les mathématiques et la physique et j'ai eu la chance d'obtenir de jolis rôles de programmation auprès de personnes résolvant des problèmes de physique intéressants.J'ai eu l'avantage d'avoir mon gâteau et de le manger - bien payé pour travailler avec des gens formidables faisant de la physique intéressante et des mathématiques amusantes pour résoudre des problèmes significatifs.Je ne peux pas aller mieux.
@jonk bien, je ne peux pas (et n'ai pas l'intention de) discuter avec votre sentiment d'être chanceux;mais aussi: ce n'est pas que ces opportunités consécutives se produisent et que vous n'avez rien à faire pour en tirer le meilleur parti.Il faut certainement beaucoup de travail et de talent pour pouvoir travailler dans de multiples endroits si intéressants et réaliser quelque chose.Félicitations :)
@MarcusMüller Je travaille à l'auto-éducation, bien sûr.Mais ce qui compte, c'est ce qui ne peut pas être et ce qui n'est pas vraiment capturé dans les livres.Ce sont les idées et les concepts, la *** façon *** que les gens formidables pensent *** du monde qui les entoure.(Ils n'ont pas toujours raison, mais vous apprenez BEAUCOUP en absorbant simplement les outils qu'ils utilisent pour réfléchir.) C'est d'être entouré de gens formidables qui ont développé de merveilleux outils de réflexion qui vous pénètrent.Quelque chose que vous ne pouvez pas obtenir dans un livre et que vous ne pouvez obtenir qu'en travaillant avec des personnes vraiment intéressantes.Je leur dois tout et la chance de pouvoir les écouter réfléchir.
Cela s'est maintenant transformé en une question qui est à la fois une question de liste et une question non claire.Les réponses à ce jour ne sont pas prises en compte en raison de certains de vos critères non écrits (du coup, vous ne voulez pas d'un simple et petit, vous voulez au moins 50 instructions et 32 bits. Quoi d'autre?)
Neuf réponses:
#1
+9
Marcus Müller
2019-07-20 18:51:17 UTC
view on stackexchange narkive permalink

Le plus simple serait d'inventer mon propre jeu d'instructions

euh, d'accord, nous pourrions venir d'expériences très différentes ici…

Avec le plus simple, je veux dire le moins d'instructions.

Ce n'est pas forcément le plus simple à mettre en œuvre. Souvent, avoir plus d'instructions est un bon compromis de complexité par rapport à des instructions plus complexes.

Ma question est donc la suivante: quel est le jeu d'instructions / l'architecture le plus simple qui a un compilateur C ++ et / ou C (espérons-le stable)?

Cela ne semble pas être un travail pour C ++, alors concentrons-nous sur C. (Si vous ne comprenez pas la différence qu'apporte le paradigme C ++ RAII, vous n'êtes peut-être pas dans la position optimale pour concevoir votre propre ISA.)

Puh, un ensemble d'instructions de microcontrôleur qui est précoce, mais pas trop tôt (car trop tôt impliquerait "conçu autour des limites de la logique numérique de l'époque, comme par exemple 8051).

L'AVR pourrait être un bon choix, même si personnellement je n'aime pas trop ça.

J'ai entendu dire que Zilog Z80 est facile à implémenter (il y a vraiment plusieurs implémentations Z80 là-bas), mais c'est assez ancien et pas très confortable (étant du milieu des années 70).

Si vous voulez vraiment juste un petit cœur pour contrôler ce que fait votre système, pourquoi ne pas choisir l'un des nombreux designs de cœur de processeur disponibles?

Par exemple, RISC-V est une architecture de jeu d'instructions (assez complexe), avec des compilateurs matures et de nombreuses implémentations open source. Pour un noyau FPGA minimal, picoRV32 serait probablement le noyau de choix. Et sur un ordinateur, vous n'avez qu'à exécuter QEMU.

RISC-V sur QEMU est une excellente option.De plus, je n'ai jamais entendu parler des Z80.Qu'est-ce que vous n'aimez pas dans AVR?
C'est juste que je trouve l'assembleur désagréable à écrire, et que beaucoup de choses pour lesquelles les gens utilisent de gros AVR avec un assembleur optimisé à la main pourraient être faites moins cher et plus rapidement en écrivant C pour un Cortex-M.Mais cette opinion est basée sur l'histoire - de nos jours, ATtiny prend en fait une niche sensée.
C ++ compile exactement le même code machine que C. Toute architecture avec les fonctionnalités requises par C a également tout ce dont C ++ a besoin.RAII n'a absolument rien à voir avec cela.
Le point @BenVoigt est que si vous avez un système qui a un compilateur C ++, il y a de fortes chances que vous souhaitiez l'utiliser pour produire du code ciblant le système d'exploitation.Mon raisonnement est que, bien que la libc puisse être assez lourde, un environnement d'exécution C ++ qui prend en charge le C ++ arbitraire (au lieu de C ++ avec beaucoup d'allocateurs personnalisés et des structures de données potentiellement std que vous ne devriez pas utiliser) nécessite un allocateur de mémoire, et cela influencevotre désir de votre CPU prenant en charge différents modes d'adressage.J'ai écrit C ++ pour Renesas H8300 - cela fonctionne, mais ce n'est vraiment pas du "truc pour votre premier processeur".
@MarcusMüller Donc ... les systèmes bare metal ne fonctionnent pas bien avec la plupart des bibliothèques C ++.En quoi est-ce différent de C?L'allocation dynamique que vous avez déjà mentionnée mais il y a aussi les E / S fichiers, les signaux, les fonctions Bessel ... tout un tas de trucs que vous n'utiliserez que si c'est absolument indispensable à votre projet, car l'implémentation sur ce matériel l'est tellementridiculement inefficace.D'autre part, les modèles, RAII, espaces de noms, fonctions membres sont tous très utiles pour maintenir un grand projet logiciel, quelle que soit la taille du matériel qui l'exécute.
@BenVoigt donc c'est le problème avec RAII: il encourage (sinon applique pratiquement) l'utilisation de l'allocation dynamique;l'écriture de C ++ qui ne fait pas intrinsèquement d'allocation dynamique n'est ni triviale, mais confortable (j'ai donc entendu des personnes écrivant des systèmes d'exploitation d'unité de contrôle automobile spécifiés pour être écrits en C ++ sans allocation d'exécution; vous ne pouvez pas utiliser std :: string, vous pouvezN'utilisez pas std :: vector sans échanger l'allocateur pour un seul faisant l'allocation avant que le système ne passe à l'état "opérationnel", vous ne pouvez pas du tout utiliser d'exceptions ...).
Le A dans RAII signifie «acquisition», pas «allocation».La bibliothèque C plus le langage C ++ constitue toujours un meilleur outil que la bibliothèque C et le langage C.Notez que OP n'a rien dit sur l'utilisation des modèles de conception C ++, il a juste demandé un compilateur C ++.
@BenVoigt, la chose étrange est que je n'ai pas encore été en désaccord avec vous - je suis juste prêt à parier qu'OP ne veut pas en fait qu'un compilateur C ++, mais une plate-forme pour compiler un C ++ "commun" arbitraire pour :)
@Marcus Müller Je ne veux pas compiler chaque morceau ou bibliothèque pour C ++.Le c ++ avr qui n'a pas stl ferait l'affaire.Je ne cherche pas quelque chose à mettre en œuvre parce que j'en ai besoin.Je veux écrire un émulateur pour le plaisir, et je veux qu'il supporte un compilateur c / c ++ afin que je puisse écrire de petits programmes pour cela.Je n'ai pas l'intention d'écrire un système d'exploitation pour lui ou d'y porter Linux, c'est insensé.Dans votre article de début, vous dites que avr pourrait être un bon choix.Et je suis prêt à mettre en œuvre un avr.Mais je suis plus à la recherche d'une puce 32 bits avec support c / cpp.Savez-vous quelque chose comme ça?Aussi, pourquoi est-ce "pas de travail pour C ++"?
Alors, roulons ceci du bas: "Est-ce que je connais un CPU 32 bits que je recommande?"Oui, et je l'ai fait dans ma réponse."Pourquoi avez-vous dit que ce n'était pas un travail pour C ++?"Parce que vous avez dit "peu", et si vous regardez Ben et mon échange ci-dessus, nous nous disputons principalement pour savoir si le C ++ "correct" est quelque chose que vous * vraiment * voulez faire avec votre premier processeur, car vous pouvez techniquement compiler n'importe quel langage den'importe quel processeur ISA complet, mais que ce soit "petit" et "amusant" est * vraiment * sujet à débat.
Eh bien @Marcus Müller, pour un premier processeur, c'est un peu trop, mais si j'écris un émulateur pour un processeur existant, il devrait pouvoir exécuter c ++ non?Tant que ce processeur peut exécuter c ++.Ou faut-il un effort supplémentaire pour faire fonctionner C ++?Aussi, combien conplex est risc-v, puisque vous en avez parlé.Est-ce aussi complexe que quelque chose comme un bras?
@appmaker1358 aucun processeur n'exécute C ++.Les processeurs exécutent le code machine, et tant que vous disposez d'un backend de compilateur pour ce langage ciblant ce processeur, vous pouvez utiliser ce langage pour écrire des programmes pour ce processeur.
@MarcusMüller D'accord, c'est ce que j'ai pensé.Merci!Alors je suppose que Risc-v est mon meilleur pari?
Je ne vais pas me répéter la troisième fois :)
Le ez80 est un descendant du z80 relativement récent, bien que plusieurs fois plus compliqué.
"Si vous regardez Ben et mon échange ci-dessus, nous nous disputons principalement pour savoir si le" bon "C ++ est quelque chose que vous voulez vraiment faire avec votre premier processeur" Je ne pense pas.Vous ne prétendiez pas cela, et je ne prétendais pas que le code intégré serait jamais écrit dans le style C ++ de bureau.J'ai dit qu'un compilateur C ++ est un outil très précieux à avoir, et pour toute bibliothèque de support de plate-forme donnée, cette bibliothèque plus un compilateur C ++ est un meilleur ensemble d'outils que cette même bibliothèque plus un compilateur C.
Ok, alors disons que nous ne sommes pas d'accord là-dessus :) Je pense que pour les petites plates-formes, avoir un compilateur C (notez que C ++ n'est pas seulement un sur-ensemble, mais vient avec des choses comme des dispositions pour la gestion des exceptions) et une lib C qui fonctionne estprobablement plus utile qu'un compilateur C ++ plus lib.Mais peut-être que je suis juste un peu trop conservateur.
#2
+8
jusaca
2019-07-20 18:44:42 UTC
view on stackexchange narkive permalink

Vous devriez jeter un œil à la famille de microcontrôleurs PIC.Le jeu d'instructions est limité à 35 instructions différentes, alors que le contrôleur est encore utilisé. Consultez la fiche technique à la page 228: Fiche technique PIC16F

Le contrôleur utilise 8 bits et est également disponible avec moins de périphérie, mais cela ne change rien au jeu d'instructions.

Pic est intéressant, mais je préfère quelque chose de 32 bits.Savez-vous quelque chose comme ça?
Eh bien, je pense que tous les cœurs 32 bits sont fondamentalement plus complexes dans leur conception, mais le jeu d'instructions MIPS a (dans sa forme initiale) quelque chose comme 48 instructions.Mais je pense que dans toutes les implémentations pertinentes, cela est augmenté dans une certaine mesure par des versions plus modernes de MIPS.
#3
+7
Dirk Bruere
2019-07-20 18:59:03 UTC
view on stackexchange narkive permalink

Vous avez besoin d'un ordinateur à jeu d'instructions (OISC)

Un ordinateur à jeu d'instructions (OISC), parfois appelé ordinateur à jeu d'instructions réduit (URISC), est une machine abstraite qui n'utilise qu'une seule instruction - évitant ainsi le besoin d'un langage machine opcode.Avec un choix judicieux pour l'instruction unique et avec des ressources infinies, un OISC est capable d'être un ordinateur de la même manière que les ordinateurs traditionnels instructions multiples.Les OISC ont été recommandés comme aides à l'enseignement de l'architecture informatique et ont été utilisés comme modèles de calcul dans la recherche en calcul structurel.

Si un compilateur existe, je ne sais pas.Mais je soupçonne qu'un élève malchanceux quelque part a probablement été chargé d'en écrire un.

D'accord, ce n'est pas vraiment ce que je recherche.Avec le moins d'instructions possible, je voulais dire dans la limite du raisonnable.Je n'ai pas besoin du moins possible.Je ne veux tout simplement pas implémenter 2000 instructions différentes.J'espère quelque chose avec 50 instructions.Aussi, 32 bits et c ++.
Voici un compilateur C qui compile uniquement les instructions MOV: [movfuscator] (https://github.com/xoreaxeaxeax/movfuscator)
@Paul: Ce n'est pas un OISC.Plusieurs opcodes différents partagent le même mnémonique `mov` sur x86.(https://www.felixcloutier.com/x86/mov).De plus, le décodage du code machine x86 avec les modes d'adressage ModR / M + SIB n'est pas totalement anodin.Compiler en instructions `mov` est assez horriblement inefficace, bien que n'importe quel OISC l'est aussi.Cela rend probablement le débogage de votre émulateur difficile en utilisant n'importe quelle sortie de compilateur réelle, car il est difficile de faire ce que le code machine est * supposé * faire, et de le suivre dans votre tête.J'irais avec un simple jouet ISA comme y86 ou un sous-ensemble d'un RISC ISA comme MIPS.
#4
+7
You
2019-07-21 18:16:07 UTC
view on stackexchange narkive permalink

L ' architecture MMIX de Donald Knuth a un jeu d'instructions RISC 64 bits avec 256 opcodes et des compilateurs C existants (GCC, activement maintenus) et des émulateurs (mixvm, etc.).

#5
+6
Chris Stratton
2019-07-20 21:32:11 UTC
view on stackexchange narkive permalink

J'espère quelque chose avec 50 instructions.Aussi, 32 bits et c ++

L'architecture "Beta" utilisée dans la classe de pistes de base 6.004 du MIT est une conception RISC 32 bits souvent appelée une simplification du DEC Alpha.Il a été implémenté de nombreuses manières - personnellement dans un FPGA - et à un moment donné, il y avait une ancienne version de GCC, bien que cela puisse être difficile à creuser à ce stade si personne ne continue à travailler avec.

Un exemple de documentation d'architecture est ici, le lien complet sera conservé car les versions de l'année du cours sont publiées en ligne de temps en temps et cela peut valoir la peine d'en examiner plusieurs car différentes informations peuvent être incluses: https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-004-computation-structures-spring-2009/labs/

#6
+6
Brian Tompsett - 汤莱恩
2019-07-21 15:40:15 UTC
view on stackexchange narkive permalink

Un jeu d'instructions simple de seulement 8 instructions utilisées pour l'enseignement est appelé jeu d'instructions MU0.Il est originaire de l'Université de Manchester et est utilisé pour enseigner à la fois l'écriture de compilateurs et la conception matérielle.Il existe plusieurs documents en ligne le décrivant, y compris des notes de cours à l'Université de Manchester.

Bibliographie:

LC-3 est un autre langage jouet pour l'apprentissage.
#7
+2
Draconis
2019-07-22 01:25:26 UTC
view on stackexchange narkive permalink

Ma recommandation serait le LC-3 ("Little Computer 3"), qui a été spécialement conçu pour que les étudiants EPE puissent implémenter un processeur de base dans le matériel.Elle est nettement plus propre et plus facile à émuler que n'importe quelle architecture "réelle", telle que le désordre absolu d'instructions de x86.Un compilateur C est disponible pour cela, mais sans support de virgule flottante (puisque le LC-3 n'a pas de FPU).

Si vous voulez quelque chose qui est activement utilisé dans le monde réel, essayez MIPS-I.MIPS est encore largement utilisé sur les systèmes embarqués et est surtout connu pour être utilisé sur la Nintendo 64 et la Playstation.L'émulateur standard est SPIM.

(Et bien sûr, comme d'autres réponses l'ont mentionné, le MMIX de Knuth a été rendu célèbre par The Art of Computer Programming , bien que contrairement aux autres, au mieux de maconnaissance, il n’a jamais eu de véritable implémentation matérielle.)

#8
  0
Uroc327
2019-07-21 21:16:34 UTC
view on stackexchange narkive permalink

Ce n'est pas une réponse tout à fait sérieuse mais cela pourrait convenir à votre cas, si vous voulez garder les instructions à implémenter pour votre émulateur bas.

En fait, l'instruction x86 mov est terminée.Et il existe même un compilateur C pour cela.

#9
-1
Thorbjørn Ravn Andersen
2019-07-21 20:42:16 UTC
view on stackexchange narkive permalink

Comme vous l'avez découvert, le plus simple n'est pas nécessairement le plus amusant ou le plus utile.Si vous faites cela pour une expérience d'apprentissage, vous voudrez peut-être vous pencher sur MMIX, qui est l'architecture RISC utilisée par Knuth pour "The Art of Computer Programming".

En d'autres termes, une architecture explicitement conçue pour l'apprentissage documentée en conséquence, et avec certains des programmes d'exemple les plus bien pensés pour démontrer les concepts informatiques afin que vous puissiez en faire plus par la suite.

https://en.wikipedia.org/wiki/MMIX



Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 4.0 sous laquelle il est distribué.
Loading...