Přemýšlíte, jak začít prázdniny? Už v úterý 1. července se bude konat Virtuální Bastlírna, tedy online setkání bastlířů, techniků, vědců i akademiků, kde se ve volné diskuzi probírají novinky ze světa techniky, ale i jiných zajímavých témat.
Za poslední měsíc jsme byli svědky plamenů několika raket. Zatímco malá raketa od Hondy se úspěšně vznesla a opět přistála, raketa od SpaceX se rozhodla letět všemi směry najednou. Díkybohu méně … více »Linus Torvalds zmínil, že souborový systém Bcachefs zřejmě odstraní z mainline Linuxu v začleňovacím okně pro vydání 6.17. Kent Overstreet mu totiž posílá kód s novou funkcionalitou i pro začlenění do kandidátů na vydání, kdy očekává pouze opravy chyb. Ken Overstreet byl již dříve z vývoje vyloučen kvůli konfliktní komunikaci.
Ministerstvo průmyslu a obchodu propaguje Microsoft. Ten ve spolupráci s Ministerstvem průmyslu a obchodu spouští AI National Skilling Plan v ČR. "Iniciativa Microsoftu přináší konkrétní a praktickou podporu právě tam, kde ji nejvíc potřebujeme – do škol, firem i veřejné správy.", říká ministr průmyslu a obchodu Lukáš Vlček.
Jste český ISP? Vyplněním krátkého dotazníku můžete pomoci nasměrovat vývoj nové generace routerů Turris Omnia [𝕏].
Celkové tržby společnosti Canonical za rok 2024 byly 292 milionů dolarů (pdf). Za rok 2023 to bylo 251 milionů dolarů.
Byla vydána verze 1.88.0 programovacího jazyka Rust (Wikipedie). Podrobnosti v poznámkách k vydání. Vyzkoušet Rust lze například na stránce Rust by Example.
Distribuce Tails specializující se ochranu online soukromí uživatele byla vydána ve verzi 6.17. Mimo jiné aktualizuje Tor Browser (14.5.4) a opravuje několik chyb.
Ubuntu nově pro testování nových verzí vydává měsíční snapshoty. Dnes vyšel 2. snapshot Ubuntu 25.10 (Questing Quokka).
Město Lyon posiluje svou digitální suverenitu a postupně nahrazuje software od společnosti Microsoft bezplatnými alternativami, zejména OnlyOffice pro kancelářské aplikace a Linux a PostgreSQL pro systémy a databáze.
Evropská občanská iniciativa Stop Destroying Videogames se snaží o to, aby vydavatelé, kteří spotřebitelům v Evropské unii prodávají videohry nebo na ně udělují licence, měli povinnost tyto hry ponechat ve funkčním (hratelném) stavu i po ukončení podpory ze své strany. Podpořit podpisem tuto iniciativu můžete v Systému pro online sběr podpisů.
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.
Tiskni
Sdílej:
break
tato verze C už umí. Jak v cyklech, tak ve switchi
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.
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í.
%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).
or EOF on end of file or errorKaždopádně rozumíme si. Prostě víc stavů než 256.
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.
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.)
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ů?