¿Por qué la mayoría de los navegadores se desarrollan en C ++ [cerrado]

99

Parece que la mayoría de los navegadores web comunes (Firefox, Chrome, Safari) se desarrollan utilizando C ++. ¿Por qué es eso así?

pellizcos
fuente
28
Firefox está escrito en C ++ y Javascript, no solo en C ++.
Jesse Millikan
1
Es probable que esta pregunta tenga algunas respuestas, suponiendo que sea precisa (tenga en cuenta el comentario de Jesse sobre Firefox, y hay muchos navegadores además de esos tres e IE). No creo que sea productivo.
David Thornley
1
¿Es este el grupo correcto para esta pregunta?
Martin York
66
@Jesse no es el intérprete js escrito en C ++? Eso lo haría todo en C ++, ¿no? (Podría estar equivocado ..)
cambraca
55
@cambraca, con esa lógica, ¡todo es código de ensamblaje!
Juan Mendes

Respuestas:

165

Otra forma de hacer la pregunta es ¿qué tipo de soporte necesita un navegador? La lista corta es:

  • Soporte para análisis (necesario para dar sentido a [X] HTML, CSS y Script [ECMA / Java])
  • Funciones para caminar / interpretar árboles (parte de la IU de análisis y construcción)
  • Soporte para gráficos acelerados.
  • Redes rápidas
  • Para los navegadores más avanzados: control sobre procesos y aislamiento de memoria entre páginas
  • Debe funcionar en todas las plataformas compatibles

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.

Berin Loritsch
fuente
44
Para las plataformas que no son Apple ni NeXT, existe la colección GNUStep. Es sobre todo compatible con Cocoa, y se ejecuta casi en todas partes.
greyfade
55
Recuerde que Java no debe usar Swing (que es una biblioteca horrible) para la GUI. Por ejemplo, tenemos enlaces Qt.
Anto
2
De acuerdo con my.opera.com/kilsmo/blog/2008/01/29/opera-is-not-based-on-qt Opera no se basa en Qt
Anto
2
Nunca dije que Opera se basara en Qt. Quise decir que un navegador no gratuito es realmente difícil de vender cuando hay tantas excelentes opciones gratuitas.
Berin Loritsch
77
La disponibilidad de generadores de analizadores no es realmente tan relevante: en todos los navegadores, los analizadores HTML, XML y JS están escritos a mano, y CSS está en algunos.
gsnedders
89

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!

Pregunte 'cuándo' antes 'por qué'

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.

¿Que tal hoy? Cuales son las alternativas?

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:

  1. Problemas de conocimiento: contratación / capacitación de desarrolladores o atracción de colaboradores
  2. Problemas organizacionales / sociales - Aceptación del lenguaje
  3. Implementación del lenguaje: velocidad, soporte de plataforma, herramientas
  4. Poder del lenguaje

1: problemas de conocimiento

¿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.

2: problemas sociales / organizacionales

Corolario a la respuesta de culto de carga anterior:

  • Un navegador de código abierto que no usa C, C ++, C # o Java supuestamente tendrá dificultades con los contribuyentes.
  • Un navegador propietario que no utilice C, C ++, C # o Java hará que los gerentes de proyecto reciban gritos severos en la mayoría de las organizaciones.

3. Problemas técnicos

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.

4. Poder del lenguaje

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).

Conclusión:

Si desarrolló un navegador de tres plataformas (Windows / Mac / * nix) hoy (principios de 2011), ¿cuáles son algunas de las opciones?

  • C: Ver (2). Todos clamarán por C ++. Diviértete seleccionando un juego de herramientas multiplataforma o construyendo uno (1, 2, 3 y 4). Ver también (4); diviértete construyendo un navegador estable y seguro.
  • C ++: Diviértete seleccionando un juego de herramientas multiplataforma o construyendo uno (1, 2, 3 y 4). Diviértete (4) construyendo un navegador estable y seguro.
  • C o C ++ y HLL: su mejor apuesta. Elige tu veneno en el lenguaje dinámico; Ver (1) y (2). Demasiados buenos idiomas, muy pocos seguidores de cada uno. (1, 2, 3 y 4) en el juego de herramientas.
  • Java: Segunda mejor apuesta, si tiene que complacer a la gerencia media. Ver (4); construir grandes cosas en Java requiere mucho más código que en cualquier otra cosa en esta lista, pero tal vez C.
  • Scala: late Java en (4); (1) y (2) pero se está poniendo de moda.
  • C y Javascript: como caso especial, esto es atractivo porque ya tiene que construir o adquirir y asimilar un intérprete de Javascript. (De ahí Firefox.) (1, 2, 3 y 4) en el kit de herramientas; la gente de Mozilla construyó su propio IIRC.
  • C #: Diviértete en (3). Probablemente esté atascado con GTK #, por bueno que sea, o construya su propia capa y renderizador sobre GTK # y Windows Forms.
  • Ruby / Python / Perl / Racket / Lua / Erlange, etc .: tienes (3) en bibliotecas de widgets multiplataforma y velocidad. La ley de Moore está contigo el (4); La creciente demanda de navegadores está en su contra.
  • OCaml, Haskell, Common Lisp, Smalltalk: (1) y (2) en espadas. Probablemente no haya problemas de velocidad, pero (3) para el desarrollo multiplataforma, y ​​de alguna manera tendrá que construir su propio todo o puentear a las bibliotecas C / C ++.
  • Objetivo-C: (3) No estoy seguro de cómo funcionaría el desarrollo multiplataforma aquí.

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.

