2010-06-16 25 views
13

Realmente lo siento si esto suena un poco tonto. Acabo de terminar de leer K & R y trabajé en algunos de los ejercicios. Este verano, para mi proyecto, estoy pensando en volver a implementar una utilidad de Linux para ampliar aún más mi comprensión de C, así que descargué la fuente de GNU tar y sed, ya que ambos parecen interesantes. Sin embargo, tengo problemas para entender dónde comienza, dónde está la implementación principal, de dónde vinieron todas las macros extrañas, etc.¿Cómo se puede entender el código fuente de GNU?

Tengo mucho tiempo, así que eso no es realmente un problema. ¿Se supone que debo familiarizarme con la cadena de herramientas GNU (es decir, make, binutils, ...) primero para comprender los programas? ¿O tal vez debería comenzar con algo un poco más pequeño (si es que existe tal cosa)?

Tengo un poco de experiencia con Java, C++ y python si eso es lo que importa.

Gracias!

Respuesta

4

GNU Hello es probablemente el programa GNU más pequeño y simple, y es fácil de entender.

+2

Debe haber una broma escondida en el hecho de que la última versión de GNU Hello (2.4.90) es una descarga de 566 KB, como un archivo tar.gz. Eso es solo ... aterrador. – unwind

+2

@unwind GNU Hello es más que un simple programa "Hello World": imprime "Hello World" en muchos idiomas, hace café y le presta dinero cuando lo necesita. – ereOn

+1

GNU Hello es un esqueleto que muestra el uso básico de las Autotools, cómo analizar las opciones de línea de comandos y cómo admitir la internacionalización. La mayor parte de la descarga es probablemente archivos de mensajes como [esto] (http://cvs.savannah.gnu.org/viewvc/hello/po/it.po?root=hello&view=markup) –

1

Sé que a veces es un desastre navegar por el código C, especialmente si no está familiarizado con él. Le sugiero que use un tool que lo ayudará a navegar por las funciones, símbolos, macros, etc. Luego busque la función main().

Necesita familiarizarse con las herramientas, por supuesto, pero no necesita convertirse en un experto.

+0

+1 Estoy muy me alegro de que el navegador de origen tenga una nueva versión. Lo usé en 2006 y parecía un proyecto inactivo. De todos modos, es una muy buena herramienta. – INS

7

El problema con programas como tar y sed es doble (esta es solo mi opinión, ¡por supuesto!). En primer lugar, ambos son realmente antiguo. Eso significa que han tenido varias personas que los mantienen a lo largo de los años, con diferentes estilos de codificación y diferentes personalidades. Para las utilidades de GNU, generalmente es bastante bueno, porque generalmente imponen un estilo de codificación razonablemente consistente, pero sigue siendo un problema. El otro problema es que son increíblemente portátil. Por lo general, la "portabilidad" se considera algo bueno, pero cuando se lleva al extremo, significa que su base de código termina llena de pequeños hackeos y trucos para solucionar errores desconocidos y casos extremos en piezas de hardware y sistemas en particular. Y para programas tan ampliamente portados como tar y sed, eso significa que hay un lote de casos de esquina y hardware oscuro/compiladores/sistemas operativos a tener en cuenta.

Si desea aprender C, entonces diría que el mejor lugar para comenzar no es tratar de estudiar el código que otros han escrito. Más bien, intente escribir el código usted mismo. Si realmente desea comenzar con una base de códigos existente, elija una que se mantenga activamente donde pueda ver los cambios que otras personas están haciendo , ya que los convierten en, siga las discusiones en las listas de correo, y así sucesivamente.

con programas bien establecidos como tar y sed, se ve el resultado de las discusiones que habría pasado, pero no se puede ver cómo las decisiones y cambios de diseño de software se están realizando en tiempo real. Eso solo puede suceder con un software mantenido activamente.

eso es sólo mi opinión por supuesto, y se puede tomar con un grano de sal si te gusta :)

+0

Estoy de acuerdo en que la mejor manera de aprender C es mediante programación. Sin embargo, una vez que dominas la sintaxis y los matices del idioma, siempre es útil recorrer un código bien escrito, que te dará una idea de las nuevas formas en que puede aplicar prácticamente las estructuras de sintaxis/datos del lenguaje. – itisravi

+0

@itisravi: Sigo creyendo que es mejor aprender eso viendo el desarrollo tal como sucede, en lugar de hacerlo después del hecho. Por ejemplo, si ve un trozo de código y se pregunta "¿por qué lo hicieron así, por qué no lo hicieron de esta (otra) manera?" Si puede publicar un mensaje en una lista de correo y * preguntar *, aprenderá mucho más que si simplemente acepta lo que se haya escrito. –

