teori
description
Transcript of teori
5
BAB II
LANDASAN TEORI
2.1 SEKILAS TENTANG BAHASA ERLANG
Erlang merupakan bahasa pemrograman untuk keperluan umum yang sifatnya
konkuren. Bahasa ini didesain oleh perusahaan Ericsson untuk mendukung aplikasi
yang terdistribusi, soft-real-time dan juga non-stop. Erlang memang awalnya
merupakan bahasa proprietary di dalam lingkungan Ericsson, tetapi akhirnya
dikeluarkan secara open source pada tahun 1998. Implementasi Erlang oleh Ericsson
secara utama sifatnya interpreter, tetapi ia juga dilengkapi dengan kompiler yang
bernama HiPE (tetapi tidak didukung oleh setiap platform) [1].
Membuat dan mengatur proses di dalam Erlang merupakan hal yang sangat
mudah, dimana terkadang threads sering dianggap sebagai sesuatu yang rumit pada
beberapa bahasa pemrograman yang lainnya.
Erlang berasal dari nama A. K. Erlang. Hal ini sering kali menimbulkan salah
kaprah dimana orang sering berpikir Erlang adalah singkatan dari Ericsson Language.
Wajar saja, karena memang Erlang adalah bahasa yang digunakan secara intensif di
kalangan Ericsson [1].
6
2.1.1 KARAKTERISTIK ERLANG Karakteristik dan atribut yang dimiliki oleh antara lain [2]:
1. Concurrent, Erlang memiliki proses yang berbasiskan konkurensi.
Mekanisme konkurensi di dalam Erlang dapat dikategorikan light-weight
proses. Sebagai contoh proses dalam erlang hanya membutuhkan memori
yang sedikit. Selain itu membuat dan menghapus suatu proses hanya
membutuhkan perhitungan yang sedikit begitu juga dengan pengiriman pesan
antar proses.
2. Real-time, Erlang dimaksudkan untuk pemrograman suatu sistem yang Real-
time di mana dalam sistem tersebut dibutuhkan waktu respon yang sangat
cepat.
3. Continuous operation, Erlang memungkinkan penggantian kode walaupun
sistem sedang berjalan dan juga memungkinkan untuk menjalankan suatu
kode yang lama atau yang baru dalam waktu bersamaan. Karakteristik
tersebut sangat berguna dalam suatu sistem yang non-stop.
4. Memory management, Memori dialokasikan secara otomatis ketika
diperlukan, dan didealokasi apabila tidak lagi digunakan.
5. Distribution, Sistem terdistribusi dapat dilakukan dengan mudah dengan
menggunakan Erlang.
7
Erlang sangat cocok untuk aplikasi yang membutuhkan pengolahan sistem
terdistribusi, soft real time, sistem konkurensi, misal untuk sistem telekomunikasi
untuk mengendalikan switch atau pengkonversi protokol. Juga untuk server untuk
aplikasi Internet, misal mail server, WAP server. Bisa juga untuk aplikasi
telekomunikasi, misal untuk messaging layanan mobil. Erlang bisa juga digunakan
aplikasi database yang membutuhkan persyaratan soft real time [3].
Lingkungan pemrograman Erlang telah menyediakan pustaka (library)lengkap
yang disebut OTP (Open Telecommunication Platform). Pustaka ini menyediakan
dukungan yang dapat digunakan untuk menyelesaikan masalah jaringan dan sistem
telekomunikasi. Pustaka OTP yang menyertai Erlang telah memberikan dukungan
seperti [3] :
• Dukungan O&M yaitu untuk penyediaan operasi SASL, EVA, INETS and
SNMP dan berbagai penanganan perawatan sistem melalui web browser atau
SNMP.
• Dukungan CORBA
• Dukungan Database, menggunakan Mnesia dan Mnemosnye untuk database
realtime yang ada di RAM. Ada juga driver untuk database ODBC.
• ASN.1. tersedia kompiler ASN.1 yang menghasilkan kode Erlang. ASN.1
adalah enkode yang banyak digunakan di telekomunikasi
• Pustaka standar, yang berisi koleksi berbagai modul, misal untuk string, list,
regular exporession dan berbagai fungsi standard lainnya.
8
• Komponen struktur, yang dapat digunakan untuk membuat subsystem client
server, state machine dan supervised fault-tolerant system.
• Dukugan GUI dan grafik.
Erlang juga cukup kecil untuk dapat dijalankan di lingkungan embedded,
misal yang menggunakan sistem operasi seperti Linux atau VxWorks. Erlang dapat
dijalankan di prosesor 32 bit dengan RAM 16 MB. Ukuran mesin virtual Erlang
hanyalah 2 MB. Dengan ukuran 2 MB ini sudah terdiri dari mesin virtual (beam
emulator), dan hampir sebagian besar pustaka aseperti stdlib, sasl, kernel, inets dan
berbagai pustaka lainnya. Tapi tentu saja perlu dilakukan kompilasi yang tak
menyertakan informasi debug dan dikompres[3]..
9
2.2 DASAR PEMROGRAMAN ERLANG 2.2.1 Modul 2.2.1.1 Modul Syntax Pengkodean Erlang dipisah dalam beberapa modul. Sebuah modul berisi
atribut dan deklarasi fungsi, masing-masing diakhiri dengan titik(.). Contoh :
-module(m). % module attribute -export([fact/1]). % module attribute fact(N) when N>0 -> % beginning of function declaration
N * fact(N-1); % |
fact(0) -> % | 1. % end of function declaration
2.2.1.2 Modul Attributes Atribut modul mendefinisikan beberapa properti dari sebuah modul. Sebuah
atribut modul terdiri dari sebuah tag dan sebuah nilai.
-Tag(Value). %Tag harus atom
10
2.2.1.3 Pre-Defined Module Attributes Modul yang sudah tersedia dalam Erlang harus diletakkan sebelum deklarasi
fungsi apapun. Contoh :
• -module(Module). %Deklarasi modul. Untuk mendefinisikan nama
modul.
• -export(Functions) %Mendefinisikan fungsi yang dapat digunakan
diluar modul tersebut
• -import(Module, Functions). %Mengambil fungsi dari modul yang lain.
• -compile(Options). %Compiler options.
2.2.2 Fungsi 2.2.2.1 Sintak Deklarasi Fungsi Bentuk umum :
Name(Pattern1A,…..PatternN) ->
BodyA; …; Name(Pattern1B,…..PatternN) -> BodyB; …; Nama fungsi merupakan atom. Setiap argument merupakan pattern. Contoh : fact(N) when N>0 -> % first clause head
N * fact(N-1); % first clause body fact(0) -> % second clause head 1. % second clause body
11
2.2.2.2 Fungsi Built-In Fungsi built-in merupakan fungsi yang sudah disediakan. Contoh : 1> size({a,b,c}). 3 2> atom to list('Erlang'). "Erlang" 2.2.3 Expressions 2.2.3.1 Variable Variabel harus dimulai dengan huruf besar atau underscore (_) dan dapat
mengandung karakter alphanumeric, underscore dan @. Contoh :
X Name1 PhoneNumber Phone_number _ _Height Variabel anynomous dilambangkan dengan underscore (_) dan dapat digunakan
ketika variable dibutuhkan tapi nilainya diabaikan. Contoh :
[H|-] = [1,2,3]
12
2.2.3.2 If
Sama dengan bahasa pemrograman yang lain if digunakan untuk pemilihan.
Bentuk umum :
if
GuardSeq1 -> Body1;
...; GuardSeqN ->
BodyN End Contoh : is greater than(X, Y) ->
if X>Y ->
true; true -> % works as an 'else' branch
false end
13
2.2.3.3 Case Bentuk umum : case Expr of
Pattern1 [when GuardSeq1] -> Body1;
...; PatternN [when GuardSeqN] ->
BodyN End Contoh : is valid signal(Signal) ->
case Signal of {signal, What, From, To} ->
true; {signal, What, To} ->
true; Else ->
false end. 2.2.3.4 Send Send dilambangkan dengan tanda seru (!). digunakan untuk mengirim pesan
antar proses. Bentuk umum :
Expr1!Expr2
Mengirim nilai Expr2 sebagai pesan ke Expr1. Expr1 harus Pid, nama yang telah
deregister(atom) atau tuple {Name,Node}. Dimana Name dan Node adalah atom.
14
2.2.3.5 Receive Digunakan untuk menerima pesan. Bentuk umum : receive
Pattern1 [when GuardSeq1] -> Body1;
...; PatternN [when GuardSeqN] ->
BodyN end
Contoh : wait for onhook() ->
receive onhook ->
disconnect(), idle();
{connect, B} -> B ! {busy, self()}, wait_for_onhook()
end.
15
2.2.4 Macro 2.2.4.1 Mendefinisikan dan menggunakan Macro Sebuah macro didefinisikan dengan cara berikut :
-define(Const, Replacement).
-define(Func(Var1,...,VarN), Replacement).
Definisi macro ditempatkan diantara atribut dan deklarasi fungsi dari sebuah
modul. Jika macro digunakan oleh beberapa modul, disarankan untuk menempatkan
definisi macro dalam file yang dinclude.
Macro digunakan dengan cara berikut :
?Const
?Func(Arg1,...,ArgN)
Macro dipisahkan selama dikompilasi. Sebuah macro simple ?Const akan dirubah
dengan Replacement
Contoh :
-define(TMEOUT,200).
…
16
Call(Request) ->
Server:call(refserver, Request, ?TIMEOUT).
?TIMEOUT akan diganti dengan ‘200’ sehingga menjadi :
Call(Request) ->
Server:call(refserver, Request, 200).
2.2.5 Concurrent Programming 2.2.5.1 Proses Salah satu alasan utama kenapa kita menggunakan erlang daripada bahasa
fungsional yang lain ialah kemampuan erlang untuk menangani konkurensi dan
pemrograman terdistribusi. Dengan konkurensi artinya suatu program yang dapat
menangani beberapa tugas dalam waktu yang sama. Sebagai contoh system operasi
moderen memungkinkan kita menggunakan aplikasi word, winamp, dan proses print
yang semuanya berjalan bersamaan. Dalam erlang kita menyebut setiap tugas yang
dijalankan sebagai proses [4].
17
2.2.5.2 Komunikasi antar Proses Dalam contoh berikut kita membuat dua proses yang akan saling berhubungan
satu sama lain :
module(tut15). -export([start/0, ping/2, pong/0]). ping(0, Pong_PID) -> Pong_PID ! finished, io:format("ping finished~n", []); ping(N, Pong_PID) -> Pong_PID ! {ping, self()}, receive pong -> io:format("Ping received pong~n", []) end, ping(N - 1, Pong_PID). pong() -> receive finished -> io:format("Pong finished~n", []); {ping, Ping_PID} -> io:format("Pong received ping~n", []), Ping_PID ! pong, pong() end. start() -> Pong_PID = spawn(tut15, pong, []), spawn(tut15, ping, [3, Pong_PID]). 1> c(tut15). {ok,tut15} 2> tut15: start().
18
<0.36.0> Pong received ping Ping received pong Pong received ping Ping received pong Pong received ping Ping received pong ping finished Pong finished Penjelasan program :
Fungsi start() mula-mula menciptakan suatu proses yang kita sebut saja “pong”
Pong_PID = spawn(tut15, pong, [])
Proses ini menjalankan tut15:pong() . Pong_PID adalah pid dari proses “pong”.
Kemudian fungsi start() menciptakan proses yang lain yang kita sebut saja “ping”.
spawn(tut15, ping, [3, Pong_PID]),
proses ini menjalankan perintah
tut15:ping(3, Pong_PID)
<0.36.0> merupakan nilai pengembalian dari fungsi start().
Proses “pong” sekarang sampai pada perintah
receive
finished ->
io:format("Pong finished~n", []);
{ping, Ping_PID} ->
io:format("Pong received ping~n", []),
Ping_PID ! pong,
19
pong()
end.
Kode receive memungkinkan suatu proses untuk menunggu pesan dari proses yang
lain. Mempunyai bentuk umum :
receive
pattern1 ->
actions1;
pattern2 ->
actions2;
....
patternN
actionsN
end.
Dalam keadaan tersebut proses “pong” sedang menunggu pesan. Jika atom finished
diterima maka “pong” menampilkan kalimat “Pong finished” pada shell dan tidak ada
lagi yang dilakukan sehingga program akan dihentikan. Jika “pong” menerima pesan
dengan format :
{ping, Ping_PID}
Maka proses “pong” akan menampilkan kalimat “Pong received ping” kemudian
mengirimkan atom pong ke proses “ping” dengan kode sebagai berikut :
20
Ping_PID ! pong
Setelah mengirimkan pesan ke proses “ping”, “pong” akan memangil fungsi pong()
kembali yang menyebabkan “pong” dalam keadaan menunggu pesan kembali.
Sekarang pada proses “ping” klausa kedua akan dijalankan , karena argument yang
diterima yaitu :
tut15:ping(3, Pong_PID) dan bukan tut15:ping(0, Pong_PID).
Klausa kedua tersebut mengirimkan pesan ke “pong”
Pong_PID ! {ping, self()},
self() disini berfungsi untuk menghasilkan nilai pid dari proses yang menjalankan
fungsi self() tersebut. Dalam kasus ini pid dari “ping”. Kemudian “ping” akan
menunggu balasan dari “pong”
receive
pong ->
io:format("Ping received pong~n", [])
end,
dan menampilkan kalimat “Ping received pong” apabila balasan tersebut sudah
diterima. Setelah itu “ping” memanggil fungsi ping() kembali
21
ping(N - 1, Pong_PID)
N-1 mengakibatkan argument yang pertama dikurangi dengan satu (N-1) sampai
hasilnya 0. Apabila keadaan tersebut terpenuhi maka “ping” akan menjalankan klausa
yang pertama, yaitu :
ping(0, Pong_PID) ->
Pong_PID ! finished,
io:format("ping finished~n", []);
Atom finished dikirim ke proses “pong” dan kalimat “ping finished” akan
ditampilkan dan kemudian proses dihentikan karena sudah tidak ada lagi yang
dilakukan
2.2.6 Pemrograman Terdistribusi pada Erlang
Sistem Erlang yang akan berkomunikasi harus memiliki magic cookie yang
sama. Cara yang paling mudah ialah dengan membuat file yang bernama
“.erlang.cookie” yang ditempatkan pada direktori home. Pada windows direktori
home ialah yang ditunjukkan oleh $HOME [4]. Contoh pembuatan magic cookie
pada shell Unix dan Linux :
$ cd
$ cat > .erlang.cookie
this_is_very_secret
22
$ chmod 400 .erlang.cookie
Perintah chmod di atas menjadikan file .erlang.cookie hanya dapat diakses
oleh pemilik file tersebut dan ini merupakan persyaratan.
Untuk menjalankan sistem erlang yang ingin berhubungan dengan sistem
erlang yang lain maka sistem tersebut harus diberi nama dengan perintah :
Bu : erl -sname my_name
(catatan: Perintah erl –sname mengasumsikan bahwa semua node yang berjalan
berada dalam satu domain apabila ingin berhubungan dengan domain yang berbeda
dapat digunakan perintah erl –name nama_lengkap, contoh :
erl –name [email protected] )
Apabila kita ingin bereksperimen dengan sistem erlang terdistribusi , tapi kita
hanya mempunyai satu komputer, kita masih bisa menjalankan dua sistem erlang
yang terpisah dalam satu komputer tetapi harus dengan nama yang berbeda. Setiap
sistem erlang yang berjalan pada sebuah komputer disebut node.