It depends on several things. 1) Why do you build a kernel? Most of the time, people develop kernels to learn how they work and to have fun. In this case just go with any language you know and like. If you have a favorite language that is not C or C++, for instance a functional or a dynamic language, then by any means use it since 1) it will make your project interesting to its community and 2) it might teach you about some of its limits. You will probably need to know C though, since you will want to look at how Open Source OSs have solved your problems... On the other hand, if this kernel is not a toy project, you will have goal such as limiting the risk of bugs and security issues, working with other people... that can help you choose the right language. Obviously the most history-tested one is C so if you chose something radically different make sure you are not overlooking problems. 2) Target hardware & portability Does the OS have to be portable? If yes then you need either a language that has been ported to a variety of platforms (such as ANSI C or maybe Java) or a language that can be ported / re-implemented easily (such as Forth). You will want as little Assembly as possible. On the other hand, if you are targeting a specific, embedded platform, maybe using low-level languages (C, Assembly) is the way to go. 3) What kind of kernel are you building? Micro-kernels such as L4 or Minix3 are not the same kind of beasts as the Linux or Windows kernels. The main difference to me is that a single programmer can have the whole code base of a micro-kernel in his head, whereas it is almost impossible in a monolithic kernel. What that changes is that in a monolithic kernel you have to limit coupling as much as possible, and you need to standardize more. There are Assembly language implementations of L4 but I doubt it would be easy to implement the Linux kernel in Assembly. 4) What about me? I do not intend to implement a kernel soon and even if I did I would fall into the "for learning and fun" category. I have already implemented a bootloader in x86 ASM (also for fun) a few years ago though. If I decided to implement a kernel today it would probably be either in C and Lua (because eLuaBrain fascinates me and I wonder if it is possible to build most of a kernel in a dynamic language with coroutines) or Forth (because it's easy to boostrap and things like OpenFirmware fascinate me too).