• Tidak ada hasil yang ditemukan

Contoh Latar Belakang Pembuatan Makalah - Makalah

N/A
N/A
Protected

Academic year: 2017

Membagikan "Contoh Latar Belakang Pembuatan Makalah - Makalah"

Copied!
29
0
0

Teks penuh

(1)

BAB I

PENDAHULUAN

1.1. Latar Belakang

Pada saat ini, teknologi di bidang industri game semakin hari semakin berkembang pesat, sehingga teknologi yang sebelumnya hanya berupa anganangan, kini bisa menjadi kenyataan seiring dengan semakin canggihnya hardware grafik yang disediakan oleh vendor-vendor seperti nVidia dengan GeForce seriesnya dan ATI dengan Radeon series-nya. Kendati demikian, hardware-hardware canggih tersebut hanya akan menjadi sia-sia saja tanpa adanya dukungan dari teknologi software yang mutakhir yang disediakan oleh para pengembang game. Ada sisi lain dari game yang membuat seorang pemain game atau seorang programmer merasa tertarik untuk memainkan dan merancang ulang game yang mereka sukai. Itulah yang kita sebut dengan game modifikasi, atau disingkat dengan MOD Game.

Apabila kita soroti lebih lanjut mengenai MOD Game, maka pembahasan kita tidak akan lari dari Software Development Kit (SDK) game itu sendiri. Dimana pada era tahun 90-an, perusahaan-perusahaan pengembang game mengeluarkan SDK dari game mereka dalam bentuk bahasa C/C++, yang notabene membutuhkan keahlian seorang programmer menengah ke atas untuk memahami kode sumber (source code) dari game SDK tersebut. Hal inilah yang menjadi salah satu rintangan terbesar bagi sebagian programmer/user pemula yang sedang mencoba membuat game dari SDK tersebut, karena mereka hanya memiliki keahlian yang bisa kita katakan biasa-biasa saja, dalam artian mereka tidak menguasai bahasa pemrograman C/C++. Tetapi, di era tahun 2000-an, peta dunia industri game mulai mengalami revolusi seiring dengan banyak digunakannya teknik kompilasi untuk mengatasi rintangan tersebut, sehingga seorang programmer tidak perlu menguasai bahasa pemrograman C/C++ untuk membuat game.

▸ Baca selengkapnya: contoh latar belakang laporan kunjungan industri

(2)

user, sehingga dipahami oleh Game Engine untuk melakukan serangkaian aksi yang dikehendaki oleh user. Sedangkan Game Engine adalah sebuah program yang menyediakan semua fungsi pustaka yang dibutuhkan oleh Scripting Engine, dimana nantinya akan digunakan oleh programmer/user untuk mengontrol dan membuat tampilan grafis di komputer, baik itu tampilan 2 dimensi maupun 3 dimensi. Sehingga apabila kita gambarkan, maka akan kita dapatkan sebuah layer game sebagai berikut :

Pada skema di atas, kita lihat bahwa Scripting Engine ada di atas layer Game Engine, yang berarti bahwa Scripting Engine membutuhkan Game Engine dalam kerjanya, yang kemudian dengan menggunakan Scripting Engine, seorang pembuat script game tidak perlu lagi memikirkan hardware dari platform target dimana kita akan membuat game. Dengan kata lain, kita hanya perlu membuat kode script game satu kali saja untuk semua platform, baik itu Windows, Linux, XBOX maupun PlayStation 2, dan sisanya kita biarkan Game Engine yang menangani fungsi pustaka yang berkaitan dengan sistem operasi dan perangkat keras dari mesin target dimana kita akan membuat game.

1.2. Identifikasi Masalah

(3)

1. Sulitnya bagi pemula untuk memahami bahasa pemrograman game yang ada sekarang ini, karena mayoritasnya ditulis dalam bahasa C/C++.

2. Kendala bagi perusahaan pengembang dalam mengembangkan game yang dapat berjalan di segala platform, karena adanya batasan pustaka pada masing-masing platform, seperti PC, Apple, XBOX, PS2, dan GameCube.

3. Tidak populernya suatu game di kalangan mod game programmer, karena tidak adanya kemudahan dalam hal maintenance dari game SDK-nya.

1.3. Batasan Masalah

Pembahasan dalam pembuatan bahasa pemrograman game penulis batasi ke dalam hal-hal berikut, antara lain:

1. Pembahasan konsep bahasa hanya akan berkisar pada pembahasan dasar teknik kompilasi, seperti lexical analyzer, parser, dan lainnya.

2. Pembahasan Game Engine berada di luar dari bahasan tulisan ini.

3. Pendekatan yang digunakan dalam pembahasan lebih ke arah pemrograman dengan menggunakan tool-tool yang sudah ada, seperti : C, flex, dan bison.

1.4. Maksud dan Tujuan Penulisan

Maksud disusunnya tulisan ini adalah agar pembuatan game di masa yang akan datang bisa lebih mudah dipelajari dan terbuka bagi para pemula. Tujuan penggunaan Scripting Engine yang paling menonjol dari sisi pengguna game adalah bahwa seorang pemain game yang memiliki keahlian pemrograman dapat membuat MOD Game yang dia kehendaki dengan menggunakan bahasa pemrograman yang sangat bersahabat dan mudah di pahami, yang kesemuanya itu telah disediakan oleh Scripting Engine, sehingga user tersebut tidak lagi memerlukan keahlian dalam menguasai bahasa pemrograman C/C++ untuk membuat MOD Game yang dia kehendaki.

(4)

yang dapat berjalan di mesin XBOX, PC (Windows, Linux), dan PlayStation 2, pengembang game cukup membuat kode script dari game tersebut hanya satu kali saja, sehingga hal ini akan menekan biaya produksi dan mempersingkat waktu pembuatan game.

1.5. Metodologi Penelitian

Dalam metode penelitian ini ada beberapa tahap yang harus dilakukan, yaitu : 1. Metode yang digunakan dalam penulisan ini adalah :

a. Studi Pustaka : Yaitu mengumpulkan literatur berupa buku-buku, jurnal internet, dan tutorial-tutorial yang berhubungan dengan penelitian yang penulis lakukan. b. Eksperimen : Yaitu penulis melakukan percobaan berupa “trial and error” pada

bahasa pemrograman C/C++ guna mempelajari tingkah laku dari objek penelitian yang penulis amati secara nyata.

2. Alat dan bahan.

a. Perangkat Lunak yang digunakan, antara lain :

1. Untuk sistem operasi, penulis menggunakan Microsoft Windows XP Service Pack 1. 2. Untuk bahasa pemrograman, penulis menggunakan C/C++ dengan program Microsoft

Visual Studio .NET 2003.

3. Untuk program bantu dalam perancangan lexical analyzer dan parser, penulis menggunakan Flex dan Bison.

4. Untuk Game Engine komersil sebagai sarana uji coba, penulis menggunakan Torque Game Engine, yang merupakan adaptasi produk dari perusahaan Dynamix (anak perusahaan Sierra).

b. Perangkat keras yang digunakan, antara lain : 1. AMD Athlon XP 2200+

2. Memory 512MB

3. Hard Disk 30GB dan 20GB

(5)
(6)

BAB II

LANDASAN TEORI

2.1. Bahasa Pemrograman Game

Pada umumnya, bahasa pemrograman adalah sebuah antarmuka yang menjembatani antara pikiran seorang manusia yang cenderung tidak terstruktur dengan komputer yang melakukan eksekusi secara sekuensial. Bahasa pemrograman juga dapat membuat suatu masalah yang kompleks menjadi mudah dipahami. Dan dalam hubungannya dengan hirarki, maka bahasa pemrograman dapat dibagi menjadi :

1. Bahasa Mesin, dimana bahasa ini merupakan bahasa terendah dari komputer, yang perintah-perintahnya dinyatakan berupa kode numerik dan spesifik terhadap mesin tertentu.

2. Bahasa Assembly, merupakan bentuk simbolik dari bahasa mesin.

3. Bahasa Tingkat Tinggi, merupakan bahasa yang paling mudah dimengerti oleh manusia, dan memiliki struktur yang sangat baik dalam pemrogramannya.

4. Bahasa Spesifik (Special Purpose), merupakan bahasa yang khusus diciptakan untuk membantu menyelesaikan masalah yang spesifik.

Bila dilihat dari fungsi dan kemudahnnya, maka sebuah bahasa pemrograman game akan kita bentuk berdasarkan poin nomor tiga, yaitu bahasa tingkat tinggi yang lebih mudah dipahami oleh pengguna, juga memiliki struktur pemrograman yang sangat baik.

2.2. Model Kompilator

Setelah menentukan tipe bahasa yang akan kita pilih, maka selanjutnya adalah perancangan model kompilator yang terbagi menjadi 2 bagian, yaitu :

1. Fungsi Analisis (Front End)

(7)

Tugas fungsi sintesis adalah untuk melakukan optimasi dan membangkitkan kode yang akan dieksekusi.

Berikut ini adalah model dari sebuah kompilator :

Char token syntax correct intermediate optimized

Stream stream tree synt.tree code int.code bytecode

Gambar 2.1 Model Kompilator

Dari gambar di atas, kita mendapatkan adanya komponen-komponen kompilator sebagai berikut :

• Tabel simbol (Symbol Table), adalah sebuah tabel yang berisi simbol – simbol dan informasi mengenai tipe data dan hal-hal lainnya yang diperlukan oleh sebuah kompilator dalam proses kompilasi.

• Analisis Lexical (Lexer), adalah sebuah komponen yang berfungsi untuk mengkonversi atau menterjemahkan kumpulan-kumpulan karakter (biasanya berupa file yang disebut dengan source code) ke dalam besaran - besaran token, sehingga dari token-token tersebut, kompilator bisa membuat keyword (kata kunci), operator, dan yang selainnya.

