diseñando aplicaciones a gran escala en un lenguaje de bajo nivel

7

He estado aprendiendo C por un tiempo, pero aún me confundo sobre el diseño de programas grandes dentro de C (una aplicación grande como el kernel de Linux).

Al pasar de Java donde tiene clases, es difícil entender cómo diseñar una aplicación grande en C.

¿Qué consejos / enlaces pueden recomendar las personas para pasar de un lenguaje de alto nivel a diseñar aplicaciones en un lenguaje de bajo nivel como C?

    
pregunta Dean 14.05.2012 - 23:53

2 respuestas

4

En general, cuanto más bajo sea el idioma, más riguroso debe ser el estilo. Muchas de las mismas reglas de estilo para cualquier idioma son importantes. Mantener las funciones cortas. Mantengan como métodos juntos. Generalizar código repetido. Además, el código de nivel inferior exige más comentarios, ya que el código es menos legible.

En la mayoría de los casos, los métodos que utilizarías para mantener las cosas organizadas son más detallados y más manuales. Básicamente, en C, se obtiene algo así como la encapsulación al mantener las funciones relacionadas en un solo archivo fuente y al usar globales estáticos para cualquier información que necesiten compartir. Puede usar esto para simular datos privados en una clase. O más correctamente, esto crea algo así como un "Módulo", que fue la respuesta del mundo de la programación estructurada al desarrollo de programas a gran escala antes de la OO.

De una manera similar, puedes usar el mismo método de manejo que usan las bibliotecas del sistema como fopen para crear algo como una clase. Internamente tiene una tabla que asigna identificadores a los "datos de instancia". O también puede pasar un puntero en bruto de un lado a otro.

En general, trata de ser tan "funcional" como puedas. Evite los efectos secundarios y los efectos secundarios y haga toda la comunicación que pueda con el paso de parámetros.

Un gran problema es que no tiene ayuda con la administración de la memoria, por lo que debe ser muy riguroso al momento de asignar y liberar memoria. Los datos asignados que van juntos deben estar unidos de alguna manera para que todos puedan liberarse en una sola función destroy . Trate de tener una estructura general para cuando las cosas se asignan y liberan. Además, asigna en la pila siempre que puedas. Una gran ayuda es la nueva matriz dinámica en C99.

El otro gran problema es la falta completa de clases de colección. La mejor manera de resolver esto es buscar soluciones de terceros. No querrás perder todo tu tiempo depurando implementaciones de tablas hash personalizadas.

Puede hacer todo lo posible para implementar OO completamente haciendo a mano lo que los compiladores de C ++ hacen por usted. Haga clases creando estructuras con punteros de función para métodos virtuales. Puede usar el mismo truco que C ++ hace para derivar clases haciendo que la clase "child" tenga punteros de función a los métodos de clase base en el mismo orden en la memoria. Esta es una mala idea para un programa real, pero puede ser un ejercicio de aprendizaje interesante.

    
respondido por el Steven Burnap 15.05.2012 - 05:37
2

Usted termina implementando objetos más directamente, sin el azúcar sintáctico. Esencialmente, estructuras con punteros de función.

Usted menciona el kernel de Linux; Podría considerar leer su fuente buscando ese patrón.

    
respondido por el retracile 15.05.2012 - 00:12

Lea otras preguntas en las etiquetas