Bahasa Pemrograman



cover buku pemrograman
Buku Sihir Pemrograman,
Sentuh [klik] dan pelajari kekuatannya!



Bahasa pemrograman adalah sebuah bahasa formal atau baku yang terdiri dari sekumpulan instruksi untuk menghasilkan berbagai macam keluaran atau output. Bahasa pemrograman digunakan pada kegiatan pemrograman guna dapat mengimplementasikan algoritma pada sebuah komputer.

Sebagian besar bahasa pemrograman terdiri dari kumpulan instruksi untuk berbagai macam komputer. Terdapat juga mesin program yang dapat digunakan untuk membuat instruksi khusus terhadap suatu sistem khusus ketimbang membuat sebuah instruksi yang bersifat umum pada seluruh komputer. Pada masa awal pengembangan komputer digital, penemuan awal bahasa pemrograman adalah pembuatan seruling otomatis yang dijelaskan pada abad ke-9 oleh Musa di wilayah Baghdad, pada masa keemasan Islam (Koetsier, Teun.  2001). Namun sejak tahun 1800an, perintah program mulai digunakan untuk mengarahkan perilaku suatu mesin seperti alat tenun Jacquard, kotak musik, dan permainan piano (Ettinger, James. 2004). Namun, program-program instruksi yang dibuat tersebut tidak menghasilkan kondisi yang berbeda terhadap input ketika diberikan masukan perintah yang berbeda atau kondisi yang berbeda terhadap hasil output yang dikeluarkan.

Ratusan bahkan tibuan bahasa pemrograman telah banyak sekali diciptakan, dan hampir selalu ada pada tiap tahunnya. Banyak bahasa pemrograman yang ditulis dalam format yang imperatif atau berupa urutan operasi perintah, dan ada juga bahasa pemrograman yang lain yang diciptakan dalam format yang deklaratif atau hasil yang diinginkan sudah ditentukan.

Deksripsi dari bahasa pemrograman biasanya terbagi menjadi dua komponen dari sintak atau form dan semantik atau makna. Beberapa bahasa pemrograman juga didefinisikan oleh dokumen khusus. Contoh, Bahasa C yang ditentukan oleh ISO Standard. Sementara bahasa pemrograman yang lain seperti Perl memiliki implementasi dominan yang diberlakukan sebagai sebuah referensi. Dan beberapa bahasa pemrograman lainnya juga ada yang memiliki kedua komponen tersebut, dengan bahasa dasarnya yang didefinisikan oleh suatu standar khusus dan ekstensinya mengambil dari implementasi dominan secara umum untuk sebuah bahasa pemrograman.

Definisi
Bahasa pemrograman adalah bentuk notasi untuk menulis sebuah bahasa program (Aaby, Anthony. 2004), yang ditentukan dari sebuah komputasi atau algoritma tertentu (Aaby, Anthony. 2004) (MacLennan, Bruce J. 1987). Sementara, beberapa orang lainnya juga ada yang berpendapat bahwa bahasa pemrograman adalah sebuah notasi yang dapat mengekspresikan segala macam algoritma program komputer. Berikut adalah beberapa ciri khas yang sering dianggap penting yang merupakan bagian dari suatu bahasa pemrograman:

Fungsi dan target
Bahasa pemrograman adalah bahasa yang digunakan untuk menulis kode program, yang didalamnya termasuk kemampuan komputer dalam melakukan komputasi (ACM SIGPLAN. 2003) atau algoritma dan memungkinkan untuk melakukan pengendalian eksternal terhadap perangkat lain seperti printer, disk drive, robot (Dean, Tom. 2002), dan lain sebagainya. Contoh, bahasa pemrograman PostScript yang secara berkala diciptakan oleh program lain untuk mengendalikan printer komputer atau layar monitor. Secara lebih umum, sebuah bahasa pemrograman bisa saja mendeskripsikan komputasi pada beberapa mesin tertentu. Sehingga disepakati bahwa spesifikasi lengkap dari bahasa pemrograman apabila mengandung sebuah deskripsi dari perangkat mesin atau procesor untuk bahasa pemrograman tersebut (R. Narasimahan dalam Franz Alt, Morris Rubinoff. 1994). Pada konteks praktiknya, sebuah bahasa pemrograman biasanya melibatkan sebuah komputer dimana bahasa pemrograman akan didefinisikan dan dipelajari pada kondisi tersebut (Ben Ari, Mordechai.1996). Bahasa pemrograman berbeda dari bahasa alami yang biasa digunakan manusia dalam berkomunikasi, dimana bahasa pemrograman hanya dapat digunakan oleh manusia untuk berkomunikasi melalui sekumpulan instruksi terhadap mesin.

Abstraksi
Bahasa pemrograman umumnya mengandung abstraksi untuk definisi dan manipulasi struktur data atau untuk mengendalikan alur eksekusi suatu program. Untuk kebutuhan praktis, biasanya bahasa pemrograman digunakan untuk mendukung abstraksi yang diekspresikan melalui suatu prinsip tertentu (David A. Schmidt. 1994). Prinsip tersebut terkadang diformulasikan sebagai sebuah rekomendasi bagi para programmer untuk membuat sebuah abstraksi secara layak (Pierce, Benjamin. 2002).

Kemampuan ekspresif
Pada teori komputasi, bahasa pemrograman diklasifikasikan berdasarkan kemampuan ekspresi komputasinya. Semua bahasa Turing dapat menerapkan implementasi yang sama dari sekumpulan algoritma. ANSI/ISO SQL-92 dan Charity adalah contoh dari bahasa yang bukan bagian dari Turing complete, namun demikian tetap disebuat sebagai suatu bahasa pemrograman (Digital Equipment Corporation. 2006) (The Charity Development Group. 1996).

Bahasa markup seperti XML, HTML, atau troff, yang didefinisikan sebagai suatu struktur data, biasanya tidak dianggap sebagai suatu bahasa pemrograman (XML in 10 points Archived. 2009) (Powell, Thomas. 2003) (Dykes, Lucinda dan Tittel, Ed. 2005). Bahasa pemrograman juga mungkin untuk saling berbagi sintak dengan bahasa markup lainnya jika semantik komputasinya dapat didefinisikan. Contoh, XSLT adalah bahasa Turing complete yang sepenuhnya menggunakan sintak XML (IBM.com. 2011) (Msdn.microsoft.com. 2010) (Scott, Michael. 2006). Juga, bahasa LaTeX, yang secara umum digunakan untuk strukturisasi dokumen, juga mengandung subset Turing complete (Oetiker,T. Partl,H. Hyna,I. Schlegl, E. 2016) (Syropoulos,A. Antonis,T. Nick,S. 2003 ).

Istilah bahasa komputer terkadang digunakan secara bergantian terhadap istilah bahasa pemrograman (Robert A. Edmunds. 1985). Namun demikian, penggunaan dari kedua istilah tersebut bervariasi diantara para pengembang, termasuk ranah eksak dari setiap istilah itu sendiri. Ada juga yang mendeskripsikan bahasa pemrograman adalah sebuah subset dari bahasa komputer (Pascal.L, Anne.L, Gilles.K, dan Frédéric.F. 2015). Demikian pula, bahasa yang digunakan dalam komputasi yang memiliki tujuan berbeda dari program komputer yang diekspresikan secara umum pada bahasa komputer. Contoh, markup language terkadang dimaknai sebagai bahasa pemrograman untuk menekankan bahwa makrup language tidak dimaksudkan untuk digunakan pada pemrograman (S.K.Bajpai. 2007).

Deskripsi lain juga mengatakan bahwa bahasa pemrograman adalah sebagai sebuah konstruksi teoritis dari program abstraksi mesin, dan bahasa komputer sebagai subset yang berjalan diatasnya pada perangkat tersebut, yang tentu saja memiliki keterbatasan sumber daya (R. Narasimahan. 1994). John C. Reynolds menekankan bahwa bahasa spesifikasi formal sama banyaknya dengan bahasa pemrograman yang dimaksudkan untuk dieksekusi. Renolds juga berpendapat bahwa format input grafik atapun tekstual akan memberikan dampak terhadap kebiasaan komputer dari bahasa pemrograman, meskipun hal tersebut umumnya bukanlah bahasa Turing-complete, dan menyatakan ketidaktahuan konsep bahasa pemrograman adalah alasan dari banyak kekurangan pada format input (John C. Reynolds. 2008).

Sejarah
Komputer yang dikembangkan pada masa awal, seperti pada masanya Colossus, diprogram tanpa bantuan program penyimpanan yang dimodifikasi oleh sirkuit atau setting-an dari perangkat keras. 

Dan setelah masa tersebut, program komputer selanjutnya sudah mulai ditulis dalam bahasa mesin, dimana programmer membuat setiap instruksi pada form numerik yang akan dieksekusi secara langsung oleh perangkat keras. Contoh, instruksi penambahan nilai dalam dua lokasi memori yang terdiri dari 3 angka: dimana 'opcode' yang menyeleksi operasi dan 'add' untuk penambahan, serta dua lokasi memori lainnya. Program tersebut, dibuat dalam format biner ataupun desimal dan akan dibaca oleh punched card, paper tape, atau magnetic tape pada sakelar aktif pada panel komputer. Mesin tersebut kemudian dikenal dengan istilah bahasa pemrograman generasi pertama atau first-generation programming languages (1GL).

Pengembangan selanjutnya dikenal dengan istilah second-generation programming languages (2GL) atau bahasa pemrograman generasi ke dua atau juga dikenal dengan istilah assembly languages, yang masing terikat erat pada sekumpulan instruksi arsitektur dari komputer tertentu. Bahasa tersebut disiapkan untuk membuat program agar lebih mudah dibaca manusia dan meringankan beban programmer dari kesalahan penghitungan alamat memori.

Generasi pertama dari bahasa pemrograman tingkat tinggi atau juga dikenal dengan istilah third-generation programming languages (3GL), dikembangkan pada tahun 1950an. Dan juga merupakan bahasa pemrograman awal yang dirancang untuk sebuah komputer yang diberi nama Plankalkul, yang dikembangkan untuk German Z3 oleh Konrad Zuse antara tahun 1943 dan tahun 1945. Namun demikian, bahasa pemrograman tersebut belum pernah diimplementasikan penggunaannya hingga tahun 1998 dan tahun 2000 (Rojas.R, et al. 2000).

John Mauchly Short Code, dipersiapkan pengembangannya pada tahun 1949, dan merupakan bahasa pemrograman tingkat tinggi yang dikembangkan untuk komputer elektronik (Sebesta.W.S. 2006). Tidak seperti kode mesin, statement short code merepresentasikan ekspresi matematis dalam format yang bisa dipahami. Namun, program tersebut juga harus diterjemahkan ke dalam kode mesin setiap kali dijalankan, dimana hal ini akan membuat proses menjadi lebih lambat jika dibandingkan dengan menggunakan kode mesin.

Hal serupa juga terjadi di Universitas Manchester, Alick Glennie mengembangkan Autocode pada sekitar awal tahun 1950an. Dimana sebagai sebuah bahasa pemrograman, Autocode digunakan sebagai kompilator untuk melakukan konversi otomatis bahasa pemrograman menjadi kode mesin. Kode dan kompilator pertama yang dikembangkan pada tahun 1952 untuk komputer Mark 1 pada Universitas Manchester dianggap sebagai bahasa pemrograman tingkat tinggi yang pernah dikompilasi oleh kompilator (Encyclopedia of Computer Science and Technology. 7: 419–493) (Peter J.B. 2012).

Generasi Autocode kedua dikembangkan untuk komputer Mark 1 oleh R. A. Brooker pada tahun 1954 dan dinamai dengan nama "Markt 1 Autocode". Brooker juga mengembangkan Autocode untuk Ferranti Mercuri pada tahun 1950an bersama dengan Universitas Manchester. Versi dari EDSAC2 dirangkai oleh D. F. Hartley dari Universitas Cambridge Mathematical Laboratory pada tahun 1961, yang dikenal dengan nama EDSAC 2 Autocode, yang dikembangkan langsung dari adaptasi Mercury Autocode untuk pengkondisial lokal dan terkenal karena kemampuan mengoptimalkan kode objek dan merupakan source-language diagnostics yang canggih pada masa tersebut. Semasa pada jamannya namun pada lokasi yang terpisah, Atlas Autocode juga dikembangkan untuk mesin Atlas 1 Universitas Manchester.

Pada tahun 1954, bahasa FORTRAN berhasil dikembangkan di IBM oleh John Backus. FORTRAN merupakan bahasa pemrograman pertama yang digunakan secara luas dengan tujuan untuk memiliki fungsi implementasi yang bukan hanya desain sebatas kertas ("Fortran creator John Backus dies - Tech and gadgets". NBC News. 2007) (Math.grin.edu. 2010). FORTRAN juga merupakan bahasa pemrograman yang masih populer untuk komputasi dengan performa yang besar (Eugene.Loh. 2010) dan juga digunakan untuk program dalam pengukuran dan penentuan peringkat super komputer tercepat di dunia ("HPL – A Portable Implementation of the High-Performance Linpack Benchmark for Distributed-Memory Computers". 2015)

Perkembangan awal lainnya dari bahasa pemrograman adalah dikembangkan oleh Grace Hopper di Amerika, yang dikenal dengan nama FLOW-MATIC. Bahasa tersebut dikembangkan untuk UNIVAC I pada Remington Rand selama periode dari tahun 1955 hingga tahun 1959. Hopper menemukan bahwa para pelanggan dalam bisnis data prosesing merasa kurang nyaman dengan penggunaan notasi matematika, sehinga pada tahun 1955, dia dan timnya membuat sebuah spesifikasi untuk bahasa pemrograman dalam bahasa Inggris dan diimplementasikan sebagai subuah prototipe (Hopper. 1978). Kompilator FLOW-MATIC mulai tersedia secara publik pada tahun 1958 dan diselesaikan pada tahun 1959 (Sammet. 1969). FLOW-MATIC merupakan pengaruh utama dalam pengembangan COBOL, karena bahasa yang tersedia pada saat itu hanya ada bahasa tersebut dan merupakan turunan langsung dari AIMACO yang benar-benar digunakan pada masa itu (Sammet. 1978).

Refinement
Meningkatnya penggunaan bahasa pemrograman tingkat tinggi juga turut untuk diperkenalkannya penggunaan dari bahasa pemrograman tingkat rendah atau low-level programming language atau juga dikenal dengan istilah bahasa pemrograman sistem. Bahasa pemrograman tingkat rendah memiliki tingkat variasi yang berbeda yang menyediakan fasilitas antara bahasa assembly dan bahasa tingkat tinggi. Bahasa tersebut dapat digunakan untuk mengerjakan tugas yang membutuhkan akses langsung menuju ke fasilitas perangkat keras namun tetap menyediakan kendali struktur tingkat tinggi dan pemeriksaan error

Masa mengembangan bahasa tingkat rendah dimulai dari tahun 1960 hingga akhir tahun 1970 telah membawa paradigma baru terhadap bahasa pemrograman yang masih digunakan hingga saat ini, seperti:

