¿Qujing Java Training School le cuenta las ventajas y desventajas de la tecnología de programación en lenguaje C?
Con el desarrollo continuo de la tecnología de programación de Internet, la mayor parte del desarrollo de software ahora se implementa a través de lenguajes de programación. Hoy veremos las ventajas y desventajas de la tecnología de desarrollo de programación en lenguaje C.
Algunas buenas experiencias en lenguaje C
Aprenda a implementar programación orientada a objetos en lenguaje C leyendo el código fuente de POV-Ray.
Comprenda la claridad, limpieza y mantenibilidad del código en lenguaje C leyendo el código fuente GTK.
Al leer el código fuente de SIOD y Guile, sabrá cómo utilizar el lenguaje C para implementar el analizador Scheme.
Utilice el lenguaje C para escribir la versión inicial de GNOMEEye y ajustar el renderizado de MicroTile.
Algunas malas experiencias con el lenguaje C
Cuando estaba en el equipo de Evolution, muchas cosas seguían fallando. No existía Valgrind en ese momento y para obtener el software Purify, era necesario comprar una máquina Solaris.
Depurar el problema de bloqueo de subprocesos de gnome-vfs.
Depurando Mesa, pero sin éxito.
Después de adquirir la versión inicial de Nautilus-share, descubrí que free() no se utilizaba en el código.
Quiero refactorizar el código, pero no sé cómo administrar la memoria.
Quería empaquetar el código, pero descubrí que había variables globales en todas partes y no había funciones estáticas.
Pero de todos modos, hablemos de las cosas que están en Rust pero no en el lenguaje C.
Gestión automática de recursos
Rust toma prestadas algunas ideas de C, como RAII (ResourceAcquisitionIsInitialization, la adquisición de recursos es inicialización) y punteros inteligentes, y agrega el principio de propiedad única de valores, y También proporciona un mecanismo automatizado de gestión de recursos para la toma de decisiones.
Automatización: No es necesario llamar manualmente a free(). La memoria se liberará automáticamente después de su uso, el archivo se cerrará automáticamente después de su uso y el mutex se liberará automáticamente fuera del alcance. Si desea encapsular recursos externos, básicamente solo necesita implementar el rasgo Drop. Los recursos encapsulados son como parte del lenguaje de programación porque no es necesario administrar su ciclo de vida.
Decisional: los recursos se crean (asignación de memoria, inicialización, apertura de archivos, etc.) y luego se destruyen fuera del alcance. No existe la recolección de basura: el código está hecho y listo. El ciclo de vida de los datos del programa parece un árbol de llamadas a funciones.
Si siempre me olvido de llamar a estos métodos (liberar/cerrar/destruir) cuando escribo código, o descubro que el código que escribí antes se olvidó de llamarlo, o incluso lo llamó incorrectamente, entonces nunca lo haré. desea utilizar estos métodos nuevamente en el futuro.
Genéricos
Vec es realmente un vector de elementos T, no solo una matriz de punteros de objetos. Después de la compilación, solo se puede utilizar para almacenar objetos de tipo T.
Se necesitaría mucho código para lograr una funcionalidad similar en C, así que ya no quiero hacerlo.
Los rasgos no son solo interfaces
Rust no es un lenguaje de programación orientado a objetos como ese. Tiene rasgos que parecen interfaces: se pueden usar para implementar dinámicas. Vinculante. Si un objeto implementa Drawable, entonces puedes estar seguro de que el objeto tiene un método draw().
Pero pase lo que pase, el poder de los rasgos va más allá.
Gestión de dependencias
Anteriormente, implementar la gestión de dependencias requería:
Llamar a g-config manualmente o mediante macros de herramientas automatizadas.
Especifique las rutas del archivo de encabezado y de la biblioteca.
Básicamente, debes asegurarte manualmente de que esté instalada la versión correcta del archivo de la biblioteca.
En Rust, solo necesita escribir un archivo Cargo.toml y luego especificar la versión de la biblioteca dependiente en el archivo. Estas bibliotecas dependientes se descargarán u obtendrán automáticamente desde un lugar específico.
Probar
Las pruebas unitarias en C son muy difíciles por las siguientes razones:
Las funciones internas suelen ser estáticas. Es decir, no se pueden llamar desde archivos externos. El programa de prueba necesita usar la directiva #include para incluir los archivos fuente, o usar #ifdefs para eliminar estas funciones estáticas durante el proceso de prueba.
Necesita escribir un Makefile para vincular el programa de prueba a algunas de las bibliotecas dependientes o partes del código.
Necesita utilizar un marco de prueba, registrar casos de prueba con el marco y aprender a utilizar estos marcos.
Macro higiénico
La macro higiénica de Rust evita posibles problemas con las macros en lenguaje C. Por ejemplo, algunas cosas en la macro ocultarán identificadores en el código. Rust no requiere que todos los símbolos en las macros utilicen paréntesis, como max(5 3, 4).
No hay conversión automática
En lenguaje C, Qujing Beida Jade Bird/ descubrió que muchos errores son causados por la conversión inadvertida de int a short o char, pero en Rust esto no sucede porque requiere una transformación explícita.
No habrá desbordamiento de enteros
No es necesario explicar esto más.