Programming Language Concept Session 5
- Expression merupakan cara mendasar untuk menentukan komputasi di bahasa pemrograman
- Untuk mengerti evaluasi expression, haruslah akrab dengan urutan operator dan evaluasi operand
- Esensi dari imperative language adalah peran pernyataan assignment yang dominan
Arithmetic Expression
- Arithmetic expression berisi operator, operand, parentheses, dan function call
- Operator yang memiliki satu operand disebut unary
- Operator dengan dua operand disebut binary
- Operator yang memiliki tiga operand disebut ternary
- Tingkat precedence
– Kurung (parentheses)
– Unary operator
– **
– *,/
– +,- - Associativity rule menjelaskan urutan operator dengan level precedence yang sama
- Precedence dan associativity dapat di overridden dengan parentheses
- Pernyataan if-then-else dapat digunakan untuk melakukan conditional expression assignment, contoh:
if (count == 0)
average = 0;
else
average = sum / count;
atau dalam bahasa berbasis C bisa menggunakan
average = (count == 0) ? 0 : sum / count;
- Urutan evaluasi operand:
– Variable: mengambil nilai dari memori
– Constant: terkadang diambil dari memori; terkadang constant tersebut di instruksi bahasa mesin
– Parenthesized expression: evaluasi semua operand dan operator terlebih dahulu
– Jika operand dan operator keduanya tak memiliki side effect (terjadi ketika function merubah salah satu parameternya atau suatu variable global), maka urutan evaluasi operand ini tak relevan
Fuctional Side Effect
- Functional side effect merupakan kejadian ketika suatu fungsi mengganti parameter dua-arah atau non-local variable
- Masalah terkait fuctional side effect:
– Ketika suatu function direferensikan di suatu expression mengubah operand lain di expression tersebut, contoh:
int a = 5;
int fun1() {
a = 17;
return 3;
} /* end of fun1 */
void main() {
a = a + fun1();
} /* end of main */
- Dua solusi yang mungkin:
– Menulis definisi bahasa untuk melarang functional side effect- Tidak ada parameter dua-arah di function
- Tidak ada alamat non-local di function
- Keuntungan: bekerja
- Kelemahan: ketidakfleksibelan parameter satu-arah dan kekurangan alamat non-local
– Menulis definisi bahasa untuk meminta urutan evaluasi order diperbaiki
- Kelemahan: membatasi beberapa optimisasi compiler
- Java memerlukan operand dievaluasi dengan urutan kiri ke kanan
Overloaded Operator
- Penggunaan sebuah operator untuk lebih dari satu maksud dikenal dengan operator overloading
- Beberapanya umum, seperti operator penambahan (+)
- Beberapa lainnya berpotensi menimbulkan masalah, seperti operator * di C dan C++
– Menghilangkan pendeteksi compiler error
– Kehilangan beberapa readability - Beberapa bahasa seperti C++, C#, dan F# memperbolehkan user-defined overloaded operator
– Ketika digunakan dengan bijak, operator semacam itu dapat membantu readability (menghindari method call, expression muncul natural)
– Dapat memunculkan masalah seperti, user dapat mendefinisikan operation yang tak masuk akal; readability bisa berkurang, bahkan ketika operator tersebut masuk akal
Type Conversion
- Narrowing conversion merupakan conversion yang meng-konversi suatu objek ke tipe yang tak dapat memasukkan seluruh nilai dari tipe originalnya, misal float menjadi int
- Widening conversion merupakan conversion yang objeknya dikonversi ke suatu tipe yang dapat memasukkan setidaknya perkiraan semua nilai dari tipe originalnya seperti int menjadi float
- Mixed-mode expression merupakan expression yang operatornya dapat memiliki operand dari tipe yang berbeda
- Coercion merupakan tipe conversion implisit
– Kelemahan: mengurangi kemampuan pendeteksi error compiler - Di kebanyakan bahasa, semua numeric type dipaksa (coerced) di expression, menggunakan widening conversion
- Explicit type conversion dikenal casting di bahasa berbasis C
– C: (int)angle
– F#: (float)sum
Error di Expression
- Klausa
– Batasan inheren dari aritmatika (seperti pembagian ke nol)
– Batasan aritmatika komputer (seperti overflow) - Terkadang diacuhkan oleh system run-time
Relational Expression
- Relational operator merupakan operator yang membandingkan nilainya dengan kedua operandnya
- Nilai dari relation operator adalah Boolean, kecuali ketika Boolean tidak didukung dibahasa tersebut
- JavaScript dan PHP memiliki dua operator relational tambahan, === dan !==, mirip dengan saudaranya, == dan !=, namun menghindari operandnya dipaksakan (coerced), contoh:
“7” == 7
Bernilai true, sedangkan
“7” === 7
Bernilai false
Boolean Expression
- Boolean operator hanya mengambil Boolean operand dan menghasilkan nilai Boolean
- C89 tidak memiliki tipe Boolean, sehingga ia menggunakan tipe integer dengan 0 sebagai false dan nonzero sebagai true
- Tingkat precedence:
postfix ++, —
unary +, -, prefix ++, –, !
*, /, %
binary +, –
<, >, <=, >=
=, !=
&&
|| -> lowest
Short Circuit Evaluation
- Short circuit evaluation merupakan evaluasi yang mana hasilnya dapat ditentukan tanpa mengevaluasi semua operand dan atau operator, misal:
(13 * a) * (b / 13 – 1)
Jika salah satu (13 * a atau b / 13 – 1) menghasilkan nilai nol, maka hasil dari ekspresi tersebut bisa diketahui merupakan nol
- Short circuit evaluation di beberapa bahasa:
– C, C++, dan Java : menggunakan short-circuit evaluation untuk operator Boolean biasa (&& dan ||), namun juga menyediakan operator Boolean bitwise yang tidak short circuit (& dan |)
– Semua operator logika di Ruby, Perl, ML, F#, dan Python dievaluasi secara short-circuit
– Ada : programmer dapat memilih
– Short circuit evaluation menampilkan masalah side effect yang mungkin muncul di expression, seperti
(a > b) || (b++ / 3)
Assignment Statement
- Syntax umum
<target_var> <assign_operator> <expression>
- Operator assignment:
– = Fortran, Basic, bahasa berbasis C
– := Ada - = dapat berbahaya ketika di-overload untuk operator relational sebagai equality, sehingga bahasa berbasis C menggunakan == sebagai operator relational
- Compound assignment operator merupakan metode cepat menjelaskan bentuk umum yang diperlukan assignment, misal:
sum = sum + value;
ekuivalen dengan
sum += value;
- Unary assignment operator di bahasa berbasis C menggabungkan operasi increment dan decrement dengan assignment, contoh:
sum = ++count (count ditambah, lalu di-assign ke sum)
sum = count++ (count di-assign ke sum, lalu ditambahkan)
count++ (count ditambahkan)
count++ (count ditambahkan lalu di negasikan)
- Di bahasa berbasis C, Perl, dan JavaScript, pernyataan assignment menghasilkan suatu hasil dan dapat digunakan sebagai operand, contoh:
while ((ch = getchar())!= EOF){…}
ch = getchar()
- Perl, Ruby, dan Lua memperbolehkan multiple-target multiple-source assignment, seperti:
($first, $second, $third) = (20, 30, 40);
- Identifier di bahasa fungsional hanya nama nilai, karena itu nilainya tak pernah berubah, misal di bahasa ML:
– Name diikat ke nilai dengan valval fruit = apples + oranges;
– Jika ada val lain untuk fruit, itu merupakan name baru dan berbeda
- Pernyataan assignment juga dapat mixed-mode
– Di Fortran, C, Perl, dan C++, semua numeric type value dapat di-assign ke numeric type variable apapun
– Di java dan C#, hanya ketika coercionnya widening
– Tak ada mixed-mode assignment di bahasa fungsional
Sumber:
- Concept of Programming Languages 10th. Ed / Robert W. Sebesta (Chapter 7)
- Expression and Assignment Statement / Binus Powerpoint Presentation