Quel est le langage de programmation le plus orthogonal? [fermé]

46

Je suis souvent ennuyé de devoir enseigner aux étudiants de première année des règles de langage spéciales (comme la désintégration de pointeur en tableau) qui n'ont absolument rien à voir avec la programmation en soi. Alors je me suis demandé:

Quel est le langage de programmation avec le plus petit nombre de règles de langage spéciales, où tout est de première classe et peut être composé sans restrictions techniques gênantes? Une telle langue ne serait-elle pas la langue d'enseignement idéale?

Note du modérateur

Nous recherchons des réponses longues qui fournissent des explications et un contexte. Ne vous contentez pas d’énumérer une langue: veuillez expliquer pourquoi, selon vous, la langue répond à la question. Les réponses qui n'expliquent rien seront supprimées. Voir Bon subjectif, Mauvais subjectif pour plus d'informations.

fredoverflow
la source
1
Essayez d’utiliser Unlambda - il ya presque le plus petit nombre possible de modules de langage. Réponse un peu plus sérieuse: Scheme (R5RS en particulier).
SK-logic
@ SK-logic, Unlambda n'est pas orthogonal parce que I=SKK. Les langues orthogonales par excellence sont les langues à instruction unique telles que Jot et RSSB.
Peter Taylor
11
@ Peter - Je ne pense pas qu'il signifie strictement minimal. Une langue minimale se termine avec toutes les définitions supplémentaires de la bibliothèque, de sorte que les étudiants doivent les apprendre de toute façon. La façon dont je lis cette question est "quelle langue suit le mieux le principe de la moindre surprise?".
Steve314
1
@ Peter Taylor: pourriez-vous donner un exemple où Timtowtdi est en conflit avec l'orthogonalité?
keppla
1
Je pense que «orthogonalité» est un mauvais choix de mots ici. Comme Peter et Steve l'ont établi, ce que vous entendez vraiment par "principe de moindre surprise", ou une qualité étroitement liée.
Konrad Rudolph

Réponses:

53

À mon avis, Lisp ou Smalltalk gagneraient, dit-il, «très peu de règles». La syntaxe nue peut être écrite sur un onglet de bière.

Mais selon mon expérience, la simplicité de Lisp et de Smalltalk ne signifie pas qu’ils sont simples à comprendre et faciles à enseigner. Bien que ce ne soit pas la «pure» manière, selon mon expérience, le style de liste à faire des langages impératifs est le plus facile à comprendre pour les débutants.

Par conséquent, je suggérerais Python, Ruby ou quelque chose d’abstraction similaire : vous trouvez (presque) tous les concepts de base en eux (OK, pas de pointeurs), mais vous n’avez pas besoin de le comprendre dès le début pour que quelque chose fonctionne.

keppla
la source
33
impressionnant travail de mesure de la syntaxe en unités d’une étiquette de bière.
psr
3
Et n'oublie pas Perl. Beaucoup plus de Perl que la plupart des gens ne le pensent, et la communauté des utilisateurs est immense .
Randal Schwartz
20
Perl est peut-être très puissant, mais un mec qui trouve que c'est la voie la plus facile pour programmer doit avoir l'équivalent des tunnels des temples d'Indiana Jones comme couloir principal de sa chambre à sa douche ...
Kheldar
9
La syntaxe de Perl pourrait tenir sur une étiquette de bière, à condition de boire suffisamment de bière.
Dave Sherohman
4
@Randal, la question demande un langage orthogonal . La philosophie de Perl est d'être non orthogonale - "il y a plus d'une façon de le faire".
Peter Taylor
41

Je dirais que LISP, ou Scheme ou une langue de cette famille serait la plus orthogonale. Avec let, lambda, define, if, cons, listet ( )vous pouvez apprendre à peu près tout ce que vous voudriez dans un cours intro. Il n’ya pas non plus besoin de directives de prétraitement ou de int main()choses comme celles que les étudiants comprennent mais ne voient pas de raison.

Dans mes cours d'introduction CS, nous avons fait beaucoup de choses vraiment sympas avec Scheme: implémenter une machine de Turing, implémenter un ordinateur TC-201, écrire une grammaire sans contexte, utiliser la récursion, trier les fusions et les insertions, implémenter des additionneurs d'autres choses.

J'avais déjà suivi Java en AP Comp Sci avant de commencer mes études, mais Scheme était génial, car je pouvais réduire l'encombrement et me concentrer sur les concepts de mon programme. C'était une excellente classe et je vous recommande fortement de l'essayer pour votre enseignement.

