#sundaycommit

This commit is contained in:
tTh 2023-04-02 23:32:29 +02:00
parent 28c260ea5e
commit 52b7bbe6ef
8 changed files with 176 additions and 68 deletions

View File

@ -2,7 +2,11 @@
\chapter{Basic} \chapter{Basic}
\index{dosbox}\label{chap:Basic} \index{dosbox}\label{chap:Basic}
% ------------------------------------------- % ====================================================================
% https://www.theregister.com/2023/03/28/nostalgic_for_basic/
% ====================================================================
\section{BASIC} \index{BASIC} \section{BASIC} \index{BASIC}
C'est probablement un des premiers langages interactifs utilisable par le C'est probablement un des premiers langages interactifs utilisable par le
@ -21,9 +25,16 @@ ensuite j'aurais une idée sur lesquels seront les plus funs
Dartmouth Time Sharing System Dartmouth Time Sharing System
% ------------------------------------------- % ====================================================================
\section{Bywater} \index{bywater} \section{Bywater} \index{bywater}
\begin{quote}
The Bywater BASIC Interpreter (bwBASIC) implements a large superset of the
ANSI\index{ANSI} Standard for Minimal BASIC (X3.60-1978)
and a significant subset of the ANSI Standard for
Full BASIC (X3.113-1987) in C.
\end{quote}
\begin{verbatim} \begin{verbatim}
Bywater BASIC Interpreter/Shell, version 2.10 Bywater BASIC Interpreter/Shell, version 2.10
--------------------------------------------- ---------------------------------------------
@ -44,7 +55,7 @@ mais canonique~:
Première conclusion : affaire à suivre. Première conclusion : affaire à suivre.
% ------------------------------------------- % ====================================================================
\section{Yabasic} \index{yabasic} \section{Yabasic} \index{yabasic}
Première innovation, les numéros de ligne ne sont plus obligatoires. Première innovation, les numéros de ligne ne sont plus obligatoires.
@ -55,7 +66,50 @@ Et on peut faire des images qui clignotent :)
\lstinputlisting{code/Basic/yabasic-2.bas} \lstinputlisting{code/Basic/yabasic-2.bas}
% ------------------------------------------- C'est vraiment dommage que l'on ne puisse mettre de gif89a\index{gif89a}
dans un livre imprimé\dots
% ====================================================================
\section{sdlBasic} \index{sdlBasic}
http://www.sdlbasic.altervista.org/main/
% ====================================================================
\section{FreeBASIC} \index{FreeBASIC}
https://www.freebasic.net/
\begin{quote}
When used in its "QB" language mode, FreeBASIC provides a high level
of support for programs written for QuickBASIC\index{QuickBASIC}.
Many programs written for QuickBASIC will compile and run in this mode
with no changes needed.
\end{quote}
% ====================================================================
\section{BASIC-256} \index{BASIC-256}
https://basic256.org/
\begin{quote}
BASIC-256 is an easy to use version of BASIC designed to teach anybody
(especially middle and high-school students) the basics of computer
programming.
It uses traditional control structures like gosub, for/next, and goto,
which helps kids easily see how program flow-control works.
It has a built-in graphics mode which lets them draw pictures
on screen in minutes, and a set of detailed, easy-to-follow tutorials
that introduce programming concepts through fun exercises.
\end{quote}
% ====================================================================
% ====================================================================
\section{Et ailleurs ?} \section{Et ailleurs ?}
L'interpréteur \texttt{Qbasic} de Microsoft fonctionne très bien L'interpréteur \texttt{Qbasic} de Microsoft fonctionne très bien
@ -63,4 +117,4 @@ dans Dosbox~: à lire en page \pageref{Qbasic}. Son prédécesseur,
\texttt{GWBASIC} marche très bien aussi. \texttt{GWBASIC} marche très bien aussi.
% ------------------------------------------- % -------------------------------------------
% ------------------------------------------- % ====================================================================

View File

@ -11,31 +11,36 @@ les erreurs classiques. La futilité des exemples est assumée.
Les détails nécessaires seront présentés dans la suite. Les détails nécessaires seront présentés dans la suite.
% --------------------------------------------------------- % =========================================================
\section{Hello World} \section{Hello World}
Hop, on y va... Hop, on y va...
Le tout début d'un programme en C est l'appel par Le tout début de la vie d'un programme écrit en C est l'appel par
le \textsl{runtime} d'une fonction le \textsl{runtime}\footnote{\texttt{crt0.s}} d'une fonction
nommée \texttt{main} qui reçoit deux paramètres nommée \texttt{main} qui recevra deux paramètres\footnote{%
En fait trois, mais restons simple.}
dont l'utilisation est décrite un peu plus bas. dont l'utilisation est décrite un peu plus bas.
Ces paramètres sont fournis par le système d'exploitation. Ces paramètres sont fournis par des mécanismes planquées
dans la soute du système d'exploitation, et n'ont pas
d'importance pour le moment..
\lstinputlisting[language=c]{code/hello.c} \lstinputlisting[language=c]{code/hello.c}
Un fois passé l'entrée, nous somme dans la partie active. Un fois passé l'entrée, nous sommes dans la partie active.
Nous appelons à ce moment la fonction \texttt{printf} Nous appelons à ce moment une fonction de la bibliothèque
standard : \texttt{puts}
qui a pour but d'afficher sur l'écran le texte qui a pour but d'afficher sur l'écran le texte
passé en paramètre. passé en paramètre.
Voila, c'est fait. Nous savons dire bonjour au monde. Voila, c'est fait. Dans les règles de l'art.
Point suivant~: dire boujour à quelqu'un d'autre. Et pour Nous savons dire « bonjour » au monde.
Point suivant~: dire bonjour à quelqu'un d'autre. Et pour
cela il nous fait récupérer un argument depuis la ligne cela il nous fait récupérer un argument depuis la ligne
de commande. de commande.
% --------------------------------------------------------- % =========================================================
\section{Arguments} \section{Arguments}
@ -70,7 +75,8 @@ En C, les tableaux commencent toujours à l'indice 0.
Pour le traitement des options, il faut sauter à Pour le traitement des options, il faut sauter à
la page \pageref{getopt}. la page \pageref{getopt}.
% --------------------------------------------------------- % =========================================================
\section{Les variables} \section{Les variables}
En gros, une variable du C est une zone de mémoire destinée En gros, une variable du C est une zone de mémoire destinée
@ -88,20 +94,29 @@ que l'on peut stocker dans une variable.
\textbf{La portée} : \textbf{La portée} :
% --------------------------------------------------------- % =========================================================
\section{Les fonctions} \section{Les fonctions}
Nous avons vu brièvement dans la première section de ce chapitre Nous avons vu brièvement dans la première section de ce chapitre
la fonction \texttt{main} et ses deux paramètres. la fonction \texttt{main} et ses deux paramètres.
Il est temps de préciser les détails. Il est temps de préciser les détails.
Une fonction a un unique point d'entrée\footnote{Qui a déja joué
avec le ENTRY du Fortran ?}, avec une éventuelle liste
de paramètres,
et une tout aussi éventuelel unique valeur de retour.
XXX\index{XXX} XXX\index{XXX}
% --------------------------------------------------------- % =========================================================
\section{Entrées / Sorties} \section{Entrées / Sorties}
\index{stdin} \index{stdout} \index{stderr} \index{stdin} \index{stdout} \index{stderr}
Il est évident qu'un logiciel qui n'a aucun moyen de communiquer
avec le monde extérieur a bien moins d'utilité qu'un bon ed.
Dans le schéma «~classique~», ces échanges ont lieu par
le truchement d'un terminal.
\subsection{Les trois flux canoniques} \subsection{Les trois flux canoniques}
\texttt{stdin}, \texttt{stdout} et \texttt{stderr}\dots \texttt{stdin}, \texttt{stdout} et \texttt{stderr}\dots
@ -145,9 +160,11 @@ un peu plus loin.
\subsection{Écrire : \texttt{printf}} \subsection{Écrire : \texttt{printf}}
\index{printf} \index{printf}
La fonction \texttt{printf} permet d'afficher le contenu d'une La fonction \texttt{printf} permet d'afficher sur la sortie
(ou plusieurs) standard le contenu d'une (ou plusieurs)
variable sous divers formats contrôlables par un petit DSL. variable sous diverses présentations,
qui sont contrôlables par un tout petit DSL\index{DSL}~:
la chaine de format.
\begin{verbatim} \begin{verbatim}
int bar, foo = 42; int bar, foo = 42;
@ -160,17 +177,18 @@ la fonction '\texttt{printf}' avec les paramêtres appropriés et
conserve la valeur de retour de celle-ci. conserve la valeur de retour de celle-ci.
Le premier de ces paramêtres, \texttt{"foo = \%d\textbackslash{}n"}, Le premier de ces paramêtres, \texttt{"foo = \%d\textbackslash{}n"},
est appelé \emph{chaine de format}. C'est une chaine de caractères est appelé \emph{chaine de format}. C'est une chaine de caractères,
que l'on peut classer en trois catégories~: que l'on peut classer en trois catégories~:
\begin{itemize} \begin{itemize} % ------------
\item{\textsl{caractères crus} : ils sont directements poussés vers \item{\textsl{caractères crus} : ils sont directements poussés vers
la sortie. La plupart d'entre eux donnent le résultat attendu.} la sortie. La plupart d'entre eux donnent le résultat attendu.}
\item{\textsl{codes de format} : les fragments qui commencent par le \item{\textsl{codes de format} : les fragments qui commencent par le
caractère '\%'. Ils servent à contrôler l'apparence de ce qui va caractère '\%'. Ils servent à contrôler l'apparence de ce qui va
suivre. Par exemple \texttt{\%x} va afficher un int en hexadécimal} suivre.
Par exemple \texttt{\%x} va afficher un \texttt{int} en hexadécimal}.
\item{\textsl{échappements} : les caractères précédés d'un \item{\textsl{échappements} : les caractères précédés d'un
'\textbackslash' ou \textsl{backslash}\footnote{barre-penchée-du-8} '\textbackslash' ou \textsl{backslash}\footnote{barre-penchée-du-8}
@ -180,14 +198,14 @@ Par exemple, \texttt{'\textbackslash{}n'} va générer le caractère
\textsl{newline} qui marque la fin d'une ligne de texte. \textsl{newline} qui marque la fin d'une ligne de texte.
} }
\end{itemize} \end{itemize} % ------------
Quand à la valeur de retour, elle contient le nombre de caractères Quand à la valeur de retour, elle contient le nombre de caractères
efectivement écrits. Ce nombre peut être différent du nombre attendu, effectivement écrits. Ce nombre peut être différent du nombre attendu
par exemple si le disque est saturé. en cas d'erreur, par exemple si le disque est saturé.
Ce nombre peut être utilisé pour un affichage de multiples données Ce nombre, que beaucoup de gens négligent, peut être utilisé pour un
en limitant la taille des lignes. affichage de multiples données en limitant la longueur des lignes~:
\begin{verbatim} \begin{verbatim}
int foo, nbre = 0; int foo, nbre = 0;
@ -199,6 +217,9 @@ for (foo=0; foo<1000; foo++) {
} }
\end{verbatim} \end{verbatim}
% ---------------------------------------------------------
\subsection{Lire : \texttt{scanf}} \subsection{Lire : \texttt{scanf}}
\index{scanf} \index{scanf}
@ -244,8 +265,7 @@ par \texttt{fopen}~:
int fprintf(FILE *stream, const char *format, ...); int fprintf(FILE *stream, const char *format, ...);
\end{verbatim} \end{verbatim}
% =========================================================
% ---------------------------------------------------------
\section{Un filtre Unix}\label{filtre-unix} \section{Un filtre Unix}\label{filtre-unix}
@ -271,7 +291,6 @@ $ ./no-op < no-op.c | head -5
$ $
\end{verbatim} \end{verbatim}
Vous voulez un autre exemple ? En voici un, parfois utile pour des Vous voulez un autre exemple ? En voici un, parfois utile pour des
simulations de terminal de \textsl{h4ck3rZ}\footnote{texte vert ou simulations de terminal de \textsl{h4ck3rZ}\footnote{texte vert ou
orange sur fond noir de rigueur.} sur une ligne en boucle de orange sur fond noir de rigueur.} sur une ligne en boucle de
@ -286,7 +305,7 @@ utilisés et les usages possibles d'un tel filtre,
il faut voir le concept de pipeline du shell en il faut voir le concept de pipeline du shell en
page \pageref{pipeline}. page \pageref{pipeline}.
% --------------------------------------------------------- % =========================================================
\section{Les pointeurs}\label{pointeur}\index{pointeur} \section{Les pointeurs}\label{pointeur}\index{pointeur}
@ -307,8 +326,9 @@ ptr = tableau; // *ptr désigne tableau[0];
ptr++; // *ptr désigne tableau[1]; ptr++; // *ptr désigne tableau[1];
\end{verbatim} \end{verbatim}
XXX il y a beaucoup à dire, et de quoi bien rire \textsl{:)}
% --------------------------------------------------------- % =========================================================
\section{Le préprocesseur}\index{cpp} \section{Le préprocesseur}\index{cpp}
@ -363,10 +383,10 @@ pris en compte.
Une chose très fourbe dont voici un exemple ? Une chose très fourbe dont voici un exemple ?
\begin{verbatim} \begin{verbatim}
#define pixidx(fi,x,y) (((y)*fi->width)+(x)) #define pixidx (fi,x,y) (((y)*fi->width)+(x))
#define getRpix(fi,x,y) (fi->R[ pixidx(fi,(x),(y)) ]) #define getRpix (fi,x,y) (fi->R[ pixidx(fi,(x),(y)) ])
#define getGpix(fi,x,y) (fi->G[ pixidx(fi,(x),(y)) ]) #define getGpix (fi,x,y) (fi->G[ pixidx(fi,(x),(y)) ])
#define getBpix(fi,x,y) (fi->B[ pixidx(fi,(x),(y)) ]) #define getBpix (fi,x,y) (fi->B[ pixidx(fi,(x),(y)) ])
\end{verbatim} \end{verbatim}
Finalemant, ça n'est pas si compliqué que ça. Finalemant, ça n'est pas si compliqué que ça.
@ -388,18 +408,22 @@ seront ensuite \textbf{liés} pour obtenir l'exécutable final.
Mais découper un gros logiciel en plusieurs fichiers source Mais découper un gros logiciel en plusieurs fichiers source
a d'autres avantages. a d'autres avantages.
Bien maitrisé, c'est une technique assez sereine.
Elle permet d'isoler des données spécifiques qu'il serait
bien plus lourd et périlleux d'utiliser d'une autre façon.
% --------------------------------------------------------- % =========================================================
\section{Les structures} \section{Les structures}
Une structure est une sorte de boite dans laquelle on peut Une structure est une sorte de boite dans laquelle on peut
ranger plusieurs variables afin de les manipuler comme ranger plusieurs variables afin de les manipuler comme
une seule entité. une seule entité. Les utilisateurs de 80 colonnes voient
tout de suite de quoi il s'agit.
XXX XXX trouver un exemple parlant et décalé\dots
% --------------------------------------------------------- % =========================================================
\section{Gestion de la mémoire} \section{Gestion de la mémoire}
\index{malloc} \index{free} \index{malloc} \index{free}
@ -452,7 +476,7 @@ Et finalement, nous avons réussi à générer un \textsl{useless number}.
Notre mission est terminée, nous rendons notre bloc de mémoire Notre mission est terminée, nous rendons notre bloc de mémoire
au mc/p avec \texttt{free(ptr);}. au mc/p avec \texttt{free(ptr);}.
% --------------------------------------------------------- % =========================================================
\section{Gérer les options}\index{getopt}\label{getopt} \section{Gérer les options}\index{getopt}\label{getopt}
@ -466,7 +490,7 @@ extern int optind, opterr, optopt;
La page de man de getopt(3) contient des explications détaillées La page de man de getopt(3) contient des explications détaillées
et un exemple simple d'utilisation. et un exemple simple d'utilisation.
% --------------------------------------------------------- % =========================================================
\section{Erreurs classiques} \section{Erreurs classiques}
@ -548,4 +572,4 @@ l'utilisation des signaux (page \pageref{get-signal}),
le chargement dynamique d'un \textsl{plug-in} (page \pageref{ex_dlopen}). le chargement dynamique d'un \textsl{plug-in} (page \pageref{ex_dlopen}).
% --------------------------------------------------------- % =========================================================

View File

@ -5,15 +5,15 @@ Le \texttt{shell} est le coquillage qui isole le
MC/P\footnote{Master Control Program} des yusers. MC/P\footnote{Master Control Program} des yusers.
En gros, hein, je vais simplifier, et me limiter aux En gros, hein, je vais simplifier, et me limiter aux
bricolages constructifs et/ou amusant. Il y aura du gore\index{gore} bricolages constructifs et/ou amusant. Il y aura du gore\index{gore}
aussi. aussi, parce que le shell est à la fois un interpréteur de commande
et un langage de programmation.
Ces deux notions ont beaucoup de choses en commun, comme nous
allons essayer de le voir.
Le shell est à la fois un interpréteur de commande et un Nous allons nous concentrer sur le \textsl{Bourne again shell}
langage de programmation. Ces deux notions ont beaucoup de (aka \texttt{bash}\footnote{aka GNU/shell ?}) qui est un des plus
choses en commun. répandus, du moins dans le monde Linux\index{Linux}.
Mais il en existe d'autres : sh, ksh, ash, zsh, tthsh\dots
Nous allons nous concentrer sur le \textsl{Bourne again shell}.
aka \texttt{bash} qui est peut-être le plus répandu. Mais il
en existe d'autres : sh, ksh, ash, zsh\dots
% ============================================================== % ==============================================================

