Pytanie:
Jaki jest najprostszy zestaw instrukcji, który ma kompilator C ++ / C do napisania emulatora?
user138530
2019-07-20 18:32:30 UTC
view on stackexchange narkive permalink

Zamierzam napisać mały emulator oprogramowania, który emuluje / uruchamia instrukcje.

Najłatwiej byłoby wymyślić własny zestaw instrukcji, ale pomyślałem, że byłoby fajniej, gdybym napisał emulator zestawu instrukcji, który ma już kompilator C ++ / C.

Jaki jest najłatwiejszy zestaw instrukcji / architektura, który ma (miejmy nadzieję stabilny) kompilator C ++ i / lub C?

Najłatwiejszy, mam na myśli najmniejszą liczbę instrukcji.

emulator po co?Ponieważ to, co opisuje, brzmi tak, jakbyś chciał zbudować procesor.
Czy masz na myśli „jaki jest najprostszy zestaw instrukcji, który ** może mieć ** kompilator C?”, Czy „jaki jest najprostszy zestaw instrukcji, który ** już istnieje i ma ** kompilator C?”Odpowiedzi są różne (odpowiedź na pierwszą odpowiedź brzmi „wszystko, co Turing jest kompletne”).
@Marcus Müller Chcę emulować istniejący procesor z zestawem instrukcji, który ma kompilator C ++ / c.Nie, nie chcę budować procesora.Tak, myślę, że fajnie byłoby SPRÓBOWAĆ zaimplementować to na FPGA, ale nie sądzę, żebym wiedział wystarczająco dużo o FPGA.
to może dać ci kilka pomysłów ... https://esolangs.org/wiki/Main_Page ... https://esolangs.org/wiki/Language_list
@jsotola dotyczy języków programowania, a nie procesorów!
@TimWescott Mam na myśli zestaw instrukcji, który już istnieje i NIE MA kompilatora c / c ++.Dlatego preferowany jest istniejący procesor z kompilatorem c ++ / c, gdzie procesor najlepiej ma prosty zestaw instrukcji, więc jest mi łatwiej zaimplementować.
@appmaker1358, więc chcesz napisać programowy emulator procesora wieloplatformowego.Dobra wiadomość: pierwszą rzeczą, którą robisz podczas projektowania procesorów, jest praktycznie zawsze napisanie emulatora, więc w zasadzie dla * każdego * ISA możesz otrzymać emulator jako implementację referencyjną.
@appmaker1358, jeśli projektujesz FPGA, aby „emulować wykonanie zestawu instrukcji”, to co zbudowałeś to procesor z tym zestawem instrukcji, stąd moje zamieszanie związane z terminem „emulator”.
@Marcus Müller Tak, mógłbym kiedyś spróbować zaprojektować procesor z isa i portem gcc czy coś w tym stylu, ale najpierw muszę się dowiedzieć o wiele więcej.Dlatego chcę napisać emulator dla istniejącej architektury, więc jest wiele istniejącego kodu i innych informacji, które mogą mi pomóc.
tak, jak odpowiedziałem w mojej odpowiedzi: jest wiele do wyboru, a także nowoczesne opcje, które są dostarczane z wieloma istniejącymi emulatorami, których możesz użyć do przetestowania i zweryfikowania własnego emulatora.
@Marcus Müller masz rację, że jeśli napiszę cpu w FPGA, to rzeczywiście jest to procesor (nie jest już emulowany), przepraszam za zamieszanie.
-1
@appmaker1358 Nie wiem, dlaczego ciągle o to pytasz.Dosłownie polecam jeden w mojej odpowiedzi.Przeczytaj ponownie moją odpowiedź.
@appmaker1358 C przybył w latach 1969-1973 razem z Unixem.W czasie, gdy zaangażowałem się w jądro Uniksa v6, około 1978, Unix przechodził przez fazę "przenośności" i pojawiła się również pierwsza opublikowana książka na C (wciąż mam swoją oryginalną kopię z tego roku, ponieważ potrzebowałem nauczyć się Cdo pracy na jądrze Uniksa). Zespół programistów C otrzymał PDP-11 (poprzednio C był w trakcie tworzenia z B na PDP-7) w 1970 roku. Można się spierać, skąd pochodzą operatory ++ i -od.Ale mogę z całą pewnością powiedzieć, że generowanie kodu asemblera dla PDP-11 z C jest całkiem łatwe.
@jonk nigdy nie przestaniesz zadziwiać!
@MarcusMüller Po prostu miałem szczęście pracować nad fajnymi projektami z interesującymi ludźmi.
Mogę tylko życzyć, żeby fajne projekty i ciekawi ludzie trzymali się z tobą, @jonk :)
@MarcusMüller Pracowałem z dr. Kenem Wickersheimem nad termometrią fosforową.Pracowałem z dr Chrisem Gronetem, gdy G-Squared dopiero co został uruchomiony, przed przejęciem przez Applied Materials, i byłem w stanie rozwiązać (w ciągu kilku minut, natychmiast po zobaczeniu problemów fizycznych), jak zmierzyć temperaturę w ich nowo opracowanej jednostce RTP.Bardzo dobrze pamiętam sobotnie popołudnie!(I myślę, że bardzo pomogłem w ich sprzedaży firmie Applied.) Zacząłem współpracować z zespołem opracowującym pierwszą udaną płytę CD wielokrotnego zapisu!Pracowałem nad instrumentami dla promu kosmicznego, badaniami mózgu i innymi częściami.Miałem dużo szczęścia.
@MarcusMüller Nie ma dobrego sposobu na zarabianie pieniędzy będąc badaczem czysto podstaw fizyki.Dobry przyjaciel, dr Saul-Paul Sirag, pracował nad M-teorią (z dr Edem Wittenem, czasami) i zarabiał około 3 tys. Dolarów rocznie!Nie możesz na tym żyć.Zarabiałem jako programista.Moje zainteresowania pozostają związane z matematyką i fizyką. Miałem szczęście, że zapewniłem sobie fajne role programistyczne w pobliżu osób rozwiązujących ciekawe problemy fizyczne.Miałem tę korzyść, że miałem ciastko i je jadłem - dobrze pracowałem ze wspaniałymi ludźmi zajmującymi się interesującą fizyką i zabawą matematyką przy rozwiązywaniu znaczących problemów.Nie może być lepiej.
@jonk no cóż, nie mogę (i nie mam zamiaru) kłócić się z twoim poczuciem szczęścia;ale także: nie chodzi o to, że te kolejne okazje po prostu się zdarzają i nie trzeba było nic robić, aby je w pełni wykorzystać.Z pewnością potrzeba dużo pracy i talentu, aby móc pracować w wielu, tak interesujących miejscach i coś osiągnąć.Uznanie :)
@MarcusMüller Oczywiście zajmuję się samokształceniem.Ale liczy się to, co nie może być i nie jest tak naprawdę ujęte w książkach.To pomysły i koncepcje, *** sposób ***, o którym wspaniali ludzie *** myślą *** otaczający ich świat.(Nie zawsze mają rację, ale DUŻO się uczysz, po prostu wchłaniając narzędzia, których używają do myślenia). To przebywanie w towarzystwie wspaniałych ludzi, którzy opracowali wspaniałe narzędzia do myślenia, które przenikają do ciebie.Coś, czego nie można uzyskać z książki, a można uzyskać tylko pracując z naprawdę interesującymi ludźmi.Zawdzięczam im wszystko i szczęście, że mogę słuchać ich myśli.
To teraz zamieniło się w pytanie, które jest zarówno _listą pytaniem_, jak i _nieasnym_.Dotychczasowe odpowiedzi są pomijane z powodu jakichś niepisanych kryteriów (nagle nie chcesz prostych i małych, potrzebujesz co najmniej 50 instrukcji i 32 bitów. Co jeszcze?)
Dziewięć odpowiedzi:
#1
+9
Marcus Müller
2019-07-20 18:51:17 UTC
view on stackexchange narkive permalink

Najłatwiej byłoby wymyślić własny zestaw instrukcji

uh, ok, możemy pochodzić z bardzo tutaj różnych doświadczeń…

Najłatwiejszy oznacza najmniejszą liczbę instrukcji.

To niekoniecznie najłatwiejsze do wdrożenia. Często posiadanie większej liczby instrukcji jest dobrym kompromisem w porównaniu z posiadaniem bardziej złożonych instrukcji.

Moje pytanie brzmi: jaki jest najłatwiejszy zestaw instrukcji / architektura, która ma (miejmy nadzieję stabilny) kompilator C ++ i / lub C?

Brzmi to jak brak pracy dla C ++, więc skoncentrujmy się na C. (Jeśli nie rozumiesz różnicy, jaką daje paradygmat C ++ RAII, możesz nie być w optymalnej pozycji do zaprojektowania własnego ISA.)

Puh, jakiś zestaw instrukcji mikrokontrolera, który jest wczesny, ale nie zbyt wczesny (ponieważ zbyt wcześnie oznaczałoby „zaprojektowany wokół ograniczeń cyfrowej logiki tamtych czasów, jak np. 8051).

AVR może być dobrym wyborem, chociaż osobiście nie lubię tego za bardzo.

Słyszałem, że Zilog Z80 jest łatwy do wdrożenia (jest naprawdę kilka implementacji Z80), ale jest dość stary i niezbyt wygodny (pochodzi z połowy lat 70-tych).

Jeśli naprawdę chcesz, aby mały rdzeń kontrolował to, co robi twój system, dlaczego nie wybrać jednego z wielu dostępnych projektów rdzeni procesorów?

Na przykład RISC-V jest (dość złożoną) architekturą zestawu instrukcji, z dojrzałymi kompilatorami i wieloma implementacjami open source. W przypadku minimalnego rdzenia FPGA picoRV32 byłby prawdopodobnie rdzeniem z wyboru. A na komputerze po prostu uruchomisz QEMU.

RISC-V na QEMU to doskonała opcja.Nigdy też nie wiedziałem o Z80.Czego nie lubisz w AVR?
Po prostu uważam, że asembler jest nieprzyjemny do pisania, i że wiele rzeczy, które ludzie używają dużych AVR z ręcznie zoptymalizowanym asemblerem, można zrobić taniej i szybciej, pisząc C dla Cortex-M.Ale ta opinia jest historyczna - w dzisiejszych czasach ATtiny zajmuje sensowną niszę.
C ++ kompiluje się do dokładnie tego samego kodu maszynowego co C. Każda architektura z funkcjami wymaganymi przez C ma również wszystko, czego potrzebuje C ++.RAII nie ma z tym absolutnie nic wspólnego.
Punktem @BenVoigt jest to, że jeśli masz system, który ma kompilator C ++, szanse są bardzo duże, że chciałbyś go użyć do stworzenia kodu docelowego dla systemu operacyjnego.Moje rozumowanie jest takie, że chociaż libc może być dość mocne, środowisko uruchomieniowe C ++, które faktycznie obsługuje dowolny C ++ (zamiast C ++ z wieloma niestandardowymi alokatorami i potencjalnie standardowymi strukturami danych, których nie powinieneś używać) wymaga alokatora pamięci, a to ma wpływTwoje życzenie, aby Twój procesor obsługiwał różne tryby adresowania.Napisałem C ++ dla Renesas H8300 - działa, ale tak naprawdę nie jest to „materiał na pierwszy procesor”.
@MarcusMüller Więc ... systemy typu bare metal nie działają dobrze z większością biblioteki C ++.Czym to się różni od C?Alokacja dynamiczna, o której już wspomniałeś, ale jest też plik I / O, sygnały, funkcje Bessela ... cała masa rzeczy, których nie będziesz używać, chyba że jest to absolutnie niezbędne dla twojego projektu, ponieważ implementacja na tym sprzęcie jest takaśmiesznie nieefektywne.Z drugiej strony szablony, RAII, przestrzenie nazw, funkcje składowe są bardzo przydatne do utrzymywania dużego projektu oprogramowania, bez względu na rozmiar sprzętu, na którym jest uruchamiany.
@BenVoigt, więc o to właśnie chodzi w RAII: zachęca (jeśli nie praktycznie wymusza) do korzystania z alokacji dynamicznej;pisanie w C ++, który z natury nie wykonuje dynamicznej alokacji, nie jest ani trywialne, ale wygodne (więc słyszałem od ludzi piszących systemy operacyjne jednostek sterujących motoryzacyjnych określone do pisania w C ++ bez alokacji czasu wykonywania; nie możesz użyć std :: string, możeszNie używaj std :: vector bez zamiany alokatora na taki, który dokonuje alokacji, zanim system przełączy się w stan „operacyjny”, nie możesz w ogóle używać wyjątków…).
Litera A w RAII oznacza „nabycie”, a nie „alokację”.Biblioteka C plus język C ++ nadal jest lepszym narzędziem niż biblioteka C i język C.Zauważ, że OP nie powiedział nic o używaniu wzorców projektowych C ++, po prostu poprosił o kompilator C ++.
@BenVoigt, naprawdę dziwne jest to, że jeszcze się z tobą nie zgadzam - jestem po prostu skłonny założyć się, że OP nie chce tylko kompilatora C ++, ale platformy do kompilowania dowolnego "wspólnego" C ++ dla :)
@Marcus Müller Nie chcę kompilować każdego elementu lub biblioteki dla C ++.AVR C ++, który nie ma STL, wystarczy.Nie szukam czegoś do wdrożenia, bo tego potrzebuję.Chcę napisać emulator dla przyjemności i chcę, aby obsługiwał kompilator c / c ++, abym mógł pisać dla niego małe programy.Nie mam zamiaru pisać dla niego systemu operacyjnego ani przenosić na niego Linuksa, to szaleństwo.W swoim poście początkowym mówisz, że avr może być dobrym wyborem.Jestem gotów wdrożyć avr.Ale bardziej szukam 32-bitowego układu z obsługą c / cpp.Czy wiesz coś takiego?Poza tym, dlaczego to „brak pracy dla C ++”?
Więc rzućmy to od dołu: „Czy znam 32-bitowy procesor, który polecam?”Tak, i zrobiłem to w mojej odpowiedzi.„Dlaczego powiedziałeś, że to nie jest praca dla C ++?”Ponieważ powiedziałeś „mało”, a jeśli spojrzysz na Bena i moją wymianę powyżej, głównie kłócimy się o to, czy „właściwy” C ++ jest czymś, co * naprawdę * chcesz zrobić z pierwszym procesorem, ponieważ technicznie możesz skompilować dowolny język programowania dokażdy procesor ISA z kompletnym procesorem turinga, ale czy jest to „mały” i „zabawny” jest * naprawdę * przedmiotem dyskusji.
@Marcus Müller cóż, dla pierwszego procesora to trochę za dużo, ale jeśli napiszę emulator dla istniejącego procesora, powinien on być w stanie uruchomić c ++, prawda?Tak długo, jak ten procesor może działać c ++.A może wymaga dodatkowego wysiłku, aby C ++ działał?Poza tym, jak skomplikowane jest risc-v, skoro o tym mówiłeś.Czy to jest tak złożone, jak coś w rodzaju ramienia?
@appmaker1358 żaden procesor nie działa w C ++.Procesory uruchamiają kod maszynowy i tak długo, jak masz zaplecze kompilatora dla tego języka ukierunkowanego na ten procesor, możesz używać tego języka do pisania programów dla tego procesora.
@MarcusMüller OK, tak właśnie myślałem.Dzięki!Więc myślę, że Risc-v jest moim najlepszym rozwiązaniem?
Nie będę się powtarzać po raz trzeci :)
Ez80 to stosunkowo nowy potomek z80, chociaż wielokrotnie bardziej skomplikowany.
„Jeśli spojrzysz na Bena i moją wymianę powyżej, głównie kłócimy się o to, czy„ właściwy ”C ++ jest czymś, co naprawdę chcesz zrobić z pierwszym procesorem”. Nie sądzę.Ty tego nie twierdziłeś, a ja nie twierdziłem, że osadzony kod zostanie kiedykolwiek napisany w stylu C ++ dla komputerów stacjonarnych.Powiedziałem, że kompilator C ++ jest bardzo cennym narzędziem, a dla każdej biblioteki obsługującej platformę ta biblioteka wraz z kompilatorem C ++ jest lepszym zestawem narzędzi niż ta sama biblioteka plus kompilator C.
Ok, powiedzmy, że się z tym nie zgadzamy :) Uważam, że na małych platformach posiadanie kompilatora C (zauważ, że C ++ to nie tylko nadzbiór, ale zawiera takie rzeczy, jak przepisy dotyczące obsługi wyjątków) i działająca biblioteka C toprawdopodobnie bardziej pomocny niż kompilator C ++ z biblioteką.Ale może jestem trochę zbyt konserwatywny.
#2
+8
jusaca
2019-07-20 18:44:42 UTC
view on stackexchange narkive permalink

