abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
včera 22:22 | Komunita

Společnost Purism představila kryptografický token Librem Key. Koupit jej lze za 59 dolarů. Token byl vyvinut ve spolupráci se společností Nitrokey a poskytuje jak OpenPGP čipovou kartu, tak zabezpečení bootování notebooků Librem a také dalších notebooků s open source firmwarem Heads.

Ladislav Hagara | Komentářů: 0
včera 20:33 | Nová verze

Společnost NVIDIA oficiálně vydala verzi 10.0 toolkitu CUDA (Wikipedie) umožňujícího vývoj aplikací běžících na jejich grafických kartách. Přehled novinek v poznámkách k vydání.

Ladislav Hagara | Komentářů: 0
včera 20:00 | Upozornění

Příspěvek Jak přežít plánovanou údržbu DNS na blogu zaměstnanců CZ.NIC upozorňuje na historicky poprvé podepsání DNS root zóny novým klíčem dne 11. října 2018 v 18:00. Software, který nebude po tomto okamžiku obsahovat nový DNSSEC root klíč, nebude schopen resolvovat žádná data. Druhým důležitým datem je 1. února 2019, kdy významní výrobci DNS softwaru, také historicky poprvé, přestanou podporovat servery, které porušují DNS standard

… více »
Ladislav Hagara | Komentářů: 4
včera 15:55 | Pozvánky

Spolek OpenAlt zve příznivce otevřených řešení a přístupu na 156. brněnský sraz, který proběhne v pátek 21. září od 18:00 v restauraci Na Purkyňce na adrese Purkyňova 80.

Ladislav Hagara | Komentářů: 0
včera 13:22 | Nová verze

Alan Griffiths z Canonicalu oznámil vydání verze 1.0.0 display serveru Mir (GitHub, Wikipedie). Mir byl představen v březnu 2013 jako náhrada X serveru a alternativa k Waylandu. Dnes Mir běží nad Waylandem a cílen je na internet věcí (IoT).

Ladislav Hagara | Komentářů: 0
20.9. 22:00 | Nasazení Linuxu
Stabilní aktualizace Chrome OS 69 (resp. Chromium OS), konkrétně 69.0.3497.95, přináší mj. podporu linuxových aplikací. Implementována je pomocí virtualizace, a proto je tato funkce také omezena na zařízení s dostatkem paměti a podporou hardwarové akcelerace, tudíž nejsou podporovány chromebooky s 32bitovými architekturami ARM, či Intel Bay Trail (tzn. bez Intel VT-x).
Fluttershy, yay! | Komentářů: 5
20.9. 21:32 | Zajímavý projekt
Došlo k uvolnění linuxové distribuce CLIP OS, vyvíjené francouzským úřadem pro kybernetickou bezpečnost ANSSI, jako open source. Vznikla za účelem nasazení v úřadech, kde je potřeba omezit přístup k důvěrným datům. Je založená na Gentoo.
Fluttershy, yay! | Komentářů: 1
20.9. 16:00 | Komerce

Zjistěte více o bezpečné a flexibilní architektuře v cloudu! IBM Cloud poskytuje bezpečné úložiště pro Vaše obchodní data s možností škálovatelnosti a flexibilitou ukládání dat. Zároveň nabízí prostředky pro jejich analýzu, vizualizaci, reporting a podporu rozhodování.

… více »
Fluttershy, yay! | Komentářů: 12
20.9. 12:22 | Nová verze

V dubnu letošního roku Mozilla představila webový prohlížeč pro rozšířenou a virtuální realitu Firefox Reality (GitHub). V úterý oznámila vydání verze 1.0. Ukázka na YouTube. Firefox Reality je k dispozici pro Viveport, Oculus a Daydream.

Ladislav Hagara | Komentářů: 2
20.9. 12:00 | Komunita

