c++ - móviles - manual de programacion android pdf
¿Por qué la mayoría de los proyectos de código abierto más grandes en C? (16)
Algunas personas han mencionado la portabilidad, pero en este día, la portabilidad de C ++ no es un gran problema (se ejecuta en todo lo que se ejecuta en GCC, que es esencialmente cualquier cosa). Sin embargo, la portabilidad es más que una arquitectura a otra o un sistema operativo a otro. En el caso de C ++, incluye compilador a compilador.
Vamos a discutir ABI, o la interfaz binaria de la aplicación. Básicamente, esto significa "cómo su código se traduce en ensamblaje". En C, cuando escribes:
int dostuff(const char *src, char *dest);
Sabe que está creando un símbolo en su archivo de objeto llamado _dostuff
(todos los nombres globales de C están precedidos por un guión bajo en el ensamblaje resultante). Pero en C ++, cuando escribes esto:
int dostuff(const char *src, char *dest);
int dostuff(const char *src, char *dest, size_t len);
O incluso:
int dostuff(std::string src, std::string dest);
Todas las apuestas son instantáneamente apagadas. Ahora tiene dos funciones distintas, y el compilador tiene que hacer cada una, y tiene que dar a cada uno un nombre único. Así que C ++ permite (donde creo que C no) la manipulación de nombres , lo que significa que esas dos funciones podrían traducirse a _dostuff_cp_cp
y _dostuff_cp_cp_s
(de modo que cada versión de la función que toma un número diferente de argumentos tenga un nombre diferente).
El problema con esto es (y considero que esto es un gran error, aunque no es el único problema con la portabilidad de compilador cruzado en C ++) que el estándar de C ++ dejó los detalles de cómo modificar estos nombres hasta el compilador . Entonces, mientras que un compilador de C ++ puede hacer eso, otro puede hacer _cp_cp_s_dostuff
, y otro puede hacer _dostuff_my_compiler_is_teh_coolest_char_ptr_char_ptr_size_t
. El problema se agrava (siempre encuentra una forma de colar esta palabra en cualquier cosa que diga o escriba) por el hecho de que tiene que manipular nombres para algo más que funciones sobrecargadas, ¿qué pasa con los métodos y espacios de nombres y la sobrecarga de métodos y la sobrecarga de operadores y ... . (la lista continua). Solo hay una forma estándar de garantizar que el nombre de su función sea realmente lo que espera que sea en C ++:
extern "C" int dostuff(const char *src, char *dest);
Muchas aplicaciones necesitan tener (o al menos encontrarlo muy útil) un ABI estándar proporcionado por C. Apache, por ejemplo, no podría ser tan multiplataforma y fácilmente extensible si estuviera en C ++. para tener en cuenta la mutilación de nombres de un compilador particular (y una versión de compilador particular - GCC ha cambiado algunas veces en su historial) o requiere que todos usen el mismo compilador universalmente, lo que significa que, cada vez que actualice su compilador de C ++ con una esquema de gestión de nombres incompatible hacia atrás, tiene que volver a compilar todos sus programas de C ++.
Esta publicación se convirtió en un monstruo, pero creo que ilustra un buen punto, y estoy demasiado cansado para intentar recortarlo.
Estoy teniendo un debate con un amigo y nos preguntamos por qué tantos proyectos de código abierto han decidido ir con C en lugar de C ++. Proyectos como Apache, GTK, Gnome y más optaron por C, pero ¿por qué no C ++ ya que es casi lo mismo?
Estamos buscando precisamente las razones que podrían haber llevado a esos proyectos (no solo a los que he enumerado, sino a todos los proyectos en C) a ir con C en lugar de C ++. Los temas pueden ser rendimiento, facilidad de programación, depuración, pruebas, concepción, etc.
C ++ es un desastre. Es un lenguaje demasiado complicado, tan complicado que solo pocas personas pueden decir que conocen todos los bits. Y menos compiladores que realmente cumplen con el estándar C ++.
Así que creo que la razón es la simplicidad y la portabilidad.
Si desea una programación de nivel superior y orientada a objetos, entonces creo que C ++ solo compite con otros como Python. (Tenga en cuenta que programé en C ++ algunos años, es rápido y tiene algunas características de lenguajes de nivel superior que aceleran el desarrollo, sin ofender).
C es muy portátil, mucho más que C ++ hace 10 años.
Además, C está muy arraigada en la tradición Unix. Lea más en '' The Art of Unix Programming '', sobre Unix y OO en general , y sobre lenguajes específicos en Unix (incluyendo C y C ++).
Como alguien a quien no le gusta C ++ y escogería C en cualquier momento, al menos puedo darle mis impresiones sobre el tema. C ++ tiene varios atributos que lo hacen poco atractivo:
- Objetos complicados. C ++ tiene mucha capacidad para acelerar la OO, lo que hace que el lenguaje sea muy complejo.
- Sintaxis no estándar. Incluso hoy en día, la mayoría de los compiladores de C ++ admiten peculiaridades que hacen que garantizar la compilación correcta y satisfactoria sea difícil.
- Bibliotecas no estándar. En comparación con las bibliotecas de C, las bibliotecas de C ++ no están tan estandarizadas en todos los sistemas. Haber tenido que lidiar con Hacer problemas asociados con esto antes de poder decirles que ir con C es un gran ahorro de tiempo.
Dicho esto, C ++ tiene los beneficios de soportar objetos. Pero cuando se trata de eso, incluso para proyectos grandes, la modularidad se puede lograr sin objetos. Cuando agrega el hecho de que esencialmente todos los programadores que pueden contribuir con código a cualquier proyecto pueden programar C, parece difícil tomar la decisión de utilizar cualquier otra cosa si necesita escribir su código tan cerca del metal.
Dicho todo esto, muchos proyectos saltan sobre C ++ y van a lenguajes como Python, Java o Ruby porque proporcionan más abstracción y un desarrollo más rápido. Cuando agrega su capacidad para admitir la compilación / carga desde el código C para las partes que necesitan la patada de rendimiento, C ++ pierde la ventaja que podría haber tenido.
El maravilloso libro de Eric Raymond "El arte de la programación en Unix" tiene algunas reflexiones sobre este tema (vale la pena leer el libro completo, ya sea en el periódico o en las ediciones en línea gratuitas. Solo señalo la sección correspondiente: Eric participó en el acuñación e introducción del término "código abierto", y siempre vale la pena leerlo; -0).
Al resumir esa sección, Raymond afirma que "los lenguajes OO muestran cierta tendencia a chupar a los programadores en la trampa de las capas excesivas" y los programadores Unix (y, por extensión, los programadores de código abierto) resisten esa trampa del "pegamento grueso".
Later en el libro, encontrará algunas consideraciones específicas sobre C ++, como "Puede ser que la realización de OO de C ++ sea particularmente propensa a los problemas". Ya sea que esté de acuerdo o no, vale la pena leer el texto completo (¡aquí casi no puedo hacer justicia!), Y con una bibliografía que lo señala a muchos otros estudios y publicaciones relevantes.
En primer lugar, algunos de los proyectos de código abierto más grandes están escritos en C ++: Open Office, Firefox, Chrome, MySQL, ...
Dicho esto, también hay muchos proyectos grandes escritos en C. Las razones varían: pueden haberse iniciado cuando C ++ aún no estaba estandarizado, o los autores se sienten más cómodos con C, o esperan que la curva de aprendizaje más fácil para C Atraería a más colaboradores.
Hay numerosos ejemplos de contador: todo basado en Qt para uno.
Además, en mi sistema de pruebas Debian:
edd@ron:~$ apt-cache rdepends libstdc++6|wc -l
4101
Entonces, eso es 4101 paquetes dependiendo de la biblioteca básica de C ++. A modo de comparación, obtengo unos 14,982 para libc6 o aproximadamente 3.6 como tantos. Pero no lo es si no hay ningún proyecto de C ++ en tierra de código abierto.
Edit: Thinko por mi parte: como los paquetes C ++ también dependen de libc6, la proporción es realmente
(14982 - 4101) / 4101 = 2.65
así que hay aproximadamente 2 1/2 veces más paquetes implementados en C que en C ++.
He trabajado en algunos proyectos de C ++ en mi época, todos los cuales han terminado en lágrimas de una u otra manera. En el nivel más fundamental, la verdad es que no se puede confiar en las personas. No se puede confiar en ellos para que escriban un buen código, no se puede confiar en ellos para depurarlo, y ciertamente no se puede confiar en que lo comprendan cuando tengan que regresar y modificarlo nuevamente semanas / meses después.
El código C no tiene muchas cosas raras en C ++ que hacen que sea difícil de depurar (constructores / destructores, cualquier cosa que suceda con objetos globales estáticos durante el tiempo cpp_initialize (), etc.). Eso facilita el tratamiento cuando se desarrolla y mantiene un gran proyecto.
Tal vez sea un ludita, pero cada vez que alguien dice "C ++" a mi alrededor me da escalofríos.
Linus Torvalds ha discutido varias veces sobre el tema de C ++: usa C para git y, por supuesto, el kernel de Linux es principalmente C:
- en C ++ y git (advertencia: Don ignífugo primero)
- Una entrevista con Linus desde 1998.
Usted puede encontrar fácilmente más de estos, y aunque está en su naturaleza ponerse un poco enojado sobre estas cosas, hay algunos puntos válidos.
Una de las más interesantes (de donde estoy sentado, de todos modos) es la observación de que los compiladores y las bibliotecas de C ++ tenían (y hasta cierto punto son) mucho más buggy que los compiladores de C correspondientes. Esto es razonable dada la complejidad relativa de los dos idiomas.
Huele un poco al síndrome de "no se inventa aquí" (NIH), pero cuando tienes toda la base de desarrolladores del kernel de Linux, a veces puedes permitirte reinventar las cosas "de la manera correcta".
Muchos de los proyectos comenzaron antes de que se estandarizara C ++, por lo que C era la opción obvia y un cambio más tarde sería difícil. C se estandarizó aproximadamente una década antes que C ++, y ha sido más portátil durante más tiempo. Entonces, fue en gran medida una decisión pragmática en ese momento, inspirada en parte por la herencia de Unix de usar C para la mayoría de los códigos.
Puede leer Dov Bulka para encontrar lo que no debe hacer en cpp, puede leer tesseract ocr en el código de Google, puede leer muchas cosas, la mayoría de las cuales dependen de dónde se encuentra para determinar qué código lingüístico es superior. ¿Dónde leíste que c tiene más código fuente en código abierto que cpp? Bueno, por supuesto que lees eso en un foro de ac. Ahí es donde. Ir a alguna otra programación lingüística. Haga la misma búsqueda, encontrará que ese código tiene más código abierto.
Puedo enumerar un par de razones más
- El código C produce un código objeto más compacto. Intente compilar ''Hello World'' como programa C y C ++ y compare el tamaño del ejecutable. Puede que no sea muy relevante hoy, pero definitivamente fue un factor hace más de 10 años.
- Es mucho más fácil usar la vinculación dinámica con los programas en C La mayoría de las bibliotecas de C ++ aún exponen puntos de entrada a través de la interfaz de C. Entonces, en lugar de escribir un puente entre C ++ y C, ¿por qué no programar todo en C?
Si observa proyectos de código abierto recientes, verá que muchos de ellos usan C ++. KDE, por ejemplo, tiene todos sus subproyectos en C ++. Pero para los proyectos que comenzaron hace una década, fue una decisión arriesgada. C estaba mucho más estandarizado en ese momento, tanto formalmente como en la práctica (implementaciones de compiladores). También C ++ depende de un tiempo de ejecución mayor y carecía de buenas bibliotecas en ese momento. Usted sabe que las preferencias personales juegan un papel importante en dicha decisión, y en ese momento la fuerza laboral de C en los proyectos UNIX / Linux era mucho más grande que C ++, por lo que la probabilidad de que los desarrolladores iniciales de un nuevo proyecto se sintieran más cómodos con C era mayor Además, cualquier proyecto que necesite exponer una API haría eso en C (para evitar problemas de ABI), por lo que sería otro argumento a favor de C. Y, finalmente, antes de que los punteros inteligentes se hicieran populares, era mucho más peligroso programar en C ++ . Necesitarías programadores más expertos y tendrían que ser demasiado cuidadosos. Aunque C tiene los mismos problemas, sus estructuras de datos más simples son más fáciles de depurar utilizando herramientas / bibliotecas de verificación de límites.
También considere que C ++ es una opción solo para código de alto nivel (aplicaciones de escritorio y similares). El kernel, los controladores, etc. no son candidatos viables para el desarrollo de C ++. C ++ tiene demasiado comportamiento "bajo el capó" (cadenas constructor / destructor, tabla de métodos virtuales, etc.) y en dichos proyectos debe asegurarse de que el código resultante de la máquina / ensamblaje no tendrá sorpresas y no dependa del tiempo de ejecución Apoyo de la biblioteca para trabajar.
Si se implementa correctamente, C es muy rápido y muy portátil y los compiladores están ahí
C ++ es diferente para cada compilador disponible, las bibliotecas no están de acuerdo, los estándares no coinciden.
Un aspecto importante además de otros que sin duda se mencionarán es que C es más fácil de interactuar con otros idiomas, por lo que en el caso de una biblioteca que pretende ser de gran utilidad, C puede ser elegido incluso hoy en día para este propósito.
Para tomar ejemplos con los que estoy familiarizado, el kit de herramientas GTK + (en C) tiene enlaces OCaml robustos, mientras que Qt y Cocoa (respectivamente en C ++ y Objetivo C) solo tienen prueba de conceptos para tales enlaces. Creo que la dificultad de relacionar idiomas distintos de C con OCaml es parte de la razón.
Una razón podría ser que los estándares de codificación GNU le pidan específicamente que use C. Otra razón que se me ocurre es que las herramientas de software libre funcionan mejor con C que con C ++. Por ejemplo, la sangría de GNU no hace C ++ tan bien como C, o etags no analiza C ++ así como analiza C.