Le code source de Mojođ„ a Ă©tĂ© partiellement rendu public, comme promis đ
Mojođ„, le nouveau langage de dĂ©veloppement crĂ©Ă© par Chris Lattner aprĂšs Swift imaginĂ© au sein dâApple, est open-source depuis la fin du mois de mars. CâĂ©tait en effet lâune des promesses de ce nouveau langage qui se veut tout aussi universel que lâĂ©tait Swift en partant dâune base de Python cette fois, avec les performances de C, un langage de bas niveau reconnu pour ses performances. La publication dâune partie de son code source permet Ă Mojođ„ de moins dĂ©pendre dâune seule entreprise, en lâoccurrence Modular spĂ©cialisĂ©e dans lâIA, mĂȘme si elle garde encore la main sur lâavenir du langage.
Le code source distribuĂ© sur GitHub comprend la « standard library » (bibliothĂšque standard) qui contient les briques fondamentales du langage, ainsi que la documentation et les propositions dâĂ©volution. Lâouverture permet Ă qui le souhaite de contribuer Ă sa maniĂšre, en ouvrant un nouveau ticket ou mĂȘme en effectuant une nouvelle contribution au code source. Une licence Apache 2 est associĂ©e au projet et Modular a publiĂ© lâhistorique de la standard library, soit un an de travail environ.
Il faut soulever que si câest une partie, certes importante, du langage qui est ouverte, ce nâest quâune partie et il reste de nombreux Ă©lĂ©ments clĂ©s qui sont encore propriĂ©taires, Ă commencer par le compilateur sans lequel on ne peut pas lâexploiter. Ă cet Ă©gard, la promesse est encore loin dâĂȘtre tenue, mĂȘme si cela viendra peut-ĂȘtre. Outre cette ouverture partielle du code source, une nouvelle version de Mojođ„ est dĂ©sormais distribuĂ©e chaque nuit pour ceux qui veulent ĂȘtre le plus Ă jour possible. Les informations pour rĂ©cupĂ©rer cette version « nightly » sont disponibles Ă cette adresse.
Mise Ă jour le 17/04/2024 13:56 : une premiĂšre version de lâarticle suggĂ©rait Ă tort que Mojođ„ Ă©tait entiĂšrement open-source dĂ©sormais, ce qui nâest pas le cas. Il a Ă©tĂ© mis Ă jour en consĂ©quence.
On prononce comment ? đ„
« Le code source de Mojođ„ a bien Ă©tĂ© rendu public »
Rectification importante : câest juste la bibliothĂšque standard qui vient de passer en opensource. Mais le compilateur, lui, ne lâest pas encore.
On ne peut donc pas dire que le code source du langage est public, et encore moins que son avenir « est plus assurĂ© dans le sens oĂč il ne dĂ©pend plus dâune seule entreprise » : pour lâinstant, si on veut programmer en Mojo, on dĂ©pend intĂ©gralement de Modular pour avoir un compilateur.
@BeePotato
En effet, il m'a semblé en l'écrivant qu'il manquait un morceau, mais je ne me suis pas suffisamment méfié. Je vais reprendre la news, merci pour la rectification.
> avec les performances de C, un langage de bas niveau reconnu pour ses performances
Faudra rappeler ça à ces gens qui prétendent que Swift est hyper ultra performant, mieux que C, Obj-C et C++.
@marc_os
c'est pas le cas ?
@ raoolito
Swift plus rapide que C ou C++ ?
Permettez moi d'en douter fortement.
@marc_os
c des langages hyper bas niveau c'est ça ? Je sais pas qui qui dit que Swift est meilleur moi j'ai plutÎt entendu dire qu'il était facile à utiliser et plutÎt rapide pour un langage de haut niveau niveau
@ raoolito
> j'ai plutĂŽt entendu dire qu'il Ă©tait facile Ă utiliser
C'est ce que certains prétendent.
Pour ceux qui ont peur des pointeurs en C et Obj-C, oui c'est plus facile.
Mais la syntaxe permet énormément de "réductions", de formes compactes qui rendent parfois le code illisible, avec souvent des inversions de logique comme dans le fameux guard/else par rapport au traditionnel if/else.
> plutĂŽt rapide pour un langage de haut niveau niveau
Certains prétendent que Swift est plus rapide que Obj-C parce que le mécanisme d'appel de fonctions d' "objets" serait plus efficace. Sauf que c'est à condition d'utiliser des structs*, ce que qu'adorent d'ailleurs ceux qui maßtrisent mal les concepts de programmation orientée objet.
(*) et pour les classes de les déclarer "finales", cà d qu'on ne peut pas définir de sous-classe.
Â
Â
Exemples de code bien compact et pas évidents tirés de code réel.
Déjà , quand on vient d'un autre langage, il faut savoir que si une fonction qui doit retourner une valeur ne comporte qu'une seule ligne, alors le mot clé return est facultatif. Donc... { 3 } est un corps de fonction qui retourne un Int de valeur 3. Voir aussi le premier exemple qui suit.
self.thingFactory = { ThingWrapper(thingFactory($0)) }
Dernier exemple en date :
guard case .interesting(let tags) = result else {
    callback(Result(result: result))
    return
}
est Ă©quivalent Ă :
switch result {
case .interesting(let tags):
    // continue
default:
    callback(Result(result: result))
    return
}
si j'ai bien compris.
Donc et bien non, en Swift dans la ligne ci-dessous, le signe "=" ne correspond pas Ă une assignation de valeur Ă une variable comme partout ailleurs.
    guard case .interesting(let tags) = result else
