Verder Terug Inhoud

10. Hoe bewaart mijn computer zaken in het geheugen?

Waarschijnlijk weet je al dat alles op een computer als een reeks bits (binary digits) wordt bewaard; je kunt je dit voorstellen als een heleboel aan- en uitschakelingen). We zullen hier uitleggen hoe deze bits worden gebruikt om de letters en nummers weer te geven.

Voordat we hier op in kunnen gaan, moet je enig begrip hebben van de woordgrootte van je computer. De woordgrootte is de voorkeursgrootte van je computer voor het manoeuvreren van eenheden informatie; technisch gezien is het de lengte van de registers van je processor, wat de opslaggebieden zijn die je processor gebruikt voor de arithmetische en logische berekeningen. Dit is wat mensen bedoelen, als ze schrijven over computers met bit-grootte (waarbij ze het hebben over, bijvoorbeeld ``32-bit'' of ``64-bit''computers).

De meeste computers (waaronder 386, 486, Pentium en Pentium II PC's) hebben een woordgrootte van 32 bits. De oude 286 computers hadden een woordgrootte van 16. Mainframes van de oude stijl hadden vaak 36-bit woorden. Een paar processors (zoals de Alpha welke van DEC was en nu van Compaq) hebben 64-bit woorden. Het 64-bit woord zal de volgende vijf jaar meer algemeen worden; Intel is van plan de Pentium II door een 64-bit chip met als codenaam `Merced', en nu officieel genaamd de `Itanium', te vervangen.

De computer ziet je geheugen als een reeks woorden genummerd van 0 tot één of ander groot nummer, waarvan de waarde afhankelijk is van de grootte van je geheugen. Die waarde is beperkt door je woordgrootte. Daarom moeten oudere computers, zoals 286'rs, zich door moeizame bochten wringen om grote hoeveelheden geheugen te adresseren. Ik zal ze hier niet beschrijven; ze bezorgen oudere programmeurs nog steeds nachtmerries.

10.1 Getallen

Getallen worden voorgesteld als woorden of stel woorden, afhankelijk van de woordgrootte van je processor. Een 32-bit computerwoord is de meest algemene grootte.

Rekenkunde van gehele getallen (arithmetic integer) nadert, maar heeft niet werkelijk een mathematisch grondtal twee. Het minst significante bit is 1, vervolgens 2, dan 4 enzovoort als in zuiver binair. Maar nummers met een teken worden voorgesteld in twee-complement notatie. Het meest significante bit is een tekenbit welke de kwantiteit negatief maakt, en ieder negatief nummer kan worden verkregen uit de corresponderende positieve waarde door alle bits om te draaien. Daarom komen integers op een 32-bit computer voor in het bereik -2^31 +1 tot 2^31 -1 (waar ^ de `machts'-bewerking , 2^3=8 is). Het 32e bit wordt gebruikt voor het teken.

Een aantal computertalen geeft je toegang tot unsigned arithmetic (rekenkunde zonder teken) welke is gebaseerd op grondtal 2, met verder alleen positieve nummers en nul.

De meeste processors en een aantal programmeertalen kunnen omgaan met floating-point getallen (deze mogelijkheid is in alle recente processor-chips ingebouwd). Floating-point getallen geven je een veel breder bereik aan waarden dan gehele getallen (integers) en geven je de mogelijkheid breuken uit te laten drukken. De wijze waarop dit wordt gedaan verschilt en is te gecompliceerd om hier in detail te bespreken, maar in het algemeen lijkt 't veel op de zogenoemde `wetenschappelijke notatie', waarbij men op zou kunnen schrijven 1.234 * 10^23; de codering van het getal is geplitst in een mantisse (1.234) en een exponent (23) voor een macht tot de tiende vermenigvuldiging.

10.2 Tekens

Tekens worden normaal geproken voorgesteld door een string van zeven bits, gecodeerd in het zogenoemde ASCII (American Standard Code for Information Interchange). Op moderne computers, bestaat ieder van de 128 ASCII-tekens uit de laagste zeven bits van een 8-bit octet; octets zijn verpakt in geheugenwoorden, zodat (bijvoorbeeld) een string van zes tekens slechts twee geheugenwoorden in beslag kan nemen. Typ `man 7 ascii' achter je Unix-prompt, voor een ASCII-code tabel.

De voorgaande paragraaf was op twee manieren misleidend. De minst belangrijke is dat de term `octet' formeel correct is, maar in feite zelden wordt gebruikt; de meeste mensen refereren naar een octet als een byte en verwachten dat een byte acht bits groot is. Strikt genomen, is de term `byte' algemener; er waren bijvoorbeeld 36-bit computers met 9-bit bytes (alhoewel die er waarschijnlijk nooit meer zullen zijn).

Het belangrijkste is dat niet iedereen in de wereld ASCII gebruikt. In feite kan niet iedereen in de wereld gebruik maken van ASCII. Hoewel het prima werkt voor Amerikaans-Engels, ontbreken er veel geaccentueerde letters en andere speciale tekens in die gebruikers van andere talen nodig hebben. Zelfs Britisch-Engels heeft er problemen mee dat er een pound-teken in ontbreekt om geldbedragen mee uit te drukken.

Er zijn verscheidene pogingen ondernomen iets aan dit probleem te doen. Allen maken gebruik van het extra hoge bit dat ASCII niet heeft, waarbij ASCII wordt gemaakt tot de lage helft van een 256-character set. Het meest gebruikte hiervan is de zogenoemde `Latin 1' chararacter set (wat formeler met de naam ISO 8859-1). Dit is de standaard character set voor Linux, HTML, en X. Microsoft Windows maakt gebruik van een gewijzigde Latin-1. Hieraan zijn een boel tekens toegevoegd, zoals de rechter en linker dubbele aanhalingstekens op plaatsen van de originele Latin-1, die om historische redenen niet zijn ingevuld. Zie de demoroniser page voor de problemen die dit veroorzaakt).

Latin-1 omvat de meeste Europese talen, waaronder Engels, Frans, Duits, Spaans, Italiaans, Nederlands, Norweegs, Zweeds, Deens. Dit is echter ook nog niet voldoende, en als resultaat is er een hele serie Latin-2 tot Latin-9 character sets voor zaken zoals Grieks, Arabisch, Hebreeuws, Spaans en Serbo-Kroatisch. Zie de ISO alphabet soup page voor details.

De laatste oplossing is een zeer grote standaard genaamd Unicode (en z'n identieke tweeling ISO/IEC 10646-1:1993). Unicode is identiek aan Latin-1 in z'n laagste 256 slots. Hierboven bevat het in 16-bit ruimte Grieks, Cyrillisch, Armeens, Hebreeuws, Arabisch, Devanagari, Bengaals, Gurmukhi, Gujarati, Oriya, Tamils, Telugu, Kannada, Malayalam, Thaais, Lao, Georgiaans, Tibetaans, Japanees-Kana, de volledige set met moderne Koreaanse Hangul, en een éénduidige set met Chinese/Japanese/Koreaanse (CJK) ideogrammen. Zie de Unicode Home Page voor details.


Verder Terug Inhoud