Compiler and Virtual Machine
Bu bölüm, Sanal Makinede (VM) program derleme ve Needle dili işlemlerini içerir.
Kaynak kodu depolama ve derleme
Sözleşmeler ve fonksiyonlar Golang ile yazılır ve ekosistemlerin sözleşme tablolarında saklanır.
Bir sözleşme yürütüldüğünde, kaynak kodu veritabanından okunacak ve bayt koduna derlenecektir.
Bir sözleşme değiştirildiğinde, kaynak kodu güncellenecek ve veritabanına kaydedilecektir. Daha sonra kaynak kod derlenir, böylece ilgili sanal makinedeki bayt kodu güncellenir.
Bayt kodları fiziksel olarak kaydedilmediği için program tekrar çalıştırıldığında yeniden derlenecektir.
Her ekosistemin sözleşme tablosunda açıklanan kaynak kodunun tamamı katı bir sırayla sanal bir makinede derlenir ve sanal makinenin durumu tüm düğümlerde aynıdır.
Sözleşme çağrıldığında, sanal makine durumunu hiçbir şekilde değiştirmeyecektir. Herhangi bir sözleşmenin yürütülmesi veya herhangi bir işlevin çağrılması, her harici çağrı sırasında oluşturulan ayrı bir çalışan yığında gerçekleşir.
Her ekosistem, blok zinciri veya diğer sanal ekosistemler üzerinde doğrudan etki olmaksızın blok zinciri dışındaki tablolarla birlikte bir düğüm içinde kullanılabilen sanal bir ekosisteme sahip olabilir. Bu durumda böyle bir sanal ekosistemi barındıran düğüm, sözleşmesini derleyecek ve kendi sanal makinesini oluşturacaktır.
Sanal makine yapıları
VM Yapıları
Bir sanal makine, aşağıdaki gibi bir yapı olarak bellekte düzenlenmiştir.
type VM struct {
Block
ExtCost func(string) int64
FuncCallsDB map[string]struct{}
Extern bool
ShiftContract int64
logger *log.Entry
}
Bir VM yapısı aşağıdaki öğelere sahiptir:
- Blok - bir blok yapısı;
- ExtCost - bir işlev, harici bir golang işlevini yürütmenin maliyetini döndürür;
- FuncCallsDB - Golang işlev adlarının bir koleksiyonu. Bu işlev, yürütme maliyetini ilk parametre olarak döndürür. Bu işlevler, veritabanı işleme maliyetini hesaplamak için EXPLAIN'i kullanır;
- Extern - bir sözleşmenin harici bir sözleşme olup olmadığını gösteren bir Boole bayrağı. Bir VM oluşturulduğunda true olarak ayarlanır. Kod derlendiğinde çağrılan sözleşmeler görüntülenmez. Yani ileride belirlenen sözleşme kodunun çağrılmasını sağlar;
- ShiftContract - VM'deki ilk sözleşmenin kimliği;
- logger - VM hata günlüğü çıktısı.
Blok Yapıları
Sanal makine, Blok tipi nesnelerden oluşan bir ağaçtır.
Bir blok, bazı bayt kodları içeren bağımsız bir birimdir. Basit bir ifadeyle,
dilde parantezler ({}
) içine koyduğunuz her şey bir bloktur.
Örneğin, aşağıdaki kod, fonksiyonlara sahip bir blok oluşturacaktır. Bu blok ayrıca bir if ifadesine sahip başka bir blok içerir ve bu blok while ifadesine sahip bir blok içerir.
func my() {
if true {
while false {
...
}
}
}
Blok, bellekte aşağıdaki gibi bir yapı olarak düzenlenmiştir.
type Block struct {
Objects map[string]*ObjInfo
Type int
Owner *OwnerInfo
Info interface{}
Parent *Block
Vars []reflect.Type
Code ByteCodes
Children Blocks
}
Bir blok yapısı aşağıdaki unsurlardan oluşur:
- Objects - ObjInfo pointer türündeki internal objelerin haritası. Örneğin, blokta bir değişken varsa, onun adıyla ilgili bilgi alabilirsiniz;
- Type - bloğun türü. Bir fonksiyon bloğu için tipi ObjFunc; bir sözleşme bloğu için türü ObjContract'tır;
- Owner - OwnerInfo işaretçi türünün yapısı. Bu yapı, sözleşmenin derlenmesi sırasında belirtilen veya sözleşmeler tablosundan elde edilen, derlenmiş sözleşmenin sahibine ilişkin bilgileri içerir;
- Info - blok türüne bağlı olarak nesne hakkında bilgi içerir;
- Parent - üst bloğa bir işaretçi;
- Vars - mevcut blok değişkenlerinin türlerini içeren bir dizi;
- Code - örneğin fonksiyon çağrıları veya döngü gövdeleri gibi kontrol hakları bloğa aktarıldığında yürütülecek bloğun kendisinin bayt kodu;
- Children - fonksiyon iç içe yerleştirme, döngüler, koşullu operatörler gibi alt blokları içeren bir dizi.
ObjInfo Yapısı
ObjInfo yapısı, internal nesneler hakkında bilgi içerir.
type ObjInfo struct {
Type int
Value interface{}
}
ObjInfo yapısı aşağıdaki öğelere sahiptir:
- Type is the object type, which has any of the following values:
- ObjContract – contract;
- ObjFunc - function;
- ObjExtFunc - external golang function;
- ObjVar - variable;
- ObjExtend - $name variable.
- Value – it contains the structure of each type.