satu, Perkenalan APL pemrograman array dan pengaruh komputasi fungsional (Richard.L.W. 1981).
dua, ALGOL memberikan peningkatan pada pemrograman prosedur terstruktur dan juga pada disiplin spesifikasi bahasa; "Revised Report on the Algorithmic Language ALGOL 60" menjadi standar model bagaimana sebuah bahasa pemrograman harus dibuat.
tiga, diimplementasikan pada tahun 1958, merupakan bahasa pemrograman fungsi tipe dinamis pertama.
empat, Pada tahun 1960an, Simula merupakan bahasa pemrograman yang dirancang untuk mendukung pemrograman berorientasi objek, dimana pada mertengahan tahun 1970an, dikembangkan bahasa pemrograman Smalltalk yang merupakan bahasa pemrograman berbasis objek murni pertama yang berhasil untuk dikembangkan.
lima, Bahasa C dikembangkan antara tahun 1969 dan tahun 1973 sebagai bahasa pemrograman sistem untuk sistem operasi Unix dan masih populer hingga saat ini (François.L. 2006).
enam, Prolog, dirancang pada tahun 1972 dan merupakan bahasa pemrograman logika pertama.
tujuh, pada tahun 1978, ML membangun sistem tipe polimorpik diatas bahasa pemrograman LISP, dan merupakan pioner dari pengembangan bahasa pemrograman fungsi tipe statistik.

Masing-masing dari bahasa perkembangan tersebut selanjutnya menghasilkan bahasa pemrograman turunan lainnya, dan sebagian besar dari bahasa pemrograman modern saat ini adalah turunan dari bahasa pemrograman tersebut. 

Tahun 1960an hingga tahun 1970an juga dikenal sebagai tahun perdebatan tentang manfaat pemrograman terstruktur, dan juga apakah sebuah bahasa pemrograman memang harus dirancang untuk hal tersebut (Hayes.B. 2006). Edsger Dijkstra, dapa publikasi terkenalnya pada tahun 1968 pada forum Communications of the ACM, berargumen bahwa statement Goto seharusnya dihilangkan dari semua bahasa pemrograman tingkat tinggi (Dijkstra dan Edsger W. 1968).

Konsolidasi dan perkembangan
Masa tahun 1980 adalah masa konsolidasi relatif. Mulai dari bahasa pemrograman C++ yang dikombinasikan dengan pemrograman berbasis objek dan juga pemrograman sistem. Pemerintah Amerika Serikat juga melakukan standarisasi bahasa pemrograman Ada, sebuah bahasa pemrograman sistem yang berasal dari turunan bahasa pemrograman Pascal dan diharapkan untuk bisa digunakan oleh perusahaan pertahanan. Di negara Jepang dan di beberapa negara lain, banyak mengeluarkan dana investasi untuk melakukan penyeledikan tetang apa yang dimaksud dengan bahasa pemrograman generasi kelima yang menggabungkan konstruksi pemrograman logika (Tetsuro,F. Takashi,C. Kazuaki,R. Akihiko,N. 1994). Peranan dari komunitas bahasa pemrogramanpun mulai berpindah untuk melakukan standarisasi ML dan Lisp, dimana tujuan awal dari komunitas tersebut adalah melakukan inovasi dan penemuan baru tentang paradigma pemrograman. Semua bentuk pergerakan tersebut dielaborasi dari ide-ide yang dikembangkan pada beberapa dekade sebelumnya. 

Trend dalam perancangan bahasa pemrograman untuk pemrograman sistem skala besar selama tahun 1980an telah meningkankan fokus dalam penggunaan modul oleh unit-unit organisasi skala besar pada penggunaan kode pemrograman. Modula-2, Ada, dan ML adalah bahasa pemrograman yang  pada tahun 1980an, yang juga sering dihubungkan dengan konstruksi pemrograman generik (Jim,B. 2004).

Perkembangan yang masif dari internet pada pertengahan tahun 1990an juga telah menciptakan peluang untuk bahasa pemrograman baru. Perl, merupakan sebuah bahasa pemrograman original berupa perangkat skrip Unix pertama yang di-released pada tahun 1987, dan juga sekaligus menjadi produk website dinamis yang umum digunakan pada masanya. Java selanjutnya hadir dan digunakan sebagai bahasa pemrogrman berbasis server, dan mesin virtual bytecode menjadi populer kembali dalam ranah komersial dengan moto perjanjian "Write once, run anywhere" (UCSD Pascal kembali menjadi terkenal untuk masa awal tahun 1980an). Pengembangan-pengembangan yang telah muncul tersebut pada dasarnya bukanlah suatu pengembangan yang sifatnya baru, melainkan suatu bentuk inovasi dari banyak paradigma dan bahasa pemrograman yang telah ada sebelumnya meskipun sebagai besar sintaknya berasal dari turunan bahasa pemrograman C.

Perkembangan bahasa pemrogramanpun masih terus berlanjut dalam dunia penelitian atau research maupun dunia industri. Hingga saat ini arah pengembangan menuju pada tahap pengembangan keamanan dan verifikasi reliabilitas, pengembangan modul baru, dan integrasi database seperti Microsoft LINQ.

Bahasa pemrograman generasi ke empat (4GL) adalah bahasa pemrograman yang bertujuan untuk menyediakan sebuah abstraksi tingkat tinggi dari perangkat keras internal komputer yang lebih lengkap daripada generasi ketiga. Sedangkan bahasa pemrograman generasi ke lima (5GL) adalah bahasa pemrograman yang berbasis penyelesaian masalah menggunakan beban atau paksaan yang diberikan terhadap program komputer, ketimbang menggunakan algoritma tertulis yang dibuat oleh programmer.

