I really like languages that store their runtime stack on the heap, such as Smalltalk. You can write code as if you have tail call optimisation, but you still have normal stack traces for debugging.