Ten artykuł jest lustrzanym artykułem tłumaczenia maszynowego, kliknij tutaj, aby przejść do oryginalnego artykułu.

Widok: 14293|Odpowiedź: 2

[C] Język C jest tak potężny, w jakim języku jest napisany?

[Skopiuj link]
Opublikowano 28.09.2019 16:51:21 | | |
"W jakim języku napisane jest samo C?"

Z innej perspektywy jest tak: zanim język C zadziała, musi zostać skompilowany, więc skąd pochodzi kompilator języka C? W jakim języku jest napisany? Jeśli jest napisane w samym C, czy najpierw jest jajko czy kura?

1

Załóżmy, że na świecie nie ma kompilatorów, zacznijmy od języka maszynowego i zobaczmy jak.

Język maszynowy może być wykonywany bezpośrednio przez CPU bez potrzeby kompilatora.

Jest też asembler, choć asembler jest tylko mnemotechniką do języka maszynowego, ale także musi być skompilowany do języka maszynowego, aby go wykonać, więc nie ma innego wyjścia, jak tylko użyć języka maszynowego do napisania tego pierwszego kompilatora (który nie będzie używany w przyszłości).

Problem asemblera został rozwiązany i jest to duży krok naprzód; obecnie możliwe jest użycie asemblera do napisania kompilatora języka C, który nazywamy przodkiem kompilatora C.

Dzięki temu przodkowi możesz skompilować dowolny program w języku C, więc czy możesz napisać kompilator w samym języku C? Po prostu skompiluj go z przodkami.

OK, po takiej warstwie w końcu udało mi się napisać kompilator w C, co jest naprawdę kłopotliwe.

W tym momencie kompilator C napisany przez poprzedni pakiet można porzucić.

Oczywiście, jeśli istniały inne języki wysokiego poziomu przed C, takie jak Pascal, to Pascal mógłby być użyty do napisania kompilatora C.

Mówi się, że kompilator pierwszego Pascala został napisany w Fortranie. Jako pierwszy język wysokiego poziomu, kompilator Fortrana powinien być napisany w asemblerze.

2

Oto ciekawa legenda o kompilatorze:

Legenda głosi, że Ken Thompson, jeden z wynalazców Uniksa, z pewnością siebie przechodził do dowolnej maszyny Unix w Bell Labs, wpisywał swoją nazwę użytkownika i hasło oraz potrafił zalogować się w sposób root!

Bell Labs jest pełne talentów, a inni wielcy ludzie postanowili znaleźć tę lukę, przeczytali kod źródłowy w C Uniksa i w końcu znaleźli backdoor logowania, a po wyczyszczeniu backdoora skompilowali Uniksa i uruchomili go, ale Thompson nadal mógł się zalogować.

Niektórzy uważają, że może być problem z kompilatorem i podczas kompilacji Uniksa wszczepiono tylne wejście, więc przepisali kompilator w C i ponownie skompilowali Uniksa z nowym kompilatorem.

Ale to nadal nie działa, Thompson nadal może się zalogować przez root, co jest naprawdę druzgocące!

Później sam Thompson odkrył sekret, był to pierwszy kompilator C, który miał problem, ten kompilator oczywiście zostanie wszczepiony w tylne wejście podczas kompilacji kodu źródłowego Uniksa, to za mało, co jeszcze lepsze, jeśli napiszesz nowy kompilator w języku C, zdecydowanie musisz go skompilować do kodu binarnego, co kompilować, używaj tylko pierwszego kompilatora napisanego przez Thompsona, okej, kompilator, który napisałeś, będzie zanieczyszczony, twój kompilator skompiluje Uniksa ponownie, Też wszczepię tylne wejście :-)

A propos, przypomina mi się incydent z XcodeGhost sprzed kilku lat, co po prostu oznacza, że w Xcode (pobrany z nieoficjalnych kanałów) został wszczepiony koń trojański, przez co aplikacje iOS skompilowane przez XCode zostały skażone, a te aplikacje mogły być wykorzystywane przez hakerów do nielegalnych działań.

Chociaż ten XCodeGhost jest daleki od Thompsona, przypomina nam, że podczas pobierania oprogramowania należy korzystać z formalnych kanałów, pobierać je z oficjalnej strony, szukać standardu HTTPS strony, a nawet weryfikować sumę kontrolną.

3

Niektórzy mogą zapytać: używam Hui do napisania akapitu Hello World, ale ktoś może użyć go do napisania złożonego kompilatora? Czy to możliwe?

Oczywiście, gdy rozwijano pierwszą generację Uniksa, nie było jeszcze języka C, a Ken Thompson i Dennis Ritchie pisali Uniksa na liniach montażowych.   Pierwsza wersja WPS została napisana przez Qiu Bojuna w Hui, a kompilator Turbo Pascal również został napisany przez Andersa w Hui, a zdolności bogów są nie do wyobrażenia zwykłym ludziom.

Dla kompilatorów możliwe jest także rozwijanie w sposób "snowballowy":

Biorąc jeszcze za przykład język C, pierwsza wersja może wybrać podzbiór języka C, na przykład obsługujący jedynie podstawowe typy danych, instrukcje sterowania procesem i wywołania funkcji...... Nazywamy ten podzbiór C0.

Następnie napisz kompilator w asemblerze i uzyskaj tylko podzbiór tego języka C0, dzięki czemu jest znacznie łatwiejszy do napisania.

Język C0 działa, a następnie rozszerzamy ten podzbiór, dodając struktury, wskaźniki, ...... i nazywając nowy język C1.

Kto pisze kompilator dla języka C1?   Oczywiście, to C0.

Gdy C1 działa, ponownie rozwiń funkcje języka, napisz kompilator w C1 i uzyskaj C2.

Potem jest C3, C4......  Na koniec dostajesz pełny język C.

Proces ten nazywa się bootstrappingiem, a po chińsku bootstrappingiem.





Poprzedni:Nowe funkcje .NET Core udostępniają plik wykonywalny w pojedynczym pliku
Następny:Dlaczego programiści pracują bez końca po godzinach?
Opublikowano 29.09.2019 09:27:54 |
W jakim języku samo C jest napisane?
Opublikowano 01.10.2019 23:54:34 |
W jakim języku samo C jest napisane?
Zrzeczenie się:
Całe oprogramowanie, materiały programistyczne lub artykuły publikowane przez Code Farmer Network służą wyłącznie celom edukacyjnym i badawczym; Powyższe treści nie mogą być wykorzystywane do celów komercyjnych ani nielegalnych, w przeciwnym razie użytkownicy ponoszą wszelkie konsekwencje. Informacje na tej stronie pochodzą z Internetu, a spory dotyczące praw autorskich nie mają z nią nic wspólnego. Musisz całkowicie usunąć powyższą zawartość z komputera w ciągu 24 godzin od pobrania. Jeśli spodoba Ci się program, wspieraj oryginalne oprogramowanie, kup rejestrację i korzystaj z lepszych, autentycznych usług. W przypadku naruszenia praw prosimy o kontakt mailowy.

Mail To:help@itsvse.com