Day 3 — Introduction to Programming Language: CPU, Machine Code, and Compiler
Catatan materiIntroduction to Programming Language. Materi menjelaskan akar bahasa pemrograman dari CPU, pola listrik, binary, machine code, register, Intel developer manual, assembly language, assembler, machine-dependent code, low-level vs high-level programming language, compiler sebagai translator, JavaScript sebagai high-level language untuk web, serta demo menjalankan source code dengan Node.js.
Bug notes
Mencoba memahami programming tanpa konsep machine code
High-level code terasa terputus dari hardware sehingga pemahaman menjadi dangkal.
Solusi: Review bagaimana low/high voltage dipetakan ke binary, bagaimana machine code merepresentasikan instruksi CPU, dan bagaimana compiler menjembatani keduanya.
Environment tidak seragam saat mengerjakan assignment
Environment berbeda dapat menghasilkan error berbeda dan membuat pengecekan assignment tidak konsisten.
Solusi: Ikuti standar bootcamp: Mac boleh, selain itu gunakan Ubuntu/Linux dual boot sesuai instruksi.
Mengira programming language itu magic, bukan teks plus translator
Ini membuat bingung kenapa Node, compiler, runtime, atau instalasi dibutuhkan.
Solusi: Pahami bahwa source code adalah teks dan butuh compiler/runtime
Komentar pembaca
Komentar akan muncul setelah disetujui admin.
Belum ada komentar yang disetujui.
Tulis komentar
Hari ini aku belajar Introduction to Programming Language. Materi ini tidak langsung masuk ke syntax bahasa pemrograman, tetapi menjelaskan dulu kenapa programming language dibutuhkan, apa hubungan bahasa pemrograman dengan CPU, dan kenapa manusia tidak menulis program langsung dalam machine code.
Materi dimulai dari CPU atau Central Processing Unit. CPU adalah pusat kendali komputer. Ia mengontrol banyak komponen seperti keyboard, mouse, graphic card, fan, RAM, dan proses perhitungan. CPU sering disebut otak komputer karena banyak keputusan dan instruksi diproses di sana. Tetapi CPU tetap hanya benda fisik yang terdiri dari material seperti silikon, tembaga, dan sedikit emas. Pertanyaan pentingnya adalah: bagaimana benda fisik seperti itu bisa melakukan penjumlahan, pengurangan, perkalian, dan instruksi lain?
Jawabannya adalah pola listrik. Di bawah CPU ada pin-pin kecil yang dapat menerima sinyal listrik. Sinyal listrik dapat berupa low voltage dan high voltage. Dalam representasi binary, low voltage bisa dianggap 0 dan high voltage bisa dianggap 1. Kombinasi 0 dan 1 ini menjadi pola instruksi yang bisa dimengerti oleh CPU. Pola instruksi seperti ini disebut machine code atau bahasa mesin.
Machine code adalah bahasa yang benar-benar dekat dengan hardware. CPU tidak memahami bahasa manusia seperti “tambahkan dua angka”. CPU memahami pola listrik tertentu yang dialirkan ke pin-pin tertentu. Pola listrik tersebut sudah ditentukan oleh produsen CPU. Misalnya Intel punya developer manual yang menjelaskan opcode dan pola instruksi tertentu untuk operasi seperti add, subtract, dan operasi lainnya. Manual seperti ini biasanya lebih berguna untuk pembuat operating system atau pembuat programming language, bukan untuk web developer sehari-hari, tetapi konsepnya penting agar aku paham akar dari programming language.
Materi lalu memperkenalkan register. Register adalah hardware kecil di dalam CPU yang dapat menyimpan data sementara. Register mirip seperti RAM karena sama-sama menyimpan data, tetapi register jauh lebih cepat karena posisinya berada di dalam CPU. Kalau data ada di RAM, CPU harus mengambilnya lewat jalur di motherboard. Kalau data ada di register, aksesnya lebih dekat dan lebih cepat.
Contoh yang dibahas adalah melakukan operasi 2 + 3. Angka 2 dapat dimasukkan ke register AX, angka 3 ke register DX, lalu CPU diberi instruksi untuk menambahkan AX dan DX. Pada Intel, register bisa bernama AX, CX, DX, BX, SP, BP, dan lainnya. Untuk membuat instruksi add, programmer perlu tahu opcode, modifier mode, register yang dipakai, dan apakah operand berasal dari register atau memory. Semua itu akhirnya menjadi pola bit yang dialirkan ke CPU sebagai machine code.
Dari contoh itu terlihat bahwa menulis program langsung memakai machine code sangat melelahkan. Manusia tidak nyaman menulis instruksi dalam bentuk 0 dan 1. Karena itu muncul ide untuk membuat bahasa yang sedikit lebih manusiawi, lalu membuat translator yang menerjemahkan bahasa itu menjadi machine code. Bahasa yang lebih manusiawi dari machine code ini adalah assembly language, sedangkan translator-nya disebut assembler.
Assembly lebih mudah daripada machine code karena programmer bisa menulis instruksi seperti add ax dx, bukan menulis pola bit secara manual. Tetapi assembly masih punya masalah besar: machine dependent. Artinya, assembly sangat bergantung pada jenis hardware. Code yang memakai register AX dan DX bisa berjalan di CPU Intel x86 karena register itu ada di sana, tetapi tidak otomatis berjalan di ARM karena ARM memakai register seperti R0, R1, R2, dan R3. Jadi assembly masih dekat dengan mesin dan harus menyesuaikan arsitektur CPU.
Karena assembly masih terlalu dekat dengan hardware, manusia membuat bahasa yang lebih tinggi lagi: high-level programming language. Bahasa seperti C, Java, Swift, Python, dan JavaScript lebih manusiawi karena programmer tidak perlu memikirkan register hardware secara langsung. Translator bernama compiler dapat menerjemahkan high-level language menjadi assembly atau machine code yang sesuai dengan platform. Bahasa yang dekat dengan hardware disebut low-level programming language, sedangkan bahasa yang lebih dekat dengan manusia disebut high-level programming language.
Di bootcamp ini, high-level programming language yang dipelajari adalah JavaScript. Alasannya karena targetnya adalah web development. JavaScript adalah bahasa utama untuk membuat website interaktif dan nantinya bisa dipakai bersama HTML, CSS, browser, Node.js, dan framework modern.
Materi juga menekankan bahwa programming language sebenarnya hanyalah text. Jika aku menulis console.log('Hello World') di text editor, itu tetap hanya teks biasa. Yang spesial bukan teksnya, melainkan translator/compiler/runtime yang bisa membaca teks itu dan mengubahnya menjadi instruksi yang dapat dijalankan komputer. Selama compiler bisa membaca teks tersebut, source code bisa diterjemahkan.
Demo dilakukan dengan membuat file sederhana berisi console.log('Hello World'), lalu menjalankannya dengan Node. Node bertindak sebagai program yang membaca file JavaScript, menerjemahkan dan menjalankan instruksi, lalu output Hello World muncul. Dengan command seperti node nama-file, file teks JavaScript diproses menjadi instruksi yang akhirnya dijalankan oleh CPU. Proses detail dari source code ke assembly lalu machine code berlangsung sangat cepat dan biasanya tidak terlihat oleh developer.
Materi juga menghubungkan pembelajaran ini dengan assignment berikutnya. Peserta diminta menyiapkan Linux atau Mac, memakai text editor biasa, dan menjalankan file JavaScript dengan Node. Tujuannya agar peserta benar-benar paham bahwa source code adalah text dan yang membuatnya hidup adalah translator/runtime yang membacanya.
Q&A membahas beberapa hal praktis. Mac dianggap sangat cocok untuk programming sehingga pengguna Mac tidak perlu install Ubuntu. Pengguna Windows diarahkan memakai Ubuntu dual boot, bukan WSL, agar environment semua peserta lebih seragam. Standardisasi penting karena jika environment berbeda-beda, error assignment bisa berbeda juga. Dibahas juga bahwa Linux membutuhkan ruang disk sekitar puluhan gigabyte dan flash disk untuk proses instalasi.
Kesimpulannya, programming language lahir karena manusia butuh cara yang lebih mudah untuk memberi instruksi ke komputer. CPU hanya memahami pola listrik/machine code, lalu assembly dibuat sebagai bahasa yang sedikit lebih manusiawi, tetapi masih machine dependent. High-level programming language dibuat agar developer bisa menulis code yang lebih mudah dibaca manusia, sementara compiler/runtime bekerja menerjemahkannya ke level yang bisa dijalankan komputer. JavaScript adalah salah satu high-level language yang akan dipakai untuk web development, dan Node.js menjadi alat untuk menjalankan JavaScript di luar browser.
Assembler adalah translator antara assembly language dan machine code.
• Menulis raw machine code sangat melelahkan Manusia membutuhkan bahasa yang lebih mudah dibaca daripada urutan panjang 0 dan 1.
• Programming language adalah teks Kode itu sendiri adalah teks; bagian spesialnya adalah compiler/runtime yang dapat membaca dan mengeksekusinya.
• Node.js menjalankan source code JavaScript Node dapat membaca file JavaScript dan menjalankannya sehingga output muncul di terminal.
• Vendor CPU menentukan pola instruksi Produsen seperti Intel mendokumentasikan opcode dan perilaku instruksi dalam developer manual.
• Register menyimpan data di dalam CPU Register lebih cepat daripada RAM karena letaknya berada di dalam CPU itu sendiri.
• Penjumlahan level mesin memakai register dan opcode Untuk menjumlahkan value, data bisa diletakkan di register seperti AX dan DX, lalu instruksi add dikirim ke CPU.
• Compiler menerjemahkan high-level language Compiler/runtime menerjemahkan source code high-level menjadi instruksi low-level yang bisa dijalankan komputer.
• Binary merepresentasikan keadaan listrik Low voltage dapat direpresentasikan sebagai 0 dan high voltage sebagai 1, sehingga binary penting dalam computing.
• Assembly bersifat machine dependent Kode yang memakai register Intel seperti AX/DX belum tentu berjalan di ARM karena nama register berbeda.
• Machine code adalah bahasa instruksi level CPU Machine code adalah pola bit/sinyal listrik yang dipahami CPU, bukan sesuatu yang alami dipahami manusia.
seperti
Node.js
untuk diterjemahkan/dieksekusi.
Keliru mengira assembly portable di semua arsitektur CPU
Kode yang memakai register seperti AX/DX tidak langsung berjalan di ARM yang memakai register seperti R0/R1.
Solusi: Gunakan high-level language saat butuh portability dan biarkan compiler menangani translation spesifik arsitektur.