Je voudrais aborder l'idée que de nombreuses affiches ont donnée, qu'une telle langue serait "inutile". Il serait peut-être inutile pour les humains d'écrire, manuellement, dans le but de résoudre une tâche particulière. Cependant, bien qu'il s'agisse d'un cas d'utilisation majoritaire pour les langages de programmation, ce n'est certainement pas le seul cas d'utilisation. Plusieurs cas d'utilisation viennent à l'esprit lorsqu'une telle langue est utile, et nous pouvons consulter ces champs pour des exemples de ces langues.
Tout d'abord, l'allusion de Cort Ammon à la génétique est parfaite: la transformation du programme dans la question (se substituant )
à 5
) peut être vue comme une mutation . Ce type de manipulation est courant dans le domaine du calcul évolutif ; en particulier, les algorithmes génétiques effectuent de telles transformations sur les chaînes , tandis que la programmation génétique transforme les programmes . Dans les deux cas, nous voulons généralement attribuer un sens à chaque possibilité, car cela produira l'espace de recherche le plus compact.
Les algorithmes génétiques s'appuient sur une sorte de fonction d'évaluation pour les chaînes; si nous utilisons un interpréteur de langage de programmation comme fonction d'évaluation, nous avons alors un scénario où un langage de programmation qui attribue un sens à toutes les chaînes possibles est utile. En programmation génétique, on suppose que notre fonction d'évaluation est un interpréteur de langage de programmation, mais nous pouvons choisir différentes représentations pour nos programmes; par exemple, de nombreux systèmes fonctionnent sur des arbres de syntaxe abstraite. Si nous choisissons des chaînes comme représentation, nous récupérons le même scénario qu'avec les algorithmes génétiques.
Une autre situation où nous pouvons souhaiter que chaque chaîne soit un programme valide est lors de l' énumération des programmes. Ceci est lié à la bijection mentionnée par CodesInChaos, mais nous pouvons préférer opérer sur des chaînes plutôt que sur des nombres naturels pour plusieurs raisons:
- S'il y a une certaine structure dans la langue, par exemple. nous pouvons attribuer un sens aux sous-chaînes, cela peut être perdu lors de la traduction en nombres naturels. Dans ce cas, nous pouvons préférer utiliser des chaînes, afin de raisonner et de transformer les sous-chaînes localement, plutôt que de représenter l'ensemble du programme sous forme de nombre. Ceci est analogue à la façon dont nous pourrions préférer utiliser des opérations au niveau du bit sur un int plutôt que des expressions arithmétiques, lorsque chaque bit a une signification individuelle. Il s'agit essentiellement d'une généralisation du scénario évolutif.
- Nous pouvons vouloir générer les programmes sur demande; par exemple, nous pourrions commencer à exécuter un programme qui est complètement indéterminé, et générer uniquement (par exemple de manière aléatoire) les instructions individuelles (par exemple, des caractères) lorsque / si le pointeur d'instruction les atteint. Ceci est courant dans la théorie algorithmique de l'information, où le programme est une bande de machine de Turing, et le but est de caractériser le comportement des programmes générés aléatoirement. Par exemple, nous pouvons formuler le Solomonoff prior sur des chaînes arbitraires comme la probabilité qu'une machine de Turing universelle avec une bande aléatoire produise cette chaîne.
En termes d'exemples de langages, de nombreux systèmes de calcul évolutifs sont basés sur des langages de pile comme la famille Push . Ceux-ci ont tendance à autoriser des flux de jetons arbitraires (que nous pourrions représenter comme des caractères individuels). Parfois (comme avec l'exemple Brainfuck de BrainSlugs83) il y a des restrictions sur l'équilibrage des parenthèses; cependant, nous pouvons relier ce à des programmes d'auto-délimitant , en ce qu'une chaîne comme [
peut ne pas être valide programme , mais il est valide préfixe de programme . Si nous imaginons un compilateur / interprète lisant le code source de stdin, alors il ne rejettera pas une chaîne comme [
, il attendra simplement plus d'entrée avant de continuer.
Des langages comme la logique combinatoire binaire et le calcul lambda binaire sont nés directement du travail sur la théorie algorithmique de l'information, par exemple. depuis http://tromp.github.io/cl/cl.html
Cette conception d'un ordinateur universel minimaliste a été motivée par mon désir de proposer une définition concrète de la complexité de Kolmogorov, qui étudie le caractère aléatoire d'objets individuels.
You are a bimbo.