Skip to content

Latest commit

 

History

History
371 lines (305 loc) · 30 KB

README_id.md

File metadata and controls

371 lines (305 loc) · 30 KB

CATATAN1: Mohon untuk tidak menyalin konten pada halaman ini untuk blog anda. Anda bisa membagikan halaman ini tapi mohon untuk menyertakan link asli. Itu adalah cara kita untuk mengapresiasi penulis dari proyek-proyek dokumentasi dan open source yang baik.

CATATAN2: Mohon untuk dicatat bahwa pemrograman tingkat rendah sudah ketinggalan zaman dan saat ini tidak banyak perusahaan yang mempekerjakan pengembang bahasa tingkat rendah. Dari hari ke hari semakin sulit untuk saya mencari pekerjaan di bidang ini. Jika anda masih belum memulai karir profesional, saya ingin menyarankan Anda mempertimbangkan bidang lain dengan hati-hati.

CATATAN3: Jika anda ingin langsung mulai, silahkan ke bagian "How to start?".

Low-Level Programming University

Apa itu?

Saya terinspirasi oleh google-interview-university. Saya ingin membagikan pengalaman dan menunjukkan roadmap untuk menjadi programmer low-level karena saya menemukan bahwa keterampilan ini tidak lagi umum seperti dulu. Selain itu, banyak pelajar dan pemula bertanya kepada saya bagaimana mereka bisa menjadi programmer low-level dan Linux kernel engineers.

Halaman ini tidak bisa menyertakan setiap tautan/buku/course. Contohnya, halaman ini memperkenalkan Arduino walaupun tidak ada informasi mendetil tentang Arduino dan sistem tertanam. Anda harus mengeksplorasinya sendiri.Anda sudah memiliki kata kunci "Arduino" sehingga anda bisa langsung memulai untuk mengeksplorasinya. Jadi untuk langkah selanjutnya adalah mungkin bisa mulai dengan "googling" tentang Arduino, membeli satu set alatnya, dan membuat sesuatu untuk diri anda sendiri, bukan mengumpulkan tautan-tautan dan buku-buku gratis. Mohon untuk diingat bahwa halaman ini hanyalah sebuah roadmap untuk pemula.

Pemrograman Low-level adalah bagian dari ilmu komputer. Tentu saja akan lebih baik untuk memperoleh edukasi di ilmu komputer terlebih dahulu.

Apa yang dimaksud dengan Low-Level?

Saya mengelompokkan pemrograman low-level sebagai pemrogaman yang sangat dekat ke mesin, menggunakan sebuah bahasa tingkat yang lebih rendah seperti C atau Assembly. Ini berlawanan dengan bahasa pemrograman yang lebih tinggi, seperti aplikasi pengguna pada umumnya, menggunakan bahasa tingkat tinggi (contoh: Python, Java).

Ya, pemrograman sistem adalah sebuah konsep yang sangat dekat dengan pemrograman low-level. Halaman ini berisi tentang perancangan perangkat keras dan pengembangan firmware yang tidak termasuk dalam pemrograman sistem.

Terakhir, halaman ini mencakup topik mulai dari komponen perangkat keras hingga kernel Linux. Itu adalah cakupan lapisan yang sangat banyak. Satu halaman dokumen tidak akan pernah cukup untuk mencakup detil-detil dari semua lapisan, jadi tujuan dari dokumen ini adalah sebagai titik mula untuk pemrograman low-level.

Teori

Ada dua latar belakang teori pada pemrograman low-level:

  • Arsitektur Komputer
  • Sistem Operasi

Menurut saya cara terbaik untuk belajar teori adalah dengan mengikuti course. Membaca buku bukan hal yang jelek juga, tetapi terlalu memakan banyak waktu dan tenaga. Anda bisa menemukan banyak kelas-kelas bagus pada kuliah online, contohnya, Coursera.org dan edx.org. Teori hanyalah teori. Saya tidak berpikir anda perlu dapat nilai A+ di kelas, cukup mengerti secara garis besar saja. Anda akan semakin baik seiring dengan pengalaman.

Izinkan saya untuk memperkenalkan buku-buku yang pernah saya baca. Secara umum digunakan sebagai buku teks di universitas-unversitas. Jika tidak ada buku-buku tersebut di universitas anda, dianjurkan untuk meluangkan waktu anda untuk membacanya.

  • Arsitektur Komputer
    • Computer Architecture, Fifth Edition: A Quantitative Approach
    • Computer Systems: A Programmer's Perspective
    • Computer Organization and Design, Fourth Edition: The Hardware/Software Interface
  • Sistem Operasi
    • The Magic Garden Explained: The Internals of UNIX System V Release 4 an Open Systems Design
    • The Design of the UNIX Operating System
    • Operating Systems: Internals and Design Principles by William Stallings
  • Course yang Direkomendasikan
  • Keterampilan Pemrograman Umum
  • Perancangan Perangkat Keras
    • Membangun 8086 Microprocessor Kit Anda Sendiri
      • Jika anda tidak membangun papan HW (Hardware) anda sendiri, anda tidak memahami apa itu perangkat yang dipetakan memori fisik.
      • AP modern memuat banyak sekali IP. Jadi anda tidak memiliki kesempatan untuk memahami bagaimana inti CPU dan perangkat periferal dihubungkan.
      • Saat anda membangun 8086 kit anda sendiri, anda memiliki kesempatan untuk menempatkan tiap perangkat-perangkat periferal pada memori fisik. Dan anda sekarang bisa atur bagaimana komponen HW utama (BUS, IRQ, Clock, Power, dan lain-lain) bekerja dengan mata Anda sendiri.
      • Saya membangun 8086 kit di universitas. Itu adalah salah satu course yang paling berharga yang pernah saya ambil. Cobalah untuk membangun HW kit anda sendiri. Akan lebih baik jika perangkat kerasnya lebih tua dan lebih simple karena anda harus melakukan hal lebih extra untuk anda sendiri.
      • Coba ketik di Google "8086 kit". Anda seharusnya akan bisa menemuan beberapa situs web dimana anda bisa membeli sebuah skema HW, parts, dah panduannya.

Ada banyak daftar buku-buku yang bagus. Saya tidak menyebutkan anda harus baca banyak buku. Cukup baca satu buku dengan teliti. Kapanpun anda belajar sebuah teori, implementasikan kode simulasinya. Mengimplementasikan satu hal lebih baik daripada mengetahui seratus teori

Bahasa

Assembly

Pilih satu antara x86 atau ARM. Tidak perlu untuk tau keduanya. Tidak mengetahui bahasa assembly juga tidak masalah. Hal yang mendasar adalah memahami bagian internal dari sebuah CPU dan komputer. Jadi anda tidak perlu mempraktikkan assembly dari CPU terbaru. Pilih 8086 atau Corex-M.

Bahasa C

Tidak ada jalan pintas. Baca saja seluruh isi buku dan selesaikan semua latihan.

Jika anda ingin menjadi ahli pemrograman C, kunjungi https://leetcode.com/. Semoga beruntung!

Bahasa Rust

Saya meyakini bahwa bahasa pemrograman selanjutnya untuk pemrograman sistem adalah Rust. Saya akan membuat daftar apa yang saya lakukan untuk belajar Rust.

Linus Torvalds mengatakan Kecuali terjadi sesuatu yang aneh, [Rust] akan membuatnya menjadi 6.1."

  • The Rust Programming Language
    • Pengenalan yang bagus, namun kurang akan contoh dan latihan-latihan.
  • Rust by Example
    • Ketika membaca "The Rust Programming Language", anda bisa menemukan contoh dan latihan-latihan di sini.
    • Namun tidak banyak latihan yang bisa Anda lakukan sendiri. Hanya beberapa contoh termasuk latihan "lakukan ini" dan latihan tersebut sangat mudah.
  • Programming Rust, 2nd
    • Pengenalan yang lebih dalam, namun masih kurang akan contoh dan latihan-latihan.
  • Exercism
    • Latihan-latihan yang bagus untuk melatih fitur individu dari RUST.
    • Saya tidak yakin para mentor bekerja secara aktif namun itu seharusnya cukup untuk membandingkan solusi anda dengan solusi lain.
      • Setelah mengirimkan solusi anda, anda bisa melihat solusi orang lain dengan tab "Community solutions" (sejak Exercism V3).
      • Banyak latihan-latihan dengan level mudah adalah untuk fitur fungsional seperti map/filter/any dan lain-lain.
  • Easy rust
  • Let's get rusty
    • Banyak Youtuber mengunggah kursus Rust namun saya paling menikmati kursus ini.
    • Dia telah mengunggah berita terbaru untuk Rust. Layak untuk disubscribe.
  • Rust for Linux
    • Lihat sumber-sumber contoh dan cek bagaimana Rust akan masuk ke kernel Linux

Pengaplikasian

Hardware && Firmware

Jika anda ingin menjadi embedded system engineer, akan lebih baik untuk mulai dari sebuah hardware kit yang sederhana, daripada memulai dengan chipset ARM terbaru.

  • Arduino Start Kit

    • Ada banyak seri dari Arduino namun "Arduino Start Kit" yang punya prosesor(Atmega328P) dan buku panduan yang paling sederhana.
    • Atmega328P memiliki 8-bit inti yang mana membuatnya jadi permulaan yang bagus untuk perancangan sirkuit digital dan pengembangan firmware.
    • Anda tidak perlu tahu cara menggambar skema dan tata letak serta merakit chip.
    • Namun anda perlu tahu cara membaca skema dan memahami bagaimana chip saling terhubung.
    • Pengembang firmware seharusnya tahu cara membaca skema dan mencari tahu cara mengirim data ke perangkat target.
    • Ikuti buku panduan!
  • 8086 manual

    • Jika anda pemula pada arsitektur x86, 8086 juga panduan yang sangat bagus untuk arsitektur prosesor dan assembly 80x86
  • 80386 manual

    Pada titik ini, anda sebaiknya mulai dengan prosesor ARM dan x86 terbaru.

  • https://www.raspberrypi.org/

  • https://beagleboard.org/

  • https://www.arduino.cc/en/ArduinoCertified/IntelEdison

Sebagai contoh, board Raspberry Pi memiliki prosesor Cortex-A53 yang mendukung set instruksi 64-bit. Ini mengizinkan anda untuk merasakan arsitektur prosesor modern dengan rPi. Ya, anda bisa membelinya... namun... apa yang akan anda lakukan dengan itu? Jika anda tidak punya target proyek, anda kemungkinan besar akan membuang boardnya ke dalam laci dan melupakannya seperti gadget lain yang mungkin pernah anda beli sebelumnya.

Jadi, saya merekomendasikan satu proyek untuk anda.

Saya telah membuat kernel mainan yang mendukung 64-bit long mode, paging dan context switching yang sangat sederhana. Membuat kernel mainan adalah cara yang bagus untuk memahami arsitektur komputer dan kontrol perangkat keras.

Faktanya, Anda sudah memiliki prosesor terbaru dan perangkat keras terbaru. Laptop anda! Desktop anda! Anda telah memiliki semua yang anda perlukan untuk memulai! Anda tidak perlu membeli apapun. Emulator qemu dapat mengemulasi prosesor ARM dan prosesor Intel terbaru. Jadi segala yang anda perlukan sudah ada di tangan. Ada banyak kernel mainan dan dokumen yang dapat anda jadikan rujukan. Install saja emulator qemu dan buatlah sebuah kernel kecil yang hanya booting, mengaktifkan paging, dan print beberapa pesan.

Kernel mainan lainnya:

Kernel Linux dan driver perangkat

Anda tidak perlu untuk membuat sebuah sistem operasi yang lengkap. Bergabung ke komunitas Linux dan berpartisipasi di dalam pengembangan.

Beberapa sumber untuk pengembangan kernel Linux dan driver perangkat dari tingkat pemula ke tingkat lanjut.

Referensi

Periksa ketika anda memerlukan sesuatu

Penerapan lain

Ya, anda mungkin tidak tertarik pada Linux atau firmware. Jika begitu, anda bisa menemukan penerapan lain:

  • Pemrograman sistem Windows & driver-driver perangkat
  • Security
  • Reverse engineering

Saya tidak memiliki pengetahuan apapun tentang penerapan-penerapan tersebut. Silahkan kirimkan saya informasi apapun untuk pemula.

Kernel dan driver tidak semuanya merupakan pemrograman tingkat rendah. Satu lagi aplikasi penting dari pemrograman tingkat rendah adalah software-defined storage atau filesystem terdistribusi. Deskripsi detailnya diluar cakupan dari dokumen ini namun ada course bagus dimana anda bisa mencoba sebuah filesystem terdistribusi sederhana.

Masa depan pemrograman tingkat rendah

Saya tidak tahu masa depan, namun saya terus memperhatikans Rust.

Jika saya bisa punya satu minggu bebas dan sendiri, saya akan belajar Rust. Itu dikarenakan Rust ada adalah bahasa terbaru yang dapat saya gunakan untuk mengembangkan driver perangkat Linux.

IoT adalah tren baru, jadi ada baikny cek OS apa untuk IoT. ARM, Samsung dan beberapa perusahaan memiliki realtime OS mereka masing-masing namun sayangnya banyak dari mereka adalah closed source. Tetapu Linux Foundation juga memiliki sebuah solusi: Zephyr

Server cloud pada mumnya memiliki banyak lapisan-lapisan; contohnya, OS host, driver kvm, proses qemu, OS guest dan service application. Sebuah container telah dikembangkan untuk menyediakan virtualisasi ringan. Dalam waktu dekat, konsep OS baru, yang disebut OS library atau Unikernel, akan menggantikan tumpukan SW untuk virtualisasi.

Big data dan komputasi cloud membutuhkan penyimpanan yang semakin besar. Beberapa disk secara langsung ditanamkan di mesin server tidak memenuhi kebutuhan kapasitas, stabilitas dan performa. Oleh karena itu telah dilakukan penelitian untuk membuat sistem penyimpanan berukuran besar dengan banyak mesin penyimpanan yang dihubungkan oleh jaringan berkecepatan tinggi. Dulunya difokuskan untuk membuat satu volume penyimpanan yang besar. Namun saat ini mereka menyediakan banyak volume yang didedikasikan untuk banyak mesin virtual.

Bagaimana cara untuk memulai?

Saya menerima sebuah email yang menanyakan cara untuk memulai. Ada banyak informasi tentang buku, course dan proyek di halama ini. Itu adalah kesalahan saya yang lupa untuk menulis bagaimana untuk memulai. Sayangnya, there is no King's Road to King's Landing. Saya hanya akan menulis apa yang saya lakukan secara berurutan. Jika anda telah melakukan sesuatu, silahkan lewati saja. LAGI, ini hanya sebuah contoh yang anda bisa lakukan secara berurutan, untuk berjaga-jaga jika Anda tidak tahu bagaimana memulainya atau apa yang harus dilakukan.

  • Membaca buku-buku teori OS: setidaknya "The Design of the UNIX Operating System by Maurice J. Bach"
  • Belajar assembly dan C
  • Lakukan sesuatu yang praktikal dengan C
    • C Project Based Tutorials?: Cari satu atau dua proyek menarik dan buat proyek anda sendiri.
    • leetcode.com: Jika anda tidak bisa menemukan sebuah proyek yang menarik, sebaiknya juga fokus pada struktur data dan algoritma.
  • Lakukan proyek hardware
    • RaspberryPi atau Arduino tidak masalah. Anda memerlukan pengalaman untuk mengontrol hardware secara langsung dengan C. HANYA C!
    • Saya merekomendasikan untuk membeli sebuah kit Atmega128 dan buat sebuah firmware untuk mnghidupkan/mematikan LED, mendeteksi input switch dan menampilkan pesan pada LCD teks. Program kontrol motor juga proyek yang sangat bagus: contohnya, line tracer (pelacak garis).
    • JANGAN menggunakan library apapun. Anda harus membuat semuanya sendiri, kecuali pengunduh program.
  • Dasar dari kernel Linux
  • Terjun ke bidang profesional
    • Jika anda mau menjadi seorang Developer Kernel Linxu profesional
    • Atau temukan topik lainnya
      • Ada banyak bidang di mana low-level engineer bisa bekerja: security, Compiler, Firmware, robot/mobil dan sebagainya

Terjemahan

Silahkan kirimkan saya pull request jika anda ingin menerjemahkan halaman ini. Saya akan mencantumkannya di sini.

Siapa saya?

Saya terinspirasi oleh google-interview-university. Saya ingin membagikan pengalaman saya dan menunjukkan roadmap untuk menjadi pemrogram low-level karena saya menemukan bahwa keterampilan ini tidak seumum dulu. Selain itu, banyak pelajar dan pemula menanyakan kepada saya bagaimana mereka bisa menjadi pemrogram tingkat rendah dan engineer kernel Linux.

FYI, saya memiliki pengalaman lebih dari 10 tahun sebagai seorang pemrogram low-level:

  • Pemrograman Assembly 80x86
  • Perangkat hardware dengan chip Atmel dan firmware
  • Pemrograman sistem Bahasa C untuk Unix
  • Driver perangkat di linux
  • Kernel Linux: page allocation
  • Kernel Linux: driver block device dan modul md