Expression And Assignment
Expression
adalah dasar dari komputasi dalam menentukan perhitungan dalam sebuah bahasa
pemrograman salah satu bentuk nya adalah BNF. Ini sangat penting bagi
programmer untuk memahami syntax dan semantics dari bahasa pemrograman yang
digunakan.
Untuk
memahami evaluation expression penting untuk mengenal urutan dari operator dan
operand evaluation. Urutan dari evaluation operator diketahui dari
associativity dan hukum dari bahasa pemrograman. Meski terkadang nilai dari
expression bergantung padanya, urutan operasi operand pada sebuah expression
biasanya tidak dijelaskan oleh designer program. Ini memberikan si pembuat
untuk memilih urutan, yang membawanya pada kemungkinan dari hasil program yang
berbeda dari implementasi. Jadi semua bahasa imperative memiliki konsep
variable yang nilai nya dapat berubah selama eksekusi berjalan.
Inti
dari bahasa pemrograman imperative adalah peran dominan dari pernyataan
penugasan(assignment statement). Tujuan dari statement ini untuk menyebabkan
efek samping pada perubahan nilai variable, atau state dari sebuah program.
Fungsi
bahasanya menggunakan variable yang sedikit berbeda, seperti parameter
function. Bahasa ini juga memiliki
declaration statement yang mengikat nilai pada nama. Deklarasi ini mirip dengan
assignment statement, tetapi tidak memiliki efek samping.
Arithmetic
expression
Arithmetic
expression di dapat dari konvensi yang berevolusi dari matematika. Arithmetic
expression terdiri dari operator(karakter khusus untuk memproses operand),
operand(angka/karakter), parentheses(tanda kurung), dan function call. Operator
itu sndiri bisa unary(punya single operand), binary(two operand), atau ternary(three
operand). Dalam bahasa pemrograman binary operator itu adalah infix, yang
berarti muncul diantara operand. Kecuali pada perl, memiliki beberapa operator
yang prefix, yang artinya muncul sebelum operand.
Tujuan
dari arithmetic expression adalah menentukan arithmetic computation.
Implementasi dari komputasi ini harus memiliki 2 aksi yaitu fetching operand
atau mengambil operand, biasanya pada memory, dan melakukan eksekusi arithmetic
operation pada operand.
Operator
Evaluation Order
Operator
evaluation order berfungsi sebagai menentukan urutan dari evaluasi proses
operator.
Ada 3 jenis yaitu
:
1.
Precedence
Precedence
menggunakan nilai dari sebuah expression bergantung pada bagian yang di
evaluasi dari operator pada sebuah expression. Sebagai contoh :
A+B*C
Jika nilai a, b, dan c adalah 3, 4 , 5 jika kita
lakukan perhitungan dari kiri ke kanan maka akan menghasilkan nilai 35. Tetapi
jika melakukan perhitungan dari kanan ke
kiri maka akan menghasilkan nilai 23. Dari pada bingung menggunakan
proses dari kiri ke kanan atau kanan ke kiri maka dilihat lah operand nya yang
mana yang harus lebih dulu.
Operation
precedence rules adalah untuk expression evaluation menentukan urutan operator
mana yang harus diproses terlebih dulu. Dalam bahasa ini exponent adalah nilai
tertinggi, lalu perkalian dan pembagian pada level kekuatan yang sama, lalu
diikuti oleh pertambahan dan pengurangan pada level yang sama.
Banyak
bahasa menggunakn unary version dari pertambahan dan pengurangan. Pertambahan
unary(unary addition) biasa di sebut identity operator, karena biasanya tidak
memiliki asosiasi operasi dan tidak memberikan efek pada sebuah operand.
2.
Associativity
Associativity
adalah proses dimana jika level nya (operator) sama, maka akan dilakukan
perhitungan biasa dari kiri ke kanan(kecuali ** dibaca dari kanan ke kiri). Misal
:
A-
B+C-D
Maka akan dilakukan dari A-B lalu dilanjutkan +C dan
–D
Sebuah operator dapat memiliki left associativity
ataupun right associativity, bermaksud jika 2 operator berdekatan, maka left
operator didahulukan baru kekanan secara berurutan. Associativity biasanya
diproses dari kiri ke kanan kecuali exponent operator (ketika diberikan)
terkadang dari kanan ke kiri.
Jika pada kasus ruby seperti :
A ** B ** C
Akan diproses dari kanan ke kiri
3.
Parentheses
Programmer
dapat mengubah urutan dan aturan asosiasi dengan menempaatkan tanda kurung pada
expression. Bagian yang di tanda kurungkan lebih diutamakan di banding yang tidak
menggunakan tanda kurung. Dilihat dari
penggunaan tanda kurung missal :
(A+B)*C
Proses pertambahan akan dilakukan
pertama, secara matematis ini normal. Proses ini dilakukan karena A+B
menggunakan tanda kurung, sehingga lebih diprioritas kan di banding dengan
perkalian. Maka proses akan dilakukan adalah A+B setelah itu hasil nya
akan *C. proses dapat berlangsung dari
kiri ke kanan atau kanan ke kiri bergantung pada prioritas dari tanda kurung.
Programmer
akan melakukan identifikasi urutan evaluasi menggunakan parentheses. Pendekatan
ini lebih simple karena si pembuat atau pembaca program membutuhkan untuk mengingat
precedence dan aturan associativity, kekurangan dari schema ini adalah membuat
penulisan program lebih melelahkan, dan pengkompromian dari kode data.
4.
Ruby expression
Ruby
adalah bahasa murni dari bahasa object oriented, yang berarti setiap nilai
data, termasuk literal adalah objek. Ruby mendukung fungsi arithmetic dan
logical dari sebuah operasi yang di include pada bahasa C. yang membedakan
antara ruby dan C adalah pada area expression dimana semua arithmetic,
relational dan assignment operator, dan juga indexing, array shift, dan bitwise
logic operator.
Hasil dari implementasi operator ini bisa
melakukan system overridden pada program aplikasi ini. Jadi operator ini bisa
di jelaskan kembali
5.
Conditional expression
If-then-else
statement dapat digunakan untuk membuat expresi yg diproses berdasarkan
kondisi. Sebagai contoh :
if
(count == 0)
average
= 0;
else
average
= sum / count;
kondisi diatas akan menyesuaikan
dengan expression yang ada. Jika count bernilai 0 maka nilai dari average akan
bernilai 0, dan jika count tidak 0 maka nilai dari average adalah hasil
pembagian antara sum dan count.
Conditional
expression dapat digunakan dimana saja dalam sebuah program, dimana expression
yang lain dapat digunakan. Dalam bahasa C , Conditional expression juga
terdapat pada perl, javascript, dan ruby.
Operand
Evaluation Order
Operand
evaluation order = desain karakteristik adalah urutan evaluasi dari operand.
Variable di expression di evaluasi dengan mengambil nilai-nilai dari memori.
Jika operand bersifat parenthesized maka semua operator harus dievaluasi
sebelum nilai dapat digunakan sebagai operand, Jika tidak dilakukan maka
operand dari operator akan memiliki side effect, maka urutan evaluasi dari
operand akan tidak relevan.
1. Side
effect
Sebuah fungsi yang biasa nya disebut sebagai
functional side effect, terjadi ketika perubahan fungsi dari salah satu
parameter atau variable global.
Contoh :
int a = 5;
int fun1()
{
a
= 17;
return
3;
}
void main()
{
a = a + fun1();
}
Pada kode diatas yang awal nya nilai a adalah 5
dengan fungsi fun1 nilai global dari a berubah menjadi 17, dan nilai a pada
main program akan menjadi penjumlahan dari a dari variable global dan fungsi
fun1().
Untuk
menghentikan efek samping dari parameter 2 arah ini dibutuhkan sub program.
2. Referensi
transparan dan efek samping
Referensi transparan terjadi jika ada 2
expression dalam sebuah program memiliki nilai yang sama dapat diganti antara
satu dan yang lainnya dimana saja dalam sebuah program, tanpa mempengaruhi aksi
dari sebuah program.
Contoh
:
result1 = (fun(a) + b) / (fun(a) - c);
temp = fun(a);
result2 = (temp + b) / (temp - c);
dapat di lihat dari program di atas bahwa fungsi fun
tidak akan memiliki efek samping pada program, nilai dari result1 dan result2
akan bernilai sama, karena expression yang digunakan adalah ekuivalen.
Keuntungan dari referensi
transparan program adalah semantic pada program lebih mudah untuk dipelajari
dan dipahami dibandingkan dengan semantic pada program yang tidak menggunakan
referensi transparan. Dengan menggunakan referensi transparan akan membuat
fungsi menjadi ekuivalen seperti fungsi matematika, dalam hal pemahaman.
Overloaded
Operator
Penggunaan
sebuah operator untuk lebih dari satu tujuan disebut operator overloading.
Contoh berbahaya dari overloading operator adalah ampersand (&) misal :
x= &y;
dapat
menyebabkan alamat dari y ditempatkan pada x. ada masalah dengan penggunaan
multiple ampersand. Pertama penggunaan symbol yang sama untuk 2 operasi yang
berbeda dapat menyebabkan kerugian pada proses pembacaan. Kedua keying error
sederhana dapat meninggalkan operand pertama untuk bitwise dan operasi dapat
bepergian tanpa diketahui oleh compiler, karena diinterpretasikan sebagai
address operator.
Type
Conversion
Tipe conversion
bertipe narrowing atau widening. Conversion narrowing mengubah nilai ke tipe
yang tidak dapat disimpan bahkan semua pendekatan dari tipe original. Sebagai
contoh mengubah tipe data double menjadi float dalam java adalah narrowing
conversion, karena range dari double lebih besar dari float. Widening
conversion mengubah nilai ke tipe yang dapat dimasukkan ke pendekatan dari
semua nilai tipe original. Sebagai contoh mengubah tipe data int menjadi float
pada java disebut widening conversion. Widening conversion sering disebut
sebagai metode aman, maksudnya adalah besarnya nilai yang dikonversi akan di
pertahankan. Narrowing conversion tidak selalu aman terkadang besar nya nilai
yang dikonversi dapat berubah ketika dalam proses. Tipe konversi dapat implicit
atau explicit 2 sub seksi dari konversi adalah :
1. Coercion
in Expression
Salah satu bentuk decision desain
tentang arithmetic expression apakah operator boleh memiliki operand dari tipe
yang berbeda. Bahasa yang memperbolehkan expression seperti itu , biasa disebut
mixed-mode expression, harus menentukan konvensi untuk konversi tipe operand
implicit karena computer tidak memiliki binary operations yang mengambil
operand dari tipe data yang berbeda. Coercion di definisikan sebagai tipe
implicit konversi yang di inisialisasi oleh compiler.
Ketika 2 operand dari sebuah
operator tidak memiliki tipe yang sama dan legal dalam sebuah bahasa
pemrogaman, compiler harus memilih diantara nya untuk dipaksa. Memiliki
kelemahan dalam deteksi error dari sebuah program.
2. Explicit
type conversion
Banyak bahasa memberikan fungsi
untuk melakukan konversi explicit, narrowing dan widening. Dalam beberapa kasus
pesan peringatan muncul ketika explicit narrowing conversion menghasilakn
perubahan signifikan pada objek yang di konversikan.
3. Error
in expression
Error dapat muncul ketika melakukan
evaluasi dari expresi. Jika bahasa membutuhkan type checking, mau static atau dynamic,
maka operand type error tidak akan muncul. Error akan muncul jika operand
dipaksakan pada expression yang telah di jalankan.
Error yang biasa muncul ketika
hasil dari operasi tidak dapat di representasikan pada memory yang harus di simpan. Ini biasa disebut
overflow atau underflow, berdasarkan hasil nya terlalu besar atau terlalu
kecil.
Relational and Boolean expression
Relational
expression adalah operator yang melakukan perbandingan nilai dengan 2 operand.
Relational expression memiliki 2 operand dan 1 operator. Nilai dari relational
expression adalah Boolean, kecuali ketika Boolean tidak dimasukkan kedalam
fungsi bahasa. Relational. Relational expression biasanya overloaded untuk
berbagai macam tipe. Operasi yang menentukan benar atau salah nya sebuah
relational expression bergantung pada tipe operand.
Boolean
expression memiliki Boolean variable, Boolean constant, relational expression
dan Boolean operator. Operator biasanya dimasukkan dengan fungsi pemanggil AND,
OR, dan NOT operation, dan terkadang untuk exclusive OR dan equivalence.
Boolean operator biasanya hanya memanggil Boolean operand dan menghasilkan
Boolean values. Dalam matematika Boolean algebra, atau biasa lebih dikenal
dengan OR dan AND harus didahulukan. Yang diutamakan dari arithmetic,
relational, dan Boolean operator pada bahasa C adalah :
Short-circuited
evaluation
Short-circuited
evaluation adalah expression dimana hasil dari salah satu nya ditentukan tidak
melalui hasil evaluasi dari semua operand dan operator. Sebagai contoh :
(13 * a) * (b /
13 - 1)
Nilai dari (b /
13 - 1) bersifat independen. Jika nilai dari a adalah 0, maka tidak perlu
melakukan operasi perhitungan dari (b / 13 - 1). Tapi dalam operasi arithmetic shortcut ini
terkadang tidak mudah di deteksi ketika melakukan eksekusi.
Assignment
Statement
Assignment
statement adalah bagian tengah dari susunan bahasa imperative. Dia memberikan
mekanisme yang user dapat secara dinamis dapat mengubah binding dari nilai
variable. Assignment ada beberapa tipe yaitu :
1. Simple
assignment
Hampir semua bahasa pemrograman
menggunakan tanda equal untuk assignment operator. Semua ini harus menggunakan
sesuatu yang berbeda dari tanda equal untuk equality relational operator untuk menghindari
ketidakjelasan dengan assignment operator.
2.
Conditional Target
Tipe
assignment yang akan menyesuaikan dengan syarat yang dibutuhkan dari kode yang
ada. Contoh :
3.
Compound assignment operator
Compound
assignment operator adalah metode untuk menentukan apa saja yang di butuhkan
dalam sebuah assignment. Bentuk dari assignment yang dapat disingkat dengan
teknik ini memiliki tujuan variable dan muncul sebagai operand pertama dari
expression pada sisi kanan.
4.
Unary assignment operator
Menggabungkan increment dan
decrement operasi pada assignment. Operator ++ sebagai increment dan operator –
– sebagai decrement, bisa digunakan
sebagai expression atau bentuk berdiri sendiri single operator statement. Dapat
muncul sebagai prefix operator maupun sebagai postfix operator.
5.
Assignment as an expression
Dalam
bahasa C, perl, dan javascript, assignment statement akan menghasilkan hasil
yang sama dengan target yang di assign. Karena itu hal ini dapat digunakan
sebagai expression dan sebagai operand pada expression lainnya. Sebagai contoh
:
while
((ch = getchar()) != EOF) { ... }
dapat
dilihat pada kode diatas ch=getchar() dibawa, hasilnya akan digunakan sebagai
nilai kondisi untuk while. Jika tidak menggunakan tanda kurung maka akan
dilakukan proses perbandingan dengan !=EOF lebih dulu.
Kelemahan dari memperbolehkan assignment
sebagai operand pada sebuah expression adalah memberikan efek samping dari
expression yang lain.
6.
Multiple assignment
Beberapa
bahasa pemrograman seperti perl, ruby, dan lua memberikan sebuah fungsi yaitu
multiple target, multiple source assignment. Sebagai contoh :
($first,
$second, $third) = (20, 40, 60);
Semantic
20 ditempatkan pada first, semantic 40 pada second, semantic 60 pada third.
Jika nilai dari 2 variabel ingin ditukar. Hal ini dapat dilakukan dengan cara
($first,
$second) = ($second, $first);
Ini
ditukar dengan mengubah posisi tanpa menggunakan temporary variable.
7.
Assignment in functional programming language
Semua
identifier digunakan pada fungsi bahasa dan beberapa digunakan untuk fungsi
bahasa yang lain sebagai nama dari suatu nilai.
Mixed
mode assignment
Biasanya
assignment statement merupakan mixed mode. Fortran , C, C++ menggunakan aturan
coercion untuk mixed mode assignment untuk mixed mode expression jika mirip.
No comments:
Post a Comment