O Watcomu se tehdy rikaly legendy a nebyl spatny, i s vlastnim 32bitovym extenderem. Rekl bych, ze vetsina her v dobach 386 v nem byla psana, ale my ve skole meli TP a potom i ten BC.
djgpp prisel o par let pozdeji, to byla pecka, i kdyz casy prekladu na 486 byly dlouhe - clovek tehdy pochopil, proc se preklada a linkuje oddelene :)
to je pravda, ze o Watcomu se rikalo, jak je skvelej. Taky jsme ho pouzivali, ale okolo 2000 (nebo tesne pred?) prisel ICC a ten byl minimalne o level vys, taky umel parovani instrukci, streaming SIMD atd. Akorat to uz je doba Windows, ne DOSu.
Mírně upřesním, jak je to s tím extenderem.
Firma PharLap dodávala dva extendery. Šestnáctibitový DOS16M, který využívá protected mode i286 a třicetidvoubitový DOS4G, který využívá protected mode i386. Oba se prodávaly zvlášť a stály pěknou raketu.
Součástí instalace Watcomu byla odlehčená verze DOS4GW, která měla, proti DOS4G, nějaká omezení.
Drobná oprava - extendery se jmenovaly DOS/16M a DOS/4G resp. DOS/4GW a před PharLapem je dodávala firma Rational Systems.
Extendery PharLapu (286|DOS, 386|DOS) a Rational Systems (DOS/4G) byly konkurenci produkty, to motate do sebe
Myslím si, že by se hodilo ukázat i 16bitový, nebo alespoň 32bitový výstup GCC. Moje instalace GCC se s volbou -m16 o 16bitový výstup snaží – ale vypadne z ní 32bitový elf plný 66h prefixů. I tak mi to přijde víc relevantní než ukazovat 64bitový kód, obzvlášť používající SIMD instrukce. SIMD instrukce nedávají při porovnávání s 16bitovou x86 smysl.
no já měl právě se 16bitovým výstupem taky problémy, ten překladač na to nebyl nikdy stavěnej. Ale zkusím to nějak ohnout. Nicméně cílem bylo hlavně se podívat na to, jak vypadají výsledky "překladačů z doby kamenné" z dneškem, kde etalonem je gcc a clang.
Tak existuje port gcc pro ia16 který umí 16bitovy režim včetně segmentovani v real mode. Je používaný např. Freedosem.
Tak jsem ten -m16 zkoušel a vygeneruje to 16bitový kód, ale s 32bitovými registry atd. V podstatě tedy jako DOS na 386 nebo 486. Předpokládám, že to používá jádro pro boot v realtime a přechod do chráněného režimu.
Když se to donutí použít 16bitové registry, tak to vypadá takto:
short int add(short int a, short int b) {
return a+b;
}
A optimalizace dopadne:
mov eax, DWORD PTR [esp+8]
add ax, WORD PTR [esp+4]
ret
proč tam dává EAX je ovšem trošku záhadou :-)
Zahadou to nie je, je to priamo v dokumentacii:
The -m16 option is the same as -m32, except for that it outputs the .code16gcc assembly directive at the beginning of the assembly output so that the binary can run in 16-bit mode.
Taktiez vidno, ze stale pouziva 32-bit ABI (premenne na zasobniku su zarovnane na 32-bit).
Skutocny 16-bitovy rezim ale v gcc bol, minimalne Atari ho pouzivalo v prvej polovici 90-tych rokov.
14. 5. 2025, 09:03 editováno autorem komentáře
Jo nakonec me docvaklo, ze tim prvnim mov si vynuloval hornich 16bitu a nemusel delat movzx atd. No je to takovej hybridni model.
"Skutocny 16-bitovy rezim ale v gcc bol, minimalne Atari ho pouzivalo v prvej polovici 90-tych rokov."
ktery Atari máš na mysli. Ti měli jen osmibitové a 32bitové stroje ne? Nebo myslíš nějaké herní automaty?
Digital Mars D je strašně hezkej jazyk, škoda že se víc nechytil, i když v. určitou dobu měl docela slušnej náběh.
Znám lidi, co ho používají, ale je to tak, máš pravdu, nakonec se nechytil. I když v Tiobe indexu je někde okolo 40 místa, což je úspěch (i takové Clojure je níž).
K Zortechu bych dodal, že původně ho dodávala firma Zortech Inc., pozděj ho nějakou dobu měl Symantec, takže se i změnilo jméno na Symantec C++ a teprve potom byl Digital Mars.
Mám dojem, že k němu existoval i protected mode extender.
Zortechem resp. Symantecem byly builděné např. Norton Tools nebo Partition Magic.
Watcom zase původně byl školní projekt na University of Waterloo. Odtud to jméno, jako 'Waterloo compiler'.
Jeho další zajímavostí je, že měl knihovny a uměl linkovat NLM moduly pro Novell Netware. To drtivá většina ostatních vývojových prostředí neuměla.
A OpenWatcom to umí do dnes.
Z těch méně známých kompilátorů a vývojových prostředí bych ještě připomněl IBM VisualAge for C++ pro OS/2 a Metrowerks CodeWarrior, který je jinak známý spíš v oblasti embedded. Existovala ale i verze pro PC.
Druhý jmenovaný také patřil k nemnoha vývojovým prostředím, podporujícím Novell Netware NLM.
ten uz je ciste 32bitovej. Ja jsem hlavne nechtel, aby z toho vypadl BCC. U Watcomu to nevadi, ten taky umi generovat 32bitovy kod. Hmm ale priste gcc pro DOS zkusim pridat.
tak priste bude hlavne 32bitovy kod, takze i djgpp
(na ten mam dobre vzpominky, delal jsem v tom bakalarku v RHIDE, sice preklady trvaly na 486 dlouho, ale byl to 32bitovej kod bez omezeni DOSu)
Nespomína si niekto?
Myslím, že v PC World bol v jednom čísle článok o tom, že C vzniklo ako vtip. Dal nám to raz niekto prefotené. Vraj dlho kompiluje a veľa riadkov a tak. Dlhé roky som si myslel, že akí sú ľudia hlúpi, že naleteli a potom som sa dozvedel, že sa jednalo o aprílové číslo a článok bol myslený ako vtip. Naletel som. Rád by som si to prečítal znova. Stalo to za to.
já kdysi četl něco podobného o C++, prý to (jakoby) psal přímo Stroustrup. Bylo to napsáno tak dobře, že tomu věřím :-)
Není to tohle?
programujte.com/clanek/2006030305-rozhovor-s-bjarne-stroustrupem/
Prý tím tenkrát byl Bjarne velmi rozhořčen :-D
Kolem roku 2000 sem pozil Watcom C/C++ a ASM pro napsani rezidentniho SLIP/ETH 'prehazovace' IP packetu (SlipBridge, pro platebni terminal pouze se seriovym portem), ktery bezel na DOS pokladne a sdilel sitovou kartu s Novel Netware a navic poskytoval i 'API' pro tu pokladnu.
Prave pro tyhle veci se perfektne hodila moznost predavat mezi C a ASM parametry pres 'explicitni' specifikaci registru ....
static
int ARPAskAddr(tIPAddr IPAddr){
#pragma AUX ARPAskAddr parm [ DX CX ];
// callbacks ...
void far *ARPFindSlot(WORD Handle,WORD Len){
#pragma AUX ARPFindSlot parm [ BX ] [ CX ] value [ CX DI ];
// RFC 826 :-)
void ARPProcessSlot(WORD Handle,void far *Slot,WORD Len){
#pragma AUX ARPProcessSlot parm [ BX ] [ DX SI ] [ CX ];