Dowiedz się, jak pomysł przechowywanego programu — często łączony z Johnem von Neumannem — umożliwił wielokrotne użycie oprogramowania, komputery ogólnego przeznaczenia i nowoczesne programowanie.

W sercu współczesnych komputerów kryje się proste pytanie: co sprawiło, że jedna maszyna mogła wykonywać wiele różnych zadań bez każdorazowego przebudowywania jej? Wczesne komputery elektroniczne potrafiły liczyć szybko, ale „zmiana zadania” często oznaczała fizyczną zmianę konfiguracji maszyny. Idea przechowywanego programu to punkt zwrotny, który uczynił komputery naprawdę programowalnymi.
Komputer z przechowywanym programem przechowuje instrukcje zadania (program) w tym samym rodzaju pamięci wewnętrznej co dane, na których program operuje. Zamiast przepinać okablowanie czy ręcznie rekonfigurować panele, możesz załadować nowy zestaw instrukcji do pamięci i wykonać inne zadanie.
Teraz to brzmi oczywiście, ale to radykalna zmiana:
To nie tylko ciekawostka historyczna. Koncepcja przechowywanego programu wyjaśnia, dlaczego „oprogramowanie” istnieje jako coś odrębnego od „sprzętu” i dlaczego aktualizacja urządzenia dziś może udostępnić nowe funkcje bez zmiany układów.
W dalszych sekcjach omówimy problem, z którym borykały się wczesne komputery, co zmieniło podejście ze z zapisanym programem, osoby i dokumenty, które doprecyzowały tę ideę (w tym słynny raport EDVAC), oraz jak termin „architektura von Neumanna” stał się powszechnie używanym opisem projektu.
Chociaż imię Johna von Neumanna jest mocno kojarzone z przechowywanymi programami, zasługi rozkładają się na szerszy zespół i czas. Wielu badaczy dochodziło do podobnych pomysłów równolegle podczas budowy pierwszych praktycznych komputerów. Artykuł zachowuje ten kontekst, bo zrozumienie pracy zespołowej pomaga wyjaśnić, jak pomysł tak szybko się rozprzestrzenił i stał się domyślnym modelem dla większości kolejnych maszyn.
Zanim pojawił się pomysł przechowywanego programu, wiele wczesnych komputerów nie „uruchamiało oprogramowania” w sposób, jaki dziś znamy. Potrafiły liczyć imponująco szybko, ale powiedzenie im co robić często oznaczało fizyczną zmianę maszyny.
Popularnym podejściem były tablice wtykowe, przewody połączeniowe i panele przełączników. Operatorzy łączyli gniazda przewodami, ustawiali rzędy przełączników i czasem regulowali jednostki czasowe, aby sygnały docierały w odpowiedniej kolejności. „Program” nie był plikiem do załadowania — to był tymczasowy schemat połączeń.
Taki układ działał, ale miał ukryty koszt: każde nowe zadanie było małym projektem inżynieryjnym. Jeśli chciałeś zmienić kolejność operacji (dodawanie, mnożenie, porównanie, pętla), mogłeś przesunąć dziesiątki lub setki połączeń. Pojedynczy źle włożony przewód mógł powodować subtelne błędy, które trudno było zdiagnozować, bo logika rozproszona była po fizycznych połączeniach, a nie zapisana jako czytelne kroki.
Rekonfiguracja mogła zająć godziny lub dni, zwłaszcza jeśli trzeba było ostrożnie wyłączyć maszynę, przepiąć połączenia i przetestować ją ponownie. Oznaczało to ograniczoną elastyczność: maszyny często były przeznaczone do jednego rodzaju obliczeń na dłuższe okresy, bo zmiana zadania była zbyt uciążliwa.
Wyobraź sobie maszynę ustawioną do obliczania tabel balistycznych — długie, powtarzalne obliczenia według określonego wzoru. Jeśli badacze chcieli, by ta sama maszyna rozwiązała inne zadanie, np. tabulację wyników statystycznych spisu powszechnego, to nie wystarczyło „edytować programu i uruchomić ponownie”. Kolejność operacji, kroki przechowywania pośredniego i warunki mogły być inne, wymagając pełnego przeprojektowania tablicy wtykowej i ponownych testów.
To świat, który miała opuścić koncepcja komputera z przechowywanym programem.
Komputer z przechowywanym programem to maszyna, w której instrukcje (program) znajdują się w tej samej pamięci roboczej co dane używane przez program. Innymi słowy, komputer nie traktuje „co robić” jako czegoś oddzielnego od „nad czym pracować” — oba są przechowywane jako wzory bitów w pamięci.
Kiedy pionierzy komputerów mówili o pamięci, mieli na myśli szybkie, bezpośrednio dostępne wewnętrzne magazyny — to, co dziś najbardziej odpowiada pamięci RAM. To miejsce, z którego procesor może szybko czytać i zapisywać podczas działania.
To różni się od trwałego przechowywania, takiego jak dysk twardy czy SSD. Dysk świetnie nadaje się do przechowywania plików po wyłączeniu zasilania, ale nie jest natychmiastowym notatnikiem, z którego procesor ciągle pobiera kolejne instrukcje i aktualizuje wyniki pośrednie.
Gdy instrukcje są przechowywane w pamięci, zmiana zadań staje się znacznie prostsza: można wczytać nowy program do pamięci i go uruchomić, bez przebudowy, przepinania czy fizycznej rekonfiguracji sprzętu. Ta sama maszyna ogólnego przeznaczenia może robić listę płac rano, a obliczenia balistyczne po południu — bo „jak” zadanie wykonać to po prostu inny zestaw bitów do podmiany.
Wyobraź sobie kuchnię, w której przepis i składniki przechowywane są razem w tej samej spiżarni. Kucharz (procesor) wielokrotnie sięga do spiżarni (pamięć), by przeczytać następny krok przepisu (instrukcję) i wziąć lub zaktualizować składniki (dane).
Chcesz przygotować inne danie? Nie remontujesz kuchni. Po prostu wkładasz inne przepisy — używając tych samych blatów, piekarnika i narzędzi.
John von Neumann nie „wynalazł komputera” i nie stworzył samodzielnie koncepcji przechowywanego programu. Zrobił jednak coś kluczowego — pomógł przekształcić obiecującą ideę w jasno sformułowany, powszechnie udostępniany projekt, na którym inni inżynierowie i laboratoria mogli się oprzeć.
Von Neumann był mocno zaangażowany w wojenne i powojenne projekty komputerowe, doradzając zespołom i dopracowując logiczną strukturę wczesnych projektów. Miał dar wyjaśniania złożonych wyborów technicznych w prostych, zorganizowanych słowach, a to miało znaczenie, bo rozwój elektronicznego przetwarzania następował szybko, z wieloma grupami rozwiązującymi podobne problemy jednocześnie.
Co równie ważne, rozpowszechniał wpływowe opisy, jak komputer mógłby przechowywać instrukcje programu w tej samej pamięci co dane. To czytelne ujęcie ułatwiało innym dyskusje, nauczanie i replikację podejścia.
Nazwiska często przyklejają się nie do pierwszego autora pomysłu, lecz do osoby, której opis staje się punktem odniesienia. Pisma von Neumanna były szeroko czytane, kopiowane i cytowane — więc późniejsi czytelnicy naturalnie łączyli organizację „przechowywanego programu” z jego nazwiskiem.
To uproszczenie historii: łatwiej powiedzieć „architektura von Neumanna” niż wymieniać wszystkich współautorów i raporty. Jednak taka etykieta może zacierać, jak naprawdę wyglądały prace.
Wczesne komputerowanie było współpracą wielu instytucji, obejmując matematyków, inżynierów i programistów. Koncepcja przechowywanego programu dojrzewała przez dyskusje, szkice, prototypy i poprawki w wielu zespołach. Trwała rola von Neumanna to pomoc w określeniu i rozpowszechnieniu tej idei — przyspieszył jej przyjęcie, zamiast być jej jedynym twórcą.
EDVAC (Electronic Discrete Variable Automatic Computer) był jednym z wczesnych powojennych projektów komputerowych dążących do odejścia od maszyn jednofunkcyjnych. Tak samo ważne jak prace sprzętowe było zdecydowanie się na spisanie idei projektowych w jasnej, możliwej do udostępnienia formie. W tamtym czasie budowa komputerów była ciągle bliska inżynierii eksperymentalnej — wiedza żyła w zeszytach laboratoryjnych, na spotkaniach i w głowach kilku specjalistów. Raport mógł przekształcić te rozproszone spostrzeżenia w coś, co inne zespoły mogły omawiać, krytykować i ponownie wykorzystywać.
„First Draft of a Report on the EDVAC” (często nazywany „raportem EDVAC”) przedstawiał w zrozumiały sposób koncepcję przechowywanego programu: komputer powinien przechowywać instrukcje programu w tej samej pamięci wewnętrznej co dane. Ta pamięć nie jest tylko miejscem na przechowywanie liczb podczas obliczeń — trzyma też kroki mówiące maszynie, co zrobić dalej.
Takie ujęcie powoduje, że komputer przestaje być urządzeniem stałego przeznaczenia, a staje się maszyną ogólną, którą można „przeznaczyć na nowo” przez zmianę zawartości pamięci. Nie przeprojektowujesz systemu, aby przejść z jednego zadania na inne; ładujesz inną sekwencję instrukcji.
Poza samą koncepcją, raport pomógł standaryzować język, którym ludzie mówili o komputerach: pamięć, sterowanie, arytmetyka i wejście/wyjście jako odrębne funkcjonalne części współpracujące ze sobą. Wspólny model mentalny ułatwił budowanie, porównywanie i ulepszanie komputerów ze z zapisanym programem.
Łatwo zapytać „kto wynalazł komputer z przechowywanym programem?” i oczekiwać jednego nazwiska. Ale nauka i inżynieria rzadko działają w ten sposób. Pomysły często rozwijają się równolegle, są dopracowywane w dyskusjach i stają się przekonujące dopiero wtedy, gdy zostaną pokazane w działającym sprzęcie.
John von Neumann jest mocno kojarzony z koncepcją przechowywanego programu, ale wczesne prace obejmowały wiele osób i grup:
Komputer z przechowywanym programem to nie jedno pojedyncze odkrycie. To połączenie: (1) skoku koncepcyjnego, że instrukcje mogą żyć w pamięci jak dane, (2) inżynierii potrzebnej do zbudowania niezawodnej pamięci i jednostek sterujących oraz (3) praktyk programistycznych, które czynią projekt użytecznym. Różne osoby przyczyniły się do różnych elementów.
Inny powód dzielenia zasług: zaproponowanie idei to nie to samo, co zbudowanie maszyny, która działa dniami i latami. Wczesne raporty i dyskusje uczyniły koncepcję jaśniejszą; wczesne prototypy i systemy produkcyjne udowodniły wykonalność. Rzetelna historia szanuje oba typy wkładów — bez wymuszania uproszczonego werdyktu „pierwszego wynalazcy”.
Gdy ktoś mówi „architektura von Neumanna”, zwykle ma na myśli prosty, szeroko nauczany model organizacji komputera z przechowywanym programem. To nie marka ani jedna historyczna maszyna — to wygodna etykieta dla planu, który występuje w różnych formach w wielu komputerach.
Na poziomie koncepcyjnym rysunek wygląda tak:
Kluczowa myśl to brak oddzielnego fizycznego miejsca dla „programu” versus „liczb”. CPU pobiera wszystko, czego potrzebuje, z pamięci.
CPU wykonuje program, powtarzając pętlę opisywaną jako pobierz–zdekoduj–wykonaj:
Ten opis jest uproszczony, ale oddaje istotę: program to sekwencja instrukcji w pamięci, a CPU wykonuje je krok po kroku.
Umieszczenie instrukcji i danych w tej samej pamięci czyni komputer praktycznie ogólnego przeznaczenia:
To, co powstało dalej: przechowywane programy umożliwiły kompilatory i systemy operacyjne, które z kolei umożliwiły nowoczesne narzędzia deweloperskie — a dziś dodajemy kolejną warstwę abstrakcji, gdzie aplikację można opisać w języku naturalnym, a narzędzia generują działający kod. Na przykład Koder.ai to platforma vibe-coding, gdzie budujesz aplikacje webowe, backendy lub mobilne przez interfejs czatu, wykorzystując LLM i agentowy workflow, by przyspieszyć drogę od intencji („co ma robić?”) do wykonalnych instrukcji (kod źródłowy, który można eksportować, wdrożyć i przywracać przez snapshoty).
Wynik to ta sama cnotliwa pętla: przechowywane programy umożliwiły lepsze narzędzia, a lepsze narzędzia umożliwiły bardziej ambitne programy — przekształcając komputery w elastyczne maszyny ogólnego przeznaczenia.
Idea przechowywanego programu uczyniła komputery elastycznymi, ale też uwypukliła praktyczne ograniczenie, o którym inżynierowie wciąż mówią: „wąskie gardło von Neumanna”. W codziennych słowach to jak korek na drodze między CPU (pracownikiem) a pamięcią (magazynem).
W typowym projekcie ze z zapisanym programem zarówno instrukcje, jak i dane mieszkają w pamięci. CPU pobiera instrukcję, potem dane, potem zapisuje wyniki — często tą samą ścieżką. Jeśli ta ścieżka nie przesyła informacji wystarczająco szybko, CPU stoi i czeka, choć mógłby wykonywać obliczenia szybciej.
Dwa powiązane czynniki kształtują to wąskie gardło:
CPU może wykonywać miliardy operacji na sekundę, ale jeśli pamięć nie dostarcza stałego strumienia instrukcji i danych, wydajność ogranicza najwolniejszy etap: dostarczenie bajtów.
To powszechnie dyskutowany problem inżynieryjny, a współczesne komputery stosują kilka technik zmniejszających jego skutki:
Te podejścia nie likwidują podstawowej „drogi”, ale pomagają ją mniej zatykać — CPU spędza więcej czasu na pracy, a mniej na czekaniu.
Koncepcja przechowywanego programu to nie eksponat muzealny — to sposób, w jaki codzienne komputery pozostają elastyczne. Twoje urządzenia nie muszą być „przepinane”, by robić coś nowego; po prostu ładują inne instrukcje do pamięci i je uruchamiają.
Na telefonie dotknięcie ikony aplikacji powoduje, że system operacyjny wczytuje kod tej aplikacji z pamięci masowej do pamięci roboczej, a potem CPU go wykonuje. Na laptopie to samo dzieje się, gdy otwierasz przeglądarkę, edytujesz dokument czy grasz. W serwerach widać to jeszcze wyraźniej: maszyna może obsługiwać tysiące zmieniających się zadań — żądań sieciowych, zapytań do bazy danych, zadań w tle — bez zmiany sprzętu.
Nawet funkcje, które wydają się „sprzętowe”, często są definiowane programowo. Routowanie sieci, dekodowanie wideo, ulepszanie zdjęć i polityki zarządzania energią bywają aktualizowane przez firmware i oprogramowanie systemowe — nowe instrukcje, to samo urządzenie.
Języki takie jak Python i JavaScript zwykle działają przez interpreter lub maszynę wirtualną. Zamiast CPU bezpośrednio wykonywać Twój kod źródłowy, program jest tłumaczony na ustrukturyzowaną formę (bytecode lub wewnętrzne instrukcje), która jest przechowywana w pamięci i wykonywana krok po kroku. JVM Javy, .NET, runtime’y WebAssembly i silniki JavaScript w przeglądarkach opierają się na tym: instrukcje stają się strukturami danych, które maszyna może załadować, przesuwać i wykonać.
Ponieważ instrukcje są „zwykłą” informacją, ataki czasem próbują przemycić złośliwy kod przez dane — klasyczne wstrzyknięcie kodu. Obroną są mechanizmy takie jak ochrona pamięci, podpisywanie kodu i regiony pamięci niewykonywalnej, które mają zapobiegać traktowaniu niezaufanych danych jako wykonywalnych instrukcji.
To wszystko sprowadza się do obietnicy przechowywanych programów: elastyczność przez oprogramowanie — nowe zachowanie na tym samym sprzęcie.
Gdy patrzysz na komputer lub czytasz specyfikację, te pytania pomogą zidentyfikować podstawowy model:
Jeśli chcesz więcej przyjaznych dla czytelnika artykułów takich jak ten, przejrzyj /blog.
Uwaga: Jeśli eksperymentujesz z nowymi sposobami przekształcania „instrukcji” w działające systemy — czy to pisząc kod bezpośrednio, czy używając platform czatowych do budowy — warto dokumentować wnioski. Koder.ai oferuje też program zdobywania kredytów za publikowane treści i polecenia, co może być praktycznym sposobem finansowania dalszych eksperymentów i samouczków.
Komputer ze z zapisanym programem przechowuje instrukcje programu w tej samej pamięci wewnętrznej, która zawiera dane, na których te instrukcje operują. Aby zmienić zadanie, ładujesz inny zestaw instrukcji do pamięci zamiast przełączać okablowanie czy rekonfigurować sprzęt.
Przed erą komputerów ze z zapisanym programem wiele maszyn było „programowanych” za pomocą tablic wtykowych, przewodów i przełączników. Zmiana kolejności operacji mogła oznaczać godziny lub dni przepinania i testowania, a pojedyncze błędne połączenie potrafiło wprowadzić trudne do wykrycia błędy.
W tym kontekście „pamięć” oznacza szybkie, robocze miejsce przechowywania (najbliższe współczesnej pamięci RAM), z którego CPU często odczytuje i do którego zapisuje podczas działania. Różni się to od trwałego przechowywania (dyski/SSD), które służy do przechowywania programów i plików po wyłączeniu zasilania.
Raport EDVAC jasno opisał organizację, w której instrukcje i dane dzielą tę samą pamięć wewnętrzną, oraz wprowadził przydatne pojęcia do opisu części komputera (pamięć, sterowanie, arytmetyka, wejście/wyjście). Ta jasność pomogła innym zespołom szybciej omawiać, porównywać i budować podobne systemy.
Nazwisko von Neumanna zostało mocno powiązane z koncepcją głównie dlatego, że jego opisy były szeroko rozpowszechniane i łatwe do cytowania, a nie dlatego, że był jedynym autorem pomysłu. Podejście ze z zapisanym programem wyrosło z pracy szerszej społeczności (inżynierów, matematyków i wczesnych programistów) pracujących nad podobnymi problemami równolegle.
"Architektura von Neumanna" zwykle oznacza model z:
To wygodna etykieta nauczająca model ze z zapisanym programem, a nie twierdzenie o jednej historycznej maszynie czy jedynym wynalazcy.
W projekcie w stylu von Neumanna instrukcje i dane dzielą jedną pamięć (często jedną ścieżkę do CPU). W projekcie w stylu Harvarda pamięć instrukcji jest oddzielona od pamięci danych (często z osobnymi ścieżkami). Wiele współczesnych systemów łączy oba podejścia — np. wspólny model pamięci dla oprogramowania, ale oddzielne pamięci podręczne dla instrukcji i danych.
„Wąskie gardło von Neumanna” to ograniczenie wydajności, które pojawia się, gdy CPU i pamięć dzielą ograniczoną ścieżkę przesyłu zarówno instrukcji, jak i danych. Częste sposoby łagodzenia tego problemu to pamięci podręczne, prefetching i równoległość (np. wiele rdzeni), które zmniejszają czas oczekiwania, ale nie likwidują całkowicie podstawowego ograniczenia.
Ponieważ programy są po prostu informacją, którą można wczytać do pamięci, zachowanie urządzenia można zmienić przez aktualizację oprogramowania zamiast przerabiania układów. Dlatego ten sam telefon czy laptop może uruchamiać wiele aplikacji, a aktualizacje firmware/OS potrafią dodać funkcje bez przeprojektowywania sprzętu.
Instrukcje są reprezentowane jako dane w pamięci, więc atakujący czasem próbują przekształcić niezaufane dane w wykonywalny kod (np. wstrzyknięcie kodu). Współczesne zabezpieczenia obejmują ochronę pamięci (regiony niewykonywalne), podpisywanie kodu i inne mechanizmy oddzielające „dane, które można odczytać” od „kodu, który można uruchomić”.