Friday, November 15, 2019

Program Language Concepts

Syntax mendefinisikan bagaimana suatu kalimat dibentuk sebagai barisan/urutan dari pemilihan suatu kata dasar.

Kriteria Syntax :

  • Readability
  • Writeability
  • Verifiability
  • Kemudahan Translasi
  • Pengurangan Ambiguitas

SEMANTIC adalah Mendefinisikan arti dari program yang benar secara syntax dari bahasa tersebut.

Pengaplikasian sejumlah rules untuk menghasilkan suatu statement (sentence) disebut derivation.

Leftmost Derivation: 

<Assign> => <id> = <expr>

 => A = <expr>

 => A = <expr> + <term>

 => A = <term> + <term>

 => A = <factor> + <term>

 => A = <id> + <term>

 => A = B + <term>

 => A = B + <term>  * <factor>

 => A = B + <factor> * <factor>

 => A = B + <id> * <factor>

 => A = B + C * <factor>

 => A = B + C * <id>

 => A = B + C * A


Grammar 

Diberikan grammar untuk suatu bahasa pemrograman kecil sebagai berikut:

 <program> → begin <stmt_list> end

 <stmt_list> → <stmt>

| <stmt> ; <stmt_list>

 <stmt> → <var> = <expression>

 <var> → A | B | C

 <expression> → <var> + <var>

| <var> - <var>


| <var>

Right-most Derivation:

<assign>  => <id> = <expr>
      => <id> = <expr> + <term>
      => <id> = <expr> + <term>   * <factor>
      => <id> = <expr> + <term> * <id>
      => <id> = <expr> + <term> * A
      => <id> = <expr> + <factor> * A
      => <id> = <expr> + <id> * A
      => <id> = <expr> + C * A
      => <id> = <term> + C * A
      => <id> = <id> + C * A
      => <id> = B + C * A
      =>  A = B + C * A

Scope variable adalah lingkup area yang dimiliki suatu variable dimana dia dapat diakses atau dilihat oleh kode program yang lain.

Contoh:

#include <stdio.h>

int z; //global variable

int main ()
{
    int x,y; //local variable
   
    x = 20;
    y = 30;
    z = x + y;
   
    printf ("value of x = %d, y = %d and z = %d\n", x, y, z);
   
    return 0;
}

Static Binding yang terjadi pada waktu kompilasi dan Dynamic Binding  yang terjadi saat runtime.

Binding Static

Suatu binding dinyatakan static ketika binding terjadi sebelum run time dan tetap tidak berubah selama ekseukis program berlangsung. Deklarasi eksplisit adalah pernyataan dalam program yang berisi daftar nama-nama variabel dan menetapkan bahwa mereka adalah jenis tertentu. Deklarasi implisit merupakan perkumpulan variabel dengan jenis melalui konvensi umum, bukan pernyataan deklarasi. Dalam hal ini, penampilan pertama dari nama variabel dalam Program merupakan deklarasi implisit. Kedua deklarasi eksplisit dan implisit membuat binding statis untuk jenis.

Bahasa pemrograman yang paling banyak digunakan yang menggunakan jenis statis mengikat eksklusif dan dirancang sejak pertengahan 1960-an membutuhkan deklarasi eksplisit dari semua variabel (Perl, JavaScript, Ruby, dan ML beberapa pengecualian).

Contoh Static Binding:

Disini kita memiliki dua class Human dan Boy. Kedua class memiliki method walk() tetapi method ini static, yang berarti tidak dapat di overriden(ditimpa) jadi meskipun saya telah menggunakan objek class Boy saat membuat objek obj, method class induk(parent class) dipanggil olehnya. Karena rujukannya adalah Human type(parent class). Jadi setiap kali static binding, private, dan final method terjadi, jenis class ditentukan oleh compiler pada waktu kompilasi dan binding terjadi saat itu juga.

class Human{
   public static void walk()
   {
       System.out.println("Human walks");
   }
}
class Boy extends Human{
   public static void walk(){
       System.out.println("Boy walks");
   }
   public static void main( String args[]) {
       /* Reference is of Human type and object is
        * Boy type
        */
       Human obj = new Boy();
       /* Reference is of HUman type and object is
        * of Human type.
        */
       Human obj2 = new Human();
       obj.walk();
       obj2.walk();
   }
}
Output:

