Jak działa komputer (procesor) i skąd wie jak wykonywać kod?

Jak działa komputer (procesor) i skąd wie jak wykonywać kod?
0

Zdałem sobie sprawę, że tak naprawdę to nie wiem jak działa komputer. Brakuje mi w planie studiów strasznie programowania niskopoziomowego, to by mi wiele wyjaśniło. Załóżmy że mam napisany jakiś program, co np. zlicza sumę liczb od 0 do 100. Można to napisać za pomocą pętli, ale przecież procesor chyba tego nie zrozumie, więc kod jest tłumaczony do postaci asemblerowej, mam rację? Jak to jest, że jeden program napisany w danym jezyku, działa na wielu procesorach od starych inteli, do najnowszych, na różnych AMD, i jeszcze innych procesorach?
Czy wszystkie procesory mają takie same instrukcje asemblerowe?
No to teraz idziemy dalej.
Skąd procesor ma wiedzieć jak wykonać taki kod:

Kopiuj
Start:
mov        bx, OFFSET Tablica                        
mov        cx, DL_TABLICY
xor        ax, ax

Skąd wie które bramki/tranzystory mają w danej chwili wykonywać operacje?

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
0

Takiego kodu procesor nie wykonuje.
To jeszcze trzeba skompilować do kodu maszynowego.
Kod maszynowy wykonywany na zasadzie maszyny Turinga.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
Wibowit
maszyny Turinga? wut? z jedną taśma czy dwiema?
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:3 minuty
0

Jak to jest, że jeden program napisany w danym jezyku, działa na wielu procesorach od starych inteli, do najnowszych, na różnych AMD, i jeszcze innych procesorach?
Czy wszystkie procesory mają takie same instrukcje asemblerowe?

Wszystkie procesory nie - procesory z rodziny x86.
Oczywiście dochodzą cały czas nowe instrukcje w nowych modelach, np. SSE, AVX. Początkowo była to architektura 16-bitowa, potem 32, teraz 64, ale kładzie się wysoki nacisk, by zachować zgodność ze starszymi modelami.

Procesor jednak to nie wszystko, dużo zależy pod systemu operacyjnego. Program napisany dla Windows 95 powinien w teorii działać pod Win8, w praktyce bywa różnie.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

W wielkim skrócie: procesor ma tablicę opcodów i wie że jaką "składnię" mają instrukcje oraz jak należy je wykonać. Jak wczyta sobie "mov" (czy też w praktyce pewną liczbę która reprezentuje mov po kompilacji) to wie że dalej będą dwa parametry które musi zdekodować (bo mogą to być dwa rejestry albo rejestr i wskaźnik do pamieci). Jak już sobie zdekoduje to możesz sobie to wyobrazić tak że procesor w zależności od liczby symbolizującej operacje do wykonania uaktywni sobie odpowiednią ścieżkę w układzie elektronicznym. Stąd też będzie wiedział które bramki mają być użyte ;]


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:3 minuty
0

"będzie wiedział" to przenośnia raczej wysokopoziomowa...
Tu nie ma nic do wiedzenia... opcode (bajt) taki a taki powoduje aktywację tych a tych obwodów, bramek.
Procesor to BARDZO złożony układ logiczny.

0

To jeszcze mam pytanie jak porównać ze sobą trzy procesory(ich moc obliczeniową) z różnych platform., komputer PC, smartfon, i jeszcze może mikrokontroler AVR. Czy dobrym pomysłem by była napisanie programu, na każdy z nich, np mnożenie dużej macierzy, i zmierzyć czas mnożenia. Czy da to jakąś sensowną odpowiedź?
Czy wydajność procesora we FLOPS'ach podaje producent, czy można to zmierzyć jakimś benchmarkiem?

Azarien
Da jakąś sensowną odpowiedź.
Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:dzień
2

W zależności od problemu, względna wydajność może się zmieniać. Dlatego jeśli chcesz oszacować wydajność procesorów w zastosowaniu X to najlepiej po prostu wybrać jakieś przenośne programy realizujące problem X i odpalić je na wszystkich platformach. Ale nawet wtedy w sumie nie będzie to 100% obiektywne, bo na każdą platformę pisze się inaczej programy i inaczej się projektuje procesory. Na desktopach bardzo ważna jest wydajność jednowątkowa, w smartfonach i kontrolerach ważne jest niskie zapotrzebowanie na prąd, a dodatkowo w kontrolerach ważna jest oszczędność tranzystorów, by kontroler był maksymalnie tani.

Co do tego jak działa procesor to Shalom już mniej więcej to opisał. Ja dorzucę to, że koniec końców wszystko w zasadzie można rozbić na pojedyncze operacje bitowe typu AND, OR, NOT, itd Pojedynczy tranzystor jest generalnie bramką AND. Dodając do tego inwerter (czyli bramkę NOT) otrzymujemy dwuelementowy zestaw klocków do zbudowania dowolnego układu logicznego. Z układów operujących na pojedynczych bitach można zbudować układy operujące na wektorach bitów. Np jak zbudować układ dodający liczby N-bitowe z układów dodających liczby 1-bitowe (dodawanie liczb jednobitowych jest realizowane bramką XOR): http://en.wikipedia.org/wiki/Adder_(electronics) Pamięć w układach logicznych jest realizowana poprzez układ przewodów (to będzie pamięć stała), przerzutniki (w SRAM) bądź tranzystory (w DRAM). Mając pamięć i układy logiczne potrzebna jest nam siła napędowa i synchronizacja. Za obie rzeczy robi zegar, który generuje impulsy elektryczne które docierają do każdego tranzystora w mniej więcej równym czasie. Dzięki temu każdy tranzystor generuje wynik w takim okienku czasowym by kolejne były w stanie ten wynik przetworzyć.

Wspomniane przez Shaloma dekodowanie instrukcji też można rozbić na operacje elementarne jak AND, OR, XOR, NOT, itd
W zasadzie to cały procesor jest tranzystorową zupą, a to że nazywamy go procesorem to pewna "sztuczna" warstwa abstrakcji. Podobnie zresztą my wszyscy jesteśmy atomową zupą i określenie "człowiek" też jest pewną formą abstrakcji :)


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 2x, ostatnio: Wibowit
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

@Damianek ja bym powiedział że to będzie słabe porównanie, bo bazujące na jakimś konkretnym przypadku. Problem w tym że procesor to nie tylko liczba operacji które jest w stanie wykonać czy taktowanie zegara. Procesory maja dziś dość zaawansowane rozwiązania takie jak: superskalarność, wielopotokowość, out-of-order-execution, branch-prediction, wielopoziomowe cache i od tych mechanizmów zależy bardzo wiele. Może się okazać ze zmieniając rozmiar tablicy na której testujesz "moc obliczeniową" i 1 zmienisz diametralnie wyniki, bo tablica przestanie dla jednego z procesorów mieścić się w cache co wielokrotnie spowolni pracę.
Równie dobrze może się okazać że dodanie /usuniecie z pętli twojego algorytmu testującego jednej operacji matematycznej znów diametrialnie zmieni wyniki, bo jednemu z procesorów braknie jednostek wykonawczych i obliczenia spowolnią wielokrotnie.
Tylko że to są parametry które trudno dobrać "obiektywnie".


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)