4 puntos por GN⁺ 2024-09-07 | 1 comentarios | Compartir por WhatsApp

Rust

  • Rust es un lenguaje muy querido, rápido y con una gran comunidad
  • Rust introduce el concepto de ownership para resolver los problemas de gestión de memoria
  • Proporciona utilidades como Rc, Arc y Cow para soportar conteo de referencias y "clone-on-write"
  • Cuando se necesita trabajo de más bajo nivel, se puede usar el sistema unsafe para acceder a punteros C crudos
  • Rust tiene varias características de los lenguajes funcionales, como enumeraciones etiquetadas, expresiones match, funciones de primera clase y un sistema de tipos potente
  • Usa un compilador basado en LLVM, por lo que puede compilarse a código nativo y a WASM

Swift

  • También he usado Swift durante varios años, y al aprender Rust encontré similitudes con Swift
  • Swift también tiene características de los lenguajes funcionales, como enumeraciones etiquetadas, expresiones match y funciones de primera clase
  • Swift usa tipos por valor por defecto y tiene semántica de "copy-on-write"
  • Cuando se necesita más rendimiento, se puede elegir el sistema de ownership para "mover" valores
  • Cuando se necesita trabajo de más bajo nivel, se puede usar el sistema unsafe para acceder a punteros C crudos
  • Swift también usa un compilador basado en LLVM, por lo que puede compilarse a código nativo y a WASM

¿Déjà vu?

  • Swift y Rust tienen conjuntos de funciones muy similares
  • La gran diferencia está en la perspectiva
  • La diferencia se vuelve clara al considerar el modelo de memoria base

Rust es top-down, Swift es bottom-up

  • Rust comienza como un lenguaje de sistemas de bajo nivel y ofrece herramientas para subir a un nivel más alto
  • Swift comienza como un lenguaje de alto nivel y ofrece herramientas para bajar a un nivel más bajo
  • El modelo de gestión de memoria es el ejemplo más claro
  • Swift usa tipos por valor por defecto y tiene semántica de "copy-on-write"
  • Rust facilita el uso de valores "moved" y "borrowed", pero usar valores Cow requiere trabajo adicional
  • Swift facilita el uso de valores con "copy-on-write", pero en cambio requiere trabajo adicional al usar borrowing y moves
  • Rust es más rápido por defecto, y Swift es más simple y fácil por defecto

Swift oculta las ideas de Rust en una sintaxis similar a C

  • La sintaxis de Swift oculta conceptos de lenguajes funcionales dentro de una sintaxis parecida a C, lo que hace que los desarrolladores la adopten con facilidad
  • Comparación entre la sentencia match de Rust y la sentencia switch de Swift
  • La sentencia switch de Swift en realidad es igual a una expresión match, pero tiene otro nombre y otra sintaxis
  • Swift permite agregar métodos directamente a un enum

Tipos opcionales

  • Rust no tiene null, pero sí tiene None
  • Swift tiene nil, pero en realidad es lo mismo que None
  • Swift usa T? en lugar de Option, y obliga al compilador a verificar que no sea nil
  • En Swift es fácil usar tipos opcionales

Manejo de errores

  • Rust no tiene try-catch, pero usa el tipo Result
  • Swift usa do-catch en lugar de try-catch, y exige usar try antes de llamar a una función
  • El manejo de errores de Swift es similar al de Rust, pero está oculto detrás de una sintaxis más familiar

El compilador de Rust detecta problemas, y el compilador de Swift resuelve algunos problemas

  • El compilador de Rust detecta muchos problemas comunes en tiempo de compilación y sugiere soluciones
  • Ejemplo de una enumeración autorreferencial
  • Swift usa la palabra clave indirect para marcar tipos recursivos, y el compilador se encarga del resto

Swift es menos "puro"

  • Swift fue diseñado para reemplazar Objective-C, y tenía que poder interactuar con código existente
  • Swift tomó muchas decisiones prácticas y es un lenguaje más grande que Rust
  • Swift fue diseñado pensando en la "divulgación progresiva", de modo que mientras más aprendes del lenguaje, más funciones se revelan
  • Algunas características del lenguaje en Swift:
    • clases / herencia
    • async-await
    • async-sequences
    • actors
    • getters y setters
    • lazy properties
    • property wrappers
    • Result Builders (por ejemplo: HTML / SwiftUI)

El costo de la conveniencia

  • Swift es un lenguaje más fácil para empezar y volverse productivo
  • La sintaxis es más familiar y muchas tareas se manejan automáticamente
  • Swift es un lenguaje de más alto nivel, y eso implica los mismos trade-offs
  • Por defecto, los programas en Rust son mucho más rápidos que los programas en Swift
  • Rust es rápido por defecto y te permite volverlo lento, mientras que Swift es fácil por defecto y te permite volverlo rápido
  • Ambos lenguajes tienen sus propios usos
    • Rust es más adecuado para programación de sistemas y embebida
    • Swift es más adecuado para escribir UI y servidores
  • Se espera que con el tiempo la superposición entre ambos lenguajes crezca aún más

Resumen de GN⁺

  • Este artículo compara y explica las similitudes y diferencias entre Swift y Rust
  • Swift toma prestadas muchas ideas de Rust y las ofrece con una sintaxis más familiar
  • Ambos lenguajes tienen fortalezas y usos propios, y se espera que con el tiempo aparezca aún más superposición entre ellos
  • Ayuda a entender las diferencias en varios aspectos, como el modelo de gestión de memoria, el manejo de errores y los tipos opcionales en Swift y Rust
  • Entre los lenguajes con funciones similares están Kotlin y TypeScript

1 comentarios

 
GN⁺ 2024-09-07
Comentarios de Hacker News
  • A quienes usan Rust por primera vez les gusta Rust porque es su primer contacto con lenguajes de la familia ML

    • Rust ofrece una comunidad familiar para los hackers de Unix
  • Rust es el primer lenguaje que llevó al mainstream la gestión automática de memoria sin GC

    • También existen alternativas como Swift, OCaml y Scala
  • La era de Smalltalk terminó; ahora es la era de ML

    • Los lenguajes de los 2000 derivan de Smalltalk
    • Los lenguajes nuevos pertenecen a la familia ML
    • Si aprendes Scala, también puedes aprender Rust o Swift con facilidad
  • Al integrar Rust en una app de iOS hecha en Swift, dieron ganas de usar más Swift

    • Swift puede usarse de forma multiplataforma, pero está orientado principalmente a las plataformas de Apple
    • Rust tiene varios sistemas de paquetes
    • Los paquetes de Swift a menudo dependen de APIs del sistema operativo, así que no funcionan en Linux o WASM
    • Hay casos como el de IBM, que abandonó Swift en el servidor
  • Rust introdujo el concepto de ownership para resolver problemas de gestión de memoria, pero no fue quien lo inventó

    • Lenguajes como Cyclone influyeron en ello
  • Rust y Swift tienen fortalezas distintas

    • Swift tiene una sintaxis más concisa, pero algunas áreas dependen del compilador
    • Fuera del ecosistema de Apple, Swift es un lenguaje de segunda o tercera prioridad
    • Si esto no se resuelve, Swift seguirá siendo principalmente un lenguaje para Apple
  • Las herramientas de Swift son más incómodas que las de Rust

    • Xcode no es compatible con una MacBook Air 2018 que usa macOS 12
    • SourceKit-LSP es tratado como una herramienta de segunda prioridad
    • Rust 1.81 y rust-analyzer funcionan bien
  • Intentaron aprender Rust, pero les costó porque los ejemplos eran demasiado complejos

    • El código de ejemplo en el sitio web de Rust es complicado
  • En Swift se pueden agregar métodos directamente a los enums

    • En Rust también se puede hacer lo mismo
  • Swift usa tipos por valor por defecto y semántica copy-on-write

    • Esto solo aplica a arrays, diccionarios y strings
    • Los tipos por valor de Swift se copian de inmediato
  • Cada vez que leen elogios sobre Swift, se preguntan cómo es la experiencia de quienes desarrollan sin usar el ecosistema de Apple/macOS

    • Nunca han conocido a un desarrollador de Swift que no use macOS
    • Importan no solo la librería estándar, sino también las herramientas, el LSP, las librerías y los tutoriales
    • Creen que Swift es un buen lenguaje, pero parece serlo solo en macOS
  • Se preguntan si son la única persona a la que no le gusta la sintaxis con punto de Zig y Swift

    • .variant vs Type::Variant
    • En código suficientemente largo o complejo, sería incómodo si el nombre del tipo no está cerca
    • Especialmente en editores sin funciones como las de un IDE