1

Aprende a usar grep si no lo saben ya y lo utilizan para buscar para la función principal y todo lo demás que le interese. También es posible que desee utilizar herramientas de exploración de código como ctags o cscope que también pueden integrarse con vim y emacs o utilizar un IDE si así lo desea.

12

Los programas de GNU son grandes y complicados. El tamaño de GNU Hello World muestra que incluso el proyecto GNU más simple necesita una gran cantidad de código y configuración a su alrededor.

Las autotools son difíciles de entender para un principiante, pero no es necesario para entender a leer el código. Incluso si modifica el código, la mayoría de las veces puede simplemente ejecutar make para compilar los cambios.

Para leer el código, se necesita un buen editor (VIM, Emacs) o IDE (Eclipse) y algunas herramientas para navegar a través de la fuente. El proyecto tar contiene un directorio src, que es un buen lugar para comenzar. Un programa siempre comienza con la función principal, así que haga

grep main *.c 

o use su IDE para buscar esta función. Está en tar.c. Ahora, saltar todas las cosas de la inicialización, hasta el

/* Main command execution. */ 

Allí, se ve un interruptor para subcomandos. Si pasa -x hace esto, si pasa -c lo hace, etc. Esta es la estructura de bifurcación de esos comandos. Si usted quiere saber lo que estos son de macro, ejecutar

grep EXTRACT_SUBCOMMAND *.h 

allí se puede ver que se enumeran en COMMON.H.

A continuación EXTRACT_SUBCOMMAND que ver algo gracioso:

read_and (extract_archive); 

La definición de read_and() (otra vez obtenida con grep):

read_and (void (*do_something) (void)) 

El único parámetro es un puntero función como una devolución de llamada , entonces read_and supuestamente leerá algo y luego llamará a la función extract_archive. Una vez más, grep en él y verá esto:

if (prepare_to_extract (current_stat_info.file_name, typeflag, &fun)) 
    { 
     if (fun && (*fun) (current_stat_info.file_name, typeflag) 
     && backup_option) 
    undo_last_backup(); 
    } 
    else 
    skip_member(); 

Tenga en cuenta que el trabajo real que sucede cuando se llama a fun. fun es de nuevo un puntero a la función, que se establece en prepare_to_extract. fun puede apuntar a extract_file, que hace la escritura real.

espero que caminaba mucho a través de esto y demostrado cómo navego por código fuente. No dude en ponerse en contacto conmigo si tiene preguntas relacionadas.

+0

+1 para un ejemplo detallado. Por cierto, este es también un ejemplo de cómo las cosas simples pueden hacerse compiladas. Por alguna razón, algunas personas piensan que es divertido: - / – PauliL

5

¿Por qué no descargar la fuente de los coreutils (http://ftp.gnu.org/gnu/coreutils/) y echar un vistazo a herramientas como yes? Menos de 100 líneas de código C y una pieza de software GNU completamente funcional, útil y realmente básica.

0

Sugiero usar ctags o cscope para navegar. Puede usarlos con vim/emacs. Son ampliamente utilizados en el mundo de código abierto.

Deben estar en el repositorio de cada distribución principal de Linux.

0

Dar sentido a un código que utiliza muchas macros, funciones de utilidad, etc., puede ser difícil. Para ver mejor el código de un C azar o software de C++, sugiero este enfoque, que es lo que generalmente utilizo:

  1. Instalar herramientas de desarrollo de Qt y Qt Creator

  2. descargar el código fuente que desea a inspeccionar y configurarlos para compilación (generalmente solo ./configure para cosas GNU).

  3. Ejecute qmake -project en la raíz del directorio de origen, para generar el archivo Qt .pro para Qt Creator.

  4. Abra el archivo .pro en Qt Creator (no use la creación oculta, cuando se lo solicite).

  5. Solo para estar seguro, en la vista Proyectos de Qt Creator, elimine los pasos de compilación predeterminados. El archivo .pro es solo para la navegación dentro de Qt Creator.

  6. Opcional: configure pasos personalizados de compilación y ejecución, si desea compilar y ejecutar/depurar en Qt Creator. No es necesario solo para navegación.

  7. Utilice Qt Creator para buscar el código. Tenga en cuenta especialmente el localizador (atajo kb Ctrl + K) para buscar cosas por nombre, y "seguir el símbolo debajo del cursor" (atajo kb F2), y "encontrar usos" (atajo kb Ctrl-Shift-U).

Cuestiones relacionadas