# Camada de abstração

Na computação, uma camada de abstração ou nível de abstração é uma forma de ocultar os detalhes de trabalho de um subsistema, permitindo a separação de interesses para facilitar a interoperabilidade e a independência da plataforma. Exemplos de modelos de software que usam camadas de abstração incluem o modelo OSI para protocolos de rede, OpenGL e outras bibliotecas gráficas.
Na ciência da computação, uma camada de abstração é uma generalização de um modelo conceitual ou algoritmo, longe de qualquer implementação específica. Essas generalizações surgem de grandes semelhanças que são melhor encapsuladas por modelos que expressam semelhanças presentes em várias implementações específicas. A simplificação fornecida por uma boa camada de abstração permite uma fácil reutilização, destilando um conceito útil ou padrão de design para que as situações, onde ele pode ser aplicado com precisão, possam ser rapidamente reconhecidas.
Uma camada é considerada sobreposta a outra se depender dela. Cada camada pode existir sem as camadas acima dela e requer que as camadas abaixo funcionem. Frequentemente, as camadas de abstração podem ser compostas em uma hierarquia de níveis de abstração. O modelo OSI compreende sete camadas de abstração. Cada camada do modelo encapsula e aborda uma parte diferente das necessidades de comunicação digital, reduzindo assim a complexidade das soluções de engenharia associadas.
Um famoso aforismo de David Wheeler é "Todos os problemas da ciência da computação podem ser resolvidos por outro nível de indireção". Isso é muitas vezes mal citado deliberadamente com "abstração" substituída por "indireção". Às vezes, também é atribuído incorretamente a Butler Lampson. O corolário de Kevlin Henney para isso é, "... exceto pelo problema de muitas camadas de indireção."

## Arquitetura do computador

Em uma arquitetura de computador, um sistema de computador é geralmente representado como consistindo em vários níveis de abstração, como:
* Programas
* lógica programável
* hardware
A lógica programável é frequentemente considerada parte do hardware, enquanto as definições lógicas também são algumas vezes vistas como parte do software ou firmware de um dispositivo. O firmware pode incluir apenas software de baixo nível, mas também pode incluir todo o software, incluindo um sistema operacional e aplicativos. As camadas de software podem ser divididas em camadas de abstração de hardware, drivers de dispositivos físicos e lógicos, repositórios como sistemas de arquivos, kernels de sistema operacional, middleware, aplicativos e outros. Uma distinção também pode ser feita de linguagens de programação de baixo nível como VHDL , linguagem de máquina , linguagem assembly para uma linguagem compilada , intérprete e linguagem de script.

## Entrada e saída

No sistema operacional Unix, a maioria dos tipos de operações de entrada e saída são considerados fluxos de bytes lidos de um dispositivo ou gravados em um dispositivo. Este modelo de fluxo de bytes é usado para E/S de arquivo, E/S de soquete e E/S de terminal para fornecer independência de dispositivo. Para ler e gravar em um dispositivo no nível do aplicativo, o programa chama uma função para abrir o dispositivo, que pode ser um dispositivo real, como um terminal, ou um dispositivo virtual, como uma porta de rede ou um arquivo em um sistema de arquivos . As características físicas do dispositivo são mediadas pelo sistema operacional que, por sua vez, apresenta uma interface abstrata que permite ao programador ler e gravar bytes de / para o dispositivo. O sistema operacional então executa a transformação real necessária para ler e gravar o fluxo de bytes no dispositivo.

## Gráficos

A maioria das bibliotecas gráficas, como OpenGL, fornece um modelo de dispositivo gráfico abstrato como uma interface. A biblioteca é responsável por traduzir os comandos fornecidos pelo programador em comandos de dispositivo específicos necessários para desenhar os elementos gráficos e objetos. Os comandos de dispositivo específicos para uma plotadora são diferentes dos comandos de dispositivo para um monitor CRT, mas a biblioteca gráfica oculta a implementação e os detalhes dependentes do dispositivo, fornecendo uma interface abstrata que fornece um conjunto de primitivas que geralmente são úteis para desenhar objetos gráficos.