Buku Pemrograman Nim
Nim, atau sebelumnya Nimrod merupakan bahasa pemrograman general purpose, system level, optional garbage collector serta memiliki sintaksis mudah dibaca dan elegan. Nim bahasa yang muncul sejak tahun 2006 dan berdiri sendiri tanpa backing dari perusahaan besar, hal ini mengambarkan kekuatan pengembangan yang solid dari Nim.
Buku elektronik ini berusaha mengenalkan Nim dari 0 hingga ke jenjang lanjutan. Ada 3 bagian dari buku ini :
-
Nim Dasar
Bagian ini membahas topik dasar seperti variable dan tipe data yang cocok untuk kamu yang baru berkenalan dengan programming atau baru mengenal Nim. Kemudian disambung fitur khusus dari nim seperti OOP dan Macros.
-
Web Programmming
Bagian ini akan mengenalkan pemrograman web dengan Nim. Pustaka yang digunakan yaitu Jester sebagai web framework (serupa framework Sinatra milik Ruby). Selain Jester, akan mengenalkan juga pustaka untuk keperluan database, logging, dan semacamnya.
-
TBD (To be decide)
Lisensi
Buku elektornik ini ini boleh disebarluaskan secara gratis berdasarkan aturan lisensi CC BY-NC-SA 4.0.
Penulis
Buku ini ditulis oleh Yoghaswara "artileda" Hadi Nugroho. Bila ada pertanyaan atau saran, bisa membuat issue baru di https://github.com/artileda/artileda/issues/new
.
Informasi terkait Nim
Panduan Baca Buku
Panduan membaca buku ini
Buku ini memiliki idiom penulisan tertentu yang dirasa tidak umum atau membingungkan, halaman ini dibuat untuk memberikan panduan terhadap idiom dan rambu-rambu yang ada didalam buku ini.
-
Tulisan miring, tulisan dibuat miring karena kata asing atau serapan tertentu.
-
Tulisan mono
, tulisan ini dibuat untuk merujuk pada kode atau hal teknis pemrograman lainya. -
Tulisan tebal, tulis ini dibuat untuk merujuk kepada bagian lain dari buku ini.
-
Markah Mono
Tulisan ini dibuat untuk mengambarkan kode yang panjang ke bawah.
-
Markah biasa
Tulisan ini dibuat untuk menunjukan informasi penting yang dibuat menonjol agar tidak terlewat.
Rambu dalam markah kode
-
Placeholder (Ruang pengganti)
Placeholder adalah ruang dimana pembaca diharapkan menukarnya tulisan tersebut dengan maksud penulis.
Seperti ini:
let <nama> : <tipe data> = <nilai>
Rambu
<nama>
,<tipe data>
dan<nilai>
, penulis bermaksud untuk pembaca saat mempraktikan atau membaca menganggap rambu ini bisa diubah dengan nilai bebas tertentu sesuai dengan maksud yang ditulis didalam kurung siku.let angkaPI : float = 3.14
Nim Dasar
Seksi ini akan membahas pemrograman fundamental dari 0 dan di ikuti oleh pengenalan fitur khusus yang dimiliki oleh Nim.
Belajar Nim
Nim (sebelumnya Nimrod) merupakan bahasa pemrograman general-purpose dan multi-paradigma yang dikembangkan oleh Andreas Rumpf sejak tahun 2006.
Desain bahasa terinspirasi dari bahasa Python, Ada dan Modula, maka tak heran Nim banyak dijuluki dengan pesaing Python.
Nim mengompilasi source code Nim ke dalam bahasa C, C++ atau Javascript sehingga dapat membentuk bineri native executable atau source code Javascript.
Logo Resmi Nim
Kelebihan Nim
- Syntaks yang mudah dibaca dan flexible.
- Kompiler Nim berkerja pada platform sistem operasi mayoritas : Windows, MacOs dan Linux.
- Penanganan memori deterministik dan bisa di kustom, cocok untuk embedded system dan sistem real-time.
- Mendukung transpilasi ke bahasa C, C++ dan Javascript. Kompilasi ke C atau C++ memberi dukungan lebih untuk menjangkau arsitektur instruksi CPU yang bervariasi.
- Tipe Statis mengeliminasi _run-time error _menjadi compile-time error.
Ease Syntax + High-perfomance = Nim
Install Nim
Nim mendukung sistem operasi Windows , Mac dan Linux. Distribusi instalasi Nim bisa dilihat di Download Nim.
Install Nim di Windows
- Buka situs Download Nim, pilih Windows
- Unduh arsip, pilih Download x86_64.zip.
- Setelah selesai di unduh, extract zip ke drive
C:\nim
(buat dulu foldernya) lalu masuk ke folder yang diekstract dan jalankanfinish.exe
. - Agar nim bisa dijalankan lewat terminal, tambahkan ini ke enivroment variabel (Caranya disini), lalu tambahkan keakhir nilai variabel
PATH
:C:\nim\bin dan %USERPROFILE%\.nimble\bin
. Jadi seperti ini<nilai yang udah ada>;C:\nim\bin;%USERPROFILE%\.nimble\bin
.
Install Nim di Linux
- Buka situs Download Nim, pilih Linux.
- Unduh arsip, pilih Download x86_64.zip.
- Ekstrak folder ke
/home/<hostname komputer kamu>/nim
. - Lalu tambahkan nilai
/home/<hostname komputer kamu>/nim/bin
dan/home/<hostname komputer kamu>/.nimble/bin
environment variabel PATH agar bisa menjalankan Nim lewat terminal.- tambahkan
PATH=$PATH:/home/<hostname komputer kamu>/nim/bin:/home/<hostname komputer kamu>/.nimble/bin
ke file/etc/profile
, atau bisa tambahkan ke/home/<hostname komputer kamu>/.bashrc
bila menggunakan bash.
- tambahkan
Install Nim di Android
- Menjalankan Nim di android bisa menggunakan Termux (download dari situs F-droid resminya karena yang di - PlayStore sudah tidak dirawat).
- setelah install, jalankan ditermina
pkg upgr
untuk memperbaharui internal termux. - terakhir
pkg install nim
.
Untuk menjalankan sebuah kode Nim
-
Buat sebuah file bernama
main.nim
(namamain
ini hanya contoh). -
Isi didalamnya kode berikut
echo "UwU"
-
lalu buka terminal dan masuk ke folder dimana file
main.nim
berada (gunakancd
untuk berpindah folder di terminal). -
kemudian jalankan perintah
nim c -r <nama file>
, untuk kasus ininim c -r main.nim
. Maka akan munculUwU
. -
Bila ingin mengompile binary saja tanpa menjalankan bisa hapus flag
-r
, lalu jalankanya binarynya dengan./main
(main
sesuai dengan nama file)
Ini bukan cara satu-satunya untuk menginstall Nim, ada cara lain yaitu mengompilasinya dari kode sumber atau menggunakan choosenim
.
Persiapan Editor
Code editor untuk memrogram Nim bisa mengunakan Visual Studio Code, Vim dan Notepad++
Visual Studio Code (VSCode)
- Pencet
ctrl
+shift
+x
untuk membuka sisi Extension. - Ketik di search bar
nim
,maka akan muncul pilihan ektensi (pastikan terkonesi ke internet). - Pilih ektensi
nim
dengan unduhan terbanyak (sejauh ini ekstensi milik Konstantin Zaitsev).
Ektensi adalah fitur tambahan yang terpisah dari code editor, pemisahan ini agar pengguna tidak telalu berat mengunduh code editor dan menyesuaikan dengan kebutuhan code editor.
Vim
- Install vim-plug agar installasi seragam.
- Pasang ektensi zah/nim.vim.
Pro-tips: Bila kamu memrogram menggunkan komputer/laptop bisa menggunakan VSCode, bila menggunakan Termux Android pilih Vim (tidak terbatas untuk Android).
Simple Program: Hello World
Program adalah kumpulan instruksi komputer yang menerima nilai masukan dan menghasilkan nilai keluaran.
Nilai masukan merupakan sebuah nilai yang berasal dari perangkat masukan komputer seperti ketikan,file eksternal atau paket jaringan.
Nilai keluaran adalah nilai yang dihasilkan ketika program diberi nilai masukan, seperti menampilkan tulisan, memutar suara/video dan megiriman paket jaringan.
Hello Word
Hello Word
merupakan contoh program sederhana yaitu nampilkan kata ke layar (nilai keluaran) pada program.
echo("Hello, World")
# echo "Hello, World"
# ^ tanpa kurung juga bisa
Kata kunci echo
, berguna untuk menampilkan nilai ke layar.
Reflek
Bagian ini akan mencontohkan bagaimana program menerima nilai masukan dari keyboard dan mengeluarkanya kelayar (reflek).
echo readLine(stdin)
Kata kunci readLine()
berfungsi untuk membaca file dan variabel stdin
(standard input) untuk menerima karakter yang kita ketik ke layar.
Membuat dialog sederhana
Sampai tahap ini kita telah belajar tentang echo
dan readLine(stdin)
, sekarang kita membuat
dialog antara komputer dengan kita menggunakan kata kunci yang telah kita pelajari.
echo "Hai, nama kamu siapa ?"
echo "Halo, " & readLine(stdin) & ". Salam kenal."
Variabel
Variabel adalah tempat program menyimpanan nilai sementara di memori komputer, setelah program mati atau komputer mendadak mati maka nilai ini akan hilang.
Tujuan variabel untuk menyimpan nilai sementara dari proses perhitungan atau komputasi yang akan digunakan oleh proses lain agar tidak melakukan perhitungan yang sama dua kali.
Cara membuat (deklarasi) variabel program kita bisa menggunakan kata kunci var
ataupun let
.
Kata kunci var
Membuat dengan kata kunci var
(singkatnya, Variabel var
) memiliki aturan pola kalimat seperti ini.
var [nama variabel] : [tipe data] = [nilai]
Deklarasi variabel di awali dengan kata kunci var
, kemudian diikuti dengan [nama variabel]
. Nama variabel berguna untuk mengambil nilai yang di simpan dalam variabel.
Nama variabel ini bebas kita berikan bisa test1
atau umur
, penamaan yang baik yaitu menamakan
sesuai denga data yang disimpan di dalam variabel.
[tipe data]
, Tipe data memberi tahu komputer bahwa nilai yang disimpan memiliki tipe data tertentu untuk menentukan bagaimana nilai yang di simpan akan di proses.
[nilai]
merupakan nilai yang akan di simpan seperti angka, karakter, notasi logika atau data objek.
Contoh deklarasi dan pemakaian variabel kata kunci var
:
var nama : string = "Andrea"
echo nama
# Andrea
Pro-tip: tipe data
string
adalah jenis tipe data yang menyimpan nilai karakter.
Kita bisa mengubah nilai variabel dengan mengunakan simbol =
, karena variabel var
bersifat mutable (bisa berubah/mutasi).
var nama = "Andrea"
echo nama
# Andrea
nama = "Rumpf"
echo nama
Kata kunci let
Selain var
, kata kunci let
juga bisa digunakan untuk mendeklarasikan variabel dan polanya tidak
jauh berbeda dengan pola kalimat kata kunci var
.
let [nama] : [tipe data] = [nilai]
Contohnya seperti ini
let nama = "Andrea"
echo nama
# Andrea
nama = "Rumpf"
# [ERROR]
Pro-tips : Variabel
let
tidak bisa diubah nilainya setelah dideklarasikan.
Quest: Program dialog
Dibagian sebelumnya, kita telah belajar membuat dialog sederhana. Tetapi apa yang bisa kita pakai dari pelajaran ini untuk membuat mengembangkan program dialog sederhana ?
Kita bisa memanfaatkan variabel untuk menyimpan nilai masukan dari pengguna untuk disimpan kemudian ditamplikan dalam bentuk yang besar, seperti ini:
echo "Siapa nama kamu ?"
let nama : string = readLine(stdin)
echo "Hai, " & nama & ". senang bisa berkenalan."
echo nama & ", mau nanya dong. umur kamu berapa ?"
let umur : string = readLine(stdin)
echo "Oke, Terima kasih " & nama
echo "Nama kamu " & nama & " dan berumur " & umur
Dengan variabel, kita bisa menggunakan jawaban dari Siapa nama kamu ?
berulang kali tanpa
menanyakan lagi.
Tipe data
Setiap nilai memiliki tipe datanya tersendiri yang menentukan bagaimana nilai akan diproses di dalam program.
Nilai yang disimpan di dalam komputer berbentuk byte dan penyimpan berbeda untuk bentuk nilai tertentu, maka tipe data memudahkan kita untuk mengambil dan memroses nilai yang disimpan.
Info: Nim adalah bahasa yang tipe bersifat statis, tipe perlu di tulis saat deklarasi variabel dan tidak pernah berubah setelahnya.
Tipe data dibagi menjadi 2 yaitu tipe data primitif dan tipe data buatan.
Tipe data primitif
Tipe data ini yang paling dasar dan tidak ada turunanya lagi.
Nama | Penulisan | Deskripsi |
---|---|---|
Integer | int | Tipe data ini untuk nilai angka seperti 1 ,3 ,-20 |
Float | float | Tipe data ini untuk nilai bilang pecahan seperti -1.32 ,3.14 |
String | string | Tipe data ini untuk nilai kumpulan karakter seperti "Nim keren" , "Hello, World" |
Bool | bool | Tipe data ini untuk nilai logika seperti True dan False |
Char | char | Tipe data ini untuk karakter tunggal seperti 'a' ,'\n' |
Berikut contohnya :
var umur : int = 26
var beratBadan : float = 52.3
var nama : string = "Gwen Adler"
var menikah : bool = false
var inisial : char = 'a'
Tipe data buatan
Tipe data ini hasil dari tipe yang kita deklarasi sendiri (pembahasan lebih lanjut di Enum dan Record). Tipe data buat kita bisa membuat gabungan tipe dari tipe dasar (tipe data komposit) atau tipe data dengan nilai khusus (tipe data enumerasi).
type StatusDaring* = enum
online | sibuk | idle | offline
type GithubAcc = object
username* string
status* StatusDaring
var akunKeren = GithubAcc(username: "artileda",status: StatusDaring.Sibuk)
Pro-tips : Nim bisa mengetahui tipe data dari nilai yang diberikan (Hindley-Milner type inference). Hal ini berguna untuk menghindari penulisan tipe yang berulang.
Operator
Operator merupakan cara kita untuk mengoperasi sebuah nilai untuk diproses, ini alasan kenapa kita belajar tipe data sebelumnya karena operator sangat bergantung kepada tipe data sebuah nilai.
Ada tiga bentuk operasi dasar dalam program : aritmatika, relasional dan logika.
Aritmatika
Operasi ini berurusan dalam perubahan angka seperti penjumlahan, pengurangan dan sebagainya. Tipe data yang dioperasikan yaitu Integer dan Float.
Nama Operasi | Simbol | Contohnya |
---|---|---|
Penjumlahan | + | 32 + 1 , 3.14 + 0.86 |
Pengurangan | - | 2 - 1 , 0.143 - (-1.33) |
Perkalian | * | 432 * 200 , 1.0 * 0.44 |
Pembagian | \ | 4.0 / 0.23 , 6 / 3 |
Contoh penerapan
3 + 2
# 5
5 - 1
# 4
Parentesis
Parentesis atau kurung ()
merupakan operasi untuk mendahulukan perhitungan didalamnya.
contohnya seperti ini:
3 - ( 4 + 2 )
# 3 - 7 = -4
(3 - 4) + 2
# -1 + 2 = 1
Relasional
Operasi ini membandingkan nilai dan mengembalikan nilai logika. Jika perbandingan benar maka
akan mendapat nilai true
, bila salah maka mendapat nilai false
. Sebagian operasi ini mendukung
hampir semua tipe dasar.
Nama Operasi | Simbol | Tipe data | Contohnya |
---|---|---|---|
Sama dengan | == | Integer, Float, String, Boolean, Char | 2 == (1 + 1) , "UwU" == "uWu" , true == ( 1 == 1 ) |
Tidak sama dengan | != | Integer, Float, String, Boolean, Char | 2 != 1 , "UwU" != "uWu" , true == ( 1 != 1 ) |
Kurang dari | < | Integer, Float | 1 < 2 , 0.3 < 0.4 |
Lebih Dari | > | Integer, Float | 3 > 2 , 2.3 > 0.3 |
Kurang dari sama dengan | <= | Integer, Float | 4 <= 3 , 0.3 <= 1.0 |
Lebih dari sama dengan | >= | Integer, Float | 3.3 >= 3.2 , 3 >= 5 |
Logika
Operasi ini bertugas untuk merubah data logika, seperti boolean
.
Nama Operasi | Simbol | Contohnya |
---|---|---|
Logika AND | and | true and false |
Logika OR | or | true or false |
Logika NOT | ! | !true |
Logika AND akan mengembalikan nilai false
bila disalah satu sisi ada dan kedua sisi bernilai
false
.
Logika OR, serupa dengan Logika AND tetapi untuk nilai true
.
Logika NOT, membalik nilai logika bila logika NOT ada pada nilai true
maka berubah menjadi
false
dan kebalikanya.
Pemilihan Kondisi
Pemilihan kondisi adalah cara menjalankan baris kode dengan dibatasi oleh kondisi dari nilai ataupun operasi.
Jadi suatu kode akan dijalankan bila ada kondisi pemilih tertentu saja, sebelumnya kita hanya menjalankan kode terus mengalir dari atas kebawah tanpa terlewat menjalankan kode satupun.
Ada 2 cara untuk membuat pemilihan kondisi, menggunakan pernyataan if
yang berdasarkan logika
atau pernyataan case
yang berdasarkan kecocokan nilai.
Pernyataan if
Deklarasi pemilihan dapat mengunakan kata kunci if
dengan pola kalimat seperti ini
if <kondisi pembatas>:
<baris kode yang dijalankan bila kondisi pembatas bernilai benar>
Contoh seperti ini:
let hujan = false
if hujan:
echo "Malam akan hujan, jangan lupa bawa payung."
# ini tidak akan dijalankan
Contoh diatas mengambarkan kata kunci echo
tidak dijalankan karena variabel hujan
tidak bernilai
true
yang menandakan bahwa kondisi pembatas terpenuhi.
Silahkan coba kode di atas dan di bawah ini untuk melihat perbedaanya.
let hujan = true
if hujan:
echo "Malam akan hujan, jangan lupa bawa payung."
Pernyataan if-else
Pernyataan if
memiliki lanjutanya lainya yaitu keyword else
. Keyword else
bertugas menjalankan
baris kode yang tidak memenuhi kondisi pembatas penyataan if
diatasnya.
Contoh seperti ini :
let hujan = false
if hujan:
echo "Malam akan hujan, jangan lupa bawa payung."
else:
echo "Malam tidak hujan"
# ini akan dijalankan
Pernyataan if-elif
Kata kunci elif
berguna untuk menyambung kondisi pembatas sebelumnya dengan kondisi pembatas baru, berbeda
dengan else
yang tidak memiliki kondisi pembatas.
Contoh sebelumnya kita mengunakan nilai kondisi bersifat biner, sekarang kita coba dengan nilai kondisi yang bersifat skalar (memiliki ukuran).
let suhu = 30
if suhu <= 25:
echo "Ruangan ini dingin"
elif (suhu >= 26) and (suhu <= 30):
echo "Ruangan biasa saja"
elif suhu >= 31
echo "Ruangan ini panas"
Kondisi pembatas diatas membandingkan variabel suhu
apakah kurang dari sama dengan 25, bila benar
maka menampilkan Ruangan ini dingin
.
Kondisi kedua kita berhadapan dengan kondisi pembatas tertutup yang berarti kondisi ini terjadi dalam nilai tertentu dalam kasus ini antara 26 sampai 30. Kondisi ini memiliki tiga operasi yaitu
- lebih dari sama dengan 26
- kurang dari sama dengan 30
- logika AND dari hasil poin 1 dan poin 2
Pertama kita, lihat apakah variabel suhu
lebih 26, bila benar maka poin 1 bernilai true
. Kedua,
kita uji lagi variabel suhu
apakah kurang dari 30, bila benar maka poin 2 bernilai true
.
Terakhir, kita menguji apakah Logika AND dari nilai point 1 (true
) dan point 2 (true
).
Masih ingat logika AND yang dibahas di bagian Operator ?
Kondisi ketiga mengcek apakah variable suhu
lebih dari 31.
Kuis
-
Apa hasil dari contoh kode pernyataan
elif
jika dijalankan dengan kondisi ke-3 dihapus dan nilai variabelsuhu
dideklarasikan dengan nilai 31 ? -
Apa yang berbeda jika kedua kode ini dijalankan ?
let umur = 18 if umur >= 18: echo "Masa remaja akhir" if umur >= 21: echo "Masa awal dewasa"
let umur = 18 if umur >= 18: echo "Masa remaja akhir" elif umur >= 21: echo "Masa awal dewasa"
Pemilihan Kondisi dengan Pernyataan case
Pada bagian sebelumnya, pemilihan kondisi dengan pernyataan if
menggunakan basis logika sebagai
kondisi pembatasnya. Pernyataan case
merupakan pemilihan kondisi yang berdasarkan ke cocokan nilai
dan pola sebagai pembatasnya. Berikut pola kalimat penulisan pernyataan case
:
case <nilai/variabel yang diuji>:
of <kondisi pembatas>:
<baris kode>
of <kondisi pembatas>:
<baris kode>
# Kondisi lainnya
else:
<baris kode>
Pernyataan diawali dengan kata kunci case
kemudian dibarengi dengan nilai atau variabel yang ingin
diuji dengan kondisi pembatas dibawahnya. Kata kunci of
berguna untuk mendeklarasikan kondisi
pembatasnya, jika nilai / variabel uji memiliki nilai sama dengan kondisi pembatas ini maka baris
kode didalamnya akan dijalankan dan pemilihan kondisi berakhir.
Kata kunci else
serupa dengan pernyataan if
, dijalankan bila tidak ada kondisi pembatas
diatasnya yag terpenuhi.
Contoh seperti ini:
let statusWhatsapp : int = 3
case statusWhatsapp:
of 0:
echo "Ada"
of 1:
echo "Sibuk"
of 2:
echo "Sedang rapat"
of 3:
echo "Tidur"
else:
echo "Status tidak diketahui"
Perulangan
Perulangan serupa dengan memiliki pemilihan kondisi yaitu memiliki kondisi pembatas, tetapi berbedaanya perulangan bertugas untuk menjalankan baris kode berkali-kali selama kondisi pembatas masih terpenuhi sedangkan pemilihan hanya menentukan baris kode mana yang akan dijalankan.
Ada dua jenis perulangan yaitu looping dan iterasi. Looping menggunakan kondisi pembatas
berdasarkan logika seperti pernyataan if
. Iterasi mengunakan isi koleksi data sebagai kondisi pembatas yang akan dibahas lebih lanjut pada bagian Koleksi.
Nim memiliki pendekatan first class iterators, karena Nim mendukung iterasi inline dan iterasi klosure
Looping
Deklarasi sebuah looping pada Nim menggunakan pernyataan while
.
while <kondisi pembatas>:
<baris kode>
Contoh seperti ini:
var index = 0
while index < 5:
echo index
index += 1
# bentuk ringkas dari
# index = index + 1
Kode diatas kita memiliki variabel index
bernilai 0 lalu sebuah kondisi perulangan dengan batas
nilai variabel index
kurang dari 5. Jika nilai variabel index
kurang dari lima, maka perulangan
akan menjalankan baris kode dibawahnya yaitu
echo index
index += 1
echo index
bertugas menampilkan nilai variabel index
, variabel index disini berkerja sebagai
pembatas kondisi perulangan. index += 1
berfungsi untuk mengubah nilai variabel index
agar
membuat nilai variabel index
melewati kondisi pembatas yaitu angka yang lebih kecil dari 5,
jika kondisi pembatas terlewati, maka perulangan berhenti.
Peringatan: Kondisi pembatas looping sebaikanya menguji variabel mutable untuk mententukan batas operasi, karena looping bisa dihentikan dari dalam baris kode dengan mengubah nilai variabel. Bila tidak ada kemungkinan infinite loops, yang menyebabakan program membuat komputer menjadi hang karena perulangan tidak berhenti dapat menghabiskan resource komputer seperti RAM penuh atau CPU 100%.
Kata kunci break
Ada kalanya kita perlu berhenti dari perulangan tanpa harus memenuhi kondisi pembatas, di sini peran
dari kata kunci break
untuk menghentikan perulangan.
var index = 0
while true:
if (index >= 0) and (index < 10):
echo index
index += 1
else:
break
Peringatan: contoh ini mengunakan infinite loops dimana kondisi pembatas tidak pernah berubah karena menggunakan nilai langsung yang tidak bisa diubah.
Contoh infite loop diatas bisa ditangani dengan mengehentikan perulangan pada kondisi tertentu, kasus diatas ingin menampilkan nilai 0 sampai 10 dari infinite loop.
Engineering tips: Meskipun infinite loop terkesan mengerikan, tetapi memiliki kegunaan tersendiri seperti membuat
event loop
pada web server atau program yang memiliki tugas menunggu.
Iterasi
Nim memiliki fitur iterator yang unik, tetapi disini hanya akan membahas penggunaan yang sederhana
yaitu Pernyataan for. Pola pernyataan for
sebagai berikut
for <item> in <koleksi data>:
<baris kode>
item
adalah nilai yang ditelusuri oleh program jadi semua nilai dari <koleksi data>
akan dibaca
melalui index oleh baris kode dibawahnya, nama index
bebas seperti variabel.
for angka in [1,3,4,5]:
echo angka
Kapan pakai Looping dan iterasi ?
Penggunaan looping digunakan pada saat kondisi banyak bergantung pada operasi logika seperti mengurutkan data atau proses yang tidak menggunakan data secara langsung (sebagai contoh event loop
).
Iterasi digunakan untuk kondisi yang bergantung pada koleksi data seperti ingin mengubah isi koleksi keseluruhan atau sebagian atau mencari data.
Koleksi
Koleksi adalah tipe data dengan kumpulan nilai. Pada contoh variabel sebelumnya kita hanya bisa menyimpan satu nilai (nilai tunggal) didalam variabel, dengan koleksi kita bisa menyimpan banyak nilai (nilai majemuk) yang diakses menggunakan index posisi yang dimulai dari 0 dan tipe data nilai yang disimpan dalam satu koleksi harus sama
let tunggal = 12
let majemuk = [1,2,3]
echo tunggal # 12
echo majemuk[0]
# membaca index ke-0
# dari varibel majemuk
# 1
echo majemuk[1]
# sama seperti diatas
# tapi index ke-1
# 2
Koleksi pada Nim terdapat 3 jenis : Array, Sequence dan string.
Koleksi Array
Array (dibacai arai) merupakan jenis koleksi yang menyimpan banyak data dengan jumlah yang tetap, artinya setelah dideklarasikan bersama jumlahnya ukuran tidak bisa bertambah.
let <nama> : array[<ukuran array>, <tipe data>] = [<nilai>,<nilai>]
# atau untuk deklarasi nilai berbentuk array
[<nilai>,<nilai>]
Contohnya seperti ini:
let isiDompet : array[2, string] = ["KTP","KTM"]
echo isiDompet[0]
# KTP
echo isiDompet[1]
contoh diatas kita mengakses nilai dari isiDompet
menggunakan index posisi:
Index | Nilai |
---|---|
0 | KTP |
1 | KTM |
Looping dan Iterasi pada Koleksi
Untuk memroses isi koleksi akan cukup melelahkan bila kita menulis kode yang sama berulang untuk mengakses isi koleksi. Kita bisa gunakan perulangan yang sebelumnya telah dibahas:
let isiDompet : array[2, string] = ["KTP","KTM"]
# pendekatan _looping_
var index = 0
while index < 2:
echo isiDompet[index]
index =+ 1
# pendekatan iterasi
for isi in isiDompet:
echo isi
Koleksi Sequence
Sequence (dibaca sekuens) merupakan jenis koleksi menyimpan banyak nilai dengan ukuran yang bisa berubah, artinya isi bisa bertambah atau berkurang, hal yang berkebalikan dengan Array.
Pola deklarasi sequence:
var <nama> : seq[<tipe data>] = @[<nilai>,<nilai>]
# atau untuk deklarasi nilai berbentuk sekuens
@[<nilai>,<nilai>]
Contoh seperti ini:
var isiDompet : seq[string] = @["KTP","KTM"]
Karena sekuens bisa diubah, kita bisa menambahkan data yang akan masuk ke posisi akhir koleksi mengunakan metod add
milik tipe data sekuens. Metod add
membutuhkan argumen nilai, add(<ini argumen>)
yang sesuai dengan tipe data nilai di dalam sekuens.
var isiDompet : seq[string] = @["KTP","KTM"]
echo isiDompet
# @[KTP , KTM]
isiDompet.add("Rp. 10000")
echo isiDompet
# @[KTP,KTM,Rp. 10000]
Contoh kode diatas kita bisa kita lihat isiDompet
bertambah satu elemen baru yaitu Rp. 10000
. Jika kita gambarkan tabel index posisi dan nilai maka akan sepert ini:
Index | Nilai |
---|---|
0 | KTP |
1 | KTM |
2 | Rp. 10000 |
Misalkan Rp. 10000
ingin kita hapus dari variabel isiDompet
(anggap uangnya dipakai), kita bisa menggunakan metod delete
. Metod delete
menghapus isi sekuens berdasarkan index posisinya.
var isiDompet : seq[string] = @["KTP","KTM"]
echo isiDompet
# @[KTP , KTM]
isiDompet.add("Rp. 10000")
echo isiDompet
# @[KTP,KTM,Rp. 10000]
isiDompet.delete(2)
echo isiDompet
# @[KTP,KTM]
Sekuens memiliki ukuran yang berubah-ubah bagaimana cara kita untuk tahu berapa ukuran sebuah sekuens ? caranya menguankan metod len
, metod len
berguna untuk mengetahui berapa banyak isi nilai dari sekuens.
var nama = @["Anya","Bella"]
nama.add("Citra")
nama.add("Delia")
nama.add("Elsa")
echo nama.len()
# 5
Peringantan: Sequence bersifat mutable, penggunanya harus mengunakan kata kunci var
Sub-Program
Sub-program merupakan cara menuliskan sebuah baris kode untuk dipanggil berulang kali tanpa perlu menulis baris kode yang sama berulang kali, Sub-program membuat penyusunan program menjadi terstruktur dan memecah baris kode sesuai kegunaanya untuk dipakai kembali.
Sub-program dibagi menjadi dua yaitu Prosedur dan Fungsi.
Berikut contoh sederhana dari penerapan sub-program.
-
Tanpa Sub-program
let dompet = ["KTP","KTM","Poto pacar"] var bawaKTP = false for isi in dompet: if isi == "KTP": bawaKTP = true var bawaKTM = false for isi in dompet: if isi == "KTM" bawaKTM = true echo bawaKTP # true echo bawaKTM # true
-
Sub-program
let dompet = ["KTP","KTM","Poto pacar"] func bawa(barang : string,di: []string) : bool = for isi in di: if isi == barang: return true return false echo bawa("KTP",dompet) # true echo bawa("KTM",dompet) # true
Prosedur
Prosedur adalah kumpulan baris kode yang dibungkus dengan nama dan parameter, parameter prosedur adalah nilai yang diberikan untuk diproses oleh kumpulan baris kode didalamnya. Berikut pola kalimat prosedur :
proc <nama prosedur> (<nama parameter> : <tipe data prosedur>,...) : <tipe data kembalian> =
<barik kode prosedur>
Contoh seperti ini:
proc rumuSegitiga(alas: int, tinggi: int) : float =
return (alas * tinggi) / 2
echo rumuSegitiga(4,3)
# 6
Prosedur tidak mewajibkan kita untuk untuk membuat nilai kembalian dan bisa merubah nilai di luar prosedur, ini kebalikanya dengan satu sub-program lain : Fungsi.
var hasil = 0
proc rumuSegitiga(alas: int, tinggi: int)=
hasil = (alas * tinggi) / 2
rumuSegitiga(4,3)
echo hasil
# 6
Enumerasi
Enumerasi atau disingkat enum adalah tipe data buatan yang nama dan elemen nilainya kita tentukan sendiri Sebagai contoh tipe data boolean hanya menampung nilai true
dan false
, tetapi kita ingin sebuah tipe data serupa dengan boolean tetapi memiliki nilai baru yaitu unknown
, maka kita bisa membuat tipe data baru dengan enum.
Pola kalimat untuk mendeklarasikan enum:
type
<nama enum> = enum
<nilai enum> , <nilai enum>
Berikut contoh penerapanya pada tipe data boolean dengan unknown
kita beri nama ubool:
type
ubool = enum
false, true , unknown
Penggunaan nilai tipe ubool
dalam sebuah kasus:
type
ubool = enum
false, true, unknown
var tesUbool : ubool = false
echo tesUbool
# false
tesUbool = true
echo tesUbool
# true
tesUbool = unknown
echo tesUbool
# unknown
Record
Record adalah tipe data buatan yang berisi kumpulan tipe data lain yang disebut field, seperti koleksi tetapi untuk isi tipe data.
Record pada Nim lebih dikenal dengan nama Object
, penggunaan kata record hanya untuk pembaca familiar dengan istilah ini.
Pola deklarasi Record:
type
<nama record> = object
<nama field>:<tipe field>
<nama field>:<tipe field>
...
Contoh deklarasi Record dan penulisan nilai dengan Record.
type
Gender = enum
pria | wanita | nonbiner
Biografi = object
nama : string
umur : int
jenisKelamin Gender
var el = Biografi(nama: "Elisabeth Kartini", umur: 22, jenisKelamin: wanita)
echo el.Nama
# Elisabeth Kartini
echo el.umur
# 22
echo el.jenisKelamin
# wanita
Notasi .
(titik/dot) pada variabel el
dan nama field dari tipe data Biografi
digunakan untuk
mengakses nilai dari field tipe data tersebut.
Isi dari field bisa diubah dengan operator =
.
# ... nyambung dengan contoh kode yang diatas
echo el.Nama
# Elisabeth Kartini
el.Nama = "Maria Hoshinova"
echo el.Nama
# Maria Hoshinova
Peringatan: setiap variabel yang ingin di ubah sewaktu-waktu, deklarasikan dengan kata kunci
var
File Eksternal
Bagian ini akan membahas bagaimana program membaca isi file komputer (file yang berada di eksplorer contohnya) dengan program. Ini membantu kita untuk menyimpan nilai ke sebuah file dan mengambilnya lagi, karena semua nilai yang kita simpan di variabel akan hilang ketika program mati atau komputer menadak mati maka ini salah satu cara untuk mengatasi keterbatasan tersebut.
Membaca isi file
fungsi readLine
digunakan untuk membaca file dengan argumen berupa string berisi lokasi file di hardisk yang ingin dibaca.
Sebelum mengikuti contoh ini buat file test.txt
berisi ini dari file,
kemudian buat kode dibawah ini ditempat yang sama dengan test.txt
.
let iniFile = readLine("./test.txt")
echo iniFile
# ini dari file
./
berarti lokasi sekarang dari program yang dijalankan, jika mau membaca file yang berada jauh di folder atau hardisk lain bisa gunakan lokasi seperti pada eksplorer (C:\User\public\Documents\test.txt
untuk Windows atau /home/user/test.txt
untuk Linux dan Mac)
Menulis nilai ke file
fungsi writeLine
digunakan untuk menulis nilai ke file, fungsi writeLine
memerlukan argument berupa nilai string berisi lokasi file yang ingin ditulis dan nilai yang ingin ditulis.
let isiFile = "ini dari dalam file"
let path = "./test_tulis.txt"
writeLine(path, isiFile)
# kita cek isi filenya
echo readLine(path)
# ini dari dalam file
Pembuatan sebuah file bergantung kepada akses yang diberikan oleh sistem operasi kepada pengguna yang menjalankan program, hal ini bisa menyebabkan kegagalan penulisan dan pembacaan file karena hal ini atau filesystem dilokasi penulisan bersifat read-only
Object-Oriented Programming (OOP)
Nim mendukung multi paradigma seperti fungsional dan OOP. Object-oriented programming atau dalam bahasa indonesia pemrograman berorientasi objek adalah pola pemrograman yang mengabungkan record dan fungsi menjadi kedalam satu ikatan yang disebut objek.
Objek juga termasuk kedalam bentuk tipe data buatan, setiap deklarasi dan isinya kita yang menentukanya. Objek dibuat dengan adanya kelas (class), kelas berisi deklarasi fungsi (disebut metod) dan variabel dari field record (disebut attribut) yang akan digunakan untuk digunakan oleh objek.
-
Record biasa
type <nama record> = object <nama field>:<tipe data field> ....
-
Sebuah definisi record dengan objek
type <nama objek> = object <nama atribut>:<tipe data field> .... proc <nama metod> : (this: <nama objek>) = <baris kode metod>
Contohnya seperti ini :
type
Orang = object
nama: string
umur: int
proc echo(this: Orang) =
echo this.nama
echo this.umur
proc siapaYangLebihTua(this: Orang, lain: Orang) =
if this.umur > lain.umur:
echo this.nama & " lebih tua dari " & lain.nama
else:
echo lain.nama & " lebih tua dari " & this.nama
Contoh diatas sebuah kelas Orang memiliki atribut nama
danumur
lalu metod bernama echo
dan
siapaYangLebitTua
.
Bukanya ini hanya Record dan Procedure/Fungsi biasa ? Benar begitu lah cara melakukan OOP di Nim, berikut ini cara pakainya:
let anya = Orang(nama: "Anya", umur: 21)
let elsa = Orang(nama: "Elsa", umur: 18)
anya.echo()
elsa.echo()
anya.siapaYangLebihTua(elsa)
Jadi tidak ada istilah khusus yang digunakan untuk membuat kelas di Nim, cukup dengan sebuah Record dan Sub-program yang menjadikan tipe data record tersebut sebagai parametenrnya.
Fun-fact: Record dikenal dengan object di Nim dan bisa disebut sebagai object tanpa kelas.
Paket Manajer Nimble
Nim punya paket manajer bernama Nimble, paket manager membantu kita untuk membuat pustaka sendiri dan mengatur projek berisi kode yang kita tulis (disebut codebase). Bagian ini akan membahas bagaimana membuat proyek kode dengan Nimble.
Pustaka (Library) adalah kumpulan kode yang dibuat untuk digunakan oleh program atau proyek lain, sedangkan Proyek adalah kumpulan kode kita yang diatur ke dalam bentuk proyek untuk mudah menjalankan kumpulan kode sumber sekaligus.
Cara memakai Nimble
Nimble tersedia langsung saat kita menginstall Nim, untuk mengecek nimbel dapat mengetikan nimble
di terminal (kalau di Windows, Command Prompt). Nimble punya banyak perintah dan flags untuk
pemakaianya, maka tabel berikut berisi cheetsheet untuk mengenali penggunaan nimble :
Perintah | Contoh | Keterangan |
---|---|---|
init | nimble init | Membuat pustaka dan proyek dengan Nimble akan muncul dialog teks interaktif untuk prosesnya |
build | nimble build | Memgompile proyek Nimble |
run | nimble run | Menjalan entrypoint proyek yang dibuat dengan Nimble |
install | nimbel install <nama pustaka> , nimble install jester | Memasang pustaka global, jadi pustaka ini bisa dipakai oleh program tunggal, proyek dan pustaka |
uninstall | nimble uninstall <nama pustaka> ,nimble uninstall jester | Menghapus pustaka yang terinstall di lokal installasi Nim |
search | nimble search <nama pustaka> ,nimble search jester | Mencari pustaka didalam installasi Nim |
Peringatan : perintah
run
danbuild
hanya bisa dijalan di dalam folder proyek Nimble. Caranya masukan terminal ke folder proyek nimble dan jalankan perintah ini.
Membuat Proyek/Pustaka dengan Nimble
Buat folder nim
bebas dimana (boleh di drive D:
atau /home/user/
) untuk praktik kali ini kemudian buka terminal dan masuk ke folder nim
. Berikut langkah untuk membuat projek/pustaka sederhana dengan Nimble:
-
Buat folder dengan nama projek/pustaka yang kamu inginkan, lalu masuk kedalamnya (contoh
april
). Karena nimble akan mengunakan nama folder itu sebagai nama projek/pustaka yang akan kita buat. -
Jalankan perintah
nimble init
maka akan muncul berbagai pertanyaan- Akan terdapat opsi
library
(pustaka),binary
atauhybrid
. Pilihbinary
(untuk membuat proyek) dengan memencetTab
di keyboard dan tekanenter
untuk lanjut. - Nimble akan menanyakan versi (ini untuk memantau perkembangan proyek/pustaka kamu), sementara ini masukan
0.0.1
. - Setelah ini nimble menanyakan deskripsi proyek, langsung tekan
enter
saja kalau belum ada. - Kemudian keterangan lisensi proyek/pustaka, bagian ini
enter
saja (kecuali kamu sudah paham lisensi yang mau dipakai) - Terakhir, versi nim terendah untuk proyek/pustaka yang dibuat, untuk ini
enter
saja.
- Akan terdapat opsi
Setelah membuat proyek dengan Nimble, sekarang didalam folder kita ada ada berkas dengan nama <nama proyek>.nimble
yang berisi kurang lebih seperti ini:
# Package
version = "0.0.1"
author = "Y"
description = "A new awesome nimble package"
license = "MIT"
srcDir = "src"
bin = @["april"]
# Dependencies
requires "nim >= 1.6.2"
Berkas .nimble
diatas adalah deskripsi dari proyek atau pusatka yang kita buat. Fungsi requires
dalam .nimble
berguna untuk mendefinisikan kalau proyek/pustaka kita perlu pustaka ini (contoh
nim >= 1.6.2
, perlu pustaka nim
dengan versi sama atau lebih tinggi dari 1.6.2
).
Kode dari pustaka yang didefiniskan lewat .nimble
bisa digunakan didalam proyek/pustaka kita,
karena tidak semua kode yang kita tulis murni dari kita sendiri, akan ada saatnya membutuhan pustaka orang lain untuk memenuhi kebutuhan kita tanpa harus kita yang menulisnya sendiri.
Pada bagian Pemrograman Modular
akan membahas penggunaan kode dari file lain dan pustaka orang lain.
Mengenali struktur proyek
Contoh ini kita menggunakan proyek dari template binary
, template ini diperuntuhkan membuat proyek kecil (karena kita tidak perlu testing sejauh ini). Setelah membuat projek selain .nimble
kita juga punya folder bernama src
.
Seperti ini bentuknya bila kita lihat dari file eksplorer:
+-[src]
|-- april.nim
+- april.nimble
Nama proyek yang saya gunakan : april
, maka akan menghasilkan april.nimble
dan src/april.nim
yang menjadi entrypoint dari proyek. Entrypoint adalah bagian proyek yang akan dijalankan ketika nimble run
, ditentukan didalam april.nimble
pada bagian bin = @["april"]
(definisi entrypoint).
Berikut isi dari src/april.nim
:
# This is just an example to get you started. A typical binary package
# uses this file as the main entry point of the application.
when isMainModule:
echo("Hello, World!")
Kode didalam baris when isMainModule
akan menamplikan Hello World
, ini yang akan terjadi jika
kita menjalankan nimble run
. Sekarang jalankan nimble run
.
Pro-tip: Untuk membuat proyek yang membutuhkan testing, saat pembuatan proyek gunakan template
hybrid
ketimbangbinary
, karena sebagian kode kita akan berperan sebagai pelengkap entrypoint yakni menjadi pustaka yang perlu pengujian terpisah.
Pemrograman Modular
Pemrograman modular adalah cara bagaimana kita memecah kode kita yang sebelumnya dalam sebuah file besar menjadi kumpulan file-file kecil. Berikut contoh program transaksi saldo sederhana :
# april.nim
type
StatusTransaksi = enum
menungguPembayar | dibatalkan | berhasil
Saldo = object
id: string
saldo: int
Transaksi = object
bcId: string # pengirim
ccId: string # penerima
nominal: int # jumlah yang diterima
status: StatusTransaksi
deskripsi: string
var saldoNasabah : []Saldo = [
Saldo(id: "Anya", saldo: 10000),
Saldo(id: "Elisabet", saldo: 5000)
]
proc efekSaldo(transfer: Transaksi) =
for nasabah in saldoNasabah:
if nasabah.id == transfer.bcId:
nasabah.saldo -= transfer.nominal
elif nasabah.id == transfer.ccId:
nasabah.id += transfer.nominal
proc cekSaldo(id: string) =
for saldo in saldoNasabah:
if saldo.id == id:
echo "-- Akun ditemukan --"
echo "Nama : " & saldo.id
echo "Saldo : " & saldo.saldo
proc transaksiBaru(pbcid: string, pccId: string,pnominal:int ,pdeskripsi: string) : Transaksi =
return Transaksi(
bcid:pid,
ccId:pccId,
deskripsi:pdeskripsi,
nominal: pnominal,
status: StatusTransaksi.menungguPembayar)
# aksi untuk membatalkan transaksi
proc batalkanTransaksi(self:Transaksi) =
if self.status != berhasil:
self.status = StatusTransaksi.dibatalkan
echo "Transaksi " & self.deskripsi & " dibatalkan "
else:
echo "Transaksi yang berhasil tidak bisa dibatalkan"
# aksi untuk membayar transaksi
proc bayar(self: Transaksi) =
if self.status != dibatalkan:
efekSaldo(self)
self.status = StatusTransksi
echo "Berhasil membayar untuk " & self.deskripsi
else:
echo "Transaksi yang dibatalkan tidak bisa berhasil"
when isMainModule:
cekSaldo("Anya")
cekSaldo("Elisabet")
var transferTeman = transaksiBaru("Anya","Elisabet",5000,"Subrek OnlyFans Elisabet")
transferTeman.berhasil()
cekSaldo("Anya")
cekSaldo("Elisabet")
Sekarang kita akan membagi kode diatas sesuai dengan kegunaanya masing-masing
(transaksi.nim
,saldo.nim
dan april.nim
):
# transaksi.nim
import ./saldo
type
StatusTransaksi = enum
menungguPembayar | dibatalkan | berhasil
Transaksi = object
bcId: string # pengirim
ccId: string # penerima
nominal: int # jumlah yang diterima
status: StatusTransaksi
deskripsi: string
proc transaksiBaru(pbcid: string, pccId: string,pnominal:int ,pdeskripsi: string) : Transaksi =
return Transaksi(
bcid:pid,
ccId:pccId,
deskripsi:pdeskripsi,
nominal: pnominal,
status: StatusTransaksi.menungguPembayar)
# aksi untuk membatalkan transaksi
proc batalkanTransaksi(self:Transaksi) =
if self.status != berhasil:
self.status = StatusTransaksi.dibatalkan
echo "Transaksi " & self.deskripsi & " dibatalkan "
else:
echo "Transaksi yang berhasil tidak bisa dibatalkan"
# aksi untuk membayar transaksi
proc bayar(self: Transaksi) =
if self.status != dibatalkan:
efekSaldo(self)
self.status = StatusTransksi
echo "Berhasil membayar untuk " & self.deskripsi
else:
echo "Transaksi yang dibatalkan tidak bisa berhasil"
# saldo.nim
type
Saldo = object
id: string
saldo: int
var saldoNasabah : []Saldo = [
Saldo(id: "Anya", saldo: 10000),
Saldo(id: "Elisabet", saldo: 5000)
]
proc efekSaldo(transfer: Transaksi) =
for nasabah in saldoNasabah:
if nasabah.id == transfer.bcId:
nasabah.saldo -= transfer.nominal
elif nasabah.id == transfer.ccId:
nasabah.id += transfer.nominal
proc cekSaldo(id: string) =
for saldo in saldoNasabah:
if saldo.id == id:
echo "-- Akun ditemukan --"
echo "Nama : " & saldo.id
echo "Saldo : " & saldo.saldo
#april.nim
import ./transaksi
import ./saldo
when isMainModule:
cekSaldo("Anya")
cekSaldo("Elisabet")
var transferTeman = transaksiBaru("Anya","Elisabet",5000,"Subrek OnlyFans Elisabet")
transferTeman.berhasil()
cekSaldo("Anya")
cekSaldo("Elisabet")
Bentuk folder kita sekarang:
+-[src]
|-- april.nim
|-- saldo.nim
|-- transaksi.nim
+- april.nimble
Pada file transaksi.nim
dan april.nim
kita mempunyai kata kunci import
, import
(atau
sebutanya mengimpor) berguna untuk memanggil sebuah file lokal atau pustaka untuk isinya diguankan di program kita.
File transaksi.nim
kita mengimpor file ./saldo
(saldo.nim
untuk import .nim
tidak perlu ditulis, ./
berarti lokasi script yang mengimpor) karena didalam file transaksi
kita menggunakan fungsi efekSaldo
dari saldo.nim
begitu juga di dalam file april.nim
mengimpor file transaksi.nim
dan saldo.nim
.
Bagian ini sudah keluar dari pemahasan Nim dasar dan masuk pembahasan fitur khusus yang dimiliki Nim, jadi bagian buku setelah pembahasan ini sudah memasuki bagian khusus Nim, bila pernasaran bila melangkah ke bab lain.
Web Programming dengan Nim
Bab ini akan membahas tentang pembuatan Web server menggunakan Nim, bagian ini akan menjelaskan bagaimana web , arsitektur client-server pada jaringan komputer, installasi framwork Jester ,membuat HTML dengan Nim dan penghubung ke database.
Referensi
- Dokumentasi Jester
- Yunmar, Rajif A. 2019. Pondasi Pemrograman Web. Bandar Lampung. Aura
Web
Web merupakan kumpulan halaman berisi teks, gambar dan video tersedia melalui protokol jaringan komputer. Halaman yang berisi teks, gambar dan video di bangun menggunakan Hyper Text Markup Language (HTML).
HTML merupakan bahasa markah yang bertugas untuk menyajikan konten hipertext (teks, gambar dan video dalam satu halaman) kumpulan markah hiperteks disebut sebagai dokumen HTML. HTML dibuka menggunakan browser untuk membentuk tampilan web, seperti halnya buku yang sedang kalian baca ini.
Jika kamu membaca buku ini melalui browser, coba klik kanan dan pilih View Page Source maka kamu akan melihat dokumen HTML dari halaman ini.
Protokol jaringan untuk web disebut dengan Hyper Text Transfer Protocol (HTTP), protokol ini berkerja dengan arsitektur client-server. Arsitektur ini membagi sebuah hubungan komputer menjadi 2 peran:
- Server, komputer yang menyedia halaman HTML untuk diakses oleh Client.
- Client, komputer meminta halaman HTML ke server untuk diterjemahkan pada Browser (seperti buku ini sekarang).
HTTP memiliki sebuah paket yang digunakan untuk mengirim (HTTP request) dan membalas permintaan (HTTP response) yang memiliki Header dan Body.
Header berisi rincian dari HTTP seperti kode status balasan (e.g 200,404,500), HTTP Request Method (e.g GET,POST, HTTP Request Method list) dan rincian header lainya (selengkapnya HTTP Header Standard) dan Body merupakan data yang client terima dari server atau client kirim ke server.
HTTP Request merupakan paket untuk meminta respon ke server dan HTTP Response membalas permintaan client oleh server, namun perbedaanya header paket HTTP Request memiliki HTTP Request Method dan HTTP Response memiliki kode status balasan.
Untuk melihat lalu lintas HTTP saat kalian membuka halaman ini, klik kanan > Inspect/Inspect Elemen > pilih tab Network kemudian refresh halaman (tekan F5) lalu pilih HTTP Request yang ingin inspeksi.
Simple Web : Hello World
Bagian ini akan mengenalkan proses penggunaan framework jester dari installasi hingga membalas request HTTP.
Installasi Jester
Jester adalah pustaka web framework yang ditulis dengan Nim, maka kita perlu menginstall pustaka jester:
$ nimble install jester
Warning: tanda
$
hanya penegas bahwa ini perintah terminal dan jangan ikut ditulis.
Menampilkan Hello World
Jester telah terinstall, sekarang kita akan membuat sebuah URL /
yang akan mengembalikan text Hello World
. Buat file bernama web.nim
dengan isi kode dibawah ini.
import jester
routes:
get "/":
resp "Hello World"
routes
merupakan macro bawaan dari jester yang mendefinsikan request URL yang dibisa respon oleh web kita, kemudian get "/"
adalah definisi URL yang akan di respon yaitu perintah HTTP GET ke URL /
, terakhir resp
adalah prosedur untuk mengirimkan data respon ke client yang mengirim HTTP request.
Kemudian jalankan dengan perintah berikut:
$ nim c -r web.nim
Setelah muncul pesan diterminal yang menunjukan alamat (e.g: localhost:3000
), buka alamat tersebut di browser.
Infomasi lebih lanjut bisa mengunjungi Dokumentasi Jester.