Section courante

A propos

Section administrative du site

 Langage  Elément  Aide 
ABAP/4
Ada
Assembleur
Assembly & bytecode
ASP (Active Server Pages)
Basic
C
C++
C# (C Sharp)
Cobol
ColdFusion
Fortran
HTML
Java
JavaScript
LISP
Logo
LotusScript
Oberon
Pascal
Perl
PHP
PL/1
Prolog
Python
Rebol
REXX
Ruby
SAS
NoSQL
SQL
Swift
X++ (Axapta)
GNAT
SMALLAda
VHDL
Assembleur 370
Assembleur 1802
Assembleur 4004
Assembleur 6502
Assembleur 6800
Assembleur 68000
Assembleur 8080 et 8085
Assembleur 8089
Assembleur 80x86
Assembleur AGC4
Assembleur ARM
Assembleur DPS 8000
Assembleur i860
Assembleur Itanium
Assembleur MIPS
Assembleur PDP-11
Assembleur PowerPC
Assembleur RISC-V
Assembleur SPARC
Assembleur SuperH
Assembleur UNIVAC I
Assembleur VAX
Assembleur Z80
Assembleur Z8000
Assembleur z/Architecture
ASSEMBLER/MONITOR 64
Micol Assembler
GFA Assembler
A86
MASM (Macro Assembler)
TASM (Turbo Assembler)
CIL
Jasmin
LLVM
MSIL
Parrot
P-Code (PCode)
SWEET16
G-Pascal
ASP 1.0
ASP 2.0
ASP 3.0
ASP.NET
ASP.NET Core
ABasiC (Amiga)
Adam SmartBASIC
Altair BASIC
AmigaBASIC (Amiga)
AMOS Basic (Amiga)
Atari Basic (Atari 400, 600 XL, 800, 800XL)
Basic Apple II (Integer BASIC/APPLESOFT)
Basic Commodore 64 (CBM-BASIC)
Basic Commodore 128 (BASIC 7.0)
Basic Commodore VIC-20 (CBM-BASIC 2.0)
Basic Coco 1 (Color Basic)
Basic Coco 2 (Extended Color Basic)
Basic Coco 3 (Extended Color Basic 2.0)
BASICA (PC DOS)
Basic Pro
BBC BASIC
Blitz BASIC (Amiga)
DarkBASIC
Dartmouth BASIC
GFA-Basic (Atari ST/Amiga)
GWBASIC (MS-DOS)
Liberty BASIC
Locomotive BASIC (Amstrad CPC)
MSX-Basic
Omikron Basic (Atari ST)
Oric Extended Basic
Power Basic
Quick Basic/QBasic (MS-DOS)
Sinclair BASIC (ZX80, ZX81, ZX Spectrum)
ST BASIC (Atari ST)
Turbo Basic
Vintage BASIC
VBScript
Visual Basic (VB)
Visual Basic .NET (VB .NET)
Visual Basic pour DOS
Yabasic
BeckerBASIC
SIMONS' BASIC
Basic09 d'OS-9
Disk Extended Color Basic
Basic09 d'OS-9
Disk Extended Color Basic
Access
Excel
Visual Basic pour Windows
Visual Basic .NET pour Windows
C Shell Unix (csh)
C pour Amiga
C pour Atari ST
C pour DOS
C pour Falcon030
C pour GEMDOS (Atari ST)
C pour Linux
C pour PowerTV OS
C pour OS/2
C pour Unix
C pour Windows
Aztec C
CoCo-C
GNU C
HiSoft C
IBM C/2
Introl-C
Lattice C
Microsoft C
MinGW C
MSX-C
Open Watcom C
OS-9 C Compiler
Pure C
Quick C
Turbo C
HiSoft C for Atari ST
HiSoft C for CP/M (Amstrad CPC)
C++ pour OS/2
C++ pour Windows
Borland C++
C++Builder
IBM VisualAge C++
Intel C++
MinGW C++
Open Watcom C++
Symantec C++
Turbo C++
Visual C++
Visual C++ .NET
Watcom C++
Zortech C++
C# (C Sharp) pour Windows
Apple III Cobol
Microsoft Cobol
BlueDragon
Lucee
OpenBD
Railo
Smith Project
Microsoft Fortran
WATFOR-77
CSS
FBML
Open Graph
SVG
XML
XSL/XSLT
LESS
SASS
GCJ (GNU)
JSP
Jython
Visual J++
Node.js
TypeScript
AutoLISP
ACSLogo
LotusScript pour Windows
Amiga Oberon
Oberon .NET
Apple Pascal
Delphi/Kylix/Lazarus
Free Pascal
GNU Pascal
HighSpeed Pascal
IBM Personal Computer Pascal
Lisa Pascal
Maxon Pascal
MPW Pascal
OS-9 Pascal
OSS Personal Pascal
Pascal-86
Pascal du Cray Research
Pascal/VS
Pascal-XT
PURE Pascal
QuickPascal
RemObjets Chrome
Sun Pascal
THINK Pascal
Tiny Pascal (TRS-80)
Turbo Pascal
UCSD Pascal
VAX Pascal
Virtual Pascal
Turbo Pascal for CP/M-80
Turbo Pascal for DOS
Turbo Pascal for Macintosh
Turbo Pascal for Windows
CodeIgniter (Cadre d'application)
Drupal (Projet)
Joomla! (Projet)
Phalanger (PHP .NET)
phpBB (Projet)
Smarty (balise)
Twig (balise)
Symfony (Cadre d'application)
WordPress (Projet)
Zend (Cadre d'application)
PL360
PL/M-80
PL/M-86
Turbo Prolog
CPython
IronPython
Jython
PyPy
AREXX
Regina REXX
JMP
Btrieve
Cassandra
Clipper
CouchDB
dBASE
Hbase
Hypertable
MongoDB
Redis
Access
BigQuery
DB2
H2
Interbase
MySQL
Oracle
PostgreSQL
SAP HANA
SQL Server
Sybase
U-SQL
Introduction
Notion de typage
Types scalaires
Structure statique
Types abstraits
Structures dynamiques
Structures dynamiques linéaires non-récursives (les fichiers)
Structures récursives linéaires
Structures récursives non linéaires
Structures de données simples
Structures adressables par leur contenu
Ramasse-miettes (Garbage Collection)
Liste symétrique
Pile
File d'attente circulaire
Arbre
Évaluation d'expression («Infix to Postfix»)
Évaluation d'expression (par remplacement)
Recherche dichotomique (recherche binaire ou recherche logarithmique)
Table haché (Hash Table)
Préface
Notes légal
Dictionnaire
Recherche

Introduction

Lorsqu'on parle de «types scalaires», on parle d'un type de données contenant uniquement qu'une seule donnée élémentaire. On ne retrouve pas à ce niveau de données complexes comme des structures par exemple. Les types scalaires sont définis en deux groupes : les types discrets et les types réels.

Les types discrets

Les types discrets se définit, comme, avec un ensemble de valeurs possibles et énumérables ainsi qu'avec nombre précis. Ainsi, il n'y a pas de nombre infini, mais uniquement des nombres finis. Dans ce type de données, on parle d'abord de nombres, mais le concept comprend également des valeurs de toute sorte. La plupart des langages contiennent donc les types discrets suivants :

Dans certains langages de programmation, comme le Pascal, les types discrets ne peuvent pas s'échanger des valeurs entre eux et nécessite une fonction de conversion comme «ORD» par exemple, tandis que des langages de programmation comme le C, eux, sont un peu trop permissif et tolèrent les mélanges de toutes sortes. La raison pour laquelle certains langages préfèrent obliger l'utilisateur à utiliser une fonction réside dans le fait que le programmeur doit indiquer consciemment qu'il demande de faire une exception sur une règle précise et qu'il ne s'agit pas d'une erreur de distraction. À l'inverse, un langage de programmation comme le C se base sur le fait que le programmeur est très vigilant à ce qu'il fait et qu'il ne fait donc jamais d'erreur !

Un des langages de programmation les plus poussés au niveau des types discrets, demeure le langage de programmation Pascal.

Les types réels

Les types réels, bien qu'aujourd'hui banal, dans la plupart des langages de programmation, cause énormément de problème. La raison de cette complexité tient du fait qu'un nombre réel est, par définition, dénombrable et potentiellement infini. Toutefois, l'ordinateur, dans ses mécanismes de base est tout le contraire, soit, sans aucune abstraction, précise, rigide et avec des exactitudes. On arrive dans avec un nouveau concept, lequel est l'approximation !

Ainsi, les types réels, ayant des contraintes machines, sont assez différentes des propriétés que l'on connait dans la science de la mathématique. En résumé, en informatique, (X / Y) x Y n'est pas forcément égal à X à cause de toute sorte de facteurs comme l'arrondissement par exemple.

Très peu de langages de programmation permettent de choisir différentes représentations de nombre réel, parmi les plus flexibles ont retrouve le langage de programmation Ada et Delphi.

Compatibilité et conversion de types

Le concept de compatibilité et conversion de types dans les langages de programmation, et en particulier dans le langage de programmation Pascal, est essentiel pour comprendre comment différents types de données interagissent lorsqu'ils sont utilisés ensemble dans des expressions, des affectations ou des appels de procédure. Voici une explication détaillée des règles et concepts mentionnés :

Compatibilité

La compatibilité entre types de données se réfère à la capacité de deux types à être utilisés ensemble dans une opération donnée, comme l'affectation de valeurs ou l'évaluation d'expressions. En Pascal, les règles de compatibilité sont strictes et visent à prévenir les erreurs dues à des conversions implicites de types pouvant entraîner des résultats inattendus.

Les langages de programmation fortement typés comme Pascal imposent ces contraintes pour garantir que les opérations effectuées sur les données soient sûres et sans ambiguïté.

Évaluation d'expressions

Lorsque des expressions sont évaluées, le type du résultat dépend des types des composants de l'expression. Par exemple :

L'évaluation des expressions utilise des règles de compatibilité pour assurer que les types peuvent être utilisés ensemble, et dans certains cas, des conversions implicites sont faites (comme d'un entier vers un réel) pour permettre l'évaluation. Cependant, cette flexibilité est limitée par des règles strictes pour éviter les erreurs inattendues.

Comparaison et ambiguïtés

Les opérateurs de comparaison acceptent des paramètres de types compatibles au sens de l'affectation (comme l'égalité, les opérateurs de plus grand ou plus petit,...), et ils renvoient toujours un résultat de type booléen. Cela signifie que, tant que les deux opérandes de l'opération de comparaison sont de types compatibles, l'opération sera valide et renverra un vrai ou un faux.

Cependant, il peut y avoir des ambiguïtés dans certaines expressions complexes où plusieurs opérateurs sont utilisés sans parenthèses pour clarifier l'ordre d'évaluation. Par exemple :

Dans l'expression A = B and C = D, plusieurs interprétations sont possibles, ce qui peut conduire à des résultats inattendus ou à des erreurs. Par exemple :

Ces ambiguïtés sont levées par l'utilisation de parenthèses explicites pour indiquer l'ordre de priorités des opérations ou par des règles de précédence spécifiées dans le langage de programmation, définissant dans quel ordre les opérations doivent être évaluées.

Passage de paramètres

Les règles de compatibilité pour le passage de paramètres à une procédure sont similaires à celles de l'affectation. Le paramètre formel de la procédure (la variable déclarée dans la définition de la procédure) doit être compatible avec le paramètre effectif (la valeur ou la variable passée à la procédure). Par exemple, si une procédure attend un entier comme paramètre, vous ne pouvez pas passer une valeur de type réel sans provoquer une erreur, à moins que des conversions explicites ne soient utilisées.

Dans tous ces cas, Pascal impose un contrôle strict des types pour garantir la sécurité et la fiabilité des programmes, tout en limitant les erreurs de conversion et de compatibilité.

Conversion de type

La conversion de type en Pascal, comme dans beaucoup de langages de programmation, consiste à changer un type de donnée en un autre type afin de permettre certaines opérations. Cependant, Pascal est plus strict que certains autres langages, car la plupart des conversions doivent être faites de manière explicite à l'aide de fonctions dédiées. Une exception notable dans Pascal est la conversion des entiers en réels, pouvant se faire implicitement lorsque cela est nécessaire, par exemple lors de calculs impliquant des nombres à virgule flottante. Parmi les fonctions prédéfinies permettant la conversion explicite, on trouve ord pour convertir un type discret en entier, chr pour convertir un entier en caractère, trunc et round pour convertir un réel en entier.

En comparaison, le langage Ada impose des règles encore plus strictes pour garantir la sécurité dans la gestion des types. Il distingue entre les sous-types et les types dérivés. Un sous-type est une restriction apportée à un type de base, et il reste compatible avec ce dernier. En revanche, un type dérivé est considéré comme un type totalement nouveau, et donc incompatible avec son type de base, même s'il partage les mêmes caractéristiques. Par exemple, un sous-type comme OneDigit, restant un entier à l'intervalle de 0 à 9, reste compatible avec le type entier. Cependant, un type dérivé comme Entier, bien qu'il soit basé sur le type entier, est incompatible avec ce dernier. Pour passer d'un type dérivé à son type de base ou vice-versa, une conversion explicite est nécessaire. Exemple :

  1. subtype OneDigit is integer range 0..9;  
  2. subtype JourOuvrable is Semaine range Lundi..Vendredi;  
  3. type Entier is new integer;   
  4. type MilieuDeSemaine is new Semaine range Mardi..Jeudi; 

L'intérêt de cette distinction entre types dérivés et sous-types, en particulier en Ada, réside dans la sécurité de programmation. Elle permet de prévenir des erreurs logiques qui pourraient survenir si l'on tentait d'effectuer des opérations sur des variables qui, bien qu'elles aient des types compatibles numériquement, ne sont pas logiquement compatibles. Par exemple, additionner une superficie à une longueur n'a pas de sens, bien qu'elles puissent toutes deux être représentées par des entiers. Cette approche stricte des conversions assure une plus grande robustesse du code. Modula-2, un autre langage de programmation proche de Pascal, suit des règles similaires, mais n'offre pas de conversion implicite des entiers vers les réels. Au lieu de cela, il exige l'utilisation d'une fonction comme float pour effectuer cette conversion.

Conclusion

Si l'on compare les types discrets et les types réels, dans le premier cas, ils sont facilement représentables au niveau matériel d'un microprocesseur et ne demandent aucun traitement spécifique pour être représentés, tandis que les nombres réels ne sont pas spécifiques à un microprocesseur ou à un langage de programmation, ils sont étroitement reliés au compilateur ou à l'interpréteur de langage de programmation. Il est donc impossible de convertir directement une valeur réelle en binaire d'une machine à l'autre, contrairement aux types discrets.



PARTAGER CETTE PAGE SUR
Dernière mise à jour : Samedi, le 8 avril 2017