Co było pierwsze, kompilator lub źródło?

17

Jestem ciekawy narodzin kompilatora. Jak zaczęło się programowanie? Czy ludzie najpierw zbudowali sprzęt, który rozpoznał określony zestaw poleceń, czy też ludzie zdefiniowali język, a następnie zbudowali sprzęt wokół niego? I na powiązaną notatkę, jaki był pierwszy język programowania?

David Cowden
źródło
1
Jedno z pytań podrzędnych było pytaniem samym w sobie: Jaki był pierwszy język programowania napisany dla komputerów? .
Mark Booth,
Z pewnością możesz to sprawdzić ?
Caleb
@Caleb przeczytał komentarze w odpowiedzi SkyDan ..
David Cowden,
2
@Brian Prawidłowe założenie, ale okazuje się błędne. To wcale nie jest problem z jajkiem kurze, jest bardzo jasna odpowiedź (wskazówka: najczęściej wybierana poniżej głoska jest błędna). Kod źródłowy długo wyprzedza kompilatory.
Konrad Rudolph,

Odpowiedzi:

30

To jest bardzo jasna odpowiedź: kod źródłowy był pierwszy - z dużym marginesem.

Przed podaniem szczegółów technicznych, trochę perspektywy:

Pierwsze języki programowania były wszystkie przetłumaczone na język maszynowy lub asemblerze ręcznie . Pomysł użycia oprogramowania do automatyzacji tego tłumaczenia (za pomocą kompilatora lub ewaluatora) zawsze pojawiał się później i nie był intuicyjny.

Rozważ ten cytat z artykułu w Wikipedii na temat FORTRAN, który ilustruje kompilatory niechęci, z którymi musieli się zmierzyć:

… Pierwszy kompilator FORTRAN został dostarczony w kwietniu 1957 r. Był to pierwszy kompilator optymalizujący, ponieważ klienci byli niechętni do używania języka programowania wysokiego poziomu, chyba że jego kompilator byłby w stanie wygenerować kod, którego wydajność byłaby porównywalna z językiem asemblera ręcznie . [moje podkreślenie]

=> Zanim kompilator FORTRAN trafił na rynek (1957), ludzie już z radością programowali zarówno w asemblerze, jak i FORTRAN.

Sprawa była podobna w przypadku LISP (od hakerów i malarzy ):

Steve Russell powiedział: słuchaj, dlaczego nie zaprogramuję tego eval… i powiedziałem mu: ho, ho, mylicie teorię z praktyką, to eval jest przeznaczone do czytania, a nie do obliczeń. Ale on to zrobił. Oznacza to, że skompilował eval w moim artykule do kodu maszynowego IBM 704, naprawiając błąd, a następnie reklamował to jako interpreter Lisp, co z pewnością było. W tym momencie Lisp miał zasadniczo taką formę, jaką ma dzisiaj ... ”

Ponownie, kod źródłowy (w LISP) nie tylko poprzedza interpreter, ten drugi nie był nawet domyślny w pierwszym.

Ale zmiany te są stosunkowo późne. Nawet nie biorąc pod uwagę silnika analitycznego Charlesa Babbage'a i pierwszego programu związanego z Adą Lovelace, w XX wieku istniały języki programowania poprzedzające kompilatory:

Plankalkül Konrada Zuse i matematyczna konstrukcja rachunku λ wprowadzona przez Kościół Alonzo. Oba są niewątpliwie formalnie określonymi językami programowania, ale żaden z nich nie miał wtedy kompilatora.

Aby spojrzeć na to z perspektywy, rachunek λ pochodzi z lat 30. XX wieku, a Plankalkül został opracowany około 1945 r. Natomiast pierwszy kompilator FORTRAN wyszedł w 1957 r. (Ale ponownie trzy lata po określeniu FORTRAN).

Konrad Rudolph
źródło
Świetna odpowiedź! Nie wiedziałem, że kod był kompilowany ręcznie, ale to ma sens.
ckb 24.04.13
10

Programowanie rozpoczęło się od ludzi, którzy piszą kod maszynowy bezpośrednio do pamięci, na perforowane karty i taśmę papierową, a nawet zwierają linki na panelu krosowniczym. Trudno powiedzieć, czy sprzęt został zbudowany zgodnie z potrzebami oprogramowania lub odwrotnie. Z pewnością najwcześniejszy projekt dla kompletnie programowalnego komputera Turinga, silnik analityczny Babbage'a , był wcześniejszy niż pierwszy udokumentowany program Ady Lovelace .

