pabrantes said: To me the biggest problem in java is not having native support to add and remove things from the class interface at runtime, such problem, can't be solved with bytecode injection.
Asking that of Java is strange. Those guys from AOP had a similar requirement. They wanted to be able to add new behavior without needing to manually change all classes (because in OOP only allows you to easily change existing behaviour). But AOP changes the compile process. At runtime things are as fixed as they were.
Anyway, I still believe that it's all about "what are you trying to do" instead of "how can you do it". Normally this is a 1-N relation. In AOP, after the concept stabilized a bit, they developed a series of languages and tools to provide the needed abstraction and infrastructure. If I had to guess I would say they are happier now.
pabrantes said: But, I think that to fully understand a programming language it's important not only for you to feel comfortable with the high level abstractions but also, to understand what's under the hood in a lower level (maybe it's just me).
I guess you're implying a bottom up approach. You look at the details and start to build up. Ok, but build up in what direction. Because, although it's useful to know that a computer has a CPU, I'm not exactly programming for the CPU. A long time has passed since my last int 0x10.