Human walks
Human walks

Binding Dinamis

Suatu binding dinyatakan dinamis apabila binding terjadi ketika eksekusi dilakukan atau dapat kita ganti ketika eksekusi suatu program dilaksanakan. Dengan tipe binding dinamis, jenis variabel tidak ditentukan oleh deklarasi pernyataan, juga tidak bisa ditentukan oleh ejaan namanya.Sebagai gantinya, variabel terikat ketika ditugaskan nilai dalam sebuah pernyataan penugasan.Ketika pernyataan penugasan dijalankan, variabel yang ditugaskan terikat dengan jenis nilai ekspresi pada sisi kanan tugas.Seperti tugas juga dapat mengikat variabel ke alamat dan sel memori, karena nilai-nilai berbagai jenis mungkin memerlukan jumlah yang berbeda dari penyimpanan.Setiap variabel dapat ditugaskan setiap nilai tipe.Selain itu, variabel Jenis dapat mengubah beberapa kali selama eksekusi program.Itu penting untuk menyadari bahwa jenis variabel yang jenis dinamis terikat mungkin sementara.

Contoh Dynamic Binding:

Ini adalah contoh yang sama yang telah kita lihat di atas. Satu-satunya perbedaan di sini adalah bahwa dalam contoh ini, penimpaan sebenarnya terjadi karena metode ini tidak static, private dan final.

Dalam hal meng-override panggilan ke metode overriden ditentukan pada saat runtime oleh jenis objek sehingga terjadi binding yang terlambat. Mari kita lihat contoh untuk memahami ini:

class Human{
   //Overridden Method
   public void walk()
   {
       System.out.println("Human walks");
   }
}
class Demo extends Human{
   //Overriding Method
   public void walk(){
       System.out.println("Boy walks");
   }
   public static void main( String args[]) {
       /* Reference is of Human type and object is
        * Boy type
        */
       Human obj = new Demo();
       /* Reference is of HUman type and object is
        * of Human type.
        */
       Human obj2 = new Human();
       obj.walk();
       obj2.walk();
   }
}
Output:

Boy walks
Human walks

Beranjak dari proses compiling

Kalau berbicara tentang pemrograman komputer pasti tau dong tentang compiling? Yaitu menerjemahkan instruksi (kode) ke dalam bentuk intermediary, berupa file object. Sebagai contoh pada C++. Sesaat setelah proses compiling dilakukan maka akan terbentuk file-file yang memiliki tipe *.o (objek). Sebelum terbentuknya file eksekusi (*.exe), objek-objek yang ada akan dihubungkan dengan linker yang telah dipersiapkan oleh preprosesor.

Apa itu preprosesor dan linker?

Preprosesor merupakan tahapan sesaat proses compiling berlangsung. Preprosesor akan secara otomatis berlangsung pada saat kamu menjalankan compiler.

