¿Por qué Swift no requiere punto y coma? [cerrado]

20

Normalmente codifico en c # o Objective-C y recientemente me encargué de aprender el nuevo lenguaje de programación de Apple: Swift.

Lo primero que noté es que no necesita agregar punto y coma para terminar una línea en Swift, pero si lo hace, al menos por lo que he probado, no interfiere con el compilador.

Cuando yo escribo:

int someNumber = 0;

en Objective-C, el punto y coma le dice al programa que la línea ha terminado y que no debe pasar a la línea siguiente.

Con Swift puedo declarar una variable con

var someNumber:Int = 5

y no agrega un punto y coma y el sistema sabe que este es el final de la línea.

¿Qué permite que algunos idiomas hagan esto y otros no? ¿Por qué no mantener un sistema uniforme de agregar el punto y coma al final?

Memj
fuente
No todos provienen de otros idiomas, entonces, ¿cómo podrían saber que no son uniformes? ¿Apple no atraerá a más programadores nuevos con Swift al deshacerse de las partes de Objective-C que a muchas personas no les gustan?
JeffO
2
Muchos veterinarios de Obj-C no están contentos con Swift y prefieren Obj-C. Esto se puede ver a través de los foros de Apple. Swift solo salió en 2014 y si COMPLETO de errores y cambios se realizan cada pocos meses al idioma con Swift2.0 que saldrá este otoño. Swift se basa en Obj-C, pero tiene como objetivo hacer que la codificación sea más fácil de aprender con un inglés más simple.
Memj
Los implementadores de compiladores antiguos eran simplemente vagos y / o tenían que ser más eficientes con un análisis más simple. Ya no hay necesidad de esto. Es lo mismo que la inferencia de tipo local, no la tiene solo si su compilador es flojo y no le importa la experiencia del desarrollador.
Ebuall

Respuestas:

18

¿Qué permite que algunos idiomas hagan esto y otros no? ¿Por qué no mantener un sistema uniforme de agregar el punto y coma al final?

Robert dio una buena respuesta con respecto a Swift, intentaré agregar un poco más sobre el análisis en general y por qué usar o no punto y coma.

Cuando compila el programa, hay varios pasos antes de que su archivo fuente se convierta en código ejecutable, uno de los cuales es leer y analizar . Durante el análisis, su código se transforma de una secuencia de caracteres en una representación estructurada de acuerdo con la gramática del lenguaje. Para esto es necesario que los elementos que componen su código (variables, constantes, declaraciones, etc.) se identifiquen y separen de alguna manera. Cuando haces una declaración como:

int someNumber = 0;

Es solo una secuencia de personajes que de alguna manera necesita ser dirigida al concepto "crear una 'cosa' llamada someNumberde tipo inty asignarla 0" .

Esto requiere identificar exactamente dónde comienza y termina la declaración. Imagina si tuvieras esto:

int someNumber = 0;
int otherNumber = 1;

Necesitaría saber que esas son dos declaraciones diferentes. El ;en C-como idiomas se utiliza para eso, por lo que el analizador lee los caracteres hasta que encuentra uno, y los intentos de comprender lo que acaba de leer como un solo estado. Esto permite, como dijo Robert, tener varias declaraciones en la misma línea, como:

int someNumber = 0; int otherNumber = 1;

Lo que tiene exactamente el mismo efecto que escribirlos en dos líneas.

En otros lenguajes, como Python , se espera que coloque cada declaración en una línea diferente.

x = 3
if x < 10:
   print 'x smaller than 10'
else:
   print 'x is bigger than 10 or equal'

Por lo tanto, no hay necesidad de agregar un ;, ¡porque el lenguaje en sí mismo le impide agregar declaraciones en la misma línea!

Sin embargo, otros idiomas, como LISP o Scheme , tienen una forma muy diferente de agrupar enunciados (está bien, en realidad no son enunciados, pero ignoremos eso por ahora). Entonces solo tienes paréntesis para todo:

(define (do-stuff x)
  (begin
    (display (format "value: ~a" x))
    x))

Una vez más, no es necesario el ;sólo porque se utilizan los mismos símbolos ( ), () para las cosas que están en otros idiomas {, },: , etc. Alguien que sólo conoce la sintaxis Lisp podría preguntar: ¿Por qué necesita ;al final de sus declaraciones ?

Solo para agregar un extraño ejemplo: OCaml no solo tiene un punto y coma al final de las declaraciones ... ¡tiene dos!

let rec fact x =
    if x <= 1 then 1 else x * fact (x - 1);;

¿Por qué? No lo sé. :)

Se diseñan diferentes idiomas con diferentes propósitos y diferentes filosofías. Si todos los idiomas compartieran la misma sintaxis y convenciones, probablemente solo le permitirían hacer las mismas cosas de la misma manera.

Sebastian
fuente
44
Buena oración de cierre.
Thomas Eding
Buenos ejemplos, pero no respondiste la pregunta.
Robo Robok
Punto de datos adicional: algunos lenguajes adoptan una especie de enfoque inverso a la familia de estilo C: por ejemplo, HyperTalk usa saltos de línea como el extremo rígido de una línea (en lugar de punto y coma) y requiere saltos de línea de escape si desea continuar una declaración sobre varias lineas. Curiosamente, el propio preprocesador de C también funciona de esa manera.
uliwitness
11

Los saltos de línea se utilizan en lugar de punto y coma para delimitar el final de una declaración.

En la guía de idiomas: Lo básico dice:

A diferencia de muchos otros idiomas, Swift no requiere que escriba un punto y coma (;) después de cada declaración en su código, aunque puede hacerlo si lo desea. Sin embargo, se requieren puntos y comas si desea escribir varias declaraciones separadas en una sola línea.

¿Por qué? Porque así es como los diseñadores de idiomas querían hacerlo.

La segunda oración anterior sugiere por qué no necesita punto y coma; La mayoría de las declaraciones son de una sola línea. Observe este ejemplo de Bubble Sort; La combinación de sentencias de una sola línea y sin punto y coma crea una sintaxis muy limpia que es similar a VB, pero menos detallada:

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
            }
        }
    }
}

Debido a que las declaraciones en Swift generalmente terminan en un salto de línea, se reduce la necesidad de punto y coma para marcar el final de una declaración. Otros idiomas que usan punto y coma no funcionan de esta manera; puede escribir libremente declaraciones de varias líneas, pero la única forma en que el compilador sabe que la declaración ha terminado es cuando coloca el punto y coma al final de la misma.

Cuando las declaraciones no terminan en un salto de línea, debe colocar el salto de línea en un lugar que el compilador Swift pueda reconocer como una continuación de la línea anterior:

let s2 = str
        .lowercaseString
        .replace("hello", withString: "goodbye")
Robert Harvey
fuente
2
La última declaración es falsa, no hay una ubicación específica para colocar saltos de línea. Es bueno mantener sus líneas de código sangradas y alineadas para mejorar la legibilidad.
Eneko Alonso
Dato curioso: esto tiene un efecto negativo en los informes de errores. Muchos compiladores de C (clang es especialmente bueno en eso) usan punto y coma para encontrar el final de una declaración con un error de sintaxis y pueden usar esa información para, por ejemplo, informar paréntesis de cierre faltantes más cerca de donde realmente faltan. Al carecer de punto y coma, cometer un error en Swift a menudo puede hacer que la siguiente línea se contraiga en su predecesor que contiene errores y conduzca a mensajes de error realmente extraños.
uliwitness