Up Next

1  Introduction

Le cours de programmation s’étend tout au long de la 1ère année à Cachan. Vous aurez à y faire plusieurs projets. Le tout premier d’entre eux a lieu au premier trimestre de l’année scolaire.

Il s’agit d’écrire un compilateur pour un sous-ensemble strict du langage C, que nous appellerons C--. Le langage cible sera l’assembleur x86. Votre compilateur sera écrit en OCaml.

Voici un exemple de programme que votre compilateur devrait compiler:

Ce programme, qui sera un de nos exemples le premier jour de cours code la commande Unix cat.

Au passage, j’ai évidemment fait le projet avant vous. Voici ce que mon compilateur produit:

.globl main main: pushl %ebp movl %esp, %ebp subl $8, %esp movl $1, %eax movl %eax, -8(%ebp) jmp .main_1 .main_2: subl $4, %esp movl $.main_3, %eax pushl %eax movl -8(%ebp), %eax pushl %eax movl 12(%ebp), %eax popl %ebx movl (%eax, %ebx, 4), %eax pushl %eax call fopen addl $8, %esp movl %eax, -12(%ebp) jmp .main_4 .main_5: movl stdout, %eax pushl %eax movl -4(%ebp), %eax pushl %eax call fputc addl $8, %esp .main_4: movl $1, %eax negl %eax pushl %eax movl -12(%ebp), %eax pushl %eax call fgetc addl $4, %esp movl %eax, -4(%ebp) popl %ebx cmpl %ebx, %eax je .main_8 movl $0, %eax jmp .main_9 .main_8: movl $1, %eax .main_9: cmpl $0, %eax je .main_6 movl $0, %eax jmp .main_7 .main_6: movl $1, %eax .main_7: cmpl $0, %eax jnz .main_5 movl -12(%ebp), %eax pushl %eax call fclose addl $4, %esp addl $4, %esp movl -8(%ebp), %eax addl $1, -8(%ebp) .main_1: movl 8(%ebp), %eax pushl %eax movl -8(%ebp), %eax popl %ebx cmpl %ebx, %eax jl .main_10 movl $0, %eax jmp .main_11 .main_10: movl $1, %eax .main_11: cmpl $0, %eax jnz .main_2 movl stdout, %eax pushl %eax call fflush addl $4, %esp movl $0, %eax pushl %eax call exit addl $4, %esp addl $8, %esp movl %ebp, %esp popl %ebp ret .main_3: .asciz "r" .align 4

Ceci peut vous sembler bien mystérieux. C’est normal! Ça le sera moins après le premier cours.


Up Next