Vra

Ek skryf my eie script taal in C#, met'n paar eienskappe wat ek wil, en ek verkies om te gebruik MSIL as uitset se bytecode (Refleksie.Dit is baie nuttig, en ek hoef nie te dink nog bytecode).Dit werk, straal uitvoerbare, wat kan hardloop ( selfs decompiled met Reflector :) )en is baie vinnig.

Maar - ek wil uit te voer verskeie prosesse in een proses+een draad, en beheer oor hul opgedra CPU tyd met die hand (ook implementeer baie meer robuuste IPC wat aangebied word deur .NET framework) Is daar enige manier om heeltemal afskakel JIT en die skep van eie VM, 'n versterking onderrig-na-onderrig gebruik te maak .NET framework (en beheer geheue gebruik, ens.), sonder die behoefte om te skryf iets op my eie, of om dit te bereik moet ek skryf die hele MSIL interpreteer?

WYSIG 1):Ek weet dat die interpretasie van IL is nie die vinnigste ding in die heelal :)

WYSIG 2):Om te verduidelik - ek wil my VM tot'n soort van "operating system" - dit kry'n paar CPU tyd en verdeel dit tussen prosesse, beheer geheue toekenning vir hulle, en so aan.Dit hoef nie te vinnig, nie doeltreffend nie, maar net'n bewys van die konsep vir'n paar van my eksperimente.Ek hoef nie om dit te implementeer op die vlak van verwerking elke instruksie - as dit moet gedoen word deur .NET, ek sal nie omgee nie, ek wil net om te sê :stap een instruksies, en wag totdat ek vir jou gesê het om te stap volgende.

WYSIG 3):Ek het besef, dat ICorDebug kan miskien bereik my behoeftes, nou kyk na die implementering van Mono se runtime.

Was dit nuttig?

Oplossing

Jy kan gebruik Mono - Ek glo dat 'n opsie om die IL plaas interpreteer van JITting dit toelaat . Die feit dat dit open source middel (onderhewig aan lisensiëring) wat jy moet in staat wees om dit te verander volgens jou behoeftes, ook.

Mono nie al funksionaliteit NET se, weliswaar - maar dit kan doen alles wat jy nodig het

.

Ander wenke

Pasop dat MSIL is ontwerp om ontleed word deur 'n net-betyds samesteller. Dit is nie baie geskik vir 'n tolk. 'N Goeie voorbeeld is miskien die AGS onderrig. Dit word gebruik om 'n wye verskeidenheid van waarde tipe waardes voeg: byte, kort, int32, int64, ushort, uint32, uint64. Jou samesteller weet watter soort byvoeging is nodig, maar jy sal verloor dat die tipe inligting wanneer genereer die MSIL.

Nou moet jy dit terug tydens looptyd vind en wat vereis dat die nagaan van die tipes van die waardes op die evaluering stapel. Baie stadig.

'n maklik geïnterpreteer IL het toegewyde ADD instruksies soos ADD8, ADD16, ens.

Microsofts implementering van die Gemeenskaplike Taal Runtime het net een uitvoering stelsel, die JIT.Mono, aan die ander kant kom met beide'n JIT en'n tolk.

Ek, egter, is nie ten volle verstaan wat presies jy wil om jouself te doen en wat jy wil om te laat Microsofts implementering:

Is daar enige manier om heeltemal afskakel JIT en die skep van eie VM?

en

...sonder die behoefte om te skryf iets op my eie, of om dit te bereik moet ek skryf die hele MSIL interpreteer?

is'n soort van weerspreek.

As jy dink, jy kan skryf'n beter uitvoering stelsel as microsofts JIT, sal jy het om dit te skryf van nuuts af.Hou in gedagte, egter, dat beide microsofts en monos JIT is hoogs geskik opstellers. (Programmeertaal buurman)

Om in staat te skeduleer CPU tyd vir die bedryfstelsel prosesse presies is nie moontlik van die gebruiker af.Dit is die bedryfstelsels taak.

Sommige implementering van die groen drade dalk'n idee, maar dit is beslis'n onderwerp vir onbeheerde kode.As dit is wat jy wil, het jy'n blik op die CLR hosting API.

Ek sou raai, jy probeer om te implementeer jou taal in CIL.Na alles, dit raak saamgestel af te rou x86.As jy nie omgee oor verifiability, kan jy gebruik wenke waar nodig.

Een ding wat jy kan oorweeg om dit te doen is die opwekking van die kode in'n toestand-masjien styl.Laat ek verduidelik wat ek bedoel met dit.

Wanneer jy skryf generator metodes in C# met'n opbrengs terugkeer, die metode is saamgestel in'n innerlike IEnumerator klas wat implemente'n staat masjien.Die metode se kode is opgestel in logiese blokke wat is beëindig met'n opbrengs opbrengs of opbrengs breek verklaring, en elke blok wat ooreenstem met'n genommerde toestand.Want elke opbrengs opbrengs moet'n waarde, elke blok eindig deur die stoor van'n waarde in'n plaaslike gebied.Die enumerator voorwerp, in orde te genereer sy volgende waarde, noem'n metode wat bestaan uit'n reuse-skakelaar verklaring oor die huidige stand nommer in om te hardloop die huidige blok, dan vooruitgang van die staat en die opbrengs van die waarde van die plaaslike gebied.

Jou script taal kan genereer sy metodes in'n soortgelyke styl, waar'n metode ooreenstem met'n staat masjien voorwerp, en die VM ken tyd deur die bevordering van die staat masjien tydens die toegelate tyd.'n paar moeilike dele van hierdie metode:die implementering van dinge soos die metode oproepe en probeer/uiteindelik blokke is moeiliker as die opwekking van reguit-up MSIL.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top