Normalement, je code en c # ou en Objective-C et j'ai récemment décidé d'apprendre le nouveau langage de programmation d'Apple - Swift.
La première chose que j'ai remarquée est que vous n'avez pas besoin d'ajouter de points-virgules pour terminer une ligne en Swift mais si vous le faites - au moins d'après ce que j'ai testé - cela n'interfère pas avec le compilateur.
Quand j'écris:
int someNumber = 0;
dans Objective-C, le point-virgule indique au programme que la ligne est terminée et ne passe pas à la ligne suivante.
Avec Swift je peux déclarer une variable avec
var someNumber:Int = 5
et ne pas ajouter de point-virgule et le système sait que c'est la fin de la ligne.
Qu'est-ce qui permet à certaines langues de faire cela et à d'autres non? Pourquoi ne pas garder un système uniforme pour ajouter le point-virgule à la fin?
Qu'est-ce qui permet à certaines langues de faire cela et à d'autres de ne pas le faire? Pourquoi ne pas garder un système uniforme pour ajouter le point-virgule à la fin?
Robert a donné une bonne réponse concernant Swift, je vais essayer d'ajouter un peu plus sur l'analyse syntaxique en général et pourquoi utiliser ou non des points-virgules.
Lorsque vous compilez le programme, il y a plusieurs étapes avant que votre fichier source ne soit transformé en code exécutable, l'une des premières étant la lecture et analyse . Pendant l'analyse, votre code est transformé d'une séquence de caractères en une représentation structurée selon la grammaire de la langue. Pour cela, il est nécessaire que les éléments qui composent votre code (variables, constantes, déclarations, etc.) soient en quelque sorte identifiés et séparés. Lorsque vous faites une déclaration comme:
int someNumber = 0;
C'est juste une séquence de caractères qui doit en quelque sorte être tournée vers le concept "créer une 'chose' appelée someNumber
de type int
et assigner 0
à lui ".
Cela nécessite d'identifier exactement où commence et se termine l'instruction. Imaginez si vous aviez ceci:
int someNumber = 0;
int otherNumber = 1;
Il faudrait savoir que ce sont deux déclarations différentes. Le ;
dans les langages de type C est utilisé pour cela, donc l'analyseur lit les caractères jusqu'à ce qu'il en trouve un, et tente de comprendre ce qui vient d'être lu comme une seule instruction. Cela permet, comme l'a dit Robert, d'avoir plusieurs déclarations sur la même ligne, comme:
int someNumber = 0; int otherNumber = 1;
Ce qui a exactement le même effet que de les écrire sur deux lignes.
Dans d'autres langues, comme Python , vous devez mettre chaque instruction sur une ligne différente.
x = 3
if x < 10:
print 'x smaller than 10'
else:
print 'x is bigger than 10 or equal'
Il n'est donc pas nécessaire d'ajouter un ;
, car le langage lui-même vous empêche d'ajouter des instructions sur la même ligne!
Pourtant, d'autres langages, comme LISP ou Scheme , ont une manière très différente de grouper les instructions (ok, ce ne sont pas vraiment des instructions, mais ignorons cela pour l'instant). Vous n'avez donc que des parenthèses pour tout:
(define (do-stuff x)
(begin
(display (format "value: ~a" x))
x))
Encore une fois, vous n'avez pas besoin du ;
simplement parce que vous utilisez les mêmes symboles ()
, (
) pour les choses qui dans d'autres langues sont {
, }
, :
, etc. Quelqu'un qui ne connaît que la syntaxe LISP pourrait vous demander: Pourquoi avez-vous besoin de ;
à la fin de vos déclarations?
Juste pour ajouter un exemple plus étrange: OCaml a non seulement un point-virgule à la fin des instructions ... il en a deux!
let rec fact x =
if x <= 1 then 1 else x * fact (x - 1);;
Pourquoi? Je ne sais pas. :)
Différentes langues sont conçues avec des objectifs différents et des philosophies différentes. Si toutes les langues partageaient la même syntaxe et les mêmes conventions, elles ne vous permettraient probablement de faire les mêmes choses de la même manière.
Les sauts de ligne sont utilisés à la place des points-virgules pour délimiter la fin d'une instruction.
Dans Guide de langue: les bases il dit:
Contrairement à de nombreuses autres langues, Swift ne vous oblige pas à écrire un point-virgule (;) après chaque instruction dans votre code, bien que vous puissiez le faire si vous le souhaitez. Des points-virgules sont cependant requis si vous souhaitez écrire plusieurs instructions distinctes sur une seule ligne.
Pourquoi? Parce que c'est ainsi que les concepteurs de langage voulaient le faire.
La deuxième phrase ci-dessus indique pourquoi vous n'avez pas besoin de points-virgules; la plupart des instructions sont une seule ligne. Observez cet exemple de tri par bulles; la combinaison d'instructions sur une seule ligne et sans point-virgule permet une syntaxe très propre qui ressemble à VB, mais moins verbeuse:
func bubbleSort<T:Comparable>(inout list:[T]) {
var done = false
while !done {
done = true
for i in 1..<list.count {
if list[i - 1] > list[i] {
(list[i], list[i - 1]) = (list[i - 1], list[i])
done = false
}
}
}
}
Étant donné que les instructions entre Swift se terminent généralement par un saut de ligne, le besoin de points-virgules pour marquer la fin d'une instruction est réduit. Les autres langues utilisant des points-virgules ne fonctionnent pas de cette façon; vous pouvez écrire librement des instructions sur plusieurs lignes, mais le seul moyen pour le compilateur de savoir que l'instruction est terminée est lorsque vous placez votre point-virgule à la fin.
Lorsque les instructions ne se terminent pas sur un saut de ligne, vous devez placer le saut de ligne à un endroit que le compilateur Swift peut reconnaître comme une continuation de la ligne précédente:
let s2 = str
.lowercaseString
.replace("hello", withString: "goodbye")