C'est simple et ça saute au premier coup d'Ćil, n'est-ce pas ?
@marc_os
Ă ce stade je ne peux que courber l'Ă©chine vous semblez bien mieux comprendre de quoi il s'agit que moi đ
@ raoolito
C'est ça le truc.
Swift chamboule beaucoup de paradigmes utilisés depuis les débuts de la programmation. Le comble pour moi c'est ce genre d'horreur :
    guard case .interesting(let tags) = result else
oĂč une assignation n'est plus une assignation.
Comme vous le voyez, Swift est loin d'ĂȘtre Ă©vident et facile comme le prĂ©tendent certains.
Comme en C oĂč certains petits malins s'amusaient Ă retirer tout espace et retour Ă la ligne pour obtenir un code ultra compact et illisible, certains dans un contexte Ă©conomique de concurrence totale, mĂȘme entre "collĂšgues", oĂč la connaissance c'est un pouvoir, certains donc aiment rendre leur code le moins lisible possible et comme de bien entendu ils ne mettent pas de commentaires dans le code.
Histoire de se rendre indispensable.
@marc_os
la vache c'est non seulement vicieux mais ça doit pas ĂȘtre interdit des trucs comme ça ?
@raoolito
« mais ça doit pas ĂȘtre interdit des trucs comme ça ? »
Jâen doute. En tout cas sur la partie commentaire. Commenter son code a toujours Ă©tĂ© un conseil. Ce qui implique que ce nâest pas un ordreâŠ
@ marc_os : « Pour ceux qui ont peur des pointeurs en C et Obj-C, oui c'est plus facile. »
Câest peut-ĂȘtre le cas â je ne serais pas en mesure de le vĂ©rifier moi-mĂȘme.
Mais ce que jâai pu vĂ©rifier, câest quâil peut sâavĂ©rer rĂ©ellement plus pratique (« facile », ça ne sert plus Ă grand chose une fois passĂ©e la premiĂšre phase dâapprentissage) mĂȘme pour ceux qui apprĂ©cient le C et les pointeurs. đ
« Mais la syntaxe permet énormément de "réductions", de formes compactes qui rendent parfois le code illisible »
Oui, en cela il ne se dĂ©marque pas trop du C ni de bien dâautres langages : il ne protĂšge pas des sagouins qui aiment pondre du code illisible.
« avec souvent des inversions de logique comme dans le fameux guard/else par rapport au traditionnel if/else. »
Ah, si seulement Swift utilisait pour le « guard » un mot-clef complĂštement diffĂ©rent du « if » pour indiquer prĂ©cisĂ©ment ça⊠đ đ€Ł
« Déjà , quand on vient d'un autre langage, il faut savoir que si une fonction qui doit retourner une valeur ne comporte qu'une seule ligne, alors le mot clé return est facultatif. Donc... { 3 } est un corps de fonction qui retourne un Int de valeur 3. »
Ăa, jâavais votĂ© contre. Mais les fans de la compacitĂ© lâont emportĂ© sur ce coup. đ
Cependant, lâargument « quand on vient dâun autre langage, il faut savoir queâŠÂ » nâest pas bien sĂ©rieux : oui, quand on vient dâun autre langage, il faut dâabord apprendre celui-ci pour ĂȘtre en mesure de bien le comprendre â câest Ă©vident, sans ça ce ne serait pas vraiment un autre langage. đ
« Donc et bien non, en Swift dans la ligne ci-dessous, le signe "=" ne correspond pas à une assignation de valeur à une variable comme partout ailleurs. »
En fait, si, ça rĂ©alise bien une affectation (et non assignation), dâoĂč lâusage du « = » et la prĂ©sence du « let », qui permettent à « tags » de se voir affecter une valeur si « result » correspond bien au cas « .interesting ».
En effet, il convient vraiment dâapprendre un langage avant de pouvoir le comprendre⊠ou le critiquer. đ
@ BeePotato
> En fait, si, ça réalise bien une affectation
Dans un switch on a bien avec "affectation" du cÎté des let il n'y a pas de signe "=".
Dans cette syntaxe foireuse il tombe du ciel.
Sans parler du "case" sans switch.
Mais bon, c'est compact.
C'est comme le "in" des blocs.
On m'a dit qu'ils ont cherché mais pas trouvé mieux.
Pas trouvĂ© mieux que d'utiliser un terme avec un sens admis, ici "dans" pour un truc oĂč il perd son sens car ce "in" ne veut en aucun cas dire "dans".
Non mais allĂŽ quoi
> il faut dâabord apprendre celui-ci pour ĂȘtre en mesure de bien le comprendre
Evidemment. Je me suis mal exprimé.
Le hic, c'est que Swift chamboule des paradigmes établis depuis une éternité sans raison valable. Swift est le fruit d'un développeur de compilateurs, d'un technicien, contrairement à Objective-C qui est le fruit de longues années de recherche et développement de SmallTalk, créé à l'origine dans le monde universitaire et au centre de recherche de Xerox.
Cela fait toute la différence entre un langage bien pensé par des chercheurs au départ avec un langage pensé par un codeur, fut il un génie, et adopté au forceps et au pas de course essentiellement par la seule entreprise qui l'utilise à grande échelle. Et le fait que Swift soit open-source ne change pas grand chose.
Que chacun apporte sa petite pierre Ă l'Ă©difice c'est utile, ça peut ĂȘtre efficace, mais est-ce que ça remplace des annĂ©es de recherche intellectuelle en universitĂ© ?
J'en doute et le résultat le confirme pour moi.
Cf. Aussi SwiftUI ce prototype inventé pour éviter de finir le travail d'intégration avec l'existant Ce machin n'est toujours pas fini, mais la doc d'Apple le met déjà systématiquement en avant.
Pour finir, un trÚs bel exemple tiré de code réel (j'ai changé les noms) :
public var myBlock: (MyArgumentType1, MyArgumentType2) -> Void = { _, _ in }
myBlock = { [weak self] someThing, someThingElse in
    // block code
}
myBlock(unTruc, unAutreTruc)
Est-ce que "in" veut dire "dans" dans ce "langage" ?
Et bien non.
    someThing, someThingElse in
ne veut pas dire "someThing, someThingElse dans le bloc de code qui suit", mais "someThing, someThingElse utilisé par le bloc de code qui suit".
Si au moins ils avaient utilisé par exemple "usedBy".
Mais non. Des Shadocks dis-je, pas bien réveillés qui plus est.
Bref, y a juste des gugus qui n'ont pas trouvé mieux en comité.
En plus, honnĂȘtement je ne comprends pas bien ce que [weak self] vient foutre lĂ . Et oui, je ne suis pas encore un spĂ©cialiste de Swift et j'y vais Ă contre-cĆur. Mais j'y vais, car malheureusement c'est le chemin imposĂ© par Apple si on veut bĂ©nĂ©ficier de toutes les nouveautĂ©s.
@ marc_os : « Dans un switch on a bien avec "affectation" du cÎté des let il n'y a pas de signe "=".
Dans cette syntaxe foireuse il tombe du ciel. »
Mais non, ça ne tombe pas du ciel. Dans un switch, il nây a pas de = car lâexpression qui fournit la valeur est donnĂ©e au niveau du mot-clef « switch ».
Vu quâici on nâest pas dans le cadre dâun switch et on veut fournir la valeur via une expression sur la mĂȘme ligne, ça utilise le signe Ă©gal. Ce nâest pas illogique.
Ce qui me dĂ©range le plus dans cette syntaxe, câest que la position du « let » soit forcĂ©e Ă cĂŽtĂ© de la variable ; je pense que jâaurais eu plus de facilitĂ© Ă lire « guard let case(âŠ) = âŠÂ ».
« Sans parler du "case" sans switch. »
Le mot-clef « case » est employĂ© pour signifier un usage de pattern-matching. Je crois quâil nây a pas de logique plus pousĂ©e au choix de ce mot que le fait que le premier usage du pattern-matching a Ă©tĂ© dans le switch. Du coup, ce nâest pas joli, mais ça a le mĂ©rite dâĂȘtre homogĂšne. Jâaurais prĂ©fĂ©re que ce soit homogĂ©nĂ©isĂ© autour dâun terme plus explicite, comme « match », mais alors certains auraient rĂąlĂ© parce que le switch aurait utilisĂ© « match » plutĂŽt « case ».
« Mais bon, c'est compact. »
Ce nâest pas tellement la recherche de compacitĂ© (pas excessivement prĂ©sente dans le dĂ©veloppement de Swift, mĂȘme sâil y a rĂ©guliĂšremenet du monde venant sur Swift Evolution proposer des raccourcis syntaxiques totalement superflus) qui a menĂ© à ça. Juste la volontĂ© dâoffir lâaccĂšs au pattern-matching ailleurs que juste dans un switch, tout en gardant la mĂȘme syntaxe par souci dâhomogĂ©nĂ©itĂ©.
« Pas trouvĂ© mieux que d'utiliser un terme avec un sens admis, ici "dans" pour un truc oĂč il perd son sens car ce "in" ne veut en aucun cas dire "dans". »
Ben si, ça signifie bien « ces paramĂštres dans ce bout de code » (ou « ces paramĂštre en entrĂ©e de ce bout de code », selon comment on prĂ©fĂšre traduire le truc). Rien dâextraordinaire ni dâillogique ou de perturbant.
« Le hic, c'est que Swift chamboule des paradigmes établis depuis une éternité sans raison valable. »
Lesquels ?
« contrairement à Objective-C qui est le fruit de longues années de recherche et développement de SmallTalk, créé à l'origine dans le monde universitaire et au centre de recherche de Xerox. »
Smalltalk, je crois bien quâil a juste Ă©tĂ© conçu au PARC, pas dans une universitĂ©.
Quant Ă Objective C, câest une belle adaptation des principes de Smalltalk au C, mais qui nâest quâune surcouche assez simple et lĂ©gĂšre sur le C. Ce dont on profite le plus, ce sont les bibliothĂšques dĂ©veloppĂ©es durant des dĂ©cennies par NeXTStep puis Apple.
Parce quâen Objective C pur, sans respecter la logique de Cocoa ni ses conventions de nommage, on peut faire des trucs bien horribles aussi.
« J'en doute et le résultat le confirme pour moi. »
Je pense que ça nâa pas grand chose, voire rien, Ă voir avec ça. Mais plutĂŽt que dâune part tu as dĂ©cidĂ© de ne pas aimer Swift, et dâautre part tu as Ă©tĂ© confrontĂ© Ă trop de code moche Ă©crit par dâautres en Swift pour avoir la moindre chance de changer dâavis.
Je soupçonne que câest en partie dĂ» au fait que Swift, avec sa syntaxe moins originale que celle dâObjective C, attire plus de programmeurs que ce derniers et surtout les incite moins Ă adapter leur style pour coller Ă celui existant/recommandĂ© (parce que la syntaxe plus familiĂšre leur donne plus lâimpression quâils peuvent Ă©crire en C comme en C++ ou Java, mais aussi parce que le langage Ă©tant neuf, il nây avait pas toute la base dâexemples bien Ă©tablie disponible en Objective C).
« Est-ce que "in" veut dire "dans" dans ce "langage" ?
Et bien non. »
Ben⊠si, comme on peut bien le voir dans lâexemple que tu as fourni.
« Si au moins ils avaient utilisé par exemple "usedBy". »
Ben ça aurait Ă©tĂ© la mĂȘme chose. Le mĂȘme sens.
« En plus, honnĂȘtement je ne comprends pas bien ce que [weak self] vient foutre lĂ . »
Il vient faire la mĂȘme chose quâen Objective C dans un cas similaire. Normal : câest le mĂȘme ARC Ă la manĆuvre, avec la mĂȘme façon dâĂ©viter de crĂ©er des cycles.
@ BeePotato
Un autre truc bien alambiqué pour rien :
if case let .caramel = chocolate.filling {
    print(âYum! A caramel chocolate!â)
}
Au lieu de :
if chocolate.filling == .caramel {
    print(âYum! A caramel chocolate!â)
}
Pourquoi faire simple et clair quand on peut compliquer les choses ?
Ce qui donne lieu Ă des articles comme celui-ci :
How to Use If Case Let in Swift Without Losing Your Mind
Et le pire, c'est que je n'ai toujours pas trouvé les formes guard case ou if case dans la documentation officielle de Swift, mais uniquement sur des sites tiers. Dans la doc officielle je n'ai trouvé qu'un exemple de if case dans un § nommé "Optional Pattern".
Autre truc vachement intelligent.
Ils redéfinissent des termes génériques couramment utilisés en informatique, comme ci-dessous avec le concept de "pattern".
A pattern represents the structure of a single value or a composite value.
"the structure of a single value"
La structure d'une valeur simple ou d'une valeur complexe.
Ok, d'accord...
Il faut bien lire attentivement la suite pour voir qu'il est quand mĂȘme question en quelque sorte de patterns au sens classique.
Comme je disais, pourquoi faire simple quand on peut faire compliqué ?
@ marc_os : « Un autre truc bien alambiqué pour rien :
[âŠ]
Pourquoi faire simple et clair quand on peut compliquer les choses ? »
En effet.
Câest une remarque que tu devrais faire au dĂ©veloppeur qui a Ă©crit cette horreur, puisquâil est tout Ă fait idiot dâutiliser cette version compliquĂ©e au lieu de la version simple, bien plus logique.
Mais une fois de plus, tu reproches au langage lâerreur dâun dĂ©veloppeur, comme si Swift forçait Ă Ă©cire ça, alors que ce nâest pas du tout le cas.
« Et le pire, c'est que je n'ai toujours pas trouvé les formes guard case ou if case dans la documentation officielle de Swift, mais uniquement sur des sites tiers. »
Câest bel et bien citĂ© dans la documentation comme possibilitĂ©, mais ça mĂ©riterait effectivement de donner bien plus dâexemples. Et pas juste dans la section « patterns », mais aussi dans la section « control flow », histoire de savoir dĂšs quâon parle de if/guard/for quâils peuvent utiliser ça (et ainsi de donner envie dâaller lire lâautre section, qui nâattire pas forcĂ©ment sinon).
« Ils redéfinissent des termes génériques couramment utilisés en informatique, comme ci-dessous avec le concept de "pattern". »
Il nây a pas de redĂ©finition lĂ . Câest bien le sens classique utilisĂ© dans le cadre du pattern matching.
Tu as vraiment dĂ©cidĂ© que ça devait forcĂ©ment ĂȘtre pourri, donc⊠câest forcĂ©ment pourri.
On est au niveau dâargumentation de lâOrangina rouge, lĂ . đ
@raoolito
Swift nâest pas aussi rapide que C et il ne saurait pas. Maintenant, pour les PC/Smartphone que lâon Ă aujourdâhui, il est clairement assez rapide et pas trop gourmand en RAM.
Pour des micro contrĂŽleurs, non, Assembleur et C reste meilleur. MĂȘme si, notamment grĂące Ă la Playmate et des passionnĂ©s de Raspberry Pico/ESP32/STM32, on commence Ă se rapprocher avec une version de Swift pour systĂšme embarquĂ© (Embedded Swift).
Le mec développe Swift simple soit disant mais que certains aiment tellement "optimiser" que le code en devient illisible, l'intégration avec C est indispensable car les API d'Unix sont en C et plein d'autres aussi, mais cette intégration est pénible, l'intégration avec les API de gestion d'UI est foireuse (cf. les Range d'un cÎté et les NSRange de l'autre par exemple), du coup au lieu de régler le problÚme Apple balance SwiftUI, et le type propose un nouveau langage, cette fois, promis, il sera aussi performant que C ?
Langage pour qui ?
Non merci.
En fait on dirait qu'il ne sait rien faire d'autre, et que dÚs qu'il ne s'intéresse plus à un truc il en démarre un nouveau.
Allez Apple, j'en ai fait assez, démerdez-vous avec Swift, je me casse.
Allez, je passe Mojo en open-source, démerdez-vous avec.
Quel sera son prochain langage ?
LĂ est la question.
@marc_os
Il tente surtout de rĂ©pondre Ă un besoin diffĂ©rent qui est celui dâaccĂ©lĂ©rer les algorithmes dâentraĂźnement de modĂšles de ML avec un superset de python qui doit, jâimagine, compiler en assembleur directement plutĂŽt que dâĂȘtre interprĂ©tĂ©.
Je reste tout de mĂȘme circonspect car, il me semble, que les librairies python qui nĂ©cessitent beaucoup de performances (PyTorch, âŠ) ne sont que des bindings vers une implĂ©mentation qui est dĂ©jĂ en C.
@marc_os
Apple a plutĂŽt voulu garder Swift pour lui, et ne pas laisser dâautres sociĂ©tĂ©s le faire Ă©voluer. On a vu des tentatives avec Swift pour Server, mais il a fallu le temps pour quâApple le reconnaisse vraiment.
Jâadore Apple, et je peux le comprendre. Câest leur bĂ©bĂ© et il est utilisĂ© en interne. Swift est un langage Open Source mais il nâest pas vraiment communautaire et il nâest pas gĂ©rĂ© par une fondation.
Chris Lattner a essayĂ© de mettre Swift dans Tensorflow et lâidĂ©e/rĂ©alisation Ă©tait trĂšs bonne. Il a proposĂ© de faire Ă©voluer le langage mais il nâa pas Ă©tĂ© entendu. Il a donc dĂ©cidĂ© de crĂ©Ă© un langage pour le machine learning? Câest une bonne idĂ©e mais il devrait ĂȘtre full open source et communautaire, un peu comme Rust.
Golang (de Google) devrait ĂȘtre aussi beaucoup plus communautaire, un peu comme Rust/Kotlin lâest.
@ valcapri
> Apple a plutĂŽt voulu garder Swift pour lui, et ne pas laisser dâautres sociĂ©tĂ©s le faire Ă©voluer
Ah, c'est ça !
Je comprends mieux maintenant pourquoi Apple a mis Swift en open-source, de mĂȘme que libdispatch par exemple.
đ€Ș
https://github.com/apple/swift
@marc_os
Jâai bien dit quâil Ă©tait Open Source mais pas communautaire. Il reste gĂ©rĂ© par des personnes chez Apple.
Câest mĂȘme The Browser Company qui fait le travail de porter Swift sur Windows avec Arc. Et il a fallu combien de temps pour que lâon ait le framework Foundation en Open Source et disponible pour dâautres OS? Ils ont mĂȘme du le relancer une troisiĂšme fois le projet.
Le compilateur est toujours pas opensource par contre.
Le truc vraiment cool c'est que la standard lib est elle meme faite en mojo, et non en c++ ou quoi.
Ăa peut rĂ©ellement remplacer python et son implĂ©mentations dĂ©gueulasse si ca devient intĂ©gralement opensource mais pas avant.
J'ai hate de voir ce que ca donne.