A. Definisi metoda dalam kelas
3.3 Perancangan DOGIVM (DOGI Virtual Machine)
3.3.1 Instruksi-instruksi dasar DOGIVM
Instruksi-instruksi yang terdapat pada DOGIVM diperlihatkan pada Tabel 3.14. Panjang instruksi menyatakan panjang instruksi dalam satuan doubleword (32 bit), jumlah pop menyatakan banyaknya anggota stack yang diambil oleh instruksi tersebut, dan return menyatakan banyaknya objek yang didorong oleh instruksi tersebut ke dalam stack.
instruksi panjang (double
word)
jumlah
pop return deskripsi NOP 1 tidak ada operasi
PUSH o 2 1 dorong objek o ke dalam stack PUSHL l 2 1 dorong objek lokal l ke dalam stack PUSHA a 2 1 dorong objek argumen a ke dalam stack PUSHI i 2 1 dorong objek integer bernilai i ke dalam stack PUSHF f 2 1 dorong objek real bernilai f ke dalam stack PUSHB b 2 1 dorong objek boolean bernilai b ke dalam stack PUSHS s 2 1 dorong objek string bernilai s ke dalam stack
PUSHC a 2 1 dorong objek code yang menunjuk alamat a ke dalam stack
PUSHN 1 1 dorong objek null ke dalam stack
POP o 2 1 ambil objek dari stack dan asosiasikan ke objek o POPL l 2 1 ambil objek dari stack dan asosiasikan ke objek lokal
l
POPA a 2 1 ambil objek dari stack dan asosiasikan ke objek argumen a
POPCTX 1 1 ambil objek dari stack dan asosiasikan ke objek konteks
JMP a 2 lompat ke alamat a
IFENTRY 1 1 1 buat suatu instance _if berdasarkan kondisi yang diberikan objek pada puncak stack
IFT 1 2 1 jalankan kode pada puncak stack jika benar IFTE 1 2 1 pilih kode yang akan dijalankan dari array pada
puncak stack
LOOP 1 1 buat suatu instance _loop
LOOPW 1 1 1 buat suatu instance _loop berdasarkan yang diberikan objek pada puncak stack
LOOPI 1 1 1 buat suatu instance _loop berdasarkan jumlah yang diberikan objek pada puncak stack
LOOPA 1 2 1 buat suatu instance _loop berdasarkan array yang diberikan objek pada puncak stack, dan objek di bawahnya untuk menampung elemen array LOOPF 1 3 1 buat suatu instance _loop berdasarkan batas yang
diberikan objek pada puncak stack dan objek di bawahnya
LOOPDO 1 2 1 eksekusi kode yang ada pada puncak stack CALL c m 3 memanggil metoda m dari kelas c
CALLC a 2 mengeksekusi kode pada alamat a
NEW c m 3 1 membuat instance dari kelas c dengan konstruktor m KILL 1 1 1 mendealokasikan objek pada puncak stack
RET 1 kembali pada alamat pemanggil (CALL) RETC 1 kembail pada alamat pemanggil (CALLC) ENDX 1 menandai akhir dari kode
END 1 menandai akhir dari kode KEEP 1 1 menandai stack dengan pembatas
FLUSH 1 * menghapus isi stack dari puncak hingga pembatas yang dibuat dengan KEEP
DISCONST 1 1 1 mengembalikan #true jika objek pada puncak stack dibuat dari literal
pada puncak stack
SUB 1 2 1 mengembalikan hasil pengurangan dari dua objek pada puncak stack
MUL 1 2 1 mengembalikan hasil perkalian dari dua objek pada puncak stack
DIV 1 2 1 mengembalikan hasil pembagian dari dua objek pada puncak stack
NEG 1 1 1 mengembalikan negasi dari objek pada puncak stack (bilangan)
POS 1 1 1 tidak ada operasi
AND 1 2 1 mengembalikan hasil operasi and dari dua objek pada puncak stack
OR 1 2 1 mengembalikan hasil operasi or dari dua objek pada puncak stack
NOT 1 1 1 mengembalikan negasi dari objek pada puncak stack (boolean)
ASSIGN 1 2 1 mengkopi dua objek pada puncak stack REFTO 1 2 1 mereferensikan nama objek pada objek lain ADDREF 1 1 1 menambah reference count
RELEASE 1 1 1 mengurangi reference count REFCOUNT 1 1 1 mengembalikan reference count BASE 1 1 1 mendorong instance ke dalam stack SELF 1 1 1 mendorong instance ke dalam stack
ALTER 1 2 1 mendorong array berisi dua objek pada puncak stack CMPE 1 2 1 membandingkan dua objek pada puncak stack, dan
mengembalikan #true jika keduanya sama, dan #false jika sebaliknya
CMPNE 1 2 1 membandingkan dua objek pada puncak stack, dan mengembalikan #true jika keduanya tidak sama, dan #false jika sebaliknya
CMPG 1 2 1 membandingkan dua objek pada puncak stack, dan mengembalikan #true jika nilai objek pertama > nilai objek kedua, dan #false jika sebaliknya CMPL 1 2 1 membandingkan dua objek pada puncak stack, dan
mengembalikan #true jika nilai objek pertama < nilai objek kedua, dan #false jika sebaliknya CMPGE 1 2 1 membandingkan dua objek pada puncak stack, dan
mengembalikan #true jika nilai objek pertama ≥ nilai objek kedua, dan #false jika sebaliknya CMPLE 1 2 1 membandingkan dua objek pada puncak stack, dan
mengembalikan #true jika nilai objek pertama ≤ nilai objek kedua, dan #false jika sebaliknya SLEN 1 1 1 mengembalikan panjang string pada puncak stack ARRSCNT 1 2 1 mengeset jumlah elemen array pada puncak stack ARRGCNT 1 1 1 mengembalikan jumlah elemen array pada puncak
stack
ARRSITEM 1 3 1 mengeset elemen array pada puncak stack ARRGITEM 1 2 1 mengembalikan elemen array pada puncak stack CONOUT 1 1 1 mencetak representasi dari objek pada puncak stack CONIN 1 1 1 membaca representasi objek dari console dan
mendorongnya ke dalam stack
CONOUTN 1 1 1 mencetak representasi dari objek pada puncak stack (+newline)
CONINN 1 1 1 membaca representasi objek dari console dan mendorongnya ke dalam stack
CDEXEC 1 1 1 mengeksekusi kode yang terdapat pada puncak stack CDVAL 1 1 1 mengembalikan nilai yang dihasilkan oleh kode CDELSE 1 2 1 membentuk array berisi dua objek pada puncak stack CDQT 1 2 1 mengembalikan objek pada puncak stack jika
bernilai benar
CDQTE 1 2 1 mengembalikan objek pertama pada array pada puncak stack jika bernilai benar
Tabel 3.14 Daftar instruksi DOGIVM
3.3.2 Siklus eksekusi instruksi
Siklus eksekusi kode antara DOGI diperlihatkan dalam Gambar 3.21. Instruksi CALL
• Dorong state konteks ke dalam state stack • Kosongkan state konteks,
• Set posisi pada state konteks pada alamat metoda Instruksi RET
• Pop state konteks dari state stack 3.3.3 State
Suatu state dalam DOGIVM terdiri dari:
• Sebuah daftar semua objek yang diinstansiasikan sejak program berjalan, • Sebuah state konteks – yaitu informasi mengenai posisi eksekusi, instance
yang sedang aktif, semua field yang terdapat pada instance tersebut, argumen-argumen metoda yang sedang dieksekusi, dan objek-objek lokal metoda tersebut,
• Sebuah state stack yang menyimpan state konteks ketika ada pemanggilan suatu metoda,
• Sebuah stack evaluasi, yang berisi objek-objek untuk digunakan dalam evaluasi, dan objek hasil evaluasi suatu ekspresi.
Ambil instruksi Eksekusi instruksi Majukan posisi pembacaan Stack kosong? Tidak Ya Reset posisi &
kosongkan stack
start
selesai