Fonctions du langage de programmation et fonctions de bibliothèque

Qu'est ce que le créateur d'un langage de programmation doit inclure au langage ou déléguer aux bibliothèques?

Pour débuter cette réflexion, rappelons quelques définitions élémentaires.

Langage de programmation

C'est un ensemble d'instructions, doté d'une grammaire, pour communiquer avec une machine et lui indiquer des tâches à exécuter.

Bibliothèque

C'est un ensemble de fonctions qui étendent un langage et peuvent être utilisées par des programmes différents. Elles sont écrites dans le langage, peuvent faire appel à d'autres bibliothèques. On peut détacher des fonctions d'un programme pour en faire une biblio et les partager entre plusieurs programmes.
La plupart des langages disposent d'une bibliothèque standard qui doit être incluse avec tout programme.

API
L'Application Programming Interface (interface de programmation d'application) est une interface standard pour une bibliothèque, utilisable par tous les programmes écrit dans le même langage. Cela ne comprend que les noms et arguments des fonctions et les déclarations des classes et leurs membres. Une bibliothèque peut être réécrite avec un code différent mais en conservant la même API.

Reste maintenant à définir ce qui doit faire partie de la sémantique d'un langage, autrement dit l'ensemble des mots réservés dont les commandes, ou ce qui devrait plutôt être inclut dans la bibliothèque standard. Cela ne fait pas de différence pour l'utilisateur puisque la biblio standard est toujours disponible avec l'interpréteur ou le compilateur, mais pour le créateur du langage, c'est un impératif de clarté et de cohérence.

A priori on devrait inclure dans la bibliothèque tout ce qui peut être défini à partir du langage et incorporer au langage les commandes qui ne peuvent pas être définies à partir des commandes existantes.

Mais certaines commandes sont si fréquentes qu'il est usuel de les inclure dans le langage. C'est le cas des fonctions d'entrée au clavier, d'affichage dans la console, de manipulation de chaînes. Pour autant elles pourraient aussi être incluses dans la bibliothèque standard.

Par exemple, print, echo etc... Ces commandes font partie du langage JavaScript et PHP mais en C, elles font partie de la librairie standard. Il semble que les deux procédés soient interchangeables.
L'inclusion de fonctions dans le langage ne repose pas sur un principe théorique mais sur un aspect purement pratique: ce qui s'utilise souvent est intégré au langage.

Le rôle des opérateurs

Mais la raison qui justifie le mieux l'incorporation au langage est la possibilité d'utiliser les opérateurs du langage. Par exemple, j'imagine un type d'objet nommé "entity". Ce pourrait être une classe déclarée dans une bibliothèque, mais si les opérateurs du langage peuvent exécuter des opérations propres à ce type d'objet, par exemple si l'opérateur + permet d'ajouter un attribut à entity alors qu'il ne peut le faire sur un objet ordinaire, alors il devient nécessaire d'inclure ce type d'objet dans le langage lui-même.

Tendance à la superposition

Le langage JavaScript dispose de fonctions du langage pour concaténer des chaînes, ajouter une chaîne et un nombre (une mauvaise idée). Mais il dispose aussi de l'objet String doté de méthodes de manipulation telles que slice, splice, replace, etc...
Il en est de même de PHP si ce n'est que ce sont des fonctions comme substr, str_replace, et non des méthodes.

Ce que l'on peut dire des chaînes s'applique aussi aux tableaux en JavaScript et PHP.

JavaScript dispose d'une certaines intégration de la fonction d'expression régulière dans le langage. On peut écrire par exemple:

var x = /abc/

Puis utiliser x qui est une expression régulière comme paramètre d'autres fonctions.
A coté de cela le langage dispose de l'objet RegExp() qui à une expression régulière comme argument et dont les méthodes s'appliquent à des chaînes de caractères.

En conclusion, on voit que les auteurs n'arrivent pas à délimiter une frontière entre le langage et la bibliothèques et qu'il y a une superposition entre les deux choses.

Il est possible aussi d'exprimer un langage entièrement sous forme de fonctions, c'est le principe des langages fonctionnels tels qu'Erlang et cela implique le recours intensif à la récursivité. Ce qui rend un programme incompréhensible sans un effort de concentration. La grammaire d'un langage à pour but aussi de simplifier la lecture et donc réduire la probabilité d'erreurs.

A l'inverse C++ permet de surcharger les opérateurs et donc de traduire des méthodes sur les objets dans la syntaxe du langage...

Faut-il être plus strict?

Et réduire la langage au maximum, n'y intégrer aucune fonction qui puisse être placée dans la bibliothèque...
Il y a le pour est le contre. Si on réduit le langage à la syntaxe nécessaire, et qu'on en exclut toute fonction, la grammaire sera simplifiée. Dans le cas d'un compilateur cela fera peu de différence sur la vitesse d'exécution.

D'un autre coté, l'expression dans la syntaxe du langage, d'actions sur les objets, comme le fait C++ améliore la lisibilité d'un programme.

Les instructions qui ont la forme d'une fonction, comme print(...), par opposé à print "xxx", devraient faire partie d'une bibliothèque standard.