IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langages de programmation Discussion :

Un développeur parvient à faire fonctionner du code Swift sur Android


Sujet :

Langages de programmation

  1. #1
    Chroniqueur Actualités

    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2014
    Messages
    1 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 1 089
    Points : 26 554
    Points
    26 554
    Par défaut Un développeur parvient à faire fonctionner du code Swift sur Android
    Un développeur parvient à faire fonctionner du code Swift sur Android
    en attendant la sortie de Swift sous licence open source

    Depuis la sortie de Swift, le nouveau langage de développement d’Apple, nombreux sont ceux qui ont tourné le dos à Objective-C. Étant considéré comme le successeur de ce dernier, Swift a gravi les échelons dans les classements et fait l’objet d’apprentissage de la part de nombreux développeurs.

    Aussi, pour ouvrir son langage à plus de contributeurs, Apple a annoncé à la dernière conférence WWDC 2015 que Swift allait passer au format open source d’ici la fin de l’année. Communiqué qui a renforcé l’attrait des développeurs vers ce langage considéré par Apple comme le prochain grand langage de programmation qui servira à créer des applications et faire la programmation système pendant les 20 années à venir.

    En attendant la sortie de Swift sous licence open source, un développeur s’est lancé dans un exercice assez intéressant et est parvenu à faire tourner du code Swift sur Android. Pour y arriver, ce dernier a été aidé par les caractéristiques intrinsèques de Swift.

    Il faut rappeler que Swift a été construit afin d’être compatible avec l’environnement de développement intégré (EDI) Xcode. Dans cet EDI, le compilateur utilisé est la machine virtuelle de bas niveau LLVM (Low Level Virtual Machine). Une des particularités de ce compilateur est qu’il permet de créer un générateur de code pour plusieurs types d’architectures et des optimiseurs de compilation indépendants de la plate-forme sur laquelle et de tout langage.

    Ainsi donc, au lieu de générer du code ciblant une architecture spécifique, LLVM génère d’abord du code assembleur, puis convertit ce dernier afin qu’il soit utilisé sur l’architecture souhaitée. En profitant de cette caractéristique modulaire, le développeur est parvenu à réutiliser le code binaire généré avec Swift afin de l’utiliser sur Android. Pour ce faire, il est passé par les différentes étapes suivantes :

    Code du fichier Hello World
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // hello.swift
    print("Hello, world!");

    Instruction pour compiler le fichier Hello World
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ $SDK/usr/bin/swiftc -emit-object hello.swift

    Contenu du fichier objet compilé hello.o
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    $ nm hello_swift.o
                     U __TFSSCfMSSFT21_builtinStringLiteralBp8byteSizeBw7isASCIIBi1__SS
                     U __TFSs27_allocateUninitializedArrayurFBwTGSaq__Bp_
                     U __TFSs5printFTGSaP__9separatorSS10terminatorSS_T_
                     U __TIFSs5printFTGSaP__9separatorSS10terminatorSS_T_A0_
                     U __TIFSs5printFTGSaP__9separatorSS10terminatorSS_T_A1_
    0000000000000140 S __TMLP_
    0000000000000100 S __TMaP_
                     U __TMdSS
                     U __TZvOSs7Process11_unsafeArgvGVSs20UnsafeMutablePointerGS0_VSs4Int8__
                     U __TZvOSs7Process5_argcVSs5Int32
                     U _globalinit_33_1BDF70FFC18749BAB495A73B459ED2F0_func6
                     U _globalinit_33_1BDF70FFC18749BAB495A73B459ED2F0_token6
    0000000000000000 T _main
                     U _swift_getExistentialTypeMetadata
                     U _swift_once
    Ensuite, il a fourni le code objet à l’éditeur de liens afin de générer l’exécutable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ ld -arch x86_64 -o hello hello.o
         -L$SDK/usr/lib/swift/macosx
         -lSystem -lswiftCore
    
    $ DYLD_LIBRARY_PATH=$SDK/usr/lib/swift/macosx ./hello
    Hello, world!
    Il faut souligner que lorsque le compilateur Swift effectue la compilation, il génère dans un premier temps une représentation intermédiaire du code Swift, puis traduit cette représentation intermédiaire en code machine x86_64.

    En continuant, le développeur a généré un fichier ARM qui est le format binaire utilisé sur Android. Voici le code utilisé pour générer le code binaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $SDK/usr/bin/swiftc
      -parse-as-library # We don't need a "main" function
      -target armv7-apple-ios9.0
      -emit-ir
      add.swift
      | grep -v "^!" # Filter-out iOS metadata
      > add.ll
    À partir du code intermédiaire obtenu, le développeur a généré un fichier objet ARM ELF en s’appuyant sur le compilateur statique dans LLVM. Voici le code exécuté pour obtenir le fichier objet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $NDK/toolchains/llvm-3.5/prebuilt/darwin-x86_64/bin/llc
      -mtriple=armv7-none-linux-androideabi
      -filetype=obj
      add.ll

    Enfin, il a créé un package pour être utilisé dans une application Android. Pour cela, il a utilisé le framework Java JNI Bridge et écrit le code en C.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    // jni-bridge.c
    
    // Let's work around Swift symbol mangling
    #define SWIFT_ADD _TF3add13addTwoNumbersFTVSs5UInt86secondS0__S0_
    
    uint8_t SWIFT_ADD(uint8_t, uint8_t);
    
    jstring jni_bridge(JNIEnv * env, jobject thiz ) {
      uint8_t a = 123;
      uint8_t b = 45;
      uint8_t c = SWIFT_ADD(a,b);
    
      char result[255];
      sprintf(result, "The result is %d", c);
    
      return (*env)->NewStringUTF(env, result);
    }
    Le tout a été regroupé dans une bibliothèque partagée et finalement le fichier objet a été compilé dans une application Android.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $NDK_GCC/bin/arm-linux-androideabi-ld
      add.o
      jni_bridge.o
      -shared # Build a shared library
      -lc # We'll need the libc
      -L$NDK/platforms/android-13/arch-arm/usr/lib
    Ci-dessous le résultat final sur Android.

    Nom : demo.png
Affichages : 6111
Taille : 19,8 Ko

    Il est bon de savoir que le code Swift utilisé sur Android ne requiert pas de bibliothèque Swift pour être exécuté, d’où la relative facilité dans sa mise en œuvre. Pour ceux qui souhaitent tirer profit de cette application, l’auteur du projet l’a mise à la disposition du public sur GitHub.

    Télécharger la démo de l'application Hello World sur GitHub

    Source : Page de présentation du projet

    Et vous ?

    Que pensez-vous de ce projet ?

    Voir aussi

    Forum langages de programmation
    Contribuez au club : Corrections, suggestions, critiques, ... : Contactez le service news et Rédigez des actualités

  2. #2
    Membre émérite
    Avatar de Voyvode
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 476
    Points : 2 678
    Points
    2 678
    Par défaut
    Intéressant mais inutile, selon l’avis même de l’auteur :
    • Le processus requiert l’usage du NDK, déconseillé par Google pour créer une application.
    • La bibliothèque principale SwiftCore n’existe pas sous Android.

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2015
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2015
    Messages : 99
    Points : 110
    Points
    110
    Par défaut
    pourquoi inutile ? Il a réussi a faire une chose extra et vous dites inutile

  4. #4
    Membre émérite
    Avatar de Voyvode
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 476
    Points : 2 678
    Points
    2 678
    Par défaut
    Ce n’est pas moi qui le dit, c’est dans la conclusion de l’auteur.
    Citation Envoyé par Romain Goyet
    That was fun, but is of course useless:

    • Generally speaking, the NDK makes sense only for a small percentage of apps, so in the general case Google advises against trying to write a whole Android app using the NDK.
    • And of course since we're missing the SwiftCore library this is restricted to a small subset of Swift.

  5. #5
    Membre éprouvé
    Avatar de Aooka
    Homme Profil pro
    Scripting Powershell & Wlangage
    Inscrit en
    Juillet 2015
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Scripting Powershell & Wlangage

    Informations forums :
    Inscription : Juillet 2015
    Messages : 227
    Points : 1 095
    Points
    1 095
    Par défaut
    Stylé, mais c'est sûr sa ne sert à rien !

  6. #6
    Traductrice
    Avatar de Mishulyna
    Femme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2008
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 504
    Points : 7 840
    Points
    7 840
    Par défaut
    Le problème de Swift c'est que la syntaxe change toutes les six mois, sans aucune préoccupation pour la rétrocompatibilité. J'étais en train de faire la traduction des mises à jour de certains tutoriels Swift, des relecteurs techniques les ont relus, des relecteurs orthographiques les ont corrigés et PAN ! Certainement, encore des "?" remplacés par des "!" ou vice-versa.

    Si cela restera ainsi "pendant les 20 années à venir", je plains les développeurs Swift ! Afficher "Hello World!" sur un écran ce n'est pas vraiment la plus poussée des applications.
    Chaque fois que tu dis "je ne peux pas", n'oublie pas d'ajouter le mot "encore".

  7. #7
    Membre émérite
    Avatar de Voyvode
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 476
    Points : 2 678
    Points
    2 678
    Par défaut
    @Mishulyna
    Un exemple en tête ? Je suis curieux de savoir.

    Swift m’intéresse, mais un avis éclairé m’intéresse tout autant.

  8. #8
    Traductrice
    Avatar de Mishulyna
    Femme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2008
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 504
    Points : 7 840
    Points
    7 840
    Par défaut
    Il me serait impossible de donner un avis "éclairé", car je ne développe pas en Swift. Je peux juste donner deux exemples de code tirés d'un tutoriel, "avant" et "après" une de ces modifications du langage.

    2014 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) {
        // Obtenir les données pour la ligne sélectionnée
        var rowData: NSDictionary = self.tableData[indexPath.row] as NSDictionary
        
        var name: String = rowData["trackName"] as String
        var formattedPrice: String = rowData["formattedPrice"] as String
    
        var alert: UIAlertView = UIAlertView()
        alert.title = name
        alert.message = formattedPrice
        alert.addButtonWithTitle("Ok")
        alert.show()
    }
    2015 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        // Obtenir les données pour la ligne sélectionnée
        if let rowData = self.tableData[indexPath.row] as? NSDictionary,
    
            // Obtenir le nom du morceau pour cette ligne
            name = rowData["trackName"] as? String,
            
            // Obtenir le prix de l'item iTunes pour cette ligne
            formattedPrice = rowData["formattedPrice"] as? String {
                let alert = UIAlertController(title: name, message: formattedPrice, preferredStyle: .Alert)
                alert.addAction(UIAlertAction(title: "Ok", style: .Default, handler: nil))
                self.presentViewController(alert, animated: true, completion: nil)
        }
    }
    Sans y connaître grand-chose, je vois que des points d'exclamations ont disparu et des points interrogation ont été ajoutes. Des mots clé "var" ont disparu, des "let" sont apparus. Et il paraît que des nouveaux changements se sont produits récemment.

    Je ne dis pas que Swift n'est pas un langage intéressant et puissant, mais j'ai l'impression qu'on le modifie trop souvent, "pour refléter les changements de Xcode x.x". J'ignore s'il existe beaucoup de langages qui changent suite aux modifications apportées à l'IDE.
    Chaque fois que tu dis "je ne peux pas", n'oublie pas d'ajouter le mot "encore".

  9. #9
    Membre émérite
    Avatar de Voyvode
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 476
    Points : 2 678
    Points
    2 678
    Par défaut
    Désolé d’avoir mis autant de temps à te répondre alors que tu t’es donné la peine de rédiger une réponse intéressante.

    Après feuilletage des différentes versions du guide et furetage sur quelques blogs, je n’ai pas remarqué de grands changements dans la syntaxe de Swift. L’exemple que tu montres a tout simplement été réécrit par l’auteur.

    En quelques points :
    • L’ancienne version de l’exemple avait une approche uniquement impérative, alors que la nouvelle version a une approche plus fonctionnelle. L’auteur a probablement fait ce choix pour mieux illustrer les possibilités de Swift et être plus en adéquation avec la philosophie du langage.
    • Il y a aussi surement eu un changement dans la bibliothèque de composant graphique UIKit dans iOS 9 qui permet d’utiliser cette approche fonctionnelle, mais cela ne concerne pas Swift à proprement parler.
    • var, let, ? et ! existent depuis le début.
    • La combinaison as? est la seule véritable nouveauté, introduite dans Swift 1.2 (avril 2015), mais ce nouvel élément de syntaxe ne casse rien d’ancien.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    735
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 735
    Points : 807
    Points
    807
    Par défaut
    Il y a très longtemps que Remobjects utilise Swift sous dotent ou sur la plate-forme android
    http://www.elementscompiler.com/elements/

  11. #11
    Membre extrêmement actif Avatar de ddoumeche
    Homme Profil pro
    Ingénieur recherche et développement
    Inscrit en
    Octobre 2007
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Singapour

    Informations professionnelles :
    Activité : Ingénieur recherche et développement

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 676
    Points : 2 009
    Points
    2 009
    Par défaut
    Effectivement la syntaxe de Swift fait un peur à voir.
    J'imagine que c'est néanmoins un progrès par rapport à Objective-C ?
    La joie de l'âme est dans la planification -- Louis Hubert Liautey

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Novembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2015
    Messages : 4
    Points : 6
    Points
    6
    Par défaut
    C'est vrai que le format change beaucoup trop, en ce moment j'essaye d’apprendre le swift mais c'est difficile car quand je cherche une solution a un problème je tombe sur 24 syntaxes différentes... Non pour moi le swift a été sorti AVANT d'être terminé ^^ désolé mais je ne trouve pas normal que quand je fait :
    var a: String[4]
    le compilateur me dit : "Fixed-length arrays are not yet supported" ... Que ce soit pas possible en swift pourquoi pas mais pas encore supporté non quoi ...

  13. #13
    Chroniqueur Actualités

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2013
    Messages
    8 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Mars 2013
    Messages : 8 449
    Points : 197 690
    Points
    197 690
    Par défaut Bientôt le portage de Swift sur Android sera-t-il effectif ?
    Bientôt le portage de Swift sur Android sera-t-il effectif ?
    Un contributeur présente « le premier exemple d'une compilation croisée à l'extérieur de Darwin »

    Le contributeur GitHub au pseudonyme modocache a publié un pull request à rajouter au projet de la version modifiée de Swift, le langage de programmation d'Apple, qui a été pensé pour Android. Le contributeur du projet note que la version multiplateforme est encore loin d'être idéale, mais, au fil du temps, les développeurs pourront compiler des applications directement sur les deux plateformes mobiles.

    Pour rappel, l'année dernière le contributeur zhuowei a commencé à travailler sur un portage de Swift sur Android : l'objectif final est de permettre aux développeurs d'écrire des applications Android en Swift. Un autre contributeur, William Dillon, a pour sa part commencé à travailler sur le support des appareils à architecture ARMv7, comme le Raspberry Pi et les processeurs Nvidia Tegra.

    Ce pull request « est le premier exemple d'une compilation croisée à l'extérieur de Darwin : une machine hôte Linux pensée pour cibler Android ».

    Pour les builds et les tests de cette variante Android de Swift, il propose cette invocation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ utils/build-script \
      -R \                                           # Build in ReleaseAssert mode.
      -T \                                           # Run all tests.
      --android \                                    # Build for Android.
      --android-deploy-device-path /data/local/tmp \ # Temporary directory on the device where Android tests are run.
      --android-ndk ~/android-ndk-r10e \             # Path to an Android NDK.
      --android-ndk-version 21 \
      --android-icu-uc ~/libicu-android/armeabi-v7a/libicuuc.so \
      --android-icu-uc-include ~/libicu-android/armeabi-v7a/icu/source/common \
      --android-icu-i18n ~/libicu-android/armeabi-v7a/libicui18n.so \
      --android-icu-i18n-include ~/libicu-android/armeabi-v7a/icu/source/i18n/
    « Les builds Android ont les dépendances suivantes, comme vous pouvez le voir dans l'invocation build-script :
    • un NDK Android à compter de la version 21, disponible en téléchargement ici  ;
    • un libicu compatible avec android-armv7. Vous pourrez concevoir le vôtre en clonant ceci et en exécutant le script build.sh dans ce dépôt
     », indique le contributeur.

    En décembre de l'année dernière, Apple a rendu son langage de programmation open source et son code est donc disponible sur GitHub pour accueillir les contributions. Depuis lors, il a été utilisé dans une variété de dépôts de plusieurs projets intéressants avec des outils supplémentaires à l'intention des développeurs.

    Apple a rendu publique la liste des propositions et requêtes des différents contributeurs pour informer la communauté des points qui ont déjà été le sujet d'une discussion et qui ont été rejetés comme :
    • remplacer les opérateurs logiques &&, ||, !, etc. avec des mots comme « and » , « or », « not » ;
    • réécrire le compilateur Swift en Swift ;
    • remplacer le mot clé continue avec des synonymes existants dans d’autres langages.


    Swift apporte plusieurs avantages, comme une syntaxe relativement commune à C, C++ et Java et par conséquent une facilité d'apprentissage. La courbe d'apprentissage pour un débutant sera donc réduite et celui-ci pourra alors plus vite concevoir une application pour les deux plateformes mobiles. C'est durant l'édition 2014 de sa conférence dédiée aux développeurs, la WWDC, qu'Apple a présenté ce langage qui voudrait se voir débarrassé de nombreux inconvénients associés à Objective-C.

    Source : dépôt GitHub

    Voir aussi :

    Apple rend open source sa suite d'outils de benchmarks Swift afin d'aider à mieux évaluer les performances du code des programmes Swift

    Swift open source, mais pas ouvert à toute proposition, la liste des requêtes peu susceptibles d'être acceptées a été publiée

    IBM lance IBM Swift Sandbox, un navigateur capable d'exécuter du code Swift en ligne
    Contribuez au club : Corrections, suggestions, critiques, ... : Contactez le service news et Rédigez des actualités

Discussions similaires

  1. Réponses: 17
    Dernier message: 15/06/2015, 15h48
  2. Réponses: 1
    Dernier message: 07/02/2012, 13h22
  3. Réponses: 6
    Dernier message: 18/08/2010, 09h13
  4. Réponses: 4
    Dernier message: 19/03/2009, 21h38
  5. [AJAX] Prérequis pour faire fonctionner ce code Ajax?
    Par Lex92 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 09/10/2008, 09h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo