3,085 karma · joined September 5, 2010
Jason Dyer's blog, https://bluerenga.blog/, where he's playing through all adventure games. So far he's made it to 1982.
Jeremy Parish's youtube channel, where he's going through the game libraries of the post-1984 consoles in chronological order.
https://ai.googleblog.com/2006/06/extra-extra-read-all-about...
I still see it recommended as a practical book however and indeed the book bills itself as "the second book you need on C", the book that will cover topics that other C books don't explain or explain poorly. But it's much too outdated to serve that purpose. In practice it means chapters discussing differences between K&R C and ANSI C and deep-dives into details of SunOS and MS-DOS compilers.
Some of the material has become misleading because the C language has evolved. For example, there's a lot of discussion about pointers and arrays, as can be expected. But there's no mention of strict aliasing and pointer provenance (these rules existed in C89, but compilers at the time didn't exploit them yet for optimization). And of course no variable-length arrays (introduced in C99). So you're not going to learn what you need to know in today's world.
The book also has almost no discussion about safety. The Morris worm is mentioned, but just as a piece of historical trivia. Browsing it now, I don't even find any discussion about buffer overflows.
- POSIX defines that in_port_t is equal to uint16_t, so for that type there's no problem at all ;)
- Don't use printf/scanf for this, roll your own
- Refuse to print/read uid_t that are outside intmax_t range
- Use an autoconf test
Knuth ties into this because he published a response "Structured Programming with go to Statements", examining many situations where goto statements are hard to avoid in the standard structured programming paradigm.
In the late 1980s it was a common belief that the limit of single-core CPU performance was very near. So there was intense research into multi-core systems, the holy grail was to find a way to efficiently execute ordinary sequential programs. That was what this paper was trying to achieve: "While we currently believe that this work will lead to an architecture which can achieve factors of 10-100 times the performance of uniprocessors on unmodified Lisp programs, we have no proof, even in simulation".
You say "TeX is already heavily optimized", but that's only true for the layout engine. The input language is entirely based on macros and string expansion. That's fine if you're only going to use it for a bit of text substitution. But as a programming language it's inherently slow. (To be fair, I believe Knuth expected that large extensions, such as LaTeX, would be implemented in WEB.)
[1] https://github.com/latex3/latex3/blob/main/l3kernel/l3fp-bas...
It's also only suitable for tiny files: compile time and RAM requirements will blow up once you go beyond a couple of megabytes.
- The original SSH and it's commercial competitors. Some abandoned, some still surviving.
- Various open source implementations. OpenSSH and PuTTY were the winners (PuTTY actually was released first). But there were more attempts (e.g. lsh).
- Those early open source implementations were designed as stand-alone programs (clients and servers). So you have a later wave of library implementations. With of course at least one per language.
I think the copyright of the old Unix code ended up with Novell in the 90s, so it would now be owned by Micro Focus.
It took years for the GNU maintainers to publish a libtool that fixed this bug, and then years for libtool users to upgrade to the new version.
Where would you be grabbing it from? ...From a website? "Websites shut down, large websites with big storage demands are especially vulnerable to attrition. Who wants to pay the mounting bill for keeping decades of revisions of historical Linux kernels online?"