Ajout de deux cours de CMP1 supplémentaire (les deux derniers ?)
This commit is contained in:
parent
57289c0786
commit
c726a9ee82
123
cmp/20120202.tex
Normal file
123
cmp/20120202.tex
Normal file
@ -0,0 +1,123 @@
|
||||
\chapter{C++ 2011}
|
||||
|
||||
Nouveau standard depuis 2011, la dernière révision était la première de 1998.
|
||||
|
||||
Nécessite GCC-4.6 ou clang 3.0.
|
||||
|
||||
Le premier vrai compilateur C++ est G++, avant il n'y en avait pas vraiment.
|
||||
Clang, démarré il y a une 10aine d'année, autour de LLVM. Clang est plus
|
||||
moderne, écrit en C++, de manière modulaire. Il donne généralement des
|
||||
meilleurs erreurs que G++. Il n'implémente cependant pas encore toutes les
|
||||
fonctionnalités du standard.
|
||||
|
||||
\section{nullptr}
|
||||
|
||||
Il s'agit d'une constante.
|
||||
|
||||
\begin{verbatim}
|
||||
void f(int);
|
||||
void f(void*);
|
||||
\end{verbatim}
|
||||
|
||||
On a une ambiguité lorsque l'on appelait \verb+f(0)+.
|
||||
|
||||
|
||||
\section{range-based for}
|
||||
|
||||
\begin{verbatim}
|
||||
for (const int& v : l)
|
||||
std::cout << v << std::endl;
|
||||
\end{verbatim}
|
||||
|
||||
Avant il y avait bien la macro \verb+BOOST_FOREACH+, mais elle produisait
|
||||
évidemment des messages d'erreurs très peu compréhensible !
|
||||
|
||||
|
||||
\section{Les chevrons fermants dans les templates}
|
||||
|
||||
\begin{verbatim}
|
||||
std::vector<std::vector<int> > matrix
|
||||
^
|
||||
\end{verbatim}
|
||||
|
||||
Dans le nouveau standard, il est donc maintenant possible de coller les deux
|
||||
\verb+>>+. Il s'agissait d'un problème de priorité des opérateurs.
|
||||
|
||||
\section{Code compilé dans notre dos~!}
|
||||
|
||||
Le code suivant~:
|
||||
\begin{verbatim}
|
||||
struct A
|
||||
{
|
||||
};
|
||||
\end{verbatim}
|
||||
|
||||
Génére le code suivant pour le compilateur~:
|
||||
|
||||
\begin{lstlisting}
|
||||
struct A
|
||||
{
|
||||
A ();
|
||||
A (const A&);
|
||||
~A ();
|
||||
A& operator= (const A&);
|
||||
};
|
||||
\end{lstlisting}
|
||||
|
||||
C'est pour que les classes en C++ ressemblent par défaut au C.
|
||||
|
||||
Par moment, il est parfois nécessaire de désactiver (par exemple on ne veut pas
|
||||
autoriser la copie d'un singleton).
|
||||
|
||||
Pour supprimer explicitement une méthode, on fait de cette manière~:
|
||||
\begin{lstlisting}
|
||||
struct A
|
||||
{
|
||||
A (const A&) = delete;
|
||||
A& operator= (const A&) = delete;
|
||||
};
|
||||
\end{lstlisting}
|
||||
|
||||
Également, lorsque l'on crée un constructeur avec un argument, le constructeur
|
||||
sans argument est automatiquement désactivé. Pour le réactiver, on fait~:
|
||||
|
||||
\begin{lstlisting}
|
||||
struct A
|
||||
{
|
||||
A (int i);
|
||||
A () = default;
|
||||
};
|
||||
\end{lstlisting}
|
||||
|
||||
|
||||
\paragraph{Design Pattern~:} une recette générale pour résoudre des problèmes
|
||||
généraux.
|
||||
|
||||
\section{Genre d'inférence de type}
|
||||
|
||||
Si l'on veut instancier la classe \verb+VeryLongType+ de façon dynamique :
|
||||
|
||||
\begin{lstlisting}
|
||||
VeryLongType* v = new VeryLongType(...);
|
||||
^^^^^^^^^^^^^
|
||||
auto v = new VeryLongType(...);
|
||||
\end{lstlisting}
|
||||
|
||||
Ces deux constructions fonctionnent en C++2011. En utilisant \verb+auto+, le
|
||||
compilateur va déduire le type.
|
||||
|
||||
|
||||
\paragraph{Changement de auto} avant, \verb+auto+ permettaient de
|
||||
préciser où placer une variable (avec \verb+register+)~: dans un registre ou
|
||||
dans la mémoire. Mais ce n'est plus utile maintenant avec le grand nombre de
|
||||
registre des processeurs~; et surtout on a de nombreux algos qui sont très
|
||||
performants pour déterminer le meilleurs endroit.
|
||||
|
||||
|
||||
\chapter{AST}
|
||||
|
||||
\paragraph{Tips pour TC2~:} utiliser la commande \verb+patch+ pour appliquer
|
||||
les patchs. Mais cette année, on pourrait faire un merge avec un dépôt public.
|
||||
|
||||
La construction d'objets se déroule de la classe la plus supérieure à la classe
|
||||
de base (dans le cas d'héritage). La destruction se fait dans l'autre sens.
|
109
cmp/20120203.tex
Normal file
109
cmp/20120203.tex
Normal file
@ -0,0 +1,109 @@
|
||||
\chapter{Name, scope and bindings}
|
||||
|
||||
\url{http://lrde.epita.fr/~akim/ccmp/lecture-notes/slides/ccmp/names.pdf}
|
||||
|
||||
\section{Bindings}
|
||||
|
||||
\subsection{Vocabulaire}
|
||||
|
||||
\paragraph{Nom/Name/Symbol~:} chaine de caractère, lisible par l'être humain
|
||||
servant à placer des étiquettes sur quelque chose.
|
||||
|
||||
\paragraph{Référence~:} mécanisme permettant d'accéder à une case mémoire.\\
|
||||
|
||||
Donnée, quantitée, que l'on peut référencé par une référence ou une
|
||||
adresse. Cela peut être une variable, pas vraiment un type, pas de fonction,
|
||||
mais son code oui, pas de namespace.
|
||||
|
||||
|
||||
\paragraph{Identifiant~:} généralement des caractères alphanumériques ou
|
||||
l'underscore. Généralement, la première lettre est une minuscule et n'est pas
|
||||
un chiffre qui serait un sel syntaxique. Il n'y a pas d'espaces, sauf en Algol
|
||||
60 ou en FORTRAN.
|
||||
|
||||
Dans certain langage, il y a des limitations sur la taille des identifiants~:
|
||||
le FORTRAN original était limité à des identifiants de 6 caractères.
|
||||
|
||||
Certains langages sont insensible à la case comme l'Ada.
|
||||
|
||||
\subsection{}
|
||||
|
||||
\paragraph{Durée de vie~:} Temps entre le moment où l'objet est créée et est
|
||||
détruit. Lié à l'exécution.
|
||||
|
||||
Dans certain langage comme Pascal, cette notion est lié à la portée, mais
|
||||
généralement, c'est différent.
|
||||
|
||||
\paragraph{Portée~:} lié au code source, pas vraiment à l'éxécution. L'endroit
|
||||
où on peut dire qu'à un endroit particulier, tel nom est associé à telle
|
||||
variable.
|
||||
|
||||
\subparagraph{Portée statique~:} quand cela peut être calulé à la
|
||||
compilation. Dans la plupart des languages (\verb+my+ en Perl, C, Tiger,
|
||||
Scheme, \ldots)
|
||||
|
||||
Cela permet d'effectuer un typage statique et autorise le typage fort.
|
||||
|
||||
C'est donc plus rapide, sûr et propre.
|
||||
|
||||
|
||||
\subparagraph{Portée dynamique~:} lorsque cela dépend d'appels
|
||||
de fonctions et autres.
|
||||
|
||||
Dans la plupart des langage de script (Perl \verb+local+, shell, \TeX (voir la
|
||||
slide 14 pour un exemple de code \TeX~!))
|
||||
|
||||
Concrètement, on a un dictonnaire de variable référençant toutes les variables
|
||||
déjà rencontrée.
|
||||
|
||||
\subparagraph{Utilité~:} modularité pour découper le code en morceaux.
|
||||
Il n'y en a pas en assembleur.
|
||||
|
||||
Dans les systèmes de fichiers, cela correspond aux répertoires.
|
||||
|
||||
Lorsque l'on a pas de portée, les noms ont une influence globale, c'est assez
|
||||
difficile à gérer, puisqu'il faurait alors des identifiants ayant des noms
|
||||
uniques.\\
|
||||
|
||||
En interdisant la récurence, on peut se passer de pile d'appel.
|
||||
|
||||
\paragraph{Espaces de nom (!= namespaces)~:} par exemple, dans Tiger, on a 3
|
||||
espaces de nom~: types, fonctions et variables.
|
||||
|
||||
En C, il y a deux espaces de noms~: un pour les types et un pour les fonctions
|
||||
et les variables, car on peut avoir une variable qui est une fonction (pointeur
|
||||
sur fonction).
|
||||
|
||||
|
||||
\paragraph{Moments de liaison (Binding Time)~:} définit à quel moment une
|
||||
certaine étape est réalisée.
|
||||
|
||||
Plus on fait la liaison tôt, moins le code est flexible, mais plus c'est
|
||||
efficasse, mais à l'inverse plus on le fait tard, plus c'est réalisé tard, plus
|
||||
c'est flexible, mais c'est moins efficasse.
|
||||
|
||||
Un bon compromis serait sans doute Java ou C\# grâce à l'utilisation de machine
|
||||
virtuelle qui permet l'introspection ou la compilation à la volée.
|
||||
|
||||
Dans Tiger, on fait un certain nombre de liaison~:
|
||||
\begin{itemize}
|
||||
\item Andrew Apple a définit les mots-clefs.
|
||||
\item Lorsque l'on programme, on définit les indentifiants
|
||||
\item À la compilation, on définit les types, le code des fonctions, \ldots
|
||||
\item À l'exécution, on lie les adresses des tableaux (appel à malloc), et
|
||||
aux records.
|
||||
\end{itemize}
|
||||
Tout ce qui est avant l'exécution est donc la partie statique, après, c'est la
|
||||
partie dynamique.
|
||||
|
||||
|
||||
\section{Table de symboles}
|
||||
|
||||
Cas simple sans portée~: avec tableau associatif~; implémentation très simple~:
|
||||
\verb+put+ et \verb+get+.\\
|
||||
|
||||
Lorsque l'on ajoute la portée, on a besoin de fonctions ou méthodes
|
||||
\verb+scope_begin ()+ et \verb+scope_end ()+. On pourrait utiliser
|
||||
\verb+std::stack+, mais si l'on peut référencer un élément d'un autre scope, on
|
||||
va avoir des problèmes car c'est compliqué de revenir dans les états
|
||||
d'avant. Le contener \verb+std::slist+ est du coup plus adapté.
|
Reference in New Issue
Block a user