teori

18
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].

description

deet

Transcript of teori

Page 1: 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].

Page 2: teori

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.

Page 3: teori

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.

Page 4: teori

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]..

Page 5: teori

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

Page 6: teori

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

Page 7: teori

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]

Page 8: teori

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

Page 9: teori

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.

Page 10: teori

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.

Page 11: teori

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).

Page 12: teori

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].

Page 13: teori

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().

Page 14: teori

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,

Page 15: teori

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 :

Page 16: teori

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

Page 17: teori

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

Page 18: teori

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.