16Jun/1014
Dependencies
by Jeff
Image text: The prereqs for CPSC 357, the class on package management, are CPCS 432, CPSC 357, and glibc2.5 or later.
This is a computer science joke with a possible homage to Fight Club.
The meaning here is roughly "A dependency class depends on a dependency class" as a prerequisite.
The same thing follows in the image text as 357 is required for 357.

June 16th, 2010
Reminds me of an old joke I heard when I was a CS student: In order to understand recursion, you must first understand recursion.
June 16th, 2010
what is glibc2.5?
June 16th, 2010
glibc is the name of some software that is currently at version 2.11. Since 2.5 isn’t released yet, its just another part of the joke
June 18th, 2010
Actually 2.5 was released years ago (2007). Note that 2.11 is ‘two point eleven’.
Also, isn’t the joke here actually ‘circular dependencies’, where a package depends on itself? This is a common scenario in Debian, on which Ubuntu is based(earlier comics suggest the writer of xkcd uses Ubuntu)
July 28th, 2010
Actually, he refers to Ubuntu as “Windows Vista with a few custom themes,” that “Ubuntu 6.10 and Firefox 2.0 have left my computer a complete mess,” and that zealous autoconfig, which he mocks, “I hear this is an option in the latest Ubuntu release”
June 16th, 2010
I don’t think that Fight Club is anywhere near being a reference for this.
A much closer reference would be a google search for recursion, which constantly asks “Did you mean: recursion”
http://www.google.com/search?q=recursion
June 16th, 2010
Reminds me of a joke contained in the glossary of a computer science textbook.
endless loop: see loop, endless
loop, endless: see endless loop
June 16th, 2010
Other possible jokes:
A lower level class (3xx) depends on a higher level class (4xx) as a prerequisite.
The phrase “dependency resolution” seems to be double loaded as well. In compilation, dependency resolution refers to finding the required libraries, but one main role of package managers is to resolve the dependencies between the different packages.
June 16th, 2010
DESCRIPTION
The term “libc” is commonly used as a shorthand for the “standard C library”, a library of standard functions that can be used by all C programs (and sometimes by programs in other languages). Because of some history (see below), use of the term “libc” to refer to the standard C library is somewhat ambiguous on Linux.
glibc
By far the most widely used C library on Linux is the GNU C Library (http://www.gnu.org/software/libc/), often referred to as glibc. This is the C library that is nowadays used in all major Linux distributions. It is also the C library whose details are documented in the relevant pages of the man-pages project (primarily in Section 3 of the manual). Documentation of glibc is also available in the glibc manual, available via the command info libc. Release 1.0 of glibc was made in September 1992. (There were earlier 0.x releases.) The next major release of glibc was 2.0, at the beginning of 1997.
The pathname /lib/libc.so.6 (or something similar) is normally a symbolic link that points to the location of the glibc library, and executing this pathname will cause glibc to display various information about the version installed on your system.
June 16th, 2010
The longer explanation of glibc … just in case darkside wasn’t asking about the future version name.
June 16th, 2010
I think there’s also a hint of a meta-joke in it as well. As I wrote to my sister this morning when she asked me for more explanation:
It’s funny because a common goal for a compiler (which is a program that takes a higher-level computer language and translates it into low-level binary code that can run directly on the computer) is to be able to write the compiler in that language and compile itself, thus removing any dependency on other languages or compilers.
This process is known as bootstrapping. You write a little bit of the compiler in another language so that it supports just enough of your language to be able to write the beginnings of your compiler. Then you go from there, adding new features, but being careful not to use the new features in the compiler until the compiler can compile them successfully.
http://www.ece.cmu.edu/~ganger/712.fall02/papers/p761-thompson.pdf explains this issue in the service of an even deeper concept – the limits of trust and computers.
Also, see http://en.wikipedia.org/wiki/Bootstrapping_(compilers) for a more direct discussion of bootstrapping compilers.
June 17th, 2010
I would note that many if not most compilers do not go straight to binary but to assembly language instead which than allows another level of optimization before being converted to machine language.
June 19th, 2010
True, and some of them even go to an intermediate level before emitting assembly. I have no compiler experience, but my vague recollection is that GCC involves a bunch of front-ends for different languages that target an intermediate form, and then a bunch of back-ends for different processors that output the intermediate form. From looking at http://en.wikipedia.org/wiki/GNU_Compiler_Collection, it appears that my vague recollection is actually simplified – there appear to be at least three different intermediate forms!
June 21st, 2010
I’m not sure if someone has already noted the ambiguity of the term “prereqs” (prerequisites) in the mage text.
First, it means prerequisites for the course on package management (CPSC 357), which includes the other course CPCS 432, and CPSC 357 itself (which repeats the joke of the comic about a course that depends on itself).
Second, “prerequisites” is also a technical term used in software package management (which this course seem to be about). Often, one software package depends on other packages to function properly. In particular, many packages on Linux (other operating systems differ) depend on a certain version of the the GNU C library (glibc).
Mixing these two meanings of “prereqs” is the actual joke in the image text.