V srpnu loňského roku společnost Oracle oznámila, že Java EE (Enterprise Edition) bude uvolněna jako open source. O měsíc později bylo rozhodnuto, že tato open source Java EE bude přejmenována a předána Eclipse Foundation. Nové jméno bylo oznámeno v únoru letošního roku. Z Java EE se stala Jakarta EE. Eclipse Foundation včera oznámila dosažení dalšího milníku. Zdrojové kódy aplikačního serveru GlassFish jsou již k dispozici v git repozitářích Eclipse Foundation (GitHub).

Ladislav Hagara | Komentářů: 0
Na optické médium (CD, DVD, BD aj.) jsem naposledy vypaloval(a) data před méně než
 (13%)
 (14%)
 (21%)
 (23%)
 (25%)
 (4%)
 (1%)
Celkem 384 hlasů
 Komentářů: 33, poslední 16.9. 11:55
Rozcestník

Historické kompilátory jazyka C na vlastní kůži (1)

30.6. 10:42 | Přečteno: 3708× | Výběrový blog

Před časem jsem se ptal staršího kolegy, jestli někdy na vlastní oči viděl zdrojový kód nějakého starého kompilátoru vzniklý v dobách, kdy související matematická teorie překladačů teprve vznikala, protože udělat kompilátor pro jazyky, jako je C, jistě byla výzva. Bohužel neviděl, takže nažhavme stroje času, musíme se podívat sami.

Než se nám stroje času nažhaví, můžeme se zatím na to, co nás zajímá, podívat pomocí konvenčnější techniky. Jako první se nám do hledáčku dostane jedinečná historická perla. Nic menšího, než první dochovaný překladač jazyka C z roku 1972 napsaný v jazyce C, tedy plně bootstrapovatelný.

První překladač jazyka C samozřejmě nebyl napsán v Céčku. Na začátku byl překladač jazyka B napsaný v jazyce BCPL. Když se podařilo provést bootstrapping jazyka B, tedy napsat jeho funkční překladač v něm samotném, Ritchie a Thomson tento jazyk zkoušeli dále vylepšit. Výsledkem jejich úsilí byl jazyk C, jehož překladač byl z B přepsán do C. Ten se naštěstí dochoval, takže si jeho bootstrapping můžeme zopakovat sami. Stačí nám k tomu počítač PDP-11 s nainstalovaným dobovým Unixem a samozřejmě už přeložený překladač jazyka C.

Pokud jste teď šli zkontrolovat, jestli je váš stroj času už dostatečně teplý, mohli jste si těch pár kroků a dávek radiace ušetřit, protože díky řadě nadšenců vám k tomu bude stačit i váš zoufale moderní počítač. Potřebujete jen simulátor Apout a kopii filesystému Unixu (v1bins.tar.gz). Vše si můžete snadno opatřit zde.

Apout je simulátor počítače PDP-11, který překládá systémová volání na nativní volání Unixu, na němž běží, díky čemuž nepotřebuje složitě emulovat veškerý hardware a disky. Je proto také velice rychlý a pohodlný na používání. Stačí ho přeložit příkazem make. Zmíněná kopie filesystému Unixu také naštěstí obsahuje překladač Céčka, který je schopen náš dochovaný zdrojový kód přeložit. Jednoduše rozbalíte soubor last1120c.tar.gz, v souboru mak upravíte cestu k rozbalenému rootu Unixu, spustíte a odměnou vám bude binární soubor cc o velikosti 4,5 kB, jímž můžete nahradit původní překladač a provést vše znovu, pokud chcete bootstrapping opravdu dotáhnout až do konce.

Doporučuji si obsah skriptu mak řídící překlad prohlédnout, i když odkrývá jen část pravdy. Kompilátor totiž sám překlad do strojového kódu neprovádí, ale dělá překlad do assembleru, který poté přeloží voláním programu as. Vše se slinkuje využitím programu ld, který také nevolá obslužný skript, ale program překladače. Jak vidno, i v bezmála padesát let starém systému si můžete připadat jako doma.

