13 comments

[ 2.6 ms ] story [ 36.3 ms ] thread
So are we supposed to grade it? :-)

More seriously though it is really useful for people who are going into embedded or systems programming to write a command line interpreter at some point in their studies. It blends a couple of disconnected courses (data structures and parsing) into something tangible and useful.

I wonder if there is a good canonical list of chunks that you should be able to create from a blank sheet of paper in order to demonstrate mastery of CS. I would put an interpreter, a database, a CLI (shell), a compiler, a scheduler, and a device driver as the list but there might be others.

Maybe add something to do with networking? Maybe also graphics?
Almost everything I've ever done with networking was much closer to applied computer science than pure CS, but writing an HTTP client (open socket, construct and parse headers, deal with character encoding) was one of the more eye-opening experiences when I was getting started.
This is something I'd love to do. Do you have any resources for learning the background info? Everywhere I've looked just plugs in some TCP/socket library, but I think the real learning would come from _making_ the library itself.
You mean instead of using the TCP stack included in the kernel, you want to write your own? You could use raw sockets (described in man 7 raw) for that (but note that they require elevated privilege). Use socket(PF_INET, SOCK_RAW, IPPROTO_TCP) to get a raw TCP socket, then send and receive TCP packets as raw bytes over the socket.

I found an example demonstrating the approach here: http://www.tenouk.com/Module43a.html

OS virtual memory is one of my favorites.
Competence might be a better label than mastery, which is a blue sky or a bottomless pit, depending on your point of view.

Maybe add something to cover graph theory. But it's hard to think of a tool as useful on a small scale (one person, not big data) as the ones you've named.

A simple build system fits the tools listed here and covers graphs. An NFA regex matcher would cover it too.
Ah yes, I remember doing this for my own systems class. Good times.

I never had to build another shell in my life, but the process I had to go through to learn the OS well enough to build one gave me invaluable insights for a future career in backend.

If people are interested in shells, three projects that you might find interesting are:

* oilshell - An ambitious project to build a shell that is compatible with bash (to completely replace it), but also better. * xonsh - A Python shell * elvish - A modern re-imagining of the shell with objects and pipelines

It's hard to understand everything that a shell encompasses (at least for me). It's a language interpreter with a repl. The language is designed to make running programs, working with output, passing arguments, etc... easy. It's not [as] easy to do that in Python or C. We're used to Bash, and there are some fun projects out there trying to modernize the experience of what you can expect from a shell. Things like displaying images/previewing files, etc. I also love the ones that try to reveal deeper information about a running process - hooking into syscalls to show progress/completion/activity.

All very cool.

friendly interactive shell (Fish), not compatible with Bash though