Jak został napisany pierwszy kompilator?

166

Słyszałem o kury, jajku i bootstrapie. Mam kilka pytań.

Co napisało pierwszy kompilator, który przekształcił coś w instrukcje binarne?

Czy asembler jest kompilowany lub tłumaczony na instrukcje binarne?

... Trudno mi uwierzyć, że napisali kompilator w postaci binarnej.

Shawn Mclean
źródło
@nawfal, jest to różnica między nowym językiem programowania a pierwszym kompilatorem, więc nie - to nie jest duplikat
@PauliSudarshanTerho, jaka jest różnica? Duch pytań jest ten sam. Nie możesz napisać języka programowania, to z kolei dotyczy pierwszego kompilatora.
nawfal
Może w twojej duchowej wyobraźni? W rzeczywistości nie znajdziesz nic wspomnianego o pierwszym kompilatorze w tym linku. I nie powinieneś doradzać nikomu pisania nowego języka, aby zaczynał od zera. A jeśli tak, to dlaczego miałbyś chcieć ukrywać odpowiedzi na temat tego, jak napisany jest pierwszy kompilator, jeśli jest to ważne dla napisania nowego języka?
Ucz się ode mnie - to jest duplikat: stackoverflow.com/questions/4772768/ ...

Odpowiedzi:

133

Instrukcje asemblacji są (ogólnie) bezpośrednim odwzorowaniem na opkody, które są (wielobajtowymi) wartościami kodu maszynowego, które mogą być bezpośrednio interpretowane przez procesor. Całkiem możliwe jest napisanie programu w opkodach bezpośrednio, wyszukując je z tabeli (takiej jak na przykład ta dla mikroprocesora 6039 ), która wymienia je z pasującymi instrukcjami montażu i ręcznie określając adresy / przesunięcia pamięci dla rzeczy jak skoki.

Pierwsze programy zostały wykonane dokładnie w ten sposób - ręcznie napisane instrukcje.

Jednak w większości przypadków prostsze jest użycie asemblera do „kompilacji” kodu asemblera, który automatycznie wyszukuje te kody operacji, a także jest pomocny w obliczaniu adresów / przesunięć dla nazwanych etykiet skoku i tak dalej.

Pierwsi asemblerzy zostali napisani ręcznie. Te asemblery mogą być następnie użyte do asemblacji bardziej skomplikowanych asemblerów, których można by użyć do asemblacji kompilatorów napisanych dla języków wyższego poziomu i tak dalej. Ten proces iteracyjnego pisania narzędzi w celu uproszczenia tworzenia następnego zestawu narzędzi nazywa się (jak wspomniał David Rabinowitz w swojej odpowiedzi) bootstrapping .

Bursztyn
źródło
18
Moim pierwszym komputerem była maszyna oparta na Z80, w której monitorze ROM musiałem ręcznie złożyć program ładujący, aby przywołać podstawy systemu operacyjnego (CP / M), aby móc złożyć resztę wspomnianego systemu operacyjnego w działający system , wraz z dyskowym programem ładującym bootstrap. Dobre czasy. Więc tak, możesz dobrze złożyć ręcznie. Jest to powolne, bolesne i podatne na błędy (dlatego wszystko zautomatyzowaliśmy), ale jest możliwe.
TYLKO MOJA poprawna OPINIA
Pierwszy link jest uszkodzony.
Luke
Napisane odręcznie. W jaki sposób? Okablowanie czy wykrawanie kart? Myślę, że mieli klawiatury szesnastkowe.
44

Przeczytaj o bootstrapie kompilatora i historii jego pisania

Chodzi o to, aby napisać bardzo prosty kompilator bezpośrednio w kodzie maszynowym, użyć go do napisania bardziej wyrafinowanego kompilatora, użyć drugiego do zbudowania trzeciego i tak dalej, aż uzyskasz w pełni funkcjonalny kompilator.

David Rabinowitz
źródło
36

Jaja na długo poprzedzane kurczakami. Odpowiedź na większość problemów „kura i jajko” jest taka sama: ewolucja. Niektórzy ludzie mają również problem z uwierzeniem w biologiczną ewolucję, ale niewiara nie jest argumentem (google argumentum ad ignorantiam).

Odpowiadając wprost na twoje pytanie: pierwszy kompilator został napisany (przez człowieka) w asemblerze - program zwany asemblerem tłumaczył asembler na binarny; jest to o wiele prostszy proces niż kompilacja, ponieważ asembler jest tylko symboliczną formą języka maszynowego, która używa nazw kodów operacji zamiast liczb, reprezentuje adresy za pomocą symboli i tak dalej. Wiele późniejszych kompilatorów zostało również napisanych w języku asemblera. Ale pierwszy kompilator C był modyfikowany kompilator B, który został napisany w B . Pierwszy kompilator B został napisany w TMG . Kompilator TMG użyty do skompilowania tego kompilatora B został napisany w języku asemblera PDP-7.

Jim Balter
źródło
24

Woz powiedział w jednej ze swoich publicznych przemówień, że kiedy zaczynał, nie było go stać na kompilator, więc kompilował pliki binarne ręcznie na papierze. Jeśli chcesz zobaczyć coś jeszcze bardziej dzikiego, przeczytaj o warunkach, w jakich Bill Gates i Paul Allen napisali BASIC dla Altair 8800.