• Parser, adalah komponen dari kompilator yang berfungsi untuk mengambil token-token yang telah dikonversi oleh lexer, sehingga parser dapat menciptakan sebuah pohon sintaks dari token-token tersebut.

• Analisis semantik (Semantic Checker), adalah komponen dari kompilator yang memeriksa ada atau tidaknya kesalahan yang terdapat di dalam pohon sintaks yang telah diciptakan oleh parser.

(8)

• Pembangkit kode antara (Intermediate Code Generator), adalah sebuah komponen dari kompilator yang berfungsi untuk menterjemahkan pohon sintaks menjadi kode antara yang nantinya akan dipergunakan oleh pembangkit kode.

• Optimasi (Optimizer), adalah komponen yang berguna untuk mengoptimalkan kode antara, agar tidak terjadi redundansi dan cepat dalam proses eksekusinya.

• Pembangkit kode (Bytecode Generator), adalah komponen kompilator yang berfungsi untuk membangkitkan kode-kode dalam satuan byte (bytecode) yang merupakan hasil terjemah dari kode antara.

• Dan yang terakhir adalah sebuah Virtual Machine (Mesin Virtual) yang berfungsi untuk mengeksekusi setiap kode-kode byte (bytecode) yang telah dibangkitkan oleh pembangkit kode.

Dari beberapa komponen di atas, terjadi ketergantungan yang sangat tinggi antara parser dengan lexer, sehingga bila diteliti dari cara kerjanya, maka antara lexer dengan parser terdapat 2 kemungkinan, yaitu :

1. Lexer menghasilkan token-token untuk diproses oleh parser, dan parser akan memanggil lexer secara kontinu bila parser membutuhkan token berikutnya.

2. Lexer menghasilkan token-token dari source program, tetapi tidak diberikan kepada parser untuk diproses, karena pada kasus ini lexer memeriksa keseluruhan source program, sehingga konsep ini disebut separate pass. Dan kita tidak akan menggunakan konsep ini dalam perancangan.

(9)

2.3. ANALISIS LEKSIKAL

Bila kita teliti dari beberapa manual bahasa pemrograman yang sudah ada sekarang ini, maka token-token yang dihasilkan lexer secara garis besar, dapat kita klasifikasikan sebagai berikut :

1. Keyword (Reserved Word), merupakan sekumpulan token yang sudah disediakan oleh kompilator yang bersangkutan, guna mempermudah dalam hal perancangan program.

2. Identifier, merupakan token yang berfungsi sebagai pengenal dalam sebuah program. Contohnya adalah nama variabel.

3. Operator, merupakan sekumpulan token yang digunakan dalam proses aritmetika, konkatenasi, operasi logika dan hal-hal lainnya yang membentuk sebuah ekspresi. 4. Delimiter, merupakan token pemisah yang memisahkan antara token yang satu

dengan lainnya.

5. White Space character, merupakan karakter spasi yang memisahkan antara satu token dengan token lainnya.

6. Token konstanta, merupakan token yang berfungsi sebagai nilai dari variabel.

2.4. ANALISIS SINTAKS (PARSER)

Pada umumnya terdapat dua macam metode dalam mengAnalisis sintaks, antara lain :

1. Metode Top-Down, dimana metode ini memulai proses parsing dari parent rule (aturan induk) ke child rule (aturan anak), yang terbagi lagi menjadi dua bagian :

a. Metode Brute Force, merupakan metode yang menggunakan algoritma yang mencoba setiap kemungkinan dari aturan produksi yang ada.

b. Metode Recursive Descent Parser, merupakan metode yang menggunakan algoritma yang membuat prosedur dari setiap kemungkinan yang ada dari aturan produksi.

(10)
(11)

BAB III

PERANCANGAN SCRIPTING ENGINE

Pembuatan sebuah Scripting Engine pada dasarnya adalah membuat sebuah bahasa baru dan bisa disebut juga sebagai kompilator yang baru. Sehingga apabila kita membuat bahasa yang baru, maka bahasa tersebut diharapkan dapat dipelajari semudah mungkin oleh pengguna/programmer. Maka, untuk membuat sebuah kompilator, kita akan merujuk pada model kompilator, yaitu dimulai dari pembuatan sebuah lexer, kemudian parser, dan seterusnya berikut ini:

3.1. Analisis Leksikal/Lexical Analyzer (Lexer)

Sebelumnya, mari kita lihat sebuah bahasa yang akan kita buat berikut :

print "Masukkan nama anda > ";

input nama;

if (nama == "Suhendra") {

nama = "Batavian Script"; }

print "Terima Kasih, " +nama+ "!\n" + "atas

partisipasinya!";

Kode di atas adalah sebuah kode yang menyatukan aturan bahasa basic dengan bahasa C. Tetapi, apa hubungan antara kode di atas dengan lexical analyzer/lexer? Kita akan bahas sebagai berikut.

(12)

