Parece que a maioria dos navegadores comuns (Firefox, Chrome, Safari) são desenvolvidos usando C ++. Por que é isso?
Parece que a maioria dos navegadores comuns (Firefox, Chrome, Safari) são desenvolvidos usando C ++. Por que é isso?
Respostas:
Outra maneira de fazer a pergunta é de que tipo de suporte um navegador precisa? A lista curta é:
A maioria dos idiomas possui algum tipo de suporte de análise. Você tem geradores de analisadores para C, C ++, C #, Java etc. No entanto, C e C ++ têm alguns anos de vantagem sobre o restante das alternativas, para que os algoritmos e implementações sejam mais maduros. O acesso a gráficos acelerados em Java não é permitido, a menos que você tenha algumas extensões nativas para fazê-lo funcionar. O WPF no C # fornece acesso a gráficos acelerados, mas é novo demais para ter um navegador sério construído com a tecnologia.
A rede é realmente o menor dos motivos para escolher C ++ em Java ou C #. O motivo é que a comunicação é muitas vezes mais lenta que o restante do processamento que continua exibindo a página. A velocidade bruta do fio é o fator limitante. Java e C # têm suporte IO sem bloqueio, assim como o C ++. Portanto, não há realmente um vencedor claro nesta área.
Por que não Java? Você já tentou criar uma interface do usuário com Java? Parece pesado e lento em comparação com qualquer outra coisa lá fora, porque é. Nenhum gráfico acelerado também é um grande ponto negativo aqui. O sandboxing do Java é realmente bom e pode ajudar a melhorar a segurança de um navegador se ele for usado corretamente, mas é difícil configurar e fazer o trabalho. Sem mencionar que o suporte ao formato gráfico fica atrás dos navegadores mais modernos.
Por que não c #? Se seu único destino é o Windows, o C # pode realmente ser uma boa representação. O problema surge quando você deseja oferecer suporte a qualquer outra coisa. O Mono não alcançou o suficiente para ser considerado multiplataforma o suficiente para esta tarefa - particularmente com suporte a gráficos acelerado e WPF. Quem sabe quanto tempo isso levará para mudar.
Por que não C? Existe um compilador C para praticamente todas as plataformas existentes (incluindo dispositivos incorporados). No entanto, há muito que C não faz por você e que você precisará estar mais vigilante. Você tem acesso a todos os níveis mais baixos das APIs, mas a maioria dos desenvolvedores de C não faz GUIs. Até as bibliotecas da GUI C são escritas de maneira orientada a objetos. Assim que você começa a falar da interface do usuário, uma linguagem orientada a objetos começa a fazer mais sentido.
Por que não o objetivo C? Se seu único objetivo é a Apple, faz muito sentido. No entanto, a maioria dos desenvolvedores não conhece o Objective-C, e o único motivo para aprender é trabalhar nas caixas NeXT ou Apple. Claro que você pode usar qualquer biblioteca C com o Objective-C, e existem compiladores para muitas plataformas, mas encontrar pessoas para trabalhar nela será um pouco mais difícil. Quem sabe? Talvez a Apple possa reverter essa deficiência percebida.
Por que C ++? Existe um compilador C ++ para praticamente todas as plataformas existentes. Quase toda biblioteca de GUI possui uma interface C ++, às vezes é melhor e às vezes é apenas diferente. Por exemplo, o ATL da Microsoft é muito melhor do que as chamadas de função win32 C ou mesmo a biblioteca MFC. Existem invólucros em C ++ para GTK no Unix, e eu ficaria surpreso se alguém não tivesse um invólucro em C ++ na biblioteca da GUI Objective-C da Apple. O gerenciamento de processos é mais fácil no C ++ que no Java ou C # (esses detalhes são abstraídos para você). É percebido que a velocidade vem mais da aceleração de hardware do que do desempenho bruto. O C ++ cuida de mais coisas para você do que o C bruto (como cadeias delimitadas), mas ainda lhe dá liberdade para ajustar as coisas.
Por enquanto, o C ++ aprimora as alternativas.
Decidi escrever um romance sobre isso na esperança de que as pessoas o encobrissem e me votassem. Não, não, só brincando! Eu sofri com cada palavra. Cada palavra, eu lhe digo!
Todos os principais navegadores da Web podem rastrear suas origens nos anos 90. O Konqueror tornou-se Safari e Chrome; O Netscape se tornou Firefox; IE e Opera ainda são IE e Opera. Todos esses navegadores têm uma vantagem de 15 anos nos operadores históricos.
Eu sugiro que você tente nomear um idioma aceitável entre plataformas (Windows / Mac / Unix e, pior ainda) disponível em torno de 1995 quando os navegadores modernos se originaram. Para criar o núcleo em qualquer coisa, exceto em C / C ++, você provavelmente precisaria criar ou comprar e modificar as bibliotecas de compilador e plataforma.
Apenas por diversão, vamos pensar no problema hoje. Sim, existem alternativas, mas ainda existem grandes problemas.
A escolha do idioma apresenta pelo menos estes problemas:
Onde você encontra pessoas que conhecem o idioma ou podem aprender? Esse é um obstáculo para idiomas como OCaml, F #, Haskell, Common Lisp e D, que são rápidos e de alto nível o suficiente para escrever um navegador de maneira agradável, mas têm poucos seguidores (talvez na faixa de 10 a 100 mil), mesmo se você for liberal conte todos os amadores e acadêmicos.
Corolário da resposta do culto à carga acima:
Mesmo nos tempos modernos, você precisa de uma linguagem bastante rápida para as partes intensivas em computação da renderização de páginas e execução do Javascript. Você pode optar por suplementar isso com uma linguagem de alto nível para criar elementos da GUI etc. (por exemplo, a abordagem do Firefox em C ++ e Javascript), mas você precisa ter uma estreita integração entre as linguagens; você não pode simplesmente dizer "Ok, C # e Lua". Você provavelmente precisará criar e depurar essa ponte, a menos que escolha C ou C ++ como o idioma base.
O desenvolvimento de plataforma cruzada é outro pacote de worms. Você pode usar C # ou F # e cruzar os dedos em GTK # e Mono estar vivo e bem no futuro. Você poderia tentar Common Lisp, Haskell, OCaml ... Boa sorte para conseguir tudo funcionando no Windows e Mac e Linux.
Depois de tudo isso, você precisa criar uma enorme quantidade de funcionalidades; portanto, se você escolher uma linguagem de baixo nível, precisará de um exército ainda mais abrangente de codificadores do que antes. Observe que ninguém realmente construiu um navegador a partir do zero em cerca de quinze anos. Em parte porque (surpresa!) É difícil.
Especificamente, ter um intérprete Javascript é o problema 3 (adquira um) ou o problema 4 (construa um).
Se você desenvolveu um navegador de três plataformas (Windows / Mac / * nix) hoje (início de 2011), quais são algumas das opções?
Se virmos outro navegador importante surgir nos próximos anos, aposto que ele será escrito em C ou C ++ e uma linguagem dinâmica (como o Firefox), seja de código aberto ou proprietária.
Editar (31 de julho de 2013) : os comentaristas do Hacker News parecem mencionar Rust and Go (não especificamente em conexão com a minha resposta), que se encaixam vagamente no balde de "miscelânea rápida". Tentar manter essa lista de idiomas igualitária e atualizada será uma batalha perdida, então, em vez disso, estou chamando-a de uma amostra representativa no momento em que escrevi e a deixei em paz.
Rapidez
Por mais feio que seja, C ++ ainda é o que você usa quando deseja um aplicativo rápido e controle total sobre o código.
É por isso que jogos, partes não essenciais (como importadores de arquivos) do Office e mais ainda são gravados em C ++.
Editado para incluir a resposta do MSalters
Só posso adivinhar, mas você está mencionando produtos de software direcionados a várias plataformas, e o C ++ pode ser compilado em qualquer plataforma.
(Trabalho no Firefox há cerca de cinco anos.)
O interlocutor está certo de que grande parte do código do Firefox é C ++, e de fato o C ++ é a maioria se você contar por linhas de código (embora isso não conte a história toda, pois temos muito JavaScript e JS é mais conciso que C ++).
Mas, na realidade, o Firefox é escrito em vários idiomas diferentes:
Eu com certeza estou esquecendo alguns.
Esta lista é importante porque sugere a incrível complexidade que está por trás de um navegador da web.
Sim, o Firefox tem muito código C ++, e sim, isso tem algo a ver com o fato de que C ++ era a melhor linguagem para esse tipo de coisa quando o Netscape foi fundado. Mas também afirmo que hoje não existe linguagem melhor para muito do que fazemos.
Nenhuma outra linguagem possui um ecossistema de bibliotecas tão forte (contamos fortemente com código externo). Poucas outras linguagens oferecem controle de pilha completa como C ++ (regularmente ajustamos nosso alocador de heap personalizado e fazemos todos os tipos de coisas inseguras de memória para serem mais rápidas ou usar menos memória). Poucos idiomas permitem reimplementar a maior parte da biblioteca padrão de uma maneira sã (temos nossas próprias implementações de strings e coleções, ajustadas às nossas necessidades). Poucos idiomas permitem implementar seu próprio coletor de lixo. E assim por diante.
Embora o C ++ seja a escolha óbvia para muito do que fazemos, as pessoas que sugerem que possamos escrever um navegador em Java e criar nossa própria JVM, se necessário, estão envolvidas em alguma coisa. Isso é essencialmente o que fazemos, mas com JavaScript em vez de Java. Obviamente, grande parte do navegador não está escrita em JavaScript. Mas uma quantidade surpreendente é.
Bem, você teria que pedir diretamente aos desenvolvedores desses produtos para obter a resposta, mas suspeito que seja uma combinação de familiaridade (é o que esses desenvolvedores sabiam melhor), desempenho (compilação para um binário nativo em vez de bytecode) e ferramentas (em comparação com linguagens como C, C ++ está cheio de ótimos gadgets de economia de trabalho, como o STL).
Cada um dos navegadores tem um histórico que influenciou a escolha do idioma.
Por exemplo, o Chrome e o Safari são baseados no WebKit, que tem sua origem na parte KHTML do projeto KDE. O KDE foi originalmente criado (em parte) como uma demonstração do Qt GUI toolkit, portanto o KDE é, em geral, um projeto em C ++. Todos os novos projetos do KDE foram, na época, escritos inteiramente em C ++, por isso foi uma escolha lógica para o KHTML. Desde então, foi portado para usar outros kits de ferramentas da GUI.
O mecanismo Presto do Opera foi escrito com desempenho e um pequeno tamanho binário em mente: C ++ era a escolha lógica.
O IE da Microsoft foi escrito como uma coleção de componentes ActiveX, que poderiam ter sido escritos em qualquer idioma que possuísse ligações COM, mas provavelmente foram escritos em um subconjunto de C ++, porque a maioria de sua base de código já está escrita nesse idioma.
O Mozilla da Netscape foi escrito em C ++ provavelmente porque a portabilidade era uma grande preocupação deles. Os compiladores C e C ++ são (virtualmente) onipresentes e, portanto, foi uma escolha lógica.
Não há razão técnica inerente para essas escolhas. Simplesmente "parecia uma boa ideia na época".
É fácil otimizar a rede em C e C ++, pois você não precisa usar bibliotecas, se não quiser. Eu suspeito que C ++ é a linguagem de escolha porque permite as vantagens de C:
juntamente com as vantagens do OOP:
Quando as primeiras linhas de código da primeira rodada de navegadores foram gravadas, C # e Java não existiam. Ruby também não. O Python pode ter existido, mas ainda era um pequeno projeto homebrew naquele momento.
Basicamente, realmente não havia outras opções além do C ++ que permitissem a criação de um navegador que fosse rápido e fosse executado em muitas plataformas diferentes.
Então, por que eles foram escritos em C ++? Porque esse era o único idioma disponível em que eles poderiam ser escritos.
Como os navegadores (por exemplo, HotJava, obviamente, escritos em Java) escritos em outras linguagens nunca foram alcançados um grau substancial de aceitação / penetração no mercado.
Não posso dizer nada sobre a iteração atual (ou a mais recente - não foi atualizada há um bom tempo) do HotJava, mas quando tentei, a falta de penetração no mercado parecia (pelo menos para mim) extremamente fácil de entender - era feio, lento e incompatível com algumas páginas da web. Por fim, parecia basear-se em uma premissa que nunca deu certo: que a Web consistisse principalmente em applets Java, com HTML como pouco mais do que um invólucro informando quais applets exibir onde.
Parte disso provavelmente também é histórica: a maioria dos grandes navegadores da web existe há muito tempo. Quando eles foram escritos pela primeira vez, o cenário era muito diferente: o C ++ era uma nova linguagem "quente", então estava sendo usada para muitos novos desenvolvimentos. Os navegadores se tornaram alguns dos softwares mais utilizados, enquanto muitos outros da época desapareceram no esquecimento.
Eu acho que a "atitude" exibida da linguagem também tem um efeito: C ++ (como C antes) sempre enfatizou praticidade e pragmatismo. Essa atitude básica tende a atrair programadores que também são pragmáticos. Muitos outros idiomas dão muito mais ênfase a coisas como elegância - e, assim, atraem programadores que pensam da mesma maneira. O problema é o que chamo de "efeito Lisp". Os sintomas incluem:
Há mais, mas você entende a ideia geral (e sim, estou exagerando até certo ponto - mas apenas até certo ponto). Sim, parte do código que você obtém será surpreendentemente bonita - mas é provável que esteja seis meses atrasada e, principalmente, incompatível com todos os outros trechos de código (o que deveria ser) no sistema, e quando você o receber, haverá uma boa chance de que algo mais tenha mudado o suficiente para que você não possa usá-lo.
Existem também idiomas que, sem dúvida, funcionariam bem, mas (com ou sem razão) simplesmente não têm (ou no momento crucial, não tinham) a participação de mercado para que alguém já tenha escrito um navegador neles. Dado o tamanho e a complexidade de um navegador completo, são necessárias muitas pessoas e bastante tempo para desenvolver um. Com esse tipo de investimento, muitas pessoas ficam relativamente conservadoras sobre coisas como ferramentas de desenvolvimento.
gets
, que é uma função terrível, mas dificilmente inevitável (e certamente não "fundamental" para a linguagem, ou algo assim). Segundo, C ++ não é a mesma linguagem que C em nenhum caso. Terceiro, o OpenBSD demonstra bastante bem que o software seguro pode e está escrito em C. Não há "falha de linguagem subjacente" que impeça a criação de software sólido e seguro em C. A pequena participação no mercado do OpenBSD indica que a segurança não é uma grande preocupação para a maioria pessoas.
gets
é uma consequência simples do fato de você não passar o comprimento do buffer que está usando. Nada de fundamental na linguagem - você pode fazer o mesmo em Pascal (e eu fiz). Escrever software seguro contra um invasor inteligente não é fácil, independentemente do idioma. Com base na experiência em todos os três, que é um pouco mais fácil em C do que em Pascal, e um muito mais fácil em C ++ que no C.
Programação de carga-culto. A percepção de que "o C ++ é rápido" ainda está por aí (apesar dos recursos mal pensados no nível da linguagem, como o modelo de objetos quebrado que atrasa as coisas) e as pessoas querem que seus navegadores sejam rápidos, então escrevem em C ++ .
Em um mundo são, as pessoas que escrevem software voltado para a rede ficariam horrorizadas com o mero pensamento de usar uma linguagem associada a todos os problemas de segurança inerentes a C, e, na verdade, fazê-lo seria um ato de negligência criminal. (Veja quantas explorações de buffer overflow foram encontradas em vários navegadores nos últimos 15 anos ou mais! Por quantos milhões de dólares em danos esses codificadores são responsáveis?)
Existem outras linguagens compiladas capazes de criar binários rápidos. O problema é que eles não têm a mesma exposição que a família C, e todos temos que sofrer por isso.
Curiosidade: quando o Morris Worm chegou à Internet em 1988, demonstrando conclusivamente os problemas com a criação de sistemas operacionais e softwares voltados para a rede em C (que ainda não foram resolvidos até hoje, porque são falhas inerentes ao idioma). ,) A Apple estava lançando o sistema operacional mais avançado que o mundo já havia visto até agora, há vários anos, escrito em Pascal.
Acesso a APIs no nível do sistema
Todos os navegadores precisam interagir com o sistema operacional em algum momento, e a maioria dos principais sistemas operacionais possui APIs e bibliotecas C e C ++ bem estabelecidas. Geralmente é mais fácil trabalhar com essas APIs em C ou C ++ em vez de escrever wrappers.
Controle e Portabilidade
a maioria dos argumentos de velocidade pode ser de qualquer maneira, mas em qualquer lugar em que você precise de um controle preciso sobre como algo é feito, muitos dos idiomas de nível superior irão chover em seu desfile. Há exceções, mas a maioria não é multiplataforma o suficiente para contar algo como um navegador.
Não tem nada a ver com os méritos do C ++ em relação a outros idiomas. Você certamente pode escrever um navegador melhor do zero em um idioma como Haskell; um projeto tão importante poderia até implementar sua própria JVM se precisassem garantir algumas características de desempenho. Assim como o Facebook escreveu seu próprio compilador / otimizador de PHP.
Um navegador que quebra na marcação não padrão é pior que inútil. A compatibilidade herdada é tão crítica e complexa que uma reescrita não é apenas uma opção. Muito dinheiro e tempo são investidos em segurança testada em batalha, etc., você não pode simplesmente jogar fora esse investimento. Mais uma vez, como o Facebook ainda é escrito em PHP.