¿Cuáles son las ventajas y desventajas de la tecnología de programación en lenguaje C?
Algunas buenas experiencias en lenguaje C
Lea el código fuente de POV-Ray una vez para comprender cómo implementar la programación orientada a objetos en lenguaje C.
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, sabemos cómo implementar el analizador Scheme en lenguaje C.
Escriba la versión inicial de GNOMEEye en lenguaje C y optimice la representación de microarchivos.
Algunas malas experiencias con C
Cuando estaba en el equipo de evolución, muchas cosas seguían estropeándose. Valgrind no existía en ese momento. Para obtener Purify, debe comprar una máquina Solaris.
Depurar el problema de bloqueo de subprocesos de gnome-vfs.
Depurando el escritorio, pero no encontré nada.
Acepté la versión inicial de Nautilus-share, pero descubrí que free() no se utilizaba en el código.
Quiero refactorizar mi código pero no sé cómo administrar mi memoria.
Quiero empaquetar el código, pero descubrí que hay variables globales en todas partes y no hay funciones estáticas.
Pero en fin, hablemos de algo que está en Rust pero no en C.
Gestión automática de recursos
Rust se basa en algunas ideas de C++, como RAII (inicialización de adquisición de recursos) y punteros inteligentes, agregando el principio de propiedad única de valores y proporcionando información automática. Mecanismo de gestión de recursos.
Automatización: no es necesario llamar a free() manualmente. La memoria se libera automáticamente después de su uso, los archivos se cierran automáticamente después de su uso y los mutex se liberan automáticamente fuera del alcance. Si desea encapsular recursos externos, básicamente solo necesita implementar el rasgo Drop. Un recurso empaquetado es como parte del lenguaje de programación porque no es necesario gestionar su ciclo de vida.
Decisión: Crear recursos (asignación de memoria, inicialización, abrir archivos, etc.) y luego destruirlos fuera del alcance. No existe la recolección de basura: todo termina cuando se ejecuta el código. 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 encuentro que el código que escribí antes se olvidó de llamarlo, o incluso lo llamé por error, entonces no No quiero volver a llamarlo. Utilice estos métodos.
Bienes de consumo sin marca
Vec es en realidad 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.
Lograr una funcionalidad similar requiere mucho código C, así que no quiero hacerlo más.
Trait es más que una simple interfaz.
Rust no es ese tipo de lenguaje de programación orientado a objetos. Tiene una característica que parece una interfaz (en una computadora) que puede usarse para implementar enlaces dinámicos. Si un objeto implementa Drawable, entonces es seguro que el objeto tiene un método draw().
Pero en cualquier caso, el poder de los rasgos no termina ahí.
Gestión de dependencias
Anteriormente, era necesario implementar la gestión de dependencias:
Llame a g-config manualmente o mediante una macro de herramienta automatizada.
Especifique las rutas del archivo de encabezado y de la biblioteca.
Básicamente, es necesario asegurarse de que esté instalada la versión correcta de la biblioteca.
En Rust, solo necesitas escribir un archivo Cargo.toml y luego indicar la versión de la biblioteca dependiente en el archivo. Estas bibliotecas dependientes se descargarán u obtendrán automáticamente desde la ubicación especificada.
Experimentación
Las pruebas unitarias en C son muy difíciles por las siguientes razones:
Las funciones internas suelen ser estáticas. En otras palabras, no se pueden llamar desde archivos externos. El programa de prueba debe incluir los archivos fuente con la directiva #include o usar #ifdefs para eliminar estas funciones estáticas durante la prueba.
Necesita escribir un Makefile para vincular el programa de prueba a algunas bibliotecas relacionadas o algún código.
Necesita utilizar un marco de pruebas, registrar casos de prueba en él y aprender a utilizarlos.
Macro de salud (Macro de salud)
La macro de salud de Rust evita los problemas que pueden surgir con las macros en lenguaje C, como que algo en la macro cubra los identificadores en el código. Rust no requiere paréntesis para todos los símbolos en macros, como max(5+3, 4).
Sin conversión automática
En lenguaje C, Beijing Beida Jade Bird descubrió que muchos errores se deben a la conversión inadvertida de int a short o char, lo que no sucede en Rust, porque requiere conversión de pantalla.
No habrá desbordamiento de enteros
No es necesario explicar esto.