Jeśli chodzi o pierwszy język programowania, argumentowałem , że był to język maszynowy silnika analitycznego Babbage'a (z pytania Jaki był pierwszy język programowania napisany dla komputerów? )

Aby odpowiedzieć na pytanie w tytule pytania, ponieważ język asemblera jest kodem źródłowym , a języki asemblera są wcześniejszymi językami wysokiego poziomu, które można skompilować w asembler, kod źródłowy był na pierwszym miejscu.

Ponadto, kompilator nigdy nie było to konieczne , po prostu wygodne.

Jest całkowicie możliwe zapisywanie oprogramowania bezpośrednio w pamięci, jeśli zapamiętałeś odpowiednie tabele kodów operacyjnych . W rzeczywistości niektóre wczesne komputery wymagały od użytkownika wprowadzenia kodu bootstrap na klawiaturze sześciokątnej na panelu przednim, aby zmusić go do uruchomienia, ale można dotknąć dowolnego kodu, który ci się podoba i zostanie uruchomiony.

Wprawdzie procesory stają się coraz bardziej złożone, ale staje się to trudniejsze, ale prosty zestaw instrukcji, taki jak 6809 lub Z80 (ignorowanie wszystkich dziwnych trybów indeksowania) jest stosunkowo łatwy do zaprogramowania nawet bez asemblera , nie mówiąc już o kompilatorze z języka wysokiego poziomu.

Gdyby kiedykolwiek zbudowano silnik analityczny Babbage'a, jestem pewien, że byłby steampunk Mel , piszący zoptymalizowane programy bezpośrednio na kartach krosna.

Mark Booth
źródło
1
Czy rzeczywiście przeczytałeś definicję kodu źródłowego na tym linku wikipedii, który opublikowałeś? Jak wspomniano powyżej, kod maszynowy nie jest kodem źródłowym. I kod maszynowy! = Montaż. Kod maszynowy był tam pierwszy.
occulus,
@MarkBooth Myślę, że MIPS i AVR są jeszcze prostsze ..
David Cowden
4
@occulus - W jaki sposób język asemblera nie jest kodem źródłowym ? Język asemblera odwzorowuje jedną instrukcję języka asemblera na jeden kod maszynowy i może być trywialnie złożony w twojej głowie, jeśli znasz tabele kodów operacji. Szczerze mówiąc, dzieciaki w dzisiejszych czasach ... * 8 ')
Mark Booth
1
Dla mnie językiem asemblera jest movl $0, -20(%rbp), podczas gdy kod maszynowy jest C745EC00000000, i to ten drugi (no, coś w tym rodzaju) został najpierw ręcznie wprowadzony lub odczytany z taśmy papierowej. Jeśli chodzi o to, czy kod maszynowy liczy się jako kod źródłowy , jestem skłonny powiedzieć „cokolwiek unosi twoją łódź”. Jeśli włączasz to ręcznie, to tak, powiedziałbym, że to się liczy.
John Bode,
@JohnBode - Och, zgadzam się, ale biorąc pod uwagę zgodność 1: 1 między instrukcjami montażu i instrukcjami kodu maszynowego, montaż jest tylko kwestią tłumaczenia mechanicznego (montażu), logika jest identyczna. Kompilacja implikuje wiele bardziej złożonych: wiele tłumaczeń (chociaż Occam jest językiem wysokiego poziomu i wiele instrukcji Occam odwzorowanych 1: 1 na instrukcje Transputer ze względu na architekturę MISC . * 8 ').
Mark Booth,
6

Kompilator był pierwszy . Został napisany bezpośrednio w kodzie maszynowym, ponieważ nie można było skompilować źródła bez kompilatora.

Artykuły w Wikipedii, takie jak ten na temat języków komputerowych, mogą odpowiedzieć na większość pytań. Jeśli nie, po prostu wybierz jedną z książek Tanenbauma, na przykład Structured Computer Organisation , która może odpowiedzieć na więcej pytań, niż możesz nawet zadać :)

Nie mogę powiedzieć nic bardziej szczegółowego, ponieważ twoje pytanie jest zbyt ogólne.