Elemen bahasa pemrograman
Semua bahasa pemrograman memiliki konstruksi blok penyusunan primitif untuk pendeskripsian data dan pemrosesannya atau aplikasi terapannya seperti pada program penambahan dua angka ataupun seperti proses seleksi dari kumpulan item yang disimpan pada program. Konstruksi primitif tersebut didefinisikan oleh aturan sintak dan semantik yang mendeskripsikan struktur dan makna terhadap masing-masing bahasa pemrograman.

Sintak
Bentuk permukaan atau hasil tampak dari sebuah bahasa pemrograman disebut dengan istilah sintak. Sebagian besar bahasa pemrograman pada dasarnya hanyalah utaian dari baris kode program yang terdiri dari untaian-untaian teks termasuk juga kata, angka-angka, dan fungsi, sama halnya seperti dalam aturan penulisan bahasa natural atau bahasa manusia. Dilain pihak, ada juga bahasa pemrograman yang sifatnya lebih grafis, yang menggunakan hubungan visual antara simbol dan penentuan program.

Sintak bahasa pemrograman dideskripsikan sebagai suatu kemungkinan sebuah kombinasi dari simbol yang berbentuk program dengan sebuah aturan sintektik yang benar. Makna-makna yang diberikan pada kombinasi simbol tersebut ditangani oleh semantik atau sebuah kode formal atau baku dalam sebuah referensi implementasi. Karena kebanyakan bahasa pemrograman bersifat tekstual, maka akan dijelaskan lebih lengkap tentang bahasa pemrograman dalam bahasan konsep yang lebih tekstual.

Sintak bahasa pemrograman umumnya didefinisikan menggunakan sebuah kombinasi dari ekspresi umum dan format Backus-Naur untuk struktur penulisannya. Berikut ditampilkan contoh bahasa pemrograman menggunakan bahasa pemrograman Lisp:

expression ::= atom | list
atom       ::= number | symbol
number     ::= [+-]?['0'-'9']+
symbol     ::= ['A'-'Z''a'-'z'].*
list       ::= '(' expression* ')'

Aturan penulisan mengikuti aturan sebagai berikut:
satu, Ekspresi dapat berupa atom atau list.
dua, Atom dapat berupa angka atau simbol.
tiga, Angka adalah sebuah urutan yang tidak bisa dihancurkan dari mulai yang bernilai satu ataupun lebih pada digit desimal, juga bisa ditampilkan bersama dengan simbol minus atau plus.
empat, Simbol adalah sebuah tulisan huruf yang dimulai dari angka 0 atau lebih dari bentuk karakter apapun.
lima, List adalah sepasang tanda kurung yang berpasangan atau saling cocok, yang didalamnya terdapat angka ataupun ekspresi lainnya.

Berikut ini adalah contoh urutan simbol yang dibentuk dengan baik dalam tata bahasa: 12345, (), dan (1 b c232).

Tidak semua program yang benar secara sintak berarti benar secara semantik. Banyak sekali bahasa pemrograman yang meliliki sintak yang benar tapi masih kacau secara semantiknya, baik itu secara aturan bahasa pemrograman, ataupun juga secara hasil yang dapat menghasilkan error pada saat penerjemahan programan ataupun eksekusi program. Dalam beberapa kasus, beberapa program dapat menunjukkan perilaku yang berada diluar dari aturan pendefinisiannya. Bahkan, jika bahasa pemrograman tersebut sudah baik secara bahasa, tetap saja bahasa pemrograman tersebut dapat menghasilkan makna yang tidak bisa dipahami oleh yang membuatnya.

Sebagai contoh dalam penggunaan bahasa sehari-hari, kita mungkin saja secara tidak sengaja memberikan arti pada suatu kalimat yang secara tata bahasa bernilai benar namun juga bisa bernilai salah:

"Colorless green ideas sleep furiously." secara aturan penulisan sudah benar tetapi makna yang terkandung didalamnya tidak bisa diterima secara umum.

"John is a married bachelor." secara aturan penulisan sudah bernilai benar tetapi secara ekspresi maknanya bernilai tidak benar.

Pada bahasa pemrograman C contohnya, diberikan simbol program yang secara sintak sudah benar namun secara semantik tidak bisa didefinisikan hasilnya seperti:

complex *p = NULL;
complex abs_p = sqrt(*p >> 4 + p->im);

Operasi dari *p >> 4 adalah tipe pointer dan p_im tidak terdefinisi karena p bernilai pointer null. Jika tipe deklarasi pada baris pertama dihilangkan, maka program dapat menghasilkan error ketika dilakukan kompilasi program karena p adalah variabel yang tidak terdefinisi tipe datanya. Namun demikian, secara sintak contoh program tersebut tetap bernilai benar karena tipe deklarasi hanya menyediakan informasi semantik saja.

