À la recherche du language parfait

qui n'existe pas

a marqué ce sujet comme résolu.

Bonjour à tous !

Le titre de ce sujet est plutôt étrange, car on sait tous que le language parfait n'existe pas, mais j'aimerais bien m'approcher de ce qui me plaît le plus (logique). C'est pour cela que je viens vers vous, pour savoir si vous pourriez m'aider.

Je fais principalement des serveurs HTTP, du web scraping ou des interfaces CLI et je n'ai jamais touché au fonctionnel. Avec Python, j'utilise de moins en moins les classes alors que j'en mettais partout en PHP. Je les trouve de moins en moins utile, autant avoir des fonctions et des structures de données. Je connais quelques languages (Python, PHP, JS+Node) et j'ai les notions de bases en C, Ruby et Go sauf que dans ces languages, aucun ne me convient pleinement. Donc voilà ma liste au père noël (si seulement il savait écrire un compilateur et créer une communauté…) :

Je veux :

  • un language plutôt haut niveau (pas besoin de l'être autant que Python, mais pas trop bas non plus, je trouve Go limite). Je suis du même avis que le monsieur de ma signature : "A programming language is low level when its programs require attention to the irrelevant.".
  • une syntaxe claire et sans bavure, pas des $ ou des -> partout. J'apprécie bien les bloques de Go :
1
2
3
4
5
func sum(x []int) int {}
if cond {}
for key, value := range b {}
for {}
for i := 0; i < 10; i++ {}
  • Pas de duck-typing.
1
2
3
4
5
6
7
8
def foo(x):
    try:
        return 12.0 + x
    except TypeError:
        return 12.0

assert foo('') == 12.0
assert foo(True) == 13.0

Déjà avoir un bloque try/except, c'est pas joli, mais en plus il faut vérifier que x n'est pas un booléen ! Ce cas m'a cassé les pieds pendant un moment récemment, parce que je ne comprenais pas ce qu'il se passait. Une passe dans ptpython plus tard et j'avais compris que 12.0 + True == 13.0, sans erreur.

Je ne sais pas comment cela s'appelle, mais j'ai vraiment aimé Go qui bloque à la compilation si un type d'une fonction n'est pas bonne. C'est le seul language que je connais qui fasse ça (même si je sais que c'est assez commun).

C'est tout ! Trois critères, que je n'ai pas trouvé réuni dans un seul language. Vous avez des idées ?

Je suis le seul à n'avoir pas trouvé un language qu'il lui convient ?

Je prends toute responsabilité si la discussion part en mon language c'est le meilleur, ma question incite à ce genre de réponse.

Grillé par mon ami Dominus, je détaille un peu plus quand même :lol:

Salut,

On en a déjà parlé, et tu connais mon point de vu sur la question: j'aime particulièrement Haskell. J'ai accroché assez rapidement avec ce langage quand je me posais la même question que toi, donc j'espère que mon avis te sera utile.

je n'ai jamais touché au fonctionnel

C'est peut-être le moment d'essayer. Je ne te garantie pas que tu vas accrocher tout de suite, mais si tu n'essayes pas tu ne sauras jamais.

En vérité, je pense que chercher un langage avec le bon niveau d'abstraction est un peu absurde, ou en tout cas pas prioritaire. L'important c'est d'abord le paradigme.

Quant à tes critères:

un language plutôt haut niveau

Haskell est très haut niveau mais garde des performances respectables.

une syntaxe claire et sans bavure, pas des $ ou des -> partout

Même moi j'ai trouvé la syntaxe de Haskell répugnante au début, mais en creusant un peu plus, on comprend vite que chacun de ces éléments de syntaxe a une raison précise d'être.

Pas de duck-typing.

Si tu aimes les systèmes de type rigoureux, tu seras servi en Haskell.

Déjà avoir un bloque try/except

Haskell n'en a pas, mais si tu te penches un peu sur la question, tu comprendras rapidement qu'on a des outils puissants qui remplacent tout le mécanisme d'exception.

Je ne sais pas comment cela s'appelle, mais j'ai vraiment aimé Go qui bloque à la compilation si un type d'une fonction n'est pas bonne.

Haskell fait ça, ça s'appelle le type-checking je crois.


Je tiens aussi à dire, si tu comptes rester sur de l'impératif, que Swift répond à tous tes critères. Malgré le fait que Swift ne soit pour l'instant disponible que sur les plateformes UNIX, étant donné qu'il est open-source, je pense qu'un runtime Windows est envisageable dans un futur pas si lointain. C'est le langage impératif avec lequel j'ai le plus de satisfaction. La seule chose que je lui reproche est son immaturité, principalement pour son manque de librairies.


Autre langage que je n'ai jamais testé mais dont j'ai entendu beaucoup de bien: Scala. C'est un hybride fonctionnel-impératif qui tourne sur la JVM. Je saurai pas en dire plus, mais si quelqu'un s'y connaît ça serai bien qu'il détaille un peu plus que moi :)

Bonne chance,

felko

+0 -0

Puisqu'on cite Haskell, il faut que quelqu'un cite Ocaml, autre langage fonctionnel (pas que, mais il est peu utilisé en impératif) fortement typé, haut niveau, élégant, au typage fort, statique et polymorphique1.

Multi-plateforme, avec une syntaxe un peu déroutante, mais on s'y habitue.

Si tu veux rester dans l'impératif, je pense qu'Ada, que je ne connais que de réputation, répond aussi à tes critères.

Ou Rust. :D


  1. Je suis en train de l'apprendre, je laisse les experts en parler plus avant. 

+3 -0

Ok, 3/3 à proposer du fonctionnel, je crois que je sais ce que je vais lire dans les prochains jours.

Moi qui n'ai jamais touché à du fonctionnel, comment choisir entre Haskell et OCaml ? J'aurai tendance à partir sur Haskell de par la communauté et des aides possibles dans mon entourage virtuel (poke felko :) ).

J'avais aimé Haskell. Je trouve que le paradigme fonctionnel est exploré plus loin qu'en OCaml (syntaxe pour la composée de fonction plus claire, mieux foutue), un filtrage par motif plus clair et plus expressif.
L'évaluation paresseuse est un concept intéressant, à essayer.
Le système de types est extrêmement puissant, il est possible de paramétriser un type (qui prend des arguments) comme on pourrait le faire avec des fonctions. Il en résulte des constructions abstraites très puissantes et très expressives.
De plus les listes en intention sont également très expressives. Il y a encore beaucoup à dire.

OCaml est intéressant également. Il supporte l'OO (mais je n'ai pas testé) et la programmation procédurale. Mais je suis moins fan. Enfin je n'ai testé que Caml (pas OCaml) et ça m'a moins emballé que Haskell. Si un partisan de OCaml est là qu'il se signale, car je trouve que OCaml est moins bien que Haskell sur bien des aspects :euh: quel est l'intérêt d'OCaml ?

Avec Python, j'utilise de moins en moins les classes alors que j'en mettais partout en PHP. Je les trouve de moins en moins utile, autant avoir des fonctions et des structures de données.

tleb

À vrai dire, les objets ne sont pas vraiment là pour faire office de structures de données justement. Une structure de données, c'est de la donnée brute tandis qu'un object c'est une abstraction par dessus de la donnée. L'abstraction étant les méthodes. Avec un objet, on n'a pas à toucher aux données internes, on appelle juste l'action/méthode qui fait/retourne ce qu'on veut, et qui elle touchera aux données internes.

Mais attention, vouloir de la donnée pure d'un côté et les fonctions de l'autre sans faire de POO, ça se défend parfaitement !

Je ne sais pas comment cela s'appelle, mais j'ai vraiment aimé Go qui bloque à la compilation si un type d'une fonction n'est pas bonne. C'est le seul language que je connais qui fasse ça (même si je sais que c'est assez commun).

Le typage statique. Et tu seras effectivement servi avec Haskell ou OCaml si tu aimes que tout soit bien typé, héhé. Je pense qu'ici même, il y a pas mal de gens qui font un peu de Haskell (et aussi de l'OCaml), je pense donc que tu pourras obtenir de l'aide.

une syntaxe claire et sans bavure, pas des $ ou des -> partout.

Partons sur un Lisp statiquement typé, alors, nan ? ;)

Mais attention, vouloir de la donnée pure d'un côté et les fonctions de l'autre sans faire de POO, ça se défend parfaitement !

Tout à fait d'accord ! D'habitude, c'est l'évolution inverse, c'est pour cela que j'ai précisé. Et j'ai précisé pour qu'on ne propose pas Java. ^^

Le typage statique. Et tu seras effectivement servi avec Haskell ou OCaml si tu aimes que tout soit bien typé, héhé. Je pense qu'ici même, il y a pas mal de gens qui font un peu de Haskell (et aussi de l'OCaml), je pense donc que tu pourras obtenir de l'aide.

J'attaque doucement Haskell, je vais voir comment ça se passe.

Partons sur un Lisp statiquement typé, alors, nan ? ;)

Au

Tu pousses le bouchon un peu trop loin, Au. :-°

Pour ce que est de Pascal ou Delphi, j'avoue avoir un peu de mal à partir sur des languages qui sont en train de disparaître.

Hop, 1GiB des 3 qu'il me restait sur mon disque pour haskell-platform.

Banni

Si un partisan de OCaml est là qu'il se signale, car je trouve que OCaml est moins bien que Haskell sur bien des aspects :euh: quel est l'intérêt d'OCaml ?

Algue-Rythme

Je ne suis pas "partisan" de OCaml, mais le système de modules me parait plus "logique" que les class de Haskell, mais peut-être moins pratique à l'usage.

+0 -0

Salut,

Effectivement c'est un sujet à troll mais je vais tenté d'y réponde sérieusement.

Il y a un nouveau langage nommé Crystal qui est vraiment pas mal. Je n'arriverais pas à dire s'il est haut niveau ou bas niveau, mais ce que je peux dire, c'est qu'il est:

  • Statiquement typé

  • Rapide (proche du C)

  • Syntaxe élégante (Quasiment du Ruby)

  • Librairie standard très riche

  • Jeune (Il ne traîne pas derrière lui 20 ou 40 années de rétrocompatibilité super lourd qui ralentis son apprentissage)

  • Propose un binding sur du C

  • Une communauté jeune mais très active (Sur Gitter et IRC principalement)

  • Écosystème peu mature (Certe il n'y a pas armada de lib, mais le fait qu'il soit proche du Ruby et qu'il peux exécuté du code C aide à la création de lib)

  • Permet un accès aux fonctionnalités bas niveau de LLVM

  • Si tu connais un peu le C++, on peux dire que par défaut, toutes les variables sont du type auto, et serons déterminée à la compilation

  • Les variables peuvent avoir plusieurs types (String | Array(Char); (Integer | String)), etc etc. (Très pratique quand deux appels de fonction son identique pour plusieurs classe :) )

Comme tu peux le voir, il est prometeur, mais encore jeune, son écosystème n'est pas encore fini, mais possède déjà pas mal d'outils comme un serveur web, des librairie graphique (SDL | SFML | Qt?), et plein d'autres outils.

+0 -0

Je n'ai aucun avis figé sur un éventuel "language" parfait.

C'était pour avoir un titre accrocheur, je sais très bien qu'il n'y en a pas.

on sait tous que le language parfait n'existe pas, mais j'aimerais bien m'approcher de ce qui me plaît le plus


J'avais déjà vu Crystal mais j'avoue que la syntaxe de Ruby ne m'attire pas plus que cela. Pour l'instant, je suis en train de lire Learn you a Haskell.

Il y a un nouveau langage nommé Crystal qui est vraiment pas mal.

Necros211

Dans la même veine, mais un peu plus ancien, il y a aussi le langage nim. Il dispose d'avantages semblables, et d'une syntaxe plutôt inspirée du Python.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte