Sanal Makine kurmak istiyorum, herhangi bir referans var mı? [kapalı]


22

Sanal Makineyi bazı oyun kodlarını çalıştırmak için bağımsız bir platform olarak (aslında komut dosyası yazarak) kurmak istiyorum.

Oyunlarda tanıdığım Sanal Makineler oldukça eski: Infocom'un Z-Machine'i , LucasArts'ın SCUMM'i , id Software'in Quake'i 3 . Bir .net Geliştirici olarak, Aşina olduğum CLR içine ve baktım CIL Talimatları aslında (dil seviyesine vs) bir VM Seviyesi uygulamak ne genel bir bakış elde etmek. Ayrıca geçen sene 6502 Assembler'da biraz dadandım .

Sorun şu ki, bir tane uygulamak istediğim için, biraz daha derine inmem gerekiyor. Yığın tabanlı ve kayıt tabanlı VM'lerin olduğunu biliyorum, ancak hangisinin neyin daha iyi olduğunu ve hangilerinin daha fazla veya hibrit yaklaşımlar varsa daha iyi olduğunu bilmiyorum. Bellek yönetimi ile uğraşmam, hangi düşük seviye tiplerinin VM'nin bir parçası olduğuna karar vermem ve ldstr gibi şeylerin neden böyle çalıştığını anlamam gerekiyor.

Tek referans kitabım (Z-Machine ürünleri dışında) CLI Annotated Standard , ancak VM'ler için daha iyi, daha genel / temel bir ders olup olmadığını merak ediyorum. Temelde Dragon Book gibi bir şey , ancak VM'ler için? Kayıt tabanlı bir VM kullanan Donald Knuth'un Bilgisayar Programcılığı Sanatının farkındayım , ancak bu serinin hala ne kadar uygulanabilir olduğundan emin değilim, özellikle de hala bitmedi mi?

Açıklama: Amaç, özel bir VM oluşturmaktır. Örneğin, Infocom'un Z-Makinesi, Arka Plan Rengini ayarlamak veya bir ses çalmak için OpCodes içerir. Bu yüzden, bir betiği (dil TBD'si) alan ve ondan bir byte kodu üreten derleyiciye, VM'ye OpCodes olarak ne kadar girdiğini ve ondan bir byte kodu oluşturduğumu bulmam gerekiyor, ancak bunun için gerçekte ne yaptığımı anlamam gerekiyor.


Modern Biliyorum, modern teknoloji anında yüksek seviyede bir betik dili yorumlamama izin verecek. Ama bunun neresinde eğlence var? :) Ayrıca Google'a gitmek biraz zor, çünkü Virtual Machines günümüzde sık sık VMWare tipi işletim sistemi sanallaştırma ile ilişkilendiriliyor ...


6
Bir yığın tabanlı makinenin turing-tamamlanması için yığının dışında belleğe ihtiyaç duyduğunu unutmayın, aksi takdirde sadece bir PDA
cırcır

1
İlk soru şudur: Ne kadar ileri gitmek istiyorsun? SCUMM / SCUMMVM’e hiç bakmadım, ancak grafikler hakkında hareket eden şeyleri bilmenin oldukça yüksek bir seviyeye sahip olduğunu farz ettim, oysa CIL ... ... bellek modelinizi (yığın tabanlı kayıt tabanlı, karışım, karışıklık, ..) ve opcodes (tanımlamak zorunda) yani montaj talimatları) ve sonra bir VM'nin ilk sürümü bir döngüdür, do { switch(opcode) {case OP1: ... case OP2: ...} while (nextop);belki bir derleyicidir ... ve sonra eğlence başlıyor - gerçekten çalışmasını sağlamak için optimizasyon
johannes

3
Basit bir Forth çalışma zamanı uygulamakla başlamayı deneyin.
SK-mantık

1
Quake 3Sanal makine tam olarak nasıl ?
Ramhound

3
@ İd teknoloji motorları uzun zamandır bir çeşit iç sanallaştırma kullanmışlardı, bu yazı ya da Wikipedia'nın bilgileri daha iyi açıklayabilirdi.
Daniel B,

Yanıtlar:


18

Lua'yı kontrol ederek başlarım . Hem örnek bir uygulama olarak, hem de kendiniz kullanmamaya karar verirseniz kutudan çıkarılabilir bir VM / dil olarak.

Kaynak kodu çok okunur ve ayrıca Açıklamalı kaynak kodu da var . Ve ana yazar Roberto Ierusalimschy tarafından yazılmış bazı Tasarım belgeleri .

Son olarak, kendiniz yerine kullanmayı tercih ederseniz, oyun geliştiricileri arasında uzun süredir favori olduğunu göreceksiniz ve çok yüksek performanslı bir JIT uygulaması var .

Yığın yazıcısına göre, yığın tabanlı VM'lerin tasarımının daha kolay olduğunu düşünüyorum, ancak derleyici daha karmaşık olabilir. Iesualimschy yazısının belirttiği gibi, Lua ilk kayıt tabanlı dil VM'lerinden biriydi, ancak daha sonra bazı diğerleri, En önemlisi LLVM, Dalvik ve bazı modern JavaScript VM'lerini filizlendi.


2
Yığın vs kayıt makineleri hakkında: Parrot / Perl6 devs'den bir alıntı hatırlıyorum: "kayıt tabanlı bir makine oluşturmak daha zor, ancak derleyici tarafımız için mevcut araştırmalardan tonlarca yararlanıyoruz" (hazır değil)
johannes