Pembuatan aturan tata bahasa sangat dibutuhkan supaya bahasa pemrograman dapat diklasifikasikan sesuai dengan posisinya masing-maing dalam suatu hirarki Chomsky. Kebanyakan sintak dari bahasa pemrograman dapat ditentukan menggukana tata bahasa Type-2 yang merupakan context-free grammars (Michael,S. 1996). Pada beberapa bahasa pemrograman, termasuk Perl dan Lisp, didalamnya mengandung suatu konstruksi yang memungkinkan dilakukannya eksekusi selama masa parsing. Bahasa pemrograman yang memiliki suatu konstruksi memungkinkan programmer untuk melakukan perubahan behavior dari parsing yang dapat menciptakan sintak yang dapat melakukkan analisis permasalahan yang tidak dapat diselesaikan sebelumnya, dan pada umumnya antara parsing dan eksekusi perbedaannya bersifat samar (Jeffrey,K. 2009). Seperti pada sistem makro List dan Perl yang dimulai dengan blok yang didalamnya mengandung komputasi umum, sementara pada makro bahasa C hanyalah pengganti string dan tidak memerlukan kode eksekusi (Marty Hall, 1995).

Semantik
Secara istilah semantik artinya adalah makna yang terkandung dari suatu bahasa pemrograman, hal ini memiliki makna yang berbeda dibanding dengan bentuk dari bahasa pemrograman (sintak).

Statik Semantik
Statik semantik mendefinisikan batasan dari suatu struktur pada teks acuan yang tidak mungkin atau mustahil untuk diekspresikan dalam suatu format standar sintak (Aaby, Anthony. 2004). Untuk bahasa kompilasi, statik semantik utamanya mengantur suatu aturan yang digunakan untuk memeriksa program pada saat program dikompilasi. Contohnya adalah pada setiap pemeriksaan pada identifier program yang dilakukan sebelum program tersebut digunakan (pada bahasa pemrograman prosedur tersebut membutuhkan suatu deklarasi tertentu) atau berupa pemberian label pada bagian yang telah diperiksa (Michael,L.S. 2006). Banyak sekali aturan pemeriksaan yang digunakan, seperti pemeriksaan identifier yang digunakan pada konteks tertentu, atau pemanggilan secara berkala terhadap angka atau simbol tertentu seperti tipe data dari suatu argumen program, yang penegakkan aturannya dapat dilakukan dengan cara pendefinisian logika tertentu yang disebut dengan tipe sistem. Bentuk lain dari analisis statistik adalah seperti analisis alur data,  yang didalam prosesnya juga merupakan bagian dari statik semantik. Pada bahasa pemrograman baru seperti Java dan C#, kedua bahasa tersebut memiliki definite assignment analysis, yang merupakan suatu format dalam analisis alur data dan juga merupakan bagian dari statik semantik.

Dinamis Semantik
Ketika data telah ditentukan, maka komputer akan diinstruksikan untuk menampilkan hasil dari data tersebut. Contoh, suatu semantik dapat mendefinisikan suatu strategi melalui ekspresinya yang dievaluasi terhadap suatu nilai atau kebiasaan dalam suatu statement eksekusi kondisi pengendalian struktur. Dinamis semantik atau juga dikenal dengan istilah semantik eksekusi pada suatu bahasa pemrograman mendefinisikan bagaimana dan kapan berbagai macam konstruksi dari suatu bahasa pemrograman seharusnya menghasilkan suatu kebiasan pada program. Ada banyak cara untuk mendefinisikan semantik dinamis. Bahasa alami juga pernah digunakan dalam penentuan semantik dinamis dari penggunaan umum bahasa pemrograman. Dalam jumlah yang sangat signifikan dari berbagai riset akademis, selanjutnya dikumpulkan dan menghasilkan suatu aturan semantik formal dari bahasa pemrograman yang memungkinkan untuk semantik dinamis untuk menentukan kebiasaan formal dari suatu bahasa pemrograman. Hasil dari riset tersebut telah dilihat sebagai suatu penerapan terbatas pada perancangan program dan implementasi program diluar dari lingkungan akademis itu sendiri.

Type system
Sebuah type system atau sistem tipe data mendefinisikan bagaimana suatu bahasa pemrograman mengelompokkan nilai dan ekspresinya kedalam suatu tipe tertentu dan bagaimana kelompok tersebut dapat dimanipulasi tipenya dan bagaimana pula kelompok tersebut berinteraksi dengan yang lain. Tujuan dari type system adalah untuk memverifikasi dan atau biasanya memaksa pada tahapan level tertentu dari suatu proses koreksi pada penulisan program dalam bahasa pemrograman dengan cara mendeteksi operasi yang bernilai salah. Setiap type system pengambil keputusan selalu melibatkan suatu trade-off, yang fungsinya dapat melakukan banyak penolakan program yang sedang berjalan, pembekuan operasi program yang sudah benar, meskipun program yang dijalankan tersebut adalah suatu program yang tidak biasa. Agar dapat menghilangkan sisi negatif dari penghentian paksa program tersebut, beberapa bahasa pemrograman memiliki jenis type loopholes, umumnya berupa cast yang tidak diperiksa yang memungkinkan programmer untuk melewatkan suatu operasi normal sifatnya terlarang antara tipe data yang berbeda. Pada sebagian besar bahasa pemrograman, type system digunakan hanya untuk memeriksa tipe program, namun pada beberapa bahasa pemrograman lainnya, biasanya yang fungsional, infer types, biasanya memberikan kebebasan pada programmer dari kewajiban untuk menulis notasi tipe data.  Penelitian dan Perancangan formal dari type system dikenal dengan istilah type theory.

