ExDOS is developed by Omar, “almost 14 years old”
exdos.eu.pn
exdos.eu.pn
LDA A
ADD TWO
STA A
DAT TWO 2 <-- initializing variable TWO
then, this line of code
A = A + 2
in C or a higher level language makes soooo much more sense. That awkward phase of internalizing that '=' is an assignment operator and is different from another operator meant to test equality gets a lot shorter for a beginner.Btw, this is the best online CPU simulator I've found for that use http://peterhigginson.co.uk/LMC/ I'm shocked at how all the code academies and hour of code's haven't created a polished version of LMC (Little Man Computer... look it up).
I also think starting with Asm is a good idea, because it forces you to think about things like data representation (often glossed over in HLLs) and breaking down complex operations into a series of simple steps - something that you have to internalise effectively to become good at programming. If there is time for it, going one step lower to logic gates would be even better to dispel the "magic" and see that CPUs are actually very conceptually simple and logical machines.
Of course to become productive they should move to a HLL and learn the higher-level organisation (functions/procedures, objects, ...) but I agree that the basics are important to understand first.
This is a book I strongly recommend, it's definitely written at a level readable for kids and young adults:
https://en.wikipedia.org/wiki/Code:_The_Hidden_Language_of_C...
I'll probably have to thank one of my highschool math teachers for inadvertently helping me skip this phase altogether then :)
He always pestered us to use the "equivalence" operators ⇔ or ≡ (the latter mostly for geometry stuff), and only use the regular equal when you had unambiguous contexts like "Let f(x) = x + 2" or "if x = 5". At the same time I was learning programming (with C++ as my first language...), and I could easily see "=" as being for assignment, since in other contexts you either used something more fancy (like ⇔ or ≡ in math, and "==" in code) or you used explaining words like "let" or "if" to clarify meaning. Though I think it took me a while to get things like `while (x = getch()) { ... }` :)
Writing a * a - b * b ⇔ (a + b)(a - b) doesn't make any sense, because neither the left hand side nor the right hand side are logic statements.
Pity language designers don't take the more obvious solution of making their maths-derived operators behave like the language they're drawn from.
For me the irritating thing was x = x + 2 since it triggered my math brain which protested and simply said...well that can't be, error. So I guess I did have the exact reverse problem always seeing the assignment as an equality. Thankfully this passes really quickly after you immerse yourself in it for a day.
Of course years later one of the first sentences from our Prolog 101 prof was "so you have been programming for a while now...let me write this down...i = i + 1...someone explain what this does...what would you suppose a (stereotyped) mathematician (that only knows math) would tell me" Kind of made me smile. /offtopic_anecdote
And switching to assembly seems like a pretty overkill solution to the = vs == problem.
I've always wanted to see something of a truly 'barebones' OS; but one that could at least get you 64-bit mode, OpenGL ES, audio output, USB polling and network connectivity with libc available. Yet not be as complex and large as Linux/BSD.
Being able to run a real-time application with no pre-emption, no virtual memory protections, no kernel transitions, etc could probably eke out an additional ~20-30% of performance on a CPU-bound application. Plus the near-instant boot would be great for media players, emulator arcade boxes, etc.
Probably just not possible, due to the driver situation. There was a bit of hope UEFI could lead to better drivers for hardware prior to boot, but efforts around things like GOP (graphics output protocol) haven't really gone anywhere that I've seen.
Sadly, there's a very small amount of modern things you can do with 32-bit mode, VESA and a keyboard. I've never even found a video card with a 1920x1080 VESA display mode; they're almost exclusively still 4:3 only.
Plus, no sound rules out gaming and media; no internet (let alone Wifi) rules out any connectivity; no strong filesystem rules out moving data around easily; no USB rules out loading things from external storage, gamepads, etc.
Only strong use case would be for embedded; but ARM platforms have this area beat substantially in cost, power, tooling, etc.
> Only strong use case would be for embedded; but ARM platforms have this area beat substantially in cost, power, tooling, etc.
http://docstore.mik.ua/orelly/linux/run/ch01_02.htm
Linux started out as something quite a bit less impressive than what you see today.
http://electronicdesign.com/embedded/how-boot-linux-under-on...
"Hackers should be judged by their hacking, not criteria such as degrees, age, race, sex, or position"
While it is great that we recognize good work like this, bringing up his age in the title is focusing on a pretty irrelevant metric when we should focus on good work, no mater who makes it.
In the case of my current work, I would say I have put the same amount of time into learning and working as people twice my age (Though I guess that means I haven't had much of a life otherwsise, heh). Regardless of my age, I think my work should stand on its own against anything that currently exists. If you add an age qualifier, it does feel insulting (at least for me).
I should also mention that I have used my age to my advantage in some cases, but I strongly dislike people who use it as their main selling point, such as when people brag about being a "young startup founder" etc.
I see it rather the opposite. By mentioning his age the feat becomes all the more impressive.
If I want to be a peer among peers and contribute to society on an equal level, I can’t have people going “Ooh, that’s very good for a cripple/child/blind person. When they do that, I can never know if I am actually good enough or if people are only patronizing me.
Also, this is a ridiculous conversation. The actual work of these teenage wunderkinds is very rarely on par with the work of similarly talented, but more experienced professionals. It's almost always about the feat. And that's okay, because the feat is indicative of future potential.
I think this isnt valid in this case - the work is more impressive exactly because it is being done by someone that young, and this is so huge accomplishment because it is so much easier and more common thing to achieve at later age. I can't see his work being discounted here.
> Regardless of my age, I think my work should stand on its own against anything that currently exists.
I also can't agree with that - if you have 30 years of programming experience and what you're making are hello-world type of programs (that's what I was doing around 14) then you are obviously underperforming and simply doing bad. However, at 14 the very same work was already outstanding when compared to my friends at the same age, because most of what they were doing was running around on the yard. And none of them ended up as a professional runner (but still, they might be happier today than me, being professional hello-world engineer ;)
Although when I was 14, the references to do this were not readily available. With all credit to "Omar", it's also credit to how available and intelligible our reference material is for techniques like this.
Honestly though, writing OSs? People make it magic. In reality, they're just programs. It's fun. There are even really smooth (albeit way outdated) tutorials like NachOS out there (https://www.ida.liu.se/~TDDI12/material/begguide/)
That should be valid for just any activity/profession, not just Hackers. I don't see the need for the specific segment here.
It's relevant because it's remarkable and it puts the author in a much smaller circle than he would be if he were older. Trying to pretend otherwise is silly.
Being able to read at age 18 is a lot less interesting than at age 4. Same goes for rare technical feats (and writing an OS is such a thing, most developers wouldn't be able to pull it off, so doing so at age 13 is certainly a lot more interesting than when you're older).
The point being, you benefitted tremendously by your work being judged relative to your age, so it seems disingenuous for you to suggest Omar shouldn't get the same treatment.
I doubt ExDOS or EyePC will be remembered in the annals of history as engineering marvels, but that's irrelevant. They are indicators that the creator has the talent, intellect, and dedication to accomplish a lot in a very short amount of time, and they hint at great potential.
The main reason I brought this up was because even today (I know 19 is still young, but I am a full adult with 6+ years of professional experience) I am still judged by my age by many people and not my actual work, and today I think my current work is actually something worthy of extreme interest regardless of who developed it or how old they are.
I just ran through the OSDev Bare Bones [1] tutorial this evening, even implementing newline support! I don't understand all of it yet and here's a kid half my age doing amazing things. Goes to show what you can acheive with time and perseverance. I really wish I learned Assembly at that age.
(still impressive)
https://web.archive.org/web/20150810162221/http://exdos.eu.p...
"Q: Why did you choose Assembly?
A: It is easy, simple, and the language of real programmers."
Will he still believe this when he's older?
I hope so. Because it is the truth.
They might, if their problem is really hairy and requires large amounts of exploratory programming, create a high-level programming language (usually a macro-language) that allows easy access to the same abstract machine semantics, and then code in that. For well-defined "closed" problems (e.g. in-kernel packet filtering), this added baggage is usually unnecessary, but for more "engineering-oriented" problems, you might end up with something more like an Erlang than a Prolog.
Note that C itself follows this rule; the "C abstract machine" is a pretty good fit (though perhaps not perfect) to the solution domain of low-level systems programming.
Generally, the idea is: first, you should define a language to directly express statements about your problem domain. Then, in one place, you can define the solution in terms of the problem domain. Completely separately to that, you can implement the mechanism by which a machine interprets and acts upon statements about the problem domain. Putting the two together results in a program that solves your problem. But either may be maintained separately.
The term "separation of concerns" has effectively always been about making sure that demands for change that come from separate "departments" don't end up touching the same line of code. This model excels in that: maintaining the specification of the solution is solely the province of the business, while maintaining the interpreter of that specification is solely the province of some engineers somewhere. As long as the interface between the two is stable—a stable ABI—improvements can be made to one or the other without the other group ever having to be aware.
A great example of this is the Inform 7 language. One group of people writes text adventures in this language, or enhancements and plugins for text-adventure development. A separate group of people maintains interactive-fiction interpreters that parse a given ISA. Neither group has to think about the other. The ecosystems of the IDE and the runtime are, in fact, completely divorced.
However I would be willing to bet you are using a bootloader and a kernel written by people who are comfortable with assembly language. Call them real programmers or something else.
My name is Muazzam Ali Kazmi, a hobbyist programmer from Shahpur,
Layyah, Punjab, Pakistan. I am a student of grade-11 and I started
programming about 4 years ago. I am developing the OS since 7
September 2014. My interests include religion(s), philosophy,
operating systems, virtual machines, simulating a universe in the
computers, compilers, theoretical computer science, artificial
intelligence, mathematics, and science.