Wednesday 31 August 2016

The Amazing World of Programming: Introduction

Oleh: M. Sayyidus Shaleh

Yep. Di tulisan sebelumnya mungkin Pembaca sekalian pernah menemukan statemen yang menyatakan kalau, untuk menjadi seorang Hacker, salah satu syaratnya adalah memahami setidaknya tiga bahasa pemograman. Salah satu bahasa program yang paling mendunia sekarang adalah bahasa C++. Pernah dengar? Ya, C++ adalah pengembangan dari bahasa C, dengan perbedaan yang jelas kalau C++ itu Pemograman Berorientasi Objek. Bingung dengan istilah barusan? Tulisan Penulis lainnya pernha menjelsakan istilah ini. Sebelum melanjutkan membaca, harap digaris bawahi kalau tulisan kali ini dikhususkan untuk Pembaca yang masih awam di dunia programming.


Bahasa C++ adalah bahasa pemograman tingkat menengah. Maksudnya? Begini, setiap bahasa pemograman di dunia (yang tentu sangat banyak) digolongkan berdasarkan kemudahan penggunaannya oleh manusia dan pemahaman langsung dari komputer. Ada tiga tingkatan. Rendah, Menengah, dan Tinggi. Mulai dari tingkatan Tinggi, adalah bahasa yang paling mudah digunakan Programmer (apalagi untuk pemula). Dan bahasa tingkat Rendah, adalah yang paling mudah dipahami oleh komputer untuk dieksekusi. Simpelnya, cara manusia untuk berinterkasi dengan komputer sebagai seorang Programmer adalah bahasa tingkat Tinggi. Sedangkan cara paling susah adalah dengan bahasa tingkat Rendah.

Masih bingung? Nah, kalau begitu mari kita intip sedikit tentang sejarah awal komputer, yang sekaligus mengawali programming.

Di abad 20, saat para komputer generasi pertama dioperasikan, keadaan mereka sangat jauh berbeda dengan yang ada sekarang. MEmori seukuran kulkas, mesin cepat panas, boros ruang, dan masalah lainnya. Komputer ini hanya bisa menerima instruksi dari manusia dengan cara paling primitif, dengan bahasa yang disebut Machine Language alias bahasa Mesin, yang hanya memuat angka nol dan satu sebagai parameter logika. Ya dan Tidak. Masuk dan Keluar. Tentu hal yang bisa dilakukan amat terbatas. Karena keterbatasannya, masih banyak yang mengatakan kalau bahasa Mesin belum masuk kategori bahasa pemograman.

Teknologi pun berkembang, begitupun komputer yang mulai berevolusi menjadi semakin efisien. Ditemukanlah sebuah bahasa baru, yaitu Assembly. Bahasa ini sudah memulai penggunaan kata-kata kunci agar Programmer lebih mudah berinteraksi dengan komputer, tapi tetap saja masih sangat rumit dan kompleks. Inilah yang disebut dengan bahasa tingkat Rendah. Assembly menggunakan kata kunci yang disebut mnemonic, yang hanya berkisar 3-4 huruf seperti MOV, EAX, JMP, dan lainnya.

Di tahun 1969, laboratorium Bell AT&T menggunakan bahasa Assembly untuk mengembangkan OS UNIX, nenek moyang dari LINUX yang dibuat dengan bahasa C.

Tapi, pertanyaannya adalah, apa yang terjadi dengan bahasa MEsin? Apakah menghilang begitu saja ketika muncul Assembly? Dan apakah ketika bahasa C muncul, Assembly lenyap, dan seterusnya? Ilustrasi berikut mungkin bisa membuat Pembaca mengerti.

reader@hacking:~/booksrc $ gcc -g firstprog.c reader@hacking:~/booksrc $ ls -l a.out
-rwxr-xr-x 1 matrix users 11977 Jul 4 17:29 a.out reader@hacking:~/booksrc $ gdb -q ./a.out
Using host libthread_db library "/lib/libthread_db.so.1". (gdb) list
1              #include <stdio.h> 2
3             int main()
4             {
5                             int i;
6                             for(i=0; i < 10; i++)
7                            {
8                                           printf("Hello,  world!\n"); 9                }
10            }
(gdb) disassemble main
Dump of assembler code for function main():

0x08048384
<main+0>:
push
ebp
0x08048385
<main+1>:
mov
ebp,esp
0x08048387
<main+3>:
sub
esp,0x8
0x0804838a
<main+6>:
and
esp,0xfffffff0
0x0804838d
<main+9>:
mov
eax,0x0
0x08048392
<main+14>:
sub
esp,eax
0x08048394
<main+16>:
mov
DWORD PTR [ebp-4],0x0
0x0804839b
<main+23>:
cmp
DWORD PTR [ebp-4],0x9
0x0804839f
<main+27>:
jle
0x80483a3 <main+31>
0x080483a1
<main+29>:
jmp
0x80483b6 <main+50>



0x080483a3 <main+31>:
mov
DWORD PTR [esp],0x80484d4
0x080483aa <main+38>:
call
0x80482a8 <_init+56>
0x080483af <main+43>:
lea
eax,[ebp-4]
0x080483b2 <main+46>:
inc
DWORD PTR [eax]
0x080483b4 <main+48>:
jmp
0x804839b <main+23>
0x080483b6 <main+50>:
leave

0x080483b7 <main+51>:
ret

End of assembler dump.


(gdb) break main


Breakpoint 1 at 0x8048394: file firstprog.c, line 6. (gdb) run
Starting program: /hacking/a.out

Breakpoint 1, main() at firstprog.c:6 6          for(i=0; i < 10; i++) (gdb) info register eip
eip                       0x8048394       0x8048394
(gdb)
(Ilustrasi dari buku Hacking: The Art of Exploitaion)



Wow, jangan panik dulu! Ilustrasi tadi terjadi di terminal OS Linux. Di baris yang diawali angka 1 s.d 10, berisi baris kode bahasa C. Lalu, yang terjadi di bawahnya adalah penguraian baris bahasa C tersebut ke bentuk Assembly.

Eh!? Jadi apa yang sebenarnya telah terjadi? Begini, bahasa Assembly dibuat bukan untuk semata-mata menggantikan Machine Language, tapi membuatnya lebih sederhana untuk dipakai Programmer. Jadi, komputer, sejak generasi awal sampai dengan sekarang, masih menggunakan bahsasa ibu yang sama, Machine Language. Tapi, manusia terus mengembangkannya sehingga menjadi jauh lebih sederhana, tapi di dalamnya, tersimpan sesuatu yang sangat kompleks. Hal ini sengaja Penulis jabarkan, untuk menekankan konsep yang selalu disalahpahami oleh hampir seluruh Programmer di dunia. Banyak yang menganggap kalau kode yang telah mereka buat adalah seluruhnya program yang akan berjalan. Padahal sebenarnya tidak seperti itu. Pemahaman inilah yang menjadi kelemahan sistem pada umumnya. Inilah yang membedakan seorang Programmer konvensional dan seorang Hacker.

Kenapa bisa begitu? Tenang saja. Di kelanjutan seri ini, Penulis akan menjelaskan sebabnya lebih lanjut.


#Welcome to the Amazing World of Programming!



Tulisan yang dimuat adalah sepenuhnya milik penulis  risalah-online, bukan merupakan pernyataan dari risalah-online

No comments:

Post a Comment