Tugas dari preprosesor adalah membaca instruksi dan mempersiapkan semua yang tertera pada instruksi tersebut. Instruksi pada C++ selalu diawali dengan simbol pound (#), contohnya seperti: #include, #define, #ifndef, #endif, dll.

Pemrograman seperti C, C++, dan juga java, menggunakan library sebagai koleksi dari fungsi-fungsi.Pada C++, jikalau mau menggunakan cout maka kita harus terlebih dahulu mengetahui di mana letak fungsi tersebut. cout merupakan koleksi dari iostream.h, oleh karena itu kita akan memberikan instruksi kepada preprosesor untuk mempersiapkan library tersebut karena akan digunakan, instruksi tersebut berupa #include <iostream.h>

Untuk selanjutnya pada saat compiler kamu jalankan, dengan segera preprosesor memindai kode-kode kamu, untuk mencari instruksi yang diawali dengan simbol #, dan melakukan sesuai dengan fungsi dari instuksi tersebut. Untuk instruksi #include <...>, preprosesor dengan segera akan mempersiapkan library yang dimaksud, untuk dicompile bareng-bareng saat proses compiling berlangsung, dan jadi deh file eksekusi (*.exe).

Binding?

Di dalam proses kompilasi binding berarti menghubungkan library (linker) dengan aplikasi (kode). Tapi saat di mana preprosesor memilah-milah kode tsb, untuk menemukan simbol pound (#) juga bisa disebut binding lho.

Perbedaan antara associative array dengan array antara lain, jika pada array indeksnya menggunakan angka / integer maka pada associative array indeksnya dapat menggunakan angka ataupun string.

Contoh:

- Array dalam PHP:

$movie = array(0 => "Shaolin Monk",
               1 => "Drunken Master",
               2 => "American Ninja",
               3 => "Once upon a time in China",
               4 =>"Replacement Killers" );

- Associative Array dalam PHP:

$student_one = array("Maths"=>95, "Physics"=>90, 
                  "Chemistry"=>96, "English"=>93, 
                  "Computer"=>98);

User-defined ordinal types adalah tipe data dengan rentang nilai yang dapat dengan mudah dikaitkan / diasosiasikan dengan himpunan bilangan bulat positif.

User-defined ordinal types yang di support bahasa-bahasa pemrograman, yaitu:
1. Enumeration types merupakan sebuah kumpulan nilai pasti seperti nama konstan yang tersedia dan disebut satu-persatu dalam definisi. Contohnya:

enum hari { Mon,
           Tue,
           Wed,
           Thur,
           Fri,
           Sat,
           Sun };

2. Sub range types merupakan bagian dari tipe data lain dan berada dalam sebuah jangkauan yang telah ditetapkan oleh programmer. Contohnya:

type Hari is (Mon, Tue, Wed, Thur, Fri, Sat, Sun);
subtype HariAktif is Hari range Mon..Fri;

Strongly Typed Language adalah konsep yang digunakan untuk merujuk ke bahasa pemrograman yang memberlakukan pembatasan ketat pada pencampuran nilai dengan tipe data yang berbeda. Ketika pembatasan tersebut dilanggar dan kesalahan (pengecualian) terjadi.

Salah satu contoh bahasa pemrograman yang masuk dalam kategori strongly-typed adalah Java. Ini sebabnya:

  • Setiap variable harus mempunyai tipe. setiap ekspresi harus mempunyai tipe dan setiap tipe harus di definisikan secara ketat.
  • Semua penugasan, baik eksplisit atau via pelewatan parameter di pemanggilan metode melewati pemeriksaan kompatibilitas tipe.
  • Kompilator java memeriksa semua ekspresi dan parameter untuk menjamin tipe-tipenya kompatibel. setiap ketidak cocokan tipe adalah kesalahan yang harus dikoreksi pemrogram sehingga kode sumber dapat di kompilasi.

Mixed-mode expressions adalah expression yang salah satu operandnya memiliki tipe data yang berbeda.

void mymethod() {
 int a, b, c;
 float d;

 a = b * d;
}

Coercions adalah konversi tipe data yang dilakukan secara implisit oleh compiler

double a;
a= 5;.

Relational vs Boolean expressions.

Persamaan: kedua nya sama-sama me-return nilai bertipe boolean (true/false)

Perbedaannya:

- memiliki operator relatoinal ; Boolean: memiliki operator boolean
- memiliki operand dari berbagai macam tipe (int, float, double, char, byte, dll) ; memiliki operand bertipe boolen (true/false)

Kategori expression:

1. Arithmetic expression, terdiri dari operator, operand, parentheses dan function call.

int a = 1 * 5;

2. Relational expression, digunakan untuk melakukan suatu pembanding antara 2 ekspresi atau nilai untuk mendapatkan nilai true atau false.

int a = 3;
int b = 4;
boolean c = a > b;

3. Boolean expression, terdiri dari variabel boolean, konstanta Boolean, ekspresi relasional dan operator Boolean.

boolean a = true;
boolean b = false;
boolean c = a && b;

Overloaded subprogram adalah sebuah subprogram yang mempunyai nama yang sama dengan nama subprogram lain di dalam referencing environment yang sama.

Karakteristiknya:
- Setiap versi dari suatu overloaded subprogram mempunyai protocol yang berbeda (unique), yaitu satu sama lain berbeda dalam hal banyaknya, urutan, dan tipe data dari parameternya, dan dapat juga berbeda dalam return type nya.
- Bahasa C++, Java, C#, and Ada mempunyai predefined overloaded subprograms.
- Dalam bahasa Ada, return type dari overloaded function dapat digunakan untuk memastikan (disambiguate) calls, sehingga dua buah overloaded functions dapat mempunyai parameter yang sama.
- Karena bahasa C++, Java dan C# memperbolehkan mixed-mode expression maka return type tidak relevan dalam membedakan overloaded functions.
- Bahasa Ada, Java, C++, and C# memperbolehkan banyak versi dari subprograms dengan nama yang sama,

Disini saya melampirkan contoh nesting selection menggunakan bahasa PHP.

<?php

$umur = 17;
$menikah = false;

if($umur > 18){
    if($menikah){
        echo "Selamat datang pak!";
    } else {
        echo "Selamat datang wahai pemuda!";
    }
} else {
    echo "Maaf website ini hanya untuk yang sudah berumur 18+";
}
?>

Control statements adalah statement yang mengatur jalannya alur program dan dapat mengatur hasil keluaran dari program.

Control statement umumnya terdiri dari:

-Selection
-Iteration

Contoh pada bahasa Python:

-Selection

a = 33
b = 200
if b > a:
  print("b is greater than a")

-Iteration

count = 0
while (count < 3):   
    count = count + 1
    print("Hello Geek")
else:
    print("In Else Block")

Enkapsulasi Multiple Tipe

Tipe data abstrak adalah suatu bentuk enkapsulasi yang minimal, yaitu enkapsulasi anatara data dan method (data members dan member functions). Diperlukan suatu enkapsulasi multiple tipe (multiple-type encapsulation) untuk memecahkan problem-problem yang ada dalam suatu program yang sangat besar.

Penyembunyian Data (Information Hiding) dalam Encapsulasi secara umum menggunakan klausa Private, Protected, Public (dan ada beberapa tanpa klausa sebagai default). Umumnya klausa tersebut berlaku sebagai berikut:

  • Private:  digunakan untuk entititas yang tersembunyi dari unit manapun kecuali dari class itu sendiri.
  • Public: bisa diakses olehclass lain manapun.
  • Protected: bisa diakses oleh class sendiri beserta turunannya.

Beberapa bahasa pemrograman menggunakan tanpa klausa sebagai default: bisa diakses oleh class lain dalam satu package yang sama

Contoh:
class User {
private String username;
private String password;
// ini method setter
public void setUsername(String username){
this.username = username;
}
public void setPassword(String password){
this.password = password;
}
// ini method getter
public String getUsername(){
return this.username;
}
public String getPassword(){
return this.password;
}
}

Penggunaan abstraksi data secara luas tentu mengikuti penggunaan proses abstraksi, karena bagian integral dan penting dari setiap abstraksi data adalah operasinya, yang didefinisikan sebagai abstraksi proses.

Tipe Data Abstrak

Implementasi dari konsep abstraksi data adalah tipe data abstrak. Tipe data abstrak adalah tipe data yang ditentukan pengguna yang memenuhi dua kondisi berikut:

Representasi objek dari tipe tersebut tersembunyi dari unit program yang menggunakan objek ini, jadi satu-satunya operasi yang mungkin adalah melalui operasi yang disediakan di dalam definisi tipe tersebut

Deklarasi tipe dan protokol untuk operasi pada objek tipe tersebut terkandung dalam unit sintaks tunggal. Unit program lain diizinkan untuk membuat variabel dari tipe yang ditentukan tersebut.

Contoh:
Stack (int size) {
stk_ptr = new int [size];
max_len = size - 1;
top = -1;
};
Stack stk(150);

Method overloading artinya method dengan nama yang sama, namun memiliki parameter yang berbeda, dan method ini berada dalam sebuah class yang sama atau bisa juga berada dalam class yang lain yang terkait dalam hirarki inheritance.

Method overriding artinya memberikan implementasi yang baru dari suatu method pada subclass, jadi method ini berada pada class yang berbeda yang terkait dalam inheritance.

Contoh overloading pada java :

class Pertambahan{
 public void tambah1(){
  int a=5, b=10;
  System.out.println("Hasil Pertambahann dari metod tambah1 ke-1 = "+(a+b));
 }
 //Metod tambah1 di overloading dengan 2 parameter (int x, int y)
 public void tambah1(int x, int y){
  System.out.println("Hasil Pertambahann dari metod tambah1 ke-2 = "+(x+y));
 }
 public static void main(String [] args){
  Pertambahan pp;
  pp = new Pertambahan();
  pp.tambah1();//memanggil metod tambah1 ke-1
  pp.tambah1(5,5);//memanggil metod tambah1 ke-2
 }
}

Contoh overriding pada java :

class Nama{
 public void Sapa(){
  System.out.println("Achmad Cahya Aditya");
 }
 public static void main(String [] args){
  Siapa ss;
  Nama nn;
  ss = new Siapa();
  nn = new Nama();
 
  ss.Sapa();//memanggil method Sapa() pada class Siapa
  nn.Sapa();//memanggil method Sapa() pada class Nama
 }
}
class Siapa extends Nama{
 //Method Sapa() pada class Nama di override
 public void Sapa(){
  System.out.println("Yesica Dwi Lestari");
 }
}

Terdapat beberapa permasalahan / konsep yang sering dibicarakan terkait rancangan dari bahasa-bahasa pemrograman yang menyediakan fitur inheritance dan dynamic binding (dalam OOP), yaitu:

  • Exclusivity of objects. Apakah setiap entitas diperlakukan object atau gabungan dari imperative-style dan object?
  • Apakah Subclass merupakan subtype? Apakah turunan (subclass) dari suatu class diiperlakukan sebagai subtype dari class tersebut? Jika subclass diperlakukan sebagai subtype maka variabel dari suatu class dapat digantikan oleh variabel lain dari parent classnya tanpa menyebabkan type error dan perubahan behavior program.
  • Single and Multiple Inheritance. Apakah suatu class dapat mewarisi lebih dari satu class atau hanya diperbolehkan mewarisi satu class?
  • Allocation and Deallocation of objects. Bagaimana object dialokasikan dan didealokasikan? Apakah dialokasikan secara stack dynamic atau heap dynamic? Apaka dealokasi dilakukan secara implicit atau explicit?
  • Dynamic and Static Binding. Apakah binding antara message dengan method dilakukan secara dynamic atau static?
  • Nested class. Apakah diperbolehkan suatu class didefinsikan dalam suatu class lainnya? Nesting class merupakan class yang didalamnya mendefinisikan nested class. Jika diperbolehkan terdapat nested class, member nested class mana saja yang dapat diakses oleh nesting class? Begitu juga member nesting class, member mana saja yang dapat diakses oleh nested class?
  • Initialization of Objects. Apakah suatu object harus diinisialisasi secara manual oleh programmer, atau dapat dilakukan melaui suatu mekanisme implicit?

Private modifier akan membuat member hanya bisa diakses dari dalam class itu sendiri
Public modifier akan membuat member dan class bisa diakses dari mana saja.
Protected modifier akan membuat member dan class hanya bisa diakses dari class itu sendiri, subclass atau class anak, dan package (class yang berada 1 package dengannya)

Semaphore adalah alat untuk sinkronisasi yang tidak membutuhkan busy waiting. Semaphore S berupa variable integer. Semaphore hanya dapat diakses melalui operasi atomic yang tak dapat diinterupsi sampai kode selesai. Operasi dari semaphore S adalah wait dan signal.

Cooperation Synchronization dengan Semaphores : Contohnya adalah shared buffer.

  • Buffer diimplementasikan sebagai tipe data abstrak dengan operasi DEPOSIT dan FETCH yang menjadi acara untuk mengakses
  • Menggunakan 2 semaphore untuk cooperation yaitu : emptyspots dan
  • Balasan dari semaphore biasanya digunakan unyuk menyimpan angka dari emptyspots dan fullspots pada
  • DEPOSIT pertama kali harus memeriksa adanya ruang pada buffer.Bila ada,maka counter dari emptyspots akan dikurangi dan nilai akan dimasukkan. Bila tidak ada ,pemanggil akan disimpan pada barisan dari
  • Setelah DEPOSIT selesai,maka counter of fullspots akan dinaikkan
  • FETCH pertama kali wajib memeriksa fullspots untuk melihat apaka adanya nilai.Jika ada fullspot,counter dari fullspots akan berkurang dan nilai akan dihilangkan .Jika tidak ada nilai,maka pemanggil harus memindahkan pada antrian Ketika FETCH telah selesai , maka counter of emptyspots akan naik.

Competition Synchronization dengan Semaphores menggunakan semaphore ketiga yang dinamakan access yang digunakan untuk control akses.Counter dari akses hanya memiliki nilai 0 dan 1 .Inilah yang disebut sebagai binary semaphore.Perhatikan juga wait dan release harus atomic.

-New = Task sudah dibuat tapi belum dijalankan
-Ready = Task siap untuk dijalankan, tapi sedang tidak dijalankan
-Running = Task sedang dijalankan oleh prosesor
-Dead = Task sudah tidak aktif lagi
-Blocked = Task sudah berjalan, namun tertahan(biasanya menunggu event tertentu)

Concurrency merupakan landasan umum perancangan sistem operasi. Proses-proses disebut concurrency jika proses-proses (lebih dari satu proses) berada pada saat yang sama. Proses-proses yang mengalami kongkuren dapat berdiri sendiri (independen) atau dapat saling berinteraksi, sehingga membutuhkan sinkronisasi atau koordinasi proses yang baik. Untuk penanganan kongkuren, bahasa pemograman saat ini telah memiliki mekanisme kongkurensi dimana dalam penerapannya perlu dukungan sistem operasi dimana bahasa berada.

Dalam menjalankan suatu program, ada beberapa hal yang harus diperhatikan yaitu:

  • Program: file yang dieksekusi
  • Proses: dalam menjalankan suatu program, pasti ada proses
  • Thread: proses ringan, semua proses pasti memiliki thread dan semua thread yang berhubungan dengan proses umum pasti memiliki memory umum.
  • Task: mirip dengan thread tapi tidak berhubungan langsung dengan operating system dan tidak membuat thread operating system sendiri.

Terdapat berbagai tingkatan level yaitu:

  • Instruction level:eksekusi dua atau lebih mesin instruksi secara bersamaan.
  • Statement level: eksekusi dua atau lebih statement secara bersamaan.
  • (Subprogram) Unit level: eksekusi dua atau lebih subprogram secara bersamaan.
  • Program level: eksekusi dua atau lebih program secara bersamaan.

Terdapat dua jenis concurrency dalam unit control, yaitu:

  • Physical concurreny:anggapan bahwa ada lebih dari satu processor sehingga beberapa sub program dijalankan bersamaan.
  • Logical concurrency:anggapan bahwa ada banyak processor yang menyediakan concurrency, yang pada kenyataannya hanya terdapat satu processor yang interleaved saat program dieksekusi.

Karena concurrency dapat menjalankan lebih dari satu program maka synconisasi dibutuhkan untuk menjalankan proses dengan baik. Sinkronisasi merupakan suatu mekanisme yang bertujuan unutk mengatur urutan-urutan task yang akan dieksekusi.

Task merupakan unit program yang dapat dieksekusi bersamaan dengan unit lain dalam suatu program.terdapat dua jenis umum task dalam suatu program yaitu:

  • Heavyweight tasks yang dapat dieksekusi dalam addressnya masing-masing.
  • Dan lightweight task yang dapat dieksekusi dalam address yang sama.

Task dapat dikatakan disjoint apabila task tersebut tidak dapat berhubungan dengan task yang lain dalam suatu program.

Beberapa isu dalam desain  exception handling dapat diringkas sebagai berikut:

  • Bagaimana dan dimana exception handler dinyatakan, dan bagaimana scope nya ?
  • Bagaimana suatu exception dapat dikaitkan (bound) pada suatu handler.
  • Apakah informasi tentang exception dapat dikirimkan ke handler ?
  • Kemana kendali eksekusi dialihkan setelah handler selasai?
  • Apakah suatu bentuk finalization disediakan?
  • Bagaimana user-defined exception dinyatakan?
  • Jika pre-defined exception disediakan, apakah ada default handler untuk program yang tidak melengkapinya?
  • Apakah pre-defined exception dapat dibangkitkan (raised) secara implicit?
  • Apakah suatu hardware-detectable error diperlakukan sebagai exception yang dapat di-handle?
  • Apakah menyediakan pre-defined exception?
  • Apakah pre-defined exception dapat di-disable?

Dalam bahasa pemrograman yang 'tidak memiliki' exception handling:

  • Ketika exception terjadi, kontrol masuk ke sistem operasi, dimana pesan/message ditampilkan dan kemudian program dihentikan.

Dalam bahasa pemrograman yang 'memiliki' exception handling

  • Program diizinkan untuk menangkap exception (boleh lebih dari satu), sehingga memberikan kemungkinan untuk memperbaiki masalah dan melanjutkan eksekusi.

Lambda calculus menjelaskan secara spesifik parameter-parameter suatu fungsi serta pemetaan (mapping) yang terdapat dalam fungsi tersebut. Lambda calculus secara umum merupakan model penghitungan menggunakan notasi lambda (λ) yang menghasilkan metode mudah dalam mendefinisikan fungsi-fungsi dalam jumlah besar. Notasi lambda (atau disebut sebagai lambda notation) diusulkan oleh Alonzo Church pada tahun 1941. Lambda calculus dapat dituliskan secara langsung maupun tidak langsung. Penulisan lambda calculus secara tidak langsung merupakan inspirasi bagi functional programming languages.

Contoh penggunaan lambda calculus:

λ(x)x+x+x(7) menghasilkan nilai 21. Bentuk tersebut sama dengan 7+7+7.
λ(x)x*x+x(8) menghasilkan nilai 72. Bentuk tersebut sama dengan 8*8+8.
λ(x,y)x-y+y(7,6) bernilai 7. Bentuk tersebut sama dengan 7-6+6.
Dalam LISP menggunakan sintaks (function_name(LAMBDA(arg1 ... argn) expr)).

Perbandingan Antara Bahasa Fungsional dan Imperatif

• Bahasa Imperatif:

  1. Eksekusi yang efisien
  2. Semantik kompleks
  3. Sintaks yang kompleks
  4. Concurrency dirancang oleh pemrogram

• Bahasa Fungsional:

  1. Semantik sederhana
  2. Sintaks sederhana
  3. Eksekusi yang kurang efisien
  4. Program dapat dibuat secara bersamaan

Pemrograman Fungsional adalah cara pemrograman yang berdasarkan teori fungsi matematika dan berfokus pada hasil komputasi, dimana proses komputasi diperlakukan sebagai evaluasi fungsi-fungsi matematika. Cara pemrograman fungsional bisa menjadikan program lebih ekpresif (menggunakan koding lebih sedikit untuk mengimplementasikan sesuatu ide) sehingga programer dapat menjadi lebih produktif.

Bahasa yang termasuk Functional Programming Language adalah Perl 6, Erlang, Elixir, Lisp, Clojure, Elixir, Elm, F#, Haskell, Idris, Scala.

Beberapa konsep dasar dari FPL:

  • Pure FPL tidak menggunakan variabel maupun assignment statement, seperti halnya pada mathematical function. Pemrogram terbebas dari perlunya memahami memory-cell, atau state dari program.
  • Tanpa variabel, FPL tidak dapat menyediakan fasilitas perulangan dalam bentuk iterasi, karena iterasi memerlukan variabel pengontrol. Pengulangan harus dilakukan dalam bentuk rekursi.
  • Dalam FPL, hasil evaluasi dari suatu fungsi selalu memberikan hasil yang sama selama parameternya sama. Fitur ini disebut referential transparency.
  • Walaupun pengulangan dengan recursion berjalan dengan lambat, namun compiler dapat secara otomatis mengkonversi fungsi rekursif tertentu ( yang disebut tail recursion), kedalam fungsi iteratif.

Salah satu contoh bahasa pemrograman yang menggunakan konsep FPL adalah LISP.

Logic lang

Programs di dalam logic languages dituliskan dalam bentuk symbolic logic, dan menggunakan metode logical inferencing untuk memberikan suatu hasil. Logic programming bersifat declarative, konstras dengan procedural . Dengan kata lain, program fokus pada menyatakan spesifikasi dari yang akan dihasilkan, bukan langkah langkah detil untuk mencapai hasil.

Pemrograman yang menggunakan suatu bentuk symbolic logic sebagai bahasa untuk memprogram biasa disebut logic programming, dan bahasa yang didasarkan pada symbolic logic biasa disebut logic programming languages atau declarative languages. Salah satu bahasa tersebut adalah Prolog. Symbolic logic yang digunakan di dalam Logic Programming dinamakan first order predicate calculus, atau ringkasnya predicate calculus. Berikut ini adalah beberapa terminologi yang
digunakan di dalam predicate calculus.

Contoh sederhana kode dalam prolog:

Proposition:

hobi(ali, bersepeda).
hobi(budi, memancing).
hobi(cici, bersepeda).
hobi(dono, berkebun).
hobi(endi, bersepeda).

Query

hobi(ali, X), hobi(dono, Y).

Output:

X = bersepeda,
Y = berkebun




Top