Pouvez-vous spécifier un langage de programmation sans implémentation?


11

Est-il théoriquement possible de spécifier un langage de programmation pour lequel aucune implémentation ne pourrait exister? Un langage de programmation est un moyen de définir des fonctions. Une implémentation signifie une méthode pour exécuter un programme donné dans ce langage sur une entrée donnée à la sortie de la fonction correspondant au programme sur cette entrée.

Quelles sont les exigences minimales d'une telle langue?


3
Qu'est-ce qu'une "implémentation" d'une langue?
Raphael

@Raphael: C'est vous qui avez changé "programmation lang" en "langue". Avant votre édition, il était clair ce que signifiait une implémentation d'une langue.
Tsuyoshi Ito

@TsuyoshiIto: Pas tout à fait; J'ai seulement adapté le titre pour qu'il corresponde à la question, qui a été modifiée sur cstheory.SE. Je l'ai changé en arrière, mais on ne sait toujours pas ce que cela signifie. Un compilateur? Un interprète? Quoi qu'il en soit, la migration d'une question ici qui a presque un an et par un utilisateur qui n'a apparemment jamais revu la question était au mieux mal avisée.
Raphael

@Raphael: Demander "qu'est-ce qu'une implémentation d'un langage?" après avoir enlevé tous les indices était tout simplement hors de ma compréhension. Mais je suis d'accord que la question n'était pas claire depuis le début.
Tsuyoshi Ito

Je pense que votre définition putative de «langage de programmation» est mal conçue. Il devrait au moins être modifié en remplaçant "fonctions" par "fonctions calculables". Sinon, il n'est pas clair pourquoi vous choisiriez d'appeler la langue un "langage de programmation". Une fois que vous l'avez modifié, la question devient vide de sens, car il n'existe pas de tels "langages de programmation pour lesquels aucune implémentation ne pourrait exister".
Uday Reddy

Réponses:


7

Habituellement, l'implémentation d'un langage de programmation donne au moins un interprète dans un langage (ou un compilateur à un langage) qui n'est rien de plus que Turing-complete.

En utilisant cette "définition", nous pouvons spécifier un langage de programmation comme celui-ci:

  • il n'y a qu'un seul programme possible qui est HALT;

  • spécification de HALT: c'est une fonction qui résout le problème d'arrêt .

L'implémentation de ce langage de programmation nécessite de résoudre le problème d'arrêt de l'implémentation. (Ce qui est impossible car notre implémentation ne devrait pas être plus puissante qu'une machine de Turing).

La spécification gère la logique et peut donc en demander beaucoup plus. Une autre spécification qui sera impossible à mettre en œuvre est "fausse". (Ou toute phrase contradictoire dans la spécification) Mais cela ne ressemble pas à une spécification, c'est pourquoi j'ai utilisé l'exemple du problème d'arrêt.


1
Généralisé: tout langage spécifiant une fonction qui résout un problème indécidable ne peut pas être implémenté.
edA-qa mort-ora-y

@ edA-qamort-ora-y Techniquement, il pourrait être implémenté. Vous ne pouvez pas décider du problème d'arrêt, mais une MT peut simuler une autre machine et accepter si cette machine s'arrête; le langage accepté par une telle MT est exactement le langage des (encodages des) machines qui s'arrêtent. Mais pour des raisons pratiques, nous aimons normalement que les opérations primitives des langages de programmation soient garanties de se terminer! (au moins sur une entrée "sensible")
Ben

1
O()

1/0 let loop = loop in loopΩ()

3

Juste une note curieuse: le moteur de modèle C ++ est Turing-complet

Théorème 1: En l'absence de limites d'instanciation, les modèles C ++ sont Turing-complete.

Corollaire 1: En l'absence de limites d'instanciation, le fait qu'un compilateur C ++ s'arrête lors de la compilation d'un programme donné est indécidable.

... pour que le C ++ lui-même puisse être considéré comme un langage de programmation pour lequel aucune "implémentation" ne pourrait exister ... :-D


Un «compilateur» C pourrait-il donc être utilisé comme interprète si l'on ne se souciait pas du code généré mais simplement des diagnostics produits?
supercat

Oui, comme indiqué dans l'article, le compilateur s'arrête avec une liste d'erreurs qui correspondent à l'historique de calcul de la machine Turing (et à sa configuration de bande finale). Évidemment, l'entrée ne peut pas être interactive (elle doit être encodée dans le code source avant d'exécuter le compilateur).
Vor

2

On ne sait pas exactement ce que vous entendez par «langage de programmation» et «implémentation d'un langage». Vous devez fournir des définitions rigoureuses de ces deux pour obtenir une réponse.

Σ2Σ

MM0

Mais ce n'est pas le genre de langage de spécification que les gens entendent lorsqu'ils utilisent l'expression "langage de programmation". Un langage de programmation est généralement destiné à être un langage pour exprimer des fonctions calculables (processus, ...) et pour communiquer les instructions à une machine et il existe donc une MT qui peut simuler ces programmes et produire leurs résultats. Donc, dans un sens, avoir un langage de programmation qui ne peut pas être implémenté n'a pas de sens.

(Je suppose que vous confondez probablement les langages de programmation avec les langages de spécification ou avec les langages formels . Dans tous les cas, nous pouvons définir des langages qui ne sont pas calculables.)


Je suis presque sûr que "langage de programmation" signifie un langage de programmation comme nous en parlerions normalement, et "une implémentation d'un langage" signifie un environnement pour exécuter des programmes dans ce langage sur de vrais ordinateurs. La question n'est pas formalisée , mais elle n'est sûrement pas floue? Je peux facilement écrire une spécification pour un nouveau langage de programmation sans prendre la peine de l'implémenter; la question est simplement de demander s'il est possible de le faire de telle manière que le langage ne puisse pas être implémenté.
Ben

@Ben, si vous regardez la question d'origine sur cstheory, vous verrez qu'il n'y a pas de programmation de mots dans la question uniquement dans le titre. La question telle que publiée par OP est définitivement claire. ps: Je serais intéressé par une définition rigoureuse (n'a pas besoin d'être formelle) de ce qu'est un langage de programmation. Nous ne pouvons pas prouver des résultats négatifs sur les langages de programmation uniquement basés sur l'intuition et des exemples. Si vous avez une référence pour une définition, veuillez la poster en tant que modification ou commentaire à la question.
Kaveh

Très bien, même si SE prétend que vous y avez répondu il y a 9 heures, longtemps après sa migration et sa modification. Je ferais quand même la même interprétation sur la base de la question d'origine. En ce qui concerne la définition d'un langage de programmation, je dirais qu'un langage évident est une grammaire formelle plus soit une réduction à un autre modèle de calcul bien compris (calcul lambda, machine de Turing, etc.), soit une sémantique opérationnelle rigoureuse. Le modèle de réduction rendrait la réponse à cette question un «non» trivial, évidemment.
Ben

1

De nombreux langages ont été spécifiés sans implémentation, par exemple l'Algol 60 était censé être un langage d'écriture d'algorithmes, à ne pas implémenter. Certains des nombreux langages "juste pour le plaisir" ont été spécifiés bien avant l'implémentation, vient à l'esprit Intercal.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.