¿Por qué se permite un comportamiento indefinido en C?

He estado jugando intentando aprender C últimamente. Viniendo de Java, me sorprendió que pueda realizar ciertas operaciones declaradas como "indefinidas".

Esto me parece extremadamente inseguro. Entiendo que es responsabilidad del programador no realizar operaciones indefinidas, pero ¿por qué está permitido comenzar? ¿Por qué el compilador no capta, por ejemplo, índices de matriz fuera de los límites o incluso punteros colgantes? Simplemente terminas accediendo a bloques de memoria a los que nunca deberías acceder, sin una buena razón (aparente).

Como comparación, Java haceextra seguro tu no hacescualquier cosa estúpido, arrojando excepciones como tortas calientes.

Seguramente debe haber una razón por la cual esto está permitido. ¿Qué es?

RESPUESTA: A mi entender, la razón principal es el rendimiento. Además, Java tiene comportamientos indefinidos, aunque no está etiquetado como tal.

EDITAR: pregunta restringida a C

Respuestas a la pregunta(3)

Su respuesta a la pregunta