quinta-feira, 8 de agosto de 2013

Porque os browsers são desenvolvidos em C++

Hoje, em uma discussão sobre linguagens de programação, um amigo veio questionar o motivo de os browsers (Chrome, Firefox e Safari) serem desenvolvidos em C++ e não outras linguagens aparentemente mais interessantes.

A discussão não foi muito adiante, mas o questionamento ficou na minha cabeça. Após um pouco de busca, encontrei uma resposta. Os browsers são implementados em C++ pois é a linguagem que oferece mais recursos por um lado e suporte em diversos sistemas operacionais por outro lado.

No entanto, essa resposta não ajuda muito, não é mesmo? Então vamos fazer um estudo de caso...


Primeiramente, para chegarmos a essa resposta, precisamos analisar várias questões em relação à navegadores.

Necessidades básicas dos navegadores modernos:
  1. Suporte para análise e interpretação de código (necessário para fazer funcionar [X]HTML, CSS e Javascript);
  2. Recursos de interpretação/percorrimento/análise de árvores (para uso na análise de código e criação da interface gráfica);
  3. Suporte à gráficos acelerados via GPU;
  4. Controle sobre processos e isolamento de memória entre as páginas;
  5. Funcionar em todas as plataformas suportadas.
A maioria das linguagens modernas suporta algum tipo de análise de código. Existem geradores de analisadores para C, C++, C#, Java, entre outras. No entanto, C e C++ possuem alguns anos de vantagem que o resto das alternativas, portanto algoritmos para análise de código nessas linguagens são mais maduros. Acesso à gráficos acelerados em Java não é possível, a não ser que você use algumas extensões nativas para fazer o trabalho sujo. WPF em C# suporta gráficos acelerados, mas é algo tão novo para ter um browser sério construído usando a tecnologia (Não, IE não é uma alternativa séria).

Por que não Java?

Na boa, você já tentou construir uma interface gráfica em Java? Desenvolver UI em Java é algo que me parece muito complicado e lento, comparado a qualquer outra opção disponível, pelo simples fato de que qualquer outra solução é mais simples. Até mesmo GTK+. Não possuir suporte nativo à gráficos acelerados também é um fator negativo contra o Java. Alguns podem argumentar que existem formas de se fazer isso (Minecraft é um exemplo) mas as soluções são extremamente dependentes de sistema operacional. O Java, por outro lado, oferece uma das melhores soluções de sandboxing e isso já é um fator forte quando a questão é segurança.

Por que não C#?

A não ser que você nunca deseje lançar uma versão que não seja Windows, C# é com certeza a melhor escolha (vide Internet Explorer). O problema real é exatamente quando você deseja dar suporte à qualquer coisa fora do meio ambiente Windows. Mono não se desenvolveu o suficiente para ser considerado multi-plataforma - especialmente pela extrema dependência da Windows Presentation Foundation para fornecer suporte gráfico.

Por que não C?

"Existe um compilador de C para praticamente cada plataforma lá fora" (incluindo dispositivos embarcados e móveis). No entanto, existe MUITA coisa que C não faz automaticamente para você e por isso você precisa ser extremamente cauteloso em relação ao desenvolvimento. Em C você têm acesso à todas as APIs de mais baixo-nível do sistema. No entanto, a maior parte dos desenvolvedores em C não desenvolvem para ambiente gráfico. Mesmo as bibliotecas de ambiente gráfico são desenvolvidas tendo como foco uma abordagem mais focada em orientação à objetos. Uma consequência: logo que você começa a entender e desenvolver para algum ambiente gráfico, a abordagem baseada em orientação à objetos passa a fazer mais sentido que linguagens estruturadas.

Por que não Objective-C?

Da mesma forma que C#, se seu foco de desenvolvimento é somente o meio-ambiente Apple, essa é a melhor escolha. Poucos programadores hoje realmente desenvolvem em Objective-C (comparados à linguagens como C, Java e Python) e a única razão de se desenvolver algo em Objective-C hoje é se você têm alguma pretensão de trabalhar com soluções NeXT ou Apple. Com certeza você pode usar qualquer biblioteca C ou C++ em Objective-C e existem compiladores para várias plataformas (inclusive BSD), no entanto achar pessoas que trabalham com essa linguagem é mais difícil que para outras linguagens. Quem sabe no futuro isso mude? No presente, ainda não é uma vantagem real.

Por que C++?

"Existe um compilador de C++ para praticamente cada plataforma lá fora". Praticamente toda biblioteca de GUI existente possui uma interface C++, as vezes melhor, as vezes diferente. Por exemplo, a Microsoft Active Template Library é muito (mas muito) melhor que a API de chamadas de funções de callback da WinAPI ou mesmo que da biblioteca de componentes visuais MFC. Existem interfaces C++ para GTK em Unix, Windows e eu ficaria surpreso se alguém já não fez uma interface C++ em volta da biblioteca de componentes visuais da linguagem Objective-C. Outro motivo para usar C++ é relacionado com o gerenciamento de processos. Em C++ essa tarefa é muito mais fácil, inclusive que em Java ou C# (onde detalhes desse gerenciamento são abstraídos para longe de você). C++ faz um monte de coisas automáticas quando comparado com C, mas ainda te dá liberdade suficiente para fazer as coisas à seu jeito. Sem contar que um sem número de bibliotecas necessárias para renderizar páginas são escritas para C ou C++.

Por que não outras linguagens?

Qualquer outra linguagem não citada vai cair em face à comparação entre recursos disponíveis versus abrangência da linguagem. No final, o fator determinante para a escolha da linguagem está relacionada com o poder da linguagem e de quão popular a linguagem é. Nesses dois quesitos, C++ e C batem qualquer outra linguagem. No entanto, somente C++ oferece os recursos necessários e a facilidade de se trabalhar com interfaces visuais em diversos sistemas diferentes.