Programming Language Concept Session 5

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

    1. Tidak ada parameter dua-arah di function
    2. Tidak ada alamat non-local di function
    3. Keuntungan: bekerja
    4. Kelemahan: ketidakfleksibelan parameter satu-arah dan kekurangan alamat non-local

    – Menulis definisi bahasa untuk meminta urutan evaluasi order diperbaiki

    1. Kelemahan: membatasi beberapa optimisasi compiler
    2. 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 val

    val 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

This entry was posted in Computer Science, Programming Language Concept and tagged , , , . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *