TI/Zera i jedynki
TI/ Zera i jedynki
Opisana w poprzednim rozdziale możliwość korekcji błędów zmieniła świat:
- w dużej mierze przestało istnieć pojęcie kopii i oryginału: dzięki sumom kontrolnym możemy mieć pewność, że (jeśli program kopiujący nie zgłosił błędów) kopia jest dokładnie jednakowa z oryginałem: te same bity mogą być utrwalone na innym nośniku, ale ich znaczenie — obraz, dźwięk, wideo czy tekst — są dokładnie takie same, jak w oryginale
- transmisja i przechowywanie informacji mogą opierać się na nieporównywalnie tańszych realizacjach niż w przypadku analogowym: nawet jeśli dane operacj bankowej obciążającej kartę kredytową przesyłamy zaszumioną linią telefoniczną, błędy w transmisji nie spowodują na przykład obciążenia cudzego konta. Po wykryciu błędu transmisja będzie powtarzana tak długo, aż zgodzą się sumy kontrolne, dopóki nie zrezygnujemy (my lub algorytm).
Żeby z tych dobrodziejstw korzystać, trzeba było opracować efektywny sposób zapisywania liczb. W naszym świecie zdecydowanie króluje zapis dwójkowy (binarny). Można powiedzieć, że współczesne komputery "rozumują" w najprostszych z możliwych kategorii:
- namagnesowane/rozmagnesowane (fragment powierzchni dysku lub dyskietki),
- prąd płynie/nie płynie (we wnętrznościach komputera podczas pracy),
- światło odbija się lub nie (od powierzchni płyty CD-ROM).
Czyli ogólnie jest/nie ma, albo 1/0. Z jedynek i zer możemy złożyć dowolną liczbę, choćby dodając jedynki i pomijając zera. Można to zrobić znacznie efektywniej — kod dwójkowy za pomocą ośmiu zer-lub-jedynek (bitów) pozwala zapisać liczbę całkowitą od 0 do 255. Działa to podobnie jak kod dziesiątkowy, w którym zapisujemy liczby na co dzień.
Kod dwójkowy (inaczej binarny) to pozycyjny system liczbowy, w którym podstawą pozycji są kolejne potęgi liczby 2. Do zapisu liczb potrzebne są więc tylko dwa znaki: 0 i 1. Jak w każdym pozycyjnym systemie liczbowym, liczby zapisuje się tu jako ciąg cyfr, z których każda jest mnożnikiem kolejnej potęgi liczby stanowiącej podstawę systemu. Np. liczba zapisana w dziesiętnym systemie liczbowym jako 27, w systemie dwójkowym przybiera postać 11011, gdyż:
[math](11011)_2 = 1*2^4 1*2^3 + 0*2^2 + 1*2^1 + 1*2^0 = 16 + 8 + 0 + 2 + 1 = 27[/math]
Zapamiętajmy: liczba 27 nie jest zapisywana jako dwa znaki "dwa" i "siedem", tylko w postaci pięciu bitów, które wizualizujemy jako 11011, ale fizycznie mogą odpowiadać np. różnym poziomom napięcia, namagnesowania czy odbijania światła.
Z przyczyn technicznych komputery operują na ciągach bitów o ściśle określonej długości, tzw. słowach maszynowych. Pierwsze popularne komputery były jako 8-bitowe, czyli długość słowa maszynowego w ich architekturze wynosiła 8 bitów, inaczej jeden bajt. Współczesne komputery używają słów 64-bitowych, czyli w naturalny sposób możemy w nich przechowywać i przesyłać liczby całkowite od zera do 264-1 = 18446744073709551615. Jeśli chcemy korzystać z liczb ujemnych, jeden bit musimy zarezerwować na znak, i dostajemy zakres od -263-1 do 263-1.
Zarezerwowanie na liczbę określonej liczby bitów może prowadzić do kłopotów, gdy np. w wyniku mnożenia dostaniemy liczbę spoza zarezerwowanego zakresu. Wtedy w programie może pojawić się trudny do znalezienia błąd — na przykład możemy niechcący zmienić wartości następnych komórek pamięci w nieoczekiwany sposób. Na szczęście Python liczby całkowite zapisuje w taki sposób, że ograniczeniem jest tylko pojemność pamięci.
>>> pow(2,200) 1606938044258990275541962092341162602522202993782792835301376
Liczby zmiennoprzecinkowe...
>>> import sys; sys.float_info.max 1.7976931348623157e+308 >>> sys.float_info.min 2.2250738585072014e-308
ASCII i Unicode
Do niedawna standardem był ASCII (American Standard Code for Information Interchange), aktualnie rozszerzony do Unicode.
Jedna litera to w ASCII jeden bajt. Bajt to osiem bitów, czyli liczba między 0 a 255. Tablica ASCII (rys. 1) kończy się przed numerem 127. Za to brak tam ąćęłń... Nawet jeśli pominiemy pierwsze 32 znaki (są tam różne dziwne kody), pozostaje nam jeszcze druga połowa. Niestety, znaki wszystkich alfabetów narodowych nie zmieszczą się tam (tj. między 128 a 255) "za jednym razem". Dlatego dla różnych języków istnieją różne kodowania, czyli numeracje liter spoza ASCII. Dla języka polskiego obowiązującym w Internecie standardem jest ISO3.4 8859-2. Zawiera on litery wystarczające do pisania (poza angielskim) w językach: Albanii, Bośni, Chorwacji, Czech, Finlandii, Węgier, Polski, Rumunii, Serbii, Słowacji i Słowenii. Wystarczają do tego (poza znakami z tablicy ) następujące znaki:
Jako ciekawostkę zanotować warto, że w pionierskim okresie "polonizacji" komputerów mieliśmy ok. 10 różnych "standardów" kodowania polskich liter, co jest chyba swego rodzaju rekordem. Aktualnie poza ISO 8859-2 spotkać można jeszcze kodowanie używane w produktach firmy Microsoft — Windows-1250.
Dlatego też, aby prawidłowo wyświetlać tekst napisany w języku innym niż angielski, musimy:
- wiedzieć, w jakim standardzie zakodowane są litery spoza ASCII,
- mieć czcionkę (font) z literami danego języka, umieszczonymi w odpowiednich miejscach.
Właśnie wtedy, gdy nie jest spełniony któryś z tych warunków — czasem po przeniesieniu tekstu do innego komputera — w miejsce ąćęł... pojawiają się czasami dziwne "krzaczki" albo znaki z zupełnie innych alfabetów. Pomysł na globalne i ostateczne rozwiązanie tego problemu jest prosty: jeśli 255 to za mało, zarezerwujmy tyle miejsca, aby starczyło na litery wszystkich alfabetów naraz i ustalmy jeden globalny standard!
Ten standard już isnieje — nazywa się UNICODE. Jego podstawą jest baza ponad 100 000 znaków z kilkudziesięciu różnych skryptów (w uproszczeniu alfabetów). Trzeba było wielu lat pracy przedstawicieli wielu krajów świata by skatalogować znaki (litery) używane w alfabetach greckim, rzymskim, hebrajskim, cyrylicy, devangari,... Prawdziwym wyzwaniem są oczywiście chińskie ideogramy — obecnie w bazie Unicode opisano ich ponad 80 000.
Każdy znak z bazy Unicode ma swój numer i zapis tekstu w Unicode'zie oznacza po prostu zapisanie tych liczb. Istnieje parę sposobów takiego zapisu - najprostszy z nich to poprostu zapis znaków jako 32 bitowych liczb (UTF-32). Jego wadą jest marnotrastwo miejsca. Aby zmiejszyć objętość takiego zapisu stosuje się również bardziej skompilowane sposoby zapisu w których stosuje się różną liczbę bitów w zależności od znaku. Np. w zapisie zwanym UTF-8, najbardziej popularne znaki (o małych numerach) zajmują jeden bajt (czyli 8 bitów), a inne od 2 do 4 bajtów (czyli od 16 do 32 bitów).
Niestety, zanim ten standard uratuje cyfrową wieżę Babel, komputery (a tak naprawdę systemy operacyjne i programy) muszą "zmienić swój sposób myślenia" o literach — wszak dotychczas jedna litera to był jeden bajt, a nie dwa lub więcej! No i dopiero powstają czcionki ze znakami wszystkich skryptów naraz: cyrylicy, hebrajskiego, chińskiego...
Rodzaje plików: pliki z danymi (tekstowe i binarne) i programy
Co to jest plik (file)? Ciąg zer i jedynek (bitów), za pomocą którego zapisano dowolną informację — na dysku, dyskietce, płycie CD-ROM czy taśmie. Warto sobie uświadomić ten fakt dokładnie: każdy plik jest nieprzerwanym ciągiem zer i jedynek i niczym więcej — bez odstępów, "opisów", ani żadnej dodatkowej informacji, która mówiłaby nam, jak dany plik odczytywać. Dlatego też, w celu poprawnego odczytania, musimy przynajmniej wiedzieć, z jakiego rodzaju plikiem mamy do czynienia.
Rozróżniamy przede wszystkim dwa rodzaje plików: tekstowe i binarne. Nazwy są trochę mylące, bo wszystkie pliki są binarne, czyli zero-jedynkowe. Jednak pliki tekstowe zajmują wśród nich wyróżnioną pozycję, sposób ich odczytywania jest bowiem najbardziej w świecie komputerów rozpowszechnionym standardem. Znajdują się w nich litery, zamienione na bity według przepisu z rozdziałów Zera i jedynki i Ponumerować litery. Zapisany w ten sposób plik można odczytać na dowolnym komputerze, niezależnie od systemu operacyjnego itp. W dodatku odczytać możemy tu rozumieć dosłownie, gdyż po zamianie bitów na litery (czyli wyświetleniu pliku ASCII) pojawia się tekst, zwykle zrozumiały dla człowieka. Może nie zawsze całkiem zrozumiały, ale przynajmniej powinniśmy zgadnąć, czy jest to sprawozdanie, list, tekst strony WWW czy kod źródłowy programu.
Ale nie wszystko najwygodniej opisywać literami — na przykład
obrazy. W tym przypadku bity interpretujemy zupełnie inaczej —
jako liczby opisujące kolory kolejnych maleńkich fragmentów obrazu
(pikseli). Ale po samych bitach nie rozróżnimy, czy opisują tekst, czy
obraz! Dlatego musimy (my lub korzystające z plików programy, czyli w
tym przypadku edytory tekstów lub programy graficzne) wiedzieć,
jakiego typu informacja znajduje się w pliku i jak ją interpretować. W
przeciwnym razie, jeśli liczby opisujące obraz będziemy chcieli
interpretować jako tekst (wczytując do edytora tekstów), dostaniemy
bezsensowną sekwencję typu *5&^%\U)(&^%$
.
Ogólnie, pliki binarne to wszystkie pliki nietekstowe. Mogą zawierać obrazy, dźwięki, filmy lub dowolne dane. Jeśli zapisano je w jednym z ogólnie przyjętych standardów, to zwykle daje się je odczytać (czyli sensownie wyświetlić lub odegrać) na większości komputerów, jeśli tylko zainstalowano na nich odpowiednie programy.
Plik może też zawierać program komputerowy — wtedy zrozumiały
jest tylko dla tego systemu operacyjnego, dla którego przeznaczony
jest program. Na przykład program napisany dla MS Windows (którego
nazwa kończy się zwykle na .exe
) można uruchomić na
każdym komputerze z (odpowiednią wersją) MS Windows. Nie da się go
uruchomić pod żadnym innym systemem operacyjnym, np. MacOS czy
GNU/Linux. Standardowe formaty plików graficznych, muzycznych, no i
oczywiście tekstowych, powinny dać się wyświetlić na większości
komputerów (jeśli zainstalowano odpowiednie programy).
Program może czasem po prostu odtwarzać film czy animację. Dla użytkowników tego samego systemu będzie on łatwiejszy do odtworzenia od zapisu filmu w którymś ze standardowych formatów (np. star.avi, *.mpg), gdyż nie wymaga, żeby na komputerze był zainstalowany program obsługujący dany format. Ale, szczególnie w MS Windows, odtwarzanie takich programów, "znalezionych" w Internecie czy otrzymanych od znajomych pocztą elektroniczną, niesie ze sobą niebezpieczeństwo uszkodzenia systemu przez wirus, którym program może być zainfekowany (problem ten opisano bliżej w rozdziale 4.4). Warto zapamiętać, że przesyłając pocztą niewinnie zabawne "programiki", możemy narazić adresata na utratę danych (chyba, że pracuje w innym systemie operacyjnym i po prostu nie będzie mógł programu uruchomić).
Plik może też zawierać dane zapisane przez jakiś program w formacie niezgodnym z żadnym powszechnym standardem. Wtedy do ich odczytania potrzebny jest ten właśnie program (lub inny, potrafiący importować, czyli wczytywać, zapisane przez ten program dane). Dotyczy to również tekstów. Gdybyśmy pozostali przy treści, czyli samym tekście, wystarczyłby standard ASCII. Jednak coraz częściej nad treścią dominuje forma — w najprostszym liście trafia się nawet kilka różnych czcionek. Informacja o rozmiarach i rodzajach czcionek, jak również rozmieszczeniu tekstu na stronie, nie doczekała się standardowego formatu zapisu — producent każdego programu uważa swój format za jedynie słuszny. Jedynym dość rozpowszechnionym standardem jest oparty na ASCII rich text format (pliki *.rtf), jednak nie daje on tylu możliwości udziwniania tekstu, jak niestandardowe formaty różnych programów, stąd ograniczona popularność.
Ten sam ciąg bitów można interpretować na różne sposoby; na przykład 01000011010011110011111100111111
można odczytać jako:
odczyt | interpretacja |
---|---|
01000011010011110011111100111111
|
trzydzieści dwa bity |
0.747303187847137451
|
liczba rzeczywista (32-bitowa) |
67 79 63 63
|
cztery liczby całkowite (8-bitowe) |
C O ? ?
|
litery (ASCII) |
0100001101001111 0011111100111111
|
dwie „paczki" po szesnaście bitów |
20291 16191
|
dwie liczby całkowite (16-bitowe) |
Skoro z samych bitów trudno zgadnąć rodzaj pliku, pozostaje
wykorzystać do tego celu nazwę. Końcowa część nazwy pliku, tradycyjnie
oddzielana kropką, jest zwykle przeznaczona do określenia jego
typu. Na przykład w nazwie sprawozdanie_z_maja.txt
człon
.txt
, czyli rozszerzenie nazwy, oznacza typ pliku
(tekstowy, zwykle ASCII). Właściwa nazwa, która powinna kojarzyć się z
zawartością, to sprawozdanie_z_maja
. Pliki z
rozszerzeniem txt
określamy często jako
*.txt
, gdzie *
zastępuje dowolny ciąg
znaków.
Rozszerzenia plików mogą być przez system kojarzone z konkretnymi programami, zdolnymi do wyświetlania i/lub edycji plików danego formatu. Stąd często kliknięcie pliku, którego rozszerzenie jest przez system skojarzone z obsługującym ten typ programem, wystarcza do uruchomienia odpowiedniego programu i otwarcia pliku.
Niektóre standardowe rozszerzenia nazw plików
pliki tekstowe *.txt, *.asc obrazy *.jpg, *.jpeg, *.gif, *.bmp, *.pcx, *.png wideo *.mpg, *.mpeg, *.avi dźwięk *.mp3, *.wav, *.au, *.mid pliki TeX i LaTeX *.tex źródlła programów *.c, *.pas, *.java... pliki WWW *.html, *.htm programy MS Windows *.exe Portable Document Format *.pdf archiwa skompresowanych plików *.zip, *.rar, *.arj, *.gz, *.tgz, *.Z, *.tar.Z pliki edytora tekstóm MS Word *.doc, *.docx MS Excel (arkusz kalkulacyjny) *.xls, *.xlw