Pada dasarnya, kita dapat dengan mudah membuat sebuah lexer dengan cara membuat fungsi yang membandingkan setiap kata dengan kata kunci yang ada, tetapi cara ini sangatlah lambat, sehingga untuk itu kita akan menggunakan sebuah mesin automata (Finite State Machine) dalam mengenali kata dari sekumpulan karakter. Dalam hal ini, ada sebuah program yang dikeluarkan oleh GNU yang diberi nama Flex yang akan mempermudah kerja kita dalam membuat Finite State Machine untuk sebuah lexer.

3.2. Parser

Parser adalah sebuah komponen yang bertugas untuk membuat pohon sintaks dari besaran-besaran token yang dihasilkan oleh lexer. Jadi, yang kita fokuskan di sini adalah sintaks dari bahasa yang akan kita buat. Dan agar lebih memahami mengenai sintaks, kita bisa melihat contoh berikut: Misalkan ada sekumpulan token yang terdiri dari (x==2), exit, if. Maka, apabila kita biarkan token-token tersebut tanpa dibuat aturan sintaksnya, pada akhirnya bahasa yang kita buat tidak akan logis dan jelas, karena token-token tersebut dapat menimbulkan ambiguitas, sehingga dari token-token tersebut kita bisa saja membuat sintaks exit (x==2) if, atau sintaks (x==2) exit if. Dimana bentuk sintaks-sintaks tersebut akan mempersulit seorang programmer/user dalam memahami bahasa yang kita rancang, karena sintaks-sintaksnya yang cenderung tidak logis dan sulit dipahami. Untuk itu, agar mudah dipahami, sintaks dari token-token tersebut seharusnya dibuat sebagai berikut : if (x==2) exit. Sehingga sintaks ini lebih masuk akal dan mudah dipahami daripada dua sintaks sebelumnya. Untuk tujuan inilah parser diciptakan.

(13)

<V> ::= <V> T <V2> | <V3>

Sedangkan untuk aturan pemrograman, penulisannya sebagai berikut :

v : v ‘+’ v2 | v3;

Dimana v, adalah simbol non-terminal dan t adalah simbol terminal.

Selanjutnya, kita harus memikirkan bagaimana cara kita memparsing token-token yang ada. Sehingga dari token-token tersebut, kita bisa membuat aturan produksi yang selanjutnya dapat kita gunakan dalam proses parsing. Dan dalam sebuah penciptaan kompilator, dikenal dua buah metode parsing yang sangat populer, yaitu Top Down parsing dan Bottom Up parsing. Pada Top Down parsing, kita cenderung melakukan proses parsing dari parent rule (aturan induk), baru kemudian dilanjutkan ke child rule (aturan turunan). Pada metode ini, dikenal 2 buah algoritma parsing, yaitu Brute Force dan Recursive Descent Parser. Brute Force merupakan sebuah algoritma yang mencocokkan semua aturan produksi yang ada, sehingga prosesnya cenderung sangat lambat. Sedangkan Recursive Descent Parser adalah algoritma yang menggunakan cara rekursif dalam menurunkan aturan produksinya, dan algoritma ini cenderung lebih cepat dari algoritma Brute Force.

(14)

3.3. Tabel Simbol

Tabel simbol, seperti namanya, adalah sebuah tabel yang mengandung semua simbol yang diperlukan oleh bahasa yang akan kita ciptakan. Dalam kasus ini adalah semua variabel string, dan konstanta string juga termasuk ke dalamnya. Jika bahasa yang akan kita ciptakan mengandung kelas-kelas (classes) dan fungsifungsi (functions), simbol-simbol ini juga akan di simpan di dalam tabel simbol-simbol.

Tabel simbol di bawah ini hanya mengandung sedikit informasi, yaitu hanya menyimpan nama variabel dan nomor baris di mana variabel tersebut dideklarasikan. Implementasinya sangatlah sederhana, dimana kita hanya menciptakan sebuah single linked list (larik/array dinamis satu arah) dari deskripsi simbol dan melakukan pencarian pada list tersebut secara linear ketika kita menerima input sebuah simbol yang baru. Tetapi untuk kompilator yang sesungguhnya, tabel simbol biasanya diciptakan menggunakan algoritma binary search atau hash table, sehingga pencarian simbol bisa menjadi lebih cepat.

Kita hanya perlu memasukkan simbol-simbol kita ke dalam tabel symbol ketika parser menemukan mereka, lihatlah implementasinya dalam format file input bison :

(15)

Untuk pohon sintaks, kita hanya perlu menciptakan sebuah kelas sederhana yang kita beri nama TreeNode, dimana fungsinya hanya menyimpan pointer ke leaves (daun) dan beberapa informasi tambahan. Lihat contoh di bawah ini.

Kode di atas adalah aturan yang digunakan pada file input bison, alat yang kita gunakan untuk menciptakan parser. Untuk lebih memahaminya, silakan baca manual bison yang bisa didapatkan pada website GNU bison.

3.5. Analisis Semantik

