Bagaimana berkenalan dengan LLP di ITMO University: kursus "Pemrograman Tingkat Rendah"

Sebagian besar bahasa pemrograman populer adalah bahasa tingkat tinggi. Misalnya, Java, Python, atau C #. Tentu saja, Anda dapat memprogramnya dan membayangkan dengan buruk bagaimana berbagai level abstraksi bekerja. Tetapi untuk spesialis IT yang baik, penting untuk memahami bagaimana platform yang berinteraksi dengannya dibangun, bagaimana lingkungan pengembangan, kompiler, dan fungsi debugger. Ini mengarahkan kita untuk berbicara tentang pemrograman tingkat rendah.

LLP (pemrograman tingkat rendah) adalah cara mudah untuk mengetahui cara menulis program yang andal, cepat, kompak, dan efisien. Siswa kami belajar assembler dan C terutama untuk mendapatkan perasaan yang lebih baik tentang cara kerja perangkat lunak.

Foto Pablo BD CC BY-SA

Kenapa kamu perlu tahu


Industri TI berkembang pesat dan tunduk pada mode untuk teknologi dan bahasa. Konsep dasar - misalnya, model komputasi, memori virtual, kompilasi, dan perakitan program - berubah jauh lebih jarang. Memahami bagaimana prinsip-prinsip dasar konsep-konsep tersebut dimanifestasikan dalam satu bahasa pemrograman akan membantu Anda dengan cepat mempelajari bahasa yang serupa jika Anda membutuhkannya untuk bekerja. LLP dalam hal ini memperjelas bagaimana program dari teks sumber menjadi satu set instruksi mesin, dan bagaimana mereka dieksekusi di komputer. Pada gilirannya, keakraban dengan mekanisme manajemen memori dan prinsip-prinsip kompiler akan membantu Anda menulis kode yang kurang menuntut pada sumber daya komputasi.

Klarifikasi: Kita sering harus menemukan tesis bahwa LLP hanya memprogram besi dan tugas serupa. Ini tidak benar.

Di mana saya dapat menemukan LLP dalam praktik:

  • Perdagangan Perdagangan di bursa membuat program dengan persyaratan sangat tinggi untuk waktu reaksi terhadap fluktuasi pasar. Karena "keterasingan" bahasa tingkat tinggi dari "besi", sangat sulit untuk memprediksi waktu respons suatu program terhadap peristiwa eksternal. Oleh karena itu, LLP terlibat di sini untuk memberikan kontrol atas kecepatan transaksi.

  • Robotika . Sumber daya komputasi terbatas di sini, sehingga persyaratan untuk kualitas perangkat lunak dan kekompakan kode tinggi. Pendekatan yang diterima secara umum untuk membuat perangkat lunak di sini tidak selalu berhasil, dan seringkali pengembangan dapat dilakukan dalam bahasa C atau bahasa sistem lainnya.

  • Perangkat lunak sistem . Ini adalah OS, compiler (JIT, AOT), browser (hari ini mereka telah menjadi platform untuk membuat aplikasi yang kompleks). Karyanya tidak selalu terlihat oleh orang awam, tetapi menciptakan infrastruktur untuk perangkat lunak aplikasi.

Bagaimana kita mempersiapkan ini?


Siswa kami dari arah 09.03.01 "Teknik Informatika dan Komputer" dan 09.03.04 "Rekayasa Perangkat Lunak" mempelajari sejumlah disiplin ilmu yang berkaitan dengan pemrograman tingkat rendah. Ini adalah sistem operasi, perangkat lunak sistem (termasuk di Unix), pengembangan kompiler, teknologi virtualisasi, dll.

Titik awal - kursus "Pemrograman tingkat rendah". Di sini siswa sedang menunggu pekerjaan dengan assembler dan C. Secara paralel - mereka mempelajari proses menyusun dan menjalankan program. Kursus ini dalam format "dari pengaturan tugas ke program yang selesai." Tujuan utama kursus adalah untuk mendapatkan gambaran tentang bagaimana presentasi program berubah selama transisi antara:

  • menulis kode;
  • preprocessing dan kompilasi;
  • menghubungkan
  • eksekusi dan debugging.


Foto hackNY.org CC BY-SA