Jak tedy dokázali s omezenými hardwarovými prostředky a doslova v pár lidech na začátku sedmdesátých let napsat překladač Céčka? V první řadě je třeba si uvědomit, že Céčko z roku 1972 není ani zdaleka podobné jazyku C, jak ho známe dnes. Je dokonce výrazně jednodušší než “standard” K&R. I starými překladači Céčka jeho zdrojáky nepřeložíte. Zapomeňte na preprocesor, zapomeňte dokonce i na struktury, zapomeňte na většinu typů, zapomeňte na typedef. Při pohledu na zdrojáky v něm napsané přímo bije do očí, že se skutečně jedná jen o jakousi nadstavbu nad assemblerem.

Každému, kdo se o Céčko zajímá alespoň okrajově, doporučuji se na zdrojový kód toho překladače podívat. Malá ochutnávka, kód funkce printf:

printf(fmt,x1,x2,x3,x4,x5,x6,x7,x8,x9)
char fmt[]; {
	extern printn, putchar, namsiz, ncpw;
	char s[];
	auto adx[], x, c, i[];

	adx = &x1; /* argument pointer */
loop:
	while((c = *fmt++) != '%') {
		if(c == '\0')
			return;
		putchar(c);
	}
	x = *adx++;
	switch (c = *fmt++) {

	case 'd': /* decimal */
	case 'o': /* octal */
		if(x < 0) {
			x = -x;
			if(x<0)  {	/* - infinity */
				if(c=='o')
					printf("100000");
				else
					printf("-32767");
				goto loop;
			}
			putchar('-');
		}
		printn(x, c=='o'?8:10);
		goto loop;

	case 's': /* string */
		s = x;
		while(c = *s++)
			putchar(c);
		goto loop;

	case 'p':
		s = x;
		putchar('_');
		c = namsiz;
		while(c--)
			if(*s)
				putchar(*s++);
		goto loop;
	}
	putchar('%');
	fmt--;
	adx--;
	goto loop;
}

Jak vidíte, není třeba uvádět návratový typ funkce, protože prostě každá vrací int (už víte, proč getchar vrací int?). Typy argumentů se uvádí ve stylu K&R, ale jen pro ty, které nejsou int. Všechny symboly použité ve funkci včetně jmen volaných funkcí se explicitně uvádí a to dokonce i pokud je použitá funkce definována ve stejném souboru (ale ne vždy je to nutné). Ukazatele se deklarují jinak a zpracování variabilního počtu argumentů funkce je řešeno stylem chytré horákyně. Časté používání goto je ale jen specifikem této funkce, jinde je spíše výjimečné.

Nutno uznat, že tato primitivní verze Céčka má svoje nesporné kouzlo. Takový roztomilý zašlý plyšový medvídek, co ležel několik desetiletí zapomenutý v bedně na půdě. Škoda, že při tak relativně jednoduchém jazyce tenkrát neudělali alespoň bezkonfliktní gramatiku.

       

Hodnocení: 100 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Vložit další komentář

xxx avatar 30.6. 12:22 xxx | skóre: 42 | blog: Na Kafíčko
Rozbalit Rozbalit vše Re: Historické kompilátory jazyka C na vlastní kůži (1)
Neni tam to goto nahodou proto, ze jedna z tech iteraci prekladace neumela vnorene cykly?
Please rise for the Futurama theme song.
30.6. 17:35 pc2005 | skóre: 36 | blog: GardenOfEdenConfiguration | liberec
Rozbalit Rozbalit vše Re: Historické kompilátory jazyka C na vlastní kůži (1)
Mě přijde, že tam je ten goto protože ta verze C ještě neumí break, ono by to dávalo smysl, ten break bude jen symbolické pojmenování skoku na konec switch bloku.
1.7. 11:12 Pavel Křivánek | skóre: 26 | blog: Kvičet nezávaznou konverzaci
Rozbalit Rozbalit vše Re: Historické kompilátory jazyka C na vlastní kůži (1)
break tato verze C už umí. Jak v cyklech, tak ve switchi
Mír je, když se střílí jinde.
30.6. 12:42 Miloslav Ponkrác
Rozbalit Rozbalit vše PDP-11 C
Ač sem normálně nepíši, u výjimečně kvalitních článků, jako je tento, dělám výjimku.