Analisis semantik dilakukan untuk memastikan bahwa tidak hanya sintaks bahasanya saja yang benar, tetapi statement-statementnya pun masuk akal dan logis. Bagian terbesar dari Analisis semantik adalah pemeriksaan tipe data. Fungsi lainnya adalah membandingkan tipe ekspresi dan melaporkan adanya inkonsistensi, seperti membandingkan antara variabel boolean dengan string, atau memasukkan tipe data yang salah pada parameter sebuah fungsi.

Tentu saja, kita juga ingin memperbolehkan adanya beberapa “inkonsistensi”. Sebagai contoh, ketika seorang programmer memasukkan statement berikut :

print "a and b equal: " + (a == b);

(16)

kita sebut dengan koersi. Inkonsistensi macam ini terkadang kita perbolehkan guna memberikan keluwesan dalam bahasa yang kita ciptakan.

Kode yang harus kita ciptakan untuk Analisis semantik tidak harus kompleks. Kita hanya perlu menambahkan sebuah metode pada kelas yang pernah kita bahas sebelumnya, yaitu TreeNode, dimana metode ini berfungsi sebagai Analisis semantik. Dan untuk implementasi selanjutnya, hal ini tergantung kepada sifat masing-masing programmer untuk menerapkan algoritma-algoritma yang efisien dalam perancangan Analisis semantik.

3.6. Pembangkit Kode Antara

Kode antara adalah sebuah graf yang merepresentasikan program kita, dimana setiap instruksi memiliki pointer ke instruksi lainnya, dan setiap operasi jump memiliki pointer ke target instruksi yang dimaksud.

Penulis bisa menyebutkan dua keuntungan dengan digunakannya pointer daripada menggunakan pembangkitan kode secara langsung ke dalam sebuah larik/array yang sangat besar. Pertama, dengan digunakannya pointer, kita dimudahkan dalam hal konkatenasi dari potongan-potongan kode secara bersamaan, bahkan pemotongan beberapa instruksi bisa dilakukan dengan mudah tanpa perlu mengupdate semua operasi jump yang ada pada graf kita, sehingga hal ini relatif lebih mudah untuk dilakukan. Kedua, jika kita ingin mengubah beberapa instruksi dalam mesin virtual, kita akan lebih mudah mengadaptasikan kompilator kita untuk melakukannya.

Jadi, kita akan mendesain sebuah bahasa kode antara berdasarkan patokan-patokan di atas. Lihatlah kode mesin virtual berikut (ditulis dengan bahasa C):

enum Opcode {

OP_NOP, // tidak ada operasi

(17)

OP_INPUT, // ambil string [var]

OP_JMP, // unconditional jump [dest]

OP_JMPF, // jump jika bernilai false [dest] OP_STR_EQUAL, // test apakah dua buah string sama OP_BOOL_EQUAL, // test apakah dua buah boolean sama

OP_CONCAT, // konkatenasi dua buah strings OP_BOOL2STR, // konversi boolean ke string

JUMPTARGET // bukan opcode tetapi sebuah jump target;

};

Kita bisa melihat bahwa mesin virtual ini akan berbentuk sebuah mesin stack. Kemudian mari kita lihat bagaimana kode antara diciptakan.

Pertama, kita gunakan perintah case sederhana, dengan node INPUT_STMT :

Kode ini hanya membangkitkan instruksi OP_INPUT, kemudian mengembalikan hasilnya. Selanjutnya adalah node PRINT_STMT yang agak sedikit lebih sulit:

Pertama, kita membangkitkan kode yang mengevaluasi ekspresi yang disuplai oleh statement print (root->child[0]). Kemudian kita menciptakan sebuah instruksi OP_PRINT yang baru, yang berfungsi untuk menyimpan string ke puncak stack. Akhirnya kita mengkonkatenasi dua blok instruksi dan mengembalikan hasilnya.

(18)

Catatan, rootÆchild[0] adalah sub-pohon-kondisi, sedangkan rootÆchild[1] adalah sub-pohon-then. Coba lihat hasil konversi di bawah ini:

Program:

if (a==b) a; else b;

Intermediate code:

1: OP_NOP

2: OP_PUSH a

3: OP_PUSH b

4: OP_STR_EQUAL

5: OP_JMPF 9

6: OP_PUSH a

7: OP_DISCARD

8: OP_JMP 12

9: JUMPTARGET 5

10: OP_PUSH b

11: OP_DISCARD

12: JUMPTARGET 8

Kode di atas adalah kode assembly virtual, yang pada dasarnya, kita hanya perlu membuat sebuah program assembler yang akan membangkitkan sebuah Virtual Executable (kode eksekusi virtual).

(19)

sebelumnya. Karena kita akan mengeksekusi dalam mesin virtual, optimasi menjadi hal yang sangat penting: setiap instruksi kita sekurangkurangnya akan membutuhkan 20 instruksi CPU dalam proses pengeksekusian. Jadi, semakin sedikit instruksi, maka akan semakin baik.