Jesse Millikan
fuente
44
+1 por señalar que CUANDO un navegador en particular se desarrolló por primera vez también juega un papel importante.
Sparky el
3
Vale la pena señalar que si bien IE puede no ser multiplataforma hoy en día , ciertamente lo fue en un momento, y su cuota de mercado actual casi seguramente se deriva (al menos en parte) de esa capacidad multiplataforma.
Jerry Coffin
2
Tenga en cuenta que IE fue multiplataforma una vez alrededor de IE4.
JasonFruit
2
+1 para cuándo. Esa es la única razón. Si alguien comenzara un proyecto de navegador hoy, probablemente no usaría C ++
Henry
44
@Henry, es poco probable que excluyan el uso de C ++. La respuesta señala que C ++ seguirá siendo parte del rompecabezas.
Tipo anónimo el
36

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

Ryan Hayes
fuente
3
Aparte de los juegos, no creo que estas razones sean por qué esas aplicaciones están escritas en C ++. Aunque si tienes conocimiento de primera mano, me alegra que me demuestren que estoy equivocado.
Henry
2
¿conocimiento de primera mano? VS 2010, Office 2010 son enormes conjuntos de aplicaciones, pero son extremadamente rápidos en lo que hacen. Si bien ambos tienen un legado COM bastante grande y una herencia MS, el rendimiento sigue siendo lo más importante para los usuarios.
Tipo anónimo el
8
¿En qué otra cosa se escribiría la oficina? VB? C y C ++ son las únicas opciones para que Microsoft escriba aplicaciones grandes. No digas C # por favor
Toby Allen
44
@Victor: no he visto la fuente de VS2010, por lo que es muy posible que esté escrito completamente en C #.
Ryan Hayes
3
Si Office es una aplicación C #, ¿por qué el Ribbon original era un control MFC y tuvimos que esperar años para que se desarrollara un C # one? ninguna de estas enormes aplicaciones se reescribirá en C #, se envolverán en una interfaz gráfica de usuario de WPF (como VS2010) y se reutilizará la mayor parte del código anterior. Incluso MS no tiene los recursos para reescribir por completo sus aplicaciones más grandes, no si también quieren pasar tiempo agregándoles funciones.
gbjbaanb
17

Portabilidad

Solo puedo adivinar, pero está mencionando productos de software que apuntan a múltiples plataformas, y C ++ se puede compilar en cualquier plataforma.

Pete
fuente
+10 - Aparte del rendimiento en bruto, creo que esta es la razón REAL por la que la mayoría de los navegadores están en C ++ con la excepción de IE. La mayoría de los navegadores funcionan en múltiples plataformas y hay pocos idiomas / marcos que pueden funcionar al mismo nivel Y ser compatibles con múltiples plataformas.
Jordan Parmer
Al principio pensé esto también, pero para una aplicación centrada en la GUI como un navegador web. ¿C ++ es realmente mucho más portátil para otros sistemas operativos que Java?
JohnFx
1
¿Es realmente un navegador tan centrado en la GUI?
Kris Van Bael
@JohnFx - Correcto, la parte de la GUI probablemente no sea tan portátil. Pero el núcleo de, por ejemplo, una aplicación de navegador se trata de manejar HTML, crear árboles DOM, analizar JavaScript y ejecutarlo lo suficientemente rápido. Una aplicación bien diseñada puede compartir fácilmente el mismo núcleo y tener un código de interfaz de usuario diferente para cada plataforma. Y sí, C ++ es mucho más portátil que Java (pero sin GUI), porque para C ++ solo necesita un compilador dirigido a la CPU. Para Java necesitas el marco completo.
Pete
Entendí que la mayoría de las entrañas del procesamiento HTML se realizan mediante algunas herramientas centrales como WebKit. ¿Quizás es porque los que están en C ++ son los navegadores completos?
JohnFx
13