Je škoda, že jste si nevšimli řady artefaktů u PDP-11 C. Například striktích mezer kolem přiřazování. Protože x = -x je to co čekáte. Složené přiřazovací operátory byly převrácené, takže x=-x je ve skutečnosti dnešní x -= x.

Zároveň je vidět, že nic nebylo přenositelné, což je jev, který do značné míry C zůstal v řadě špatných návyků Céčkových programátorů. Třeba v té funkci printf se volně zaměňuje int a pointer, což řada programátorů dělá dodnes - je to děsně frajerské a připomíná to systémové programovánání - ač si velice snadno natlučou nos.

Absence čehokoli jiného než signed integer způsobila, že máme takové ptákoviny v C/C++, jako jsou záporné kódy znaků ve vyšší polovině znakové tabulky.

Absolutně se nepočítalo s tím, že by C mohlo kdy chodit na něčem menším, než jsou 32bitové procesory. I proto se univerzální int považovalo za absolutně dostatečné pro všechno.
30.6. 16:57 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
Rozbalit Rozbalit vše Re: PDP-11 C
Absolutně se nepočítalo s tím, že by C mohlo kdy chodit na něčem menším, než jsou 32bitové procesory. I proto se univerzální int považovalo za absolutně dostatečné pro všechno.
Kdyby tak Ritchie umel cist z hvezd, ... a vedel, kde se C bude pouzivat za 40 nebo 50 let.

Jeden z duvodu, proc se dostalo C takove uspechu a pouziva se dodnes, je, ze bylo navrzeno jako nastroj, ktery mel resit konkretni problem (implementaci unixu) a ne jako univerzalni reseni vsech problemu.
Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
30.6. 18:25 Radovan
Rozbalit Rozbalit vše Re: PDP-11 C
"že by C mohlo kdy chodit na něčem menším, než jsou 32bitové procesory"

Proto ho napsali na 16bitovém PDP-11.
děkuji za doplnění
Mír je, když se střílí jinde.
30.6. 17:36 pc2005 | skóre: 36 | blog: GardenOfEdenConfiguration | liberec
Rozbalit Rozbalit vše Re: Historické kompilátory jazyka C na vlastní kůži (1)
Ty napevno daný parametry printfu :-D. [joke] va_arg to tehdy asi neumělo co? [/joke]
30.6. 18:14 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
Rozbalit Rozbalit vše Re: Historické kompilátory jazyka C na vlastní kůži (1)
Za me naprosto elegantni reseni (pro tu dobu). Nepotrebujes zadny kod navic a usetris drahocenou pamet i strojove cykly.
Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
xxx avatar 30.6. 18:30 xxx | skóre: 42 | blog: Na Kafíčko
Rozbalit Rozbalit vše Re: Historické kompilátory jazyka C na vlastní kůži (1)
Srandicky, srandicky, ale potkat takhle napsenej debug_print neni v embedded svete zas tak neobvykla zalezitost.
Please rise for the Futurama theme song.
1.7. 06:21 pc2005 | skóre: 36 | blog: GardenOfEdenConfiguration | liberec
Rozbalit Rozbalit vše Re: Historické kompilátory jazyka C na vlastní kůži (1)
Jj však i já takhle občas debug_print píšu :-D. Mě ale spíš zarazilo, jak se vlastně teda dělal printf s třeba jen dvěma argumentama (formát a proměnná), to šlo volat funkci s jiným počtem parametrů?
1.7. 08:42 Gilhad | skóre: 20 | blog: gilhadoviny
Rozbalit Rozbalit vše Re: Historické kompilátory jazyka C na vlastní kůži (1)
Prinejhorsim jsi tam doplnil prislusny pocet nul a ono je to zignorovalo pote, co naplnilo posledni %neco ve formatu. Ale mozna to meli nejak fikane osetrene, jako ze se pro nepouzite promenne pouzily nahodne hodnoty, co zrovna byly na zasobniku (ci v registrech, nebo kde se ty promenne predavaly) - ono se to docela dobre mapuje na nektere ASM instrukce (jako posunuti SP o danou hodnotu a potom RET s danou hodnotou, ktery ho zase posune zpatky.)