Di sini kita akan membahas mengenai optimasi bebas mesin. Optimasi yang bergantung pada mesin adalah topik lain yang tidak akan dibahas di sini, dimana kita harus mempertimbangkan efisiensi pipeline, penggunaan register, dan hal lainnya. Dan tentu saja, optimasi yang bergantung pada mesin hanya kita butuhkan jika kita membuat kode yang akan berjalan di atas hardware, yang tentu saja tidak kita butuhkan untuk mesin virtual. Terdapat dua cara penting untuk mengoptimasi kode. Pertama adalah dengan menterjemahkan kode sehingga menggunakan sedikit instruksi, dan cara lainnya adalah dengan membuat instruksi yang lebih efisien.

3.8. Extra Opcode

Coba kita lihat contoh assembly virtual berikut: 1: OP_NOP

Perhatikan beberapa hal berikut: pertama, pada tiga tempat pada kode di atas terdapat

(20)

3.9. Transformasi Kode

Cara lain untuk mengoptimasi kode adalah dengan cara mentransformasikannya menjadi kode lain yang melakukan hal yang sama tetapi lebih cepat dalam eksekusi. Dalam transformasi kode, ada beberapa algoritma yang dapat kita gunakan, antara lain :

1. Algebraic Identities.

2. Common Subexpression Elimination. 3. Loop Optimizations.

4. Jump Eliminations.

Dimana algoritma-algoritma di atas dapat kita gunakan dalam mentransformasikan kode menjadi kode lain yang lebih cepat, dan disesuaikan dengan algoritmanya masing-masing. Tetapi tulisan ini tidak akan membahas algoritma-algoritma tersebut, karena akan memakan banyak ruang. Sehingga, untuk mempelajarinya kita bisa membaca literatur-literatur yang membahas lebih jauh mengenai algoritma-algoritma tersebut.

3.10. Mesin Virtual (Virtual Machine)

Setelah kita membangkitkan kode antara, selanjutnya kita harus menterjemahkannya menjadi kode eksekusi (executable code), sehingga kita dapat mengeksekusi sebuah program. Tetapi ada baiknya kita menciptakan sebuah mesin virtual terlebih dahulu.

Mesin virtual adalah sebuah komponen yang sangat penting dari sebuah Scripting Engine. Komponen ini adalah sebuah tempat di mana kode-kode dieksekusi secara run-time, sehingga diharapkan mesin virtual ini bekerja dengan sangat cepat.

(21)

adanya manipulasi stack yang banyak dibutuhkan, seperti sebuah PUSH untuk setiap operand dan POP untuk mengambil setiap hasilnya.

Kebanyakan CPU pada saat ini memiliki register, dimana register ini lebih banyak digunakan daripada stack, dan mesin ini disebut dengan Load/Store Machine. Ada pula beberapa prosesor yang hanya beroperasi pada data memori, dan tidak ada stack dan register yang digunakan. Jenis ini dikenal dengan Three-Address Machine. Sedangkan untuk mesin virtual, mesin stack lebih mudah untuk diimplementasikan, karena kita tidak memerlukan adanya variabel temporer untuk menyimpan hasil sementara ketika kita sedang menghitung sebuah ekspresi. Pada mesin virtual yang sudah ada sekarang ini, ada beberapa yang menggunakan mesin stack seperti Java Virtual Machine.

Mesin virtual yang akan kita ciptakan tidak akan terlalu kompleks. Bagian-bagian penting dari virtual mesin kita antara lain adalah : sebuah larik/array instruksi, sebuah tabel string dan sebuah stack. Mesin virtual ini juga memiliki 3 fungsi interface utama, yaitu : Reset, Read dan Execute.

Larik instruksi mengandung instruksi-instruksi dalam program kita. Sedangkan tabel string adalah larik pointer yang bisa bernilai NULL (kosong) atau menunjuk pada sebuah string yang digunakan.

Stack kita disusun atas integer (bilangan bulat). Dimana stack ini menunjuk pada tabel string, sehingga kita bisa mengetahui string apa yang terdapat dalam stack.

Fungsi interface ‘Reset’ digunakan untuk menginisialisasi ulang mesin virtual kita. Dimana isinya hanya berupa kode sederhana. Fungsi interface ‘Read’ akan membaca program kita. Dan ‘Execute’ akan mengeksekusi program kita di memori.

(22)

3.11. Kode Eksekusi (Executable Code)

(23)

BAB IV

IMPLEMENTASI PADA SCRIPTING ENGINE KOMERSIL

TORQUE SCRIPT

Setelah proses perancangan, maka kita perlu melihat bagaimana cara kerja dari scripting engine yang sesungguhnya. Pada bab ini, penulis akan membahas secara singkat mengenai Torque Script yang menerapkan semua teknik perancangan yang dibahas pada bab sebelumnya. Torque Script merupakan bahasa native yang digunakan oleh Torque Game Engine sebagai layer di atas layer Game Engine yang digunakan agar seorang user/programmer dapat mengubah game mereka tanpa harus mengkompilasi ulang dengan bahasa C/C++, dan script yang telah mereka buat dapat dijalankan di beberapa platform. Torque Game Engine yang merupakan produk yang dibeli oleh GarageGames Inc. dari Dynamix (anak perusahaan Sierra), pada saat tulisan ini ditulis telah berjalan di tiga platform sistem operasi, yaitu : GNU Linux, Apple Macintosh dan Microsoft Windows. Torque Script memiliki kompilator otomatis yang terintegrasi ke dalam Torque Game Engine, dan mesin virtualnya bersifat built-in, yaitu disatukan dengan kompilator. Proses kompilasi dan eksekusinya cukup cepat, sehingga Torque Script menjadi salah satu Scripting Engine yang handal.

