Bagaimana programmer menangani pengembangan perangkat lunak tingkat rendah dalam bahasa tingkat tinggi?

20

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 ++?

fender1901
sumber
7
Salah satu trik untuk memahami apa yang terjadi "di balik tudung" adalah dengan memfokuskan dan menggunakan paragraf untuk membuat hal-hal mudah dibaca dan dipahami. Harap edit pertanyaan ini agar lebih mudah dibaca.
S.Lott
1
Mengingat minat Anda, Anda mungkin ingin mengambil salinan Kode Charles Petzold: Bahasa Tersembunyi dari Perangkat Keras dan Perangkat Lunak Komputer. Itu bacaan yang bagus. amazon.com/Code-Language-Computer-Hardware-Software/dp/…
DKnight
@ S.Lott Untuk menyelamatkan :-)
Martin Wickman
@ Martin Wickman: Walaupun sangat bagus, apakah ini membantu @ fender1901 untuk mengedit atau fokus?
S.Lott
1
@ Martin Wickman: Membatalkan perubahan bukan itu intinya. Mendorong orang lain untuk belajar dengan melakukan adalah poin saya. Anda jelas sudah tahu. @ fender1901 perlu belajar sambil melakukan. Pertanyaan saya adalah ini: "apakah itu membantu @ fender1901 untuk mengedit atau fokus?" Apa yang kamu pikirkan?
S.Lott

Jawaban:

9

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

Martijn Verburg
sumber
Dapatkah Anda benar-benar memprogram dengan bahasa perantara atau apakah mereka hanya ada untuk memeriksa?
fender1901
Apakah Anda bertanya apakah Anda dapat menulis kode sumber 'bytecode'?
Martijn Verburg
Kupikir. Saya bertanya-tanya apakah Anda bisa memulai pengkodean menggunakan bytecode atau il sama seperti yang Anda lakukan java atau c #?
fender1901
Java atau C #, sangat sedikit orang yang memanipulasi bytecode, namun sekelompok orang yang lebih besar melihat pada kode byte mana yang menjadi kode tingkat tinggi mereka
Martijn Verburg
4

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 ioctlfungsi 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 Socketobjek. 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 #.

Charles Salvia
sumber
2

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.

Paweł Dyda
sumber
2

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.

Trevor Arjeski
sumber
2

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.

David Thornley
sumber
Saya pikir masalah terbesar saya saat ini adalah bahwa banyak dari topik-topik ini akan sulit untuk dipahami karena saya tidak memiliki latar belakang. Saya perlu, saya kira, jembatan ke daerah-daerah itu.
fender1901
@ fender1901: Itu bisa jadi masalah. Kernel Linux melakukan beberapa hal yang akan terlihat sangat aneh bagi seseorang yang tidak mengerti apa yang dilakukan sistem operasi. Emulator, dari hal-hal yang Anda sebutkan, mungkin yang paling mudah dipahami, dan ada emulator sederhana di luar sana, sering kali untuk mikrokomputer awal.
David Thornley
1

Anda harus mencari tahu, apakah mungkin untuk melakukan fungsi tingkat rendah dengan platform / bahasa yang digunakan atau tidak:

  • menyimpan byte ke dalam variabel,
  • membaca / menulis file dengan byte,
  • menyiapkan array byte, mengakses elemen,
  • menggunakan fitur prosedural yang benar, OOP,
  • mengakses layar, keyboard, soket.

Hm, suara yang memilih bahasa harus acak.

ern0
sumber
-2

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.

mur2501
sumber
ini tampaknya tidak menawarkan sesuatu yang substansial atas poin yang dibuat dan dijelaskan dalam 6 jawaban sebelumnya yang diposting beberapa tahun yang lalu
nyamuk