Le code source de MojođŸ”„ a Ă©tĂ© partiellement rendu public, comme promis 🆕

Nicolas Furno |

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.

Capture d’écran Modular.

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.

avatar madaniso | 

On prononce comment ? đŸ”„

avatar BeePotato | 

« 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.

avatar Nicolas Furno | 

@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.

avatar marc_os | 

> 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++.

avatar raoolito | 

@marc_os

c'est pas le cas ?

avatar marc_os | 

@ raoolito

Swift plus rapide que C ou C++ ?
Permettez moi d'en douter fortement.

avatar raoolito | 

@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

avatar marc_os | 

@ 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 ?

avatar raoolito | 

@marc_os

À ce stade je ne peux que courber l'Ă©chine vous semblez bien mieux comprendre de quoi il s'agit que moi 😅

avatar marc_os | 

@ 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.

avatar raoolito | 

@marc_os
la vache c'est non seulement vicieux mais ça doit pas ĂȘtre interdit des trucs comme ça ?

avatar Derw | 

@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


avatar BeePotato | 

@ 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. 😝

avatar marc_os | 

@ 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.

avatar BeePotato | 

@ 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.

avatar marc_os | 

@ 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é ?

avatar BeePotato | 

@ 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à. 😉

avatar valcapri | 

@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).

avatar marc_os | 

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.

avatar fornorst | 

@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.

avatar valcapri | 

@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.

avatar marc_os | 

@ 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

avatar valcapri | 

@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.

avatar hawker | 

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.

CONNEXION UTILISATEUR