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.
Réponses:
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!
la source
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
la source
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;)
la source
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.
la source
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
la source
Je suis étonné qu'après 6 mois et des centaines de votes, personne n'ait mentionné SQL ...
la source
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:
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!
la source
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).
la source
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.
la source
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:
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.)
la source
Vous avez appris beaucoup de langues. Il est maintenant temps de se concentrer sur une langue et de la maîtriser.
la source
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
la source
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.
la source
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.
la source
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)
la source
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.
la source
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.
la source
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.
la source
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.
la source
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.
la source
Il y a aussi un anic :
https://code.google.com/p/anic/
Depuis son site:
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).
la source
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.
la source
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é.
la source
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.
la source