Parece que la mayoría de los navegadores web comunes (Firefox, Chrome, Safari) se desarrollan utilizando C ++. ¿Por qué es eso así?
Parece que la mayoría de los navegadores web comunes (Firefox, Chrome, Safari) se desarrollan utilizando C ++. ¿Por qué es eso así?
Respuestas:
Otra forma de hacer la pregunta es ¿qué tipo de soporte necesita un navegador? La lista corta es:
La mayoría de los idiomas tienen algún tipo de soporte de análisis. Tiene generadores de analizadores para C, C ++, C #, Java, etc. Sin embargo, C y C ++ tienen algunos años de ventaja sobre el resto de las alternativas para que los algoritmos e implementaciones sean más maduros. Acceder a los gráficos acelerados en Java no es una opción, a menos que tenga algunas extensiones nativas para que funcione. WPF en C # proporciona acceso a gráficos acelerados, pero es demasiado nuevo para tener un navegador serio construido con la tecnología.
La creación de redes es en realidad la menor de las razones para elegir C ++ en lugar de Java o C #. La razón es que la comunicación es muchas veces más lenta que el resto del procesamiento que pasa a mostrar la página. La velocidad bruta del cable es el factor limitante. Tanto Java como C # tienen soporte de IO sin bloqueo, al igual que C ++. Así que realmente no hay un ganador claro en esta área.
¿Por qué no Java? ¿Alguna vez has intentado construir una interfaz de usuario con Java? Se siente engorroso y lento en comparación con cualquier otra cosa, porque lo es. Ningún gráfico acelerado también es un gran negativo aquí. El sandboxing de Java es realmente bueno y puede ayudar a mejorar la seguridad de un navegador si se usa correctamente, pero es complicado configurarlo y hacer que funcione. Sin mencionar que el formato de gráficos admite retrasos con respecto a la mayoría de los navegadores modernos.
¿Por qué no C #? Si su único objetivo es Windows, C # en realidad podría ser una buena representación. El problema viene cuando quieres apoyar cualquier otra cosa. Mono no se ha puesto al día lo suficiente como para ser considerado multiplataforma suficiente para esta tarea, especialmente con soporte gráfico acelerado y WPF. Quién sabe cuánto tiempo llevará cambiar.
¿Por qué no C? Hay un compilador de C para casi todas las plataformas (incluidos los dispositivos integrados). Sin embargo, hay muchas cosas que C no hace por ti de las que tendrás que estar más atento. Tiene acceso a todos los niveles más bajos de las API, pero la mayoría de los desarrolladores de C no hacen GUI. Incluso las bibliotecas C GUI están escritas de forma orientada a objetos. Tan pronto como comienzas a hablar sobre la interfaz de usuario, un lenguaje orientado a objetos comienza a tener más sentido.
¿Por qué no el objetivo C? Si su único objetivo es Apple, tiene mucho sentido. Sin embargo, la mayoría de los desarrolladores no conocen Objective-C, y la única razón para aprenderlo es trabajar en cajas NeXT o Apple. Claro que puede usar cualquier biblioteca C con Objective-C, y hay compiladores para muchas plataformas, pero encontrar personas para trabajar será un poco más difícil. ¿Quién sabe? Quizás Apple pueda cambiar esta deficiencia percibida.
¿Por qué C ++? Hay un compilador de C ++ para casi todas las plataformas. Casi todas las bibliotecas GUI tienen una interfaz C ++, a veces es mejor y otras simplemente es diferente. Por ejemplo, el ATL de Microsoft es mucho mejor que las llamadas de función win32 C o incluso la biblioteca MFC. Hay contenedores C ++ para GTK en Unix, y me sorprendería si alguien no tuviera un contenedor C ++ alrededor de la biblioteca GUI Objective-C de Apple. La gestión de procesos es más fácil dentro de C ++ que Java o C # (esos detalles se abstraen para usted). Su velocidad percibida proviene más de la aceleración de hardware que del rendimiento bruto. C ++ se ocupa de más cosas que C sin procesar (como las cadenas delimitadas), pero aún te da la libertad de modificar las cosas.
Por el momento, C ++ supera las alternativas.
He decidido escribir una novela sobre esto con la esperanza de que la gente lo ignore y me vote. No, no, es broma! Sufrí por cada palabra. Cada palabra, te digo!
Todos los principales navegadores web pueden rastrear sus orígenes hasta los años 90. Konqueror se convirtió en Safari y Chrome; Netscape se convirtió en Firefox; IE y Opera siguen siendo IE y Opera. Todos estos navegadores tienen una ventaja de 15 años en los titulares.
Sugiero que incluso intente nombrar un lenguaje multiplataforma aceptable (Windows / Mac / Unix e incluso peor) que estaba disponible alrededor de 1995 cuando se originaron los navegadores modernos. Para compilar el núcleo en cualquier cosa que no sea C / C ++, probablemente habría tenido que compilar o comprar y modificar un compilador y bibliotecas de plataforma.
Solo por diversión, pensemos en el problema hoy. Sí, hay alternativas, pero todavía hay problemas importantes.
La elección del idioma presenta al menos estos problemas:
¿De dónde sacas personas que conocen el idioma o pueden aprenderlo? Este es un obstáculo para lenguajes como OCaml, F #, Haskell, Common Lisp y D que son lo suficientemente rápidos y de alto nivel como para escribir un navegador, pero tienen pocos seguidores (en el rango de 10k-100k, tal vez) incluso si es liberal Contar todos los aficionados y académicos.
Corolario a la respuesta de culto de carga anterior:
Incluso en los tiempos modernos, necesita un lenguaje bastante rápido para las partes intensivas de cómputo de las páginas de representación y la ejecución de Javascript. Puede optar por complementar eso con un lenguaje de alto nivel para construir elementos GUI, etc. (por ejemplo, el enfoque de Firefox de C ++ y Javascript) pero debe tener una estrecha integración entre los lenguajes; no puedes simplemente decir "Está bien, C # y Lua". Probablemente tendrá que compilar y depurar ese puente usted mismo a menos que elija C o C ++ como lenguaje base.
El desarrollo multiplataforma es otra bolsa de gusanos. Podrías usar C # o F # y cruzar los dedos sobre GTK # y Mono estar vivo y bien en el futuro. Usted podría tratar de Common Lisp, Haskell, OCaml ... Buena suerte conseguir que todo funcione en Windows y Mac y Linux.
Después de todo eso, debe crear una enorme cantidad de funcionalidad, por lo que si elige un lenguaje de bajo nivel, necesita un ejército de codificadores aún más enorme que antes. Tenga en cuenta que nadie realmente ha construido un navegador desde cero en unos quince años. Eso es en parte porque (¡sorpresa!) Es difícil.
Específicamente, tener un intérprete de Javascript es el problema 3 (adquirir uno) o el problema 4 (compilar uno).
Si desarrolló un navegador de tres plataformas (Windows / Mac / * nix) hoy (principios de 2011), ¿cuáles son algunas de las opciones?
Si vemos que otro navegador importante aumenta en los próximos años, apostaría a que estará escrito en C o C ++ y un lenguaje dinámico (como Firefox), ya sea de código abierto o propietario.
Editar (31 de julio de 2013) : Los comentaristas en Hacker News parecen mencionar Rust and Go (no específicamente en relación con mi respuesta), que caen vagamente en el cubo "misceláneo rápido". Intentar mantener esta lista de idiomas igualitaria y actualizada será una batalla perdida, así que en lugar de eso la llamo una muestra representativa al momento de escribir y dejarla en paz.
Velocidad
Tan feo como es, C ++ sigue siendo lo que usa cuando desea una aplicación rápida y un control total sobre el código.
Esta es la razón por la cual los juegos, las partes no centrales (como los importadores de archivos) de Office y más aún se escriben en C ++.
Editado para incluir la respuesta de MSalters
Solo puedo adivinar, pero está mencionando productos de software que apuntan a múltiples plataformas, y C ++ se puede compilar en cualquier plataforma.
(He estado trabajando en Firefox durante unos cinco años).
El interrogador tiene razón en que gran parte del código de Firefox es C ++, y de hecho C ++ es la mayoría si cuenta por líneas de código (aunque eso no cuenta toda la historia, ya que tenemos mucho JavaScript, y JS es más conciso que C ++).
Pero en realidad, Firefox está escrito en muchos idiomas diferentes:
Estoy seguro de que estoy olvidando algunos.
Esta lista es importante porque insinúa la increíble complejidad que se encuentra detrás de un navegador web.
Sí, Firefox tiene mucho código C ++, y sí, eso tiene algo que ver con el hecho de que C ++ era el mejor lenguaje para este tipo de cosas cuando se fundó Netscape. Pero también sostengo que no existe un lenguaje mejor hoy para mucho de lo que hacemos.
Ningún otro idioma tiene un ecosistema de bibliotecas tan fuerte (dependemos en gran medida del código externo). Pocos otros lenguajes le brindan control de pila completa como C ++ (ajustamos regularmente nuestro asignador de montón personalizado y hacemos todo tipo de cosas inseguras de memoria para que sea más rápido o use menos memoria). Pocos otros idiomas le permiten volver a implementar la mayoría de la biblioteca estándar de una manera sensata (tenemos nuestras propias implementaciones de cadenas y colecciones, ajustadas a nuestras necesidades). Pocos otros idiomas le permiten implementar su propio recolector de basura. Y así.
Aunque C ++ es la opción obvia para mucho de lo que hacemos, las personas que sugieren que podríamos escribir un navegador en Java y escribir nuestra propia JVM si es necesario están en algo. Esto es esencialmente lo que hacemos, pero con JavaScript en lugar de Java. Por supuesto, gran parte del navegador no está escrito en JavaScript. Pero una cantidad sorprendente es.
Bueno, tendrías que pedirles directamente a los desarrolladores de esos productos que obtengan la respuesta, pero sospecho que es una combinación de familiaridad (es lo que esos desarrolladores sabían mejor), rendimiento (compilación de un binario nativo en lugar de bytecode) y herramientas (en comparación con lenguajes como C, C ++ está lleno de buenos dispositivos que ahorran trabajo como el STL).
Cada uno de los navegadores tiene cierta historia que influyó en la elección del idioma.
Por ejemplo, tanto Chrome como Safari se basan en WebKit, que tiene su origen en la parte KHTML del proyecto KDE. Originalmente, KDE se creó (en parte) como una demostración del kit de herramientas Qt GUI, por lo que KDE es, en general, un proyecto C ++. Todos los nuevos proyectos de KDE estaban, en ese momento, escritos completamente en C ++, por lo que era una elección lógica para KHTML. Desde entonces se ha portado para usar otros kits de herramientas GUI.
El motor Presto de Opera se escribió teniendo en cuenta el rendimiento y un pequeño tamaño binario: C ++ era la opción lógica.
El IE de Microsoft se escribió como una colección de componentes ActiveX, que podrían haberse escrito en cualquier lenguaje que tenga enlaces COM, pero probablemente se escribió en un subconjunto de C ++, porque la mayoría de su base de código ya está escrita en ese lenguaje.
Mozilla de Netscape fue escrito en C ++ probablemente porque la portabilidad era una de sus principales preocupaciones. Los compiladores de C y C ++ son (virtualmente) ubicuos, por lo que fue una elección lógica.
No hay una razón técnica inherente para estas elecciones. Simplemente "parecía una buena idea en ese momento".
Las redes en C y C ++ son fáciles de optimizar, ya que no tiene que usar bibliotecas si no lo desea. Sospecho que C ++ es el lenguaje de elección porque permite las ventajas de C:
junto con las ventajas de OOP:
Cuando se escribieron las primeras líneas de código para la primera ronda de navegadores, C # y Java no existían. Tampoco Ruby. Puede que Python haya existido, pero en ese momento todavía era un pequeño proyecto casero.
Básicamente, realmente no había otras opciones además de C ++ que permitieran construir un navegador que fuera rápido y se ejecutara en muchas plataformas diferentes.
Entonces, ¿por qué se escribieron en C ++? Porque ese era el único idioma disponible en el que podían escribirse.
Debido a que los navegadores (p. Ej., HotJava, obviamente escritos en Java) escritos en otros idiomas, nunca se ha logrado ningún grado sustancial de aceptación / penetración en el mercado.
No puedo decir nada sobre la iteración actual (o la más reciente, no se ha actualizado en bastante tiempo) de HotJava, pero cuando lo probé, la falta de penetración en el mercado parecía (al menos para mí) extremadamente fácil de entender - Era feo, lento e incompatible con bastantes páginas web. En última instancia, parecía estar basado en una premisa que nunca funcionó: que la web consistiría principalmente en applets de Java, con HTML como poco más que un contenedor que indica qué applets mostrar dónde.
Parte de esto probablemente también sea histórico: la mayoría de los grandes navegadores web han existido durante mucho tiempo. Cuando se escribieron por primera vez, el panorama era muy diferente: C ++ era un nuevo lenguaje "candente", por lo que se estaba utilizando para muchos desarrollos nuevos. Los navegadores se han convertido en algunos de los programas más utilizados, mientras que muchos otros de la época se han desvanecido.
Creo que la "actitud" mostrada del lenguaje también tiene un efecto: C ++ (como C antes) siempre ha enfatizado la practicidad y el pragmatismo. Esa actitud básica tiende a atraer programadores que también son pragmáticos. Muchos otros idiomas ponen mucho más énfasis en cosas como la elegancia, y al hacerlo, atraen a programadores que piensan de la misma manera. El problema con eso es lo que yo llamo el "efecto Lisp". Los síntomas incluyen:
Hay más, pero entiendes la idea general (y sí, estoy exagerando hasta cierto punto, pero solo hasta cierto punto). Sí, parte del código que obtenga será asombrosamente hermoso, pero es probable que sea seis meses tarde, y en su mayoría incompatible con cualquier otro código en (lo que se supone que es) el sistema, y para cuando lo reciba, habrá una posibilidad bastante justa de que algo más haya cambiado lo suficiente como para que no puedas usarlo en absoluto.
También hay idiomas que sin duda funcionarían bien, pero (correcta o incorrectamente) simplemente no tienen (o en el momento crucial, no tenían) la cuota de mercado para que alguien haya escrito un navegador en ellos. Dado el tamaño y la complejidad de un navegador completo, se necesita mucha gente y bastante tiempo para desarrollar uno. Con ese tipo de inversión, muchas personas se vuelven relativamente conservadoras sobre cosas como las herramientas de desarrollo.
gets
, que es una función terrible, pero difícilmente inevitable (y ciertamente no "fundamental" para el lenguaje, ni nada de eso). En segundo lugar, C ++ no es el mismo lenguaje que C en ningún caso. En tercer lugar, OpenBSD demuestra bastante bien que el software seguro puede y está escrito en C. No existe un "defecto de lenguaje subyacente" que impida la escritura de software sólido y seguro en C. La pequeña cuota de mercado de OpenBSD indica que la seguridad no es una preocupación importante para la mayoría personas.
gets
es una consecuencia simple del hecho de que no pasa la longitud del búfer que está utilizando. No hay nada fundamental en el lenguaje al respecto: podría hacer lo mismo en Pascal (y yo lo he hecho). Escribir software que sea seguro contra un atacante inteligente no es fácil, independientemente del idioma. Según la experiencia en los tres, es un poco más fácil en C que en Pascal, y mucho más fácil en C ++ que en C.
Programación de culto de carga. La percepción de que "C ++ es rápido" todavía está ahí afuera (a pesar de las características de nivel de lenguaje mal pensadas como su modelo de objetos mal roto que ralentiza las cosas) y las personas quieren que sus navegadores sean rápidos, por lo que escriben en C ++ .
En un mundo sano, las personas que escriben software orientado a la red se horrorizarían ante la simple idea de usar un lenguaje que viene cargado con todos los problemas de seguridad inherentes de C, y en realidad hacerlo sería un acto de negligencia criminal. (¡Solo mire cuántos exploits de desbordamiento de búfer se han encontrado en varios navegadores en los últimos 15 años más o menos! ¿De cuántos millones de dólares de daño son responsables estos codificadores?)
Hay otros lenguajes compilados capaces de crear binarios rápidos. El problema es que no tienen la misma exposición que la familia C, y todos tenemos que sufrir por ello.
Dato curioso: cuando Morris Worm llegó a Internet en 1988, demostrando de manera concluyente los problemas con la escritura de sistemas operativos y software de red en C (que todavía no se han resuelto hasta el día de hoy, porque son defectos inherentes en el lenguaje ,) Apple había lanzado el sistema operativo más avanzado que el mundo había visto hasta ahora, durante varios años, escrito en Pascal.
Acceso a API a nivel de sistema
Todos los navegadores tienen que interactuar con el sistema operativo en algún momento, y la mayoría de los principales sistemas operativos tienen bibliotecas y API de C y C ++ bien establecidas. Por lo general, es más fácil trabajar con esas API en C o C ++ en lugar de escribir contenedores.
Control y portabilidad
La mayoría de los argumentos de velocidad pueden ir en cualquier dirección, pero en cualquier cosa donde necesite un control preciso sobre cómo se hace algo, muchos de los idiomas de nivel superior lloverán en su desfile. Hay excepciones a esto, pero la mayoría de ellos no son lo suficientemente multiplataforma como para contar en un navegador.
No tiene nada que ver con los méritos de C ++ frente a otros lenguajes. Seguramente puede escribir un mejor navegador desde cero en un idioma como Haskell; un proyecto tan importante podría incluso implementar su propia JVM si necesitaran garantizar algunas características de rendimiento. Me gusta cómo Facebook escribió su propio compilador / optimizador PHP.
Un navegador que no funciona con un marcado no estándar es peor que inútil. La compatibilidad heredada es tan crítica y compleja que una reescritura simplemente no es una opción. Se invierte mucho dinero y tiempo en seguridad probada en batalla, etc., no puede simplemente tirar esa inversión. Nuevamente, me gusta cómo Facebook todavía se escribe en PHP.