C had implementations, then there was a standard, then there were more implementations. At present we have GCC and clang as the preeminent “industrial strength” compilers and presumably MSVC is somewhere in the neighborhood of normal. A little curiosity will lead you to more recently commenced projects like cproc and arocc. On this very website you can find links to tales of unusual C compilers and extensions. And libc, in turn, is its own thing, cf. glibc, musl, and the BSDs.
And yet I don’t feel like I’m scratching the surface of commercially relevant C toolchains that presumably contribute to making the C standardization process the agile and innovative workshop of good ideas we know today, nor the range of vendors who competed in the marketplace in the past. So, Lobsters, what are some lovable or infuriating C situations that you’ve encountered in your careers? What makes them special? What biodiversity still exists in weird corners of computing? Should I really be asking about Fortran?
PIC24 still ships a weird almost-C compiler. Among its many exciting features, the language doesn’t support variadics and there is a special case in the compiler for printf.
I work on the team adjacent to the one that maintains the compiler for 8-bit PIC parts and I can confirm that it is very strange.
tcc https://bellard.org/tcc/
I’m using it for tests with
tcc -run -Bellard (the author) is one of those people who has been involved with or started a ton of great projects. FFMPEG and QEMU probably being the best known ones. I love how cleanly executed some of these projects are - no fancy landing page, just solid projects with a single goal in mind.
Do not forget that he also created a Javascript engine, QuickJS, just for fun.
Besides, he also discovered a mathematical formula for calculating an explicit digit of Pi, which remains the fastest known formula to this day.
This person truly fits the genius programmer.
Back in the 1980s I was using Matt Dillon’s DICE (Dillon’s Integrated C Environment) on my Amigas. That’s how I learned to program in C back then. I can’t remember its license. It was payware, but came with full source, presumably non-redistributable. “Everything” was closed-source payware or shareware. I believe in the beginning we pirated the SAS/C compiler, but the I switched to DICE.
Edit: Oh, a link:
“Better known for other work”, as my personal favourite citation said.
Dillon is the force behind Dragonfly BSD, which in my extremely limited testing has visible improvements over the other BSDs. I just sort of wish he’d also picked up the work done on NextBSD.
BTW: the “better known for other work” citation is this one:
https://arxiv.org/pdf/math/0511366
It’s a maths paper that cites Ted “Unabomber” Kaczynski.
When I was in school I used Metrowerks CodeWarrior a bit. I guess NXP owns it now but I don’t know if they kept the toolchain or switched to something more standard.
I suppose this only counts as commercial, not obscure - it seemed to be the default in certain circles 20-25 years ago, afaik among them MacOS 9 and/or early OS X. I want to say I tried it on Windows, but I might me misremembering.
*nod* After the 680x0-to-PowerPC switch, CodeWarrior ate up the market formerly occupied by Apple’s Macintosh Programmer’s Workshop and Symantec’s THINK C and THINK Pascal and stayed in that role until Apple released XCode for OS X and killed off the market for paid toolchains.
(IIRC, it was because CodeWarrior was better than MPW or THINK at producing optimized PPC machine code but my memory is hazy so don’t take my word for it. I was on Windows during that period.)
Not only was it available for Windows, some versions included the Mac OS and Windows versions in the same SKU and the ones of those I collected for my retro-hobby macs advertise support for Windows→Mac OS cross-compilation.
I used to wear a tshirt for this compiler in high school.
I believe Nintendo’s Gamecube also used CodeWarrior for its SDK. I guess because it was a good PPC code optimizer and the Gamecube was a modified PPC 750
It did.
If I’m remembering my history right, CodeWarrior was the IDE to use for Mac OS (not OSX) back in the day. Which would have been targeting Motorola 68k. It looks like Motorola bought Metrowerks in 1999. Motorola spun out their semiconductor group into Freescale in 2004. Meanwhile NXP spun off from Phillips in 2006. Both IPO’d, went through a bunch of weird stuff with private equity, and eventually in 2015 decided to merge. Seems that CodeWarrior just came along for the ride!
Still use it on BeOS/powerpc and of course classic Mac OS.
[Comment removed by author]
The one I learned on:
https://en.wikipedia.org/wiki/THINK_C
THINK C (a Mac IDE) was terrific. I wrote my first complete large-scale apps in it, c.1988-92.
In its 1990 release it added an interesting subset of C++ — basically just classes and methods. Objects had to be allocated with “new”, not on the stack, and passed by pointer. There was a magic HandleObject base class, instances of which used double-indirection, which was the way most Mac heap allocations worked. It still compiled very fast. I wrote the first version of Apple’s AppleScript editor in it, using a custom GUI framework I wrote as part of the project, because Apple’s full-C++ MacApp framework was painfully slow to compile in their C++ compiler.
But THINK was bought by Symantec and slowly enshittified as they replaced the custom semi-C++ dialect with their own (slow) C++ compiler.
Then a few years later along came Metrowerks with a really good fast Mac C IDE; the C++ compiler was a work in progress but pretty quickly became good enough to replace Symantec C++.
I really liked Metrowerks’ tools. The one IDE that still gives me the (pre-motorola acquisition) Metrowerks Codewarrior feeling today is Clion, FWIW. I’d still rather have the window layout from the Mac OS 9 Codewarrior tool windows, but I think the similarities are why I like Clion so much.
Before that was Megamax C, which I used on a 128k original Mac with two floppy drives. Before that I used SUMacC, which was a cross-compilation system for the Mac that Stanford hacked up. It ran on VAX BSD Unix and I’m not sure what the actual compiler was. Both of these were a painful experience, but hey, you could program your Mac without buying a Lisa!
When Lightspeed C (later THINK C) came out, it was mind-blowing.
Later there was Macintosh Programmers Workshop, whose Smalltalk-like integrated editor/shell environment I still miss.
It took me so long to appreciate MPW as a baby programmer. By the time I really got hold of it and appreciated it, it was almost gone.
It was a great developer environment, and really powerful scripting language. For some reason I didn’t think of it this way at the time, but it was pretty similar to Emacs in structure, in that editable text buffers were a first-class thing. What MPW did that Emacs and everything else I know of can’t do is intercept I/O calls, so you can do things like
foo < thiswindow.selection >> thatwindow, wherefoois just a regular binary.In the Newton project we had a very impressive multi-machine CI system, including artifact caching and versioning, built entirely in MPW! (And pretty much by one person.)
The intel c compiler is still relevant to industry. It has tricks in it to take more advantage of their chips and occasionally has bugs that make it slower on AMD.
It uses the intel math library as well by default, I think, which is faster than most other libm’s.
ICC is still relevant, but we’re seeing a similar thing with compiler backends as with browser engines where it appears that they are just too expensive for everyone to maintain their own production-grade one.
ICC used to be its very own thing, codegen and all. But as of a couple of years ago, it has switched to using LLVM instead.
One of those tricks which we made use of at a previous employer was its “bi-endian” support.
We had a code base originally developed on 68k, then MIPS and PPC, it had a lot of big-endian assumptions. In order to make use of x86 CPUs without a massive re-write effort we used that bi-endian facility.
So x86 code in (mostly) big-endian mode!
Zeta-C ran C on Lisp Machines.
It used fat pointers internally:
Norcroft?
https://en.wikipedia.org/wiki/Norcroft_C_compiler
Led to Acorn C.
https://en.wikipedia.org/wiki/Acorn_C/C%2B%2B
Also to Inmos C for the Transputer. Later versions of RISC OS were partly built in it, and it was the official SDK, AIUI.
Inmos’ work led to HeliOS, a now-FOSS Unix-like OS for massively-multicore processors, related to TRIPOS (the original BCPL OS and ancestor of AmigaOS).
https://github.com/axelmuhr/Helios-NG
The ARM C compiler was derived from the Norcroft C compiler via Acorn C. ARM now support LLVM and Clang.
WRT standardization, the Norcroft compiler was used on Cambridge University’s mainframe Phoenix in its later years, as an alternative to BCPL. They needed a C library to go with the compiler, which was largely written by Nick Maclaren. (Philip Hazel contributed as well.) Nick went on to be a prominent firebrand in the UK C committee.
WRT lovable or infuriating situations, I wrote my IOCCC winner using a mixture of Norcroft C and gcc, trying to avoid accidentally depending on implementation quirks. The bulk of the program is the return expression in main(), which is 700+ KB long after preprocessing. In the 1990s I could only compile a greatly reduced sample of the program with Norcroft C, because even at
-O0it insisted on running its quadratic register allocation algorithm. gcc could compile the full program because gcc’s-O0is stupider. Even today it takes a long time to compile for such a short program!Facial rictus of abject terror
A descendant of Norcroft C is still the official SDK for RISC OS 5 and nowadays implements up to C17
Also Topspeed C.
http://www.edm2.com/index.php/TopSpeed_C
The official compiler for Psion at one point.
TopSpeed was a family of compilers and its Modula-2 compiler was the single fastest compiler of any kind for x86 at one time.
https://freepages.modula2.org/xdsdoc/xm014.html
Zortech C led a complicated life.
It started out as Datalife C. Datalife is sort of still around and it sells a DOS-compatible OS that can execute from ROM.
It also did a C, by Walter Bright. That got spun off as Zortech C.
It led to Zortech C++ which was, I believe, the first ever compiler for C++. Before it all other implementations were preprocessors that emitted C which was then compiled.
That was acquired and became Symantec C++ and was a major product for a while.
Bright’s experiences implementing it led to the creation of the D programming language, which could be described in a very wandwaving way as “like Go/Rust/Zig/Hare but long before any of them.”
https://en.wikipedia.org/wiki/Digital_Mars
There are, of course, also umpteen C interpreters.
https://www.w3schools.com/c/c_compiler.php
https://www.softintegration.com/
https://www.reddit.com/r/ProgrammingLanguages/comments/hf441y/an_interpreter_for_c/
And HolyC from TempleOS!
https://harrison.totty.dev/p/a-lang-design-analysis-of-holyc
Its language suppert isn’t that weird, but the LCC compiler has two interesting properties:
I used lcc-win32 a lot in highschool and continued in college (this was Windows 98-2000). I knew about mingw but lcc-win32 had a really nice installer in the late 1990s. I eventually purchased a student discounted version of Visual C++ 6 for $49.99 but ended up eventually migrating to mingw once it got a decent installer.
The free version of the Borland 5.5 command line compiler also made this a bit harder, as it meant that you didn’t just get a good C compiler, but also could venture forth into C++ (not that this brought any big advantages for Win32 programming, IMHO).
Small runtimes were much appreciated back then, it also was (I think) the only time when assembly and win32 programming was somewhat popular. Those 14.4k modems on that new-fangled internet didn’t like multi-megabyte packages.
More than 10 years ago I worked for a company that develops its own smalltalk VM on which they’ve built all of their products. The core of that VM is written in smalltalk and compiled to C89 using a selfwritten compiler (again, smalltalk). The C code is then compiled to machine code with some ancient borland C compiler. Modern compilers wouldn’t work since ancient allows for things like implicit return types. I looked into massaging clang cflags into compiling that stuff, but I honestly can’t remember if it worked. Turns out C isn’t so portable after all.
Ooh, which VM is this? Squeak’s VM (latterly OpenSmalltalk) has this architecture but not the ancient C compiler as a final step.
It’s called Smalltalk/X. AFAIR some parts of it are open source, not everything though. The whole thing is basically developed by one person and for that it’s very impressive.
C in 4 functions only compiles a subset of C, but it is impressively minimalistic (and worth a quick read). SectorC also exists.
The Plan 9 C compiler, nowadays, is again relevant as the historical starting point for the Go compiler.
There’s also CERN’s
cintthat allows you to use C as a scripting language (for rapid prototyping, or if you’re too lazy to compile the source): https://root.cern/root/html534/cint/cint.htmlI burned several days in grad school trying to figure out why my C++ cint script was crashing. Eventually I realized that I had written something like
naively assuming that the compiler would tell me if I tried to use a variable that had gone out of scope. Wrong! Cint didn’t issue a warning, but sometimes the memory location pointed to by
filenamewould have other garbage in it by the time thefopencall ran. You can imagine that I was… surprised when I realized what was going on.(It’s been a while since this happened, so I may have misremembered some of these details. And for all I know cint fixed this issue a long time ago!)
Haha, good one! :D
Both actively in use today.
I have also witnessed a C++ compiler implemented as a compiler to C, with the requirement that line numbers had to be preserved, so all the C that a particular C++ line became had to be on the same line. Depending on what year it is, this ranges from the obvious way to do it to somewhat horrifying.
There is TenDRA, interesting for a number of reasons
Adding the shareware DOS compiler and IDE “Pacific C”
Didn’t they freeware that for distribution with FreeDOS 1.1? I’m pretty sure that’s where I discovered it.
The only thing I know about TenDRA is you can change the value of
NULLto0x55555555.Besides that, if I got it right, it supports compiling against skeletons of standard system header files (the actual struct layouts for example can be missing, just the, say, POSIX mandated names present). Then it can deploy s/w pre-compiled that way on the actual OS, its architecture and the implementation details of the shipped system header files. This would allow software publishers to distribute binaries, which can be installed into multiple OS vendors’ systems.
Enjoy VisualDSP++, where
sizeof(char),sizeof(int)andsizeof(short)were all 1, and thesizeofa pointer was either 1 or 2 depending on what it pointed at, had extensions for vectorized operations, indexed initializers, and many other goodies. I dimly recall that at one point it had some extensions specifically for ring buffers but I can’t find it now (or maybe I’m misremembering, ti was a long time ago). This one’s an older edition, it’s just the first one that came up on Google.The entire world of DSPs and MCUs is fascinating in this regard. I bet a good chunk of the undefined behaviour cases left in the C standard are due to some of these and it’s still not enough, their compilers still go around the standard in all sorts of ways (sometimes for legitimate reasons, sometimes because why not).
A couple unusual ones I didn’t see in this thread yet: GNU Mes and the DuskOS Compiler
Oh, I’ve been waiting for this thread for years!
Small C by Ron Cain (http://www.svipx.com/pcc/PCCminipages/zc9b6ec9e.html) later known as Pawn and adapted by Thiadmer Riemersma aka Compuphase (https://www.compuphase.com/pawn/pawn.htm) and later adapted again by the sa-mp/open.mp community to fix bugs and provide new features (https://github.com/openmultiplayer/compiler)
This was my first language and the reason I got into software! Why you may ask? Well some time in 2005, someone known only as “Kyeman” (who has since disappeared) built a mod with a team of others (who’s names I sadly forget) for GTA San Andreas that provided multiplayer functionality. Players can host a server which uses Pawn as its scripting language. This lead to a huge community growing around the game (and it’s still played today! massive in Russia, Indonesia, Philippines, Brazil, etc and our server index is telling us: 40736 players on 913 servers with an average of 44.6 players per server.)
This language has a special place in my heart, this game was my childhood and many thousands of hours were spent writing my server script and running my little community. Some of us are still friends today (and we’ll be meeting up at FOSDEM as we have done for the last few years)
It’s a fascinating language, diverged quite a bit from C over the years but I could write a whole series (which I need to make time to do) about it. There are some really interesting ideas, some of which I think are really clever and haven’t really made their way into modern languages. So, if you’re curious, AMA!
Hyper C for the Apple II is mirrored on Github!
This is a weird one for multiple reasons that will become obvious as soon as you start reading https://github.com/shinh/elvm
I learned on Borland’s Turbo C in the 90s. It was a commercial IDE and compiler. But I was too young to know that it wasn’t the only option, so I have nothing else to compare it to, and I remember very little about it.
https://en.wikipedia.org/wiki/Turbo_C
MetaWare’s High C has made the rounds a couple times via this article.
See https://lobste.rs/s/wmfa4g/lost_language_extensions_metaware_s_high
JeanHeyd Meneide mentions “Kate’s maliciously conforming TenDRA compiler, which allows you to do things like screw around with the actual, physical representation of elements”.
Tendra started out in 1992 as a project by the UK’s Defence Research Agency, and at present it has a website with a bunch of docs, papers, and technical reports, as well as a version control repository. In the earliest technical report, from 1993, I was delighted to see dr. Peeling’s e-mail address at the time was
peeling%hermes.mod.uk@relay.mod.uk.(Me, I don’t know any C except C is Charlotte, die drinkt chocolaad’ / D is een Dame die drentelt op straat.)
Tangentially, the DRA used to have an FTP server which hosted TenDRA and Algol68RS, at the peculiar domain ftp.dra.hmg.gb.
GB is the official ISO 3166 code for the UK, but basically all the UK DNS except for this one FTP server was under the UK TLD because that’s what JANET’s NRS used, and it’s what Peter Kirstein insisted on when the DNS was being set up.
HMG for Her Majesty’s Government is a very trad civil service way to abbreviate the government, which is suggestive of how this weird domain name came to be.
dra.hmg.gb is still in the DNS but now seems to be empty.
While I was looking up Tendra, I came across this amusing Mastodon thread on a hypothetical contrarian C compiler, which has attracted a few respondents proffering real-world candidates. F.ex. Syd Polk’s reply which begins “The Macintosh Programmers Workshop C compiler had saucy errors messages like “A typedef here was a complete surprise”, […]”
Back in the 1990s on Usenet in comp.lang.c and comp.std.c there was the hypothetical Deathstation 9000, a computer architecture that exercised all the weirdnesses permitted by the C standard. It was mostly used for discussing the limits of portability, because maliciously adversarial interpretations of “undefined behaviour” were not yet a thing. Er, well, nasal demons were a thing, but deleting parts of your program was not.
I used the HP-UX C/C++ compiler, aCC, years ago but I don’t remember anything particularly weird about it. It came with RogueWave’s STL implementation which was quite nice.
Also used the Green Hills C compiler back in my embedded systems days. https://www.ghs.com/products/compiler.html … we had our own in-house peephole optimizer for this one.
Someone mentioned Watcom. Here are some even more obscure C compilers originating in Waterloo, Ontario.
My first actual language, Not Quite C - https://bricxcc.sourceforge.net/nqc/
I recall on RISCOS the compiler would – I feel like this can’t possibly be correct – go look for a file called
stdioin a subdirectory calledh, when you wrote#include <stdio.h>, because file extensions weren’t a thing and so they got turned into subdirectories. Could that be right?? It was more than 30 years ago.Or could it have been that you had to write
#include <h.stdio>, instead, and because.was the path separator on RISCOS it ended up doing the above? Ugh. (Certainly.is the path separator on RISCOS.)You are correct.
There were 2 main reasons, which I feel @fanf hasn’t clearly explained.
.as directory separator. For instance a file called “readme” in a directory called “Basic” in the root directory of a hard disk would be:So
stdio.hmeans “a file calledhin a directory calledstdio.That is perfectly easily achieved, but it’s clumsy. You end up with lots of folders with just 1 file in them.
So, instead, the RO C compiler flipped filename and extension in pathnames in C source.
So you end up with a folder called
hand in it lots of files calledstdioand so on.This had the desirable effects of:
Fun aside: I encountered the 77-files-per-directory limitation when experimenting with rendering short videos of morphing fractals on my Archimedes. I saved RLE compressed mono images as the frames but I kept hitting the limit. So, I wrote a simple algorithm that made trees of subdirectories and put bunches of frames in each.
Years later, learning how the Novell Netware filesystem worked, I discovered that this is actually an existing thing; it is a sort of simple hashing function. Fun!
Yeah, RISC OS (like Phoenix) uses/used . as the directory separator. The directory layout of C programs was like
The compiler would swizzle
#include "myprog.h"so that it would readh.myprog. (I think#include "h.myprog"also worked but was obviously non-portable.)I can’t remember if the tools did similar swizzling on the command line. Did they have a version of
maketoo? It was a long time ago! And it was the first time I got my hands on any programs that resembled anything from unix…Here’s a random example from the RISC OS source code https://gitlab.riscosopen.org/RiscOS/Sources/Lib/TCPIPLibs/-/tree/master/unixlib
We can’t forget QuakeC! The C variant used in Quake!
VisualDSP++ (toolchain/IDE for Blackfin/SHARC DSP chips) has some custom extensions and behaviors that will look weird. IIRC signed integer overflow is not UB, it’s actually configurable (wrapping or saturating).
Oh now I’m having memories of the DSP lab and all of the quirks of Blackfin. Maybe you remember… I seem to remember both a multiply-and-accumulate (MAC) opcode and some kind of zero-overhead loop opcode that essentially made implementing an N-tap FIR filter take like N+1 instructions? The ZOL thing was something like an instruction that said “execute the next instruction, increment register X afterwards, and repeat it until register X equals Y”, and the MAC instruction did “C = C + A[X] * B[X]”. Pretty cool special purpose stuff!
aiui, those are the classic instructions that distinguish a DSP from a MCU. In college we had to implement ZOL in VHDL on an FPGA which is cool to see how it’s really “zero overhead” (meaning there’s hardware to do the comparison, increment, and branch in a single instruction cycle).
I think these days the difference is blurrier because MAC/FMA instructions are more common (even ARM M4/A5 have FMA now) and processors are so fast the gains on ZOL might be questionable. At the time the real wins of Blackfin or their competitors was perf per watt, it was hard to compete with them on raw math for the same power budget.
Definitely agree. I’ve been out of that game for a long time but you’d have to work pretty hard to convince me to use a Blackfin or other… not-as-mainstream processor instead of an Arm Cortex M4 or M7 for doing DSP work today. An NXP IMXRT1064, for example, has a crazy amount of horsepower for under $20 and it’s pretty straightforward to add a bunch of RAM to that.
The Reason digital audio workstation has an extension platform: https://developer.reasonstudios.com/
To develop new extensions you write C++ and then use a proprietary, outdated llvm fork to build it into special secret llvm bit code for upload and testing. And the tools are of course only available for a couple of platforms.
XSCompiler. It was a DOS-era compiler for a C-like language created on top of C, which has used a different extension (
.xssinstead of.c). But it should handle at least some C sources. I think it was made mainly for demos and games, as it featured a lot of bundled libraries handling graphics and sound. It bundled its own DOS extender (Xtender).One interesting feature is that the standard toolchain had support for generation of encrypted binaries (but I have no idea what encryption was used).
The original website has been excluded from the Wayback Machine, so it’s lost.
Later it was converted to ECDK, and later it was forked to OpenECDK.
Also, nobody has mentioned djgpp yet. It is a fork of
gcc, so a little bit boring here, but it has a lot of DOS specific stuff exclusive to DJGPP, like a DOS extendergo32. It was used commercially for some games, e.g. Quake.OpenWatcom is the descendant of the original Watcom C/C++ compilers and is the standard C compiler for FreeDOS (IIRC).
HiSoft C: a K&R based compiler from 1984 for Z-80 based micros. Not very commercially relevant but it was my first encounter with a C compiler.
I have a copy of James E. Hendrix’s A Small C Compiler: Usage, Theory, and Design book sitting on the shelf behind me. I found it in the bargain bin at the local CompUSA store one day as a young teen. I never actually did use the compiler itself, but poring over that book on a bunch of summer evenings sitting by local lakes while my dad and brother fished was one of two book from which I learned C. (I was lousy at fishing; I pretty quickly gave up on it, but I still enjoyed the company and the fresh air and quiet for reading).
The other was, C for Yourself which came bundled with the Microsoft QuickC 2.5 compiler, which is the compiler that I actually did learn C on. I spent a lot of time experimenting with writing code with that compiler before eventually moving on to Borland C++ 4.0.
I also remember seeing lots of ads for Mix Power C, back in the hay day of Dr. Dobbs Journal. Never tried it though, but the price was appealing.
And of course, there was the Watcom compiler, which I remember being notable for being able to build 32 bit protected-mode binaries with a DOS extender. Famously, that’s what the first Quake was built with.
Some time ago I was looking for a compiler suite / code editor that would be useful on a 8086-class machine and I’ve stumbled upon this little gem - https://www.aztecmuseum.ca/
I used to use Aztec C on the Amiga. It was pretty decent for its time.
We forgot open64
Like any commercial RTOS dev environment - sometimes they shipped with a heavily patched/augmented gcc, sometimes it was their own compiler 🤷♂️
A few more:
BDS C I may have a copy of that on floppy somewhere. https://en.wikipedia.org/wiki/BDS_C
Alycon C Used by Digital Research for the Atari ST, also for CDOS 68k (aka FlexOS 68k). It was a quite poor implementation. Source can be found in certain DR data dumps, e.g. on Gabi’s CP/M site.
Sozobon C For the 68k, K&R
Pure C For the 68k (Atari ST), essentially a version of Borland’s Turbo C, but for 68k.
AHCC An ANSIfied version of Sozobon : https://github.com/swetland/ahcc
VBCC (The direct site is not currently responding for me) https://web.archive.org/web/20250102013526/https://www.compilers.de/vbcc.html
There is also a 68k version of the godbolt compiler explorer available here: http://brownbot.mooo.com/
It offers some other 68k compilers, including some I mention above, and some mentioned in other comments:
[Comment removed by author]
There was the Mix Power-C compiler for DOS. http://www.mixsoftware.com/ There were a whole suite of libraries for it.
I can only imagine how few people know about Power-C. That was my very first C compiler back in… I’d guess 1994 or 1995? While the rest of the world was excited about 386s and 486s, my family was stuck with a classic 8088 with 640kB of RAM. The owner of a local computer shop gave me the Power-C compiler and very in depth user manual for free when I bought a 3.5” floppy drive from him to upgrade the old XT. I got a lot of mileage out of that until my family bought a Pentium 133 in 1998 and I discovered the joys of Linux and the big fight between gcc and egcs.
Wikipedia has got you covered: Category:C (programming language)