Una de las mejores prácticas para aprender a escribir buen código es leer lo que han escrito otros. Y si son ejemplos de éxito, todavía mejor; aunque del mal código también se puede aprender por lo menos a reconocer los patrones a evitar.
Por eso, queremos proponeros una nueva sección donde revisar el código fuente de algunos de los proyectos más conocidos del software libre. Y para hacerlo más entretenido, lo vamos a organizar a modo de concurso, mostrándoos parte del código fuente para ver quién es capaz de reconocerlo.
Las pistas
Como reconocer un código por su aspecto puede ser un poco duro, vamos a daros unas pistas con las que debería resultaros mucho más fácil.
Este código, escrito principalmente en C y algo de ensamblador, supuso uno de los grandes hitos del software libre, a pesar de que en principio no tenía muchas pretensiones de ser algo profesional, sino un mero entretenimiento con afán de aprendizaje.
En su primera versión, a principios de la década de los 90, contaba con poco más de 10.000 líneas. A día de hoy, el proyecto sigue vivo y recientemente ha superado la "versión π", con más de 10 millones de líneas de código.
El código
Las siguientes líneas corresponden a aquella primera versión 0.01:
/*
* contains the low-level code for most hardware faults.
* page_exception is handled by the mm, so that isn't here. This
* file also handles (hopefully) fpu-exceptions due to TS-bit, as
* the fpu must be properly saved/resored. This hasn't been tested.
*/
.globl _divide_error,_debug,_nmi,_int3,_overflow,_bounds,_invalid_op
.globl _device_not_available,_double_fault,_coprocessor_segment_overrun
.globl _invalid_TSS,_segment_not_present,_stack_segment
.globl _general_protection,_coprocessor_error,_reserved
_divide_error:
pushl $_do_divide_error
no_error_code:
xchgl %eax,(%esp)
pushl %ebx
pushl %ecx
pushl %edx
pushl %edi
pushl %esi
pushl %ebp
push %ds
push %es
push %fs
pushl $0 # "error code"
lea 44(%esp),%edx
pushl %edx
movl $0x10,%edx
mov %dx,%ds
mov %dx,%es
mov %dx,%fs
call *%eax
addl $8,%esp
pop %fs
pop %es
pop %ds
popl %ebp
popl %esi
popl %edi
popl %edx
popl %ecx
popl %ebx
popl %eax
iret
_debug:
pushl $_do_int3 # _do_debug
jmp no_error_code
_nmi:
pushl $_do_nmi
jmp no_error_code
_int3:
pushl $_do_int3
jmp no_error_code
_overflow:
pushl $_do_overflow
jmp no_error_code
_bounds:
pushl $_do_bounds
jmp no_error_code
_invalid_op:
pushl $_do_invalid_op
jmp no_error_code
math_emulate:
popl %eax
pushl $_do_device_not_available
jmp no_error_code
_device_not_available:
pushl %eax
movl %cr0,%eax
bt $2,%eax # EM (math emulation bit)
jc math_emulate
clts # clear TS so that we can use math
movl _current,%eax
cmpl _last_task_used_math,%eax
je 1f # shouldn't happen really ...
pushl %ecx
pushl %edx
push %ds
movl $0x10,%eax
mov %ax,%ds
call _math_state_restore
pop %ds
popl %edx
popl %ecx
1: popl %eax
iret
_coprocessor_segment_overrun:
pushl $_do_coprocessor_segment_overrun
jmp no_error_code
_reserved:
pushl $_do_reserved
jmp no_error_code
_coprocessor_error:
pushl $_do_coprocessor_error
jmp no_error_code
_double_fault:
pushl $_do_double_fault
error_code:
xchgl %eax,4(%esp) # error code <-> %eax
xchgl %ebx,(%esp) # &function <-> %ebx
pushl %ecx
pushl %edx
pushl %edi
pushl %esi
pushl %ebp
push %ds
push %es
push %fs
pushl %eax # error code
lea 44(%esp),%eax # offset
pushl %eax
movl $0x10,%eax
mov %ax,%ds
mov %ax,%es
mov %ax,%fs
call *%ebx
addl $8,%esp
pop %fs
pop %es
pop %ds
popl %ebp
popl %esi
popl %edi
popl %edx
popl %ecx
popl %ebx
popl %eax
iret
_invalid_TSS:
pushl $_do_invalid_TSS
jmp error_code
_segment_not_present:
pushl $_do_segment_not_present
jmp error_code
_stack_segment:
pushl $_do_stack_segment
jmp error_code
_general_protection:
pushl $_do_general_protection
jmp error_code
El reto
¿Lo habéis reconocido? Si es así, ¿seríais capaces de decirnos...
...a qué fichero corresponde este fragmento de código?
...qué comentario acompañó al commit o subida de este código?
...quién es su autor?
Esperamos vuestras respuestas en los comentarios.
<!--
-->
Ver todos los comentarios en https://www.genbeta.com
VER Comentarios