Powinieneś przyjrzeć się rodzinie mikrokontrolerów PIC.Zestaw instrukcji jest ograniczony do 35 różnych instrukcji, podczas gdy kontroler jest nadal używany. Spójrz na arkusz danych na stronie 228: arkusz danych PIC16F

Kontroler używa 8 bitów i jest również dostępny z mniejszą liczbą urządzeń peryferyjnych, ale to nie zmienia niczego w zestawie instrukcji.

Pic jest interesujący, ale wolę coś 32-bitowego.Czy wiesz coś takiego?
Cóż, myślę, że w zasadzie wszystkie 32-bitowe rdzenie są bardziej skomplikowane pod względem konstrukcji, ale zestaw instrukcji MIPS ma (w swojej początkowej formie) około 48 instrukcji.Ale myślę, że we wszystkich odpowiednich implementacjach jest to do pewnego stopnia zwiększone przez bardziej nowoczesne wersje MIPS.
#3
+7
Dirk Bruere
2019-07-20 18:59:03 UTC
view on stackexchange narkive permalink

Potrzebujesz jednego komputera z jednym zestawem instrukcji (OISC)

Komputer z jednym zestawem instrukcji (OISC), czasami nazywany ostatecznym komputer ze zredukowanym zestawem instrukcji (URISC), to abstrakcyjna maszyna używa tylko jednej instrukcji - eliminując potrzebę używania języka maszynowego kod operacji.Z rozsądnym wyborem jednej instrukcji a mając nieskończone zasoby, OISC może być uniwersalne komputer w taki sam sposób, jak tradycyjne komputery, które mają wiele instrukcji.OISC są zalecane jako pomoc w ucząc architektury komputerów i były używane jako modele obliczeniowe w badaniach obliczeń strukturalnych.

