web-dev-qa-db-fra.com

Quelles sont les langues importantes à apprendre pour comprendre les différentes approches et concepts?

Lorsque tout ce que vous avez 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 la chose espace blanc. Je sais impératif, fonctionnel, immuable, OOP et quelques systèmes de type et d'autres choses. Maintenant j'en veux plus!

Quelles sont les langues qui adoptent une approche différente et seraient utiles pour le choix d'outils pratiques ou la compréhension théorique?

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

Une chose très intéressante que je me suis trouvée est les langages basés sur la pile monoiconique comme Factor.

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

171
Pepijn

Les questions pratiques sont très subjectives, donc je dirai simplement que l'apprentissage de différents paradigmes de langage 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 vraiment reconsidérer. Vous avez obtenu une certaine exposition fonctionnelle avec Clojure et même Python, mais vous ne l'avez pas pleinement vécu sans Haskell. Si vous êtes vraiment contre Haskell, alors les bons compromis sont soit ML soit OCaml.

Déclaratif, Datalog - Beaucoup de gens recommanderaient Prolog dans cet emplacement, 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 étonnant. Cela transformera votre esprit en bretzel. Vous en remercierez J.

Stack, Factor/Forth - Factor est très puissant et je prévois d'y creuser dès que possible. Forth est le grand-papa des langues Stack, et en bonus supplémentaire c'est simple à implémenter vous-même. Il y a quelque chose à dire sur l'apprentissage par la mise en œuvre.

Flux de données, Oz - Je pense que l'influence d'Oz est sur la reprise et ne fera que continuer de croître à l'avenir.

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

Système expert, CLIPS - Je le recommande toujours. Si vous connaissez Prolog, vous aurez probablement l'avantage de vous mettre à jour, mais c'est une langue très différente.

Frink - Frink est un langage à usage général, mais il est célèbre pour son système de conversions d'unités. Je trouve que ce langage est très inspirant dans sa volonté implacable 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 a ... mais ils devraient. Qi est comme LISP à bien des égards, mais son système de type va vous épater.

Acteurs + Tolérance aux pannes, Erlang - Le modèle de processus d'Erlang reçoit beaucoup de bruit, mais ses mécanismes de tolérance aux pannes et d'échange de code à chaud sont des jeux -en changeant. Vous n'en apprendrez pas beaucoup 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!

288
fogus

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

Pas un langage, mais le Art of the Metaobject Protocol est un truc époustouflant

33

Je programme actuellement Clojure, Python, Java et PHP [...] Quels sont les langages qui adoptent une approche différente et seraient utiles pour l'un ou l'autre outil pratique en choisissant ou compréhension théorique?

C

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

Il 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 vraiment que des indices dans ce tableau --- ils sont juste un type différent d'entier. Pas différent en Java, Python, PHP, sauf caché sous une couche de surface.

En outre, vous pouvez écrire du code orienté objet en C, il vous suffit d'être un peu manuel sur les vtables et autres. La collection de puzzles portables de Simon Tatham est un excellent exemple de code C orienté objet assez accessible; il est également assez bien conçu et mérite d'être lu par un programmeur C débutant/intermédiaire. C'est aussi ce qui se passe dans Haskell --- les classes de type sont en quelque sorte "juste une autre table virtuelle".

Une autre grande chose à propos de C: s'engager dans des questions/réponses avec des programmeurs C qualifiés vous fournira beaucoup de réponses qui expliquent C en termes de constructions de niveau inférieur, ce qui construit votre base de connaissances plus proche du fer.

Je peux manquer 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.

33
Jonas Kölker

J'appuie 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? Des 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 type ajoutent un polymorphisme ad hoc, mais l'inférence de type (encore une chose que les langues que vous ne connaissez pas déjà) fonctionne comme un charme. Les types de données algébriques sont tout simplement géniaux, en particulier pour la modélisation de structures de données arborescentes, mais fonctionnent également très bien pour les énumérations ou les enregistrements simples. Et les monades ... eh bien, disons que les gens les utilisent pour faire des exceptions, des E/S, des analyseurs, des listes de compréhension 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;)

33
user395760

Du 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), une qui prend en charge les spécifications déclaratives (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

27
Galactus

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

13
ypercubeᵀᴹ

Dans les types comme théorèmes/systèmes de types 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, qui seuls m'ont é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 retourne pas cela!

Est basé sur le calcul des constructions inductives, et il a une solide théorie derrière lui. Je ne suis pas assez intelligent pour tout comprendre, mais je pense qu'il vaut la peine d'y jeter un coup d'œil, surtout si vous avez tendance à privilégier 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!

11
GClaramunt

L'une des langues qui m'intéresse a un point de vue très différent (y compris un nouveau vocabulaire pour définir les éléments du langage et une syntaxe diff radicale) 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 caractéristiques uniques vous ouvrent l'esprit et vous font repenser vos connaissances antérieures en programmation (fonctionnelle).

6
jneira

La programmation de flux de données, autrement dit la programmation basée sur les flux, est un bon pas en avant sur la route. Quelques mots à la mode: traitement parallèle, prototypage rapide, programmation visuelle (pas aussi mauvais que les sons en premier).

Les articles de Wikipedia 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 de "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 avoir à être modifiés en interne. Le FBP est donc naturellement orienté composants.

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

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

6
ern0

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

5
Sandman

Tout comme Fogus vous l'a suggéré dans sa liste, je vous conseille également de regarder le langage OzML/Mozart De nombreux paradigmes, principalement ciblés sur 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 Pi Calcul.

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

5
Stephane Rolland

vous voudrez peut-être 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

vous pouvez également essayer l'application Android pour créer visuellement des éléments

4
Belun

Bruce A. Tate, 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
Aissen

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

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

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

2
yatima2975

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

Erlang. Le parallélisme intrinsèque lui donne une sensation plutôt inhabituelle et vous pouvez à nouveau en tirer des enseignements utiles. Je ne suis pas sûr de l'aspect pratique, mais il peut être utile pour certaines tâches de prototypage rapide et les 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 à nouveau complètement différent de l'approche classique, et il devient définitivement pratique une fois que vous avez besoin de faire un calcul réel.

1
pasky

Erlang, Forth et quelques travaux intégrés avec le langage d'assemblage. Vraiment; acheter un kit Arduino ou quelque chose de similaire, et créer un bip polyphonique dans l'assemblage. Vous apprendrez vraiment quelque chose.

1
Bart van Deenen

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 avant d'essayer de l'appliquer à un problème du monde réel. Donc, plutôt que de chercher une nouvelle langue à apprendre, je chercherais d'abord à votre place 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
ivanhoe

Tout en ne répondant pas à votre exigence de "différent" - je parierais 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 étaye 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 installation sans aucune dépendance externe, obtient 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 façons de programmer, mais cela vous montrera certainement de meilleures manières de programmer.

1
vkd

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

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

Une fois que vous avez atteint un niveau parlant presque natif, vous êtes prêt à commencer votre poème.

1
roger

Pour ceux qui ne sont pas là depuis le milieu des années 80, je suggère d'apprendre le BASIC 8 bits. C'est 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 (ou un émulateur) HP-41C, même si rien ne vaut 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 pas de conditions et pas de branches sauf un RST, ce qui a fait revenir le programme à l'étape 0).

Et enfin, je choisirais FORTH (cela a déjà été mentionné). Il a un joli LISP "construire votre langue", mais c'est beaucoup plus de métal nu. Il vous apprendra pourquoi Rails est intéressant et quand les DSL ont du sens et vous aurez un aperçu de ce que pense votre calculatrice non RPN pendant que vous tapez.

1
rbanffy
  1. La programmation ne couvre pas la tâche des programmeurs.
  2. Les nouvelles choses sont toujours intéressantes, mais il y a des vieux trucs 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 une table avec des index). Puis, sur 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: après 2 semaines, un bouton a été allumé, et l'ampoule vient de s'éclairer dans mon esprit. MUMPS est naturel, bas niveau et très-très rapide. (C'est un btree déséquilibré et non formalisé sans types.) Les tendances d'aujourd'hui montrent le chemin du retour: NoSQL, db de valeurs-clés, db multidimensionnel - il ne reste donc que quelques étapes et nous atteignons Mumps.

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 globaux MUMPS (dans MUMPS, variables locales, short: les locals sont les variables de mémoire, et les variables globales, short: 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
ern0

Une chose que je vois manquer dans les autres réponses: les langues basées sur la réécriture des termes.

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

Mathematica est également basé sur la réécriture, bien qu'il ne soit pas si facile de comprendre ce qui se passe, car il est plutôt fermé.

1
JonyEpsilon

Il y a aussi 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 générique ANI expérimental, hautes performances, 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 chercher).

1
itistoday

APL, Forth et Assemblée.

S'amuser un peu. Procurez-vous un kit de robot Lego Mindstorm et le RobotC de 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 autrement. Oui, même langage, mais une perspective très différente.

0
martin's