(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:

  • C ++
  • C (NSS, NSPR, varias bibliotecas que hemos importado)
  • x86 y ensamblaje ARM
  • JavaScript
  • XUL (un lenguaje de marcado similar a HTML) y CSS
  • Objetivo C (código solo para MacOS)
  • Java (código solo para Android)
  • Múltiples lenguajes personalizados de definición de interfaz (XPIDL, IPDL)
  • WebIDL (otro lenguaje de definición de interfaz, pero este no es personalizado, aunque el generador de código sí lo es)
  • Python (generadores de código)

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.

Justin L.
fuente
¿Estas acciones de memoria insegura son fuentes de problemas de seguridad?
Demi
12

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).

John Bode
fuente
10

Historia

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".

Greyfade
fuente
8

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:

  • Velocidad
  • Mejoramiento
  • Una cierta cantidad de portabilidad
  • Lenguaje compilado, no interpretado

junto con las ventajas de OOP:

  • Extensibilidad
  • Visualización más fácil
  • Mejor soporte de biblioteca para tareas no críticas, como procesamiento de cadenas y estructuras de datos.
Michael K
fuente
¿Java o C # no tienen esas ventajas?
Nipuna
55
He desarrollado aplicaciones en ambos, y diría que para una funcionalidad de red limitada están bien. Sin embargo, no me gustaría construir nada centrado en la parte de la red como lo hace un navegador. Me gustaría tener mucho más control sobre lo que estaba sucediendo, y me gustaría un lenguaje compilado .
Michael K
Java y C # también se compilan. C # tendría una ventaja sobre Java cuando se trata de construir la GUI, una parte crítica de cualquier navegador. Java tendría una ventaja con la portabilidad. Tanto Java como C # se vuelven a compilar en la plataforma de destino, para mejoras de velocidad posiblemente mejores.
Berin Loritsch
55
No, ellos son interpretados. Se compilan a bytecode y se ejecutan en una máquina virtual. Esa VM no tiene una correspondencia uno a uno de su conjunto de instrucciones con la nativa.
Michael K
1
¡No podrías tener esto más al revés! Redes; usted podría hacer rizos y el navegador sería igual de rápido. El código de red no es el bit lento. ¿Y qué son los sockets si no es una biblioteca? Procesamiento de cadenas; Este es el núcleo de cualquier navegador HTML, no es no crítico y no puedo pensar en una sola lengua que tiene peor manejo de C ++ que no sea C. cadena
Henry
4

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.

Gran maestro B
fuente
1
No estoy seguro de lo que quieres decir con 'nueva ronda'. Pero FF e IE tienen bases de código que se remontan a mediados de los 90, y la mayoría de los nuevos navegadores usan uno de los motores de renderizado (por ejemplo, Chrome usa WebKit)
GrandmasterB
2
FF se deshizo del código heredado de Netscape (es decir, la hinchazón de mediados de los 90) e implementó su propio motor de renderizado. WebKit también es un motor de renderizado relativamente nuevo (utilizado por Chrome y Safari). IE todavía tiene una hinchazón heredada que continúa sopesándolo. Así que no estaré de acuerdo aquí.
Berin Loritsch
2
Según Wikipedia, al menos, tanto gecko como webkit comenzaron alrededor de 1998. C # no existía en ese momento, y Java era nuevo en la escena (y muy lento y realmente horrible con la interfaz gráfica de usuario en aquel entonces), por lo que esa no hubiera sido una opción factible. Así que no sé qué otros idiomas habrían sido adecuados. Quizás Pascal.
GrandmasterB
1
@Berin Loritsch: Sí, pero en ningún momento simplemente tiraron todo el código existente y comenzaron de nuevo (en todo) desde el principio, que es más o menos lo que habrían tenido que hacer para convertir a otro idioma. Además, las personas que conocían / ​​conocían C ++ lo suficientemente bien como para que su decisión sobre FF se mantuviera probablemente cambiarían a un idioma diferente de todos modos.
Jerry Coffin
2
@Berin Loritsch Basura. FF todavía se basa en Gecko (1997) y Webkit se basa en khtml (1998).
Henry
4

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:

  1. Interminables discusiones sobre la implementación más elegante de las cosas más triviales.
  2. Incapacidad para congelar funciones y terminar algo que se puede enviar (incluso con fallas)
  3. Incapacidad de compromiso. Cualquiera que no esté de acuerdo conmigo no solo está equivocado, sino que debe ser estúpido o malvado.

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.

