Quels sont les langages importants à apprendre pour comprendre différentes approches et concepts? [fermé]


172

Quand tout ce que vous avez, c'est une paire de coupe-boulons et une bouteille de vodka, tout ressemble à la serrure de la porte du hangar à bateaux de Wolf Blitzer. (Remplacez cela par un marteau et un clou si vous ne lisez pas xkcd)

Je programme actuellement Clojure, Python, Java et PHP, donc je suis familier avec la syntaxe C et LISP ainsi que les espaces. Je connais des systèmes impératifs, fonctionnels, immuables, OOP et quelques types de systèmes et d'autres choses. Maintenant j'en veux plus!

Quels sont les langages qui adoptent une approche différente et qui seraient utiles pour le choix des outils pratiques ou pour la compréhension théorique?

Je n'ai pas envie d'apprendre un autre langage fonctionnel (Haskell) ou un autre langage OOP impératif (Ruby), et je ne veux pas non plus pratiquer des langages amusants peu pratiques comme Brainfuck.

Une chose très intéressante que j'ai trouvée moi-même sont les langages basés sur des piles monoiconiques comme Factor.

Ce n'est que lorsque je sens que je comprends la plupart des concepts et que j'ai des réponses à toutes mes questions, je veux commencer à penser à mon propre langage de jouet pour contenir toutes mes préférences personnelles.


3
Je voudrais +1 pour la référence xkcd seule, mais la question est également intéressante.

63
Vous semblez être un programmeur à succès, le reste est incrémental. Je n'essaie pas d'être un connard, mais ... comment se passe ta vie en termes de finances, de relations, de santé, de plaisir, de passe-temps? Le moment est peut-être venu de poursuivre certaines de ces choses. Je ne pense pas que vous ayez besoin de connaître plus d'une douzaine de langues à la fois. Si vous êtes payé pour en utiliser un, apprenez-le. Si vous voulez écrire un livre sur un, apprenez-le. En dehors de cela, vous avez une bonne base de programmation. Pourquoi apprendre quelque chose (comme J - my subj opinion :)) que vous n'utiliserez pas sérieusement (read make $) nulle part? Ne soyez pas le hacker le plus cool d'un cimetière.
Hamish Grubijan

6
Oui, je suis un programmeur performant selon mes propres normes. Je ne gagne pas beaucoup d'argent actuellement, mais bon, j'ai 19 ans. J'investis du temps dans tous ces points et plus encore, mais je trouve à la fois un passe-temps et du plaisir dans la programmation. Je veux aussi dire qu'il y a une différence entre comprendre une langue et la maîtriser. Maîtriser Python et Clojure me suffit. Je veux comprendre les autres options disponibles, car cela améliorera mon code, m'aidera à comprendre mon ordinateur et m'aidera à définir mon propre langage de programmation.
Pepijn

5
Avez-vous vu Programmers.SE ? Cela relève du type de question qu'il vaut mieux y poser.

Réponses:


287

Les aspects pratiques sont très subjectifs, donc je dirai simplement que l'apprentissage de différents paradigmes linguistiques ne servira qu'à faire de vous un meilleur programmeur. Quoi de plus pratique que ça?

Fonctionnel, Haskell - Je sais que vous avez dit que vous ne vouliez pas, mais vous devriez vraiment reconsidérer. Vous avez obtenu une certaine exposition fonctionnelle avec Clojure et même Python, mais vous ne l'avez pas pleinement expérimenté sans Haskell. Si vous êtes vraiment contre Haskell, les bons compromis sont soit ML, soit OCaml.

Déclaratif, Datalog - Beaucoup de gens recommanderaient Prolog dans ce slot, mais je pense que Datalog est un exemple plus propre d'un langage déclaratif.

Array, J - Je viens de découvrir J, mais je trouve que c'est un langage époustouflant. Cela vous transformera en bretzel. Vous remercierez J pour cela.

Stack, Factor / Forth - Factor est très puissant et je prévois de creuser dedans dès que possible. Le quatrième est le grand-père des langages Stack, et en prime, il est simple à mettre en œuvre vous-même. Il y a quelque chose à dire sur l'apprentissage par la mise en œuvre.