Pak by prislusne promenne byly v tele funkce dostupne, i kdyz s neprirazenou (tedy nahodnou) hodnotou a nic by ti nebranilo je tam pouzivat, pokud by to davalo smysl. (Treba bys mel u nejake jine funkce konvenci, ze kdyz je x1==0, tak se i x2 a x3 nastavi na nulu, jinak obsahuji parametry pro vypocet - a vypocet uz by pouzival x1, x2 a x3 s tim, ze jsou definovane, protoze prece bys to nevolal blbe, ze. A mohl by jednoduse zahrnovat vic pripadu ... s tim, ze se x2 a x3 pouzivaji a treba v cyklu zvetsuji o nejakou hodnotu a na konci vypisou ...)
1.7. 10:59 Pavel Křivánek | skóre: 26 | blog: Kvičet nezávaznou konverzaci
Rozbalit Rozbalit vše Re: Historické kompilátory jazyka C na vlastní kůži (1)
printArgs(var1, var2, var3)
{
	printff("args: %d %d %d\n", var1, var2, var3);
}

main(argc, argv)
int argv[]; {
	printArgs(1);
}
vypíše args: 1 0 16402

Jen hádám, že prostě v rámci funkce brali argumenty přímo z paměti relativně k vrcholu SP a uklid zásobníku se staral ten, kdo prováděl volání.

Mír je, když se střílí jinde.
1.7. 17:15 pc2005 | skóre: 36 | blog: GardenOfEdenConfiguration | liberec
Rozbalit Rozbalit vše Re: Historické kompilátory jazyka C na vlastní kůži (1)
Jo taky mě to tak připadá, dobrá betaverze jazyka :-D.
1.7. 20:18 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: Historické kompilátory jazyka C na vlastní kůži (1)
Právě proto byla zrovna takhle céčková volací konvence navržena a funguje tak dodnes. Tedy až na to, že modernější ABI předávají prvních několik parametrů v registrech - např. na x86_64 je jich šest (%rdi, %rsi, %rdx, %rcx, %r8, %r9). Ale i pak pořád platí, že pokud volající předá víc parametrů, než si volaný myslí, že jich má být, bude to stejně fungovat (pokud souhlasí typy).
30.6. 23:33 sad
Rozbalit Rozbalit vše Re: Historické kompilátory jazyka C na vlastní kůži (1)
12.7. 13:18 .
Rozbalit Rozbalit vše Re: Historické kompilátory jazyka C na vlastní kůži (1)
Tak schválně se nad tou otázkou proč getchar vrací int ještě jednou zamysli.
12.7. 21:16 pc2005 | skóre: 36 | blog: GardenOfEdenConfiguration | liberec
Rozbalit Rozbalit vše Re: Historické kompilátory jazyka C na vlastní kůži (1)
Na chybové hodnoty by mohl vracet klidně i signed short :-P.
13.7. 04:54 Radovan
Rozbalit Rozbalit vše Re: Historické kompilátory jazyka C na vlastní kůži (1)
Jenže on nevrací chybové hodnoty, ale znak nebo EOF. Což je 257 stavů, pokud teda nepracuješ výhradně se sedmibitovým ASCII.
13.7. 18:58 pc2005 | skóre: 36 | blog: GardenOfEdenConfiguration | liberec
Rozbalit Rozbalit vše Re: Historické kompilátory jazyka C na vlastní kůži (1)
RTM:
or EOF on end of file or error
Každopádně rozumíme si. Prostě víc stavů než 256.
14.7. 02:07 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: Historické kompilátory jazyka C na vlastní kůži (1)
Neznám platformu, kde by signed short (o kterém se píše v komentáři, na který jste odpovídal) pro reprezentaci 257 různých hodnot nestačil.
14.7. 06:31 Radovan
Rozbalit Rozbalit vše Re: Historické kompilátory jazyka C na vlastní kůži (1)
Tak to bych chtěl vidět ty tvoje platformy, protože já na těch co znám do osmi bitů 257 různých hodnot opravdu nacpat nedokážu :-D
14.7. 14:19 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: Historické kompilátory jazyka C na vlastní kůži (1)
Tak třeba gcc na i386, x86_64, ppc, ppc64, ppc64le, s390, s390x, armv7l, aarch64, … na všech má typ signed short 16 bitů, což na 257 různých hodnot bohatě stačí. Zato na příklad nějaké, kde by měl 8 bitů, vzpomínám marně. (Ale možná se nějaká taková kdysí dávno opravdu používala.)
15.7. 12:23 Radovan
Rozbalit Rozbalit vše Re: Historické kompilátory jazyka C na vlastní kůži (1)
A jak to bylo na PDP-11, kde UNIX vznikl?
15.7. 16:40 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: Historické kompilátory jazyka C na vlastní kůži (1)