+1 Lua, VM'leri öğrenmek için mükemmel bir bytecode uygulamasına ve çok temiz bir tasarıma sahiptir. Ek olarak, birçok insanın Lua'yı kendi ihtiyaçları için özelleştirdiğini ve sıfırdan başlamak istemiyorsanız oldukça genişletilebilir olduğunu gösterdiğini göreceksiniz.
CodexArcanum,

Hala bundan geçiyorum. Geliştiriciden VM hakkında bir başka harika belge: inf.puc-rio.br/~roberto/talks/lua-ll3.pdf
Michael Stum

2

Şu anda sizi bağlayacak özel kaynaklarım yok, ancak geçmişte benzer bir konuyu araştırdım ve Smalltalk VM'yi de iyi bir öğrenme yardımı olarak buldum . Smalltalk tarafından kullanılan bayt kodları hakkında yazılmış pek çok akademik makale ve makale ile bu bayt kodunu kullanmak için tercümanlar ve sanal makineler yazıyor. Google, çok fazla okuma materyali aradığını smalltalk vm implementationya da verdiğini belirtti smalltalk bytecode interpreter.

Bazı kaynak kodlarını görmek veya bir uygulamayı denemek istiyorsanız, Squeak veya Pharo sürümlerini öneririm.

İlgili dil / VM Self de ilginizi çekebilir, çünkü Self temelde prototip tabanlı nesnelerle Smalltalk (JavaScript'e benzer).


0

[Script] kaynak kodunun makinenize veya çalışma zamanları ortamınıza nasıl girdiğini analiz etmeye başlardım.

HTML belgelerinde olduğu gibi bir şey varsa <a onclick="dosomething();">o zaman çok hızlı bir derleyiciye ihtiyacınız olacak, bytecode yürütme hızı bu durumda çok da önemli değil. Kullanım durumunuz tam gelişmiş derlemeyi alabileceğiniz Java / .NET'e daha yakınsa, VM mimarisi ve bytecode yapısı Java bytecodes veya IL'e yakın olacaktır.

Diğer kriterler "yapışkanlık" olarak adlandırdığım şey. Başlangıçta komut dosyaları tutkal dilleri olarak geliştirildi; komut dosyaları sadece çeşitli yerel işlevlerin nasıl birleştirileceğini (Perl, Python, Ruby, JS) tanımlar. Bu durumda, VM ve bayt kodunun etkinliği, kodunuzun çoğu dilin kendisinde yazılmış fonksiyonlar olduğunda, Java / .NET durumunda olduğundan çok daha az önemlidir.

Ve kullanacağım son ana kriter, dilinizin genişletilebilirliğidir. Dil çalışma zamanını size eklemeyi planlıyorsanız, C ++ uygulamasında uygulanan birçok yerel nesne / işlev varsa, VM mimarinizin C ++ ile entegrasyon için "uygun" olması gerekir. Örneğin: C ++ nesnelerini komut dosyası olarak göstermeyi planlıyorsanız, o zaman sizin için tek seçenek bir yığın yönetimi olarak referans saymak olacaktır (Python gibi, entegrasyon örneği olarak boost :: python'a bakın). Hareketli / sıkıştırma yığın / GC kullanmayı planlıyorsanız, o zaman farklı bir hikaye olacak. Lua'nın çalışma zamanına yerel şeyler eklemesi biraz zor. [C ++ geliştiricileri için].

Başka bir deyişle, önce tipik kullanım durumunuzu tanımlamaya çalışın; sizin için ne okuyacağınızı önermek daha kolay olacaktır.


1
Modern JavaScript derleyiciler oldukça karmaşıktır ve iyi üretilen kod çok optimizasyonu koymak nasıl alwazs soru var.
johannes

Javascript yürütme performansı önemlidir. Küçük komut dosyaları için değil, daha büyük ya da daha yoğun siteler için, daha iyi ya da daha kötüsü için daha popüler sitelerin önemli bir bölümünü oluşturur. JS motorlarının JIT derleyicilerini kullanmasının bir nedeni var (V8'in bir tercümanı bile yok , doğrudan makine koduna gidiyor).

@delnan: JS kullanım örneği Python'dan oldukça farklı. Python'da, ışın izleme algoritması uygulaması gibi bir şeye ihtiyacınız olduğunda, yerel kütüphaneyi yapacak ve onu komut dosyasından çağıracaksınız. Bu her zaman herhangi bir JIT çözümünden daha hızlı (veya en azından yavaş değil) olabilir. JS alanında, yerel kod gibi bir lüksünüz yoktur, bu yüzden sizin için tek seçenek JS VM'nizi olabildiğince hızlı hale getirmeye çalışmaktır. Ama yine, fiyatı ile. Basit yorumlayıcı HTML Değerlendirilmesi "dosomethingnative ()" "<düğme onclick =" dosomethingnative () "> hızlı V8 daha büyüklük dereceleri olabilir.
c-gülümseme

@ c-smile Benim açımdan kesinlikle.

@delnan: ama benim açımdan oldukça farklı: ortak kullanım durumlarını analiz et ve sadece o zaman ne tür bir VM mimarisine, dil sözdizimine vb. ihtiyaç duyacağına karar verebilirsin.
c-smile
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.