Pourquoi Swift n'a pas besoin de points-virgules? [fermé]

20

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 dans Swift mais si vous le faites - du 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 de ne pas le faire? Pourquoi ne pas garder un système uniforme pour ajouter le point-virgule à la fin?

Memj
la source
Tout le monde ne vient pas d'autres langues, alors comment pourraient-ils même savoir qu'ils ne sont pas uniformes? Apple n'attirera-t-il pas plus de nouveaux programmeurs avec Swift en se débarrassant des parties Objective-C que beaucoup de gens n'aiment pas?
JeffO
2
Beaucoup de vétérinaires Obj-C sont mécontents de Swift et préfèrent de loin Obj-C. Cela peut être vu sur les forums Apple. Swift n'est sorti qu'en 2014 et si PLEIN de bugs et de changements sont apportés tous les quelques mois au langage avec Swift2.0 qui sortira cet automne. Swift est basé sur Obj-C mais vise à rendre le codage plus facile à apprendre avec un anglais plus simple.
Memj
Les anciens implémenteurs de compilateur étaient simplement paresseux et / ou devaient être plus efficaces avec une analyse plus simple. Il n'y a plus besoin de cela. C'est la même chose que l'inférence de type locale, vous ne l'avez pas seulement si votre rédacteur de compilateur est paresseux et ne se soucie pas de l'expérience du développeur.
Ebuall

Réponses:

18

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 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 l' 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 someNumberde type intet lui assigner 0" .

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 ;langage en 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 langages, comme Python , vous devez placer 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 façon très différente de regrouper 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 ;juste parce que vous utilisez les mêmes symboles ( ), () pour des choses qui dans d' autres langues sont {, }, :, etc. Quelqu'un qui ne connaît que la syntaxe Lisp peut vous demander: Pourquoi avez - vous besoin ;à 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 que de faire les mêmes choses de la même manière.

Sébastien
la source
4
Bonne phrase de clôture.
Thomas Eding
De bons exemples, mais vous n'avez pas répondu à la question.
Robo Robok
Point de données supplémentaire: certains langages adoptent une sorte d'approche inverse de la famille de style C: par exemple, HyperTalk utilise des sauts de ligne comme extrémité dure d'une ligne (au lieu des points-virgules) et nécessite des sauts de ligne d'échappement si vous souhaitez continuer une instruction sur plusieurs lignes. Curieusement, le propre préprocesseur de C fonctionne également de cette façon.
uliwitness
11

Les sauts de ligne sont utilisés à la place des points-virgules pour délimiter la fin d'une instruction.

Dans le guide linguistique: 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. Les points-virgules sont toutefois 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 sur une seule ligne. Observez cet exemple de tri de bulles; la combinaison d'instructions sur une seule ligne et pas de 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 dans 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 de celui-ci.

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")
Robert Harvey
la source
2
La dernière déclaration est fausse, il n'y a pas d'emplacement spécifique pour placer des sauts de ligne. Il est bon de garder vos lignes de code en retrait et alignées pour améliorer la lisibilité.
Eneko Alonso
Fait amusant: cela a un effet d'entraînement sur le rapport d'erreurs. De nombreux compilateurs C (clang est particulièrement bon dans ce domaine) utilisent des points-virgules pour trouver la fin d'une instruction avec une erreur de syntaxe et peuvent utiliser ces informations pour, par exemple, signaler des parenthèses fermantes manquantes plus près de l'endroit où elles sont réellement manquantes. En l'absence de points-virgules, commettre une erreur dans Swift peut souvent entraîner la contraction de la ligne suivante dans son prédécesseur contenant des erreurs et conduire à des messages d'erreur vraiment étranges.
uliwitness