Wenn der Computer beispielsweise 10111100
ein bestimmtes Byte RAM gespeichert hat , wie kann der Computer dieses Byte als Ganzzahl, ASCII-Zeichen oder etwas anderes interpretieren? Werden Typdaten in einem benachbarten Byte gespeichert? (Ich glaube nicht, dass dies der Fall wäre, da dies die doppelte Menge an Speicherplatz für ein Byte zur Folge hätte.)
Ich vermute, dass ein Computer möglicherweise nicht einmal die Art der Daten kennt, sondern nur das Programm, das sie verwendet. Ich vermute, da RAM R AM ist und daher nicht sequentiell gelesen wird, weist ein bestimmtes Programm die CPU lediglich an, die Informationen von einer bestimmten Adresse abzurufen, und das Programm definiert, wie es behandelt werden soll. Dies scheint mit der Programmierung von Dingen wie der Notwendigkeit von Typecasting zusammen zu passen.
Bin ich auf dem richtigen Weg?
quelle
Antworten:
Your suspicion is correct. The CPU doesn't care about the semantics of your data. Sometimes, though, it does make a difference. For example, some arithmetic operations produce different results when the arguments are semantically signed or unsigned. In that case you need to tell the CPU which interpretation you intended.
It is up to the programmer to make sense of her data. The CPU only obeys orders, blissfully unaware of their meaning or goals.
quelle
mov al, 42
is kind of high-level - it's obvious there's only one possible instruction this could call, but it's still somewhat abstracted away. However, usingmov.8 al, 42
explicitly makes this painfully obvious :)As others have already answered, today's common CPUs do not know what a given memory position contains; the software decides.
However, there are other possibilities. Lisp Machines for example used a tagged architecture which stored the type of each memory position; that way the hardware itself could do some of the work of high-level languages.
And even now, I guess you could consider the NX bit in Intel, AMD, ARM and other architectures to follow the same principle: distinguish at the hardware level whether a given memory zone contains data or instructions.
Also, just for completeness, in Harvard architectures (like some microcontrollers) data and instructions are physically separated, so the CPU does have some idea of what it is reading.
In this Quora question there's some commentary on how the tagged memory worked, its performance implications and demise, and more.
quelle
Yes. The program just gets a byte from the memory and it can interpret it however it wants.
quelle
There are no type annotations.
RAM stores pure data, and then program defines what to do.
With CPU registers is a bit harder, if you have registers of given type (like FPU), you tell what is inside.
Operations on floating point registers are explicitly using typed data. You or your compiler tell what and when should be put there, so you not have such freedom.
Computer does not make any assumptions on underlying data in RAM, and in registers with one exception - typed registers in CPU are of known type, optimised to deal with it. This is only to show that there are places where data is to be of expected type, but nothing stops you from casting strings to floats and multiply them.
In programming languages you specify type, or in higher level languages data is general and compiler / interpreter / VM encodes what is inside with overhead.
For example in C your pointer type tells what to do with data, how to access it.
Of course you can read string (characters) and treat then as floating point values, integers and mix them.
quelle
The CPU doesn't care, it executes assembly code, which justs merely moves data around, shift it, add it or multiply it...
Data Types are a higher level language concept: in C or C++ you need to specify Types for every single piece of data you manipulate; the C/C++ Compiler takes care of transforming these pieces of data into the right commands for the CPU to process (compilers write assembly code)
In some even higher level languages, Types may be inferred: in Python or Javascript, for example, one does not have to specify data types, yet data has a type and you can't add a string with an integer, but you can add a float with an integer: the 'compiler' (which in the case of Javascript is a JIT (Just in Time) Compiler. Javascript is often called an 'interpreted' language because historically browsers interpreted Javascript code, but nowadays Javascript engines are compilers.
Code, always ends up being compiled to machine code, but obviously machine code format depends on the machine you're targeting (x86 64bit code won't work on a x86 32 bits machine or a ARM processor for example)
So there is actually a lot of layers involved in running interpreted code.
Java and C# are other interesting ones, as Java or C# code is technically 'compiled' to a Java binary (bytecode), but that code itself is then interpreted by the Java Runtime, which is specific to the underlying hardware (one needs to install the JRE targeting the right machine to run Java binaries (Jars) )
quelle
Datatypes are not a hardware feature. The CPU knows a couple (well, a lot) of different commands. Those are called the instruction set of a CPU.
One of the best known ones is the x86 instruction set. If you search for "multiply" on this page, you get 50 results.
MULPD
andMULSD
for the multiplication of doubles,FIMUL
for integer multiplication, ...Those commands work on registers. Registers are memory slots which can contain a fixed number of bits (often 32 or 64, depending on which architecture your CPU uses), no matter what these bits represent. Hence the CPU instruction interprets the values of the registers in a different way, but the values themselves don't have types.
An example was given at PyCon 2017 by Stuart Williams:
quelle
Exactly. But RAM is not read "sequentially", and it stands for Random Access Memory which is exactly the opposite.
Neben dem Wissen, was ein Byte ist , wissen Sie nicht einmal, ob es sich um ein Byte oder ein Fragment eines größeren Elements wie einer Gleitkommazahl handelt.
Ich möchte andere Antworten mit einigen konkreten Beispielen ergänzen.
Überlegen Sie
01000001
. Das Programm kopiert es möglicherweise als Teil eines großen Datenpakets von einem Ort an einen anderen, ohne Rücksicht auf seine Bedeutung. Wenn Sie dies jedoch an die vom Videopuffer im Textmodus verwendete Adresse kopieren, wird der BuchstabeA
an einer bestimmten Position auf dem Bildschirm angezeigt. Die exakt gleiche Aktion, wenn sich die Karte in einem CGA-Grafikmodus befindet, zeigt ein rotes Pixel und ein blaues Pixel an.In einem Register könnte es sich bei der Zahl 65 um eine Ganzzahl handeln. Rechnen, um das 32er-Bit zu setzen, kann alles bedeuten ohne Kontext , es kann jedoch insbesondere sein, dass ein Buchstabe in Kleinbuchstaben geändert wird.
Die 8086-CPU verfügt (noch) über spezielle Anweisungen namens DAA ※ , die verwendet werden, wenn das Register zwei Dezimalstellen enthält. Wenn Sie diese Anweisung also nur verwendet haben, interpretieren Sie sie als zwei Stellen
41
.Programme stürzen ab, weil ein Speicherwort gelesen wird und denkt, es sei ein Zeiger, wenn etwas anderes dort gespeichert wurde.
Verwenden eines Debuggers, Überprüfen des Speichers, einer Karte verwendet, um die Interpretation für die Anzeige zu steuern. Ohne diese Symbolinformationen können Sie in einem Low-Level-Debugger Folgendes angeben: Diese Adresse als 16-Bit-Wörter anzeigen, diese Adresse als langen Gleitkommawert als Zeichenfolgen anzeigen ... wie auch immer. Bei einem Netzwerk-Packet-Dump oder einem unbekannten Dateiformat ist es eine Herausforderung, das Rätsel zu lösen.
Dies ist eine wichtige Quelle für Leistung und Flexibilität in der modernen Computerarchitektur: Eine Speicherzelle kann alles , Daten oder Befehle, bedeuten , die nur implizieren, was sie für das Programm bedeutet, was sie mit dem Wert tut und wie sich dies auf nachfolgende Operationen auswirkt. bedeutung ist tiefer als ganzzahlige breite: sind diese zeichen ... zeichen in ascii oder ebcdic? Bilden Sie Wörter in Englisch oder SQU-Produktcodes? Die zu sendende Adresse oder die Absenderadresse? Die Interpretation der untersten Ebene (logische Bits; ganzzahlig, vorzeichenbehaftet oder vorzeichenlos; float; bcd; pointer) ist auf Befehlssatzebene kontextbezogen, aber Sie sehen, dass auf einer bestimmten Ebene alles Kontext ist: das to Adresse aufgrund der Position auf dem Umschlag so ist, wie sie ist. Es steht im Zusammenhang mit den Regeln des Postboten, nicht der CPU. Der Kontext ist ein großes Kontinuum, an dessen einem Ende sich Teile befinden.
※ Footnote: The DAA instruction is encoded as a byte
00100111
. So that byte is the aforenamed instruction if read in the instruction stream, and the digits27
if interpreted as bcd digits, and 0x27 = 39 as an integer, which is the numeral 9 in ASCII, and part of the interrupt table (half of INT 13 2-byte address, used for BIOS service routines).quelle
The only way the computer knows that a memory location is an instruction is that a special-purpose register called the instruction pointer points to them at one point or another. If the instruction pointer points to a memory word, it is loaded as an instruction. Other than that, the computer has no way of knowing the difference between programs and other types of data.
quelle