Dataflow, Oz - Je pense que l'influence d'Oz est à la hausse et ne fera que croître à l'avenir.

Basé sur des prototypes, JavaScript / Io / Self - Self est le grand-papa et très influent sur tous les langages basés sur des prototypes. Ce n'est pas la même chose que la POO basée sur les classes et ne doit pas être traité comme tel. Beaucoup de gens arrivent à un langage prototype et créent un système de classes ad hoc, mais si votre objectif est d'élargir votre esprit, alors je pense que c'est une erreur. Utilisez la langue à sa pleine capacité. Lisez Organiser des programmes sans cours pour des idées.

Système expert, CLIPS - Je recommande toujours cela. Si vous connaissez Prolog, vous aurez probablement l'avantage pour vous mettre à niveau, mais c'est un langage très différent.

Frink - Frink est un langage à usage général, mais il est célèbre pour son système de conversion d'unités. Je trouve ce langage très inspirant dans sa volonté incessante d'être le meilleur dans ce qu'il fait. De plus ... c'est vraiment amusant!

Types fonctionnels + optionnels, Qi - Vous dites que vous avez de l'expérience avec certains systèmes de type, mais avez-vous de l'expérience avec les systèmes de type "skinnable *? Personne n'a ... mais ils devraient. Qi est comme Lisp à bien des égards, mais c'est le système de type va vous épater.

Acteurs + Tolérance aux pannes, Erlang - Le modèle de processus d'Erlang fait beaucoup de bruit, mais ses mécanismes de tolérance aux pannes et d'échange de codes à chaud changent la donne. Vous n'apprendrez pas grand-chose sur FP que vous n'apprendriez pas avec Clojure, mais ses fonctionnalités FT vous feront vous demander pourquoi plus de langues ne semblent pas réussir.

Prendre plaisir!


8
+1 - une excellente réponse.
duffymo

2
Merci de m'avoir indiqué tant de langues à apprendre.

2
J'ajouterais Erlang pour la programmation basée sur l'acteur et Fortress pour la programmation parallèle.
nickik

2
+1 pour le remplacement à chaud et la reconnaissance de la tolérance aux pannes d'Erlang
Mic

14
Pas de montage? Il est bon de comprendre le fonctionnement des processeurs pour savoir quel type de code ils aiment.
Nick T

33

Qu'en est-il de Prolog (pour l'unification / retour en arrière, etc.), Smalltalk (pour "tout est un message"), Forth (polissage inversé, interprètes filetés, etc.), Scheme (suites)?

Pas une langue, mais l' art du protocole Metaobject est une chose hallucinante


Corrigez-moi si je me trompe, mais je pense que Python fait déjà des suites. Et d'après ce que j'ai lu, je préfère apprendre Factor et Objective-C que Forth et Smalltalk, mais je pourrais peut-être couper les coins ronds là-bas.
Pepijn

1
@pepijn, python n'a pas de continuations de première classe (bien que je travaille sur un hack de bytecode pour le
simuler

1
Objective-C s'inspire de Smalltalk, mais je pense que la vraie chose à retenir de ST est le dynamisme de l'environnement lui-même.
John Cromartie

33

Je seconde Haskell. Ne pensez pas "Je connais un Lisp, donc je connais la programmation fonctionnelle". Avez-vous déjà entendu parler des classes de type? Types de données algébriques? Monades? Les langages fonctionnels "modernes" (plus ou moins - au moins pas 50 ans;)), en particulier Haskell, ont exploré une pléthore de nouveaux concepts utiles très puissants. Les classes de types ajoutent un polymorphisme ad hoc, mais l'inférence de type (encore une autre chose que les langages que vous connaissez déjà n'ont pas) fonctionne comme un charme. Les types de données algébriques sont tout simplement géniaux, en particulier pour modéliser des structures de données semblables à des arbres, mais fonctionnent également bien pour les énumérations ou les enregistrements simples. Et les monades ... eh bien, disons simplement que les gens les utilisent pour faire des exceptions, des E / S, des analyseurs, des compréhensions de listes et bien plus encore - de manière purement fonctionnelle!

