Saya agak baru dalam pemrograman dan cara terbaik untuk mengajukan pertanyaan ini adalah dengan sebuah contoh.
Saya tahu bagaimana melakukan hal-hal dasar di Jawa dan C #. Hal-hal seperti jendela kecil membentuk aplikasi atau membuat kelas generik. Saya pada dasarnya sudah belajar dan belum mencoba melakukan sesuatu yang besar. Ngomong-ngomong, saya selalu ingin tahu tentang bagaimana hal-hal dilakukan "di bawah tenda" Saya kira Anda bisa mengatakannya.
Saya tahu semuanya akan dirubah menjadi 1s dan 0s dan bahwa bahasa assembly pada dasarnya memberikan perintah untuk pola 1s dan 0s, tetapi sepertinya ada lompatan dari sana ke: gunakan perpustakaan untuk perpustakaan ini untuk itu. Sepertinya saya seperti semua C # dapat lakukan tanpa perpustakaan adalah aritmatika dan logika biner. Untuk mendapatkan input atau output, Anda menggunakan perpustakaan, dll ...
Saya tahu pertanyaan ini mungkin tampak jelas bagi sebagian orang dan saya tahu bahwa saya harus banyak belajar, tetapi saya bahkan tidak tahu harus mulai dari mana dengan pertanyaan seperti ini. Terima kasih.
Jadi pertanyaan saya adalah ini:
Jika seseorang akan membuat mesin virtual atau emulator Playstation, atau sistem operasi, atau driver, atau menambahkan dukungan mp3 ke pemutar media, atau membuat jenis file Anda sendiri, dll ... Bagaimana? Saya tidak bisa melihat cara yang akan dilakukan dengan C # atau Java.
Dengan kata lain, jika saya membaca buku seperti Professional C # oleh WROX atau Programming C # oleh OReilly, akankah saya tahu bagaimana melakukan hal-hal ini? Atau apakah Anda harus belajar bahasa rakitan atau sesuatu yang lebih rendah seperti C ++?
Jawaban:
Pertanyaan menarik! Anda akan menemukan bahwa bahasa-bahasa seperti Java dan C # sebenarnya mendukung pemrograman tingkat yang cukup rendah. Sebagai contoh, lihat beberapa kode sumber I / O di OpenJDK untuk Java. Anda akan melihat bahwa metode level yang lebih tinggi diimplementasikan dengan teknologi socket level yang lebih rendah, array byte dan bit twiddling.
Sehubungan dengan C # dan Java, bahasa-bahasa tersebut dikompilasi ke bytecode, yang akan dijalankan pada mesin virtual. Anda sebenarnya bisa dengan senang hati melihat dan belajar dari bytecode (mis. Melihat bagaimana Java menangani penyatuan objek String).
Jika lingkungan yang Anda kembangkan tidak menampung salah satu dari VM level tinggi ini (seringkali karena ruang dan persyaratan kinerja), maka Anda perlu menggunakan bahasa 'level bawah'.
Saya percaya bahwa C / C ++ masih memerintah bertengger di bidang penulisan driver tingkat rendah dll karena Anda dapat men-tweak manajemen memori dan struktur data ke tingkat n.
Assembly sangat terspesialisasi akhir-akhir ini, ada baiknya mengambil setidaknya kursus cepat untuk menghargai apa yang terjadi di level itu. Ketika Anda menulis beberapa Majelis untuk kembali mengisi register saat sedang kosong, Anda mulai menghargai jenis panjang yang harus ditempuh oleh setiap lapisan bahasa pemrograman.
HTH
sumber
Kebanyakan pemrograman "tingkat rendah" pada dasarnya sama dengan berinteraksi langsung dengan Sistem Operasi. Alasannya bagi Anda sepertinya tidak ada cara "jelas" untuk melakukan ini adalah karena secara umum, bahasa tingkat yang lebih tinggi seperti Java berusaha untuk kemudahan penggunaan dan portabilitas. Kode yang secara langsung berinteraksi dengan Sistem Operasi umumnya jauh lebih portabel daripada kode tingkat yang lebih tinggi, kecuali jika dibungkus dalam abstraksi.
Dalam bahasa tingkat rendah seperti C dan C ++, API Sistem Operasi dapat diakses langsung (sebagian besar disebabkan oleh fakta bahwa sebagian besar Sistem Operasi ditulis dalam C, sehingga mereka mengekspos API melalui bahasa C). Misalnya, dalam C pada sistem UNIX Anda dapat memanggil
ioctl
fungsi untuk berinteraksi langsung dengan perangkat.Tentu saja, bahasa tingkat tinggi seperti Java dan C # juga perlu berbicara dengan Sistem Operasi. Setiap kali Anda membuka file atau membaca dari soket jaringan, Anda berinteraksi dengan OS. Hanya saja Java dan C # membungkus panggilan sistem OS tingkat rendah dalam abstraksi tingkat yang lebih tinggi, seperti
Socket
objek. Pendekatan tingkat yang lebih tinggi ini memiliki keuntungan bahwa kode Java yang sama akan bekerja pada platform yang berbeda. Padahal, cara Anda membuka soket di C pada UNIX sangat berbeda dari cara Anda melakukannya pada Windows.Secara umum, semakin tinggi level bahasanya, semakin sedikit kontrol yang Anda miliki tentang bagaimana program Anda berinteraksi dengan Sistem Operasi. Yang mengatakan, banyak hal yang Anda sebutkan adalah mungkin untuk melakukan dalam bahasa tingkat yang lebih tinggi. Misalnya, tidak ada alasan Anda tidak dapat menulis Mesin Virtual di Java atau C #.
sumber
Berita baiknya adalah, itu bisa dilakukan dengan Java atau C #. Satu-satunya masalah yang perlu Anda ketahui adalah caranya . Pada dasarnya, Anda perlu mengetahui hal-hal kecil yang menyenangkan tentang Arsitektur Perangkat Keras (tidak perlu PC, tetapi Playstation jika itu yang ingin Anda tiru). Dan saya khawatir Anda harus masuk lebih dalam, seperti Assembler dan Machine Language.
Semua ALU, register, MMU, dan hal-hal lain dapat diabstraksikan dan ditiru dengan bahasa tingkat tinggi. Anda bahkan dapat memanggil fungsi tingkat rendah untuk mendapatkan dukungan perangkat keras (pelajari tentang PInvoke dan JNA misalnya).
Namun, karena Anda pemula, saya tidak akan merekomendasikan untuk memulai dengan tugas yang begitu besar. Saya menyarankan agar Anda belajar C / C ++, sedikit tentang Linux (atau OS seperti Unix lainnya, yaitu FreeBSD), Arsitektur Komputer, lalu Assembler ... Ini bisa memakan waktu beberapa tahun, jadi ...
Yang Anda butuhkan adalah motivasi dan kesabaran.
sumber
Apa yang saya lakukan apa yang dipelajari bahasa tingkat tinggi (Jawa) kemudian menjadi lebih tertarik, seperti Anda, tentang bahasa dan perangkat keras tingkat rendah. Dalam keadaan paling primitif, komputer adalah elektronik. 1 dan 0 hanyalah angka-angka untuk muatan listrik (hidup dan mati). Begitu saya mulai memahami logika di balik prosesor, dan apa yang ada di dalam Unit Logika Aritmatika, semuanya benar-benar terjadi.
Saya pikir Anda harus memulai studi Andadengan hal-hal seperti logika boolean (AND, OR, XOR, dll.), kemudian mulailah mendesain ALU kecil dan melihat bagaimana memori dan register memainkan sesuatu. Setelah itu pelajari beberapa bahasa assembly dan kemudian Anda akan menyadari bagaimana kompilasi bekerja. Dengan segera bahasa tingkat tinggi akan terasa membosankan! :) Hanya bercanda. Sangat indah bagaimana semuanya jatuh ke tempatnya, dan itu harus menyenangkan untuk dipelajari. Setelah Anda mulai mengikuti jalur keingintahuan, Anda akan mengambil semuanya dalam waktu singkat.
sumber
Meskipun Anda dapat melakukan hal-hal tingkat rendah dengan C # atau Java (atau sebagian besar bahasa lain), kebanyakan orang tidak. Karena itu, buku apa pun yang cukup populer yang Anda pilih akan menghilangkan barang-barang tingkat rendah. Mereka cenderung membahas fitur bahasa yang Anda butuhkan, tetapi tidak menerapkannya dengan cara yang membuat Anda penasaran. Demikian pula, buku-buku tentang hal-hal tingkat rendah mungkin akan dalam bahasa C, dengan mungkin sedikit bahasa assembly.
Belajar C sendiri tidak akan sulit bagi seorang programmer C #, selain dari manipulasi pointer, meskipun belajar untuk melakukan hal-hal di dalamnya akan memakan waktu lebih lama. Karena C adalah bahasa yang kurang ekspresif daripada C #, beberapa hal yang Anda tahu bagaimana melakukannya secara efisien dalam C # harus dilakukan dengan cara yang jauh berbeda, dan sering menggunakan, dalam C.
Apa yang harus Anda cari selanjutnya adalah buku-buku tentang hal-hal tingkat rendah yang ingin Anda pelajari. Ada beberapa buku di kernel Linux, misalnya, tetapi pemrograman tingkat kernel akan sulit untuk dipahami tanpa latar belakang, jadi Anda mungkin ingin mempelajari dasar-dasar sistem operasi terlebih dahulu.
sumber
Anda harus mencari tahu, apakah mungkin untuk melakukan fungsi tingkat rendah dengan platform / bahasa yang digunakan atau tidak:
Hm, suara yang memilih bahasa harus acak.
sumber
Pertanyaannya memiliki beberapa jawaban: 1. Java dan C # adalah bahasa tingkat tinggi yang dikembangkan untuk pengembangan aplikasi pada sistem Operasi yang ada yang mengelola memori (ini juga memungkinkan untuk membuat program hibrida yang dapat berjalan pada sistem yang berbeda). 2. Area di mana pemrograman tingkat rendah diperlukan adalah pengembangan OS, pengembangan driver, pengembangan game AAA, dll. Biasanya pemrograman tingkat rendah tidak dilakukan di Jawa atau C # itu dijalankan menggunakan C / C ++ dan bahasa Assembly.
Dengan hanya dua poin ini kita dapat mengatakan bahwa pemrograman tingkat rendah dilakukan secara terpisah dan tidak perlu pemrograman tingkat rendah dalam pemrograman tingkat tinggi. Bagian-bagian di mana pemrograman rendah diperlukan seperti I / O dilakukan oleh juru bahasa yang dengan sendirinya ditulis dalam bahasa tingkat rendah (misalnya JVM java ditulis dalam C).
Jawaban utama dari pertanyaan Anda adalah hal-hal ini tidak dikembangkan menggunakan Java dan C # hal-hal ini dilakukan dalam C dan Majelis daripada menemukan cara untuk melakukannya di Jawa dan C # Anda harus bagin belajar C dan Majelis karena mereka adalah dudes terbesar dari pemrograman dan ya kelebihannya adalah program yang ditulis di level rendah kecil dan cepat.
sumber