Embedded C++
# Embedded C++

Embedded C++ (EC++) é um dialeto da linguagem de programação C++ para sistemas embarcados. Ela foi definida por um grupo industrial liderado por grandes fabricantes japonesas de CPU, incluindo NEC (Hiroshi Monden, líder do comitê), Hitachi, Fujitsu e Toshiba (Kiichiro Tamaru, vice secretário), a fim de melhorar o suporte do C++ em aplicações embarcadas. Em setembro de 1996, havia sido produzido um esboço da especificação do Embedded C++ pelo comitê de padronização. Ele não teve boa recepção entre os especialistas da linguagem C++, em particular Bjarne Stroustrup, que, de forma geral, é contra dialetos de linguagens.

## Objetivo

O objetivo do esforço é preservar as funcionalidades mais úteis de orientação a objeto na linguagem e minimizar o tamanho do código enquanto maximizando a eficiência na execução, também tornando mais simples a construção de compiladores para o dialeto. Um dos argumentos utilizados para sua criação é de, acostumados com o C, os desenvolvedores de sistemas embarcados não estavam satisfeitos com a complexidade e o overhead proporcionado pelo C++ nesse campo de desenvolvimento. O desenvolvimento de sistemas embarcados é conhecido pelo desafio constante em extrair máxima eficiência em tempo (processamento, o período de execução) e espaço (memória, o tamanho do código) do equipamento disponível.

## Funcionalidades

Diferente da relação C e C++, o Embedded C++ é um sub-conjunto do C++, isto é, ele não possui adições ao padrão. As seguintes funcionalidades foram removidas da linguagem:
* Herança múltipla
* Classes virtuais. A remoção diz respeito ao overhead proporcionado pela chamada de métodos virtuais, ainda que a funcionalidade de métodos virtuais propriamente dita esteja presente no dialeto.
* RTTI (e a palavra reservada typeid)
* Os novos operadores de conversão de tipo (static_cast, dynamic_cast, reinterpret_cast e const_cast)
* A palavra reservada mutable
* Espaço de nomes
* Tratamento de exceções
* Templates. Apesar de ser uma ferramenta poderosa do C++, na época da padronização do dialeto esta funcionalidade ainda não estava completa, e poucos compiladores já haviam completamente implementado o suporte à funcionalidade. Outra razão é que o seu uso pode implicar em overhead no tamanho do código. Já que diferentes códigos são instanciados para diferentes tipos de dados utilizados.
A remoção de funcionalidades também é usada como argumento deste padrão, de forma que, sendo mais enxuto que todo o padrão C++, é mais simples para desenvolvedores de compiladores desenvolverem ferramentas para o dialeto.
Da mesma forma, a biblioteca padrão do Embedded C++ sofreu alterações em relação à biblioteca padrão do C++. Parte das remoções de funcionalidade da biblioteca dizem respeito às remoções na linguagem, com a retirada de cabeçalhos que implementam ou auxiliam o RTTI e o tratamento de exceções. Como a linguagem não suporta templates, toda a biblioteca padrão teve que ser adaptada nesse sentido. Para isso, contou com a remoção da Standard Template Library como se conhece no C++, transformando funções e classes genéricas em ordinárias ou até mesmo removendo funções e classes do padrão. Um exemplo de adaptação é a classe string (que diz respeito à cadeias de caracteres), que ainda significa uma cadeia de caracteres do tipo char, mas sendo implementada sem o uso genérico da classe basic_string como em C++. Esta mesma lógica se aplica às classes de fluxo de dados istream e ostream, que também assumem char mas também não estão fundamentadas no uso genérico de basic_istream e basic_ostream. Operações com arquivos de computador foram abolidas do Embedded C++, assim como o recurso de internacionalização de software, sendo presentes em C++ através das classes do cabeçalho fstream e locale, respectivamente.