Tady osobní zkušeností posloužit nemohu, ale Kernighan a Ritchie ve své knize uvádějí, že to bylo… 16 bitů. A ani na žádném dalším systému, které uvádějí jako příklad v téže tabulce (Honeywell 6000, IBM 370, Interdata 8/32), nemá short méně než 16 bitů - a už vůbec ne tak málo, aby nestačil k zápisu 257 různých hodnot. (Abychom byli úplně přesní: na Honeywell 6000 má char 9 bitů - ale short 36, takže pořád ostře větší.)

Takže se zeptám přímo: víte vy o nějaké reálně používané platformě, kde by měl datový typ short (resp. signed short) méně než 9 bitů?

15.7. 17:19 Kate | skóre: 8
Rozbalit Rozbalit vše Re: Historické kompilátory jazyka C na vlastní kůži (1)
Teď jsem se jen tak cvičně koukla na Power C na Commodore 64 a taky 2 byty. Taková platforma asi fakt existovat nebude :)
15.7. 19:20 pc2005 | skóre: 36 | blog: GardenOfEdenConfiguration | liberec
Rozbalit Rozbalit vše Re: Historické kompilátory jazyka C na vlastní kůži (1)
Já to bral z wikipedie, kde píšou pro signed short at least [−32,767, +32,767].

Ale zase ve světle toho novějšího blogpostu s ascii, kde to pro 128-255 podteče/přeteče by možná stačil i signed char.
17.7. 18:31 Radovan
Rozbalit Rozbalit vše Re: Historické kompilátory jazyka C na vlastní kůži (1)
Není nic jednoduššího, než si osobní zkušenost pořídit: http://pdp11.aiju.de ;-)
18.7. 21:11 Martin Mareš
Rozbalit Rozbalit vše Re: Historické kompilátory jazyka C na vlastní kůži (1)
Důvod je poměrně jednoduchý: v Céčku nemá valný smysl definovat funkci, která vrací cokoliv menšího než int, jelikož její výsledek se díky integer promotions stejně okamžitě přetypuje na int. Vracet menší typ má smysl spíš jako dokumentace, případně to občas (třeba v případě booleovského typu) pomůže optimalizacím založených na rozsazích hodnot.

Založit nové vláknoNahoru

ISSN 1214-1267   www.czech-server.cz
© 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.