Captura de Datos

En resumen, el enfoque empleado para la captura de los datos presentados en este artículo es el siguiente:

  1. Código Fuente de una Distribución Debian

    Por fortuna, el código fuente de las distribuciones Debian presentes y pasadas está archivado, disponible en Internet para cualquiera. El único problema es determinar la lista de paquetes de código fuente para una determinada distribución, y dónde acceder a ellos.

  2. Descarga y captura datos

    Una vez que conocemos los ficheros que nos interesan, debemos descargarlos para obtener los datos. Pero no los descargamos todos al tiempo (lo que ocuparía mucho espacio en disco), si no que, secuencialmente, descargamos un paquete, lo desempaquetamos, analizamos y borramos antes de pasar al siguiente.

  3. Análisis final

    Análisis de los datos recogidos y obtención de estadísticas, atendiendo al número total de SLOC de la distribución, las SLOC para cada uno de los diversos lenguajes de programación considerados, etc.

En las siguientes secciones estos tres pasos están descritos con mayor detalle.

Código fuente de una distribución Debian

En el sistema de paquetes de Debian hay dos tipo de paquete: fuente y binario. De cada paquete fuente, de forma automática, se pueden construir uno o más paquetes binarios. Para este trabajo, sólo los paquetes fuente son relevantes, con lo que en lo sucesivo no volveremos a hacer referencia a los binarios.

Al construir un paquete fuente, un desarrollador de Debian comienza por el directorio con el código fuente "original" del programa en cuestión. En terminología Debian, este es el fuente "upstream" ("corriente-arriba"). El desarrollador Debian crea modificaciones en forma de parche de estos fuentes originales si es necesario, y crea un subdirectorio debian con todos los ficheros de configuración Debian (incluyendo los datos necesarios para construir los paquetes binarios). Se tiene entonces el paquete fuente, que generalmente (pero no siempre) consta de tres ficheros: Los fuentes originales (un fichero tar.gz), los parches para obtener el directorio Debian fuente (un fichero diff.gz con los parches y el directorio debian), y un fichero de descripción con extensión dsc. (aunque sólo las últimas distribuciones incluyen este fichero) Los paquetes Debian "nativos" (desarrollados por Debian, en los que no hay fuentes "upstream") no incluyen parches.

Los paquetes fuente de las distribuciones Debian actuales forman parte del archivo de Debian. En cada distribución están en el directorio source. En Internet hay servidores con los paquetes fuente de cada distribución Debian actual (generalmente "mirrors" de archive.debian.org). Desde Debian 2.0, en cada distribución hay un fichero Sources.gz en el directorio source, con información sobre los paquetes fuente de la distribución, incluyendo los ficheros que componen cada paquete. Esta es la información que usamos para determinar qué paquetes fuente, y qué ficheros deben ser tenidos en cuenta para Debian 2.2.

De todas formas, hay que tener en cuenta que no todos los paquetes en Sources.gz deben ser analizados al contar líneas de código. La razón principal para no hacerlo es la existencia, en ocasiones, de varias versiones del mismo programa. Por ejemplo, en Debian 2.2 tenemos paquetes fuente emacs19 (para emacs-19.34), y paquetes fuente emacs20 (para emacs-20.7). Contar ambos paquetes implicaría contar Emacs dos veces, que no es lo que se pretende. Por tanto para cada distribución es necesaria una inspección manual, detectando aquellos que son esencialmente distintas versiones de un mismo programa y eligiendo un "representante" para cada familia de versiones.

Estos casos pueden hacer infra-estimar el número de líneas de la distribución, ya que las diferentes versiones de un paquete puedan compartir una buena parte del código pero no todo. (Pensemos por ejemplo en PHP4 y PHP3, donde el primero está re-escrito casi por completo). De todas formas consideramos este defecto asumible, y compensado por otras sobre-estimaciones (como veremos después).

En otras ocasiones, hemos decidido analizar paquetes que pueden tener cantidades significativas de código en común. Este es el caso, por ejemplo de emacs y xemacs. Si bien el segundo es una ramificación del segundo y ambos comparten una buena parte del código, sin ser iguales son evoluciones del mismo "antepasado". Otros casos similares son gcc y gnat. El segundo, un compilador Ada, está construido sobre el primero (un compilador C), añadiendo muchos parches y mucho código nuevo. En ambos casos consideramos que el código es lo bastante distinto como para considerarlo paquetes diferentes. Esto probablemente lleva a sobre-estimar el número de líneas de código de la distribución.

El resultado de este paso es la lista de paquetes (y los ficheros que la componen) que consideramos para analizar el tamaño de una distribución Debian. Esta lista está hecha a mano para cada distribución (con ayuda de unos scripts muy simples).

Descarga y captura de datos

Una vez que se establecen los paquetes y ficheros de Debian 2.2 a analizar, se descargan de alguno de los servidores de la red de "mirrors" Debian. Para este paso usamos algunos sencillos scripts Perl. El proceso consta de las siguientes fases:

No todos los paquetes tienen versión original ("upstream"), por lo que en en este proceso hay que prestar atención a estas situaciones.

La captura de los datos se hace usando los scripts de sloccount, tres veces por paquete (una vez en cada fase, ver el párrafo anterior), que almacenan número de líneas de código de cada paquete en un directorio diferente, preparado para un análisis e informe posterior.

La razón de recoger datos tres veces por cada paquete es el analizar el impacto del desarrollo Debian en el paquete original. Este impacto puede ser en forma de parches al original (con frecuencia para hacerlo más estable y seguro, para hacerlo consistente con la política de instalación Debian o para añadir alguna funcionalidad) o de scripts de instalación (que pueden ser identificados al medir los fuentes sin el directorio debian ).

El resultado final de este paso es la recopilación de todos los datos obtenidos de los paquetes descargado, organizados por paquete, y listos para ser analizados. Estos datos consisten fundamentalmente en listas de ficheros, con el número de lineas de código que corresponden a cada uno, detallando subtotales por lenguaje de programación.

Análisis final

El último paso es la generación de informes, usando sloccount y algunos scripts, para estudiar los datos obtenidos. Ya que en este punto todos los datos obtenidos están disponibles localmente, y resulta sencillo procesarlos, el análisis puede ser hecho rápidamente y reiterado automáticamente de forma sencilla, buscando diferentes tipos de información.

El resultado final de este paso es un conjunto de informes y análisis estadísticos, usando los datos obtenidos en el paso anterior, y considerándolos desde diferentes puntos de vista. Estos resultados se presentan en la siguiente sección.