Selamat Datang Di Blog "_rist site_"
Sabtu, 27 November 2010
Selasa, 23 November 2010
PEMROGRAMAN TERSTRUKTUR
PEMROGRAMAN TERSTRUKTUR
Pada era tahun 1950 –1960, kecepatan komputer sangat rendah dan disertai juga dengan
keterbatasan dari media penyimpan, sehingga tentunya berakibat juga dengan keterbatasan dalam
penulisan program-program komputer. Namun di era saat ini, dengan kecepatan komputer yang
cukup handal demikian juga ketersediaan dari media penyimpan yang cukup handal dan besar,
serta didukung juga dengan perkembangan bahasa pemrograman yang ada sehingga kita dapat
dengan mudah membuat suatu program. Permasalahan yang timbul dalam pembuatan program
tersebut adalah bagaimana kita dapat memahaminya, sehingga apabila terdapat perubahan yang
akan dilakukan kita dapat memperbaikinya secara mudah. Hal ini tentu saja harus kita perhatikan
terutama apabila kita melihat dari biaya yang harus dikeluarkan dalam pembuatan program
tersebut.
Istilah Pemrograman Terstruktur (Structured Programming) mengacu dari suatu
kumpulan tehnik yang dikemukan oleh Edsger Dijkstra. Dengan tehnik ini akan meningkatkan
produktifitas programmer, dengan mengurangi waktu yang dibutuhkan dalam penulisan (write),
pengujian (test), penelusuran kesalahan (debug) dan pemeliharan(maintain) suatu program. Pada
pembahasan berikut ini kita akan melihat bagaimana tehnik ini yang pendekatan yang dilakukan
secara modular, dapat membantu kita dalam membangun suatu program.
Pemrograman Secara Modular
Dalam pemrograman secara modular, suatu program akan dipilah kedalam sejumlah
modul, dimana setiap modul menjalankan fungsinya sendiri. Tentunya fungsi yang dijalankan
oleh setiap modul sangat terbatas sesuai dengan ruang lingkup yang akan dikerjakan. Dengan
adanya sejumlah modul program ini tentu saja kesalahan yang timbul dapat dikurangi.
Setiap program tentu akan memiliki program utamanya, yang kemudian akan memanggil
sejumlah modul-modul yang ada.
Implementasi dari pendekatan secara modular
Pemrograman secara modular ini dapat diimplementasikan dengan penggunaan
subroutine, suatu kelompok instruksi yang menjalankan suatu pengolahan yang sifatnya terbatas
seperti pencetakan, pembacaan untuk proses input atau untuk proses penghitungan.
………………………
………………………
………………………
………………………
CALL SUB
………………………
………………………
………………………
………………………
CALL SUB
………………………
………………………
………………………
SUB
………………….
………………….
………………….
………………….
RETURN
Gambaran dari proses transfer ke dan dari suatu subroutine
Keterangan :
Path dari pemanggilan pertama
Path dari pemanggilan kedua
Pemrograman Terstruktur Hal : 2
Subroutine dapat dikelompokkan menjadi internal subroutine dan external subroutine, berikut ini
penjelasannya:
Internal Subroutines
Adalah bagian dari suatu program yang digunakan. Dideklarasikan cukup sekali saja, untuk
sejumlah proses yang sama akan dilakukan oleh program tersebut. Program akan memanggil
subroutines tersebut jika diperlukan dan apabila telah selesai, kontrol selanjutnya dikembalikan
ke instruksi berikutnya.
Instruksi yang mengendalikan kontrol transfer ke suatu subroutine umumnya dikenal sebagai call
dan return.
External Subroutines
Diletakkan secara terpisah dari program yang menggunakan subroutine tersebut. Subroutine ini
dideklarasikan supaya bisa dipakai oleh program yang lain. Untuk menggunakannya tentu
seorang programmer harus mengetahui dimana ? , apa namanya ?, bagaimana pengiriman datanya
?, bagaimana jawaban yang akan diperoleh ?. Subroutine ini biasanya digunakan untuk
pemrosesan yang komplek, yang dibutuhkan oleh banyak user.
Masalah Yang dihadapi dalam Pendekatan Modular
Masalah yang timbul misalnya tidak mengetahui modul mana yang harus digunakan, data
apa yang harus dikirimkan dsb-nya. Hal ini dapat dimaklumi karena tugas seorang programmer
tentu akan berbeda dengan programmer yang lainnya. Oleh karena itu dalam tahap perencanaan
fungsi-fungsi dari suatu modul harus dapat dimengerti secara jelas, dan tentu saja harus mengikuti
suatu standar yang telah ditentukan.
TOP-DOWN PROGRAMMING
Pendekatan ini sangat berguna sekali dalam perencanaan suatu program bersifat modul.
Dalam pendekatan ini pertama-tama kita mendefinisikan modul untuk program utama, yang
merupakan program yang pertama kali dieksekusi, memanggil modul yang lain dan kemudian
menghentikan eksekusi program. Jika fungsi yang akan dikerjakan terlalu komplek, maka modul
ini harus dipecah kedalam sejumlah modul-modul yang ada dibawahnya.
Structure Charts
Digunakan sebagai alat bantu perencanaan dalam top-down programming. Sering juga
disebut sebagai hierarchy/hierarchical/chart/
untuk structure chart dan digunakan untuk menggambarkan seluruh komponen yang ada.
Bujur sangkar menggambarkan modul dan diidentifikasikan dengan sebuah angka,
dimana angka nol untuk menandakan program utama (main program). Modul ini menggambarkan
keseluruhan program dan ditandai oleh level-0, sedangkan dibawah adalah level-1 dan seterusnya.
000
main program module
200
process transactions
100
load tables
300
print final cost
Level-0 module
Level-1 module
Pemrograman Terstruktur Hal : 3
Meng-identifikasi Modul
Nama modul adalah deskripsi singkat dari modul tersebut. Identifikasi dari sebuah modul
juga memuat angkanya. Sebagai contoh pada gambar modul “200 process transaction”
mempunyai 5 buah fungsi subordinat yaitu :
- Reading transaction record
- Reading master record
- Updating inventory level
- Writing master record
- Printing error message
Contoh gambar structure chart untuk program pengupdate-an file nventory
Modul 210 – 250 juga termasuk level-2 seperti juga modul 110 dan 120. Modul 260 adalah modul
perkecualian. Sebuah modul dapat memiliki sebuah subordinat modul, jika modul itu juga
menjadi subordinat paling sedikit satu buah modul.
Me-review Structure Chart
Sesudah sebuah structure chart dipersiapkan, kemudian direview kembali untuk memastikan
kelengkapan dan strukturnya. Review ini dilakukan mulai dari level teratas hingga level
terbawah. Peranan user (pemakai program tersebut) harus disertakan untuk dapat melihat segala
sesuatu yang dibutuhkan.
000
update inventory
file
100
load product
table
200
process
transaction
300
print final totals
110
read table record
120
store table data
260
write line
210
read transaction
record
220
read master
record
230
update inventory
level
240
write master
record
250
print error
message
260
write line
Pemrograman Terstruktur Hal : 4
Structure Chart dan Flowchart
Dalam structure chart digambarkan fungsi yang akan dilakukan dan relasi antar modulmodul,
sedangkan informasi yang diperlukan untuk peng-coding-an sangat sedikit. Didalamnya
tidak digambarkan langkah-langkah setiap pemrosesan maupun kondisi-kondisinya. Sehingga
flowchart umumnya dipersiapkan juga. Namun karena logika dari modul-modul itu sangat
sederhana, sehingga memungkinkan untuk melakukan peng-coding-an tanpa harus menggunakan
flowchart. Demikian juga untuk user lebih mudah untuk mengertinya.
Programming Structure
Salah satu sasaran dalam men-desain program terstruktur adalah mengurangi
kebingungan yang dihasilkan dari penggunaan percabangan atau perintah go-to.
Dalam pemrograman terstruktur tidak digunakan lagi perintah go-to. Ada tiga bentuk
yang digunakan yaitu : Sequence Structure, Loop Structure dan Selection Structure.
Sequence Structure
Dalam sequence structure, instruksi dieksekusi berdasarkan urutannya. Dimulai dari
bagian atas dan diakhiri di bagian bawahnya.
Bujur sangkar dapat menggambarkan operasi :
- Input dan Output
- Operasi aritmatika
- Operasi pemindahan data dalam memori komputer
Dalam sequence structure tidak diperkenankan penggunaan kotak keputusan.
Loop Structure
Loop (iteration) structure menggambarkan perulangan dari satu atau lebih instruksi.
Instruksi-1
Instruksi-2
Instruksi-3
False
kondisi True
Instruksi-1
…………
Pemrograman Terstruktur Hal : 5
Selection Structure
Dalam struktur ini terdapat sejumlah perintah yang dikerjakan tergantung dari kondisi yang
dipenuhinya. Seperti juga dengan sequence dan dan loop structure, terdapat single entry point dan
single exit point.
PEMROGRAMAN FUNGSIONAL
PEMROGRAMAN FUNCTIONAL
Dalam prakteknya, perbedaan antara fungsi matematika dan pengertian tentang sebuah "fungsi" yang digunakan dalam pemrograman adalah fungsi-fungsi penting yang dapat memiliki efek samping, mengubah nilai yang sudah dihitung perhitungan. Karena mereka tidak memiliki transparansi referensial, yaitu ekspresi bahasa yang sama dapat menghasilkan nilai yang berbeda pada waktu yang berbeda tergantung pada keadaan program pelaksana. Sebaliknya, dalam kode fungsional, nilai output dari suatu fungsi hanya bergantung pada argumen-argumen yang masukan ke fungsi, maka fungsi f memanggil dua kali dengan nilai yang sama untuk argumen x akan menghasilkan hasil yang sama f (x) kedua kali. Menghilangkan efek samping dapat membuat lebih mudah untuk memahami dan memprediksi perilaku dari suatu program, yang merupakan salah satu motivasi kunci bagi pengembangan pemrograman fungsional. [1]
Bahasa pemrograman fungsional, terutama yang murni fungsional, sebagian besar telah ditekankan dalam dunia akademis bukan dalam pengembangan perangkat lunak komersial. Namun, bahasa pemrograman fungsional menonjol seperti Scheme, [2] [3] [4] [5] Erlang, [6] [7] [8] OCaml, [9] [10], dan Haskell, [11] [12 ] telah digunakan dalam industri dan aplikasi komersial oleh berbagai organisasi. Pemrograman fungsional juga menemukan industri digunakan dalam domain spesifik melalui bahasa pemrograman seperti R (statistik), [13] [14] Mathematica (simbolik matematika), [15] J dan K (analisis keuangan) [rujukan?], Dan XSLT (XML ). [16] [17] Meluasnya deklaratif domain bahasa tertentu seperti SQL dan Lex / Yacc, menggunakan beberapa unsur pemrograman fungsional, terutama dalam menghindari nilai-nilai bisa berubah. [18] Spreadsheets juga dapat dilihat sebagai bahasa pemrograman fungsional. [19].
Pemrograman dalam gaya fungsional juga dapat dicapai dalam bahasa yang tidak secara khusus dirancang untuk pemrograman fungsional. Sebagai contoh, bahasa pemrograman Perl imperatif telah menjadi subjek dari sebuah buku yang menjelaskan bagaimana menerapkan konsep-konsep pemrograman fungsional. [20] Javascript, salah satu bahasa paling banyak digunakan saat ini, menggabungkan kemampuan pemrograman fungsional [21].
Sejarah
Kalkulus lambda menyediakan kerangka teoretis untuk menjelaskan fungsi dan evaluasi mereka. Walaupun merupakan abstraksi matematis, bukan bahasa pemrograman, membentuk dasar dari hampir semua bahasa pemrograman fungsional hari ini. Perumusan teoritis yang setara, combinatory logika, secara umum dianggap lebih abstrak daripada kalkulus lambda dan mendahuluinya dalam penemuan. Ini digunakan dalam beberapa bahasa termasuk Unlambda esoteris. Combinatory logika dan kalkulus lambda berdua awalnya dikembangkan untuk mencapai pendekatan yang lebih jelas dasar matematika. [22]
Rasa fungsional awal bahasa LISP, dikembangkan oleh John McCarthy sementara di MIT untuk IBM seri 700/7000 komputer ilmiah pada akhir tahun 1950-an. [23] LISP memperkenalkan banyak fitur yang sekarang ditemukan dalam bahasa-bahasa fungsional, meskipun secara teknis LISP multi-paradigma bahasa. Skema dan Dylan kemudian mencoba untuk menyederhanakan dan meningkatkan LISP.
Pengolahan Informasi Language (IPL) kadang-kadang disebut sebagai komputer pertama yang berbasis bahasa pemrograman fungsional. Ini adalah gaya bahasa assembly untuk memanipulasi daftar simbol. Memang ada suatu pengertian tentang "generator", yang berarti menerima suatu fungsi fungsi sebagai argumen, dan, karena itu adalah bahasa tingkat perakitan, kode dapat digunakan sebagai data, sehingga IPL dapat dianggap sebagai memiliki tingkat tinggi fungsi. Namun, hal itu sangat bergantung pada daftar bermutasi struktur dan fitur-fitur penting serupa.
Kenneth E. Iverson mengembangkan bahasa pemrograman APL pada awal tahun 1960-an, yang dijelaskan dalam buku 1962 A Programming Language (ISBN 9780471430148). APL adalah pengaruh utama John Backus's FP bahasa pemrograman. Pada awal 1990-an, Iverson dan Roger Hui menciptakan penerus APL, bahasa pemrograman J. Pada pertengahan 1990-an, Arthur Whitney, yang sebelumnya bekerja dengan Iverson, menciptakan bahasa pemrograman K, yang digunakan secara komersial dalam industri keuangan.
John Backus disajikan FP bahasa pemrograman dalam kuliah Turing Award 1977 Pemrograman Dapatkah Jadilah Dibebaskan Dari von Neumann Gaya? Sebuah Fungsional Gaya dan Program Aljabar. Dia mendefinisikan program fungsional seperti yang sedang dibangun dalam suatu cara hirarkis dengan cara "menggabungkan bentuk-bentuk" yang memungkinkan sebuah "aljabar program"; dalam bahasa modern, ini berarti bahwa program-program fungsional mengikuti prinsip compositionality. Koran Backus penelitian dipopulerkan pemrograman fungsional, meskipun fungsi menekankan pemrograman tingkat daripada kalkulus lambda-gaya yang telah datang untuk berhubungan dengan pemrograman fungsional.
Pada tahun 1970-an ML bahasa pemrograman ini diciptakan oleh Robin Milner di University of Edinburgh, dan David Turner bahasa awalnya dikembangkan SASL di University of St Andrews dan kemudian bahasa Miranda di University of Kent. ML akhirnya berkembang menjadi beberapa dialek, yang paling umum yang sekarang Objektif Caml dan Standar ML. Juga di tahun 1970-an, perkembangan bahasa pemrograman Scheme (-fungsional yang sebagian dialek Lisp), seperti yang dijelaskan dalam Lambda berpengaruh Kertas dan buku teks tahun 1985 Struktur dan Interpretasi of Computer Program, membawa kesadaran akan kekuatan pemrograman fungsional dengan -bahasa pemrograman yang lebih luas masyarakat.
Pada tahun 1980-an, Per Martin-LOF Intuitionistic mengembangkan teori tipe (juga disebut teori tipe konstruktif), program fungsional yang terkait dengan bukti konstruktif sewenang-wenang kompleks dinyatakan sebagai proposisi matematika tergantung jenis. Hal ini menyebabkan pendekatan baru yang kuat untuk membuktikan teorema interaktif dan telah mempengaruhi perkembangan selanjutnya dari banyak bahasa pemrograman fungsional.
Bahasa pemrograman yang Haskell, dimulai dengan konsensus pada tahun 1987, untuk membentuk standar terbuka untuk pemrograman fungsional penelitian; pelaksanaan rilis telah berlangsung sejak 1990.
Konsep
Sejumlah konsep dan paradigma yang khusus untuk pemrograman fungsional, dan umumnya pemrograman yang asing (termasuk pemrograman berorientasi objek). Namun, bahasa pemrograman sering hibrida dari beberapa paradigma pemrograman jadi programer menggunakan "kebanyakan imperatif" bahasa mungkin telah memanfaatkan beberapa konsep-konsep ini. [24]
Orde yang lebih tinggi fungsi
Orde yang lebih tinggi fungsi fungsi yang dapat mengambil fungsi-fungsi lain sebagai argumen atau kembali mereka sebagai hasil (operator diferensial d / dx yang menghasilkan turunan dari fungsi f adalah contoh ini dalam kalkulus).
Fungsi orde yang lebih tinggi berhubungan erat dengan kelas satu fungsi, dalam tatanan yang lebih tinggi-fungsi dan kelas pertama fungsi kedua memungkinkan fungsi sebagai argumen dan hasil dari fungsi lainnya. Perbedaan antara keduanya adalah halus: "tingkat tinggi" menggambarkan suatu konsep matematika fungsi yang beroperasi pada fungsi lainnya, sedangkan "kelas satu" adalah istilah ilmu komputer bahasa pemrograman yang menjelaskan entitas yang tidak memiliki batasan penggunaan mereka (dengan demikian kelas satu fungsi dapat muncul di manapun dalam program yang pertama-kelas lain seperti bilangan yang dapat entitas, termasuk sebagai argumen untuk fungsi lain dan ketika mereka kembali nilai-nilai).
Orde yang lebih tinggi memungkinkan fungsi currying, suatu teknik di mana suatu fungsi diterapkan pada argumen satu per satu waktu, dengan masing-masing aplikasi kembali fungsi baru yang menerima argumen berikutnya.
Pure fungsi
Fungsi fungsional murni (atau ekspresi) tidak memiliki memori atau I / O efek samping (kecuali jika hasil perhitungan itu sendiri adalah dihitung sebagai efek samping). Ini berarti bahwa fungsi murni memiliki beberapa sifat yang berguna, banyak yang dapat digunakan untuk mengoptimalkan kode:
* Jika hasil dari ekspresi murni tidak digunakan, dapat dihilangkan tanpa mempengaruhi ekspresi lain.
* Jika fungsi murni disebut dengan parameter yang tidak menimbulkan efek samping, hasilnya konstan sehubungan dengan daftar parameter (kadang-kadang disebut referensial transparansi), yaitu jika fungsi murni lagi dipanggil dengan parameter yang sama, hasil yang sama akan dikembalikan (hal ini dapat menghidupkan cache optimisations seperti memoization).
* Jika tidak ada data yang ketergantungan antara dua ekspresi murni, kemudian pesanan mereka dapat dibalikkan, atau mereka dapat dilakukan secara paralel dan mereka tidak dapat mengganggu satu sama lain (dalam istilah lain, evaluasi dari setiap ekspresi murni adalah thread-safe).
* Jika seluruh bahasa yang tidak memungkinkan efek samping, maka setiap strategi evaluasi dapat digunakan; kompiler ini memberikan kebebasan untuk menyusun ulang atau menggabungkan evaluasi ekspresi dalam program (misalnya, menggunakan deforestasi).
Sementara sebagian besar kompiler untuk bahasa pemrograman yang murni mendeteksi fungsi, dan Common-subexpression melakukan penghapusan untuk pemanggilan fungsi murni, mereka tidak selalu dapat melakukan hal ini untuk pre-compiled perpustakaan, yang biasanya tidak mengungkapkan informasi ini, sehingga dapat mencegah optimisations yang melibatkan fungsi-fungsi eksternal. Beberapa compiler, seperti gcc, menambahkan kata kunci untuk seorang programmer untuk secara eksplisit menandai fungsi eksternal sebagai murni, untuk mengaktifkan optimisations tersebut. Fortran 95 memungkinkan difungsikan "murni".
Rekursi
Artikel utama: Rekursi (ilmu komputer)
Iterasi (looping) dalam bahasa fungsional biasanya dicapai melalui rekursi. Fungsi rekursif memanggil diri mereka sendiri, memungkinkan suatu operasi harus dilakukan berulang-ulang. Rekursi mungkin memerlukan setumpuk mempertahankan, tapi ekor rekursi dapat diakui dan dioptimalkan oleh kompilator ke kode yang sama digunakan untuk mengimplementasikan iterasi dalam bahasa imperatif. Skema memerlukan standar bahasa pemrograman implementasi untuk mengenali dan mengoptimalkan rekursi ekor. Optimasi rekursi ekor dapat dilaksanakan dengan mengubah program tersebut menjadi kelanjutan gaya lewat selama kompilasi, di antara pendekatan-pendekatan lain.
Pola umum rekursi dapat diperhitungkan dengan menggunakan fungsi tatanan yang lebih tinggi, catamorphisms dan anamorphisms (atau "lipatan" dan "tersingkap") menjadi contoh yang paling jelas. Seperti lebih tinggi memainkan peran fungsi analog dengan built-in kontrol struktur seperti loop dalam bahasa-bahasa imperatif.
Sebagian besar tujuan umum bahasa pemrograman fungsional memungkinkan tak terbatas Turing rekursi dan lengkap, yang membuat masalah terputus-putus diputuskan, dapat menyebabkan unsoundness dari equational penalaran, dan biasanya memerlukan pengenalan inkonsistensi kedalam logika bahasa yang diungkapkan oleh sistem tipe. Beberapa tujuan khusus bahasa seperti Coq hanya memperbolehkan beralasan rekursi dan sangat normalisasi (nonterminating perhitungan hanya dapat dinyatakan dengan nilai yang tak terhingga disebut aliran codata). Akibatnya, bahasa-bahasa ini gagal menjadi Turing lengkap dan mengekspresikan fungsi-fungsi tertentu di dalamnya adalah mustahil, tapi mereka masih bisa mengekspresikan berbagai perhitungan kelas yang menarik sambil menghindari masalah-masalah yang diperkenalkan oleh rekursi tidak dibatasi. Terbatas pada pemrograman fungsional beralasan rekursi dengan beberapa kendala lain yang disebut total pemrograman fungsional. Lihat Turner 2004 untuk lebih banyak diskusi. [25]
Ketat ketat versus non-evaluasi
Artikel utama: Evaluasi strategi
Bahasa fungsional dapat dikategorikan dengan apakah mereka menggunakan ketat (bersemangat) atau non-ketat (malas) evaluasi, konsep-konsep yang merujuk kepada bagaimana argumen fungsi diproses ketika ekspresi sedang dievaluasi. Perbedaan teknis dalam ungkapan semantik denotational mengandung kegagalan atau perhitungan berbeda. Dalam evaluasi yang ketat, evaluasi setiap istilah yang mengandung subterm yang gagal itu sendiri akan gagal. Sebagai contoh, ekspresi
print panjang ([2 +1, 3 * 2, 1 / 0, 5-4])
akan gagal dalam evaluasi ketat karena pembagian dengan nol pada elemen ketiga dari daftar. Bawah nonstrict evaluasi, fungsi panjang akan mengembalikan nilai 4, karena evaluasi itu tidak akan berusaha untuk mengevaluasi istilah yang membentuk daftar. Singkatnya, evaluasi yang ketat selalu penuh fungsi mengevaluasi argumen sebelum memohon fungsi. Non-evaluasi ketat tidak mengevaluasi argumen berfungsi kecuali nilai-nilai mereka diminta untuk mengevaluasi fungsi panggil itu sendiri.
Strategi pelaksanaan yang biasa untuk non-evaluasi yang ketat dalam bahasa fungsional adalah pengurangan grafik. Non-ketat evaluasi digunakan secara default dalam beberapa bahasa fungsional murni, termasuk Miranda, Bersih dan Haskell.
1984 Hughes berpendapat untuk non-evaluasi yang ketat sebagai sebuah mekanisme untuk memperbaiki modularitas program melalui pemisahan keprihatinan, dengan mengurangi pelaksanaan independen produsen dan konsumen data stream. [26] Launchbury 1993 menjelaskan beberapa kesulitan yang malas memperkenalkan evaluasi, khususnya dalam menganalisis program persyaratan penyimpanan, dan mengusulkan semantik operasional untuk membantu dalam analisis seperti itu. [27] Harper 2009 mengusulkan termasuk nonstrict ketat dan evaluasi dalam bahasa yang sama, menggunakan bahasa sistem tipe untuk membedakan mereka. [28]
Jenis pencocokan pola sistem dan
Terutama sejak berkembangnya jenis Milner Hindley-kesimpulan pada 1970-an, bahasa pemrograman fungsional cenderung menggunakan kalkulus lambda diketik, sebagai lawan dari kalkulus lambda untyped digunakan dalam Lips dan variannya (seperti Scheme). Penggunaan aljabar datatypes dan pencocokan pola manipulasi membuat struktur data yang kompleks lebih nyaman dan ekspresif; kehadiran waktu kompilasi yang kuat memeriksa jenis program membuat lebih dapat diandalkan, sedangkan tipe inferensi membebaskan programmer dari kebutuhan untuk menyatakan secara manual tipe compiler.
Beberapa penelitian yang berorientasi pada bahasa-bahasa fungsional seperti Coq, Agda, Cayenne, dan epigram Intuitionistic didasarkan pada teori tipe, yang memungkinkan untuk tergantung pada jenis istilah. Seperti disebut tergantung jenis tipe. Sistem jenis ini tidak memiliki jenis decidable inferensi dan sulit untuk memahami dan program dengan. Tapi tergantung jenis sewenang-wenang dapat mengekspresikan proposisi dalam logika predikat. Melalui Curry-Howard isomorphism, lalu, baik program yang diketik dalam bahasa-bahasa ini menjadi sarana untuk menulis bukti matematika formal dari mana kompilator dapat menghasilkan kode bersertifikat. Meskipun bahasa ini terutama tertarik pada penelitian akademis (termasuk dalam matematika formal), mereka telah mulai digunakan dalam rekayasa juga. Compcert adalah sebuah kompiler untuk subset dari bahasa pemrograman C yang tertulis di Coq dan diverifikasi secara resmi. [29]
Bentuk terbatas yang disebut umum tergantung jenis tipe data aljabar (GADT's) dapat dilaksanakan dengan cara yang memberikan beberapa manfaat dari program dependently-diketik sambil menghindari ketidaknyamanan sebagian besar. [30] GADT yang tersedia di Glasgow Haskell Compiler dan di Scala (sebagai "kasus kelas"), dan telah diusulkan sebagai tambahan ke bahasa lain termasuk Java dan C #. [31]
Pemrograman fungsional dalam bahasa-bahasa non-fungsional
Dimungkinkan untuk menggunakan gaya fungsional dalam bahasa-bahasa pemrograman yang tidak secara tradisional dianggap sebagai bahasa fungsional. [32] Beberapa bahasa non-fungsional meminjam fitur-fitur seperti fungsi orde yang lebih tinggi, dan daftar comprehensions dari bahasa pemrograman fungsional. Hal ini membuat lebih mudah untuk mengadopsi gaya fungsional ketika menggunakan bahasa tersebut. Fungsional konstruksi seperti orde yang lebih tinggi daftar fungsi dan malas dapat diperoleh di C + + melalui perpustakaan. [33] Di C, pointer fungsi dapat digunakan untuk mendapatkan beberapa efek orde yang lebih tinggi fungsi. Misalnya peta fungsi umum dapat diimplementasikan dengan menggunakan pointer fungsi. Dalam C # versi 3.0 dan yang lebih tinggi, lambda fungsi dapat digunakan untuk menulis program dalam gaya fungsional. [Rujukan?] Di Jawa, kelas anonim terkadang dapat digunakan untuk mensimulasikan penutupan, [rujukan?] Namun kelas anonim tidak selalu tepat pengganti untuk penutupan karena mereka memiliki kemampuan lebih terbatas.
Banyak desain berorientasi objek pola dinyatakan dalam istilah-istilah pemrograman fungsional: misalnya, hanya pola Strategi penggunaan perintah-perintah yang lebih tinggi fungsi, dan pola Pengunjung kira-kira berkaitan dengan suatu Catamorphism, atau lipat.
Manfaat data yang kekal dapat dilihat bahkan dalam program-program penting, jadi programmer sering berusaha untuk membuat beberapa data yang berubah bahkan dalam program-program penting. [Rujukan?]
Perbandingan antara pemrograman fungsional dan
Pemrograman fungsional sangat berbeda dengan pemrograman imperatif. Perbedaan yang paling signifikan berasal dari fakta bahwa pemrograman fungsional menghindari efek samping, yang digunakan dalam pemrograman negara menerapkan dan I / O. Pemrograman fungsional murni melarang efek samping sama sekali. Disallowing efek samping menyediakan transparansi referensial, yang membuatnya lebih mudah untuk memverifikasi, mengoptimalkan, dan program parallelize, dan lebih mudah untuk menulis alat otomatis untuk melakukan tugas-tugas.
Fungsi tatanan yang lebih tinggi jarang digunakan dalam pemrograman yang lebih tua. Di mana program imperatif tradisional dapat menggunakan loop untuk melewati daftar, gaya yang fungsional akan sering menggunakan fungsi orde lebih tinggi, peta, itu perlu sebagai argumen fungsi dan daftar, fungsi berlaku untuk setiap elemen dari daftar, dan kembali daftar hasil.
Negara simulasi
Ada tugas (misalnya, mempertahankan saldo rekening bank) yang sering tampak paling alami dilaksanakan dengan negara. Pemrograman fungsional murni melakukan tugas ini, dan I / O tugas-tugas seperti menerima input pengguna dan mencetak ke layar, dalam cara yang berbeda.
Murni bahasa pemrograman fungsional dengan menggunakan alat Haskell monads, berasal dari teori kategori. Monads sangat kuat dan menawarkan cara untuk abstrak jenis tertentu pola komputasi, termasuk (namun tidak terbatas pada) pemodelan perhitungan dengan negara yg mungkin berubah (dan efek samping lain seperti I / O) dalam suatu perintah dengan cara tanpa kehilangan kemurnian. Sementara yang sudah ada monads mungkin mudah untuk menerapkannya dalam sebuah program, mengingat template yang sesuai dan contoh, banyak menemukan mereka sulit untuk mengerti secara konseptual, misalnya, ketika diminta untuk mendefinisikan monads baru (yang kadang-kadang diperlukan untuk jenis perpustakaan tertentu). [34]
Metode alternatif seperti logika Hoare dan keunikan telah dikembangkan untuk melacak efek samping dalam program. Beberapa penelitian modern bahasa menggunakan sistem efek untuk membuat eksplisit adanya efek samping.
Efisiensi isu
Bahasa pemrograman fungsional telah dianggap kurang efisien dalam penggunaan CPU dan memori dari bahasa imperatif seperti C dan Pascal. [35] Untuk bahasa-bahasa fungsional murni, yang terburuk adalah logaritmik penurunan jumlah sel-sel memori yang digunakan, karena bisa berubah memori dapat diwakili oleh sebuah struktur data fungsional murni dengan logaritma waktu akses (seperti pohon seimbang). [rujukan?] Namun demikian, slowdowns terjadi sangat jarang dalam prakteknya. Untuk program yang melakukan perhitungan numerik yang intensif, seperti bahasa-bahasa fungsional dan Bersih OCaml biasanya serupa dalam hal kecepatan untuk C. [36] Untuk program yang menangani matriks besar dan multidimensi database, array bahasa fungsional (seperti J dan K) yang dirancang dengan kecepatan optimasi.
Lebih lanjut, kekekalan data dapat, dalam banyak kasus, menyebabkan efisiensi pelaksanaan dalam membiarkan compiler untuk membuat asumsi yang tidak aman dalam bahasa imperatif, sangat jauh meningkatkan peluang untuk inlining. [Rujukan?]
Malas evaluasi dapat juga mempercepat program, bahkan asimtotik, sedangkan hal itu mungkin lambat turun di sebagian besar oleh faktor konstan (Namun, hal itu mungkin memperkenalkan kebocoran memori bila digunakan dengan tidak semestinya) [rujukan?].
Coding gaya
Program imperatif cenderung untuk menekankan serangkaian langkah-langkah yang diambil oleh sebuah program dalam melaksanakan suatu tindakan, sementara program fungsional cenderung menekankan komposisi dan susunan fungsi, seringkali tanpa menentukan langkah-langkah eksplisit. Contoh sederhana dari dua solusi untuk tujuan program yang sama (menggunakan multi-paradigma yang sama bahasa Python) menggambarkan hal ini.
# Keharusan gaya
target = [] # membuat daftar kosong
untuk item dalam source_list: # iterate atas setiap hal dalam sumber
trans1 = G (item) # mengubah item dengan G () function
trans2 = F (trans1) # kedua mengubah dengan F () function
target.append (trans2) # menambahkan item ke target berubah
Sebuah versi fungsi memiliki rasa yang berbeda untuk itu:
# Fungsional gaya
# FP-bahasa berorientasi sering punya standar menenangkan ()
compose2 = lambda A, B: lambda x: A (B (x)) # Tentukan bagaimana menerapkan dua generik transformasi
target = peta (compose2 (F, G), source_list) # Oleskan dua fungsi spesifik F dan G untuk setiap item dalam sumber
Berbeda dengan gaya imperatif yang menjelaskan langkah-langkah yang terlibat dalam membangun sasaran, gaya fungsional menggambarkan hubungan matematis antara source_list dan sasaran. Kode python, dalam praktiknya, sering ditulis dengan daftar pemahaman, suatu bentuk sintaksis gula untuk untuk loop dengan implisit append:
target = [F (G (item)) untuk item dalam source_list]
Penggunaan di industri
Pemrograman fungsional memiliki reputasi untuk menjadi murni kepentingan akademis [rujukan?]. Namun, beberapa bahasa pemrograman fungsional menonjol telah digunakan dalam aplikasi komersial atau industri. Sebagai contoh, bahasa pemrograman Erlang, yang dikembangkan oleh perusahaan Swedia Ericsson pada akhir tahun 1980-an, pada awalnya digunakan untuk menerapkan toleransi kegagalan sistem telekomunikasi. [7] Sejak itu menjadi populer untuk membangun berbagai aplikasi di perusahaan-perusahaan seperti T-Mobile, Nortel, dan Facebook. [6] [8] [37] The Skema dialek Lisp digunakan sebagai dasar untuk beberapa aplikasi pada komputer Apple Macintosh awal [2] [3], dan memiliki lebih baru-baru ini telah diterapkan untuk masalah seperti perangkat lunak simulasi pelatihan [4] dan kontrol teleskop. [5] OCaml, yang diperkenalkan pada pertengahan tahun 1990-an, telah melihat penggunaan komersial di bidang-bidang seperti analisis keuangan [9], sopir verifikasi, pemrograman robot industri, dan analisis statis dari perangkat lunak tertanam. [10] Haskell, walaupun pada awalnya dimaksudkan sebagai sebuah bahasa, [12] juga telah diterapkan oleh berbagai perusahaan, dalam bidang-bidang seperti sistem dirgantara, desain hardware, dan web programming.
PEMROGRAMAN PROCEDURAL
Pemrograman prosedural
Pemrograman dalam paradigma prosedural dilakukan dengan memberikan serangkaian perintah yang berurutan..
Algoritma
Algoritma adalah serangkaian langkah-langkah yang tepat, terperinci, dan terbatas untuk menyelesaikan suatu masalah. Langkah yang tepat artinya serangkaian langkah tersebut selalu benar untuk menyelesaikan masalah yang diberikan. Langkah yang terperinci artinya setiap langkah diberikan secara detail dan dapat dieksekusi oleh komputer, instruksi seperti “tarik sedikit ke bawah” merupakan contoh instruksi yang tidak tepat, karena “sedikit” tidak menyatakan sesuatu yang tepat. Langkah yang diberikan harus terbatas, artinya suatu saat langkah harus berhenti, jika langkah tidak pernah berhenti (misalnya: “ambil air, masukkan ke bak mandi, ulangi ambil air, dan seterusnya”) maka serangkaian langkah itu tidak disebut sebagai algoritma (jika: “ambil air, masukkan ke bak mandi, ulangi ambil air sampai bak mandi penuh”, maka bisa disebut algoritma, namun langkah ambil air, masukkan ke bak mandi, harus diperinci).
Konstruktor (elemen) Pemrograman Prosedural
Elemen bahasa pemrograman prosedural yang penting adalah:
1. Program utama
2. Tipe
3. Konstanta
4. Variabel
5. Ekspresi, operator, dan operand
6. Struktur Data
7. Instruksi dasar
8. Program Moduler
9. File eksternal
10. Rekurens
Konstruktor ini tidak untuk dipelajari secara berurutan, namun semua perlu dipelajari dan dimengerti untuk dapat membuat program dengan baik.
1. Input,
2. Proses, dan
3. Output
Sekumpulan aksi dalam pemrograman prosedural bisa dibagi menjadi tiga bagian penting yaitu: input, proses, dan output. Bagian input, proses, dan output dikerjakan secara sekuensial, dan dalam setiap bagian mungkin akan ada input, proses, dan output.
PENGENALAN PROGRAM UTAMA
DALAM PASCAL
Mengenal program utama dalam suatu bahasa akan memberikan gambaran global bagaimana menulis program dalam bahasa tersebut. Program dalam bahasa Pascal memiliki format dasar seperti berikut (format lebih lengkap akan diberikan secara bertahap):
Program namaprogram;
begin
(*bagian program utama*)
end.
Kata-kata yang ditebalkan merupakan kata kunci (keyword) dalam bahasa Pascal. Kata kunci adalah kata-kata baku dalam bahasa Pascal yang memiliki arti khusus, kata-kata tersebut harus kita pakai sesuai dengan makna yang sudah berikan oleh Pascal, dan tidak bisa kita ubah.
Bagian pertama berisi nama program. Bagian ini tidak wajib ada di kompilator Pascal yang baru, namun sebaiknya tetap ditulis, kita bisa memberi nama program dengan kata kunci program, misalnya: program bilangan prima;
Bagian berikutnya adalah blok program utama yang ditandai dengan begin dan end. Perhatikan bahwa setelah end ada tanda titik yang menyatakan akhir program. Bagian di dalam tanda kurung diikuti oleh bintang/asterisk, (*seperti ini*) merupakan komentar program yang tidak akan diproses oleh kompilator (hanya untuk dibaca oleh manusia, sebagai tambahan keterangan). Program yang diberikan di atas tidak melakukan apa-apa, meskipun dapat dikompilasi dan dijalankan. Program sederhana yang dapat kita buat berikutnya adalah program “hello world” yang akan mencetak kalimat “hello world” ke layar komputer.
Program hello;
begin
writeln('Hello World');
end.
Program tersebut juga ada pada buku Contoh Program kecil dalam bahasa Pascal. Beberapa hal yang perlu diperhatikan adalah:
- Pascal tidak membedakan case atau kapitalisasi huruf (jadi writeln dengan WRITELN dianggap sama)
- Setelah setiap instruksi harus ada titik koma (titik koma adalah pemisah antar instruksi), kecuali instruksi terakhir sebelum end, boleh ada titik koma, boleh juga tidak
- Writeln adalah salah satu prosedur standar Pascal
Batasan Penamaan Identifier
Identifier adalah nama yang diberikan untuk fungsi, prosedur, tipe, variabel, dan untuk program. Semua nama yang disebutkan memiliki batasan tergantung pada kompilator yang digunakan, namun umumnya:
- Nama tidak boleh diawali dengan angka, 2you adalah identifier yang tidak valid
- Nama boleh berupa huruf yang digabung dengan angka, tapi tidak boleh diawali angka: its4you adalah nama yang valid
- Nama yang hanya terdiri dari huruf saja pasti valid (sampai panjang tertentu, tergantung kompilator)
- Nama biasanya boleh mengandung tanda underscore (garis bawah seperti ini: nama_orang) Perhatian: pilihlah nama yang singkat namun deskriptif untuk menamai apapun dalam program.
VARIABEL DAN TIPE
Konsep variabel dalam pemrograman mirip dengan konsep variabel dalam matematika. Variabel adalah suatu nama yang dapat diasosiasikan dengan sebuah nilai yang dapat kita manipulasi. Seperti dalam matematika, kita mengenal tipe untuk suatu variabel, misalnya 1 = x <>
Contoh penggunaan variabel yang sederhana ada pada contoh program kecil BACA.PAS. Perhatikan bahwa deklarasi variabel (pernyataan variabel apa memiliki tipe apa ada pada bagian sebelum blok utama begin end, seperti ini:
Program namaprogram;
var
nama_variabel : tipevariabel;
nama_variabel2 : tipevariabel2;
begin
(*bagian program utama*)
end.
Sintaks yang lebih lengkap dapat dilihat pada buku pemrograman bahasa Pascal. Perhatikan bahwa ketika dideklarasi sebuah variabel belum terdefinisi nilainya (sudah memiliki nilai, tapi tidak bias diprediksi nilai apa yang ada). Salah satu cara untuk memberi nilai variabel adalah melalui
assignment.
Assignment
Assignment adalah pemberian nilai kepada variabel. Assignment memberikan nilai pada ruas kiri sesuai dengan hasil nilai di ruas kanan. Misalnya jika a adalah sebuah variabel yang tipenya bilangan bulat:
var a: integer;
begin
a:= 2;
end.
akan memberikan nilai 2 pada variabel a. Untuk melihat nilai a, kita bisa mengoutputkan nilai tersebut dengan instruksi writeln, seperti ini:
writeln(a);
setelah instruksi a:=2. Perhatikan bahwa tipe di sebelah kanan harus sama dengan tipe di sebelah kiri (pembahasan mengenai assignment untuk tipe yang berbeda dapat dilihat di bagian Kompatibilitas Tipe)
Representasi Tipe
Komputer hanya bisa memproses angka, sehingga semua tipe data dalam komputer akan diproses dalam bentuk bilangan integer. Bahkan kata-kata yang muncul dalam komputer juga diproses sebagai bilangan. Untuk masing-masing tipe yang dibahas di sini, akan diberikan juga representasi di dalam komputer untuk masing-masing tipe untuk mengetahui batasan dari setiap tipe. Pemahaman representasi tipe ini penting untuk mengetahui mengapa suatu tipe terbatas, mengapa hasil suatu operasi seperti yang dijelaskan. Sebenarnya representasi tipe ini menjadi bahasan dalam kuliah atau pelajaran arsitektur komputer, namun karena tidak ada buku lain yang digunakan yang memuat hal tersebut, pembahasan representasi akan digabung dalam penjelasan tipe. Perlu ditekankan bahwa pengetahuan mengenai representasi tipe tidak terlalu penting dalam pemrograman, yang penting adalah hanya mengetahui batasan dari setiap tipe yang ada, sehingga dapat memilih tipe yang tepat ketika membuat program.
Konstanta
Konstanta adalah suatu nilai yang tidak berubah. Contohnya pi (p), adalah konstanta yang digunakan sebagai perbandingan keliling lingkaran terhadap diameternya, dan e adalah konstanta bilangan euler. Dalam Pascal dan dalam semua bahasa prosedural lain sebuah nama boleh diberi nilai yang tidak akan diubah di dalam program, nama ini disebut sebagai konstanta. Kata kunci yang dipakai dalam Pascal adalah const.
Const
PI = 3.14;
Penggunaan konstanta yang lebih lengkap dapat dilihat dalam buku panduan FreePascal (buku 1).
Variabel bertipe Dasar
Variabel bertipe dasar adalah variabel yang memiliki tipe yang sudah didefinisikan oleh suatu bahasa. Tipe dasar yang sudah didefinisikan Pascal meliputi: Integer, String, Karakter, Boolean, dan Real. Variabel bertipe dasar akan sangat banyak digunakan, dan merupakan elemen pembentuk tipe bentukan, sehingga penguasaan tipe dasar ini sangat penting.
Input dan Output Variabel bertipe Dasar
Setiap bahasa pemrograman umumnya sudah menyediakan cara untuk melakukan input dan output tipe dasar. Dalam Pascal, output tipe dasar dilakukan dengan prosedur write dan writeln. Beda kedua prosedur tersebut adalah: write tidak memajukan kursor ke baris berikutnya sedangkan writeln memajukan kursor ke baris berikutnya (ln di sini berarti line atau baris).
Untuk menuliskan atau mengoutputkan variabel bertipe dasar, gunakan write atau writeln seperti ini:
write(var1);
atau agar lebih jelas, gunakan string untuk menjelaskan arti output:
writeln (‘Nilai varl adalah’, varl);
Sebaliknya untuk membaca input dari pengguna, gunakan read atau readln. Contoh penggunaan read adalah:
read(a);
dimana a adalah suatu variabel dengan tipe dasar manapun. Untuk memperjelas, sebaiknya sebelum read perlu diberikan informasi kepada pengguna mengenai apa yang harus dilakukan:
write(“Masukkan sebuah angka:”);
read(a);
read dan readln memiliki fungsi yang sama untuk variabel bukan string, pada variabel string, read hanya membaca 1 kata sedangkan readln bisa membaca 1 kalimat.
Integer
Integer adalah suatu tipe bilangan bulat (negatif, positif, dan nol). Integer dipakai dalam kebanyakan operasi matematika dan loop, bahkan beberapa prosesor tidak memiliki kemampuan perhitungan bilangan real sehingga semua perhitungan numerik dilakukan dengan integer.
Representasi integer dalam komputer
Integer memiliki representasi yang sederhana dalam komputer. Komputer memandang integer sebagai nilai dari serangkaian bilangan biner. Namun komputer tidak memproses satu bit demi satu bit, tapi per blok bit yang umumnya terdiri dari 8 bit (dikenal sebagai 1 byte atau binary eight). Ada beberapa tipe integer, tipe integer paling sederhana adalah byte yaitu integer 8 bit yang unsigned (tidak bisa menyimpan nilai negatif, atau hanya bisa menampung tipe bilangan asli/natural), dan “pasangannya” yaitu tipe shortint yang tipe integer 8 bit yang bertanda (signed atau bilangan bulat).
Bilangan integer 8 bit artinya diperlukan memori sebesar 8 bit untuk menyimpan tipe tersebut, nilai yang bisa disimpan adalah 0000 0000 sampai dengan 1111 1111. Jika dipandang sebagai tipe unsigned, maka nilai desimal untuk 8 bit tersebut adalah 0 sampai dengan 255. Untuk bisa menyimpan nilai negatif dalam biner biasanya digunakan representasi yang disebut sebagai komplemen 2. Komplemen 2 adalah kebalikan dari representasi desimal ditambah dengan 1. Untuk menyimpan -5 desimal misalnya, kita cari representasi untuk 5 yaitu 0000 0101, kita balik (not-kan) menjadi 11111010, dan kita tambahkan 1 menjadi 11111011, sehingga representasi -5 dalam biner adalah 11111011. Untuk menyimpan bilangan positif 5, tetap digunakan 0000 0101. Dengan cara komplemen 2 maka nilai yang bisa ditampung dalam 8 bit adalah dari -128 sampai dengan 127 Tipe integer lain adalah integer yang berupa tipe integer 32 bit (atau 16 bit pada Pascal di DOS), dan long yang berupa tipe integer 64 bit. Perbedaan dari masing-masing tipe tersebut adalah kemampuannya dalam jangkauan angka yang bisa disimpan.
Operasi Terhadap Integer
Ada beberapa operasi dasar untuk integer yaitu: kali, bagi, tambah, kurang, dan mod. Operasi kali (disimbolkan dengan bintang/asterisk * ), tambah (+), dan kurang (-) sudah jelas dan berlaku seperti yang sudah dipelajari. 5 + 5 = 10, 2 * 3 = 6, dan 3-2 = 1. Operasi pembagian (div) akan memberikan hasil pembagian yang dibulatkan, jadi 4 div 2 = 2, dan 5 div 2 = 2. Operasi mod memberikan sisa dari hasil bagi sehingga 5 mod 2 = 1, dan 2 mod 5 = 2 (2/5 jika dibulatkan adalah nol, sisanya adalah 2 – 0* 5 = 2). Dalam beberapa bahasa pemrograman operasi mod mungkin tidak ada. Ada satu operator unary (operator yang memakai satu operand) untuk integer yaitu minus dan plus. Contoh ekspresinya: -5 * 2 = -10. Sebelum angka 5 ada operator minus yang menyatakan bilangan negatif.
Operasi perbandingan integer meliputi, > (lebih besar), < (kurang dari), <= (kurang dari atau sama dengan), >= (lebih dari atau sama dengan), tidak sama dengan (<>) dan = (sama dengan). Operasi perbandingan memiliki semantik yang sama seperti yang dipelajari dalam matematika (artinya: sama seperti di matematika 6 <>
Urutan Operator (Precedence of operator) Integer
Ekspresi 2*4+5*2 akan menghasilkan 18 karena operasi perkalian dilakukan lebih dahulu jika dibandingkan dengan pejumlahan. Dalam hal ini dikatakan bahwa precedence kali lebih tinggi dari bagi. Umumnya precedence of operator untuk integer di aneka bahasa adalah sama.
Karakter
Di dalam Pascal dan aneka bahasa lain, dikenal tipe data char yang bisa menampung satu karakter. Satu karakter adalah satu huruf, atau satu angka, atau simbol. Sebuah variabel bertipe karakter hanya boleh diisi dengan satu simbol saja, seperti ini:
var c:char;
begin
c:= 'A'; (* c berisi huruf A *)
end.
Representasi karakter dalam komputer
Dalam bahasa Pascal standar. Sebuah karakter adalah sebuah bilangan integer 8 bit yang memiliki nilai dari 0 sampai 255. Setiap nilai ini dipetakan dalam suatu simbol, misalnya nilai 65 berkaitan dengan simbol A, 66 dengan simbol B, dan seterusnya. Pemetaan ini tergantung pada encoding yang dipakai (dan encoding ini bergantung pada wilayah atau bahasa tertentu), karakter 0-127 memiliki pemetaan standar yang disebut dan biasanya disebut dengan karakter ASCII (American Standard Code For Information Interchange), sedangkan sisanya bergantung pada encoding yang dipakai (misalnya orang Perancis memetakan menjadi beraneka huruf yang memiliki accent, orang Rusia memetakan dalam alfabet mereka).
Dalam Pascal, ada fungsi ord (ordinal) yang bisa memetakan dari karakter menjadi nilainya, dan fungsi chr (character) yang melakukan proses kebalikannya. Contoh pemakaian ord:
writeln(ord('A'));
akan mencetak angka 65, dan contoh pemakaian chr
writeln(chr(65));
akan mencetak huruf A.
UNICODE
Dalam sistem operasi yang modern, terdapat jenis karakter yang disebut dengan UNICODE, yang lebih kompleks dari karakter sederhana. Karakter UNICODE dapat merepresentasikan hampir semua karakter yang masih dipakai di bumi (dan yang sudah tidak dipakai, seperti hieroglyph). Pada dasarnya penyimpanan UNICODE tetap memakai angka tapi memakai jumlah bit yang lebih dari karakter biasa (bervariasi dari 8– 64 bit, tergantung pada encoding yang dipakai)
Operasi Terhadap char
Sebuah tipe karakter tidak bisa dioperasikan, tidak bisa dijumlahkan ataupun dikurangkan. Tipe char hanya bisa dioperasikan jika dikonversi menjadi integer dengan ord. Sebuah tipe char bias digabungkan pada sebuah tipe string. Sebuah karakter bisa dibandingkan dengan karakter lain, hasil perbandingan adalah perbandingan nilai ordinal karakter tersebut. Operasi perbandingan yang bisa dilakukan sama dengan yang bias dilakukan dengan integer.
Contoh: 'A' < 'B', karena ordinal 'A' adalah kurang dari 'B', namun 'b' > 'A', karena ordinal 'b' (b kecil) lebih dari ordina 'A' (A kapital).
Perhatian
Manipulasi karakter dengan melakukan konversi ke integer merupakan hal yang sangat tidak disarankan. Kebiasaan melakukan hal ini juga berbahaya jika suatu saat Anda beralih ke UNICODE, karena hasil manipulasi serupa mungkin tidak bisa diprediksi.
String
String sebenarnya adalah tipe variabel dasar yang cukup kompleks, namun akan sering dipakai, dalam bagian ini representasi string tidak akan dibahas, hanya penggunaannya saja. Suatu literal integer dapat ditulis seperti biasa: 5 atau 6, sedangkan literal string harus ditulis dengan diapit tanda kutip tunggal, seperti ini:
'ini string'
Jika ada tanda kutip di dalam string, digunakan dua kutip tunggal, jadi untuk menuliskan string “don't do that”, harus seperti ini:
'don''t do that'
Operasi Terhadap String
Ada beberapa operasi untuk string, namun yang akan dibahas di bagian ini hanyalah instruksi penambahan atau konkatenasi string. String dapat digabungkan seperti ini:
program concat_string;
var s1, s2, s3 : string
begin
s1:= 'hello';
s2:='world';
s3:= s1 + ' '+ s2;
writeln(s3);
end.
Nilai string s3 adalah 'hello world' yang merupakan gabungan dari string s1, spasi, dan string s2. Sebuah karakter bisa juga digabung atau disambungkan dengan sebuah karakter:
var
s:string;
c:char;
begin
writeln('Masukkan sebuah huruf:'); readln(c);
s:= 'Huruf yang Anda masukkan adalah '+c;
writeln(s);
end.
Operasi terhadap string yang lain dilakukan dengan menggunakan fungsi-fungsi string yang tergantung pada kompilator Pascal. Fungsi-fungsi string yang tersedia untuk FreePascal dapat dilihat pada buku FreePascal.
Boolean
Boolean adalah suatu tipe data yang hanya memiliki nilai true (benar) dan false (salah). Tipe Boolean sangat diperlukan dalam kondisi perulangan dan kondisional (menggunakan if). Ekspresi yang menghasilkan boolean bisa berupa ekspresi dengan tipe-tipe yang terdiri dari tipe boolean, bisa juga berupa ekspresi dari tipe lain. Contoh ekspresi yang menghasilkan boolean adalah 6 > 5, karena bilangan 6 memang lebih besar dari 5 maka nilai ekspresi tersebut adalah true, sedangkan 6 <>
Operator untuk boolean ada beberapa yaitu: and, or, not, dan xor
OR akan menghasilkan true jika salah satu operandnya bernilai true
AND akan menghasilkan true jika kedua operandnya bernilai true
XOR akan menghasilkan true jika operandnya memiliki nilai boolean yang berbeda
NOT akan menghasilkan nilai boolean kebalikan dari nilai yang diberikan
Dalam Pascal, dan berbagai bahasa umumnya nilai true lebih besar dari nilai false (true > false adalah true)
Representasi Boolean dalam komputer
Nilai boolean disimpan sebagai angka 0 untuk false dan bukan nol untuk true. Dalam bahasa Pascal, boolean tidak bisa dioperasikan sebagai integer, namun dalam bahasa lain (C misalnya), boolean dan integer adalah dua nilai yang bisa dipertukarkan.
Urutan Operator (Precedence of operator) Boolean
Sama seperti pada integer, ada urutan operator pada operasi boolean. Urutan untuk operator Boolean dapat dilihat pada buku panduan Free Pascal.
Operasi Boolean pada Bilangan Integer
Bilangan integer dapat dioperasikan dengan operator boolean, proses operasi dilakukan dengan melihat representasi bit pada bilangan integer, dan melakukan operasi boolean yang bersesuaian terhadap bit tersebut (bit 1 dianggap true, dan 0 dianggap false).
Contoh: 1 or 2 = 3
representasi biner untuk 1 desimal adalah (kita ambil 8 bit) 00000001, sedangkan representasi biner untuk 2 desimal adalah 00000010, maka jika kita or -kan masing-masing bit, hasilnya adalah 00000011, yang artinya 3 desimal
Real
Real adalah tipe yang dapat menampung bilangan real. Tipe ini bisa menampung bilangan dengan suatu nilai di belakang koma dengan presisi tertentu (lihat bagian representasi real).
Representasi Real dalam komputer
Ada banyak representasi real dalam komputer, namun umumnya real direpresentasikan dalam bentuk:
A * 2+/- b
Misalnya nilai 0.5 akan direpresentasikan sebagai 1 * 2-1 (½ = 0.5). Perhatikan bahwa tidak semua nilai bisa direpresentasikan dengan tepat dengan cara ini, nilai 1/3 misalnya tidak bisa dinyatakan dengan tepat dalam bentuk perkalian tersebut. Baik nilai A maupun nilai B memiliki presisi integer yang terbatas. Operasi Terhadap Real Operasi yang bisa dilakukan terhadap real meliputi: tambah, kali, minus (sama seperti integer), dan pembagian (memakai simbol / yang menghasilkan bilangan real), operasi MOD tidak terdefinisi untuk real.
Operasi perbandingan selain = (sama dengan) dan tidak sama dengan (<><) bisa dilakukan terhadap real (>, <, >=, <=, <>). Operasi sama dengan dan tidak sama dengan sebenarnya bisa dilakukan (tidak dibatasi oleh bahasa Pascal), namun dalam kasus tertentu hasilnya mungkin tidak sesuai dengan yang diharapkan. Cara yang benar untuk membandingkan 2 buah real adalah dengan menetapkan nilai epsilon yang kecil yang dipakai untuk membandingkan:
if (a – b <>
begin
writeln(“A sama dengan B”);
end else
begin
writeln(“A tidak sama dengan B”);
end;
(mengenai penggunaan kalimat kondisional, lihat bab Analisa Kasus)
Kompatibilitas Tipe
Sebuah variabel bertipe string tentu tidak bisa dijumlahkan dengan variabel bertipe integer, karena tipe string tidak kompatibel dengan tipe integer. Kedua tipe itu sangat berbeda, sehingga masalah kompatibilitas tipe itu sudah jelas. Namun dalam kasus tertentu, kompatibilitas tipe mungkin tidak terlalu jelas dan harus diperhatikan dengan baik. Contohnya, variabel bertipe real tidak bisa langsung diassign pada variabel bertipe integer, karena variabel bertipe real mungkin mengandung pecahan, tapi hal yang sebaliknya bisa dilakukan.
Variabel bertipe real dengan presisi yang tinggi (misalnya double di Pascal) tidak bisa diassign pada variabel bertipe real dengan presisi yang lebih rendah (tipe real biasa di Pascal), karena presisinya bisa hilang. Permasalahan menjadi lebih kompleks pada ekspresi yang melibatkan banyak variabel dengan berbagai jenis tipe. Contohnya dalam ekspresi ini:
a : integer;
b : integer;
d : integer;
c : real;
begin
a :=1;
b :=2;
c :=a/b;
d :=a/b;
end.
Ekspresi a/b akan menghasilkan tipe real, sehingga instruksi terakhir adalah salah dan tidak bias dikompilasi (tipe di ruas kanan tidak sama dengan tipe di ruas kiri).
Konversi Antar Tipe Sederhana
Suatu tipe dapat dikonversi ke tipe lain meskipun biasanya konversi ini tidak sempurna. Contoh konversi tipe adalah: konversi dari tipe dengan presisi yang lebih tinggi ke yang lebih rendah (integer ke byte misalnya, konversi dari tipe bertanda ke tidak bertanda, konversi dari string ke integer, konversi dari real ke integer. Sebagian proses konversi dapat dilakukan melalui proses yang disebut dengan casting. Casting merupakan proses konversi sederhana yang hanya melakukan perubahan representasi internal tanpa kehilangan makna. Contohnya casting bisa dilakukan untuk mengubah sebuah shortint menjadi byte, atau byte menjadi integer, namun sebuah bilangan real tidak bisa dicast menjadi sebuah integer. Cara melakukan casting adalah dengan memberikan ekspresi yang akan dicasting di dalam nama tipe tujuan casting:
var
a:byte;
b:real;
begin
a := 3 div 2;
writeln(integer(a));
b := real(a);
writeln(real(b));
writeln(real(1/2));
end.
Konversi a ke real bisa dilakukan karena bilangan integer pasti bisa dikonversi ke real. Konversi integer(b) akan menghasilkan error karena dalam konversi real ke integer ada beberapa hal yang bias dilakukan, apakah akan dibulatkan ke atas, atau dibulatkan ke bawah, atau semua angka di belakang koma akan dihilangkan. Konversi dari tipe yang lebih presisi lebih tinggi, atau yang memiliki range yang lebih besar ke tipe yang presisi atau range yang lebih kecil akan memiliki hasil yang tidak terdefinisi dalam kasus tertentu. Misalnya i adalah sebuah integer, dan b adalah sebuah byte, konversi dari i ke b (integer ke byte) akan menghasilkan hasil yang benar jika i memiliki nilai antara 0 sampai 255, jika i memiliki nilai di luar itu maka nilai b tidak bisa diprediksi.
Konversi tipe dengan fungsi
Konversi tipe yang melibatkan tipe yang berbeda jauh dapat dipandang sebagai konversi tipe yang tidak sederhana. Konversi ini melibatkan penggunaan fungsi khusus yang menjadi bagian dari bahasa, atau fungsi tambahan pendukung bahasa tersebut. Contoh fungsi yang adalah ceil untuk membulatkan bilangan ke atas (6.7 menjadi 7), floor untuk membulatkan bilangan real ke bawah (6.7 menjadi 6), dan round untuk membulatkan bilangan real ke nilai yang terdekat (6.7 menjadi 7).
Fungi atau prosedur konversi juga tersedia untuk mengubah integer/real menjadi string dan sebaliknya. Dalam kasus konversi string ke numerik, ada kemungkinan bahwa string tidak mengandung karakter angka, tapi karakter lain sehingga konversi gagal. Fungsi konversi yang disebutkan bukan merupakan standar Pascal, sehingga perlu dikonsultasikan pada dokumentasi kompilator yang dipakai. Untuk FreePascal, informasi ini juga bisa diperiksa di buku FreePascal.
Langganan:
Postingan (Atom)