125 votes

Détecter le langage de programmation à partir d'un extrait de texte

Quel serait le meilleur moyen de détecter le langage de programmation utilisé dans un extrait de code ?

1 votes

Il existe pratiquement un nombre infini de langues... voulez-vous en détecter une seule ? Ou est-ce qu'on parle seulement des langues les plus populaires ?

0 votes

Seulement les plus populaires (C/C++, C#, Java, Pascal, Python, VB.NET. PHP, JavaScript et peut-être Haskell).

13 votes

Haskell ne doit pas être populaire puisque je n'en ai jamais entendu parler ;-)

4voto

Pierre Points 15256

Tout d'abord, j'essaierais de trouver les mots-clés spécifiques d'une langue, par ex.

"package, class, implements "=> JAVA
"<?php " => PHP
"include main fopen strcmp stdout "=>C
"cout"=> C++
etc...

3 votes

Le problème est que ces mots-clés peuvent toujours apparaître dans n'importe quel langage, que ce soit sous forme de noms de variables ou de chaînes de caractères. Cela, et il y a beaucoup de chevauchement dans les mots-clés utilisés. Il faut faire plus que simplement regarder les mots-clés.

4voto

C'est très difficile et parfois impossible. De quelle langue ce court extrait est-il tiré ?

int i = 5;
int k = 0;
for (int j = 100 ; j > i ; i++) {
    j = j + 1000 / i;
    k = k + i * j;
}

(Indice : cela peut être n'importe lequel parmi plusieurs).

Vous pouvez essayer d'analyser plusieurs langues et de décider en utilisant l'analyse de fréquence des mots-clés. Si certains ensembles de mots-clés apparaissent avec une certaine fréquence dans un texte, il est probable que le langage soit Java, etc. Mais je ne pense pas que vous obtiendrez quelque chose de complètement infaillible, car vous pourriez par exemple nommer une variable en C du même nom qu'un mot-clé en Java, et l'analyse de fréquence sera trompée.

Si vous montez d'un cran dans la complexité, vous pouvez rechercher des structures, si un certain mot clé vient toujours après un autre, cela vous donnera plus d'indices. Mais ce sera aussi beaucoup plus difficile à concevoir et à mettre en œuvre.

28 votes

Eh bien, si plusieurs langues sont possibles, le détecteur peut simplement donner tous les candidats possibles.

0 votes

Ou bien, il peut donner le premier qui correspond. Si le cas d'utilisation réel est quelque chose comme la coloration syntaxique, alors cela ne fera pas vraiment de différence. En d'autres termes, n'importe laquelle des langues correspondantes permettrait de faire ressortir le code correctement.

2voto

Yes - that Jake. Points 9184

Cela dépend du type d'extrait que vous avez, mais je le soumettrais à une série de tokenizers et verrais avec quelle BNF de langage il est considéré comme valide.

0 votes

Toutes les langues ne peuvent même pas être décrites par une BNF. Si vous êtes autorisé à redéfinir des mots-clés et à créer des macros, cela devient beaucoup plus difficile. En outre, comme il s'agit d'un extrait, il faudrait procéder à une correspondance partielle avec une BNF, ce qui est plus difficile et plus sujet aux erreurs.

2voto

Berty Points 171

J'en avais besoin, alors j'ai créé le mien. https://github.com/bertyhell/CodeClassifier

Il est très facile de l'étendre en ajoutant un fichier de formation dans le bon dossier. Écrit en c#. Mais j'imagine que le code peut être facilement converti dans n'importe quel autre langage.

2voto

StephanieS Points 305

La meilleure solution que j'ai trouvée est d'utiliser le bijou de linguiste dans une application Ruby on Rails. C'est une façon un peu particulière de le faire, mais ça marche. Cela a été mentionné plus haut par @nisc mais je vais vous dire comment je l'utilise. (Certaines des commandes de ligne de commande suivantes sont spécifiques à ubuntu mais devraient être facilement traduites pour d'autres OS)

Si vous avez une application rails que vous ne voyez pas d'inconvénient à manipuler temporairement, créez un nouveau fichier pour y insérer le bout de code en question. (Si rails n'est pas installé sur votre ordinateur, il existe un bon guide. aquí bien que pour ubuntu je recommande ce . Ensuite, exécutez rails new <name-your-app-dir> et cd dans ce répertoire. Tout ce dont vous avez besoin pour exécuter une application rails est déjà là).

Une fois que vous avez une application rails avec laquelle vous pouvez l'utiliser, ajoutez gem 'github-linguist' à votre Gemfile (littéralement juste appelé Gemfile dans votre répertoire d'applications, sans ext).

Ensuite, installez ruby-dev ( sudo apt-get install ruby-dev )

Ensuite, installez cmake ( sudo apt-get install cmake )

Maintenant, vous pouvez exécuter gem install github-linguist (si vous obtenez une erreur qui dit que l'icu est nécessaire, faites sudo apt-get install libicu-dev et réessayer)

(Vous devrez peut-être faire un sudo apt-get update o sudo apt-get install make o sudo apt-get install build-essential si ce qui précède n'a pas fonctionné)

Maintenant, tout est en place. Vous pouvez maintenant l'utiliser à chaque fois que vous voulez vérifier des extraits de code. Dans un éditeur de texte, ouvrez le fichier que vous avez créé pour insérer votre extrait de code (disons qu'il s'agit de app/test.tpl mais si vous connaissez l'extension de votre snippet, utilisez-la au lieu de .tpl . Si vous ne connaissez pas l'extension, n'en utilisez pas). Maintenant, collez votre extrait de code dans ce fichier. Allez à la ligne de commande et exécutez bundle install (doit se trouver dans le répertoire de votre application). Ensuite, exécutez linguist app/test.tpl (plus généralement linguist <path-to-code-snippet-file> ). Il vous indiquera le type, le type mime et la langue. Pour plusieurs fichiers (ou pour une utilisation générale avec une application ruby/rails) vous pouvez exécuter bundle exec linguist --breakdown dans le répertoire de votre application.

Cela semble représenter beaucoup de travail supplémentaire, surtout si vous n'avez pas déjà rails, mais vous n'avez en fait pas besoin de savoir QUELQUE CHOSE à propos de rails si vous suivez ces étapes et je n'ai pas vraiment trouvé de meilleur moyen de détecter la langue d'un fichier ou d'un extrait de code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X