Tento článok je zrkadlovým článkom o strojovom preklade, kliknite sem pre prechod na pôvodný článok.

Pohľad: 14293|Odpoveď: 2

[C] Jazyk C je taký silný, v akom jazyku je napísaný?

[Kopírovať odkaz]
Zverejnené 28. 9. 2019 16:51:21 | | |
"V akom jazyku je samotné C napísané?"

Z iného pohľadu je to tak: predtým, než sa jazyk C spustí, musí byť skompilovaný, tak odkiaľ pochádza kompilátor jazyka C? V akom jazyku je to napísané? Ak je to napísané priamo v C, je najskôr vajce alebo sliepka?

1

Predpokladajme, že na svete neexistujú žiadne kompilátory, začnime so strojovým jazykom a uvidíme, ako to pôjde.

Strojový jazyk môže CPU vykonávať priamo bez potreby kompilátora.

Potom je tu assembler, hoci assembler je len mnemotechnická pomôcka pre strojový jazyk, ale aj ten musí byť skompilovaný do strojového jazyka na jeho vykonanie, takže nie je iná možnosť, než použiť strojový jazyk na napísanie tohto prvého kompilátora (ktorý sa v budúcnosti nepoužije).

Problém assembleru je vyriešený a je to veľký krok vpred, v tomto čase je možné použiť assembler na napísanie C jazykového kompilátora, ktorý považujeme za predchodcu C kompilátora.

S týmto predkom môžete kompilovať akýkoľvek program v jazyku C, takže môžete napísať kompilátor priamo v jazyku C? Jednoducho to zostav s predkami.

OK, po takejto vrstve som konečne napísal kompilátor v C, čo je naozaj problém.

V tomto bode môže byť C kompilátor napísaný predchádzajúcim balíkom opustený.

Samozrejme, ak by pred C existovali iné vysokoúrovňové jazyky, ako napríklad Pascal, Pascal by sa dal použiť na napísanie C kompilátora.

Uvádza sa, že kompilátor prvého Pascalu bol napísaný vo Fortrane. Ako prvý vysokoúrovňový jazyk by mal byť Fortranov kompilátor napísaný v assembleri.

2

Tu je zaujímavá legenda o zostavovateľovi:

Legenda hovorí, že Ken Thompson, jeden z vynálezcov Unixu, sa priblížil k akémukoľvek unixovému stroju v Bell Labs, zadal svoje používateľské meno a heslo a mohol sa prihlásiť cez root!

Bell Labs je plné talentu a niektorí ďalší veľkí býci sľúbili, že túto zraniteľnosť nájdu, prečítali si zdrojový kód Unixu v C a nakoniec našli spätné dvierka na prihlásenie, po ich vyčistení skompilovali Unix a spustili ho, ale Thompson sa stále dokázal prihlásiť.

Niektorí ľudia si myslia, že môže byť problém s kompilátorom a pri kompilácii Unixu sa implantovali zadné dvierka, takže prepísali kompilátor v C a znovu skompilovali Unix s novým kompilátorom.

Ale stále to nefunguje, Thompson sa stále môže prihlásiť cez root, čo je naozaj zdrvujúce!

Neskôr Thompson sám odhalil tajomstvo, bol to prvý C kompilátor, ktorý mal problém, tento kompilátor bude samozrejme implantovaný do zadných vrátok pri kompilácii zdrojového kódu Unixu, to nestačí, a čo je ešte lepšie, ak napíšete nový kompilátor v jazyku C, určite ho musíte skompilovať do binárneho kódu, čo kompilovať, použite len prvý kompilátor napísaný Thompsonom na kompiláciu, dobre, kompilátor, ktorý ste napísali, bude znečistený, váš kompilátor opäť skompiluje Unix, Tiež implantujem zadné vrátka :-)

Keď už o tom hovoríme, pripomína mi to incident XcodeGhost spred niekoľkých rokov, čo jednoducho znamená, že do Xcode bol implantovaný trójsky kôň (stiahnutý z neoficiálnych kanálov), takže iOS aplikácie kompilované XCode boli kontaminované a tieto aplikácie mohli hackeri použiť na nelegálne veci.

Hoci je tento XCodeGhost ďaleko od Thompsonovho, pripomína nám, že pri sťahovaní softvéru by ste mali použiť formálne kanály, stiahnuť ho z oficiálnej webovej stránky, vyhľadať HTTPS štandard stránky a dokonca overiť kontrolný súčet.

3

Niektorí sa môžu pýtať: Používam Hui na napísanie odseku Hello World, ale niekto ho môže použiť na napísanie komplexného kompilátora? Je to možné?

Samozrejme, keď bola vyvinutá prvá generácia Unixu, neexistoval žiadny jazyk C a Ken Thompson a Dennis Ritchie písali Unix pomocou montážnych liniek.   Prvú verziu WPS napísal Qiu Bojun v jazyku Hui a kompilátor Turbo Pascal tiež napísal Anders v Hui, a schopnosti bohov si bežní ľudia nedokážu predstaviť.

Pre kompilátory je tiež možné vyvíjať "snehovú guľu" spôsobom:

Ak vezmeme ako príklad jazyk C, prvá verzia si môže vybrať podmnožinu jazyka C, napríklad podporovať len základné dátové typy, príkazy riadenia procesu a volania funkcií...... Túto podmnožinu nazývame C0.

Potom napíš kompilátor v assembleri a získaj len podmnožinu tohto jazyka C0, aby bolo oveľa jednoduchšie ho napísať.

Jazyk C0 funguje, a potom túto podmnožinu rozširujeme pridaním štruktúr, ukazovateľov, ...... a názvom nového jazyka C1.

Kto píše kompilátor pre jazyk C1?   Samozrejme, je to C0.

Keď C1 funguje, opäť rozšírte funkcie jazyka, napíšte kompilátor v C1 a získajte C2.

Potom je tu C3, C4......  Nakoniec dostanete plný jazyk C.

Tento proces sa nazýva bootstrapping, v čínštine sa to nazýva bootstrapping.





Predchádzajúci:Nové funkcie .NET Core uvoľňujú spustiteľný súbor s jedným súborom
Budúci:Prečo programátori pracujú nekonečné nadčasy?
Zverejnené 29. 9. 2019 9:27:54 |
V akom jazyku je samotné C napísané?
Zverejnené 1. 10. 2019 23:54:34 |
V akom jazyku je samotné C napísané?
Vyhlásenie:
Všetok softvér, programovacie materiály alebo články publikované spoločnosťou Code Farmer Network slúžia len na vzdelávacie a výskumné účely; Vyššie uvedený obsah nesmie byť použitý na komerčné alebo nezákonné účely, inak nesú všetky následky používateľmi. Informácie na tejto stránke pochádzajú z internetu a spory o autorské práva s touto stránkou nesúvisia. Musíte úplne vymazať vyššie uvedený obsah zo svojho počítača do 24 hodín od stiahnutia. Ak sa vám program páči, podporte originálny softvér, zakúpte si registráciu a získajte lepšie originálne služby. Ak dôjde k akémukoľvek porušeniu, kontaktujte nás prosím e-mailom.

Mail To:help@itsvse.com