anvie
06-05-2010, 05:24 AM
Paralel coding? What de kamsud? Lupakanlah… itu hanya judul buat menarik perhatian pembaca :P. Ok gak pake basa-basi Mungkin kamu sudah tidak asing lagi dengan istilah multi threading, itu loh aplikasi yang dibagi proses rutinnya secara paralel —penjelasan paling sederhana— kalo lum ngerti ato pengen dapet penjelasan yang lebih rumit coba deh jalan-jalan bentar ke wikipedia (http://en.wikipedia.org/wiki/Multithreading).
http://t2.gstatic.com/images?q=tbn:M-bCVGarecrv0M::www.hungry-hackers.com/wp-content/uploads/2010/01/Google_Go.jpg&t=1&h=168&w=301&usg=__RL9A3J2pN1-djiv8Zc1Zdz3nHhM=
Oia sebelumnya aku gak akan pake istilah-istilah serem, yah lebih tepatnya meminimalisir penggunaan istilah-istilah yang resmi di sini buat mempermudah pemahaman terutama bagi para newbie kayag aku, karena istilah2 resmi tersebut akan mereduksi pemahaman terutama dalam penjabaran sebuah paradigma baru... ups...
Belum lama ini Google yang digawangi oleh Ken Thompson cs mendesain sebuah bahasa baru yang disebut dengan GOLANG (google petualang, eh google language). Menurutku bahasa ini unik kenapa? bukan karena dibuat oleh Google ataupun karena lambangnya hewan pengerat, tapi karena siapapun orang dengan latar seorang programmer yang baru aja liat sintaknya pasti serasa akrab, dejavu, karena bahasa ini seperti:
Javascript dengan adanya keyword `var` untuk inisialisasi variable kosong.
Delphi (Pascal family) dengan penampakan operator := (titk dua-sama dengan).
Python dengan adanya keyword `import`, `map` dan multiple return value.
C/C++ karena komentarnya pake dobel slash `//` atau slash bintang `/**/`, dan adanya fungsi entry bernama `main`.
Dan keunikan lain yang lebih aneh bisa kamu temui di website resminya golang. Tentu saja tidak semua fiturnya akan dibahas di sini, karena saya hanya akan membahas tentang salah satu fitur aja yang keren punya, yaitu `goroutine`, apa itu goroutine? kembali lagi ke multi threading, yah goroutine mirip dengan konsep threading, loh lalu apa kelebihannya dong? Beda halnya dengan thread yang menggunakan memory space sendiri atau yang lebih gaul biasa disebut dengan thread context, goroutine / co-routine dapat menjalankan intruksi secara paralel tanpa kehilangan handle context dengan intruksi dimana dia dijalankan, loh kok bisa? Ya bisalah… lebih detail tentang context ini bisa dipelajari di wikipedia tentang context switch (http://en.wikipedia.org/wiki/Context_switch), dan tentang coroutine wikipedia coroutine (http://en.wikipedia.org/wiki/Concurrent_computing).
Nah ngomongin tentang aplikasi yang sifatnya concurrent kayag gini, terutama pada aplikasi multithreading, pasti kamu bakal teringat dengan istilah-istilah nyebelin yang berhubungan dengan shared memory communication (SMC) dan message passing (MP), you know lah SMC bisa diakalin dengan mutex, semaphore, dan event, nah sekarang bagaimana dengan MP? Kalo kamu pernah pake Python Stackless, maka seharusnya kamu tau tentang channel, kalau kamu adalah programmer C++ dan suka Qt, seharusnya kamu tau tentang signal slots, yup, Golang munggunakan methode yang tidak jauh-jauh dengan itu.
Gak pake lama lah, sekarang prakteknya aja deh:
Biar mudah dipahami, saya buatkan contoh yang sangat sederhana menggunakan gambaran cerita, ceritanya gini, ada dua orang, dexlip dan xerion, salah satunya ingin dapat mengirimkan barang menggunakan jasa pak pos.
Contoh #1 kirimkiriman1.go
package main
import (
"fmt"
"os"
"time"
)
func dexlip(pos chan string){
pos <- "ikan"
}
func xerion(pos chan string){
kotak_surat := <- pos
fmt.Printf("Kiriman: %s\n", kotak_surat)
}
func main(){
// summon pak pos dulu
var pak_pos = make(chan string)
fmt.Println("Mulai...")
go dexlip(pak_pos)
go xerion(pak_pos)
fmt.Println("Selesai")
var buf [1]byte
os.Stdin.Read(&buf)
}
Setelah di-kompil dengan cara:
$ 6g kirimkiriman1.go
$ 6l -o test1 kirimkiriman1.go
dan dijalankan hasilnya:
$ ./test1
Mulai...
Selesai
Kiriman: ikan
Bisa dilihat tulisan `Selesai` tercetak terlebih dahulu, padahal ditulis setelah pemanggilan 2 fungsi dexlip() dan xerion(), kenapa begitu? kuncinya ada di keyword `go`, fungsi yang dipanggil dengan keyword ini akan berjalan secara paralel kongkuren, sehingga tidak terjadi blocking, artinya rutin utama tetep jalan tanpa perlu nunggu fungsi yang dipanggil selesai, itulah kenapa tulisan `Selesai` ditulis terlebih dahulu dibanding kan `Kiriman: ikan`.
Nah, sekarang mari kita modifikasi dikit kodenya, kita buat si dexlip ngirimin barang yang lebih banyak.
Contoh #2 kirimkiriman2.go
package main
import (
"fmt"
"os"
"time"
)
func dexlip(pos chan string){
pos <- "ikan"
pos <- "emas"
pos <- "kayu"
pos <- "udahan"
}
func xerion(pos chan string){
for {
kotak_surat := <- pos
if kotak_surat == "udahan" {
break
}
fmt.Printf("Kiriman: %s\n", kotak_surat)
time.Sleep(1000000000) // dalam nanosecond 1 milyar ns = 1 detik
}
fmt.Println("Semua dah terkirim. Pencet apa aja untuk mengakhiri")
}
func main(){
var pak_pos = make(chan string)
fmt.Println("Mulai...")
go xerion(pak_pos)
go dexlip(pak_pos)
fmt.Println("Selesai")
var buf [1]byte
os.Stdin.Read(&buf)
}
Dan hasilnya:
$ ./test2
Mulai...
Selesai
Kiriman: ikan
Kiriman: emas
Kiriman: kayu
Semua dah terkirim. Pencet apa aja untuk mengakhiri
Pada contoh kedua ini, saya buat fungsi xerion (penerima) dipanggil terlebih dahulu sebelum dexlip (pengirim). Mudah kan? Mungkin Anda bertanya? Apa pentingnya methode seperti ini? dan kenapa ini disebut kelebihannya bahasa golang? Akan saya jawab setelah pesan-pesan berikut….
http://t2.gstatic.com/images?q=tbn:M-bCVGarecrv0M::www.hungry-hackers.com/wp-content/uploads/2010/01/Google_Go.jpg&t=1&h=168&w=301&usg=__RL9A3J2pN1-djiv8Zc1Zdz3nHhM=
Oia sebelumnya aku gak akan pake istilah-istilah serem, yah lebih tepatnya meminimalisir penggunaan istilah-istilah yang resmi di sini buat mempermudah pemahaman terutama bagi para newbie kayag aku, karena istilah2 resmi tersebut akan mereduksi pemahaman terutama dalam penjabaran sebuah paradigma baru... ups...
Belum lama ini Google yang digawangi oleh Ken Thompson cs mendesain sebuah bahasa baru yang disebut dengan GOLANG (google petualang, eh google language). Menurutku bahasa ini unik kenapa? bukan karena dibuat oleh Google ataupun karena lambangnya hewan pengerat, tapi karena siapapun orang dengan latar seorang programmer yang baru aja liat sintaknya pasti serasa akrab, dejavu, karena bahasa ini seperti:
Javascript dengan adanya keyword `var` untuk inisialisasi variable kosong.
Delphi (Pascal family) dengan penampakan operator := (titk dua-sama dengan).
Python dengan adanya keyword `import`, `map` dan multiple return value.
C/C++ karena komentarnya pake dobel slash `//` atau slash bintang `/**/`, dan adanya fungsi entry bernama `main`.
Dan keunikan lain yang lebih aneh bisa kamu temui di website resminya golang. Tentu saja tidak semua fiturnya akan dibahas di sini, karena saya hanya akan membahas tentang salah satu fitur aja yang keren punya, yaitu `goroutine`, apa itu goroutine? kembali lagi ke multi threading, yah goroutine mirip dengan konsep threading, loh lalu apa kelebihannya dong? Beda halnya dengan thread yang menggunakan memory space sendiri atau yang lebih gaul biasa disebut dengan thread context, goroutine / co-routine dapat menjalankan intruksi secara paralel tanpa kehilangan handle context dengan intruksi dimana dia dijalankan, loh kok bisa? Ya bisalah… lebih detail tentang context ini bisa dipelajari di wikipedia tentang context switch (http://en.wikipedia.org/wiki/Context_switch), dan tentang coroutine wikipedia coroutine (http://en.wikipedia.org/wiki/Concurrent_computing).
Nah ngomongin tentang aplikasi yang sifatnya concurrent kayag gini, terutama pada aplikasi multithreading, pasti kamu bakal teringat dengan istilah-istilah nyebelin yang berhubungan dengan shared memory communication (SMC) dan message passing (MP), you know lah SMC bisa diakalin dengan mutex, semaphore, dan event, nah sekarang bagaimana dengan MP? Kalo kamu pernah pake Python Stackless, maka seharusnya kamu tau tentang channel, kalau kamu adalah programmer C++ dan suka Qt, seharusnya kamu tau tentang signal slots, yup, Golang munggunakan methode yang tidak jauh-jauh dengan itu.
Gak pake lama lah, sekarang prakteknya aja deh:
Biar mudah dipahami, saya buatkan contoh yang sangat sederhana menggunakan gambaran cerita, ceritanya gini, ada dua orang, dexlip dan xerion, salah satunya ingin dapat mengirimkan barang menggunakan jasa pak pos.
Contoh #1 kirimkiriman1.go
package main
import (
"fmt"
"os"
"time"
)
func dexlip(pos chan string){
pos <- "ikan"
}
func xerion(pos chan string){
kotak_surat := <- pos
fmt.Printf("Kiriman: %s\n", kotak_surat)
}
func main(){
// summon pak pos dulu
var pak_pos = make(chan string)
fmt.Println("Mulai...")
go dexlip(pak_pos)
go xerion(pak_pos)
fmt.Println("Selesai")
var buf [1]byte
os.Stdin.Read(&buf)
}
Setelah di-kompil dengan cara:
$ 6g kirimkiriman1.go
$ 6l -o test1 kirimkiriman1.go
dan dijalankan hasilnya:
$ ./test1
Mulai...
Selesai
Kiriman: ikan
Bisa dilihat tulisan `Selesai` tercetak terlebih dahulu, padahal ditulis setelah pemanggilan 2 fungsi dexlip() dan xerion(), kenapa begitu? kuncinya ada di keyword `go`, fungsi yang dipanggil dengan keyword ini akan berjalan secara paralel kongkuren, sehingga tidak terjadi blocking, artinya rutin utama tetep jalan tanpa perlu nunggu fungsi yang dipanggil selesai, itulah kenapa tulisan `Selesai` ditulis terlebih dahulu dibanding kan `Kiriman: ikan`.
Nah, sekarang mari kita modifikasi dikit kodenya, kita buat si dexlip ngirimin barang yang lebih banyak.
Contoh #2 kirimkiriman2.go
package main
import (
"fmt"
"os"
"time"
)
func dexlip(pos chan string){
pos <- "ikan"
pos <- "emas"
pos <- "kayu"
pos <- "udahan"
}
func xerion(pos chan string){
for {
kotak_surat := <- pos
if kotak_surat == "udahan" {
break
}
fmt.Printf("Kiriman: %s\n", kotak_surat)
time.Sleep(1000000000) // dalam nanosecond 1 milyar ns = 1 detik
}
fmt.Println("Semua dah terkirim. Pencet apa aja untuk mengakhiri")
}
func main(){
var pak_pos = make(chan string)
fmt.Println("Mulai...")
go xerion(pak_pos)
go dexlip(pak_pos)
fmt.Println("Selesai")
var buf [1]byte
os.Stdin.Read(&buf)
}
Dan hasilnya:
$ ./test2
Mulai...
Selesai
Kiriman: ikan
Kiriman: emas
Kiriman: kayu
Semua dah terkirim. Pencet apa aja untuk mengakhiri
Pada contoh kedua ini, saya buat fungsi xerion (penerima) dipanggil terlebih dahulu sebelum dexlip (pengirim). Mudah kan? Mungkin Anda bertanya? Apa pentingnya methode seperti ini? dan kenapa ini disebut kelebihannya bahasa golang? Akan saya jawab setelah pesan-pesan berikut….