Typed versus untyped
Suatu bahasa pemrograman harus didefinisikan tipe datanya terlebih dahulu jika setiap kali operasi, sehingga operasi program dapat dijalankan (Andrew, C. 2012). Contoh, tampilan data oleh "this text between the qoutes" adalah data dengan tipe data string (tipe data tulisan), dan pada banyak bahasa pemrograman pembagian nilai oleh suatu string tidak memiliki makna operasi apapun dan tidak dapat dieksekusi programnya. 

Operasi yang invalid akan dideteksi oleh program ketika dilakukan kompilasi program (seperti pemeriksaan tipe data "static") dan akan ditolak oleh kompilator dan menampilkan pesan error pada layar monitor, atau juga invalid tersebut dapat dideteksi ketika program telah dijalankan (pemeriksaan tipe "dynamic"), yang hasilnya berupa run-time exception. Banyak bahasa pemrograman yang memberikan ijin suatu fungsi untuk memanggil exception handler untuk dapat menangani suatu kondisi tertentu pada program. Contoh,  program akan selalu mengembalikan nilai "-1" sebagai hasil dari operasi suatu program.

Pada kasus tertentu dari tipe data bahasa pemrograman adalah tipe data tunggal. Hal ini sering terjadi pada bahasa pemrograman berbasis skrip atau markup language, seperti REXX atau SGML, dan hanya memiliki satu tipe data yang paling umum yaitu string, yang digunakan untuk data simbol dan angka.

Sebaliknya, untyped language, seperti bahasa bahasa assembly, memungkinkan untuk dilakukan jenis operasi apapun pada data, umumnya berupa untaian bit dari berbagai ukuran (Andrew, C. 2012). Bahasa pemrograman tingkat tinggi untyped atau yang tidak memiliki tipe data contohnya seperti BCPL, Tcl, dan beberapa variasi lainnya dari bahasa pemrograman generasi keempat.

Dalam praktiknya, beberapa bahasa pemrograman kebanyakan memang berasal dari format type theory yang prosedurnya kebanyakan adalah melakukan verifikasi atau penolakan pada operasi program, sementara pada bahasa pemrograman modern memiliki pilihan yang berbeda terhadap pilihan pengetikkan tipe datanya (Andrew, C. 2012). Kebanyakan dari bahasa pemrograman modern tersebut menyediakan berbagai metode atau pilihan untuk dapat melewatkan type system, serta pemberian terhadap kendali keamanan tipe data pada pelaksaan atau pembuatan program.

Static versus dynamic typing
Pada static typing, semua ekspresi memiliki tipe datanya masing-maing yang ditentukan sebelum program dieksekusi, umumnya ketika waktu kompilasi program. Contoh, 1 dan (2+2) adalah ekspresi dari tipe data integer dan tipe data tersebut tidak bisa dilewatkan menuju ke sebuah fungsi yang memerlukan input string, ataupun juga disimpan dalam sebuah variabel yang tipe datanya dinyatakan untuk menyimpan tipe data tanggal (Andrew, C. 2012).

Bahasa program yang diketik secara statis dapat pula diketik secara manifestyle typed atau type-inferred. Pada kasus sebelumnya, programmer harus secara eksplisit menulis jenis tipe data pada posisi tertulis. Dan Pada kasus kali ini, kompilator dapat melakukan penyimpulan tipe dari ekspresi dan deklarasi berdasarkan konteks data atau nilai input. Sebagian besar bahasa pemrograman adalah diketik secara statis, seperti C++, C#, dan Java. Tipe data dengan inferensi lengkap secara tradisional dikaitkan dengan bahasa pemrograman yang kurang umum, seperti Haskell dan ML. Namun demikian, banyak manifestasi tipe data bahasa pemrograman yang mendukung sebagian tipe data inferensi, contoh C++, Java, dan C# adalah tipe inferensi dengan kondisi khusus (Alan, J. 2001 dan Martin, O. 2002). Juga, beberapa bahasa pemrograman memberikan akses pada beberapa tipe data untuk dapat otomatis dikonversi ke tipe data lainnya, contoh, tipe data int dapat digunakan pada program yang menginginkan keluaran tipe data dalam bentuk float.

Dynamic typing, atau disebut juga latent typing, berfungsi dalam penentukan operasional type-safety ketika run-time (Andrew, C. 2012). Dengan kata lain, tipe tersebut berasosiasi dengan nilai run-time ketimbang dengan ekspresi yang bersifat tekstual. Sama dengan bahasa type-inferered, atau bahasa tipe dinamis, programmer tidak perlu menulis secara eksplisit notasi ataupun ekspresi dari tipe data tersebut. Tipe data tersebut dapat memberikan izin variabel tunggal untuk menunjuk sebuah nilai dari tipe data yang berbeda dan pada titik yang berbeda pada saat program dieksekusi. Namun demikian, Tipe data yang error tidak dapat secara otomatis dideteksi sampai sebuah bagian dari kode tersebut benar-benar telah dieksekusi, dan hal ini juga akan berpotensi membuat debug program menjadi lebih sulit. Lisp, Smalltalk, Perl, Python, JavaScript, dan Ruby adalah contoh dari bahasa pemrograman dengan tipe data dinamis.

