Je me trouve à plusieurs reprises ennuyé d'avoir à enseigner aux étudiants de première année des règles de langage spéciales (comme la désintégration de tableau à pointeur) qui n'ont absolument rien à voir avec la programmation en soi. Je me suis donc 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 parfaite?
Note du modérateur
Nous recherchons de longues réponses qui fournissent une explication et un contexte. Ne vous contentez pas d'énumérer une langue: veuillez expliquer pourquoi vous pensez que 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.
En ce qui concerne "très peu de règles", je dirais que LISP ou Smalltalk gagneraient. La syntaxe nue peut être écrite sur un onglet de bière.
Mais d'après mon expérience, la simplicité de LISP et Smalltalk ne signifie pas qu'ils sont simples à comprendre et faciles à enseigner. Bien que ce ne soit pas la voie "pure", d'après mon expérience, le style de liste de tâches des langues impératives est le plus facile à saisir pour les débutants.
Par conséquent, je suggère Python, Ruby ou quelque chose d'abstraction similaire: vous y trouvez (presque) tous les concepts de base (OK, pas de pointeurs), mais vous ne pas besoin de le comprendre dès le départ pour faire fonctionner quelque chose.
Je dirais que LISP, Scheme ou une langue de cette famille serait la plus orthogonale. Avec let
, lambda
, define
, if
, cons
, list
et (
)
Vous pouvez enseigner à peu près tout ce que vous souhaitez dans un cours d'introduction. Il n'y a pas non plus besoin de directives de prétraitement ou de int main()
et de choses comme celles que les étudiants incluent mais ne voient pas de raison.
Dans mes cours d'introduction CS, nous avons fait beaucoup de choses vraiment cool avec Scheme: implémenter une machine Turing, implémenter un ordinateur TC-201, écrire une grammaire sans contexte, utiliser la récursivité, écrire le tri par fusion et insertion, implémenter des additionneurs et des tonnes de d'autres choses.
J'avais fait Java en AP comp sci avant l'université, mais Scheme était génial parce que je pouvais réduire l'encombrement et me concentrer sur les concepts réels de mon programme. C'était une excellente classe et je vous recommande de l'essayer pour votre enseignement.
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).
Logo: c'est toujours vivant et en plein essor !
; draws a triangle
FORWARD 100
RIGHT 120
FORWARD 100
RIGHT 120
FORWARD 100
RIGHT 120
Cela pourrait ressembler 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 rétroaction plus concrète que la plupart des langues/environnements. Essayer de créer une forme spécifique est un excellent moyen d'apprendre le processus de réflexion pour résoudre un problème.
Si vous avez une aversion pour les tortues, cependant, je pense vraiment que Scheme est la voie à suivre.
Je proposerais à la fois SML et Haskell. L'orthogonalité a été un point de conception principal pour les deux. En particulier, le cœur de SML (c'est-à-dire la partie du langage non concernée par la modularité) est à peu près un calcul lambda typé. Par conséquent, la plupart des fonctionnalités de langage sont piloté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 y a quelques verrues non théoriques de type dans les deux langues (eqtypes en SML, seq en Haskell) mais elles battent toujours le pantalon de tout le reste en termes d'interactions bizarres de fonctionnalités linguistiques non liées.
Quel que soit le choix, je vous conseille vivement d'enseigner une "vraie" langue . L'enseignement des langues des jouets fonctionne pour certaines personnes, mais pour d'autres, c'est très, très frustrant en raison de la déconnexion avec le monde réel. Certaines personnes ont besoin la pertinence du monde réel comme motivation pour l'apprentissage, et ce n'est pas à nous de juger de cette stratégie d'apprentissage (en fait, c'est une idée fausse courante).
Cela disqualifie les langues telles que Logo, mais aussi les 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), l'utilisation est trop restreinte pour la plupart des utilisations (et donc la plupart des utilisateurs). Cela exclut également Gofer , un sous-ensemble Haskell inutile. Il aussi exclut Pascal car bien que ce dernier a ait été utilisé dans de vrais projets, il n'est tout simplement plus pertinent et manque simplement de fonctionnalités essentielles (par ex. en chaînes).
Parmi les langues pratiques, je suis d'accord avec celles déjà mentionnées: les dialectes LISP ou Scheme modernes, Haskell, Python ou Ruby. Personnellement, j'utiliserais probablement Python mais tous ces choix ont leur part d'avantages et d'inconvénients.
Tcl a 12 règles qui régissent la langue entière.
[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 y a très peu de cas spéciaux ou de mots ou de caractères réservés.
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 parfaite?
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 seule instruction. C'est une langue d'enseignement absolument horrible.
En général, les tarpits de Turing ont très peu de règles spéciales et vous obligent à bien comprendre les principes de base 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, donc les abstractions de niveau supérieur sont en fait une bonne chose.
Les fonctionnalités les plus importantes dans un langage que vous apprenez sont:
principe de la moindre surprise (Pascal)
lisibilité (Ada)
À mon avis, le second l'emporte sur le premier, car la lecture du code est encore plus importante que l'écriture.
Maintenant, j'écris C #, Java, Objective-C et Javascript pour gagner ma vie, qui ont tous des bizarreries horribles: D
Pourtant, si je devais choisir un langage pour commencer, je choisirais C #. Il est relativement facile à lire, a peu de surprises en soi (elles sont le plus souvent cachées dans les outils/frameworks MS ...) et une énorme quantité de code à lire et à documenter, tous deux essentiels à un bon apprentissage.