Jeśli chodzi o „pisanie binarnego komputera” - cofnij się o krok od bycia programistą i zastanów się, czym były wczesne komputery. Rzeczy na wysokim poziomie jeszcze nie istniały - myślałeś o wszystkim na niskim poziomie, bo to wszystko. Miałeś sprzęt, który mógł wykonywać podstawową logikę i arytmetykę, którymi manipulujesz za pomocą kodu maszynowego (który jest po prostu skompilowanym zestawem - Amber wyjaśnia, dlaczego ta część nie jest trudna do wykonania ręcznie) i chciałeś, aby ten sprzęt wykonywał pewne matematyczne wyczyny. Nie martwiłeś się o nieistniejący system operacyjny, po prostu powiedziałeś sprzętowi (w zestawie), jak manipulować liczbami, które go podajesz. To był po prostu duży kalkulator. Dzisiejszy komputer był budowany pojedynczo.

Jeśli chcesz przełamać barierę, która sprawia, że ​​komputery czują się jak magia, BARDZO polecam przeczytanie KODU Charlesa Petzolda i / lub The Elements of Computing Systems . Dzięki podstawowej wiedzy na temat programowania te wspaniale dostępne książki pozwolą Ci zrozumieć komputery od góry do dołu. Oczywiście nie można dostać komp. sci. lub EE po zaledwie dwóch książkach, ale jako samouk programista, który przegapił formalne szkolenie, mogę powiedzieć: te książki wstrząsnęły moim światem!

Dinah
źródło
2
Piszesz tłumacza Altair BASIC po prezentacji prezentacji? Kodowanie bootstrapera podczas lotu samolotem do Albuquerque? To brzmi trochę śmiesznie. I zabawa.
Ehtesh Choudhury
2
@Shurane: ha! Te kwestie też są istotne, ale dla mnie szczegółowość tego, jak stworzyli tłumacza języka BASIC i jak grupa wepchnęła go w małą przestrzeń, jest rzeczą piękną i zdumiewającą umiejętnością programowania / hakerem.
Dinah
10

Co napisało pierwszy kompilator, który przekształcił coś w instrukcje binarne?

Człowiek to zrobił. Przeczytaj o systemie A-0 :

W 1952 roku Grace Hopper ukończyła swój pierwszy kompilator dla Sperry, znany jako A-0. System A-0 był zbiorem instrukcji, które mogły tłumaczyć symboliczny kod matematyczny na język maszynowy. Tworząc A-0, wzięła wszystkie podprogramy, które zbierała przez lata i umieściła je na taśmie. Każdej procedurze nadawano numer wywoławczy, aby maszyna mogła go znaleźć na taśmie. „Wszystko, co musiałem zrobić, to zapisać zestaw numerów połączeń, pozwolić komputerowi znaleźć je na taśmie, przynieść i uzupełnić. To był pierwszy kompilator”, jak opisała Grace.

Sinan Ünür
źródło
1
Wydaje się, że teraz łącze to 404, w każdym razie „Grace” powyżej to Grace Hopper.
Volker Stolz,
2
Słyszałem, że Hopper napisał pierwszy kompilator, ale opis powyżej sprawia, że ​​brzmi on bardziej jak konsolidator niż kompilator. Mimo wszystko dobra historia. To niesamowite, pomyśleć, że był czas, kiedy informatycy byli sceptycznie nastawieni do idei kompilatorów ...
Mark E. Haase,
1
@mehaase dlatego nazywa się to „kompilatorem”. tworzy kompilację procedur, z których każda jest (potencjalnie) napisana bezpośrednio w języku maszynowym.
Elazar
@ MarkE.Haase Osoby, o których mowa tutaj Hopper, to inżynierowie aplikacji i naukowcy używający komputerów do określonych zadań obliczeniowych; nie byli „informatykami”. W 1952 roku w okolicy było kilku cybernetyków, ale wątpię, czy rozmawiała z którymkolwiek z nich.
Jim Balter,
9

Pierwsze programy zostały napisane w kodzie maszynowym (nie w języku asemblera) - rzeczywiste liczby wpinane do pamięci komputera za pomocą przełączników. Przeszliśmy długą drogę ...

Czasami zdarza się to nadal w niewielkim stopniu - do łatania małych fragmentów kodu lub tworzenia zwrotów. Pamiętam, jak wprowadzałem liczby do podstawowych łańcuchów, które były następnie wykonywane jako małe, szybkie podprogramy na wczesnych microsoftach. Pamiętam również przełączanie przełączników na przednim panelu PDP-11, aby wprowadzić program ładujący do jego pamięci na kurs uniwersytecki.

Te programy były czasami używane do przetwarzania plików tekstowych w celu tworzenia innych programów i zostały utworzone języki programowania voila.

Michael Burr
źródło
Pytanie dotyczy pierwszego kompilatora, a nie ogólnie pierwszych programów, mimo że programy czasami są kompilatorami; historia tych dwóch nie jest taka sama. (Analogia: odpowiedź na pytanie, kiedy pierwsze zwierzęta pojawiły się na Ziemi nie jest odpowiedź na pytanie, kiedy pierwsze koty pojawiły się na Ziemi, mimo koty są zwierzęta.)
Jim Balter