Hello World

Création, affichage, compilation puis exécution d'un Hello World! en C sous Linux.

Hello World (en français Bonjour le monde) est un programme simple qui est traditionnellement écrit pour donner un exemple rapide d'un langage de programmation (lors de l'apprentissage de celui-ci ou d'un simple test).

La longueur de ce programme varie en fonction du langage de programmation utilisé : il peut d'ailleurs être utilisé pour savoir si le langage est de bas niveau (proche du langage machine, Hello World long) ou de haut niveau (plus abstrait, Hello World court).

Le Hello World fut lancé pour la première fois comme exemple de programme dans le livre The C Programming Language de Brian Kernighan et Dennis Ritchie.

Exemples

Voici des Hello World! pour divers langages de programmation. Ces programmes sont minimaux mais complets : il n'est pas nécessaire de leur rajouter du code pour les faire fonctionner, mais on ne peut en général pas leur en enlever.

Ada

with Ada.Text_IO;
use Ada.Text_IO;

procedure Bonjour is
begin -- Bonjour
    Put("Hello world!");
end Bonjour;

Awk

BEGIN { print "Hello World!" }

C

#include <stdio.h>
int main(void)
{
  printf("%s", "Hello World!\n");
  return 0;
}

C++

#include <iostream>
int main ()
{
  std::cout << "Hello World!" << std::endl;
}

Haskell

main = putStrLn "Hello World!"

HTML

HTML n'est pas un langage de programmation mais un langage de balisage.

HTML 5 :

<!DOCTYPE html>
<html>
  <body>
    <p>Hello World</p>
  </body>
</html>

Javascript

à l'intérieur d'une page html entre les balise <body> et </body>

<script>
    document.write('Hello World ! <br />');
</script>

INTERCAL

INTERCAL (wp) est un langage de programmation fait exprès pour être le plus compliqué et absurde possible. Le code suivant est strictement équivalent au Hello World en C montré plus haut !

DO, 1 <- #13
PLEASE DO, 1 SUB #1 <- #238
DO, 1 SUB #2 <- #108
DO, 1 SUB #3 <- #112
DO, 1 SUB #4 <- #0
DO, 1 SUB #5 <- #64
DO, 1 SUB #6 <- #194
DO, 1 SUB #7 <- #48
PLEASE DO, 1 SUB #8 <- #22
DO, 1 SUB #9 <- #248
DO, 1 SUB #10 <- #168
DO, 1 SUB #11 <- #24
DO, 1 SUB #12 <- #16
DO, 1 SUB #13 <- #162
PLEASE READ OUT, 1
PLEASE GIVE UP

Java

public class HelloWorld                      // Comme tout est « classe » (c'est-à-dire objet)
{                                            // en Java, on doit en créer une.

    public static void main(String[] args)   // Un programme Java commence toujours dans
    {                                        // une fonction « main » comme celle-ci.

        System.out.println("Hello World!");  // On demande au « System » d'écrire (« println »)
                                             // "Hello World!" sur l'écran (« out »).
    }
}

Assembleur

(pour une machine Linux avec un processeur Intel x86)
section	.text
  global _start ; on définit une fonction _start (voir ci-dessous)

_start:         ; « voici ce que fait la fonction _start »
  mov edx, len  ; sélection de la longueur du message
  mov ecx, msg  ; sélection de l'adresse du message
  mov ebx, 1    ; sélection de l'endroit d'affichage (« sortie standard »)
  mov eax, 4	; sélection de l'appel système « write »
  int 0x80	; exécution de cet appel (interruption kernel)

  mov eax, 1	; sélection de l'appel système « exit »
  int 0x80	; exécution de cet appel (interruption kernel)

section	.data   ; l'endroit où sont rangées les données du programme
  msg db    'Hello, world!', 0xa  ; adresse du message
  len equ   $ - msg              ; longueur du message

Un programme est constitué de sections qui séparent ses différentes parties. Ici, on voit deux sections : .text et .data. La section text contient les instructions, tandis que la section data correspond à certaines variables du programme (ici, on peut voir msg et len).

Avant tout, il faut savoir que le processeur de l'ordinateur possède des registres, qui sont de petites cases de mémoire où lui et nous plaçons les valeurs qu'il a produites ou avec lesquelles il doit travailler.

Juste après le début de la section text (tout au début du code), on définit une fonction nommée _start avec l'instruction « global ». C'est par là que commence le programme. Ensuite, à la troisième ligne, on dit quelles instructions contient _start :

  1. mov edx, len : on met (« move », en anglais « déplacer ») la valeur de len (qui est la longueur du message à afficher, « Hello, World! », donc 13) dans le registre edx.
  2. mov ecx, msg : on met msg (l'adresse du message « Hello, World! ») dans le registre ecx.
  3. mov ebx, 1 : on met dans le registre ebx l'endroit où l'on veut afficher le message : 1 correspond à la « sortie standard » (en général l'écran).
  4. mov eax, 4 : on met dans le registre eax le numéro 4, qui correspond à l'appel système write : c'est lui qui va s'occuper d'écrire (en anglais « write ») les caractères de notre message sur la sortie standard.

Il faut bien comprendre que, quand on fait de l'assembleur, on s'adresse aux fonctions les plus basiques du système (le noyau, ou kernel). Ici, on va directement appeler le processeur ! C'est le travail de l'instruction int 0x80 : elle interrompt le processeur en lui disant :

« Hé, processeur, regarde un peu par là ! J'ai mis dans tes registres (eax, ebx, etc.) ce que tu as à faire ! »

Le processeur interrompt alors notre programme et demande au noyau du système d'exploitation d'exécuter l'appel système qui se trouve dans son premier registre (eax) en lui donnant en paramètre ce que contiennent les registres suivants (ebx, ecx, etc.). Le noyau fait ce qu'il faut, puis le processeur reprend l'exécution de notre programme.

Ensuite, c'est pareil, sauf qu'on ne veut plus écrire mais terminer. On va donc utiliser un autre appel système, le numéro 1, qui signifie que notre programme est terminé : encore une fois, on met ce 1 dans le premier registre du processeur eax puis on lui relance une interruption : de la même manière, le noyau va prendre le relais et, cette fois-ci, terminer l'exécution du programme.

Lisp

(print "Hello World!")

Les parenthèses sont indispensables : elles créent une liste contenant deux éléments : print et "Hello World!", ce qui signifie en Lisp qu'on applique la fonction print au reste de cette liste (donc à "Hello World!").

Microsoft Small Basic

TextWindow.WriteLine("Hello World")

OCaml

print_string "Hello World!\n";;


Pascal

programme complet

program hello;
begin
    writeln('Hello World!');
end.

Perl

Dans les versions inférieures à 5.10, on doit écrire le retour à la ligne :

print "Hello World!\n";

Mais c'est inutile (quoique faisable) dans la version 5.10 et après, ou dans Perl 6 :

say "Hello World!";

PHP

<?php echo "Hello World" ?>

Python

print "Hello World"

ou, depuis la version 3 du langage :

print ("Hello World")

Ruby

puts "Hello World"
Les langages de l’informatique
Portail de l'informatique   Tous les articles sur son histoire, les logiciels, Internet…
This article is issued from Vikidia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.