Jerry Coffin
fuente
1
WRT punto 3, definitivamente afirmaré, sin calificación, que escribir software orientado a la red en la familia C es estúpido o malo, porque implica trabajar sin saberlo (estúpido) o conscientemente (malvado) con un sistema ampliamente conocido por introducir seguridad agujeros que va a causar daño a sus usuarios. Es moralmente equivalente a darle una armadura corporal a un soldado con un objetivo pintado.
Mason Wheeler
99
@Mason: Su exhibición de la intolerancia en cuestión es ciertamente apreciada.
Jerry Coffin
2
@Mason: Tonterías. Un agujero de seguridad (que ya se había solucionado, pero muchos administradores de sistemas no se habían molestado en instalar el código actualizado) ni siquiera es una prueba de que todo el código escrito en el mismo idioma "causará daños" o algo por el estilo. OpenBSD (por ejemplo) tiene un historial de seguridad considerablemente mejor que el que aspiraba la versión de MacOS basada en Pascal.
Jerry Coffin
55
@Mason: No, lo eres. Primero, el gusano Morris explotó un programa que usaba 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.
Jerry Coffin
66
@Mason: el desbordamiento del búfer getses 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.
Jerry Coffin
3

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.

Mason Wheeler
fuente
15
¿Eh? Me gustó mucho el sistema operativo Mac, pero llamarlo el sistema operativo más avanzado que el mundo haya visto es una tontería. Ni siquiera estaba en el mismo estadio que UNIX y VMS, y mucho menos los grandes sistemas de hierro de IBM: usuario único, sin memoria virtual, gestión de procesos limitada. Para estar seguro de que tenía un sistema de ventanas muy agradable, pero incluso eso era un derivado de Xerox Parc y un montón de proyectos académicos. También creo que gran parte del Mac OS en realidad fue escrito en el ensamblado M68k. Las bibliotecas utilizaron los estándares de llamada de la función Pascal porque se esperaba que Pascal fuera el lenguaje de aplicación principal.
Charles E. Grant
55
Los sistemas operativos de Apple anteriores a la década de 2000 no eran más estables que el equivalente de MS. Cuando estaba trabajando en dos proyectos en los años 90, uno con Mac OS y otro con NT tuve la misma cantidad de bloqueos y reinicios necesarios. Ahora todos son una especie de lenguaje basado en C. (Apple usa Objective-C para sus cosas actuales). La seguridad puede ser más difícil en lenguajes basados ​​en C, pero usar un lenguaje diferente no lo hace repentinamente más seguro.
Berin Loritsch
13
@Mason, el hecho de que la Mac no necesitara esas funciones en ese momento no significa que sean insignificantes. Hiciste una declaración sin reservas de que el sistema operativo de Apple era el más avanzado del mundo, pero aparentemente lo que realmente querías decir era que tenía la interfaz de usuario más sofisticada. Esa es una declaración defendible, pero bastante menos grandiosa de lo que escribiste. Escribir una GUI utilizable es difícil. Escribir un sistema de memoria paginado confiable es difícil. Decir que uno es más significativo que el otro es tonto. La informática a nivel del consumidor tal como la conocemos ahora no podría existir sin ambas.
Charles E. Grant
55
@Mason: su experiencia difiere claramente (enormemente) de cualquiera y de todos los demás, en muchos aspectos. :-)
Jerry Coffin
3
@Mason: LOL al referirse a OSX pre-Mac como "avanzado". El sistema operativo Apple fue una fuente constante de fallas, sobre todo debido a su sistema de archivos extremadamente rudimentario.
Tipo anónimo el
2

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.

TMN
fuente
0

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.

Cuenta
fuente
0

Compatibilidad heredada: no se puede tirar el código antiguo

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.

Dustin Getz
fuente
Puedo entender por qué la gente podría no votar a favor ... ¿sino votar a favor? Eso es raro. Aquí hay un +1 para ti.
Thomas Eding
Tienes un punto (pequeño), pero tu primera oración lo tira. Por supuesto, también tiene que ver con los méritos de C ++ frente a otros lenguajes.
Chiel ten Brinke