hellodanylo
źródło
20
Można również argumentować, że źródło było pierwsze, ponieważ dla pierwszych „komputerów” źródło było równoważne z plikiem binarnym (tj. Były programowane bezpośrednio w języku odczytywalnym maszynowo).
Joachim Sauer
5
@ Joachim Z definicji kod źródłowy to tekst czytelny dla człowieka, który jest tłumaczony przez kompilator na kod maszynowy. Dlatego sam kod maszynowy nie jest kodem źródłowym.
hellodanylo,
11
Kompilator był pierwszy, ale został zaimplementowany w biologicznych sieciach neuronowych.
Den
8
Dlaczego jest to tak wysoko głosowane? To jest źle. Kod źródłowy w językach wysokiego poziomu (zwłaszcza rachunek λ, Plankalkül i LISP) długo wyprzedza zarówno kompilatory, jak i interpretatory. To nawet nie bierze pod uwagę programów półformalnych, które napisała Ada Lovelace.
Konrad Rudolph,
4
@SkyDan Jaka jest zatem twoja definicja? Nie znam rozsądnej definicji, na którą odpowiedź byłaby poprawna (zarówno dla „kompilatora”, jak i „kodu źródłowego w języku wysokiego poziomu” - nie mówiąc już o niskim poziomie).
Konrad Rudolph
4

Tłumacze istnieli przed kompilatorami, więc kod źródłowy istniał przed kompilatorami.

Istnieje kilka bardzo ciekawych prelekcji na temat historii informatyki tutaj . Kod źródłowy kompilatora FORTRAN II powinien być dostępny, ale te linki są zepsute.

Artykuł z 1954 roku opisuje tłumacza Whirlwhind.

Jon Strayer
źródło
1

To pytanie jest silnie związane z naszą semantyczną interpretacją „kodu źródłowego”. Jeśli zdefiniujemy go jako „tekstowe instrukcje komputerowe, które są kompilowane”, prawdopodobnie najpierw był kompilator.

Bardziej skłonny jestem sięgać po coś bardziej autorytatywnego, na przykład artykuł Marka Harmana „Dlaczego analiza kodu źródłowego i manipulowanie zawsze będzie ważne” zaprezentowany podczas dziesiątej międzynarodowej konferencji roboczej IEEE na temat analizy kodu źródłowego i manipulacji

Definicja 1 (kod źródłowy): Dla celów przejrzystości „kod źródłowy” oznacza dowolny w pełni wykonywalny opis systemu oprogramowania. Dlatego jest tak skonstruowany, że zawiera kod maszynowy, języki bardzo wysokiego poziomu i wykonywalne reprezentacje graficzne systemów.

I myślę, że twoja odpowiedź jest domyślna w tej definicji - kod źródłowy z pewnością był pierwszy.

Kirk Broadhurst
źródło
„Prawdopodobnie najpierw był kompilator” - tylko jeśli zdefiniujesz „skompilowany” jako „przetłumaczony przez automatyczne narzędzie”, a nie „ręcznie przetłumaczony na kod maszynowy”.
Konrad Rudolph
Bardzo interesujący papier. I jak tej definicji kodu źródłowego - choć to sprawia, że moje pytanie nie-zapytania naprawdę ..
David Cowdena
@KonradRudolph nie jest jednostką wykonującą kompilację, czy to maszynową, ludzką czy boską interwencją, zwaną „kompilatorem”?
Kirk Broadhurst
0

Algorytmy zostały uporządkowane na papierze, a następnie Alus zostały połączone fizycznie / mechanicznie (ruchome druty). aby zmienić program, przesuń przewody i uruchom ponownie.

Później język asemblerowy uporządkowano na papierze, ręcznie przetłumaczono na kod maszynowy, a następnie używając przełączników itp., Aby wprowadzić go do pamięci RAM. Lub dziurkuj karty itp. Ostatecznie możesz stworzyć asembler, potem możesz programować w asemblerze, a nie kod maszynowy, a potem możesz stworzyć kompilator. W końcu możesz uruchomić ten kompilator. I twórz nowe języki i nowe kompilatory itp.

Pierwszy język nie był językiem, później pierwszym językiem był język asemblera. dla każdego procesora pierwszym językiem jest język asemblera (wyprowadzony z kodu maszynowego). Zestaw instrukcji jest najpierw zaprojektowany, a następnie sprzęt do jego wdrożenia, a następnie asembler, a następnie kompilatory.

old_timer
źródło