Nové číslo časopisu Raspberry Pi zdarma ke čtení: Raspberry Pi Official Magazine 166 (pdf).
Blíží se prázdniny a než se rozutečete k moři, je na čase se opět sejít na Virtuální Bastlírně - pravidelném setkání elektroniků, ajťáků, bastlířů a obecně nadšenců do techniky. Co si pro vás strahovští bastlíři připravili tentokrát? Určitě proberou blížící se Linux Days i další události. U softwaru se chvíli zdrží a poví si kupříkladu o tom, jak se zbavit Bambu Cloudu, ale nepřijít o možnost ovládat tiskárnu na dálku. Řeč dojde i na AI,
… více »Vývojáři postmarketOS vydali verzi 26.06 tohoto operačního systému pro chytré telefony vycházejícího z optimalizovaného a nakonfigurovaného Alpine Linuxu s vlastními balíčky. Přehled novinek v příspěvku na blogu. Na výběr jsou 4 uživatelská rozhraní: GNOME, KDE Plasma Mobile, Phosh a Sxmo.
Byla vydána nová verze 2.55.0 distribuovaného systému správy verzí Git. Přispělo 100 vývojářů, z toho 33 nových. Přehled novinek v příspěvku na blogu GitHubu a v poznámkách k vydání.
Craig Loewen na blogu Microsoftu oznámil veřejnou preview verzi WSL kontejnerů, tj. linuxových kontejnerů ve Windows Subsystem for Linux (WSL). Spouští se příkazem wslc.exe.
Byla vydána (𝕏, Bluesky) nová verze 2026.2 linuxové distribuce navržené pro digitální forenzní analýzu a penetrační testování Kali Linux (Wikipedie). Přehled novinek se seznamem 9 nových nástrojů v oficiálním oznámení na blogu.
Grafická aplikace Krokiet/Czkawka pro vyhledávání a odstraňovaní nepotřebných souborů (duplicitní soubory, prázdné složky, podobné obrázky, podobná videa, poškozené soubory a další) byla vydána ve verzi 12.0.0. Podrobný přehled novinek v příspěvku na Medium. Jedná se o poslední verzi frontendu Czkawka GTK nad Czkawka Core. Uživatelům se doporučuje migrovat na frontend Krokiet postavený nad frameworkem Slint. Představena byla aplikace Cedinia pro Android využívající Czkawka Core. Dostupná je jako APK pro ruční instalaci.
Po téměř třech letech od vydání verze 9 byla vydána nová verze 10 linuxové distribuce Mageia (Wikipedie). Přehled novinek v poznámkách k vydání.
Nourish (GitHub) je nový správce oken pro Linux. Tradiční plochy nahrazuje nekonečným plátnem a posouváním a přibližováním. Využívá vlastní kompozitor pro Wayland s názvem y5. Videoukázka.
Po 20 letech a 17 otevřených (open source) krátkých filmech Blender Studio oznámilo plán na svůj první celovečerní film. Cílem samozřejmě není jenom nový otevřený film, ale především vývoj a vylepšení otevřených nástrojů pro spolupráci napříč celým procesem a vytvoření otevřené příručky (playbook) pro filmovou produkci ve velkém měřítku s informacemi, které jsou obvykle dostupné pouze uvnitř komerčních studií, a pomoci tak nezávislým tvůrcům překonat technické a organizační bariéry.
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.
. [joke] va_arg to tehdy asi neumělo co? [/joke]
. 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ů?
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ů?