Na die skryf van die eerste artikel oor hoe om u eie bedryfstelsel te skep, iemand het my gesê dat as ek 'n artikel kan doen oor hoe om 'n programmeertaal te skep. Aanvanklik het ek nie veel aandag gegee nie, maar nou en op ander maniere het ek baie meer geleer oor die skepping van programmeertale. Laat ons dit doen 'n basiese programmeertaal, maklik in ander programme ingebed en werk met 'n virtuele masjien wat ons ook sal ontwerp. Vandag moet ons die mees basiese virtuele masjien maak.
U wonder waarskynlik: 'N Virtuele masjien? Maar is dit nie baie moeilik nie en vertraag dit ook die programme? ' Daarteenoor is 'n eenvoudige virtuele masjien baie eenvoudig en relatief vinnig. ek het gekies Rust as 'n taal vir die virtuele masjien. Maar wat is dit? Rust?
Rust installeer in Linux Op 'n eenvoudige manier. Daar is egter geen amptelike pakket nie. Gebruikers van Ubuntu kan hierdie twee byvoeg PPA: ppa: hansjorg / roes y ppa: cmrx64 / vrag, gebruikers van Boog kan gebruik Aur (vrag-git is die pakket wat alles installeer). Die res kan gebruik:
curl -s https://static.rust-lang.org/rustup.sh | sudo sh
Hoe werk 'n virtuele masjien?
As u weet hoe die samelewêreld werk, is dit presies dieselfde, met die stapel of die stapel. Indien nie, sal ek dit aan u verduidelik. Laat ons die volgende kode voorstel:
druk 2 + 3 uit
Die rekenaar verstaan nie wat 2 + 3 beteken nie en weet ook nie watter volgorde dit moet volg nie. Rekenaars werk met batterye of stapels waarin data versamel en voortdurend onttrek word. Die kode op ons virtuele masjien moet so lyk:
DRUK 2 DRUK 3 VOEG PRINT BY
Basies sou ons die 2 bo-op die stapel plaas, die 3 ook. ADD trek (dws verwyder dit uit die stapel en kry die waarde daarvan) van die laaste 2 items op die stapel en voeg die resultaat bo-aan die stapel. PRINT neem die laaste item op die stapel en gebruik dit om dit aan ons te vertoon. Laat ons dit nou doen Rust.
Ons moet eers 'n taal vir die bytecode, kan ons 'n bestaande een soos die een in gebruik Java o el CLR van .NET / Mono, maar ons gaan 'n meer basiese een skep.
https://gist.github.com/a01de8904fd39a442c20
Ons gebruik heksadesimale notasie vir elke instruksie. Op die hoogte het ons geplaas # [afgelei (FromPrimitive)], is 'n eienaardigheid van Rust en dit sal ons later help om die enumerasie met grepe direk te kan vergelyk.
Nou moet ons 'n funksie maak wat elkeen van die instruksies uitvoer. Hiervoor moet ons 'n greep lees en dit vergelyk met die instruksies wat ons in die opsomming het. As u een vind wat bestaan, moet u u aksie uitvoer.
https://gist.github.com/8950ce212a2de2f397f9
Ons doen dit om elke greep afsonderlik te lees en uit te voer:
https://gist.github.com/12e24a1f0dd65e4cd65d
Soos u kan sien, onderskei ons as ons die PUSH-opdrag (ons INTEGER-opdrag) voorheen gekry het, dan word die volgende byte heeltemal na die stapel geneem. Daar gebruik ons twee funksies wat ek u nie geleer het nie, self.pop () y self.push (), wat natuurlik verantwoordelik is vir die hantering van die stapel.
https://gist.github.com/54147f853a8a2b8c01d9
Hulle is nie baie kompleks nie, maar die pop-funksie het foutopsporingstelsels. In werklikheid, in Rust, as ons die meganismes verwyder, sal dit ons 'n kompileringsfout gee. Nou moet ons eenvoudig 'n program inroep perin (ons virtuele masjien) en voer 'n bytecode uit.
https://gist.github.com/99b1ab461318b3a644d0
Die bytecode kan uit 'n lêer gelees word, maar hier het ek dit vir 'n eenvoudigheid in 'n veranderlike gestoor. As ons dit uitvoer, sal dit ons die verwagte resultaat gee:
Perin v0.1 Perin VM voer FlopFlip bytecode uit PerinVM-instansie PerinVM v0.1.0 heelgetalwaarde 5
Alle kode is beskikbaar by GitHub onder die Apache-lisensie 2.0: https://github.com/AdrianArroyoCalle/perin. Hulle moet hê om saam te stel Cargo geïnstalleer en geplaas:
charge build && ./target/main
In die volgende hoofstuk sal ons meer oor ons programmeertaal sien.
17 kommentaar, los joune
Interessante nuuskierigheid, hoewel dit in werklikheid nie baie nuttig is nie, maak dit nie skade om te weet nie.
Dit is wonderlik dat u Rust adverteer, dit is 'n taal wat baie beloof, dit is nie net veiliger as c ++ nie, maar (voorlopig) duideliker in die sintaksis.
Wat die foto betref, sou ek nie Java Evolution XD oorweeg nie.
En van fortran af het ek dit nooit gebruik nie, maar ek het nog nie veel goed daarvan gehoor nie ...
Ek doen dit, en dit is veral nuttig in ingenieurswese, alhoewel Python veld wen.
Fortran is miskien die ander wonderlike taal saam met C. Selfs vandag sal regtig kritieke vrae die een of die ander wees.
En dit sou betwyfel kan word dat Fortran 'n 'evolusie' van C is, en miskien andersom, aangesien C nuwer, moderner en met meer moontlikhede is; alhoewel die een nie in die minste daarvan losgemaak is nie.
Alhoewel die uiteindelike posisies uit een of ander oogpunt almal bespreek kan word.
+1 na Java
Kom ons kyk of ek hiervan hou, ek gee iets aan programmering, maar basies om te sien of ek meer verstaan.
Wat is die eintlike doel van die skep van 'n nuwe programmeertaal? Persoonlik lyk dit vir my asof dit 'n foefie is om die bronkode weg te steek.
Vriend, wat het gebeur met die voortsetting van 'u eie bedryfstelsel'? Moet dit asseblief nie daar laat nie, gaan voort.
Eintlik is jy 'n meester en net hierdie twee liedjies het my aandag heeltemal geboei, maar ek wil nie hê hulle moet halfpad bly nie.
Ek weet dat baie van ons dieselfde dink en ons wag op die voortsetting en gevolgtrekking van hierdie baie interessante onderwerpe.
Baie interessant, baie dankie. 🙂
Ek beskou Java nie as 'n programmeertaal nie, maar eerder as 'n tolk vir opdragte, aangesien dit nie kompileerbaar is nie
['N Programmeringstaal is 'n formele taal wat ontwerp is om prosesse uit te druk wat deur masjiene soos rekenaars uitgevoer kan word.]
Om hierdie rede is Java 'n programmeertaal. Selfs die Bash-taal (linux-skeltaal) is 'n programmeertaal op sigself.
Daar is twee soorte tale:
- Saamgestel
- Uitgelê
- Gemengd (virtuele masjiene, die inheemse biblioteke word saamgestel en die funksionele kode word geïnterpreteer)
Die tolke is baie handig as dit by multiplatform kom en het geen rampspoedige prestasie daarvoor nie. Java, VB.NET, C ++ .NET, F #, C # is gemengde tale. Die bash-taal, bat, PHP, Javascript en nog vele meer is geïnterpreteerde tale.
As u Java nie as 'n taal beskou nie omdat dit geïnterpreteer word (wat dit nie is nie), moet u nie baie ander tale wat gebruik word om programme te maak, oorweeg nie. Boonop moet u volgens hierdie reël van drie nie oorweeg dat daar enige programmeertaal is nie, behalwe die masjientaal self.
En waarom nie? Nie eens masjientaal kan as 'n taal beskou word nie, want dit is eintlik net 'n stel opdragte wat deur die verwerker geïnterpreteer word.
Want effektief is dat ALLE tale niks anders is as 'n stel opdragte wat deur 'n verwerker geïnterpreteer word nie.
U hou dalk van 'n taal min of meer (Java, in hierdie geval), lyk min of meer nuttig en kragtig, maar om te sê dat dit nie 'n programmeertaal is nie omdat dit nie saamgestel is nie ... dit is in stryd met alle definisies van die programmeertaal.
Ek hoop nie ek het te onbeskof gelyk nie
nee stil jy het net ons lewens vernietig
hahahahaha, perdoooon. dit was nie my bedoeling nie xD
java is 'n programmeertaal. Omdat u 'n toepassing kan ontwikkel en wanneer u saamstel, maak u 'n .jar wat deur die JVM geïnterpreteer word. Volgens u python-logika word dit ook nie geïnterpreteer nie, maar dit kom saam met verskillende uitvoerbare ...
Baie goeie inligting
goeie inligting, maar ek twyfel, dit is moontlik om 'n nuwe programmeertaal van nuuts af te skep sonder om op ander analogieë of sagteware te vertrou. Ek praat op dieselfde manier as ander tale soos Java of HTML.
Ek sal u hulp met hierdie vraag baie waardeer.