La programmation n'est pas toute la production d'un logiciel, mais elle en est un passage obligé. Beaucoup ont tendance à reléguer la programmation à une phase de codage qui serait complètement déterminée par des phases préalables d'analyse des besoins et de spécification, lesquelles phases préalables seraient indépendantes du codage. En fait, un langage de programmation peut plus ou moins donner prise à l'application de méthodes ou même induire ses propres méthodes. Ainsi, les langages de programmation objet sont-ils associés à des méthodes qui si elles ne sont pas nécessairement spécifiques leur sont fortement associées.
Avec un moindre succès (pour l'instant), des langages plus prospectifs proposent aussi des méthodes propres. En fait, ces méthodes constituent l'essentiel de leurs promesses. Par exemple, il existe en programmation logique des propositions très concrètes concernant la réutilisation, la composition, l'héritage et la modularité [O'Keefe 85, Ferrand et Lallouet 95, Bossi et al. 96]. Elles combinent une vision structurée des programmes et la vision traditionnelle, complètement «plate», où un programme est un ensemble de clauses. La vision plate est exploitée dans des travaux sur le déboguage qui montrent entre autres choses comment localiser les clauses qu'il faut corriger [Shapiro 83, Ferrand et Deransart 93, Comini et al. 95]. La programmation logique suscite aussi ses propres versions d'outils de génération de jeux de test [Gorlick et al. 90], d'analyse dynamique de programme (par exemple des traceurs [Ducassé et Noyé 94]) ou d'outils d'analyse des dépendances avant ou arrière (forward/backward slice en Anglais) [Schoenig et Ducassé 96]. Ce dernier type d'analyse est important pour la localisation des erreurs et pour l'analyse d'impact en phase de maintenance. Il permet d'extraire d'un programme, une «tranche» (slice en anglais) sur laquelle focaliser la recherche d'une erreur ou la modification d'un programme.
Les langages de programmation jouent aussi un grand rôle dans l'application des méthodes formelles de développement. En effet, celles-ci ne sont formelles que pour autant que leur objet le soit. Par exemple, la programmation logique propose des méthodes qui permettent de traduire une spécification en un programme [Deville 90]. Il faut bien voir qu'il ne s'agit pas d'un processus trivial. Toute «logique» qu'elle soit, la programmation logique classique (y-compris Prolog) est fondée sur des fragments de calcul des prédicats. Ces fragments sont toujours complets calculatoirement, mais rarement logiquement. Le cas général est donc qu'une spécification n'a pas de transcription logique dans le formalisme de programmation, alors qu'il existe un programme qui réalise la même fonction. Il n'y a donc pas de transcription automatique de la spécification en un programme, mais des heuristiques de traduction qui nécessitent l'intervention d'un programmeur. Malgré tout, l'avantage de la programmation logique est d'offrir un cadre uniforme pour les spécifications et les programmes. La transformation de programmes est un autre exemple où les méthodes formelles bénéficient de la plus grande abstraction des langages de programmation déclaratifs [Pettorossi et Proietti 96, Proietti 96].