Tu confonds modularisation du code et compilation séparé. L'un n'entraine pas forcément l'autre.
Je confonds absolument pas : je dis clairement quand "on modularise le code avec complétion séparée". Oui tu peux prendre que la première partie de la phrase mais moi je te parle de ma phrase entière.
Tu confonds modularisation du code et compilation séparé. L'un n'entraine pas forcément l'autre.
J'attend de voir ce que ca va donner quand vous aurez la compilation séparée...
Mais j'imagine que tu préfères gérer une exception au runtime.
Bien sûr que non. Avec un langage qui propose des assertions par contrat on peut éviter la plupart de ces "call sur null".
Un port USB qui devient une imprimante ou une clef usb
Pourquoi pas, je suppose donc que changer de parent nécessite tout de même de conserver un certain héritage en commun sinon c'est dangereux non ? (en l'occurence la clef USB reste un port USB)
il y a l'analyse de flot qui enlève 99.3% des VFT du code du compilateur sur 410 000 appels,
Analyse qui pert une grande partie de son score dès qu'on modularise le code avec compilation séparée. Du bon boulot mais qui encourage à des pratiques inverses des pratiques conseillées traditionnellement en génie logiciel.
tu as la detection des call sur null en statique.
Idem : comment le garanties-tu en cas de compilation séparée ?
Tu as la gestion de l'héritage dynamique
Tu peux montrer un exemple de code où c'est pertinent ?
Tu m'expliquera comment une coloration syntaxique corrige une faute de syntaxe.
Y dit qui voit pas le rapport. Votre langage part du principe que les types sont en majuscule par soucis de "clareté". Bah pour la clareté on a inventé la coloration syntaxique. Nettement plus élégant que les majuscules.
Perl et Ocaml propose beaucoup de "simplification" par sucre syntaxique.
Perl est utilisé par les barbus justement parcqu'innaccessible pour ces connards de noobs.
Ocaml, c'est une des raisons qui fait qu'il est peu utilisé.
Concernant la syntaxe, c'est tellement un avantage pour le compilo, qu'il y a peu de chance qu'elle bouge.
Je comprends, pour un langage de labo, qu'on privilégie les concepts et en l'occurence tu fais plaisir au compilo.
Ce que vous comprenez pas, c'est que pour un langage de "tous les jours", il faut faire des compromis entre faire plaisir/attirer le développeur et faire plaisir aux chercheurs.
Ceux qui disent cela ne connaisse que java ou le C.
C'était justement volontaire : c'est imbittable pour la plupart des gens.
C'est pour les mêmes raisons que des langages comme smalltalk ou ocaml restent confidentiels.
Perl n'en parlons pas, c'est un truc de barbu.
La syntaxe lisaac est une version strict des règles de génies logiciel : avoir un maximum de clareté (MAJUSCULE pour les type, minuscule pour les slots, Une seul majucule pour les mots clef)
Un langage moderne part du principe que y'a un éditeur spécialisé avec coloration syntaxique... La règle des majuscule montre clairement que le langage n'a pas été conçu pour être utilisé dans un environnement moderne.
Cela a un coup énorme sur l'ambiguïté de la syntaxe, sa difficulté à lire, la difficulté à compiler et rendre performant une grammaire large.
D'accord sauf pour la difficulté à lire, puisque c'est justement l'objectif : simplifier la lecture par un noobs avec une syntaxe familière. Vous vous sacrifiez justement la familiarité et donc la simplicité de lecture pour répondre à d'autre besoins. C'est un choix, mais vous prenez l'énorme risque de vous retrouver avec un langage confidentiel comme Smalltalk.
Faudra pas venir pleurer.
la programmation par contrat facilite aussi la vérification.
On est d'accord, mais tant que vous aurez pas compris que le principal truc qui rebute, c'est la syntaxe.
C'est comme dans la vraie vie : c'est quoi le plus facile à apprendre : l'anglais qui utilise le même alphabet que nous ou ne chinois ?
Si tu dois créer une nouvelle langue, tu crois que c'est pertinent de créer un nouvel alphabet qui ne se rapproche d'aucun alphabet existant, si ton objectif est qu'il soit parler par le plus grand nombre ?
Une grosse part des outils en question, fonctionnent avec n'importe quel binaire ou n'importe quel fichier texte.
Les IDE c'est pas de simple vim, faut pas déconner. Utilise Visual un jour, son éditeur, utilise le debuggueur, utilise les profilers, tout ça.
C'est exactement le cas de Lisaac qui s'appuie sur les compilo C pour le coté universel et performant "partout".
Quand je parle d'universalité, c'est au sens "répendu" dans la tête des gens et dans les compétences des développeurs.
Lisaac a une syntaxe imbittable pour le commun des mortels, et vu que personne n'apprend se langage, ben il est pas prêt d'être universel.
Les langages qui tentent ou réussissent à s'imposer sont beaucoup plus pragmatique et cherche à rendre leur syntaxe "familière" aux développeurs justement habitués à l'universalité du langage C.
Ta vision de l'industriel ce limite à la gestion codé en Java.
Absolument pas.
Et si les qualités que tu cites étaient aussi importantes, expliques moi pourquoi C, C++, Fortran n'ont pas encore disparu dans les nouveaux designs.
Parcque ce sont des langages industriels qui ont de nombreux avantages, à commencer par une très grande maturité, des outils adaptés, des bibliothèques nombreuses, une certaine universalité, des performances adaptées à certains contextes, etc. Bref Lisaac est très très loin de pouvoir prétendre à remplacer ces langages, comme tu le fais si bien remarqués, ils sont vieux mais sont encore vivants et utilisés alors qu'il existe pourtant des langages plus modernes mais sans les mêmes atouts (D par exemple).
Parfois les performances brutes comptent, l'empreinte mémoire compte.
J'ai jamais dit le contraire.
Et je ne voix pas ce que vient faire la taille de la bibliothèque sur l'expressivité d'un langage.
Juste que ca forme un tout. Un langage sans une bonne bibliothèque n'est rien.
On est d'accord : votre but est de créer un langage qui intègre le résultat de vos recherche. Un langage de labo donc.
Rien à voir avec la philosophie d'un langage pensé pour être utilisé par des développeurs au quotidien.
Ce sont 2 objectifs différents, les 2 sont utiles, mais il est totalement idiot de dénigrer l'un plus que l'autre : Lisaac est à la ramasse totale en ce qui concerne le côté industriel. Les langages "modernes" sont conçus avec en tête leur utilisation dans un IDE (autocomplétion intelligente, refactoring), leur déploiement avec toutes les contraintes qui vont avec (composant, sécurité, portabilité, signature, sandboxing, etc.), la familiarité de la syntaxe, la bibliothèque standard (énorme), etc.
Donc arrête avec tes attaques à 2 balles sur la prétendu supériorité de Lisaac sur les autres langages.
ca n'empeche pas que ce sont des approches tres differentes
la seule et unique différence, c'est que le compilateur JIT travail "en live" quand le compilateur classique (AOT) travail en amont. Mais le travail effectué est absoluement identique !
D'ailleur la commande AOT de mono qui permet d'obtenir un binaire exécutable n'est rien d'autre que l'appel vers le moteur JIT en lui disant que tout doit être compilé là maintenant tout de suite.
Ce que tu appels un "énorme" bout de code pour transformer en code natif, tu le retrouves pareil dans GCC comme l'a très bien expliqué beafg.
GCC est basé sur un frontend et un backend avec au milieu un langage intermédiaire qui est tout comme un bytecode : une représentation qui fait abstraction des spécificités de la machine cible, le backend se chargeant de traduire dans le code machine cible.
Il n'y a donc fondamentalement pas de différence entre GCC et le compilateur C#+compilateur mono.
Je sais tres bien que mettre du code interprete en cache n'est pas du jit, mais s'il ya cache, c'est qu'il ya une forme de compilation, non?
Un interpréteur ne met rien en cache, il interprête !
Un interpréteur c'est ça :
while(true)
var instruction = analyse_instruction_suivante(input)
switch(instruction.type)
case "add" : locale[instruction.res] = intruction.left + instruction.right
case "mul" : locale[instrction.res] = instruction.left * instruction.right
etc.
Bref, une boucle infini qui analyse chaque instruction et exécute l'action correspondante, il n'est pas possible de mettre de code en cache, tout ce que tu peux mettre en cache c'est l'analyse. Tu seras toujours obligé de te taper en "live" le switch, bref le code qui s'exécute c'est celui de l'interpréteur.
Tout l'inverse d'un compilateur, qui lui joue plutôt comme ca :
foreach(instr in extractInstructions(source))
switch(instruction.type)
case "add" : exe.append(tranlateAddToX86(instr));
case "mul" : exe.append(translateMulToX86(instr));
Un compilateur JIT ne fait ni plus ni moins la même chose, sauf qu'au lieu d'écrire le résultat dans un binaire, il l'écrit dans un cache et l'exécute.
L'interpréteur a un seul intérêt : il est extrêment simple et ne nécessite pas de connaître le langage machine sur lequel il tourne (forcement il n'en produit pas), il suffit juste que l'interpréteur soit lui même écrit dans un langage portable pour que le langage interprété le soit également.
Le compilateur en revanche, cherche à éviter à tout prix la phase d'interprétation coûteuse (le switch voir l'analyse) en effectuant une traduction en code machine. C'est beaucoup plus complexe, et c'est ce que font .NET et GCC.
Les frontieres sont extremements floues dans ce domaine
Elles sont floues dans ta tête :) Ce sont 2 techniques totalement différentes sans rapport, si ce n'est leur but.
mais tu ne m'enleveras pas de l'idee est que chaque langage vient avec une philosophie
certes.
Et cette philosophie inclue la chaine de compilation, interprete, bytecode ou natif pur.
Pour moi non :
Python a d'abort été un langage interprété, puis est apparu un moteur JIT.
JavaScript a subit la même destinée. Java également.
.NET marche avec un compilateur AOT ou un compilateur JIT mais peut aussi être interprété.
Tu peux coller GCC en sortie de mono. Tu peux coller mono en sortie de GCC.
Pour moi la phylosophie d'un langage c'est d'autres caractéristiques : typage fort, dynamique, syntaxe, prototype, objet,etc.
Après ses caractéristiques peut le rendre plus ou moins facilement compilable, c'est un fait.
Et ca inclue aussi le runtime de base du langage, et le fait de savoir si on peut faire confiance a une couche en dessous, qui va verifier que tu ne dereference pas un pointeur null, que t'as acces a tel api d'ecriture sur le disque qui va verifier tes droits et tout ce genre de connerie, couche qui s'appelle une VM, verifie la signature du code, que la version de la lib est la bonne etc.
Là encore, tu confonds plusieurs choses : runtime et VM.
Une VM, ce n'est ni plus ni moins qu'un ensemble d'instruction "virtuelles", un processeur virtuel. C'est la représentation intermédiaire pour le frontend GCC, c'est le C89 pour Lisaac, c'est le bytecode pour le compilateur Java, etc.
Le runtime, c'est l'ensemble des services/code nécessaires à l'exécution pour rendre concrêtement la sémantique du langage pour lequel il est prévu.
Le C a un runtime minimaliste, le C++ en a déjà plus élaboré (pour les exceptions ainsi que pour la vérification de type, optionnel), Java en a un beaucoup plus gros parcqu'il offre de nombreux services.
Tu peux très bien compiler du code C# en code natif qui embarque le runtime (c'est ce que propose mono pour développer sur iPhone grâce à l'AOT), comme le fait le compilateur C++ qui est linké avec le runtime C++. C'est strictement identique, les étapes sont les mêmes, le service "validation" de l'AppleStore n'y voit que du feu : c'est du code natif et rien n'est généré dynamiquement.
De meme pour les "libs" d'aop qui fonctionnent en manipulant en temps reel le bytecode
Ce sont des libs, pas le langage. Les libs n'ont qu'à pas faire trop de supposition sur le code qui s'exécute. Le contrat, c'est la VM, rien n'indique que le bytecode est disponible sous la forme de donnée à l'exécution.
Lisaac qui est designe pour etre execute de facon native.
On est d'accord, Lisaac peut être conçu pour être utilisé d'une certaine façon. En l'occurrence Lisaac a été conçu pour être compilé en targetant la VM C89 de GCC.
Idem pour JSCript.NET, il a été conçu philosophiquement pour targeter la VM CLI de .NET en reprenant la syntaxe ECMAJavascript.
GCC comme .NET propose la compilation en code natif, c'est strictement identique, à la différence que .NET propose la souplesse de le faire en amont (comme GCC) ou en live.
On pourrait aussi dire la meme chose pour un langage interprete
Evidemment qu'au final c'est du code machine qui s'exécute !
M'enfin faut arrêter, y'a 2 méthodes classiques pour y arriver : l'interprétation et la compilation. Ce sont 2 techniques bien distinctes, je vois pas pourquoi t'essai de les mélanger.
Pour une implem vraiment bateau d'un langage interprete, c'est effectivement pas compile, mais quiconque de cense va implementer un cache pour pas reinterpreter la meme focntion en permanence
Bah non, c'est comme ca qu'on marché pendant très longtemps les interpréteurs JavaScript dans les navigateurs. Jusqu'à l'arrivée (relativement récente) de la technique de JIT.
Ce n'est absoluement pas le fait de mettre en cache qui permet de passer de l'interprétation à la compilation. Refais tes TP de fac bon sang :)
Tres honnetement, ca me derangerais pas plus que ca, je trouve ca heretique de pouvoir executer du code qui vient de n'importe ou, mais ca reste un truc qui fait partie du langage.
On est d'accord :)
on genere du code machine pour l'executer, donc c'est compile un peu biaise, tu vas necessairement devoir generer du code machine a un moment ou un autre, sinon ton bout de code, il va pas te servir a grand chose.
Bah non, surtout pas : dans l'interpréteur, le code machine il est déjà présent... dans l'interepréteur.
C'est toute la différence avec la compilation dont le but est de traduire et de produire du nouveau code. C'est ce code qui est exécuté.
Regarde les problèmes qu'il y a sur l'iPhone : faire un interpréteur, c'est possible car il n'y a pas de création de nouveau code, juste interprétation. Utiliser un moteur JIT c'est pas possible, parcque par nature (c'est un compilateur), il génère du code, et l'OS de l'iPhone refuse catégoriquement d'exécuter ces nouvelles instructions. D'où la technique AOT pour contourner.
Je penses que t'as vraiment pas bien saisie la différence entre compilation et interprétation.
Il voit mono comme non compile
Non, il connaît juste pas Mono.
- interprete
- langage a VM
- langage compile.
Ridicule. Un langage est un langage, point.
Beaucoup de langages peuvent se compiler et s'interpréter. La présence d'une VM est une problématique différente.
Pour Lisaac, la VM c'est le langage C89, pour JScript.NET c'est le bytecode. Les 2 sont suffisament de haut niveau pour être portable.
Faut arrêter de tordre la réalité dans tous les sens pour essayer de lui donner en partie raison : la compilation est un concept qui existe depuis un bon moment en informatique, et il s'oppose classiquement à l'interprétation. Ces sont 2 techniques totalement différentes.
Les moteurs JIT n'efface en rien cette différence : ca reste avant tout des compilateurs car ils utilisent la technique de compilation et en aucune manière l'interprétation, ils sont juste conçus pour être très rapides afin bosser "en live".
...
Je viens de dire (et j'ai vérifié) que dans le cas d'eval, le runtime JScript compile en bytecode qui est lui même compilé en code natif par le CLR (JIT). La dernière étape est l'exécution du code machine associé.
Même eval est donc bien compilable. C'est juste pas possible de le faire de manière statique avant de lancer ton programme. Mais c'est la nature même de la fonction qui veut ça.
En Lisaac t'auras exactement le même problème si tu veux fournir l'équivalent.
Avec évidemment le rappel aux frais de l'appelant initial.
Y'a pas moyen, imagine les abus : "ah bon vous nous avez pas appelé vous êtes sûr ? Attendez vous ne connaissez pas notre nouveau forfait trucbidule(TM) ?"
T'aurais envie de payer pour qu'on te spam ? non.
et pas un langage derive de JavaScript, du javascript quoi
Le but était de trouver un langage à prototype compilé. JScript.NET en est un, il est compilable, CQFD.
donne moi le code natif (archi de ton choix), du bout de code suivant:
Super, je vais pas te donner tout le code généré par le compilateur.
Mais si tu regardes l'implémentation de eval dans Microsoft.JScript.dll tu verras qu'il génère dynamiquement du code IL (bycode donc). Ce bytecode est traité après de manière classique par le CLR, et donc compilé en code natif à la volée avant exécution.
Mon petit doigt me dit que tu vas devoir embarquer un bout de code natif tellement gros qu'on pourra aisement qualifier ton binaire de VM compilant un code inexecutable tel quel, et donc le placer dans la categorie des langages non compile nativement.
Oui, celà nécessite un runtime qui s'occupe d'implémenter eval, n'en reste pas moins que le code est tôt ou tard compilé en code natif avant exécution (plutôt tard pour le cas de eval).
Apres, tu peux te limiter a subset du langage, comme Mono le fait si j'en crois le site web. Ca ne supporte d'ailleurs pas les generics, c'est ballot quand meme
2 choses :
- cette limitation s'applique à l'AOT pour Mono 2.0. En mode JIT, qui reste de la compilation sans aucune interprétation, les generics sont totalement supportés.
- cette limitation n'existe plus dans les version plus récentes, Mono 2.0, c'est vieux.
mais c'est surement aussi parce que je connais deja lisaac , ca genere du C derriere, donc j'ai naturellement fait l'association compiler = compiler nativement.
Bah oué tu vois j'ai fais le même raisonnement que toi : c'est sûrement aussi parcque je connais déjà JScript.NET, ca génère du code IL derrière, donc j'ai naturellement fait l'association compiler = compiler nativement.
D'aucuns considerent qu'une compilation a la volee en prerequis exlue d'emblee pour le qualificatif "compilation native", et quelque part, c'est dur de leur donner tord.
Le but de la compilation à la volée est avant tout de produire du code natif exécutable, c'est quand même extrêment osé de dire que la technique de JIT n'est pas de la compilation native.
Faut pas déconner, c'est dans le premier paragraphe de la définition de JIT sur Wikipedia : " It converts code at runtime prior to executing it natively, for example bytecode into native machine code. "
Ensuite le soucis vient d'une fonction, eval. Aucun doute que si Lisaac avait l'équivalent ils n'auraient d'autre choix que de faire de la compilation à la volée.
En fait il aurait fallu remplacer : Lisaac est le seul langage à prototype compilé.
par
Lisaac est le seul langage à prototype compilé en code natif statiquement avec exécution qui n'offre pas de fonction de type eval.
vi enfin si t'as un client qui tourne, c'est que t'as la VM hein :)
Et puis faut arrêter avec les architectures esotériques : les implémentations de VM s'adaptent à la popularité des plateformes. Du moment que la VM est sous licence libre, on pourra toujours l'adapter à une nouvelle cible :)
En tout cas, on en vient directement au fait : on est agressif parcque vous dénigrer tout les langages "industriels" utilisés aujourd'hui. Et vous les dénigrez tellement qu'il faut vous expliquer comment ils marchent, pourquoi ils fonctionnent comme ça, à quels besoins et ils répondent.
C'est pourtant ce dernier point qui est essentiel : votre objectif est-il de vanter les mérites de Lisaac ou de répondre aux besoins des codeurs ?
Qu'est ce qui est le plus important pour un développeur ? que la grammaire soit simple ou de faire en sorte que la syntaxe ne lui paraisse pas étrange ?
Pourquoi Java C# & Co se sont inspirés de la syntaxe du langage C ?
Bah eval c'est une fonction qui n'interdit en rien la technique de JIT. Effectivement c'est impossible de faire de l'AOT mais il reste toujours 2 techniques d'exécution disponibles : la compilation à la volée et l'interprétation.
Bah non, c'est comme ca sur LinuxFR : quand est un journal n'est pas intéressant (désolé, on va pas s'extasier sur le support 16 ou 64 bits), on le recycle. Un débat sur les techniques d'exécution (compilation, JIT, AOT, VM, natif, interprétation) et l'évolution qu'a subit Java ou Javascript, c'est quand même plus intéressant.
tu passes ton temps à vanter les trucs autour de .NET.
Désolé de comparer avec ce que je connais. Je suis pas spécialement "pro-Java" et pourtant j'ai pris soin d'en parler également. J'ai également parlé de JavaScript, pourtant je supporte pas ce langage.
Et les mécanisme de VM n'ont rien de supérieur au mécanisme natif,
Disons qu'ils répondent pas aux mêmes besoins, n'offrent pas les mêmes services.
Après oui je suis à titre personnel plus intéressé par les technos qui offrent des modèles de sécurités fiable pour faire des applis et dans le futur des OS que les technos qui visent les perfs. Après il en faut pour tous les goûts.
Mais effectivement, je suis souvent agressif sur les journaux Lisaac, parcque quand c'est pas toi, c'est Ontologia, et votre verbiage sur le soit disant meilleur langage que-vous-savez même-pas-argumenter-faut-systématiquement-demander-au gourou c'est assez pénible.
Probablement.
On attend avec impatience de voir l'étendu des mise à jour que vous allez faire dans Wikipedia sur les articles concernant Javascript et les langages à prototypes.
Surtout dans la version anglaise rédigée dans la langue des américains et de ces atlantistes d'anglais.
Comment tu peux te croire tellement supérieur aux autres pour croire que l'on ne connait pas comment fonctionne un JIT ?
Attend, je te recites pour voir : "C'est facile pour n'importe quel jit de sauver les parties de binaires converti. Il reste tout de même une énorme part d'interprétation. C'est obligatoire par exemple pour garder fonctionnel tous les mécanismes de sécurité, si le code est "purement natif" comme un code compilé, il peut faire ce qu'il veut. "
T'affirmes des trucs alors que ca fait 10 ans que la réalité te donne tord. Pas de ma faute à moi.
Continues de défendre tes dieux américains et fichent nous la paix.
Pauvre choupinet, faut pas venir sur trollFr avec un journal pour venter les mérites d'un langage (c'est pas une version révolutionnaire, donc à quoi bon ce journal ci ce n'est faire de la pub pour le langage ?) en commencant l'intro par "Lisaac est le seul langage à prototype compilé."
Et puis bon le côté bon français moi je supporte pas les technos des ricains, c'est du joli.
On parle de techno, rien à foutre de l'origine. En tout cas ca explique que vous soyez pas au fait de l'état de l'art, qui s'établi de part et d'autre de l'atlantique...
Et moi, cela me gave de lire des gens qui pinaillent sur des bêtises et qui cassent les trucs innovants et ne font que ça.
T'es rigolo, tu débarque avec un journal, et la première phrase vente le fait que Lisaac soit le "seul" langage à prototype compilé. Forcement ca fait tilte et ca prête à critique. Surtout que le reste des nouveautés est pas spécialement excitant et ne prête pas à grosse discussion...
C'est pas de moi, mais du créateur de Lisaac, qui s'y connait plus que moi en langage et plus que toi aussi je pense.
Alors s'il le dit...
C'est vrai quoi, y'a les vrais langages, les langages des hommes quoi, et les autres, les langages de tapette.
Si tu distribue tes binaires ngen.exe, tu as la même (absence) sécurité qu'un code C.
Toutafé. Mais personne ne déploie le code généré par ngen. D'ailleur ngen va mettre l'exécutable dans un cache du système que si tu vas pas sur google tu risques même pas de le trouver, donc bon...
Et puis bon, parler de l'état de l'art quand on sait même pas qu'un moteur JIT est un compilateur et non un interpréteur, que ca fait presque 10 ans qu'il existe un standard ISO qui défini une VM dédié à la compilation en code natif plutôt que l'interprétation... voilà quoi :)
Désolé pour la pique, mais bon vous semblez pas vraiment au fait de ce qui se fait depuis un bon moment déjà...
[^] # Re: Surprise
Posté par TImaniac (site web personnel) . En réponse au journal Lisaac: sorti de la 0.39beta. Évalué à 2.
Je confonds absolument pas : je dis clairement quand "on modularise le code avec complétion séparée". Oui tu peux prendre que la première partie de la phrase mais moi je te parle de ma phrase entière.
Tu confonds modularisation du code et compilation séparé. L'un n'entraine pas forcément l'autre.
J'attend de voir ce que ca va donner quand vous aurez la compilation séparée...
Mais j'imagine que tu préfères gérer une exception au runtime.
Bien sûr que non. Avec un langage qui propose des assertions par contrat on peut éviter la plupart de ces "call sur null".
Un port USB qui devient une imprimante ou une clef usb
Pourquoi pas, je suppose donc que changer de parent nécessite tout de même de conserver un certain héritage en commun sinon c'est dangereux non ? (en l'occurence la clef USB reste un port USB)
[^] # Re: Surprise
Posté par TImaniac (site web personnel) . En réponse au journal Lisaac: sorti de la 0.39beta. Évalué à 2.
Analyse qui pert une grande partie de son score dès qu'on modularise le code avec compilation séparée. Du bon boulot mais qui encourage à des pratiques inverses des pratiques conseillées traditionnellement en génie logiciel.
tu as la detection des call sur null en statique.
Idem : comment le garanties-tu en cas de compilation séparée ?
Tu as la gestion de l'héritage dynamique
Tu peux montrer un exemple de code où c'est pertinent ?
[^] # Re: Surprise
Posté par TImaniac (site web personnel) . En réponse au journal Lisaac: sorti de la 0.39beta. Évalué à 1.
Y dit qui voit pas le rapport. Votre langage part du principe que les types sont en majuscule par soucis de "clareté". Bah pour la clareté on a inventé la coloration syntaxique. Nettement plus élégant que les majuscules.
Perl et Ocaml propose beaucoup de "simplification" par sucre syntaxique.
Perl est utilisé par les barbus justement parcqu'innaccessible pour ces connards de noobs.
Ocaml, c'est une des raisons qui fait qu'il est peu utilisé.
Concernant la syntaxe, c'est tellement un avantage pour le compilo, qu'il y a peu de chance qu'elle bouge.
Je comprends, pour un langage de labo, qu'on privilégie les concepts et en l'occurence tu fais plaisir au compilo.
Ce que vous comprenez pas, c'est que pour un langage de "tous les jours", il faut faire des compromis entre faire plaisir/attirer le développeur et faire plaisir aux chercheurs.
[^] # Re: Surprise
Posté par TImaniac (site web personnel) . En réponse au journal Lisaac: sorti de la 0.39beta. Évalué à 1.
C'était justement volontaire : c'est imbittable pour la plupart des gens.
C'est pour les mêmes raisons que des langages comme smalltalk ou ocaml restent confidentiels.
Perl n'en parlons pas, c'est un truc de barbu.
La syntaxe lisaac est une version strict des règles de génies logiciel : avoir un maximum de clareté (MAJUSCULE pour les type, minuscule pour les slots, Une seul majucule pour les mots clef)
Un langage moderne part du principe que y'a un éditeur spécialisé avec coloration syntaxique... La règle des majuscule montre clairement que le langage n'a pas été conçu pour être utilisé dans un environnement moderne.
Cela a un coup énorme sur l'ambiguïté de la syntaxe, sa difficulté à lire, la difficulté à compiler et rendre performant une grammaire large.
D'accord sauf pour la difficulté à lire, puisque c'est justement l'objectif : simplifier la lecture par un noobs avec une syntaxe familière. Vous vous sacrifiez justement la familiarité et donc la simplicité de lecture pour répondre à d'autre besoins. C'est un choix, mais vous prenez l'énorme risque de vous retrouver avec un langage confidentiel comme Smalltalk.
Faudra pas venir pleurer.
la programmation par contrat facilite aussi la vérification.
On est d'accord, mais tant que vous aurez pas compris que le principal truc qui rebute, c'est la syntaxe.
C'est comme dans la vraie vie : c'est quoi le plus facile à apprendre : l'anglais qui utilise le même alphabet que nous ou ne chinois ?
Si tu dois créer une nouvelle langue, tu crois que c'est pertinent de créer un nouvel alphabet qui ne se rapproche d'aucun alphabet existant, si ton objectif est qu'il soit parler par le plus grand nombre ?
[^] # Re: Surprise
Posté par TImaniac (site web personnel) . En réponse au journal Lisaac: sorti de la 0.39beta. Évalué à 2.
Les IDE c'est pas de simple vim, faut pas déconner. Utilise Visual un jour, son éditeur, utilise le debuggueur, utilise les profilers, tout ça.
C'est exactement le cas de Lisaac qui s'appuie sur les compilo C pour le coté universel et performant "partout".
Quand je parle d'universalité, c'est au sens "répendu" dans la tête des gens et dans les compétences des développeurs.
Lisaac a une syntaxe imbittable pour le commun des mortels, et vu que personne n'apprend se langage, ben il est pas prêt d'être universel.
Les langages qui tentent ou réussissent à s'imposer sont beaucoup plus pragmatique et cherche à rendre leur syntaxe "familière" aux développeurs justement habitués à l'universalité du langage C.
[^] # Re: Surprise
Posté par TImaniac (site web personnel) . En réponse au journal Lisaac: sorti de la 0.39beta. Évalué à 2.
Absolument pas.
Et si les qualités que tu cites étaient aussi importantes, expliques moi pourquoi C, C++, Fortran n'ont pas encore disparu dans les nouveaux designs.
Parcque ce sont des langages industriels qui ont de nombreux avantages, à commencer par une très grande maturité, des outils adaptés, des bibliothèques nombreuses, une certaine universalité, des performances adaptées à certains contextes, etc. Bref Lisaac est très très loin de pouvoir prétendre à remplacer ces langages, comme tu le fais si bien remarqués, ils sont vieux mais sont encore vivants et utilisés alors qu'il existe pourtant des langages plus modernes mais sans les mêmes atouts (D par exemple).
Parfois les performances brutes comptent, l'empreinte mémoire compte.
J'ai jamais dit le contraire.
Et je ne voix pas ce que vient faire la taille de la bibliothèque sur l'expressivité d'un langage.
Juste que ca forme un tout. Un langage sans une bonne bibliothèque n'est rien.
[^] # Re: Surprise
Posté par TImaniac (site web personnel) . En réponse au journal Lisaac: sorti de la 0.39beta. Évalué à 2.
Rien à voir avec la philosophie d'un langage pensé pour être utilisé par des développeurs au quotidien.
Ce sont 2 objectifs différents, les 2 sont utiles, mais il est totalement idiot de dénigrer l'un plus que l'autre : Lisaac est à la ramasse totale en ce qui concerne le côté industriel. Les langages "modernes" sont conçus avec en tête leur utilisation dans un IDE (autocomplétion intelligente, refactoring), leur déploiement avec toutes les contraintes qui vont avec (composant, sécurité, portabilité, signature, sandboxing, etc.), la familiarité de la syntaxe, la bibliothèque standard (énorme), etc.
Donc arrête avec tes attaques à 2 balles sur la prétendu supériorité de Lisaac sur les autres langages.
[^] # Re: Surprise
Posté par TImaniac (site web personnel) . En réponse au journal Lisaac: sorti de la 0.39beta. Évalué à 3.
la seule et unique différence, c'est que le compilateur JIT travail "en live" quand le compilateur classique (AOT) travail en amont. Mais le travail effectué est absoluement identique !
D'ailleur la commande AOT de mono qui permet d'obtenir un binaire exécutable n'est rien d'autre que l'appel vers le moteur JIT en lui disant que tout doit être compilé là maintenant tout de suite.
Ce que tu appels un "énorme" bout de code pour transformer en code natif, tu le retrouves pareil dans GCC comme l'a très bien expliqué beafg.
GCC est basé sur un frontend et un backend avec au milieu un langage intermédiaire qui est tout comme un bytecode : une représentation qui fait abstraction des spécificités de la machine cible, le backend se chargeant de traduire dans le code machine cible.
Il n'y a donc fondamentalement pas de différence entre GCC et le compilateur C#+compilateur mono.
Je sais tres bien que mettre du code interprete en cache n'est pas du jit, mais s'il ya cache, c'est qu'il ya une forme de compilation, non?
Un interpréteur ne met rien en cache, il interprête !
Un interpréteur c'est ça :
while(true)
var instruction = analyse_instruction_suivante(input)
switch(instruction.type)
case "add" : locale[instruction.res] = intruction.left + instruction.right
case "mul" : locale[instrction.res] = instruction.left * instruction.right
etc.
Bref, une boucle infini qui analyse chaque instruction et exécute l'action correspondante, il n'est pas possible de mettre de code en cache, tout ce que tu peux mettre en cache c'est l'analyse. Tu seras toujours obligé de te taper en "live" le switch, bref le code qui s'exécute c'est celui de l'interpréteur.
Tout l'inverse d'un compilateur, qui lui joue plutôt comme ca :
foreach(instr in extractInstructions(source))
switch(instruction.type)
case "add" : exe.append(tranlateAddToX86(instr));
case "mul" : exe.append(translateMulToX86(instr));
Un compilateur JIT ne fait ni plus ni moins la même chose, sauf qu'au lieu d'écrire le résultat dans un binaire, il l'écrit dans un cache et l'exécute.
L'interpréteur a un seul intérêt : il est extrêment simple et ne nécessite pas de connaître le langage machine sur lequel il tourne (forcement il n'en produit pas), il suffit juste que l'interpréteur soit lui même écrit dans un langage portable pour que le langage interprété le soit également.
Le compilateur en revanche, cherche à éviter à tout prix la phase d'interprétation coûteuse (le switch voir l'analyse) en effectuant une traduction en code machine. C'est beaucoup plus complexe, et c'est ce que font .NET et GCC.
Les frontieres sont extremements floues dans ce domaine
Elles sont floues dans ta tête :) Ce sont 2 techniques totalement différentes sans rapport, si ce n'est leur but.
mais tu ne m'enleveras pas de l'idee est que chaque langage vient avec une philosophie
certes.
Et cette philosophie inclue la chaine de compilation, interprete, bytecode ou natif pur.
Pour moi non :
Python a d'abort été un langage interprété, puis est apparu un moteur JIT.
JavaScript a subit la même destinée. Java également.
.NET marche avec un compilateur AOT ou un compilateur JIT mais peut aussi être interprété.
Tu peux coller GCC en sortie de mono. Tu peux coller mono en sortie de GCC.
Pour moi la phylosophie d'un langage c'est d'autres caractéristiques : typage fort, dynamique, syntaxe, prototype, objet,etc.
Après ses caractéristiques peut le rendre plus ou moins facilement compilable, c'est un fait.
Et ca inclue aussi le runtime de base du langage, et le fait de savoir si on peut faire confiance a une couche en dessous, qui va verifier que tu ne dereference pas un pointeur null, que t'as acces a tel api d'ecriture sur le disque qui va verifier tes droits et tout ce genre de connerie, couche qui s'appelle une VM, verifie la signature du code, que la version de la lib est la bonne etc.
Là encore, tu confonds plusieurs choses : runtime et VM.
Une VM, ce n'est ni plus ni moins qu'un ensemble d'instruction "virtuelles", un processeur virtuel. C'est la représentation intermédiaire pour le frontend GCC, c'est le C89 pour Lisaac, c'est le bytecode pour le compilateur Java, etc.
Le runtime, c'est l'ensemble des services/code nécessaires à l'exécution pour rendre concrêtement la sémantique du langage pour lequel il est prévu.
Le C a un runtime minimaliste, le C++ en a déjà plus élaboré (pour les exceptions ainsi que pour la vérification de type, optionnel), Java en a un beaucoup plus gros parcqu'il offre de nombreux services.
Tu peux très bien compiler du code C# en code natif qui embarque le runtime (c'est ce que propose mono pour développer sur iPhone grâce à l'AOT), comme le fait le compilateur C++ qui est linké avec le runtime C++. C'est strictement identique, les étapes sont les mêmes, le service "validation" de l'AppleStore n'y voit que du feu : c'est du code natif et rien n'est généré dynamiquement.
De meme pour les "libs" d'aop qui fonctionnent en manipulant en temps reel le bytecode
Ce sont des libs, pas le langage. Les libs n'ont qu'à pas faire trop de supposition sur le code qui s'exécute. Le contrat, c'est la VM, rien n'indique que le bytecode est disponible sous la forme de donnée à l'exécution.
Lisaac qui est designe pour etre execute de facon native.
On est d'accord, Lisaac peut être conçu pour être utilisé d'une certaine façon. En l'occurrence Lisaac a été conçu pour être compilé en targetant la VM C89 de GCC.
Idem pour JSCript.NET, il a été conçu philosophiquement pour targeter la VM CLI de .NET en reprenant la syntaxe ECMAJavascript.
GCC comme .NET propose la compilation en code natif, c'est strictement identique, à la différence que .NET propose la souplesse de le faire en amont (comme GCC) ou en live.
[^] # Re: Surprise
Posté par TImaniac (site web personnel) . En réponse au journal Lisaac: sorti de la 0.39beta. Évalué à 2.
Evidemment qu'au final c'est du code machine qui s'exécute !
M'enfin faut arrêter, y'a 2 méthodes classiques pour y arriver : l'interprétation et la compilation. Ce sont 2 techniques bien distinctes, je vois pas pourquoi t'essai de les mélanger.
Pour une implem vraiment bateau d'un langage interprete, c'est effectivement pas compile, mais quiconque de cense va implementer un cache pour pas reinterpreter la meme focntion en permanence
Bah non, c'est comme ca qu'on marché pendant très longtemps les interpréteurs JavaScript dans les navigateurs. Jusqu'à l'arrivée (relativement récente) de la technique de JIT.
Ce n'est absoluement pas le fait de mettre en cache qui permet de passer de l'interprétation à la compilation. Refais tes TP de fac bon sang :)
Tres honnetement, ca me derangerais pas plus que ca, je trouve ca heretique de pouvoir executer du code qui vient de n'importe ou, mais ca reste un truc qui fait partie du langage.
On est d'accord :)
on genere du code machine pour l'executer, donc c'est compile un peu biaise, tu vas necessairement devoir generer du code machine a un moment ou un autre, sinon ton bout de code, il va pas te servir a grand chose.
Bah non, surtout pas : dans l'interpréteur, le code machine il est déjà présent... dans l'interepréteur.
C'est toute la différence avec la compilation dont le but est de traduire et de produire du nouveau code. C'est ce code qui est exécuté.
Regarde les problèmes qu'il y a sur l'iPhone : faire un interpréteur, c'est possible car il n'y a pas de création de nouveau code, juste interprétation. Utiliser un moteur JIT c'est pas possible, parcque par nature (c'est un compilateur), il génère du code, et l'OS de l'iPhone refuse catégoriquement d'exécuter ces nouvelles instructions. D'où la technique AOT pour contourner.
Je penses que t'as vraiment pas bien saisie la différence entre compilation et interprétation.
Il voit mono comme non compile
Non, il connaît juste pas Mono.
- interprete
- langage a VM
- langage compile.
Ridicule. Un langage est un langage, point.
Beaucoup de langages peuvent se compiler et s'interpréter. La présence d'une VM est une problématique différente.
Pour Lisaac, la VM c'est le langage C89, pour JScript.NET c'est le bytecode. Les 2 sont suffisament de haut niveau pour être portable.
Faut arrêter de tordre la réalité dans tous les sens pour essayer de lui donner en partie raison : la compilation est un concept qui existe depuis un bon moment en informatique, et il s'oppose classiquement à l'interprétation. Ces sont 2 techniques totalement différentes.
Les moteurs JIT n'efface en rien cette différence : ca reste avant tout des compilateurs car ils utilisent la technique de compilation et en aucune manière l'interprétation, ils sont juste conçus pour être très rapides afin bosser "en live".
[^] # Re: Surprise
Posté par TImaniac (site web personnel) . En réponse au journal Lisaac: sorti de la 0.39beta. Évalué à 2.
Je viens de dire (et j'ai vérifié) que dans le cas d'eval, le runtime JScript compile en bytecode qui est lui même compilé en code natif par le CLR (JIT). La dernière étape est l'exécution du code machine associé.
Même eval est donc bien compilable. C'est juste pas possible de le faire de manière statique avant de lancer ton programme. Mais c'est la nature même de la fonction qui veut ça.
En Lisaac t'auras exactement le même problème si tu veux fournir l'équivalent.
# mouais
Posté par TImaniac (site web personnel) . En réponse au journal Ces assistances qui ont la flemme de nous entendre (chez EDF en particulier). Évalué à 10.
Y'a pas moyen, imagine les abus : "ah bon vous nous avez pas appelé vous êtes sûr ? Attendez vous ne connaissez pas notre nouveau forfait trucbidule(TM) ?"
T'aurais envie de payer pour qu'on te spam ? non.
[^] # Re: Surprise
Posté par TImaniac (site web personnel) . En réponse au journal Lisaac: sorti de la 0.39beta. Évalué à -1.
Le but était de trouver un langage à prototype compilé. JScript.NET en est un, il est compilable, CQFD.
donne moi le code natif (archi de ton choix), du bout de code suivant:
Super, je vais pas te donner tout le code généré par le compilateur.
Mais si tu regardes l'implémentation de eval dans Microsoft.JScript.dll tu verras qu'il génère dynamiquement du code IL (bycode donc). Ce bytecode est traité après de manière classique par le CLR, et donc compilé en code natif à la volée avant exécution.
Mon petit doigt me dit que tu vas devoir embarquer un bout de code natif tellement gros qu'on pourra aisement qualifier ton binaire de VM compilant un code inexecutable tel quel, et donc le placer dans la categorie des langages non compile nativement.
Oui, celà nécessite un runtime qui s'occupe d'implémenter eval, n'en reste pas moins que le code est tôt ou tard compilé en code natif avant exécution (plutôt tard pour le cas de eval).
Apres, tu peux te limiter a subset du langage, comme Mono le fait si j'en crois le site web. Ca ne supporte d'ailleurs pas les generics, c'est ballot quand meme
2 choses :
- cette limitation s'applique à l'AOT pour Mono 2.0. En mode JIT, qui reste de la compilation sans aucune interprétation, les generics sont totalement supportés.
- cette limitation n'existe plus dans les version plus récentes, Mono 2.0, c'est vieux.
mais c'est surement aussi parce que je connais deja lisaac , ca genere du C derriere, donc j'ai naturellement fait l'association compiler = compiler nativement.
Bah oué tu vois j'ai fais le même raisonnement que toi : c'est sûrement aussi parcque je connais déjà JScript.NET, ca génère du code IL derrière, donc j'ai naturellement fait l'association compiler = compiler nativement.
D'aucuns considerent qu'une compilation a la volee en prerequis exlue d'emblee pour le qualificatif "compilation native", et quelque part, c'est dur de leur donner tord.
Le but de la compilation à la volée est avant tout de produire du code natif exécutable, c'est quand même extrêment osé de dire que la technique de JIT n'est pas de la compilation native.
Faut pas déconner, c'est dans le premier paragraphe de la définition de JIT sur Wikipedia :
" It converts code at runtime prior to executing it natively, for example bytecode into native machine code. "
Ensuite le soucis vient d'une fonction, eval. Aucun doute que si Lisaac avait l'équivalent ils n'auraient d'autre choix que de faire de la compilation à la volée.
En fait il aurait fallu remplacer :
Lisaac est le seul langage à prototype compilé.
par
Lisaac est le seul langage à prototype compilé en code natif statiquement avec exécution qui n'offre pas de fonction de type eval.
[^] # Re: Surprise
Posté par TImaniac (site web personnel) . En réponse au journal Lisaac: sorti de la 0.39beta. Évalué à -1.
[^] # Re: Surprise
Posté par TImaniac (site web personnel) . En réponse au journal Lisaac: sorti de la 0.39beta. Évalué à 3.
Et puis faut arrêter avec les architectures esotériques : les implémentations de VM s'adaptent à la popularité des plateformes. Du moment que la VM est sous licence libre, on pourra toujours l'adapter à une nouvelle cible :)
[^] # Re: Surprise
Posté par TImaniac (site web personnel) . En réponse au journal Lisaac: sorti de la 0.39beta. Évalué à 2.
[^] # Re: Surprise
Posté par TImaniac (site web personnel) . En réponse au journal Lisaac: sorti de la 0.39beta. Évalué à 2.
[^] # Re: Surprise
Posté par TImaniac (site web personnel) . En réponse au journal Lisaac: sorti de la 0.39beta. Évalué à 2.
[^] # Re: Surprise
Posté par TImaniac (site web personnel) . En réponse au journal Lisaac: sorti de la 0.39beta. Évalué à 5.
C'est pourtant ce dernier point qui est essentiel : votre objectif est-il de vanter les mérites de Lisaac ou de répondre aux besoins des codeurs ?
Qu'est ce qui est le plus important pour un développeur ? que la grammaire soit simple ou de faire en sorte que la syntaxe ne lui paraisse pas étrange ?
Pourquoi Java C# & Co se sont inspirés de la syntaxe du langage C ?
[^] # Re: Surprise
Posté par TImaniac (site web personnel) . En réponse au journal Lisaac: sorti de la 0.39beta. Évalué à 2.
[^] # Re: Surprise
Posté par TImaniac (site web personnel) . En réponse au journal Lisaac: sorti de la 0.39beta. Évalué à 3.
[^] # Re: Surprise
Posté par TImaniac (site web personnel) . En réponse au journal Lisaac: sorti de la 0.39beta. Évalué à 2.
Désolé de comparer avec ce que je connais. Je suis pas spécialement "pro-Java" et pourtant j'ai pris soin d'en parler également. J'ai également parlé de JavaScript, pourtant je supporte pas ce langage.
Et les mécanisme de VM n'ont rien de supérieur au mécanisme natif,
Disons qu'ils répondent pas aux mêmes besoins, n'offrent pas les mêmes services.
Après oui je suis à titre personnel plus intéressé par les technos qui offrent des modèles de sécurités fiable pour faire des applis et dans le futur des OS que les technos qui visent les perfs. Après il en faut pour tous les goûts.
Mais effectivement, je suis souvent agressif sur les journaux Lisaac, parcque quand c'est pas toi, c'est Ontologia, et votre verbiage sur le soit disant meilleur langage que-vous-savez même-pas-argumenter-faut-systématiquement-demander-au gourou c'est assez pénible.
[^] # Re: Surprise
Posté par TImaniac (site web personnel) . En réponse au journal Lisaac: sorti de la 0.39beta. Évalué à 2.
On attend avec impatience de voir l'étendu des mise à jour que vous allez faire dans Wikipedia sur les articles concernant Javascript et les langages à prototypes.
Surtout dans la version anglaise rédigée dans la langue des américains et de ces atlantistes d'anglais.
[^] # Re: Surprise
Posté par TImaniac (site web personnel) . En réponse au journal Lisaac: sorti de la 0.39beta. Évalué à 1.
Attend, je te recites pour voir :
"C'est facile pour n'importe quel jit de sauver les parties de binaires converti. Il reste tout de même une énorme part d'interprétation. C'est obligatoire par exemple pour garder fonctionnel tous les mécanismes de sécurité, si le code est "purement natif" comme un code compilé, il peut faire ce qu'il veut. "
T'affirmes des trucs alors que ca fait 10 ans que la réalité te donne tord. Pas de ma faute à moi.
Continues de défendre tes dieux américains et fichent nous la paix.
Pauvre choupinet, faut pas venir sur trollFr avec un journal pour venter les mérites d'un langage (c'est pas une version révolutionnaire, donc à quoi bon ce journal ci ce n'est faire de la pub pour le langage ?) en commencant l'intro par "Lisaac est le seul langage à prototype compilé."
Et puis bon le côté bon français moi je supporte pas les technos des ricains, c'est du joli.
On parle de techno, rien à foutre de l'origine. En tout cas ca explique que vous soyez pas au fait de l'état de l'art, qui s'établi de part et d'autre de l'atlantique...
[^] # Re: Surprise
Posté par TImaniac (site web personnel) . En réponse au journal Lisaac: sorti de la 0.39beta. Évalué à 3.
T'es rigolo, tu débarque avec un journal, et la première phrase vente le fait que Lisaac soit le "seul" langage à prototype compilé. Forcement ca fait tilte et ca prête à critique. Surtout que le reste des nouveautés est pas spécialement excitant et ne prête pas à grosse discussion...
C'est pas de moi, mais du créateur de Lisaac, qui s'y connait plus que moi en langage et plus que toi aussi je pense.
Alors s'il le dit...
C'est vrai quoi, y'a les vrais langages, les langages des hommes quoi, et les autres, les langages de tapette.
Si tu distribue tes binaires ngen.exe, tu as la même (absence) sécurité qu'un code C.
Toutafé. Mais personne ne déploie le code généré par ngen. D'ailleur ngen va mettre l'exécutable dans un cache du système que si tu vas pas sur google tu risques même pas de le trouver, donc bon...
[^] # Re: Surprise
Posté par TImaniac (site web personnel) . En réponse au journal Lisaac: sorti de la 0.39beta. Évalué à 0.
Désolé pour la pique, mais bon vous semblez pas vraiment au fait de ce qui se fait depuis un bon moment déjà...