#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}
\index{dosbox}\label{chap:Basic}
% -------------------------------------------
% ====================================================================
% https://www.theregister.com/2023/03/28/nostalgic_for_basic/
% ====================================================================
\section{BASIC} \index{BASIC}
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
% -------------------------------------------
% ====================================================================
\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}
Bywater BASIC Interpreter/Shell, version 2.10
---------------------------------------------
@ -44,7 +55,7 @@ mais canonique~:
Première conclusion : affaire à suivre.
% -------------------------------------------
% ====================================================================
\section{Yabasic} \index{yabasic}
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}
% -------------------------------------------
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 ?}
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.
% -------------------------------------------
% -------------------------------------------
% ====================================================================

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.
% ---------------------------------------------------------
% =========================================================
\section{Hello World}
Hop, on y va...
Le tout début d'un programme en C est l'appel par
le \textsl{runtime} d'une fonction
nommée \texttt{main} qui reçoit deux paramètres
Le tout début de la vie d'un programme écrit en C est l'appel par
le \textsl{runtime}\footnote{\texttt{crt0.s}} d'une fonction
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.
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}
Un fois passé l'entrée, nous somme dans la partie active.
Nous appelons à ce moment la fonction \texttt{printf}
Un fois passé l'entrée, nous sommes dans la partie active.
Nous appelons à ce moment une fonction de la bibliothèque
standard : \texttt{puts}
qui a pour but d'afficher sur l'écran le texte
passé en paramètre.
Voila, c'est fait. Nous savons dire bonjour au monde.
Point suivant~: dire boujour à quelqu'un d'autre. Et pour
Voila, c'est fait. Dans les règles de l'art.
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
de commande.
% ---------------------------------------------------------
% =========================================================
\section{Arguments}
@ -70,7 +75,8 @@ En C, les tableaux commencent toujours à l'indice 0.
Pour le traitement des options, il faut sauter à
la page \pageref{getopt}.
% ---------------------------------------------------------
% =========================================================
\section{Les variables}
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} :
% ---------------------------------------------------------
% =========================================================
\section{Les fonctions}
Nous avons vu brièvement dans la première section de ce chapitre
la fonction \texttt{main} et ses deux paramètres.
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}
% ---------------------------------------------------------
% =========================================================
\section{Entrées / Sorties}
\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}
\texttt{stdin}, \texttt{stdout} et \texttt{stderr}\dots
@ -145,9 +160,11 @@ un peu plus loin.
\subsection{Écrire : \texttt{printf}}
\index{printf}
La fonction \texttt{printf} permet d'afficher le contenu d'une
(ou plusieurs)
variable sous divers formats contrôlables par un petit DSL.
La fonction \texttt{printf} permet d'afficher sur la sortie
standard le contenu d'une (ou plusieurs)
variable sous diverses présentations,
qui sont contrôlables par un tout petit DSL\index{DSL}~:
la chaine de format.
\begin{verbatim}
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.
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~:
\begin{itemize}
\begin{itemize} % ------------
\item{\textsl{caractères crus} : ils sont directements poussés vers
la sortie. La plupart d'entre eux donnent le résultat attendu.}
\item{\textsl{codes de format} : les fragments qui commencent par le
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
'\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.
}
\end{itemize}
\end{itemize} % ------------
Quand à la valeur de retour, elle contient le nombre de caractères
efectivement écrits. Ce nombre peut être différent du nombre attendu,
par exemple si le disque est saturé.
effectivement écrits. Ce nombre peut être différent du nombre attendu
en cas d'erreur, par exemple si le disque est saturé.
Ce nombre peut être utilisé pour un affichage de multiples données
en limitant la taille des lignes.
Ce nombre, que beaucoup de gens négligent, peut être utilisé pour un
affichage de multiples données en limitant la longueur des lignes~:
\begin{verbatim}
int foo, nbre = 0;
@ -199,6 +217,9 @@ for (foo=0; foo<1000; foo++) {
}
\end{verbatim}
% ---------------------------------------------------------
\subsection{Lire : \texttt{scanf}}
\index{scanf}
@ -244,8 +265,7 @@ par \texttt{fopen}~:
int fprintf(FILE *stream, const char *format, ...);
\end{verbatim}
% ---------------------------------------------------------
% =========================================================
\section{Un filtre Unix}\label{filtre-unix}
@ -271,7 +291,6 @@ $ ./no-op < no-op.c | head -5
$
\end{verbatim}
Vous voulez un autre exemple ? En voici un, parfois utile pour des
simulations de terminal de \textsl{h4ck3rZ}\footnote{texte vert ou
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
page \pageref{pipeline}.
% ---------------------------------------------------------
% =========================================================
\section{Les pointeurs}\label{pointeur}\index{pointeur}
@ -307,8 +326,9 @@ ptr = tableau; // *ptr désigne tableau[0];
ptr++; // *ptr désigne tableau[1];
\end{verbatim}
XXX il y a beaucoup à dire, et de quoi bien rire \textsl{:)}
% ---------------------------------------------------------
% =========================================================
\section{Le préprocesseur}\index{cpp}
@ -363,10 +383,10 @@ pris en compte.
Une chose très fourbe dont voici un exemple ?
\begin{verbatim}
#define pixidx(fi,x,y) (((y)*fi->width)+(x))
#define getRpix(fi,x,y) (fi->R[ 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 pixidx (fi,x,y) (((y)*fi->width)+(x))
#define getRpix (fi,x,y) (fi->R[ 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)) ])
\end{verbatim}
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
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}
Une structure est une sorte de boite dans laquelle on peut
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}
\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
au mc/p avec \texttt{free(ptr);}.
% ---------------------------------------------------------
% =========================================================
\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
et un exemple simple d'utilisation.
% ---------------------------------------------------------
% =========================================================
\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}).
% ---------------------------------------------------------
% =========================================================