Dari siswa yang datang ke kursus, kami mengharapkan pengalaman pemrograman minimal dalam bahasa tingkat tinggi (misalnya, Java atau C #). Kami merekomendasikan kursus online berikut:


Kursus "pemrograman tingkat rendah" diajarkan terutama dari buku yang ditulis khusus untuk siswa kami. Buku ini diterbitkan dalam bahasa Inggris dan diterjemahkan ke dalam bahasa Jepang dan Portugis. Kami juga sering bekerja dengan manual pengembang perangkat lunak Intel64 dan System V AMD64 ABI.

Apa yang ada di dalam kursus


Dengan kata sederhana, kursus ini dapat dirinci sebagai berikut (berkenaan dengan topik-topik yang telah diidentifikasi di atas):

  • Kode ejaan . Asumsikan bahasa assembly gratis untuk Intel 64 (NASM, Linux) dan C11. Di sini kita mempelajari model komputasi, memberikan rekomendasi lanjutan pada gaya penulisan kode.

  • Preprocessing dan kompilasi . Para praprosesor NASM dan C dipelajari, tata bahasa formal, optimisasi kode umum oleh kompiler, dan mekanisme implementasi khas konstruksi bahasa C pada tingkat assembler (dengan kata lain, demonstrasi gagasan "C adalah assembler tingkat tinggi") dibahas.

  • Menautkan (menautkan) . Statis dan dinamis. Dalam praktiknya, format ELF sedang dipelajari - siswa mengeksplorasi apa yang dilakukan linker dan loader dinamis. Omong-omong, kursus mini terpisah didedikasikan untuk ini.

  • Menjalankan dan men-debug suatu program . Di sini kita memahami bagaimana tugas-tugas ini terkait dengan arsitektur komputer, perangkat memori virtual dan mode istimewa, interupsi, dan mekanisme panggilan sistem. Selain itu, kami mempertimbangkan bagaimana gdb digunakan (debugger yang kuat yang memungkinkan Anda untuk "melihat di balik tudung" dari program apa pun).

Nuansa organisasi yang penting


Kami memecahkan kuliah dengan menulis kode bersama dan mempelajari file yang dikompilasi menggunakan alat dari binutils (objdump, readelf) atau gdb. Selama ceramah (dan tidak hanya), siswa mengajukan pertanyaan baik secara lisan maupun di saluran kursus dengan pembawa pesan yang terkenal, dan para guru menjawabnya sesegera mungkin.

Sebagai pelajaran praktis, siswa melakukan pekerjaan laboratorium. Kadang-kadang siswa dalam proses belajar ingin mengembangkan sesuatu dari mereka sendiri yang secara pribadi menarik bagi mereka (permainan, program untuk mengendalikan robot, kompiler, dll.).

Oleh karena itu, sebagai pengganti ujian, siswa dapat membuat proyek individu tentang suatu topik yang disetujui oleh guru. Setelah melalui tinjauan kode dan memposting di GitHub, mereka merekam video yang menunjukkan proyek (saluran ini berisi proyek yang dilaksanakan sejak 2014, tautan ke GitHub ada dalam deskripsi).

Contoh karya siswa: analog levitron ( cerita rinci tentang proyek Habr )

Beberapa proyek lain selesai pada akhir kursus:



Tentang guru


Di lapangan, seluruh tim guru berinteraksi dengan siswa yang memberi kuliah, mengambil pekerjaan laboratorium, dan memberi nasihat kepada siswa. Siswa senior berpartisipasi dalam diskusi dan membantu siswa kursus saat ini memahami seluk-beluk pemrograman tingkat rendah.

Pekerjaan utama dalam mempersiapkan bahan untuk kursus dilakukan oleh Igor Zhirkov, penulis buku teks di atasnya. Igor belajar di Universitas ITMO dan Universitas Akademik, menerima gelar master di ITMO pada tahun 2016. Bidang minatnya adalah teori tipe, logika matematika, bahasa pemrograman, dan pemrograman tingkat rendah. Proyek utamanya saat ini adalah terkait dengan verifikasi formal refactoring bahasa C menggunakan Coq dan kompilator CompCert yang terverifikasi untuk C.



Kursus ini membantu Anda mempelajari cara melihat masalah dari tingkat abstraksi yang memadai dan, katakanlah, secara kondisional, jangan mencoba untuk "menulis aplikasi web dalam assembler." Kami mencoba untuk mendekati studi C dan assembler dalam hal memahami konsep yang terkait dengan "alat" ini dan lingkungan mereka - sistem operasi dan CPU.

Ngomong-ngomong, di sini Anda dapat menemukan buku, yang tulisannya diilhami oleh pengajaran kursus ini (diterbitkan dalam bahasa Inggris, Jepang, dan Portugis).

Source: https://habr.com/ru/post/id425249/


All Articles