Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Reaching Low Level programming

  1. Apr 4, 2013 #1
    I really want to be a programmer. But I am more interested in operating systems(I always get goosebumps thinking about coding an operating system), programming languages, compilers, emulation, AI, embedded systems, assembly, parsing, hardware, etc. Where do you even begin for that stuff?. (Those programmers seem like magicians). I could read a book for learning a programming language and I have. But after that, it seems like there is a wall that separates between being able to code simple programs (typical beginners book exercise) and being able to code something that helps people, something that makes you proud. If you could me help on what to do I would be extremely grateful.

    Thanks
     
  2. jcsd
  3. Apr 4, 2013 #2

    rcgldr

    User Avatar
    Homework Helper

    ARM processors are popular for embedded applications, and there are freeware operating sytems (that include source code) for it and also a emulator (Armulator) that can run on a PC. The ARM toolset is relatively expensive, unless you can get access to a university version through your school if you're going to school.

    You could also consider some type of "project" board that uses a simple processor and comes with a cheap or free development software kit.
     
  4. Apr 4, 2013 #3
    The standard computer science curriculum covers most of what you have mentioned. I know what you mean though, I was pretty mystified about it all when I started programming. I'm not sure if you plan on studying at uni, but if you don't, you can still buy some good books and learn what you need to know. You need to start at the start, however.

    Here's the path that I took:

    When I was young, I played around with Pascal, Visual Basic (mostly as a macro language for Office), HTML and JavaScript. I was pretty green, and didn't accomplish much.

    Then I started uni, and the first thing we learned was Computer Organisation. This course teaches you about how a computer works at the hardware level, what goes on inside a CPU, and the various other modules. You learn some boolean logic, the binary number system, and we implemented some basic programs in an assembly language. It probably sounds hard, it actually wasn't too bad but you need to have your wits about you.

    We also learned C. C is an old language, but many languages are derived from it, and it teaches you to program at a low level where you need to manage memory by yourself and write a lot of functions that would be provided for you in other languages. It's a bit tedious, but you learn a lot, and it's the kind of knowledge you can transfer to learning other languages. Remember, you learned assembly at the same time, so you aren't scared of doing things for yourself! I learned from a book called "C: How To Program" by Deitel & Deitel. The seminal text, however, is https://www.amazon.com/Programming-Language-2nd-Brian-Kernighan/dp/0131103628 by Kernighan & Ritchie. These aren't particularly easy books, and it's not a particularly easy language, but I think it's worth banging your head against it for a while. Another good C resource is Learn C The Hard Way.

    Having picked up the basics of C, we spent a lot of time manipulating text (strings). Most languages make working with strings a lot easier than it is in C, but if you can do it in C, you can do it in any language. You learn a lot from doing it the hard way, and you learn a lot more than just strings, you'll have to manage your own memory, write utility functions, and your programs will be big enough that you'll realise the importance of program design, and spending a lot of time with a pen and paper before you get near your code editor. You also learn how to use debugging tools like gdb and valgrind, or you end up with very little hair because you pulled it all out!

    At this point, we learned about software engineering. How to design programs, different design patterns and architectures, and UML. You don't really do any programming at this point, you get a tool like Visual Paradigm, or Dia, and you draw lots of diagrams and flow charts.

    Then we picked up an object oriented language, Java, and after learning the basics, we started implementing programs with a bit more structure and complexity. We learned how to take our UML designs and translate them into a program. We also learned how to write a GUI from scratch, event driven programming (performing actions when the user clicks the mouse, etc) and some other, more modern programming concepts.

    Next, we learned about algorithms and data structures. This is the kind of course every programmer takes in the course of their studies. You learn about some famous searching and sorting algorithms, and various other ones, and why one is better than another, and how to measure the efficiency of an algorithm. Data structures are closely tied to this topic, they describe how you store your data, and certain structures work with certain algorithms. This is a hard, and very deep subject, but like anything, you start at the start. The standard text is https://www.amazon.com/Introduction-Algorithms-Thomas-H-Cormen/dp/0262033844 by Cormen.

    At this point, you are starting to get a handle on making programs with some complexity, and you won't be quite as mystified. From here, the going gets a bit tougher. :) There's a few more standard courses, namely:

    Computing Theory. This is about how computers work at a conceptual level. You learn about formal languages, grammars, Turing machines. This is a very important subject if you want to write a compiler. You also learn about complexity theory and how to determine if a problem is even computable - you might be surprised to learn that a lot of problems aren't able to be solved even with all the computers in the world running for the lifetime of the universe! Fun stuff! We covered some cryptography in this course too.

    Operating Systems. Here you learn about the main operating system structures, and how each one manages things for the user(s). An important topic is concurrency, and you will learn about sharing resources, multi-threading, and all sorts of things that are of concern when everyone wants to do everything at the same time! One of the seminal texts, and it's really expensive, is https://www.amazon.com/Modern-Operating-Systems-Andrew-Tanenbaum/dp/0136006639 by Tenenbaum. Perhaps it would be worth shopping around!

    Artificial Intelligence. Your first course in AI is more about introducing the main topics. It's a broad subject. One thing you will want up your sleeve is at least an introduction to probability. In AI you learn about making decisions based on available data, and there's some really cool things like evolutionary algorithms and neural networks that you will discover. I won't go into it too much, but read up, it's all very interesting.

    Database Concepts. This course was about how databases work at a low level. How the data is stored, and what compromises you can make. How to index tables, how to write efficient queries, how to sort a 1GB table when you only have 512MB of RAM. How to join one table to another via a shared key. This was one of the harder courses I took, and we did all our programming in C.

    That's pretty much the basics of a CS curriculum. There are other subjects to consider, and plenty of ways you could go. I never touched on embedded programming or anything very close to hardware. I dabbled in 3d graphics with OpenGL. I did a lot of maths. I took some courses that had us write very large programs with a team of people. There were a few other database courses, and some more AI stuff. I'm concentrating on web development at the moment.

    I guess, after that wall of text, that the best advice is just to keep going. Once you are comfortable making small programs in your language of choice, get into some algorithms and data structures, it will open up the world a bit for you.
     
    Last edited by a moderator: May 6, 2017
  5. Apr 5, 2013 #4

    chiro

    User Avatar
    Science Advisor

    Hey R_beta.v3 and welcome to the forums.

    My suggestion is once you are able to read code, download the linux kernel and go through it.

    You will learn all about how OS's function and how they are designed, and although it will be a headache to do, you will learn a lot in the process.
     
  6. Apr 5, 2013 #5

    trollcast

    User Avatar
    Gold Member

    If you have a raspberry pi (they're only about $25 to $35 depending on the model and retailer) you could try the Baking Pi tutorials : http://www.cl.cam.ac.uk/freshers/raspberrypi/tutorials/os/

    They take you through making a basic os for the raspberry pi and explain about hardware and os concepts along the way, although overall the tutorials are quite basic for the topic.
     
    Last edited: Apr 5, 2013
  7. Apr 5, 2013 #6
    Really great advices, thanks everyone. The Raspberry Pi looks great. I am sure I'll buy it soon.
     
  8. Apr 21, 2013 #7

    harborsparrow

    User Avatar
    Gold Member

    One possible answer to "how to learn low level programming" is as follows. Become a really good C programmer. Also, learn an assembly language (on any platform) and actually code something in it. Finally, learn how the internet works, really down underneath, by reading the RFC's (de facto standards documents) that define how it works. Read a good book on operating systems, and another on computer architecture. This would take most people a while, but at the end of it, you'll be able to do most anything.
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook




Similar Discussions: Reaching Low Level programming
  1. HMI programming (Replies: 1)

Loading...