Commit f8d4683c authored by Guillaume Huard's avatar Guillaume Huard
Browse files

Doc basic system ok

parent abff0bf2
#+OPTIONS: num:nil
#+OPTIONS: toc:nil
#+OPTIONS: html-postamble:nil
# #+OPTIONS: num:nil
# #+OPTIONS: toc:nil
#+OPTIONS: html-preamble:t
#+OPTIONS: html-postamble:nil title:nil
#+LANGUAGE: fr
#+EXPORT_EXCLUDE_TAGS: noexport
#+TITLE: Activité VPL de programmation système
#+AUTHOR: Guillaume Huard
#+DATE: 27 mars 2020
#+BEGIN_SRC emacs-lisp :results output :session :exports results
(setq org-html-preamble-format
'(("fr"
"<h1 class=\"title\">%t</h1>
<p class=\"subtitle\">%a, %d</p>")))
#+END_SRC
Cette activité VPL, utilisable comme base, permet de lever certaines limitation du VPL original. En
particulier elle permet :
......@@ -62,10 +71,11 @@ comporte au minimum trois niveaux qui correspondent à trois niveaux de granular
de l'activité. A chaque niveau, les tables de hachage contiennent des couples (=nom=, =valeur=) tels
que :
- au niveau global, dans la table de hachage référencée par le résultat de l'évaluation du fichier :
- =valeur= est une référence à une table de hachage : dans ce cas, le =nom= est le nom d'un
programme exécutable, que nous appellerons cas de test, et =valeur= décrit comment tester ce cas
de test ;
- =valeur= n'est pas une référence à une table de hachage : dans ce cas, =valeur= est la valeur
- =valeur= est une référence à une table de hachage contenant une clé nommée =tests= : dans ce cas,
le =nom= est le nom d'un programme exécutable, que nous appellerons cas de test, et =valeur=
décrit comment tester ce cas de test ;
- =valeur= n'est pas une référence à une table de hachage ou celle-ci ne contient pas de clé
nommée =tests= : dans ce cas, =valeur= est la valeur
d'un réglage global appelé =nom= (voir plus loin pour les réglages).
- au second niveau, dans chaque table de hachage correspondant à un cas de test :
- =nom= est égal à =tests= : dans ce cas, =valeur= doit être une référence à une table de hachage
......@@ -93,7 +103,7 @@ Dans notre exemple précédent, nous pouvons ajouter un commentaire pour chacun
Un réglage donné dans l'un des trois niveaux décrit ci-dessus s'applique toujours comme valeur par
défaut dans les niveaux plus internes. Ainsi, si tous les tests utilisent la même valeur pour l'un
de leur réglage, cette valeur peut être placée au niveau global. Bien entendu, dans l'un des niveaux
de leur réglages, cette valeur peut être placée au niveau global. Bien entendu, dans l'un des niveaux
plus internes, il est toujours possible de redéfinir la valeur d'un réglage si la valeur par défaut
ne convient pas. A titre d'exemple, notre toute première activité aurait aussi pu s'écrire :
#+BEGIN_SRC perl :exports code
......@@ -179,7 +189,7 @@ différentes sortie ou son code de retour. Cela correspond aux réglages :
** Solution
Un test peut être validé en fournissant une solution au problème posé. La solution sera alors
exécutée dans les même conditions que le programme soumis par l'étudiant (mêmes entrées, mêmes
exécutée dans les mêmes conditions que le programme soumis par l'étudiant (mêmes entrées, mêmes
arguments) et son résultat sera utilisé comme valeurs attendues. Par défaut, seule la sortie
standard produite par une solution est prise en compte. Les réglages correspondant à une solution
sont :
......@@ -255,7 +265,7 @@ testée de la manière suivante :
** Autre réglages
Les autres réglages associés à un test sont :
- =weight= : poids associé au test dans le cas de test (1 par défaut) ;
- =weight= : poids associé au test dans l'évaluation du cas de test (1 par défaut) ;
- =show= : si ce réglage a une valeur vraie (au sens Perl, non nulle), alors les entrée / sorties du
programme soumis, attendues et du validateur sont montrées à l'étudiant lorsque le test n'est pas
satisfait ;
......@@ -280,6 +290,7 @@ Voici un exemple synthétique qui reprend les exemples précédents et y ajoute
test_1 => { output => "Hello world !", show => 1 }
}
};
my $input = q{texte fourni en entrée
à notre programme que nous desirons
tester
......@@ -298,6 +309,7 @@ cut -d' ' -f$1-$2
}
}
};
my $validator = q{#!/bin/bash
[ -f $1 -a -x $1 ]
};
......@@ -319,7 +331,7 @@ l'étudiant. Vous pouvez remarquer que nous pouvons tirer parti de la syntaxe
Perl pour écrire le fichier, en particulier, la table de hachage globale peut être remplie cas de
test par cas de test afin de rendre le fichier plus lisible.
* Execution et compilation
* Programmes manipulés par l'activité
Tous les programmes manipulés, cas de test, solutions données ou validateurs, peuvent avoir des
contraintes d'exécution (langage imposé, interprétation dans une machine virtuelle) ou peuvent avoir
......@@ -335,9 +347,13 @@ Un programme peut être associé à un ensemble de fichiers source. Ces fichiers
par l'étudiant, écrits par l'enseignant ou donnés comme contenu brut dans la configuration de
l'activité et sont gérés par les réglages suivants :
- =files= : référence à un tableau contenant les noms des fichiers impliqués ;
- =content= : valeur scalaire correspondant au contenu de l'un des fichiers. Sera sauvé par défaut dans le
fichier dont le nom est, selon le cas, le nom du cas de test, =.solution= ou =.validator= ;
- =filename= : nom du fichier dans lequel =content= doit être stocké. Est ajouté implicitement à =files=.
- =content= : valeur scalaire correspondant au contenu d'un fichier source. Sera sauvé par défaut dans le
fichier dont le nom est, selon le cas, le nom du cas de test ou un nom interne utilisé par cette
activité (=.execute=, =.compile=, =.setup=, =.solution= ou =.validator=). Est ajouté implicitement
à =files= ;
- =filename= : nom du fichier dans lequel =content= doit être stocké plutôt que dans le nom par
défaut. Pour un programme non compilé, typiquement un script, il est généralement inutile de le
préciser.
** Exécution et compilation
......@@ -353,6 +369,98 @@ quelques lignes de shell, il peuvent néanmoins être spécifiés plus en détai
compilés ou exécutés de manière particulière. Cela peut continuer ainsi sans limite particulière
d'imbrication, la prise en compte de ces réglage étant elle-même récursive.
A titre d'exemple, voici une version de l'exemple précédent qui impose une soumission de "Hello
world !" en bash avec une solution en C, qui impose une soumission de l'exercice "cut" en java avec
une solution en shell et où le dernier exercice n'apparaît pas :
#+BEGIN_SRC perl :exports code
my $cases = {};
my $solution = q{#include <stdio.h>
int main() {
printf("Hello world !\n");
return 0;
}
};
$cases->{"hello_world.sh"} = {
execute => 'bash -- $NAME $@',
solution => {
content => $solution,
filename => "solution.c",
compile => 'clang -o $NAME $FILES'
},
tests => {
test_1 => { show => 1 }
}
};
my $input = q{texte fourni en entrée
à notre programme que nous desirons
tester
};
my $solution=q{#!/bin/bash
cut -d' ' -f$1-$2
};
$cases->{"ExerciceCut"} = {
files => [ "ExerciceCut.java" ],
compile => 'javac $FILES',
execute => 'java $NAME',
tests => {
test_1 => {
input => $input,
args => [ 2, 3 ],
solution => $solution,
match => [ 'output', 'code' ],
cleanup_level => 0
}
}
};
$cases;
#+END_SRC
Nous pouvons remarquer plusieurs choses :
- les variables =NAME= et =FILES= ont besoin d'être protégées avec des simples quotes : en effet ce
n'est pas le Perl qui interprète ce fichier de configuration qui connaît ces variables mais le
shell chargé de la compilation ou de l'exécution ;
- nous préférons utiliser les variables =NAME= et =FILES= car sur une activité ne faisant intervenir
qu'un seul langage, nous pouvons mettre les réglages de compilation et d'exécution au niveau
global. Toutefois, il est aussi possible de préciser en dur les bons noms de fichier.
** Autres réglages applicables à un cas de test
A l'heure actuelle il n'y a qu'un seul autre réglage applicable à un cas de test :
- =case_weight= : poids associé au test dans l'évaluation globale (1 par défaut). Remarque :
l'évaluation globale est sur 100.
* Mise en place de mon activité
Une activité fondée sur l'activité de programmation système présentée dans ce
document peut être mise en place de manière très personalisée, il faut juste penser à bien ajuster
tous ses réglages.
** Le fichier =vpl_custom_setup.sh=
Ce fichier est optionnel. S'il est présent, il doit être écrit en =bash= et il est exécuté avant le
code étudiant quelque soit le mode d'exécution (=run=, =debug= ou =evaluate=). Il peut mettre en
place des fichiers destinés à être vus par les étudiants ou définir la manière dont les programmes
étudiants sont lancés dans les modes =run= ou =debug=. Lors de son exécution, la variable
d'environnement =MODE= contient la valeur =run=, =debug= ou =evaluate= selon le mode en cours.
Dans ce fichier il est possible de de définir les variables suivantes :
- =RUN= : commande à utiliser en mode =run= (=bash= par défaut) ;
- =DEBUG= : commande à utiliser en mode =debug= (=bash= par défaut avec un =set -x= dans =.bashrc=)
;
- =ARGUMENTS= : arguments supplémentaires passés aux commandes définies dans =RUN= ou =DEBUG=.
** Les réglages à appliquer
Essentiellement, il faut bien penser à :
- fonder son activité sur ='Basic system programming activity'= dans les options d'exécution ;
- cocher =vpl_evaluate.cases= et, le cas échéant, =vpl_custom_setup.sh= dans la section des fichier
à conserver lors de l'exécution des réglages avancés (en plus de tous les autres fichiers, requis
par votre activité, que vous auriez pu écrire).
N'ayez pas d'inquiétude concernant la sécurité, les fichiers conservés sont supprimés par l'activité
elle-même après avoir été pris en compte et avant l'exécution de tout code étudiant.
#+BEGIN_SRC txt :mkdirp yes :tangle Basic_System/vpl_id.txt :exports none
22733
#+END_SRC
......
#+OPTIONS: num:nil
#+OPTIONS: toc:nil
# #+OPTIONS: num:nil
# #+OPTIONS: toc:nil
#+OPTIONS: html-postamble:nil
#+LANGUAGE: fr
#+EXPORT_EXCLUDE_TAGS: noexport
Documentation à venir...
#+TITLE: Activité VPL de programmation C
#+AUTHOR: Guillaume Huard
#+BEGIN_SRC txt :mkdirp yes :tangle C_Programming/vpl_id.txt :exports none
22734
#+END_SRC
Bonjour à tous pour cette démo de screencast
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment