Misalnya, jika komputer telah 10111100
disimpan pada satu byte tertentu dari RAM, bagaimana komputer tahu untuk menafsirkan byte ini sebagai integer, karakter ASCII, atau yang lainnya? Apakah tipe data disimpan dalam byte yang berdekatan? (Saya tidak berpikir ini akan terjadi karena ini akan menghasilkan penggunaan dua kali jumlah ruang untuk satu byte.)
Saya menduga bahwa mungkin sebuah komputer bahkan tidak tahu tipe data, bahwa hanya program yang menggunakannya yang tahu. Dugaan saya adalah bahwa karena RAM adalah R AM dan karena itu tidak membaca secara berurutan, bahwa program tertentu hanya memberitahu CPU untuk mengambil info dari alamat tertentu dan program mendefinisikan bagaimana mengobatinya. Ini sepertinya cocok dengan pemrograman hal-hal seperti kebutuhan untuk typecasting.
Apakah saya di jalur yang benar?
sumber
Jawaban:
Kecurigaan Anda benar. CPU tidak peduli dengan semantik data Anda. Namun, terkadang itu membuat perbedaan. Misalnya, beberapa operasi aritmatika menghasilkan hasil yang berbeda ketika argumen ditandatangani atau tidak ditandatangani secara semantik. Dalam hal ini Anda perlu memberi tahu CPU interpretasi mana yang Anda maksudkan.
Terserah programmer untuk memahami datanya. CPU hanya mematuhi perintah, tidak menyadari arti atau tujuan mereka.
sumber
mov al, 42
semacam tingkat tinggi - sudah jelas hanya ada satu instruksi yang mungkin bisa dipanggil, tapi masih agak abstrak. Namun, menggunakanmov.8 al, 42
secara eksplisit membuat ini sangat menyakitkan :)Seperti yang sudah dijawab oleh orang lain, CPU umum saat ini tidak tahu isi posisi memori yang diberikan; perangkat lunak memutuskan.
Namun, ada kemungkinan lain. Mesin Lisp misalnya menggunakan arsitektur yang ditandai yang menyimpan jenis setiap posisi memori; dengan cara itu perangkat keras itu sendiri dapat melakukan beberapa pekerjaan bahasa tingkat tinggi.
Dan bahkan sekarang, saya kira Anda dapat mempertimbangkan bit NX di Intel, AMD, ARM dan arsitektur lainnya untuk mengikuti prinsip yang sama: bedakan pada tingkat perangkat keras apakah zona memori yang diberikan berisi data atau instruksi.
Juga, hanya untuk kelengkapan, dalam arsitektur Harvard (seperti beberapa mikrokontroler) data dan instruksi dipisahkan secara fisik, sehingga CPU memiliki beberapa gagasan tentang apa yang dibaca.
Dalam pertanyaan Quora ini ada beberapa komentar tentang bagaimana memori yang ditandai bekerja, implikasi kinerja dan kehancurannya, dan banyak lagi.
sumber
Iya nih. Program hanya mendapatkan byte dari memori dan dapat menafsirkannya seperti yang diinginkan.
sumber
Tidak ada penjelasan jenis.
RAM menyimpan data murni, dan kemudian program menentukan apa yang harus dilakukan.
Dengan register CPU sedikit lebih sulit, jika Anda memiliki register tipe tertentu (seperti FPU), Anda tahu apa yang ada di dalamnya.
Operasi pada register titik apung secara eksplisit menggunakan data yang diketik. Anda atau kompiler Anda memberi tahu apa dan kapan harus diletakkan di sana, sehingga Anda tidak memiliki kebebasan seperti itu.
Komputer tidak membuat asumsi apa pun tentang data yang mendasarinya dalam RAM, dan dalam register dengan satu pengecualian - register yang diketik dalam CPU adalah tipe yang dikenal, dioptimalkan untuk menghadapinya. Ini hanya untuk menunjukkan bahwa ada tempat-tempat di mana data harus dari tipe yang diharapkan, tetapi tidak ada yang menghentikan Anda dari casting string ke float dan mengalikannya.
Dalam bahasa pemrograman Anda menentukan jenis, atau dalam bahasa tingkat yang lebih tinggi data bersifat umum dan kompiler / juru bahasa / VM mengkodekan apa yang ada di dalam dengan overhead.
Misalnya di C, jenis penunjuk Anda memberi tahu apa yang harus dilakukan dengan data, cara mengaksesnya.
Tentu saja Anda dapat membaca string (karakter) dan memperlakukannya sebagai nilai floating point, bilangan bulat dan mencampurnya.
sumber
CPU tidak peduli, ia mengeksekusi kode perakitan, yang hanya memindahkan data, memindahkannya, menambah atau mengalikannya ...
Tipe Data adalah konsep bahasa tingkat yang lebih tinggi: dalam C atau C ++ Anda perlu menentukan Tipe untuk setiap bagian data yang Anda manipulasi; C / C ++ Compiler menangani transformasi bagian data ini menjadi perintah yang tepat untuk diproses oleh CPU (kompiler menulis kode perakitan)
Dalam beberapa bahasa tingkat yang lebih tinggi, Jenis dapat disimpulkan: dalam Python atau Javascript, misalnya, seseorang tidak harus menentukan tipe data, namun data memiliki tipe dan Anda tidak dapat menambahkan string dengan integer, tetapi Anda dapat menambahkan float dengan integer: 'compiler' (yang dalam kasus Javascript adalah JIT (Just in Time) Compiler. Javascript sering disebut bahasa 'ditafsirkan' karena secara historis browser menafsirkan kode Javascript, tetapi saat ini mesin Javascript adalah kompiler.
Kode, selalu berakhir dikompilasi ke kode mesin, tetapi jelas format kode mesin tergantung pada mesin yang Anda targetkan (kode x86 64bit tidak akan berfungsi pada mesin x86 32 bit atau prosesor ARM misalnya)
Jadi sebenarnya ada banyak lapisan yang terlibat dalam menjalankan kode yang ditafsirkan.
Java dan C # adalah yang menarik lainnya, karena kode Java atau C # secara teknis 'dikompilasi' ke biner Java (bytecode), tetapi kode itu sendiri kemudian ditafsirkan oleh Java Runtime, yang khusus untuk perangkat keras yang mendasarinya (orang perlu menginstal JRE menargetkan mesin yang tepat untuk menjalankan Java binaries (Jars))
sumber
Datatypes bukan fitur perangkat keras. CPU tahu beberapa (well, banyak) perintah yang berbeda. Itu disebut set instruksi CPU.
Salah satu yang paling dikenal adalah set instruksi x86 . Jika Anda mencari "multiply" di halaman ini, Anda mendapatkan 50 hasil.
MULPD
danMULSD
untuk perkalian ganda,FIMUL
untuk perkalian bilangan bulat, ...Perintah-perintah itu berfungsi pada register. Register adalah slot memori yang dapat berisi jumlah bit tetap (seringkali 32 atau 64, tergantung pada arsitektur yang digunakan CPU Anda), tidak peduli apa yang diwakili bit ini. Oleh karena itu instruksi CPU menginterpretasikan nilai register dengan cara yang berbeda, tetapi nilai itu sendiri tidak memiliki tipe.
Contoh diberikan di PyCon 2017 oleh Stuart Williams :
sumber
Persis. Tetapi RAM tidak dibaca "secara berurutan", dan itu adalah singkatan dari Random Access Memory yang justru sebaliknya.
Selain mengetahui apa byte adalah , Anda bahkan tidak tahu apakah itu byte , atau sebuah fragmen dari item yang lebih besar seperti angka floating-point.
Saya ingin menambahkan jawaban lain dengan memberikan beberapa contoh spesifik.
Pertimbangkan
01000001
. Program dapat menyalinnya dari satu tempat ke tempat lain sebagai bagian dari paket besar data tanpa memperhatikan artinya. Tetapi menyalin itu ke alamat yang digunakan oleh buffer video mode teks akan menyebabkan surat ituA
muncul di beberapa posisi di layar. Tindakan yang sama persis ketika kartu berada dalam mode grafis CGA akan menampilkan piksel merah dan piksel biru.Dalam register, bisa jadi nomor 65 sebagai bilangan bulat. Melakukan aritmatika untuk mengatur bit 32-an bisa berarti apa saja tanpa konteks, tetapi mungkin secara khusus mengubah huruf menjadi huruf kecil.
CPU 8086 (masih) memiliki instruksi khusus yang disebut DAA ※ yang digunakan ketika register memiliki 2 angka desimal, jadi jika Anda hanya menggunakan instruksi itu Anda menafsirkannya sebagai dua digit
41
.Program macet karena kata memori dibaca berpikir itu adalah pointer ketika sesuatu yang lain disimpan di sana.
Menggunakan debugger, memeriksa memori, peta digunakan untuk memandu interpretasi untuk tampilan. Tanpa informasi simbol ini, debugger tingkat rendah memungkinkan Anda menentukan: menunjukkan alamat ini sebagai kata 16-bit, menunjukkan alamat ini sebagai titik mengambang yang panjang, sebagai string ... apa pun. Melihat dump paket jaringan atau format file yang tidak dikenal, membingungkan itu adalah sebuah tantangan.
Itu adalah sumber utama kekuatan dan fleksibilitas dalam arsitektur komputer modern: sel memori dapat berarti apa saja , data atau instruksi, tersirat hanya dalam apa yang "berarti" untuk program dengan apa yang dilakukannya dengan nilai dan bagaimana hal itu mempengaruhi operasi selanjutnya. artinya lebih dalam dari lebar integer: apakah karakter ini ... karakter dalam ascii atau ebcdic? Membentuk kata dalam bahasa Inggris atau kode produk SQU? Alamat tujuan pengiriman atau alamat pengirimnya? Interpretasi level terendah (bit logis; bilangan bulat, ditandatangani atau tidak ditandatangani; float; bcd; pointer) kontekstual pada level set instruksi, tetapi Anda melihat bahwa itu semua konteks pada beberapa level: the toalamat adalah apa itu karena lokasi itu tercetak di amplop. Itu kontekstual dengan aturan tukang pos, bukan CPU. Konteksnya adalah satu kontinum besar, dengan bit di satu ujungnya.
※ Catatan Kaki: Instruksi DAA dikodekan sebagai byte
00100111
. Jadi byte itu adalah instruksi yang disebutkan sebelumnya jika dibaca dalam aliran instruksi, dan digit27
jika ditafsirkan sebagai digit bcd, dan 0x27 = 39 sebagai bilangan bulat, yang merupakan angka 9 dalam ASCII, dan bagian dari tabel interrupt (setengah dari INT 13 Alamat 2-byte, digunakan untuk rutinitas layanan BIOS).sumber
Satu-satunya cara komputer mengetahui bahwa lokasi memori adalah instruksi adalah bahwa register dengan tujuan khusus yang disebut penunjuk instruksi menunjuk ke mereka pada satu titik atau lainnya. Jika penunjuk instruksi menunjuk ke kata memori, itu dimuat sebagai instruksi. Selain itu, komputer tidak memiliki cara untuk mengetahui perbedaan antara program dan tipe data lainnya.
sumber