De plus, tout le sujet est suffisamment profond pour en occuper un pendant des années;)


"De plus, tout le sujet est assez profond pour en occuper un pendant des années;)" - Je me demande, pourquoi serait-ce une bonne chose? Après tout, nos vies sont finies.
vegai

1
@vegai: Pourquoi serait-ce une mauvaise chose? Il y a de pires façons de passer sa vie à apprendre. Et personne n'a dit que vous deviez étudier pendant des années juste pour utiliser correctement la langue - juste que le sujet n'était pas épuisé après un court laps de temps. (Notez également le smiley - cette partie n'est pas tout à fait sérieuse.)

32

Je programme actuellement Clojure, Python, Java et PHP [...] Quels sont les langages qui adoptent une approche différente et qui seraient utiles pour le choix des outils pratiques ou la compréhension théorique?

C

Il y a beaucoup de code C qui traîne - c'est vraiment pratique. Si vous apprenez également le C ++, il y a beaucoup plus de code (et le saut est court une fois que vous connaissez C et Java).

Cela vous donne également (ou vous oblige à avoir) une grande compréhension de certaines questions théoriques; par exemple, chaque programme en cours d'exécution vit dans un tableau d'octets de 4 Go, dans un certain sens. Les pointeurs en C ne sont en réalité que des indices dans ce tableau - ils ne sont qu'un type d'entier différent. Pas différent en Java, Python, PHP, sauf caché sous une couche de surface.

De plus, vous pouvez écrire du code orienté objet en C, il vous suffit d'être un peu manuel sur les vtables et autres. Portable Puzzle Collection de Simon Tatham est un excellent exemple de code C orienté objet assez accessible; il est également assez bien conçu et vaut bien une lecture pour un programmeur C débutant / intermédiaire. C'est aussi ce qui se passe dans Haskell - les classes de type sont en un certain sens "juste une autre table virtuelle".

Une autre grande chose à propos de C: engager des questions-réponses avec des programmeurs C qualifiés vous donnera beaucoup de réponses qui expliquent C en termes de constructions de niveau inférieur, ce qui renforce votre base de connaissances plus proche de l'acier.

Je manque peut-être le point d'OP --- je pense que je le suis, à en juger par les autres réponses --- mais je pense que cela pourrait être une réponse utile à d'autres personnes qui ont une question similaire et lisent ce fil.


1
Cela nécessite plus de votes positifs. C est le langage numéro un lorsque vous avez besoin ou que vous voulez passer au bare metal et comprendre le fonctionnement de la machine - ou des langages de programmation de plus haut niveau - à partir de zéro. De plus, c'est aussi un compilateur C très universel pour (presque) toutes les architectures de CPU jamais conçues.
Dietr

27

Sur le site de Peter Norvig:

"Apprenez au moins une demi-douzaine de langages de programmation. Incluez un langage qui prend en charge les abstractions de classe (comme Java ou C ++), un qui prend en charge l'abstraction fonctionnelle (comme Lisp ou ML), un qui prend en charge l'abstraction syntaxique (comme Lisp), un qui prend en charge déclarative spécifications (comme les modèles Prolog ou C ++), une qui prend en charge les coroutines (comme Icon ou Scheme) et une qui prend en charge le parallélisme (comme Sisal). "

http://norvig.com/21-days.html


13

Je suis étonné qu'après 6 mois et des centaines de votes, personne n'ait mentionné SQL ...


10

Dans les types comme théorèmes / systèmes de type avancés: Coq (je pense qu'Agda entre aussi dans cette catégorie).

Coq est un assistant de preuve intégré dans un langage de programmation fonctionnel.

Vous pouvez écrire des preuves mathématiques et Coq aide à construire une solution. Vous pouvez écrire des fonctions et en prouver les propriétés.

Il a des types dépendants, cela seul m'a époustouflé. Un exemple simple:

concatenate: forall (A:Set)(n m:nat), (array A m)->(array A n)->(array A (n+m))

est la signature d'une fonction qui concatène deux tableaux de taille n et m d'éléments de A et renvoie un tableau de taille (n + m). Il ne se compilera pas si la fonction ne renvoie pas cela!

Est basé sur le calcul des constructions inductives, et il a une théorie solide derrière lui. Je ne suis pas assez intelligent pour tout comprendre, mais je pense que cela vaut la peine d'y jeter un coup d'œil, surtout si vous vous orientez vers la théorie des types.

EDIT: Je dois mentionner: vous écrivez une fonction en Coq et ensuite vous pouvez PROUVER qu'elle est correcte pour n'importe quelle entrée, c'est incroyable!


Je seconde coq. Lorsque vous apprenez la plupart des langues, vous pouvez toujours utiliser vos anciennes techniques, mais coq vous oblige à écrire des programmes complets qui fonctionnent toujours.
Bruno Martinez

J'ai essayé d'apprendre le Coq l'été dernier mais j'ai abandonné car j'avais du mal à trouver une bonne documentation sur l'apprentissage et son utilisation . Aucune suggestion?

J'ai appris d'un cours à mon université, puis j'ai lu "Coq'Art: Le calcul des constructions inductives" Ce n'est pas suffisant pour vraiment le maîtriser, mais suffisant pour l'apprécier.
Bruno Martinez

6

L' une des langues que je suis intéressé pour avoir un point de vue très différent (y compris un nouveau vocabulaire pour définir les éléments de langage et une syntaxe radicale diff) est J . Haskell serait le choix évident pour moi, bien qu'il s'agisse d'un langage fonctionnel, car son système de types et d'autres fonctionnalités uniques vous ouvrent l'esprit et vous font repenser vos connaissances antérieures en programmation (fonctionnelle).


5

Tout comme fogus vous l'a suggéré dans sa liste, je vous conseille aussi de vous pencher sur le langage OzML / Mozart De nombreux paradigmes, principalement destinés à la programmation simultanée / multi-agents.

Concernant la concurrence et le calcul distribué, l'équivalent du calcul Lambda (qui est derrière la programmation fonctionnelle) est appelé le calcul Pi.

J'ai seulement commencé à regarder une implémentation du calcul Pi. Mais ils ont déjà élargi mes conceptions de l'informatique.


5

La programmation Dataflow, alias la programmation basée sur les flux, est une bonne longueur d'avance sur la route. Quelques mots à la mode: traitement parallèle, prototypage rapide, programmation visuelle (pas aussi mauvais que les sons d'abord).

Les articles de Wikipédia sont bons:

En informatique, la programmation basée sur les flux (FBP) est un paradigme de programmation qui définit les applications comme des réseaux de processus «boîte noire», qui échangent des données à travers des connexions prédéfinies par passage de messages, où les connexions sont spécifiées en externe aux processus. Ces processus de boîte noire peuvent être reconnectés à l'infini pour former différentes applications sans devoir être modifiés en interne. FBP est donc naturellement orienté composants.

Lisez le livre de JPM: http://jpaulmorrison.com/fbp/

(Nous avons écrit une implémentation simple en C ++ à des fins de domotique, et nous en sommes très satisfaits. La documentation est en cours de construction.)


+1, je crois que le flux de données et la programmation basée sur le flux (peut-être aussi la programmation fonctionnelle-réactive) deviendront une partie importante de notre avenir multicœur.

5

Vous avez appris beaucoup de langues. Il est maintenant temps de se concentrer sur une langue et de la maîtriser.


3

peut-être voudrez-vous essayer LabView pour sa programmation visuelle, bien que ce soit à des fins d'ingénierie.

néanmoins, vous semblez assez intéressé par tout ce qui existe, d'où la suggestion

aussi, vous pouvez essayer l'appinventor Android pour créer visuellement des éléments


LabView a une drôle de «syntaxe» mais c'est vraiment pénible de cliquer et de faire glisser tout votre code. Je ne le recommanderais pas à un programmeur.
Ishtar

C'est ce qui est livré avec le Lego NXT, non? Cela n'a absolument pas fonctionné pour moi. Merci pour la suggestion.
Pepijn

il vient de National Instruments. LabVIEW est un environnement de développement graphique qui rend les scientifiques et les ingénieurs plus productifs
Belun

2

Bruce A. Tate, en prenant une page de The Pragmatic Programmer, a écrit un livre sur exactement cela: Seven Languages ​​in Seven Weeks: A Pragmatic Guide to Learning Programming Languages

Dans le livre, il couvre Clojure, Haskell, Io, Prolog, Scala, Erlang et Ruby.


2
Soyez averti que le livre regorge de références à des films qui sont apparemment devenus une partie de la culture pop américaine. Si vous n'avez pas vu les films, vous vous demanderez de quoi parle Tate. Si vous avez vu les films, vous pouvez toujours être découragé par l'anthropomorphication constante des langages de programmation ou simplement par ne pas aimer les personnages en question (je n'aime pas Mary Poppins; par coïncidence, je n'aime pas non plus Ruby, donc l'analogie peut être sur quelque chose).
Alan Plum

2

Mercure : http://www.mercury.csse.unimelb.edu.au/

C'est un Prologue typé, avec des types et des modes d'unicité (c'est-à-dire spécifiant que le prédicat append(X,Y,Z) signifiant X ajouté à Y est Z donne un Z étant donné un X et un Y, mais peut donner plusieurs X / Y pour un Z donné). En outre, pas de coupe ou d'autres prédicats extra-logiques.

Si vous voulez, c'est à Prolog comme Haskell est à Lisp.


1
  1. La programmation ne couvre pas la tâche des programmeurs.
  2. Les nouvelles choses sont toujours intéressantes, mais il y a des vieilles choses très cool.

Le premier système de base de données était dBaseIII pour moi, je passais environ un mois à écrire de petits exemples (dBase / FoxPro / Clipper est une base de données basée sur des tables avec des index). Puis, à mon premier lieu de travail, j'ai rencontré MUMPS et j'ai eu mal à la tête. J'étais jeune et frais, mais il a fallu 2 semaines pour comprendre le modèle de base de données MUMPS. Il y a eu un moment, comme dans la bande dessinée: au bout de 2 semaines, un bouton a été allumé, et l'ampoule vient de s'allumer dans mon esprit. MUMPS est naturel, de bas niveau et très très rapide. (C'est un arbre binaire non équilibré et non formalisé sans types.) Les tendances d'aujourd'hui montrent le chemin du retour: NoSQL, base de données clé-valeur, base de données multidimensionnelle - il ne reste donc que quelques étapes et nous atteignons les oreillons.

Voici une présentation des avantages de MUMPS: http://www.slideshare.net/george.james/mumps-the-internet-scale-database-presentation

Un court document sur la base de données hiérarchique: http://www.cs.pitt.edu/~chang/156/14hier.html

Une introduction aux globals MUMPS (dans MUMPS, les variables locales, bref: les locaux sont les variables de mémoire, et les variables globales, bref: les globals sont les "variables db", la définition d'une variable globale va immédiatement sur le disque): http: // gradvs1.mgateway.com/download/extreme1.pdf (PDF)


1

Dites que vous voulez écrire un poème d'amour ...

Au lieu d'utiliser un marteau simplement parce qu'il y en a déjà un dans votre main, apprenez les outils appropriés pour la tâche: apprenez à parler français.

Une fois que vous avez atteint le niveau de langue quasi native, vous êtes prêt à commencer votre poème.


4
Bien sûr, ce sera un poème de poubelle, car vous devez parler bien au-dessus du niveau natif ordinaire pour écrire de la poésie. Et votre petite amie devra apprendre le français pour le lire. À moins qu'elle ne soit déjà française, auquel cas elle trouvera probablement cela embarrassant.
John Lawrence Aspden

Délicieuse ironie, John, j'aime ça (je suis français, btw)
Vinzz

1

Bien que l'apprentissage de nouvelles langues au niveau académique soit un passe-temps intéressant, à mon humble avis, vous ne pouvez pas vraiment apprendre à en utiliser une tant que vous n'aurez pas essayé de l'appliquer à un problème du monde réel. Donc, plutôt que de chercher une nouvelle langue à apprendre, je chercherais à votre place d'abord de nouvelles choses à construire, et alors seulement je chercherais la bonne langue à utiliser pour ce projet spécifique. Choisissez d'abord le problème, puis l'outil, et non l'inverse.


1

Pour tous ceux qui n'ont pas été là depuis le milieu des années 80, je suggère d'apprendre le BASIC 8 bits. C'est de très bas niveau, très primitif et c'est un exercice intéressant à programmer autour de ses trous.

Sur la même ligne, je choisirais une calculatrice de la série HP-41C (ou un émulateur, bien que rien ne bat le vrai matériel). Il est difficile d'envelopper votre cerveau, mais cela en vaut la peine. Une TI-57 fera l'affaire, mais ce sera une expérience complètement différente. Si vous parvenez à résoudre des équations du deuxième degré sur une TI-55, vous serez considéré comme un maître (il n'avait ni conditionnelles ni branches sauf un RST, ce qui a fait revenir le programme à l'étape 0).

Et enfin, je choisirais FORTH (il a déjà été mentionné). Il a un joli truc Lisp-ish "construisez votre langage", mais est beaucoup plus bare metal. Il vous apprendra pourquoi Rails est intéressant et quand les DSL ont du sens et vous aurez un aperçu de ce que votre calculatrice non RPN pense pendant que vous tapez.


1

PostScript. C'est un langage plutôt intéressant car il est basé sur une pile, et c'est assez pratique une fois que vous voulez mettre les choses sur papier et que vous voulez soit le faire, soit déterminer pourquoi cela ne se fait pas.

Erlang. Le parallélisme intrinsèque lui donne une sensation plutôt inhabituelle et vous pouvez à nouveau en apprendre des choses utiles. Je ne suis pas si sûr de l'aspect pratique, mais cela peut être utile pour certaines tâches de prototypage rapide et des systèmes hautement redondants.

Essayez de programmer des GPU - CUDA ou OpenCL. Ce ne sont que des extensions C / C ++, mais le modèle mental de l'architecture est encore une fois complètement différent de l'approche classique, et cela devient définitivement pratique une fois que vous avez besoin de faire une analyse des nombres réels.


1

Erlang, Forth et certains fonctionnent avec le langage d'assemblage. Vraiment; achetez un kit Arduino ou quelque chose de similaire, et créez un bip polyphonique lors de l'assemblage. Vous apprendrez vraiment quelque chose.


1

Il y a aussi un anic :

https://code.google.com/p/anic/

Depuis son site:

Plus rapide que C, plus sûr que Java, plus simple que * sh

anic est le compilateur d'implémentation de référence pour le langage de programmation de flux de données à usage général expérimental, haute performance, implicitement parallèle et sans blocage.

Il ne semble plus être en développement actif, mais il semble avoir des concepts intéressants (et c'est, après tout, ce que vous semblez être après).


1

Tout en ne répondant pas à votre exigence de «différent» - je parie que Fantom est un langage qu'un programmeur professionnel devrait regarder. De leur propre aveu, les auteurs de fantom l'appellent un langage ennuyeux. Il consolide simplement les cas d'utilisation les plus courants de Java et C #, avec une syntaxe de fermeture empruntée à ruby ​​et à des langages plus récents similaires.

Et pourtant, il parvient à avoir son propre compilateur amorcé, à fournir une plate-forme qui a une baisse d'installation sans dépendances externes, à obtenir les bons packages - et fonctionne sur Java, C # et maintenant le Web (via js).

Cela n'élargira peut-être pas vos horizons en termes de nouvelles méthodes de programmation, mais cela vous montrera certainement de meilleures façons de programmer.


1

Une chose qui me manque dans les autres réponses: les langages basés sur la réécriture de termes.

Vous pouvez jeter un œil à Pure - http://code.google.com/p/pure-lang/ .

Mathematica est également basé sur la réécriture, même s'il n'est pas si facile de comprendre ce qui se passe, car il est plutôt fermé.


0

APL, Forth et Assemblée.

S'amuser un peu. Prenez un kit de robot Lego Mindstorm et le RobotC de la CMU et écrivez du code robotique. Des choses se produisent lorsque vous écrivez du code qui doit "se salir" et interagir avec le monde réel que vous ne pouvez pas apprendre d'une autre manière. Oui, même langage, mais dans une perspective très différente.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.