View File

@ -8,7 +8,7 @@ dessiner: dessiner.f90 Makefile
gfortran -g $< $(INCS) -lplplotfortran -o $@ gfortran -g $< $(INCS) -lplplotfortran -o $@
foo.gif: dessiner Makefile plot89a.gif: dessiner Makefile
rm -f WS/A????.png rm -f WS/A????.png
./dessiner ./dessiner
convert -delay 10 -colors 31 WS/A????.png foo.gif convert -delay 10 -colors 42 WS/A????.png $@

5
code/fortran/README.md Normal file
View File

@ -0,0 +1,5 @@
# Exemples de code en Fortran moderne
Pour les explications, il faut aller lire le livre ou
les codes source.

View File

@ -13,6 +13,13 @@ program dessiner
contains ! ----------------------------- contains ! -----------------------------
!------------------------------------------------------ !------------------------------------------------------
!- __ __ _
!- \ \/ / __ __ (_) _ __
!- \ / \ \ /\ / / | | | '_ \
!- / \ \ V V / | | | | | |
!- /_/\_\ \_/\_/ |_| |_| |_|
!-
subroutine dessin_X11 (sha, shb, color) subroutine dessin_X11 (sha, shb, color)
real, intent(in) :: sha, shb real, intent(in) :: sha, shb
integer, intent(in) :: color integer, intent(in) :: color
@ -41,7 +48,7 @@ subroutine dessin_X11 (sha, shb, color)
call plcol0 (color) call plcol0 (color)
call plline (x, y) call plline (x, y)
call plend call plend ()
end subroutine end subroutine
!------------------------------------------------------ !------------------------------------------------------
@ -54,7 +61,8 @@ end subroutine
subroutine dessin_dans_un_fichier () subroutine dessin_dans_un_fichier ()
integer, parameter :: nbpts = 40 integer, parameter :: nbpts = 20
real, parameter :: usz = 15.0 ! univers size
real :: x(nbpts), y(nbpts) real :: x(nbpts), y(nbpts)
integer :: frame, i integer :: frame, i
character(len=89) :: filename character(len=89) :: filename
@ -64,11 +72,11 @@ subroutine dessin_dans_un_fichier ()
print *, 'Dessin dans un fichier' print *, 'Dessin dans un fichier'
do i=1, nbpts do i=1, nbpts
x(i) = 8.50 * (rand() - 0.5000) x(i) = usz * (rand() - 0.5000)
y(i) = 8.50 * (rand() - 0.5000) y(i) = usz * (rand() - 0.5000) * 0.50
enddo enddo
do frame= 0, 149 do frame= 0, 119
write (filename, "(a, i4.4, a)") "WS/A", frame, ".png" write (filename, "(a, i4.4, a)") "WS/A", frame, ".png"
print *, frame, ' => ', trim(filename) print *, frame, ' => ', trim(filename)
call plsdev ('pngcairo') call plsdev ('pngcairo')
@ -77,8 +85,8 @@ subroutine dessin_dans_un_fichier ()
call plenv (-10., 10., -10., 10., 0, 1) call plenv (-10., 10., -10., 10., 0, 1)
call plcol0 (3) call plcol0 (3)
do i=1, nbpts do i=1, nbpts
x(i) = x(i) + (rand() - 0.5000) x(i) = x(i) + 1.2 * (rand() - 0.5000)
y(i) = y(i) + (rand() - 0.5000) y(i) = y(i) + 1.2 * (rand() - 0.5000)
call plline (x, y) call plline (x, y)
enddo enddo
write(buffer, "(i3.3)") frame write(buffer, "(i3.3)") frame
@ -86,12 +94,29 @@ subroutine dessin_dans_un_fichier ()
call plcol0 (15) call plcol0 (15)
call plstring (x, y, buffer) call plstring (x, y, buffer)
call plend call plend ()
enddo enddo
end subroutine end subroutine
!------------------------------------------------------ !------------------------------------------------------
!- _ _ ____
!- | |_ _ __ ___ (_) | _ \
!- | __| | '__| / _ \ | | | | | |
!- | |_ | | | (_) | | | | |_| |
!- \__| |_| \___/ |_| |____/
!-
subroutine dessiner_en_trois_D ()
integer, parameter :: szgrid = 64
integer :: i, j
print *, 'Dessin en 3D (de merde :)'
call plsdev ('xwin')
call plinit ()
call plend ()
end subroutine
!------------------------------------------------------
end program end program

View File

@ -6,6 +6,6 @@
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
printf("hello world.\n"); puts("hello world.");
return 0; return 0;
} }

View File

@ -21,14 +21,14 @@
\makeindex \makeindex
\setlength \parindent {2em} \setlength \parindent {2em}
\setlength \parskip {0.33em} % XXX \setlength \parskip {0.30em} % XXX
%------ reglages des 'listings' %------ reglages des 'listings'
\lstset{frame=single} % dessin d'un cadre autour du listing \lstset{frame=single} % dessin d'un cadre autour du listing
\lstset{basicstyle=\ttfamily\small} \lstset{basicstyle=\ttfamily\small}
\lstset{aboveskip=1.0em,belowskip=1.0em} \lstset{aboveskip=1.0em,belowskip=1.0em}
\setcounter{tocdepth}{1} \setcounter{tocdepth}{1} % XXX à regarder un de ces jours ?
\pagestyle{plain} \pagestyle{plain}
\usepackage{pifont} % caractères rigolos \usepackage{pifont} % caractères rigolos