Maaf, untuk pertanyaan saya yang membingungkan. Saya mencari beberapa petunjuk.
Hingga kini saya telah bekerja sebagian besar dengan Java dan Python pada lapisan aplikasi dan saya hanya memiliki pemahaman yang samar tentang sistem operasi dan perangkat keras. Saya ingin memahami lebih banyak tentang tingkat komputasi yang lebih rendah, tetapi entah bagaimana rasanya sangat berlebihan. Di universitas saya mengambil kelas tentang pemrograman mikro, yaitu bagaimana prosesor terhubung dengan kabel untuk mengimplementasikan kode ASM. Sampai sekarang saya selalu berpikir saya tidak akan menyelesaikan lebih banyak jika belajar lebih banyak tentang "level rendah".
Satu pertanyaan yang saya miliki adalah: bagaimana mungkin perangkat keras disembunyikan hampir sepenuhnya dari pengembang? Apakah akurat untuk mengatakan bahwa sistem operasi adalah lapisan perangkat lunak untuk perangkat keras? Satu contoh kecil: dalam pemrograman saya tidak pernah menemukan perlunya memahami apa itu L2 atau L3 Cache. Untuk lingkungan aplikasi bisnis yang khas, orang hampir tidak pernah perlu memahami assembler dan tingkat komputasi yang lebih rendah, karena saat ini ada tumpukan teknologi untuk hampir semua hal. Saya kira inti dari level yang lebih rendah ini adalah untuk menyediakan antarmuka ke level yang lebih tinggi. Di sisi lain saya bertanya-tanya seberapa besar pengaruh level yang lebih rendah dapat miliki, misalnya seluruh hal komputasi grafis ini.
Jadi, di sisi lain, ada cabang ilmu komputer teoretis ini, yang bekerja pada model komputasi abstrak. Namun, saya juga jarang menghadapi situasi, di mana saya menemukan pemikiran yang membantu dalam kategori model kompleksitas, verifikasi bukti, dll. Saya agak tahu, bahwa ada kelas kompleksitas yang disebut NP, dan bahwa mereka agak tidak mungkin untuk dipecahkan. sejumlah besar N. Apa yang saya lewatkan adalah referensi untuk kerangka kerja untuk memikirkan hal-hal ini. Tampak bagi saya, bahwa ada semua jenis kamp yang berbeda, yang jarang berinteraksi.
Beberapa minggu terakhir saya membaca tentang masalah keamanan. Di sini entah bagaimana, banyak lapisan yang berbeda berkumpul. Serangan dan eksploitasi hampir selalu terjadi pada tingkat yang lebih rendah, jadi dalam hal ini perlu untuk mempelajari tentang rincian lapisan OSI, cara kerja bagian dalam OS, dll.
sumber
Jawaban:
Kata kunci untuk memikirkan hal-hal ini adalah abstraksi .
Abstraksi berarti mengabaikan rincian suatu sistem dengan sengaja sehingga Anda dapat menganggapnya sebagai komponen tunggal yang tidak dapat dibagi ketika merakit sistem yang lebih besar dari banyak subsistem. Ini sangat kuat - menulis program aplikasi modern sambil mempertimbangkan perincian alokasi memori dan mendaftar tumpah dan runtime transistor mungkin dalam beberapa cara yang ideal, tetapi jauh lebih mudah tidakuntuk memikirkannya dan gunakan saja operasi tingkat tinggi sebagai gantinya. Paradigma komputasi modern sangat bergantung pada berbagai tingkat abstraksi: elektronik solid-state, pemrograman mikro, instruksi mesin, bahasa pemrograman tingkat tinggi, OS dan API pemrograman Web, kerangka kerja dan aplikasi yang dapat diprogram pengguna. Sebenarnya tidak ada yang bisa memahami seluruh sistem saat ini, dan bahkan tidak ada jalan yang bisa kita gunakan untuk kembali ke keadaan itu.
Sisi lain dari abstraksi adalah hilangnya daya. Dengan menyerahkan keputusan tentang perincian ke tingkat yang lebih rendah, kami sering menerima bahwa perincian itu dapat dibuat dengan efisiensi yang tidak optimal, karena tingkat yang lebih rendah tidak memiliki 'Gambaran Besar' dan dapat mengoptimalkan pekerjaan mereka hanya dengan pengetahuan lokal, dan tidak (berpotensi) cerdas sebagai manusia. (Biasanya. Untuk isntance, mengkompilasi HLL ke kode mesin saat ini sering dilakukan lebih baik oleh mesin daripada bahkan oleh manusia yang paling berpengetahuan, karena arsitektur prosesor telah menjadi begitu rumit.)
Masalah keamanan merupakan hal yang menarik, karena kelemahan dan 'kebocoran' dalam abstraksi seringkali dapat dieksploitasi untuk melanggar integritas suatu sistem. Ketika API mendalilkan bahwa Anda dapat memanggil metode A, B, dan C, tetapi hanya jika kondisi X berlaku, mudah untuk melupakan kondisi dan tidak siap untuk kejatuhan yang terjadi ketika kondisi dilanggar. Misalnya, buffer overflow klasik mengeksploitasi fakta bahwa menulis ke sel memori menghasilkan perilaku yang tidak ditentukan kecuali Anda telah mengalokasikan blok memori khusus ini sendiri. API hanya menjamin sesuatu ituakan terjadi sebagai hasilnya, tetapi dalam praktiknya hasilnya ditentukan oleh perincian sistem di tingkat bawah berikutnya - yang sengaja kita lupakan! Selama kita memenuhi persyaratan, ini tidak penting, tetapi jika tidak, seorang penyerang yang memahami kedua level secara intim biasanya dapat mengarahkan perilaku seluruh sistem yang diinginkan dan menyebabkan hal-hal buruk terjadi.
Kasus bug alokasi memori sangat buruk karena ternyata benar-benar sangat sulit untuk mengelola memori secara manual tanpa kesalahan tunggal dalam sistem besar. Ini bisa dilihat sebagai kasus abstraksi yang gagal: meskipun dimungkinkan untuk melakukan semua yang Anda butuhkan dengan C
malloc
API, itu hanya untuk mudah disalahgunakan. Sebagian komunitas pemrograman sekarang berpikir bahwa ini adalah tempat yang salah untuk memperkenalkan batas level ke dalam sistem, dan alih-alih mempromosikan bahasa dengan manajemen memori otomatis dan pengumpulan sampah, yang kehilangan daya, tetapi memberikan perlindungan terhadap korupsi memori dan perilaku yang tidak terdefinisi . Bahkan, alasan utama untuk masih menggunakan C ++ saat ini adalah fakta bahwa ini memungkinkan Anda untuk mengontrol sumber daya apa saja yang diperoleh dan dirilis kapan. Dengan cara ini, perpecahan utama antara bahasa yang dikelola dan tidak dikelola saat ini dapat dilihat sebagai ketidaksepakatan tentang di mana tepatnya untuk menentukan lapisan abstraksi.Hal yang sama dapat dikatakan untuk banyak paradigma alternatif utama lainnya dalam komputasi - masalah ini benar-benar muncul sepanjang waktu di mana sistem besar harus dibangun, karena kami tidak dapat merekayasa solusi dari awal untuk persyaratan kompleks yang umum saat ini. (Sudut pandang umum dalam AI dewasa ini adalah bahwa otak manusia benar - benar berfungsi seperti itu - perilaku yang muncul melalui loop umpan balik, jaringan yang saling berhubungan secara masif, dll. Alih-alih modul dan lapisan terpisah dengan antarmuka sederhana yang diabstraksikan di antara mereka, dan inilah mengapa kami hanya memiliki sedikit keberhasilan dalam mensimulasikan kecerdasan kita sendiri.)
sumber