Pada prakteknya, lexical analyzer Torque Script dibuat menggunakan perangkat lunak lex yang terkenal, sehingga lexer dari Torque Script berbentuk mesin automata (Finite State Automata), dan proses konversi aliran karakter dari file script menjadi besaran token sangatlah cepat.

(24)

(geser dan reduksi token) berlangsung seketika, sedangkan pada rekursif kanan, proses shift didahulukan hingga semua token tersimpan di stack, apabila semuanya sudah tersimpan, kemudian proses reduce dilakukan. Hal ini jelas membuktikan bahwa rekursif kanan akan menyebabkan pemborosan stack memory yang sangat diperlukan oleh Torque Game Engine. Pendapat ini juga dipegang oleh Allen I. Hollub dalam bukunya “Compiler Design in C’.

Pada bentuk bahasanya, Torque Script cenderung menggabungkan beberapa gaya pemrograman dari bahasa-bahasa yang sudah ada. Berikut adalah sedikit uraian mengenai penggunaan bahasa lain dalam Torque Script:

1. Pada struktur bahasa, Torque Script meniru bahasa Basic yang tidak memiliki struktur, dimana programmer bisa mengetikkan kode di mana saja diinginkan. 2. Pada sebagian besar native keyword, Torque Script meniru bahasa C.

3. Pada keyword fungsi dan objek, Torque Script meniru bahasa pascal, sedangkan untuk penurunan kelas, Torque Script meniru C++. Lihatlah contoh berikut :

function pushFront(%list, %token, %delim) { return %token; }

Keyword function kita dapatkan pada bahasa Pascal. Sehingga kita berasumsi bahwa keyword ini diambil dari bahasa Pascal.

4. Pada tipe data untuk variabel, Torque Script meniru PHP dengan menghilangkan tipe data, yaitu setiap variabel dapat menyimpan tipe data apapun, baik itu string, integer, floating point, dan yang lainnya. Dan untuk kebijakan penggunaan variabel, maka Torque juga menambahkan dukungan untuk variabel lokal. Contohnya adalah : Jika kita membuat variabel di area global, maka variabel kita harus diberi awalan ‘$’, seperti $global = “Suhendra”, tetapi jika kita membuat variabel yang berada dalam area lokal atau dalam sebuah scope/fungsi, maka variabel kita harus diberi awalan ‘%’, seperti %lokal = “Ainasoft Co. Ltd.”.

(25)

function pushFront(%list, %token, %delim)

{

if (%list !$= "")

return %token @ %delim @ %list; return %token; }

function pushBack(%list, %token, %delim) {

if (%list !$= "")

return %list @ %delim @ %token; return %token; }

Seperti sudah disinggung sebelumnya, Scripting Engine yang kita rancang berada di atas layer Game Engine, dimana hal ini memberikan pengertian bahwa Scripting Engine kita akan dapat memberikan kemampuan dalam membuat game. Demikian pula dengan Torque Script. Torque Script memiliki semua kemampuan yang diberikan oleh layer di bawahnya yaitu Torque Game Engine.

(26)

Gambar 4.1 Contoh game yang dibuat dengan Torque Script Torque Script diberi pustaka spesifik oleh Torque Game Engine, sehingga Torque Script dapat menghasilkan game seperti gambar di atas.

Pertanyaan, dapatkah kita membuat game seperti di atas? Dan bagaimana memulainya? Jawabannya ya, dan kita dapat memulainya dengan terlebih dahulu membuat sebuah Scripting Engine yang sangat handal. Sehingga, proses debugging akan menjadi lebih mudah dan transparan.

(27)

BAB V

KESIMPULAN DAN SARAN

5.1. Kesimpulan

Dalam proses perancangan suatu bahasa pemrograman game, maka seorang perancang wajib mengetahui aturan-aturan dasar dari perancangan sebuah bahasa pemrograman. Sehingga apabila kita paparkan secara ringkas, maka sebuah bahasa akan mencakup komponen-komponen berikut :

• Tabel simbol (Symbol Table)

Tabel yang berisi simbol-simbol dan informasi mengenai tipe data dan hal – hal lainnya yang diperlukan oleh sebuah kompilator dalam proses kompilasi.

• Analisis Lexical (Lexer)

Komponen yang berfungsi untuk mengkonversi atau menterjemahkan kumpulan-kumpulan karakter (biasanya berupa file yang disebut dengan source code) ke dalam besaran-besaran token, sehingga dari token-token tersebut, kompilator bisa membuat keyword (kata kunci), operator, dan yang selainnya.

• Parser

Komponen dari kompilator yang berfungsi untuk mengambil token-token yang telah dikonversi oleh lexer, sehingga parser dapat menciptakan sebuah pohon sintaks dari token-token tersebut.

• Analisis semantik (Semantic Checker)

Komponen dari kompilator yang memeriksa ada atau tidaknya kesalahan yang terdapat di dalam pohon sintaks yang telah diciptakan oleh parser.

• Pembangkit kode antara (Intermediate Code Generator)

Komponen dari kompilator yang berfungsi untuk menterjemahkan pohon sintaks menjadi kode antara yang nantinya akan dipergunakan oleh pembangkit kode.

• Optimasi (Optimizer)

Komponen yang berguna untuk mengoptimalkan kode antara, agar tidak terjadi redundansi dan cepat dalam proses eksekusinya.

(28)

Komponen kompilator yang berfungsi untuk membangkitkan kode-kode dalam satuan byte (bytecode) yang merupakan hasil terjemah dari kode antara.

• Virtual Machine (Mesin Virtual)

Komponen yang berfungsi untuk mengeksekusi setiap kode-kode byte (bytecode) yang sudah dibangkitkan oleh pembangkit kode.

Dalam perancangan komponen-komponen kompilator, kita harus memastikan bahwa setiap komponen yang kita buat dapat berjalan dengan baik dan sesuai dengan yang diharapkan dari masing-masing kompilator.

5.2. Saran

Kemudian, agar mudah dipahami, seorang perancang bahasa sangat disarankan membuat aturan produksi sebaik mungkin, sehingga bahasa yang dirancangnya mudah dipelajari oleh para pengguna dan programmer. Selain itu, sebuah bahasa yang baik juga harus didukung dengan adanya Debugger yang baik pula, sehingga diharapkan setelah kita membuat kompilator, kita juga membuat sebuah debugger yang berfungsi untuk membantu para programmer dalam mendeteksi adanya error/kesalahan dalam program yang mereka buat.

(29)

DAFTAR PUSTAKA

1. Finney, Kenneth C., 2004, “3D Game Programming All In One”, Boston, Premier Press.

2. Eberly, David H., 2002, “3D Game Engine Design: A Practical Approach to Real-Time Computer Graphics”, London, Morgan Kauffman Publishers.

3. Dawson, Michael, 2004, “Beginning C++ Game Programming”, Boston, Premier Press.

4. Philips Jr., Lorenso D., Lamothe, Andre, 2002, “Game Programming Tricks of The Trade”, Ohio, Premier Press.

5. Bates, Bob, 2003, “Game Developer’s Market Guide”, Boston, Premier Press. 6. Harbour, Jonathan S., Smith, Joshua R., 2003, “Beginner’s Guide To DarkBasic

Programming”, Ohio, Premier Press.

7. Russell, Joseph P., 2001, “Java Programming for the absolute beginner”, Boston, Premier Press.

8. Wells, Martin J., 2004, “J2ME Game Programming”, Boston, Premier Press. 9. Harbour, Jonathan S., 2001, “Pocket PC Game Programming: Using the Windows

CE Game API”, California, Prima Publishing.

10.Penton, Ron, 2004, “MUD Game Programming”, Boston, Premier Press.

Gambar

Gambar 2.1 Model Kompilator
Tabel simbol, seperti namanya, adalah sebuah tabel yang mengandung semua simbol

Referensi

Dokumen terkait

MPO dari penelitian ini mempunyai nilai sensitivitas diagnostik 88,88%, spesifisitas diagnostik 69,23%, nilai ramal negatif 75% dan nilai ramal positif 85,71% sehingga MPO tidak

SALAMI WARGA - Wakil Walikota Pekanbaru H Ayat Cahyadi SSi menyalami seorang warga yang telah menandatangani kesepakatan bersama terkait proyek kegiatan Skala Kawasan Kota

Measurements were taken over a grid (both vertical and laterally) 2 m directly downwind of the nozzle. The last two columns, show i) column 8, the results of total flux for each

Berangkat dari beberapa pernyataan terkait, bisa diartikan bahwa sebenarnya upaya dalam pemberdayaan itu bermacam-macam, namun pada umumnya metode yang sering kali

Hasil uji penetrasi secara in vitro dengan membran lepasan kulit ular menunjukkan penggunaan span 60 sebagai penyusun niosom dalam sediaan gel dapat meningkatkan

BAB II - GAMBARAN PELAYANAN DINAS KESEHATAN, memuat informasi tentang peran (tugas dan fungsi) Dinas Kesehatan dalam penyelenggaraan urusan pemerintahan daerah,

Hasil penelitian yang telah dilakukan dapat menjawab rumusan masalah dan tujuan penelitian bahwa ada perbedaan terhadap kemampuan membaca permulaan siswa tunarungu

Sehingga didapat variabel yang paling dominan sebagai penyebab terjadinya change order yang dialami oleh pihak kontraktor pada proyek konstruksi jalan di Sumatera