Maison développement back-end Golang Résolution de quelques bugs

Résolution de quelques bugs

Jul 24, 2024 pm 02:23 PM

Resolução de alguns bugs

Pour ceux qui ne suivent pas POJ (Pascal sur la JVM) c'est un compilateur qui transforme un sous-ensemble de Pascal en JASM ( Java Assembly) afin que nous puissions utiliser la JVM comme environnement d'exécution.

Dans le dernier post, nous avons implémenté le support des fonctions de Pascal.

Dans ce post, est-ce qu'on va parler de choses sympas ? Pas tellement mdr. Cette fois, nous allons juste parler de bugs :-)

Comme nous compilons pour la JVM, il est nécessaire de détailler le fonctionnement de différents points de cette incroyable machine virtuelle. C'est pourquoi, à différents moments, je détaille le fonctionnement interne de la JVM ainsi que certaines de ses instructions (opcodes).

Bug concernant les paramètres passés au programme via la ligne de commande

Lorsque j'ai implémenté la déclaration de variable, je n'ai pas fait attention au fait que, dans la JVM, la première variable de la fonction principale est l'args, un tableau qui contient les arguments passés au programme. Donc, dans ce PR, je réserve implicitement la première position aux arguments.

Bug lors du traitement des variables locales et globales

Comme les programmes Pascal de test ne contenaient que des variables globales, je n'avais pas remarqué d'erreur sérieuse dans la génération JASM. Au moment où j'ai créé des programmes contenant des variables globales et locales, j'ai réalisé que quelque chose n'allait pas mdr.

Extrait du programme Pascal ci-dessous :

program global_var_declaration;
var
    globalvar : integer;
begin
    globalvar := 123;
    write (globalvar);
end.
Copier après la connexion

POJ a généré le JASM suivant :

// Code generated by POJ 0.1
public class global_var_declaration {
    public static main([java/lang/String)V {
        ;; globalvar := 123;
        bipush 123
        istore 1

        ;; write (globalvar);
        getstatic java/lang/System.out java/io/PrintStream
        iload 1
        invokevirtual java/io/PrintStream.print(I)V

        return
    }
}
Copier après la connexion

Pour tenter d'identifier le problème, j'ai créé un programme Java équivalent au programme Pascal ci-dessus :

public class GlobalVarDeclaration {
    public static int globalVar;

    public static void main(String[] args) {
        globalVar = 123;
        System.out.println(globalVar);
    }
}
Copier après la connexion

Lorsque j'ai démonté la classe, j'ai obtenu l'assemblage suivant :

 1: public class GlobalVarDeclaration {
 2:     public static globalVar I
 3:
 4:     public static main([java/lang/String)V {
 5:         bipush 123
 6:         putstatic GlobalVarDeclaration.globalVar I
 7:
 8:         getstatic java/lang/System.out java/io/PrintStream
 9:         getstatic GlobalVarDeclaration.globalVar I
10:         invokevirtual java/io/PrintStream.println(I)V
11:
12:         return
13:     }
14: }
Copier après la connexion

À ce stade, j'ai remarqué la déclaration "public static globalVar I" (ligne 2) et les instructions putstatic (ligne 6) et getstatic (ligne 9) . Ce qui était attendu, c'étaient les instructions astore et istore utilisées par POJ jusqu'à présent. En lisant la documentation de la JVM, j'ai réalisé que POJ déclarait des variables globales comme s'il s'agissait de variables locales d'une fonction à la JVM :-D

Quoi qu'il en soit, jusqu'à présent POJ utilisait (à tort) les opcodes aload/iload/astore/istore pour les variables globales, mais l'option correcte serait de déclarer les variables comme publiques (comme à la ligne 2) et d'utiliser getstatic/putstatic.

Avec cela, le code a été refactorisé ici afin que la table des symboles puisse gérer les déclarations locales et globales. Et ici, le code a été refactorisé afin que la table des symboles puisse générer les instructions correctes pour les variables locales et globales.

La génération de code JASM a été modifiée ici pour gérer la nouvelle table de symboles ainsi que pour nettoyer les déclarations locales après la fin d'une fonction ou d'une procédure.

Avec ceci, du programme Pascal ci-dessous :

program GlobalVarDeclaration;
var
    globalvar : integer;
begin
    globalvar := 123;
    write (globalvar);
end.
Copier après la connexion

POJ génère désormais correctement le JASM suivant :

// Code generated by POJ 0.1
public class global_var_declaration {
    public static globalvar I

    public static main([java/lang/String)V {
        ;; globalvar := 123;
        bipush 123
        putstatic global_var_declaration.globalvar I

        ;; write (globalvar);
        getstatic java/lang/System.out java/io/PrintStream
        getstatic global_var_declaration.globalvar I
        invokevirtual java/io/PrintStream.print(I)V

        return
    }
}
Copier après la connexion

Prochaines étapes

Dans le prochain article, nous parlerons des contextes et des phrases imbriquées.

Code de projet complet

Le référentiel avec le code complet et la documentation du projet est ici.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

GO Language Pack Import: Quelle est la différence entre le soulignement et sans soulignement? GO Language Pack Import: Quelle est la différence entre le soulignement et sans soulignement? Mar 03, 2025 pm 05:17 PM

GO Language Pack Import: Quelle est la différence entre le soulignement et sans soulignement?

Comment mettre en œuvre le transfert d'informations à court terme entre les pages du cadre Beego? Comment mettre en œuvre le transfert d'informations à court terme entre les pages du cadre Beego? Mar 03, 2025 pm 05:22 PM

Comment mettre en œuvre le transfert d'informations à court terme entre les pages du cadre Beego?

Comment convertir la liste des résultats de la requête MySQL en une tranche de structure personnalisée dans le langage Go? Comment convertir la liste des résultats de la requête MySQL en une tranche de structure personnalisée dans le langage Go? Mar 03, 2025 pm 05:18 PM

Comment convertir la liste des résultats de la requête MySQL en une tranche de structure personnalisée dans le langage Go?

Comment puis-je définir des contraintes de type personnalisé pour les génériques en Go? Comment puis-je définir des contraintes de type personnalisé pour les génériques en Go? Mar 10, 2025 pm 03:20 PM

Comment puis-je définir des contraintes de type personnalisé pour les génériques en Go?

Comment écrire des objets et des talons simulés pour les tests en Go? Comment écrire des objets et des talons simulés pour les tests en Go? Mar 10, 2025 pm 05:38 PM

Comment écrire des objets et des talons simulés pour les tests en Go?

Comment écrire des fichiers dans GO Language de manière pratique? Comment écrire des fichiers dans GO Language de manière pratique? Mar 03, 2025 pm 05:15 PM

Comment écrire des fichiers dans GO Language de manière pratique?

Comment rédigez-vous des tests unitaires en Go? Comment rédigez-vous des tests unitaires en Go? Mar 21, 2025 pm 06:34 PM

Comment rédigez-vous des tests unitaires en Go?

Comment puis-je utiliser des outils de traçage pour comprendre le flux d'exécution de mes applications GO? Comment puis-je utiliser des outils de traçage pour comprendre le flux d'exécution de mes applications GO? Mar 10, 2025 pm 05:36 PM

Comment puis-je utiliser des outils de traçage pour comprendre le flux d'exécution de mes applications GO?

See all articles