View File

@ -5,15 +5,15 @@ Le \texttt{shell} est le coquillage qui isole le
MC/P\footnote{Master Control Program} des yusers.
En gros, hein, je vais simplifier, et me limiter aux
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
langage de programmation. Ces deux notions ont beaucoup de
choses en commun.
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
Nous allons nous concentrer sur le \textsl{Bourne again shell}
(aka \texttt{bash}\footnote{aka GNU/shell ?}) qui est un des plus
répandus, du moins dans le monde Linux\index{Linux}.
Mais il en existe d'autres : sh, ksh, ash, zsh, tthsh\dots
% ==============================================================

View File

@ -8,7 +8,7 @@ dessiner: dessiner.f90 Makefile
gfortran -g $< $(INCS) -lplplotfortran -o $@
foo.gif: dessiner Makefile
plot89a.gif: dessiner Makefile
rm -f WS/A????.png
./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 ! -----------------------------
!------------------------------------------------------
!- __ __ _
!- \ \/ / __ __ (_) _ __
!- \ / \ \ /\ / / | | | '_ \
!- / \ \ V V / | | | | | |
!- /_/\_\ \_/\_/ |_| |_| |_|
!-
subroutine dessin_X11 (sha, shb, color)
real, intent(in) :: sha, shb
integer, intent(in) :: color
@ -41,7 +48,7 @@ subroutine dessin_X11 (sha, shb, color)
call plcol0 (color)
call plline (x, y)
call plend
call plend ()
end subroutine
!------------------------------------------------------
@ -54,7 +61,8 @@ end subroutine
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)
integer :: frame, i
character(len=89) :: filename
@ -64,11 +72,11 @@ subroutine dessin_dans_un_fichier ()
print *, 'Dessin dans un fichier'
do i=1, nbpts
x(i) = 8.50 * (rand() - 0.5000)
y(i) = 8.50 * (rand() - 0.5000)
x(i) = usz * (rand() - 0.5000)
y(i) = usz * (rand() - 0.5000) * 0.50
enddo
do frame= 0, 149
do frame= 0, 119
write (filename, "(a, i4.4, a)") "WS/A", frame, ".png"
print *, frame, ' => ', trim(filename)
call plsdev ('pngcairo')
@ -77,8 +85,8 @@ subroutine dessin_dans_un_fichier ()
call plenv (-10., 10., -10., 10., 0, 1)
call plcol0 (3)
do i=1, nbpts
x(i) = x(i) + (rand() - 0.5000)
y(i) = y(i) + (rand() - 0.5000)
x(i) = x(i) + 1.2 * (rand() - 0.5000)
y(i) = y(i) + 1.2 * (rand() - 0.5000)
call plline (x, y)
enddo
write(buffer, "(i3.3)") frame
@ -86,12 +94,29 @@ subroutine dessin_dans_un_fichier ()
call plcol0 (15)
call plstring (x, y, buffer)
call plend
call plend ()
enddo
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

View File

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

View File

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