Profesjonalne programowanie. Część 1. Zrozumieć komputer - Helion
Tytuł oryginału: Write Great Code. Volume 1: Understanding the Machine
Tłumaczenie: Tomasz Żmijewski
ISBN: 83-7361-859-7
stron: 392, Format: B5, okładka: twarda
Data wydania: 2005-08-18
Księgarnia: Helion
Cena książki: 49,00 zł
Chcesz zostać programistą doskonałym?
Zacznij od poznania szczegółów działania komputera
- Zapis wartości liczbowych oraz arytmetyka zmiennoprzecinkowa i binarna
- Organizacja dostępu do pamięci komputera
- Proces wykonywania programu oraz operacje wejścia i wyjścia
Kod napisany przez profesjonalnego programistę jest wydajny i efektywny. Aby tworzyć wydajny kod, należy poznać architekturę komputera i sposób, w jaki program jest wykonywany. Zrozumienie tego, w jaki sposób komputer realizuje kolejne instrukcje programu i jak słowa kluczowe języków wysokiego poziomu są przenoszone na rozkazy procesora, jest kluczem do napisania kodu, który po skompilowaniu da szybko i bezbłędnie działający program.
"Profesjonalne programowanie. Część 1. Zrozumieć komputer" to pierwszy tom serii książek przeznaczonych dla tych programistów, którzy chcą podnieść swoje kwalifikacje. Przedstawia wewnętrzną architekturę komputera od strony, której znajomość jest niezbędna programiście. Opisuje sposoby zapisu wartości liczbowych i tekstów, działania na liczbach binarnych i zmiennoprzecinkowych oraz logikę Boole'a. Czytając tę książkę, dowiesz się, w jaki sposób procesor przetwarza rozkazy asemblera, jak odbywa się dostęp do danych zapisanych w pamięci oraz jak przesyłane są dane do i z urządzeń zewnętrznych.
- Zapis liczb w systemie binarnym, ósemkowym i szesnastkowym
- Działania na liczbach binarnych i zmiennoprzecinkowych
- Sposoby reprezentacji danych znakowych
- Organizacja pamięci i tryby adresowania
- Złożone typy danych
- Projektowanie układów cyfrowych i logika Boole'a
- Architektura procesora i rozkazy asemblera
- Operacje wejścia i wyjścia
Jeśli chcesz, aby napisane przez Ciebie oprogramowanie budziło podziw, koniecznie przeczytaj tę książkę.
Osoby które kupowały "Profesjonalne programowanie. Część 1. Zrozumieć komputer", wybierały także:
- Zosta 149,00 zł, (44,70 zł -70%)
- Metoda dziel i zwyci 89,00 zł, (26,70 zł -70%)
- Matematyka. Kurs video. Teoria dla programisty i data science 399,00 zł, (119,70 zł -70%)
- Design Thinking. Kurs video. My 129,00 zł, (38,70 zł -70%)
- Konwolucyjne sieci neuronowe. Kurs video. Tensorflow i Keras w rozpoznawaniu obraz 149,00 zł, (44,70 zł -70%)
Spis treści
Profesjonalne programowanie. Część 1. Zrozumieć komputer -- spis treści
Podziękowania (9)
Rozdział 1. Co trzeba wiedzieć o programowaniu doskonałym (11)
- 1.1. Seria książek "Profesjonalne programowanie" (11)
- 1.2. O czym jest ta książka (12)
- 1.3. Wymagania wobec Czytelnika (15)
- 1.4. Cechy kodu doskonałego (15)
- 1.5. Wymagane środowisko (16)
- 1.6. Dalsze informacje (17)
Rozdział 2. Zapis liczb (19)
- 2.1. Czym jest liczba? (19)
- 2.2. Systemy liczbowe (20)
- 2.2.1. Dziesiętny pozycyjny system liczbowy (21)
- 2.2.2. Podstawa (22)
- 2.2.3. Binarny system liczbowy (23)
- 2.2.4. Szesnastkowy system liczbowy (24)
- 2.2.5. Liczby ósemkowe (26)
- 2.3. Konwersja między liczbą a tekstem (28)
- 2.4. Zapis liczb całkowitych (29)
- 2.4.1. Bity (29)
- 2.4.2. Łańcuchy bitowe (30)
- 2.5. Liczby ze znakiem i bez znaku (32)
- 2.6. Pewne przydatne cechy liczb binarnych (34)
- 2.7. Rozszerzenie znakiem, uzupełnienie zerami i zawężenie (35)
- 2.8. Nasycenie (38)
- 2.9. Zapis dziesiętny kodowany binarnie (BCD) (39)
- 2.10. Zapis stałopozycyjny (40)
- 2.11. Skalowane formaty liczbowe (43)
- 2.12. Zapis wymierny (45)
- 2.13. Więcej informacji (45)
Rozdział 3. Arytmetyka binarna i działania na bitach (47)
- 3.1. Działania arytmetyczne na liczbach dwójkowych i szesnastkowych (47)
- 3.1.1. Dodawanie wartości binarnych (48)
- 3.1.2. Odejmowanie liczb binarnych (49)
- 3.1.3. Mnożenie wartości binarnych (50)
- 3.1.4. Dzielenie wartości binarnych (51)
- 3.2. Operacje logiczne na bitach (52)
- 3.3. Operacje logiczne na liczbach binarnych i ciągach bitów (54)
- 3.4. Przydatne operacje bitowe (55)
- 3.4.1. Sprawdzanie poszczególnych bitów łańcucha za pomocą operatora AND (55)
- 3.4.2. Sprawdzanie, czy grupa bitów zawiera same zera (56)
- 3.4.3. Porównywanie zestawu bitów z łańcuchem binarnym (56)
- 3.4.4. Tworzenie liczników modulo n za pomocą operacji AND (57)
- 3.5. Przesunięcia i rotacje (58)
- 3.6. Pola bitowe i pakowanie danych (61)
- 3.7. Pakowanie i rozpakowywanie danych (64)
- 3.8. Więcej informacji (68)
Rozdział 4. Zapis zmiennopozycyjny (69)
- 4.1. Wprowadzenie do arytmetyki zmiennopozycyjnej (69)
- 4.2. Formaty zmiennopozycyjne IEEE (74)
- 4.2.1. Zmiennopozycyjny format pojedynczej precyzji (75)
- 4.2.2. Format zmiennopozycyjny o podwójnej precyzji (77)
- 4.2.3. Format zmiennopozycyjny zwiększonej precyzji (77)
- 4.3. Normalizacja i wartości nienormalizowane (78)
- 4.4. Zaokrąglanie (79)
- 4.5. Specjalne wartości zmiennopozycyjne (80)
- 4.6. Wyjątki obliczeń zmiennopozycyjnych (82)
- 4.7. Działania zmiennopozycyjne (82)
- 4.7.1. Zapis liczb zmiennopozycyjnych (83)
- 4.7.2. Dodawanie i odejmowanie zmiennopozycyjne (83)
- 4.7.3. Mnożenie i dzielenie zmiennopozycyjne (93)
- 4.8. Więcej informacji (99)
Rozdział 5. Dane znakowe (101)
- 5.1. Dane znakowe (101)
- 5.1.1. Zestaw znaków ASCII (101)
- 5.1.2. Zestaw znaków EBCDIC (104)
- 5.1.3. Dwubajtowe zestawy znaków (105)
- 5.1.4. Zestaw znaków Unicode (106)
- 5.2. Łańcuchy znakowe (108)
- 5.2.1. Formaty łańcuchów znakowych (108)
- 5.2.2. Rodzaje łańcuchów - statyczne, pseudodynamiczne i dynamiczne (112)
- 5.2.3. Zliczanie odwołań do łańcucha (114)
- 5.2.4. Łańcuchy w Delphi i Kyliksie (114)
- 5.2.5. Tworzenie własnych formatów łańcuchów (115)
- 5.3. Zbiory znaków (115)
- 5.3.1. Zbiory znaków w formie zbioru przynależności (115)
- 5.3.2. Listowa reprezentacja zbiorów znaków (117)
- 5.4. Definiowanie własnego zestawu znaków (117)
- 5.4.1. Tworzenie wydajnego zestawu znaków (118)
- 5.4.2. Grupowanie znaków odpowiadających cyfrom (120)
- 5.4.3. Grupowanie liter (120)
- 5.4.4. Porównywanie liter (122)
- 5.4.5. Inne grupowania znaków (123)
- 5.5. Dodatkowe informacje (124)
Rozdział 6. Organizacja pamięci i dostęp do niej (127)
- 6.1. Podstawowe elementy systemu (127)
- 6.1.1. Magistrala systemowa (128)
- 6.2. Fizyczna organizacja pamięci (130)
- 6.2.1. 8-bitowe magistrale danych (132)
- 6.2.2. 16-bitowe magistrale danych (133)
- 6.2.3. 32-bitowe magistrale danych (134)
- 6.2.4. Magistrale 64-bitowe (136)
- 6.2.5. Dostęp do pamięci w procesorach innych niż 80x86 (136)
- 6.3. Kolejność bajtów (136)
- 6.4. Zegar systemowy (141)
- 6.4.1. Dostęp do pamięci a zegar systemowy (142)
- 6.4.2. Stany oczekiwania (143)
- 6.4.3. Pamięć podręczna (145)
- 6.5. Dostęp procesora do pamięci (148)
- 6.5.1. Bezpośredni tryb adresowania pamięci (149)
- 6.5.2. Tryb adresowania pośredniego (149)
- 6.5.3. Tryb adresowania indeksowanego (150)
- 6.5.4. Skalowane indeksowane tryby adresowania (151)
- 6.6. Dodatkowe informacje (151)
Rozdział 7. Złożone typy danych i obiekty w pamięci (153)
- 7.1. Typy wskaźnikowe (153)
- 7.1.1. Implementacja wskaźników (154)
- 7.1.2. Wskaźniki i dynamiczna alokacja pamięci (155)
- 7.1.3. Działania na wskaźnikach - arytmetyka wskaźników (155)
- 7.2. Tablice (159)
- 7.2.1. Deklaracje tablic (160)
- 7.2.2. Reprezentacja tablic w pamięci (162)
- 7.2.3. Dostęp do elementów tablicy (163)
- 7.2.4. Tablice wielowymiarowe (164)
- 7.3. Rekordy (struktury) (170)
- 7.3.1. Rekordy w Pascalu i Delphi (170)
- 7.3.2. Rekordy w C i C++ (171)
- 7.3.3. Rekordy w HLA (171)
- 7.3.4. Zapis rekordów w pamięci (171)
- 7.4. Unie (174)
- 7.4.1. Unie w C i C++ (174)
- 7.4.2. Unie w Pascalu, Delphi i Kyliksie (174)
- 7.4.3. Unie w asemblerze HLA (175)
- 7.4.4. Unie w pamięci (176)
- 7.4.5. Inne zastosowania unii (176)
- 7.5. Dodatkowe informacje (177)
Rozdział 8. Logika boolowska i projektowanie cyfrowe (179)
- 8.1. Algebra Boole'a (179)
- 8.1.1. Operatory boolowskie (179)
- 8.1.2. Prawa algebry boolowskiej (180)
- 8.1.3. Priorytety operatorów boolowskich (181)
- 8.2. Funkcje logiczne i tabele prawdy (182)
- 8.3. Numery funkcji (183)
- 8.4. Algebraiczne przekształcanie wyrażeń logicznych (185)
- 8.5. Formy kanoniczne (186)
- 8.5.1. Forma kanoniczna sumy termów minimalnych a tabele prawdy (187)
- 8.5.2. Algebraiczne wyprowadzanie formy kanonicznej sumy termów minimalnych (189)
- 8.5.3. Forma kanoniczna jako iloczyn termów maksymalnych (189)
- 8.6. Upraszczanie funkcji logicznych (190)
- 8.7. Ale co to wszystko ma wspólnego z komputerami? (197)
- 8.7.1. Równoważność układów elektronicznych i funkcji logicznych (198)
- 8.7.2. Obwody złożone (199)
- 8.7.3. Sterowanie sekwencyjne i zegarowe (204)
- 8.8. Dodatkowe informacje (208)
Rozdział 9. Architektura procesora (209)
- 9.1. Podstawy budowy procesora (209)
- 9.2. Dekodowanie i wykonywanie instrukcji - logika przypadku a mikrokod (211)
- 9.3. Wykonywanie instrukcji krok po kroku (213)
- 9.3.1. Instrukcja mov (213)
- 9.3.2. Instrukcja add (215)
- 9.3.3. Instrukcja jnz (217)
- 9.3.4. Instrukcja loop (218)
- 9.4. Równoległość - klucz do przyspieszenia (218)
- 9.4.1. Kolejka wstępnego pobrania (222)
- 9.4.2. Okoliczności ograniczające wydajność kolejki wstępnego pobrania (225)
- 9.4.3. Potoki - jednoczesne wykonywanie wielu instrukcji (226)
- 9.4.4. Bufory instrukcji - wiele dróg do pamięci (230)
- 9.4.5. Zagrożenia związane z potokami (231)
- 9.4.6. Działanie superskalarne - równoległe wykonywanie instrukcji (233)
- 9.4.7. Wykonywanie kodu bez zachowania kolejności (235)
- 9.4.8. Zmiana nazw rejestrów (235)
- 9.4.9. Architektura z bardzo długim słowem instrukcji (VLIW) (236)
- 9.4.10. Przetwarzanie równoległe (237)
- 9.4.11. Wieloprocesorowość (238)
- 9.5. Dodatkowe informacje (239)
Rozdział 10. Konstrukcja zbioru instrukcji (241)
- 10.1. Dlaczego projekt zbioru instrukcji jest ważny (241)
- 10.2. Podstawowe cele projektowe zestawu instrukcji (243)
- 10.2.1. Dobór długości kodu instrukcji (245)
- 10.2.2. Plany na przyszłość (247)
- 10.2.3. Dobór instrukcji (247)
- 10.2.4. Przypisywanie instrukcjom kodów (248)
- 10.3. Hipotetyczny procesor Y86 (248)
- 10.3.1. Ograniczenia Y86 (249)
- 10.3.2. Instrukcje Y86 (249)
- 10.3.3. Tryby adresowania Y86 (251)
- 10.3.4. Kodowanie instrukcji Y86 (252)
- 10.3.5. Przykłady kodowania instrukcji Y86 (254)
- 10.3.6. Rozszerzanie zbioru instrukcji Y86 (257)
- 10.4. Kodowanie instrukcji 80x86 (259)
- 10.4.1. Kodowanie operandów instrukcji (260)
- 10.4.2. Kodowanie instrukcji add - kilka przykładów (266)
- 10.4.3. Stałe jako operandy (268)
- 10.4.4. Kodowanie operandów 8-, 16- i 32-bitowych (269)
- 10.4.5. Alternatywne kodowanie instrukcji (270)
- 10.5. Znaczenie projektu zbioru instrukcji dla programisty (270)
- 10.6. Więcej informacji (271)
Rozdział 11. Architektura pamięci i jej organizacja (273)
- 11.1. Hierarchia pamięci (273)
- 11.2. Jak działa hierarchia pamięci (276)
- 11.3. Względna wydajność podsystemów pamięci (277)
- 11.4. Budowa pamięci podręcznej (279)
- 11.4.1. Pamięć odwzorowywana bezpośrednio (280)
- 11.4.2. Pamięć w pełni powiązana (281)
- 11.4.3. Pamięć powiązana n-krotnie (281)
- 11.4.4. Dobieranie schematu pamięci podręcznej do rodzaju dostępu do danych (282)
- 11.4.5. Polityka wymiany zawartości wierszy (282)
- 11.4.6. Zapis danych w pamięci (283)
- 11.4.7. Użycie pamięci podręcznej i oprogramowanie (284)
- 11.5. Pamięć wirtualna, ochrona i stronicowanie (285)
- 11.6. Zaśmiecanie (288)
- 11.7. NUMA i urządzenia peryferyjne (289)
- 11.8. Oprogramowanie świadome istnienia hierarchii pamięci (290)
- 11.9. Organizacja pamięci w trakcie działania programu (291)
- 11.9.1. Obiekty statyczne i dynamiczne, wiązanie, czas życia (293)
- 11.9.2. Kod, segmenty tylko do odczytu i segment stałych (294)
- 11.9.3. Segment zmiennych statycznych (294)
- 11.9.4. Segment danych niezainicjalizowanych (BSS) (295)
- 11.9.5. Segment stosu (295)
- 11.9.6. Segment sterty i dynamiczna alokacja pamięci (296)
- 11.10. Dodatkowe informacje (301)
Rozdział 12. Wejście i wyjście (I/O) (303)
- 12.1. Połączenie procesora ze światem zewnętrznym (303)
- 12.2. Inne sposoby łączenia portu z systemem (306)
- 12.3. Mechanizmy wejścia-wyjścia (307)
- 12.3.1. Odwzorowywanie w pamięci (307)
- 12.3.2. Wejście-wyjście i buforowanie (308)
- 12.3.3. Odwzorowywanie na I/O (308)
- 12.3.4. Bezpośredni dostęp do pamięci (DMA) (309)
- 12.4. Hierarchia szybkości wejścia-wyjścia (310)
- 12.5. Szyny systemowe i szybkość transferu danych (311)
- 12.5.1. Wydajność magistrali PCI (312)
- 12.5.2. Wydajność magistrali ISA (313)
- 12.5.3. Magistrala AGP (313)
- 12.6. Buforowanie (314)
- 12.7. Handshaking (315)
- 12.8. Przekroczenia czasu w porcie I/O (316)
- 12.9. Przerwania i próbkowanie I/O (317)
- 12.10. Działanie w trybie chronionym i sterowniki urządzeń (318)
- 12.10.1. Sterowniki urządzeń (318)
- 12.10.2. Komunikacja ze sterownikami urządzeń i "plikami" (319)
- 12.11. Omówienie poszczególnych urządzeń peryferyjnych (320)
- 12.12. Klawiatura (320)
- 12.13. Standardowy port równoległy (322)
- 12.14. Porty szeregowe (323)
- 12.15. Stacje dysków (324)
- 12.15.1. Dyskietki (324)
- 12.15.2. Dyski twarde (324)
- 12.15.3. Systemy RAID (329)
- 12.15.4. Napędy ZIP i inne miękkie napędy optyczne (330)
- 12.15.5. Napędy optyczne (330)
- 12.15.6. Napędy CD-ROM, CD-R, CD-RW, DVD, DVD-R, DVD-RAM i DVD-RW (331)
- 12.16. Napędy taśmowe (333)
- 12.17. Pamięć flash (334)
- 12.18. Dyski RAM i dyski półprzewodnikowe (336)
- 12.19. Urządzenia i sterowniki SCSI (337)
- 12.20. Interfejs IDE/ATA (342)
- 12.21. Systemy plików na urządzeniach pamięci masowej (344)
- 12.21.1. Użycie mapy bitowej wolnej przestrzeni (346)
- 12.21.2. Tablice alokacji plików (347)
- 12.21.3. Pliki w formie list bloków (350)
- 12.22. Oprogramowanie przetwarzające dane na urządzeniach pamięci masowej (353)
- 12.22.1. Wydajność dostępu do plików (354)
- 12.22.2. Wejście-wyjście synchroniczne i asynchroniczne (355)
- 12.22.3. Znaczenie typu operacji wejścia-wyjścia (356)
- 12.22.4. Pliki odwzorowywane w pamięci (356)
- 12.23. Uniwersalna magistrala szeregowa (USB) (357)
- 12.23.1. Projekt USB (358)
- 12.23.2. Wydajność USB (359)
- 12.23.3. Rodzaje transmisji USB (360)
- 12.23.4. Sterowniki urządzeń USB (362)
- 12.24. Myszy, trackpady i inne urządzenia wskazujące (363)
- 12.25. Joysticki i urządzenia do gier (364)
- 12.26. Karty dźwiękowe (365)
- 12.26.1. Jak dźwiękowe urządzenia peryferyjne wytwarzają dźwięk? (366)
- 12.26.2. Formaty audio i pliki MIDI (368)
- 12.26.3. Programowanie urządzeń audio (369)
- 12.27. Dalsze informacje (369)
Myśl lokalnie, pisz globalnie (371)
Dodatek A Zestaw znaków ASCII (373)
Skorowidz (377)