Weak and strong typing
Weak typing atau tipe data bernilai lemah adalah tipe data yang memungkinkan sebuah nilai dari tipe data tersebut untuk diperlakukan atau dikondisikan seperti tipe data lainnya, contoh nilai string yang dapat diperlakukan sebagai nilai angka atau integer (Andrew, C. 2012). Untuk beberapa kondisi tertentu, hal tersebut dapatlah berguna, namun hal tersebut juga dapat membuat program gagal berproses karena data yang dicari tidak ditemukan ketika kompilasi program atau pada saat program dijalankan.

Strong typing atau tipe data kuat, adalah tipe data yang tidak menginjinkan penggunaan sebuah nilai dari tipe data tertentu menjadi nilai tipe data lain yang berbeda. Strong typing membuat program menjadi lebih tangguh atau juga sebaliknya dapat membuat program gagal berproses (Andrew, C. 2012). Namun jika terjadi kesalahan dalam memasukkan nilai pada tipe data tersebut maka tingkat error atau kesalahan menjadi lebih meningkat pula. Bahasa dengan strong type sering disebut dengan istilah type-safe atau safe

Alternatif definisi untuk "weakly typed" dalam bahasa pemrograman seperti Perl dan Javascript, yang memberikan ijin akses terhadap nilai dalam jumlah besar dari konversi tipe implisit. Pada JavaScript, contohnya, ekspresi 2 * X secara implisit dikonversi ke tipe angka, maka konversi tersebut akan bernilai sukses meskipun jika nilai x adalah null, tidak terdefinisi, array, ataupun string dari sebuah baris huruf. Meskipun konversi secara implisit tersebut dapat sukses dilaksanakan, tetapi tetap ada kemungkinan membuat program mengalami error. Strong dan static umumnya dianggap sebagai sebuah konsep orthogonal, tetapi penggunaannya berbeda secara literatur. Beberapa ada yang menggunakan istilah strongly yang bermakna sangat kuat, statically typed, atau bahkan lebih membingungkan lagi, dimana makna sebenarnya adalah bertipe data statis. Dimana pada bahasa C dapat dikelompokkan ke dalam static strongly typed weakly typed ("Revised Report on the Algorithmic Language Scheme". 1998) (Luca, C dan Peter, W. 1985).

Mungkin terdengar aneh bagi para programmer profesional bahwa bahasa C dapat juga merupakan "weakly, statically typed". Namun demikian, perlu dicatat bahwa kegunaan dari pointer pada bahasa C memungkinkan untuk bahasa tersebut melakukan casting dari pointer ke pointer lainnya tanpa perlu membuat casting secara eskplisit. Hal ini juga mirip seperti casting array ke tipe data lainnnya tanpa menggunakan casting secara eskplisit dalam bahasa C, seperti tipe int atau char.

Standard library dan run-time system
Sebagian besar bahasa pemrograman selalu memiliki asosiasi dengan core library atau disebut juga dengan standard library, khususnya jika didalamnya tersedia bagian dari publikasi standar bahasa pemrograman yang secara konvensional biasanya disediakan oleh semua implementasi bahasa pemrograman. Core librariy umumnya terdiri dari definisi untuk penggunaan algoritma secara umum, struktur data, dan mekanisme input dan output suatu bahasa pemrograman.

Batas antara sebuah bahasa pemrograman terhadap core library-nya berbeda-beda tergantung dari bahasa pemrograman masing-masing. Pada beberapa kasus, perancang bahasa pemrograman mungkin memberlakukan library sebagai suatu entitas terpisah dari bahasa pemrograman itu sendiri. Namun, core library dari sebuah bahasa pemrograman terkadang juga diperlakukan sebagai bagian dari bahasa pemrograman itu sendiri oleh para pengguna, dan pada beberapa bahasa pemrograman tertentu bahkan mensyaratkan untuk library dari bahasa pemrograman tersebut untuk dapat teredia pada bagian implementasi program. Beberapa bahasa pemrograman memang dirancang sedemikian rupa sehingga makna dari konstruksi sintaknya bahkan tidak bisa dijelaskan jika tidak mengacu pada core library-nya itu sendiri. Contoh, pada Java, sebuah string literal didefinisikan sebagai instance dari class java.lang.String, sama halnya seperti pada bahasa Smalltalk, berupa ekspresi fungsi instance construct anonimus (sebuah "block") dari class library BlockContext. Sebaliknya, sebuah skema juga mengandung beberapa subset yang koheren yang cukup untuk dapat membangun sisa dari bahasa pemrograman sebagai library macros, dan bahkan perancang bahasa pemrograman tersebut tidak perlu repot-repot memberitahukan bagian mana dari bahasa pemrograman tersebut yang harus diimplementasikan sebagai suatu konstruksi bahasa pemrograman, dan mana yang harus diimplementasikan sebagai bagian dari library itu sendiri.  

DAFTAR RUJUKAN

Footer Adsense