BlackJack
la source
5
Se mettre d'accord. Racket (anciennement PLT Scheme) est une variante légèrement plus conviviale que notre école utilise avec succès dans les classes d’initiation.
NickAldwin
3
Qu'en est-il de Haskell? Je ne connais pas beaucoup Haskell, mais je m'attendrais à ce que ce soit une langue orthogonale.
Giorgio
4
@Giorgio: La syntaxe Haskell est bien plus compliquée, même si seul un sous-ensemble pourrait être exposé. Le fait même que vous ayez à interagir avec les monades IO dès le début pour obtenir un programme intéressant est un tantinet ennuyeux compte tenu de l'objectif du PO.
Matthieu M.
4
Pour "orthogonal", je vote pour Scheme, en particulier pour l' implémentation de Racket . L'environnement de Racket est conçu pour rendre le chemin de l'apprenant plus facile que quelque chose comme le Common Lisp brut. La langue est propre, avec peu de règles, en effet. Il y a longtemps, le MIT a décidé d'utiliser Scheme pour enseigner aux étudiants de première année, en utilisant le livre SICP . Les étudiants qui ont survécu semblent bien performer sur le marché. Cependant, cette approche n’enseignera pas directement aux étudiants comment écrire du code de qualité commerciale dans les langues les plus couramment utilisées.
John Tobler
2
Oui! Le fait que Scheme soit radicalement différent de la plupart des «vrais» langages vous permet de vous concentrer sur la programmation et non sur les API. Learning Scheme est comme le " codage en cire "; semble être une perte de temps jusqu'à ce que vous réalisiez que vous avez une compréhension plus profonde de l'ordinateur qu'auparavant.
benzado
17

Pascal a été spécialement conçu pour enseigner la programmation. C'est facile à apprendre (c'était l'un des premiers langages de programmation que j'ai appris).

Henrik
la source
3
J'ai aussi appris à programmer avec Pascal et je trouve que c'est un langage très clair. La seule caractéristique non orthogonale à laquelle je puisse penser est la syntaxe des procédures Writeln () et readln (), qui ont un nombre variable d'arguments et permettent de spécifier le formatage.
Giorgio
J'ai trouvé la langue très frustrante. Mais je projette peut-être, car j'avais un très, très mauvais instructeur.
Greyfade
14

Logo: c'est toujours vivant !

; draws a triangle
FORWARD 100
RIGHT 120
FORWARD 100
RIGHT 120
FORWARD 100
RIGHT 120

Cela peut sembler être plus un jouet qu'un langage de programmation, mais ce ne serait pas une mauvaise première étape pour beaucoup de gens. La syntaxe est très simple, mais la tortue fournit une forme de retour d'information plus concrète que la plupart des langages / environnements. Essayer de créer une forme spécifique est un excellent moyen d'apprendre à penser à l'avenir pour résoudre un problème.

Si vous avez une aversion pour les tortues, cependant, je pense vraiment que Scheme est la voie à suivre.

benzado
la source
1
Croyez-le ou non, Logo est un Lisp, tout comme Scheme. La plupart des utilisateurs ne vont pas assez loin au-delà des simples graphiques en boucle et tortues pour apprendre cela.
Sean McSomething
@SeanMcSomething C'est intéressant, étant donné l'accent mis sur les effets secondaires (déplacer la tortue) plutôt que sur l'évaluation d'expressions.
benzado
10

Je proposerais à la fois SML et Haskell. L'orthogonalité a été un point de conception principal pour les deux. En particulier, le noyau de SML (c’est-à-dire la partie du langage qui n’est pas concernée par la modularité) est à peu près un calcul lambda typé. En conséquence, la plupart des fonctionnalités de langage sont gérées par des types et les types déterminent à leur tour les formulaires d’introduction et d’élimination des valeurs. C'est à peu près idéal.

Il existe quelques verrues non théoriques dans les deux langages (types dans SML, seq dans Haskell), mais elles sont encore inimaginables en ce qui concerne les interactions étranges de caractéristiques langagières sans rapport.

Lambdageek
la source
7

Quel que soit le choix, j’encourage fortement l’enseignement d’une «vraie» langue . Enseigner les langues des jouets fonctionne pour certaines personnes, mais pour d’autres, c’est très, très frustrant à cause de la déconnexion avec le monde réel. Certaines personnes ont besoin de la pertinence du monde réel pour motiver l’apprentissage, et ce n’est pas à nous de juger de cette stratégie d’apprentissage (c’est en fait une idée fausse commune).

Cela disqualifie des langues telles que Logo, mais également des langues spécifiques à un domaine, telles que Traitement . Bien que ce dernier soit extrêmement utile pour certaines choses (par exemple, la production de graphiques d'informations), son utilisation est trop restreinte pour la plupart des utilisations (et donc la plupart des utilisateurs). Cela exclut également Gofer , un sous-ensemble inutile de Haskell. Cela exclut également Pascal, car bien que ce dernier ait été utilisé dans des projets réels, il n’est tout simplement plus pertinent et manque simplement de fonctionnalités essentielles (par exemple, des chaînes intégrées).

Parmi les langages pratiques, je suis d’accord avec ceux déjà mentionnés: les dialectes modernes Lisp ou Scheme, le Haskell, le Python ou le Ruby. Personnellement, j'utiliserais probablement Python mais tous ces choix ont leur part d’avantages et d’inconvénients.

Konrad Rudolph
la source
2
Il est faux de prétendre qu'enseigner une "vraie" langue est le moyen de fournir une pertinence réelle. Il appartient au professeur de montrer comment le langage du "jouet" est lié aux compétences du monde réel. Apprendre à jongler en commençant par les couteaux ne signifie pas que vous apprenez des techniques de jonglage plus pertinentes.
benzado
3
@benzado Vous avez mal compris mon propos. Si vous apprenez une langue de jeu, vous devez transférer vos compétences pour les rendre pertinentes aux problèmes du monde réel. Tout ce que je voulais dire, c'est que ce transfert est une indirection supplémentaire qui empêche activement certaines personnes d'apprendre . Différentes personnes apprennent de manière très différente, et certaines personnes ont vraiment besoin de cette immédiateté. Apprendre à jongler avec des couteaux n’est pas la même chose. La vraie analogie serait d'apprendre à programmer en écrivant un premier système de guidage de missile réel, et je ne l'ai jamais suggéré.
Konrad Rudolph
3
Je comprends ton point de vue. Nous sommes simplement en désaccord. Je pense que le transfert est important, il nécessite que l'étudiant comprenne mieux que celui qui a une stratégie de devinette réussie (par exemple, celui qui "résout" les problèmes de mots en choisissant des nombres et en les branchant dans les formules au début du chapitre. ). En d'autres termes, s'ils ne peuvent pas transférer ce qu'ils ont appris, ils ne l'ont jamais appris. Pour que les élèves restent motivés, il vous suffit de choisir les bons problèmes, ce qui est important quelle que soit la langue, "réelle" ou "jouet".
benzado
@benzado Le transfert est important, il n’ya pas d’argument. Mais c'est une toute autre discipline qui doit être enseignée, et certains étudiants ne la possèdent pas. En outre, la partie «compréhension plus profonde» est également vraie, mais aussi essentielle: il s'agit déjà d'un état avancé qui doit être atteint . Une fois que les étudiants l’ont appris, ils peuvent le transférer. Mais d' abord , ils ont besoin d'apprendre, et pour le faire, certains élèves ont besoin de pertinence. Le transfert vient plus tard.
Konrad Rudolph
En math edu (où j’ai peu d’expérience), "Apprendre sans comprendre" est un gros problème: se concentrer sur la façon de le faire sans pourquoi . Je prétends que si vous enseignez les concepts de la programmation, un langage jouet se débrouillera bien, et si vous réussissez , le transfert dans un "vrai" langage ne sera pas difficile. (Si le transfert est difficile, vous enseignez des procédures et non des concepts.) Un environnement de jeu n'empêche pas les gens d'apprendre, mais il nécessite une bonne planification de cours pour être intéressant. (J'aime ce fil, mais je pense que nous sommes passés au domaine de la discussion et les modérateurs seront mécontents.)
benzado
6

Tcl a 12 règles qui régissent toute la langue.

[1] Commands. 
[2] Evaluation. 
[3] Words. 
[4] Double quotes. 
[5] Argument expansion. 
[6] Braces. 
[7] Command substitution. 
[8] Variable substitution.
[9] Backslash substitution.
[10] Comments. 
[11] Order of substitution. 
[12] Substitution and word boundaries.

Il existe très peu de cas spéciaux, de mots ou de caractères réservés.

Bryan Oakley
la source
4

Quel est le langage de programmation avec le plus petit nombre de règles de langage spéciales, où tout est de première classe et peut être composé sans restrictions techniques gênantes? Une telle langue ne serait-elle pas la langue d'enseignement idéale?

Pour développer mon commentaire, dans Jot, tout est de première classe (car c’est un calcul lambda) et peut être composé. Il n'y a qu'une instruction. C'est une langue d'enseignement absolument affreuse.

En général, les abords de Turing ont très peu de règles spéciales et vous demandent de bien comprendre les bases du calcul avant de pouvoir faire quoi que ce soit. La langue d'enseignement parfaite permet aux étudiants d'expérimenter sans arracher tous leurs cheveux. Des niveaux d'abstraction plus élevés sont donc une bonne chose.

Peter Taylor
la source
Merci de m'avoir présenté le terme 'turing tarpit', j'ai toujours eu besoin d'un terme pour ce genre de simplicité.
keppla
Je conviens que les étudiants devraient pouvoir expérimenter, mais exiger de la compréhension avant de pouvoir «faire quoi que ce soit» semble être l’intérêt d’enseigner.
benzado
@benzado, je conviens que le but de l'enseignement est de donner de la compréhension. Mais avec la plupart des gens, vous devez commencer par les concepts de base, laissez-les y réfléchir, puis enseignez-leur des concepts intermédiaires. Donc, vous voulez un langage où quelqu'un qui comprend un peu peut écrire des programmes qui font un peu. Il y a une raison pour laquelle la plupart des cours de programmation ne commencent pas par enseigner aux machines de Turing ou aux machines à registre de Minsky.
Peter Taylor
1
Oui, je pense que nous différons sur ce que "faire un peu" signifie. Si vous voulez (par exemple) apaiser le contingent "Montrez-moi comment faire des jeux vidéo", vous pouvez faire certaines choses, mais ils vont arriver à un point car ils ne peuvent pas progresser et sont frustrés, et ensuite vous devez retournez aux «parties ennuyeuses» pour qu'ils puissent comprendre comment avancer. À ce stade, ils sont déjà frustrés et peuvent abandonner; d'autre part, faire les "parties ennuyeuses" en premier et construire vers le haut signifie un progrès continu. Mais évidemment, vous ne commencez pas avec une bande de ruban semi-infini.
benzado
2

Les fonctionnalités les plus importantes dans une langue que vous apprenez sont les suivantes:

  • principe de moindre surprise (PASCAL)

  • lisibilité (Ada)

À mon avis, le second l'emporte sur le premier, car la lecture de code est encore plus importante que l'écriture.

Maintenant, encore une fois, j’écris C #, Java, Objective-C et Javascript pour gagner sa vie, qui ont tous des horreurs bizarreries: D

Néanmoins, si je devais choisir une langue pour commencer, je choisirais le C #. Il est relativement facile à lire, a peu de surprises sérieuses en soi (elles sont le plus souvent cachées dans des outils / frameworks MS ...) et une énorme quantité de code à lire et de documentation, deux éléments essentiels pour bien apprendre.

Kheldar
la source
Si c'est juste pour la lisibilité, et non pour le typage statique et la sécurité d'ada, Python et Visual basic (oui, je sais, pas la manière cool d'enfants) ont une syntaxe sans fouillis similaire, à mon humble avis.
keppla
Oui, je suis d’accord avec vous, mais "s’il compile dans Ada, il devrait fonctionner". N'empêche cependant pas les erreurs de logique, comme Ariane V peut le dire: D
Kheldar
Je me suis demandé si le typage statique était utile pour les débutants ou non. Cela donne plus de soutien (comme des roues d’entraînement), mais cela peut être considéré à la fois comme une bonne et une mauvaise chose. Cela éloigne une partie de la responsabilité de l'étudiant au système de typage.
Aivar
@Kheldar, aucun langage de programmation ne peut empêcher la gestion de problèmes comme celui qui était responsable de la défaillance d’Ariane V. Vous devriez faire vos devoirs sur celui-ci.
John R. Strohm
@ JohnR.Strohm c'était exactement ce que je voulais dire: parfois, ce n'est pas le langage, c'est le flux d'ingénierie (par exemple, la gestion) qui est défectueux. Vous auriez pu formuler votre commentaire de manière moins agressive cependant, à mon avis.
Kheldar