Sommaire
- ChatGPT essaie de retomber sur ses pattes
- Mistral à moitié gagnant
- « Réponse Flash » Gordon chez Qwant
- Quarante-deux
Tout part d'un projet pédagogique où l'on décrypte un message secret à l'aide d'une attaque statistique pour repérer les lettres les plus courantes, et donc le e. Ce qui m'amène à penser qu'un jour il faudrait quand même que je lise Georges Perec et en particulier La disparition, trois cents pages sans la lettre e. Surgit alors la question : peut-on écrire un programme en langage C sans accolades ? Question métaphysique à peine moins importante que celle dont la réponse est 42. Ça tombe bien, je dois réfléchir justement à quelques heures à enseigner à des étudiants non informaticiens sur les bons usages de l'IA (à prendre dans ce journal essentiellement au sens des LLM et GPT).
ChatGPT essaie de retomber sur ses pattes
Je donne donc ma langue au chat (désolé mais tant qu'à verser dans la facilité, j'y vais à fond !) : « peut-on écrire un programme en langage C sans accolades ? »
Oui… et non, selon ce que l’on appelle “écrire un programme”.
[…]
Mais beaucoup de structures du langage fonctionnent très bien avec une seule instruction, donc sans accolades.
Exemple valide de programme sans aucune accolade :
#include <stdio.h>
int main()
if (printf("Bonjour !\n"))
return 0;
else
return 1;
[…]
Même ceci est un programme C valide :
int main()
return 0;
L'outil me propose même de générer des programmes encore plus longs sans accolades. Sauf qu'il y a apparemment confusion entre le fait que les accolades ne sont pas obligatoires après par exemple un if ou un for et le cas des fonctions. Je ne suis pas familier avec la lecture de la norme C, mais ISO/IEC 9899:2024 ne semble pas envisager qu'une fonction main() puisse être dépourvue d'accolades (section « 5.1.2.3.2 Program startup »). Ça ne compile pas, même avec des options telles que -std=legacy. Et dans le Kernighan et Ritchie, 2e édition (1988), je lis :
la fonction la plus succincte possible est
rien() {}, qui ne fait rien et ne retourne rien.
Quoique de nos jours, avec gcc il faut ajouter l'option -Wno-implicit-int pour que ce soit accepté, sinon l'absence de type de la fonction bloque la compilation (depuis la norme C99). Mais il faut bien des accolades, sinon c'est un prototype (à condition de rajouter un point-virgule).
Pas plus de succès avec d'autres compilateurs disponibles sur https://godbolt.org/. Oui, je teste largement car après tout je ne suis pas expert des normes C et de la longue histoire du langage, avec tous ses recoins obscurs. On peut en écrire des choses en C !
Je tape alors : « Ces programmes ne compilent pas avec gcc. Avec le premier programme, j'obtiens par exemple ce genre d'erreurs : "error: expected declaration specifiers before ‘if’"».
Tu as tout à fait raison — merci d’avoir collé l’erreur. Mes exemples précédents étaient faux : en C standard (et avec gcc), le corps d’une fonction doit être une compound statement, c’est-à-dire entouré d’accolades { … }.
Le problème n'est pas seulement que les exemples étaient faux, mais qu'ils étaient faux au sens algorithmique du terme. Si l'agent avait simplement lancé gcc et récupéré sa valeur de retour, il aurait eu accès à la vérité booléenne !=0. Mais j'imagine que les outils IA dédiés au codage sont capables de faire ça.
Je n'ai pas tout collé de sa réponse, mais mon félin gratuit me baratine sur son erreur, il m'embobine. Il ignore que la confiance est plus facile à perdre qu'à regagner.
J'ai aussi essayé d'ajouter le mot « compilable » ou « exécutable » dans ma question, pour éviter tout malentendu, mais j'obtiens toujours des textes affirmant avec un aplomb présidentiel que les codes frelatés inclus compilent. Décidément, rien à faire, je crois qu'il préfère le Rust :
au minimum, la définition d’une fonction comme
fn main()exige un bloc délimité par{ … }.
Finalement, en remplaçant simplement « sans accolades » (j'avais mis un s car elles marchent par pairs) par « sans aucune accolade », j'obtiens cette fois des réponses correctes. Peut-être y a-t-il donc un problème de prompteur. Je me sers très peu de ces outils pour mon usage personnel, donc je m'y prends peut-être mal pour prompter. Mais ça ne change pas le fait que l'outil déclare compilables des codes qui ne compilent pas.
Mistral à moitié gagnant
Le Chat de Mistral AI me répond qu'il est possible d'écrire un programme en C sans accolades et me donne des exemples de fonctions ne contenant pas d'accolades, en tous cas à l'intérieur des accolades de la fonction ! La réponse est donc juste à condition qu'on considère qu'il y a un sous-entendu dans l'affirmation, ou qu'il y a un malentendu concernant ma question. Mais au moins, les codes compilent.
« Réponse Flash » Gordon chez Qwant
Je passe en anglais dans Qwant, espérant probablement accéder plus facilement au grand savoir mondial, et dans un style plus orienté mots-clés pour moteur de recherche : « a C language program without braces ». La réponse est beaucoup plus courte et inattendue :
Programme C sans accolades
Le contexte mentionne l'utilisation de digraphs en C, qui permettent de remplacer les accolades { et } par <% et %>, ainsi que les crochets [ et ] par <: et :>. Voici un exemple de programme C utilisant ces digraphs pour éviter les accolades :
[…]
Les digraphs sont une fonctionnalité peu utilisée aujourd'hui, mais ils étaient utiles pour les claviers ne disposant pas des caractères spéciaux comme les accolades et les crochets.
Mais la réponse est juste et ce programme minimaliste compile :
int main(void) <% %>
Bon, je suis content, j'ai appris quelque chose, aussi juste qu'inutile. Je me dis qu'il doit s'agir d'une syntaxe des années 70, mais d'après mon livre de C. Delannoy, c'est un ajout de la norme C99. Dans la norme C23, on la trouve à la section « 6.4.6 Punctuators », avec également des digraphes pour les crochets et les dièses.
Je pourrais juste reprocher à l'IA de Qwant d'avoir écrit digraphe sans e, mais ma question en anglais a peut-être embrouillé les neurones de monsieur l'agent. Moi aussi, il m'arrive de fauter.
Quarante-deux
La question « peut-on écrire un programme en langage C sans accolades ? » serait-elle plus profonde qu'il n'y paraît ? Elle amène les différents outils à des réponses bien différentes, et fait perdre la tête à certains.
Mes rêvasseries me ramènent à Marie Stuart, reine d’Écosse, qui a également perdu la tête le 8 février 1587, suite à l'attaque par analyse fréquentielle de ses messages, qui étaient chiffrés en grande partie par substitutions de lettres. Et comme d'après Wikipedia, « le substantif français "accolade" dérive du latin ad collum, au cou, auquel s'ajoute le suffixe dérivationnel -ade », décidément tout se tient dans ce journal qui pourrait sembler sans queue ni tête.

# Les revenentes
Posté par gUI (Mastodon) . Évalué à 3 (+0/-0).
Juste pour dire que l'ami Georges Perec a aussi écrit une nouvelle où la seule voyelle est le 'e'. Certes c'est une nouvelle (et pas un roman), certes il s'est autorisé des fautes de Français (à commencer par le titre), mais merde, quel jongleur !
Sinon pour utiliser régulièrement les ChatMistralClaude, j'ai vite remarqué qu'ils sont très forts (mais vraiment) sur les sujets courants où la bibliographie afflue, mais ils restent limités quand tu demandes un truc un peu tordu.
Quand on sait la façon dont ils fonctionnent (bouffage de corpus quasi illimité) c'est intuitif, mais ça reste valide y compris avec les versions les plus récentes (où ils font largement plus que de la proba du prochain mot).
En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.
Envoyer un commentaire
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.