Czy kompilator istnieje, nie wiem.Ale podejrzewam, że jakiś pechowy student gdzieś prawdopodobnie otrzymał zadanie napisania takiego.

Okay, to nie jest to, czego szukam.Mając jak najmniej instrukcji, miałem na myśli rozsądek.Nie potrzebuję tak mało, jak to możliwe.Po prostu nie chcę wdrażać 2000 różnych instrukcji.Mam nadzieję na coś z 50 instrukcjami.Ponadto wersja 32-bitowa i C ++.
Oto kompilator C, który kompiluje się tylko do instrukcji MOV: [movfuscator] (https://github.com/xoreaxeaxeax/movfuscator)
@Paul: To nie jest OISC.Wiele różnych rozkazów ma ten sam mnemonik `mov` na x86.(https://www.felixcloutier.com/x86/mov).Ponadto dekodowanie kodu maszynowego x86 z trybami adresowania ModR / M + SIB nie jest całkowicie trywialne.Kompilowanie do instrukcji `mov` jest dość okropnie nieefektywne, chociaż tak samo jest z każdym OISC.To prawdopodobnie utrudnia debugowanie emulatora przy użyciu dowolnego rzeczywistego wyjścia kompilatora, ponieważ zastanawianie się, co kod maszynowy * powinien * robić, jest trudne, więc podążanie za tym w głowie.Wybrałbym prostą zabawkową ISA, taką jak y86, lub podzbiór RISC ISA, jak MIPS.
#4
+7
You
2019-07-21 18:16:07 UTC
view on stackexchange narkive permalink

Architektura MMIX Donalda Knutha zawiera 64-bitowy zestaw instrukcji RISC z 256 opkodami i istniejącymi kompilatorami C (GCC, aktywnie utrzymywanymi) i emulatorami (mixvm itp.).

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

Mam nadzieję na coś z 50 instrukcjami.Również wersja 32-bitowa i C ++

Architektura „Beta” używana w podstawowej klasie ścieżek MIT 6.004 to 32-bitowy projekt RISC, często określany jako uproszczenie DEC Alpha.Został zaimplementowany na wiele sposobów - osobiście w układzie FPGA - i kiedyś istniała dla niego stara wersja GCC, chociaż w tym momencie może to być trudne do wykopania, jeśli nikt nie kontynuuje z nim pracy.

Oto przykład dokumentacji architektury. Pełne łącze zostanie zachowane, ponieważ wersje kursu z roku, w których są publikowane, zmieniają się od czasu do czasu i warto przyjrzeć się kilku, ponieważ mogą zawierać różne informacje: 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

Prosty zestaw instrukcji składający się tylko z 8 instrukcji używanych do uczenia jest znany jako zestaw instrukcji MU0.Powstał na Uniwersytecie w Manchesterze i jest używany do nauczania zarówno pisania kompilatorów, jak i projektowania sprzętu.Istnieje kilka dokumentów online opisujących to, w tym notatki z zajęć na Uniwersytecie w Manchesterze.

Bibliografia:

LC-3 to kolejny taki język zabawek do nauki.
#7
+2
Draconis
2019-07-22 01:25:26 UTC
view on stackexchange narkive permalink

Moją rekomendacją byłby LC-3 („Mały komputer 3”), który został zaprojektowany specjalnie dla studentów ECE, aby mogli zaimplementować podstawowy procesor w sprzęcie.Jest znacznie czystszy i łatwiejszy do naśladowania niż jakakolwiek architektura „świata rzeczywistego”, taka jak absolutny bałagan instrukcji x86.Dostępny jest dla niego kompilator C, ale bez obsługi zmiennoprzecinkowych (ponieważ LC-3 nie ma FPU).

Jeśli szukasz czegoś, co jest aktywnie używane w prawdziwym świecie, wypróbuj MIPS-I.MIPS jest nadal szeroko stosowany w systemach wbudowanych i jest najbardziej znany z używania na Nintendo 64 i Playstation.Jego standardowym emulatorem jest SPIM.

(I oczywiście, jak wspomniały inne odpowiedzi, MMIX Knutha został rozsławiony przez The Art of Computer Programming , choć w przeciwieństwie do innych, najlepiej z mojegowiedzy, to nigdy nie miało prawdziwej implementacji sprzętowej.)

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

To nie jest do końca poważna odpowiedź, ale może pasować do Twojego przypadku, jeśli chcesz, aby instrukcje implementacji Twojego emulatora były niskie.

W rzeczywistości instrukcja x86 mov jest w trakcie kończenia.Jest nawet do tego kompilator C.

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

Jak się przekonałeś, najprostsze niekoniecznie jest najbardziej zabawne lub najbardziej przydatne.Jeśli robisz to w celach edukacyjnych, możesz zajrzeć do MMIX, który jest architekturą RISC używaną przez Knutha w „The Art of Computer Programming”.

Innymi słowy, architektura specjalnie zaprojektowana do uczenia się, odpowiednio udokumentowana, z niektórymi z najbardziej przemyślanych przykładowych programów do demonstrowania pojęć informatycznych, dzięki czemu możesz później zrobić więcej.

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



To pytanie i odpowiedź zostało automatycznie przetłumaczone z języka angielskiego.Oryginalna treść jest dostępna na stackexchange, za co dziękujemy za licencję cc by-sa 4.0, w ramach której jest rozpowszechniana.
Loading...