¿Qué es una abstracción en informática y por qué es necesaria en la programación?

Escribí sobre la abstracción en la respuesta de Mark Miller a ¿Qué es la abstracción? No creo que sea una necesidad en todos los casos, sino algo que es bueno tener. Se convierte en una necesidad a medida que los sistemas se vuelven complejos. Sólo podemos albergar un número determinado de ideas en nuestra cabeza, y sólo podemos manejar una cantidad determinada de complejidad en las ideas. Una de las formas de manejar la complejidad es "fragmentar" las ideas, dividiéndolas en conceptos, para poder hablar de ellas en términos de sí mismas, en lugar de hacerlo en términos de sus componentes de apoyo todo el tiempo. Es para nosotros, no para el ordenador.

Algunos diseñadores de lenguajes han intentado añadir más poder a la abstracción permitiendo no sólo la abstracción léxica, en la que se pueden usar nombres para significar algo significativo en un modelo operacional, sino también la abstracción semántica, en la que se puede cambiar lo que hacen los símbolos léxicos en las expresiones, no sólo en los tipos con los que trabajan, sino también su comportamiento operacional, como los resultados que producen y cuándo. Esto permite utilizarlos de nuevas formas que, si se diseñan con cuidado, pueden "elevar el nivel de la discusión" para hablar de un modelo operativo que utiliza términos que los participantes que observan y trabajan con él pueden entender más fácilmente, alejándose de los operadores de nivel inferior que apoyan el modelo, pero que oscurecerían la discusión potencial que se podría tener sobre él. Otra forma de decirlo es que se puede crear un lenguaje específico del dominio.