Escolar Documentos
Profissional Documentos
Cultura Documentos
por
Andrei Hodecker
por
Andrei Hodecker
Agradeço aos meus pais Vanilde e Leonel, a minha namorada Fernanda, e ao meu
orientador André Raabe pelo apoio que me ofereceram durante todo estre trabalho.
Several Computer Science courses around the world start with programming introduction
disciplines, the knowledge acquired by students in this discipline tends to influence their
performance in other subjects. However, development environments are generally intended to
experienced programmers, using technical vocabulary and concepts that a beginner student
still doesn't understand. With an educational focus, Portugol Studio aims to provide a more
user friendly development environment for novice students, of many features stands out its
static and dynamic assessments, which aims to guide the student in solving programming
exercises. The static assessment can analyze the code of the student and compare it with
model solutions, seek incorrect patterns and send tips for the student. But the static
assessment still has prototyping aspects, and the developtment of exercises for it demand a lot
of work. In this paper was developed improvements in the static assessment, as well the
development of new algorithms that walk through the abstract syntax tree and find error
patterns, called tree walkers, an exercise editor to facilitate the creation of questions for the
assessment system, in addition, this paper conducted an experiment with a group of students
exploring what happens when a hint of static assessment is displayed. At the end of this
project, the static assessment of Portugol Studio was improved in various aspects, the
exercise editor developed, now allow the creation of exercises quickly and without requiring
much knowledge, in addition, the experimente pointed that the automated assesment had a
positive impact in the exercise solving process, although didn’t worked as expected with some
tree walkers and model solutions. The metodology used in the experiment proved effective na
the obtained knowledge from the experiments will serve as the basis to set guidelines for
future papers.
Equação 1 ................................................................................................................................. 20
Equação 2 ................................................................................................................................. 20
Equação 3 ................................................................................................................................. 25
Equação 4 ................................................................................................................................. 45
Equação 5 ................................................................................................................................. 46
LISTA DE ABREVIATURAS E SIGLAS
SUMÁRIO
1 INTRODUÇÃO .................................................................................................................. 16
1.1 PROBLEMATIZAÇÃO ................................................................................................. 17
1.2 FORMULAÇÃO DO PROBLEMA .......................................................................................... 17
1.2.1 Solução Proposta .......................................................................................................... 19
1.3 OBJETIVOS ................................................................................................................... 23
1.3.1 Objetivo Geral .............................................................................................................. 23
1.3.2 Objetivos Específicos .................................................................................................... 23
1.4 METODOLOGIA ................................................................................................................. 23
1.4.1 Desenvolvimento dos Tree Walkers .............................................................................. 23
1.4.2 Desenvolvimento do Editor de Questões ...................................................................... 24
1.4.3 Experimento com os Alunos.......................................................................................... 24
1.5 ESTRUTURA DO TRABALHO .............................................................................................. 25
2 FUNDAMENTAÇÃO TEÓRICA .................................................................................... 27
2.1 CORREÇÃO ESTÁTICA ............................................................................................... 27
2.1.1 Etapas da Análise de Programas ................................................................................. 28
2.2 PORTUGOL STUDIO .................................................................................................... 33
2.2.1 Corretor Proposto em PELZ ........................................................................................ 36
2.3 TRABALHOS SIMILARES ........................................................................................... 41
2.3.1 Corretores Automáticos ................................................................................................ 41
2.3.2 Avaliação da Efetividade das Mensagens de Erros ..................................................... 42
2.3.3 Considerações............................................................................................................... 46
3 DESENVOLVIMENTO .................................................................................................... 48
3.1 TREE WALKERS........................................................................................................... 48
3.2 CORRETOR E EDITOR DE QUESTÕES ..................................................................... 51
3.2.1 Alterações no Corretor ................................................................................................. 51
3.2.2 Editor de Questões ........................................................................................................ 54
3.3 EXPERIMENTO DE AVALIAÇÃO .............................................................................. 58
4 RESULTADOS .................................................................................................................. 60
4.1 IMPLEMENTAÇÃO DOS TREEWALKERS............................................................................. 60
4.2 EDITOR DE EXERCÍCIOS .................................................................................................... 62
4.3 PLUG-IN DO CORRETOR AUTOMÁTICO ............................................................................. 67
4.4 EXPERIMENTO COM OS ALUNOS ....................................................................................... 69
4.4.1 Comportamento do aluno em relação a mensagens ..................................................... 72
5 CONCLUSÕES .................................................................................................................. 75
5.1 TRABALHOS FUTUROS...................................................................................................... 76
16
1 INTRODUÇÃO
Para que se possa auxiliar a aprendizagem desta disciplina, Hostins e Raabe (2007)
observam que existe uma tendência, tanto na comunidade científica brasileira quanto em
livros didáticos, para a utilização de pseudolinguagens com a utilização de palavras
reservadas em português. Esta abordagem tem sido adotada para que a aprendizagem tenha
um enfoque maior nos aspectos da lógica de programação, sem adentrar aspectos técnicos de
sintaxe. Atento a esta tendência o Grupo de Informática na Educação (GIE) da UNIVALI vem
realizando pesquisas a fim de desenvolver ferramentas que possam melhorar o aprendizado
dos alunos nas disciplinas introdutórias, um dos frutos destas pesquisas é o WebPortugol,
desenvolvido por Hostins e Raabe (2007), uma ferramenta acessível via navegador de Internet
que possibilita a edição e testes de programas escritos na pseudolinguagem Portugol.
1.1 PROBLEMATIZAÇÃO
algoritmos foi, dentre muitas variáveis envolvidas, responsável pela redução do índice de
reprovação de 50% em 2001, para 35% em 2007.
Sendo o feedback tão necessário, Marceau et al. (2011) afirma que a mensagem de
erro é o ponto de contato mais importante entre o sistema e o programador, é essencial
oferecer boas mensagens para programadores novatos. Algumas ferramentas de
desenvolvimento auxiliam na tarefa de detectar erros no código-fonte, mas geralmente as
mensagens de erros são tão difíceis de compreender que se torna mais um desafio para o
aluno entender qual foi o seu erro (HRISTOVA et al., 2003), ou que decisão tomar para
resolver os problemas encontrados (JERINIC, 2012). Os motivos para mensagens de erros
serem ineficientes são diversos, para Nienaltowski et al. (2008) as ferramentas comerciais são
construídas para especialistas, e suas mensagens de erros são superficiais demais, não muito
visuais e técnicas demais.
Para a realização das provas de conceito do trabalho de Pelz (2014), somente duas
questões foram preparadas. Portanto, não foram desenvolvidos muitos tree walkers,
necessários para emitir dicas, para a elaboração de mais questões.
1
𝑛0 = Equação 1
𝐸02
𝑁 × 𝑛0
𝑛= Equação 2
𝑁 + 𝑛0
A Tabela 1 a seguir mostra as questões selecionadas, bem como seu tópico abordado e
a porcentagem de erro constatada. Os critérios adotados permitiram reduzir o universo de
submissões analisadas em aproximadamente 80%.
Desvio 14 72%
Desvio 18 67%
Laço 27 75%
Laço 29 79%
Laço 30 63%
Laço 34 64%
Laço 40 69%
Vetor 45 69%
Vetor 47 76%
Vetor 51 81%
Matriz 57 76%
Matriz 60 90%
1
O JavaScript foi executado localmente e sem o auxílio de um browser, isto foi possível por meio do projeto
NodeJS, que permite o desenvolvimento na linguagem JavaScript em um ambiente server-side.
22
Com a seleção das questões e a obtenção das soluções submetidas pelos alunos, foi
realizado o processo de inferência dos erros mais comuns.
Este trabalho também propõe um experimento para avaliar a influencia das dicas
emitidas pelo corretor nas ações tomadas pelos alunos através da realização de uma lista de
23
1.3 OBJETIVOS
1.4 METODOLOGIA
Nesta seção, um detalhamento dos procedimentos metodológicos utilizados para o
desenvolvimento do trabalho é apresentado.
Além disso, foram utilizados testes unitários, desta forma todas as situações em que os
tree walkers deveriam detectar erros foram especificadas, quando se desejava testar o tree
walker apenas se executava o teste unitário que mostrava o resultado encontrado. Este
processo é documentado mais profundamente também no item 3.1 .
24
Rubrica Explicação
Mnemônico da palavra fixed (corrigido). Será assinalado quando o aluno
[FIX]
corrigiu completamente apontado pela mensagem de erro.
Mnemônico da palavra attention (atenção), será assinalado quando se
constatar que o aluno está tentando resolver o problema, mas sua solução
[ATT] ainda não é correta. Entende-se por atenção quando o aluno clicou em uma
das mensagens que aparece no painel ou realizou uma alteração no código-
fonte para tentar solucionar o problema.
2
Para mais informações visite http://gulpjs.com/.
3
Para mais detalhes visite http://bower.io/.
4
Disponível em https://github.com/andreihod/Portugol-Editor-Exercicios.
25
A partir das rubricas anotadas, foi possível calcular uma “taxa de eficiência” para cada
tree walker. Era desejado calcular as taxas de cada aluno separadamente e no fim realizar uma
média, pois um aluno que execute a correção várias vezes pode influenciar na qualidade os
resultados, mas por ter sido o primeiro contato dos alunos com o corretor, e o tempo do
experimento ter sido limitado por problemas técnicos, poucos dados sobre os tree walkers
foram coletados, fazendo que o cálculo de média por aluno se tornasse irrelevante. A Equação
3 demonstra o cálculo de cada tree walker. A variável t representa o tree walker.
𝐹𝐼𝑋
𝑒𝑡 = ∗ 100 Equação 3
𝑈𝑁𝑅 + 𝐴𝑇𝑇 + 𝐹𝐼𝑋
2 FUNDAMENTAÇÃO TEÓRICA
Neste capítulo serão discutios os referenciais teórios para o desenvolvimento deste
trabalho. Dentre os assuntos discutidos encontram-se correção estática, Portugol Studio e
trabalhos similares.
De acordo com Ala-Mutka (2005), apesar do fato que a maioria dos erros de
funcionamento ser mais habitualmente identificados dinamicamente na execução do programa
com casos de testes, alguns erros ou trechos de código com erros em potencial podem ser
reconhecidos estaticamente, alguns exemplos são: identificação de problemas na atualização
da variável de controle de laços de repetição, inconsistência entre o tipo de parâmetro e seu
uso, código não utilizado e condições redundantes.
executado, exige certamente menos carga de trabalho para o computador. Rahman (2007)
observa também que apenas programas livres de erros podem ser analisados pela correção
dinâmica, ao contrário da estática.
Porém, existem algumas desvantagens na correção estática, para Nguyen et al. (2014),
exercícios de programação são complexos e podem ser abordados com muitas soluções ou
estratégias, além de tipicamente exigirem criatividade. Portanto Truong et al. (2004) observa
que instrutores ou professores precisam fornecer diversas soluções modelos para que estas
sejam comparadas as dos alunos, caso contrário o corretor não será capaz de lidar com a
variabilidade das soluções dos estudantes. Apesar desta desvantagem, Nguyen et al. (2014)
afirma que em muitos exercícios de programação, os alunos irão se beneficiar mais com uma
avaliação personalizada do que um binário correto ou incorreto.
Segundo Ala-Mutka (2005) a maior desvantagem da correção estática é que esta não
pode avaliar se uma questão está correta e funcional. Este critério é muito importante para
corretores automáticos e só pode ser resolvido através de um corretor dinâmico. Segundo
Truong et al. (2004) aplicações em sistemas tutores ou corretores costumam fazer uso de
ambas abordagens para avaliar os algoritmos dos estudantes.
Análise Semântica
são laços de repetição infinitos e divisão por zero, estes erros não geram mensagens de erros
na etapa de compilação, mas durante a execução podem produzir resultados indesejados.
De acordo com Aho et al. (2007), alguns exemplos de verificação estática que
compreende a análise semântica são:
Segundo Louden (1997), a utilização de ASA é uma das técnicas mais comuns para
construção de interpretadores, uma vez que gera uma estrutura do programa em memória que
pode ser percorrida a fim de realizar a interpretação do código, obtendo assim o mesmo
resultado de um programa compilado.
Tree Walkers
31
Segundo Jones (2003) uma ASA pode ser construída através de um analisador (em
inglês se denomina parser) codificado a mão, ou através de código produzido por geradores
de parsers. Dentre diversas ferramentas utilizadas neste contexto, destaca-se o ANTLR
(Another Tool for Language Recognition), que segundo Parr (2009) pode ser resumido em
duas funcionalidades: uma ferramenta que traduz uma gramática para um parser ou lexer
(analisador léxico) em Java (ou outra linguagem alvo), e a uma biblioteca para a execução
deste parser/lexer produzido.
Por padrão, parsers gerados com a ferramenta ANTLR em sua versão atual (4.0),
constroem uma árvore sintática que armazena a maneira que este reconheceu a estrutura de
entrada. É uma estrutura muito eficiente, pois contém todo o conhecimento de como o parser
agrupou os símbolos em frases (PARR, 2009).
Segundo Pelz (2014), a hierarquia de classes de uma árvore sintática abstrata sugere o
cumprimento com o padrão de projeto Composite, que de acordo com Gamma et al. (1995) é
descrito como o resultado da composição de um ou mais objetos similares. Este padrão de
projeto sugere também a utilização do padrão Visitor, que percorre uma estrutura Composite
resulta em algo similar a uma inferência de tipos.
Para percorrer uma ASA, Parr (2009) observa que a ferramenta ANTLR possui um
ParseTreeWalker que sabe como percorrer estas árvores e disparar eventos em
implementações de listeners ou visitors que um desenvolvedor pode criar por ele próprio. No
Quadro 1 é possível observar a interface para a implementação de visitors para a gramática da
linguagem de programação Java.
Além disso, o ANTLR gera um listener base com implementações vazias dos métodos
da interface, para o exemplo do Quadro 1 se denominaria JavaBaseListener, portanto, um
desenvolvedor pode construir seus próprios listeners utilizando a classe base como
superclasse e implementando os métodos que tem interesse (PARR, 2009). Assumindo que o
32
A abordagem escolhida para a implementação destes tree walkers em Pelz (2014) foi a
visitor, ela é realizada ao adicionar um método abstrato, que recebe por parâmetro um
visitante, no topo da hierarquia de classes dos nós de uma ASA, para cada classe concreta
deve-se por fim sobrescrever este método. A Figura 6 apresenta um diagrama de classe que
representa esta estrutura.
Uma ASA pode ser percorrida por tree walkers tanto através de listeners, quanto
através de visitors, Parr (2009) observa que a principal diferença entre estas abordagens é que
por listeners os métodos desenvolvidos são chamados independentemente por um tree walker
33
padrão, já na abordagem por visitors os métodos invocados devem chamar a visita de seus nós
filhos, caso contrário, parte da ASA não será percorrida.
A interface do Portugol Studio se divide em três partes principais, são elas: (i) o
código fonte, onde os estudantes podem criar seus programas; (ii) árvore de símbolos, onde é
possível visualizar as variáveis do programa e (iii) console de entrada e saída/ mensagens,
onde o estudante visualiza mensagens de erros e interage com seu programa (NOSCHANG et
al., 2014). Na Figura 7 é possível visualizar a interface de da IDE Portugol Studio em
funcionamento.
foi possível graças a uma abordagem especial no analisador semântico para que este percorra
a ASA de diferentes formas a fim de identificar erros de uma maneira mais precisa
(NOSCHANG et al., 2014). A Figura 8 demonstra algumas mensagens de erros emitidas pelo
Portugol Studio.
O Portugol Studio faz uso de outro projeto internamente, o Portugol Core. Segundo
Noschang (2012) este projeto é totalmente independente do Portugol Studio, permitindo assim
a utilização do mesmo por outras ferramentas e é dividido internamente em 3 partes:
analisador sintático, semântico e interpretador.
O Portugol Core implementa o suporte para a linguagem Portugol 2.0 que possui todos
os elementos básicos de uma linguagem de programação, tais como: estruturas de controle
para desvio condicional e laços de repetição, operações aritméticas, de atribuição, booleanas e
de manipulação de bits, diferenças de escopo entre variáveis, funções e procedimentos, e
também suporte a vetores e matrizes (PELZ, 2014). Além destes elementos básicos, o
Portugol Studio oferece bibliotecas para a construção de programas mais sofisticados, como
por exemplo, biblioteca gráfica e sons, permitindo o desenvolvimento de jogos de baixa
complexidade em duas dimensões, alguns exemplos do uso destas bibliotecas podem ser
obtidos no próprio Portugol Studio (NOSCHANG et al., 2014).
O Portugol possui uma linguagem intermediária representada por uma ASA, esta
árvore, por sua vez, é instanciada por um parser gerado com a ferramenta ANTLR em sua
terceira versão. O Portugol Core provê serviços de análise de código e oferece mecanismos
para a execução de entrada e saída de dados durante a interpretação da linguagem
36
5
Disponível em https://www.youtube.com/user/PortugolStudio.
37
Funcionamento do Corretor
Para Pelz (2014) estas duas análises mencionadas anteriormente entregam poucas
dicas e não verificam a solução como um todo. A análise feita para avaliar estruturas faltantes
ou em excesso, é realizada comparando a resposta do aluno com uma solução modelo, para
isto, ambas às soluções devem ser normalizadas. O processo de normalização é necessário,
pois algumas instruções apesar de serem diferentes possuem o mesmo mecanismo lógico, por
exemplo, os comandos enquanto, faça enquanto e para são diferentes, mas todos representam
um laço de repetição e executam a mesma tarefa.
O corretor de Pelz (2014) não se limita apenas a encontrar estruturas faltantes entre
duas soluções, mas também pode percorrer a ASA com algoritmos específicos em busca de
erros que alunos tendem a cometer. Caso estes algoritmos de verificação, denominados tree
walkers, encontrem os padrões que foram programados para verificar, uma dica é enviada ao
aluno. O funcionamento do corretor é demonstrado na Figura 11.
Segundo Pelz (2014) o processo de inferência dos tree walkers desenvolvidos se deu
pela análise manual das soluções dos alunos no ambiente ALICE por um professor
especialista, por fim, foram verificados quais deles eram passíveis de identificação por tree
walkers. O Quadro 4 demonstra os tree walkers que foram desenvolvidos em Pelz (2014),
bem como uma breve descrição dos mesmos.
Na dissertação de Pelz (2014) foi realizada uma análise de três revisões da literatura
sobre corretores automáticos. Douce (2006) realizou um levantamento histórico das
ferramentas de correção de algoritmos, desde 1960 até o presente. Já Ala-Mutka (2005)
direcionou sua revisão em apresentar os métodos e técnicas utilizados e como essas
ferramentas são geralmente utilizadas. Ihantola et al. (2010) atualizou a revisão de Ala-Mutka
(2005) incluindo corretores construídos após a publicação do trabalho.
Segundo Pelz (2014) a busca por corretores também foi realizada nas bases da ACM,
ScienceDirect e IEEExplore, além da leitura de artigos referenciados nas revisões sistemáticas
de Ala-Mutka (2005), Douce (2006) e Ihantola et al. (2010). Os critérios adotados para
selecionar os corretores que seriam analisados foram: possuir foco educacional em alunos
iniciantes e se preocupar com o feedback que o mesmo recebe enquanto resolve o problema, e
também o detalhamento da técnica utilizada. Dos trabalhos selecionados na análise, pode-se
destacar os seguintes corretores: Scheme-robo, PROUST, ELP, Expresso.
Nestes corretores, Pelz (2014) observou que aqueles que realizam análise dinâmica
para validar a resposta do aluno, também fazem uso deste mecanismo como uma forma de
feedback ao mostrar as entradas utilizadas e as saídas obtidas. Em alguns corretores, as
mensagens de erros emitidas pelo compilador podem ser consideradas como feedback, não foi
explicitado se ocorreu algum esforço no intuito de deixa-las mais didáticas. A Tabela 3
demonstra visualmente a forma de feedback que cada corretor faz uso.
Segundo Pelz (2014), os corretores que possuem um feedback mais rico foram o
AutoLEP e o ELP. O ELP, ao contrário do AutoLEP, não possui a habilidade de analisar
algoritmos que possui erros de sintaxe, esta característica deve ser tratada com importância,
pois alunos comumente cometem este tipo de erro durante o primeiro contato com a
linguagem. O feedback considerado mais complexo é o da ferramenta PROUST, em que todo
o exercício deve ser mapeado criando todas as situações possíveis onde o aluno pode errar, o
que exige um grande esforço do professor.
O referido trabalho buscou avaliar a efetividade das mensagens de erros exibidas pela
ferramenta DrScheme. Esta ferramenta tenta resolver o problema de que linguagens de
43
programação são projetadas para especialistas, e não são muito adequadas para o ensino de
programação. Para isto, a ferramenta oferece diversos níveis da linguagem, cada qual é um
subconjunto do próximo nível, e as mensagens de erros referem-se apenas a conceitos que os
alunos aprenderam até aquele nível. Os alunos que aprendem com esta ferramenta podem
progredir por até cinco níveis, iniciando em Beginner Student Language (BSL) até Advanced
Student Language (ASL). Além disso, as mensagens do DrScheme foram desenvolvidas ao
longo de uma década de extensiva observação em laboratório e sala de aula.
Segundo Marceau et al. (2011) apesar de todo o cuidado com a ferramenta DrScheme
no ensino dos alunos, ainda é comum perceber problemas de interpretações de mensagens de
erros. Com o intuito de entender como os estudantes respondem a mensagens de erros e
determinar porque algumas mensagens causam mais dificuldades do que outras, foram
realizadas: uma análise de diversas edições do código em resposta a mensagens de erros,
entrevistas aos alunos sobre suas interpretações das mensagens de erros, e formulários de
pesquisa para os estudantes sobre o vocabulário das mensagens. Sendo que a contribuição
chave do trabalho é a sua metodologia para avaliar a mensagens de erros.
Na Figura 13 é possível verificar a edição no código que o aluno realizou para corrigir
o problema que a mensagem de erro na Figura 12 apontou. Segundo Marceau et al. (2011) o
aluno inseriu a palavra name no código, e existe uma lógica para tal ação, a mensagem de erro
avisou que esperava um name no código, então o aluno tratou de colocar.
Marceau et al. (2011) denota que a ferramenta DrScheme foi alterada para salvar o
programa do aluno toda vez que o mesmo tentava executá-lo, junto como a mensagem de erro
que este recebeu e a tecla pressionada em resposta a mensagem. Dos 140 alunos registrados
no curso, 64 concordaram em participar da coleta de dados.
[UNR] O estudante faz algo que não tem relação ao erro e também não ajuda.
[DIFF] O estudante faz algo que não tem relação ao erro, mas corrige outro erro.
Segundo Marceau et al. (2011) muitos erros são variações do mesmo problema
encontrado, então estas mensagens foram agrupadas em seis categorias: erros que
correspondem a parênteses, índice fora dos limites, declarações, chamadas de função,
condições e número de parâmetros. A Tabela 5 demonstra os resultados da coleta, a coluna
“exibidos” mostra quantas vezes os estudantes viram o erro, a coluna “analisados” quantas
respostas ao erro foram verificadas, a coluna “Eficiência” indica a efetividade da mensagem
de erro para a correção do problema, enquanto as demais colunas da direita demonstram a
quantidade de cada rubrica anotada.
Índice 73 33 84% 1 3 2 2 25
Declaração 73 32 50% 2 11 4 4 11
Chamada 63 29 36% 1 10 2 7 9
de Função
Condição 61 31 49% 2 12 0 4 13
Contagem 24 21 52% 1 5 0 8 7
de
Parâmetros
Marceau et al. (2011) denota que a coluna denominada “Efetividade” não deve ser
confundida com uma simples proporção da coluna “FIX” em relação a coluna “Analisados”,
este cálculo seria errôneo de duas maneiras: as rubricas DEL e DIFF não podem ser
contabilizadas desfavorecendo a efetividade da mensagem, e também não leva em
consideração a quantidade de execuções que o usuário realizou. Para resolver estes
problemas, a efetividade foi calculada para cada estudante e somada, a Equação 3 e a Equação
4 demonstram como o cálculo foi contabilizado, para estudante s e categoria c.
𝐹𝐼𝑋
𝑝𝑠,𝑐 = Equação 4
𝑈𝑁𝑅 + 𝑃𝐴𝑅𝑇 + 𝐹𝐼𝑋
46
Observando os resultados obtidos neste trabalho, Marceau et al. (2011) inferiu uma
série de recomendações para melhorar as mensagens de erros em ferramentas de
desenvolvimento voltadas a educação, são elas:
2.3.3 Considerações
É possível observar que, de acordo com a pesquisa realizada por Pelz (2014), muitos
corretores fazem uso de uma comparação com a solução modelo. Estas soluções modelos são
importantes no corretor de Pelz (2014) para que o professor possa criar diversas abordagens
possíveis para o mesmo problema. Porém, durante a inferência dos tree walkers foi constatado
47
que os mesmos se aplicam mais para o exercício, do que para cada solução modelo. Sendo
assim, algumas alterações no corretor foram realizadas a fim de utilizar as soluções modelos
como forma de fornecer feedback, atualmente exclusividade dos tree walkers.
A metodologia utilizada por Marceau et al. (2011) para a inferência da efetividade das
mensagens de erros do compilador foi utilizada para a elaboração em um experimento com o
corretor estático do Portugol Studio.
3 DESENVOLVIMENTO
Neste capítulo será abordado como o projeto será desenvolvido, detalhando os tree
walkers inferidos, o editor de questões e suas funcionalidades e os processos do experimento
de avaliação das mensagens dos tree walkers.
Para que cada tree walker cumpra com seu objetivo especificado, foi definido a
estratégia que cada um irá adotar para reconhecer os padrões desejados. O Quadro 7
demonstra as estratégias que foram adotadas para desenvolver os tree walkers.
}
}
geradas por desvios condicionais na ASA da solução do aluno, este tree walker pode ser de
utilidade em questões que envolvem um número conhecido de possibilidades. Na Tabela 6 é
possível observar a relação de todos os tree walkers e as questões onde os mesmos puderam
ser inferidos, o enunciado das questões é evidenciado no Apêndice A.
Nome do TreeWalker 14 18 27 29 30 34 40 45 47 51 57 60
PossibleInfiniteLoop x x x x x x x x x x x
NumberOfConditions x x x x x x x x x x
ConstantIndex x x x x x
EmptyBlocks x x
NumberOfInstructions x
MandatotyArray x x x x x
Para que o editor de questões possa exibir os tree walkers disponíveis e criar a
interface necessária para que os seus parâmetros possam ser definidos, se faz necessário um
arquivo de manifesto do tree walker. A estrutura básica deste manifesto deve ser composta
pelo nome do tree walker, o autor que o criou, uma descrição da sua funcionalidade, e seus
respectivos parâmetros. Este arquivo é representado na notação JSON (JavaScript Object
Notation) pois é mais adequado a natureza do editor de questões que funcionará em um
navegador de internet, como é descrito no item 3.2.3 . O Quadro 9 exemplifica um arquivo de
manifesto de um tree walker.
}
51
Tags para a questão: Foram adicionadas “tags” para cada questão, para que
assim possa ser possível realizar pesquisas no editor por classificações de
questões já existentes. Por exemplo, será possível buscar questões que possuem
a tag “laço de repetição” e assim verificar somente questões que abordam este
tema.
Tree Walkers para o exercício: Boa parte dos tree walkers existentes são
relativos ao exercício como um todo e raramente a soluções modelos, portanto
agora é possível incluir tree walkers associados as questões que serão
disparados sempre, independentes da solução modelo.
6
Um brach é uma ramificação no versionamento do projeto, utilizado para desenvolver novas funcionalidades e
testá-las separadamente.
7
O código-fonte do branch “andrei_ttc2” pode ser consultado em https://github.com/UNIVALI-L2S/Portugol-
Corretor/tree/andrei_ttc2.
54
8
O framework AngularJS pode ser obtido em https://angularjs.org/.
9
O código-fonte do projeto pode ser encontrado em https://github.com/andreihod/Portugol-Editor-Exercicios.
10
O framework Bootstrap poder ser obtido em http://getbootstrap.com/.
56
$scope.addCaso = function () {
$rootScope.Exercicio.casos.push({entradas: [], saidas: []});
};
<div>
<barra estilo="3"></barra>
</div>
<div>
<treewalker tw="manifesto" lista="listatw"></treewalker>
</div>
Utilizando diretivas garante-se que a lógica por trás destes elementos seja sempre a
mesma, um exemplo de como estes atributos são exibidos no navegador podem ser
visualizados na Figura 20.
RF1.0 - Deve ser possível criar e editar questões para o corretor do Portugol
Studio.
57
o RF1.1 - Deve ser possível criar ou excluir uma questão com o editor.
o RF3.1 - Deve ser possível definir tree walkers para o exercício como
um todo.
o RF3.2.3 - Deve ser possível definir tree walkers para a solução modelo.
RF4.0 - Deve ser possível especificar os parâmetros dos tree walkers incluídos
no exercício.
11
Formato utilizado para armazenar exercícios em arquivos do Portugol Studio.
58
RN2.0 - O sistema não deve permitir que um tree walker tenha seus parâmetros
obrigatórios indefinidos.
RN3.0 - O sistema deve garantir que ao menos uma solução modelo seja
correta.
Neste experimento foi avaliada a efetividade das mensagens de erros emitidas pelos
tree walkers. Entende-se que uma mensagem de erro efetiva é aquela que fornece informações
úteis para o aluno corrigir o problema e progredir na resolução do exercício, ou seja, a ação
tomada pelo aluno após a exibição da mensagem deve ser relevante para a correção do
problema apontado pela mesma.
muita facilidade (visto que a análise é referente as mensagens de erros, é necessário que o
aluno encontre um pouco de dificuldade).
O plug-in foi alterado para gravar um registro toda vez que o aluno solicitava uma
correção de um exercício no corretor e também na tela onde são exibidas as dicas do corretor
estático e os casos de teste do corretor dinâmico. Desta maneira foi possível registrar não só a
correção, mas também se o aluno navegou entre os casos de testes ou selecionou uma
mensagem emitida pelo corretor estático.
4 RESULTADOS
Quando o usuário decide editar uma questão ou criar uma nova, o mesmo é
direcionado para a tela apresentada na Figura 21, nesta tela é possível definir um título,
especificar o enunciado, incluir e excluir tags, salvar o exercício (botão de disquete no canto
direito superior) e realizar o download do arquivo “pex” (botão de nuvem ao lado do
disquete). Para adicionar uma tag, basta que o usuário digite o seu conteúdo no campo
“Adicione uma tag” e em seguida pressione a tecla “enter”.
63
É importante observar que os parâmetros dos tree walkers podem ser exibidos de
diversas formas, conforme o especificado no seu arquivo de manifesto. A Figura 24
demonstra todas as possibilidades que o corretor oferece para incluir parâmetros: como um
valor em um campo de edição, uma lista de parâmetros, ou então um caixa de combinação
que se selecione um valor.
Por fim na tela representada na Figura 26, é possível visualizar a edição de uma
solução modelo com a edição do código-fonte habilitado na interface. É importante observar
que o check-box “Solução Errada?” quando selecionado esconde os tree walkers da solução,
visto que soluções incorretas não possuem este mecanismo.
Na tela inicial do plug-in, o aluno pode escolher entre diversos exercícios para
começar a responder, foram colocados um total de 12 exercícios para dar suporte ao
experimento descrito no item 3.3. Cada exercício possui 3 diferentes atributos, são eles:
Status: Indica a situação do exercício que pode ser disponível (bandeira verde),
iniciado (bandeira amarela) e também finalizado (bandeira quadriculada).
Ao dar um duplo clique sobre um dos exercícios da lista, o aluno é transferido para
outra tela com o enunciado da questão e alguns componentes de interface, mostrada na Figura
29. O botão “corrigir” executa o corretor estático e dinâmico com o código-fonte do aluno no
68
contexto do exercício selecionado, a barra de progresso logo abaixo do botão indica quantos
casos de testes o algoritmo do aluno passou, e por fim, os botões de navegação avançar e
retroceder navega entre as questões, e o botão com um ícone de “casa” volta a tela inicial com
a lista de exercícios.
Além disso, para dar suporte ao experimento com os alunos, o plug-in grava logs no
banco todas as vezes que o aluno solicita a correção, navega pelos casos de testes e clica em
alguma mensagem. Foram salvos o usuário, o exercício, o número da tentativa, a nota, as
mensagens e o código-fonte, como pode-se notar com a Figura 31.
possuir várias notas no mesmo exercício, ou seja, ele pode solicitar a correção
várias vezes, considerou-se a melhor nota de cada estudante no exercício, e em
seguida calculada uma média entre todos. Estudantes que não iniciaram o
exercício não pertencem ao universo do cálculo.
Exercício 5 2 5 0 1,5
Exercício 7 0 0 0 0
Exercício 8 1 0 28 3
Exercício 9 0 0 0 0
Exercício 11 1 0 15 3
Exercício 12 3 0 0 1
Inexperiência com o corretor: Este foi o primeiro contato dos alunos com o
corretor automático, foi perceptível durante o experimento que no início os
alunos precisaram explorar o mesmo para entender como funcionava, o que
tomou algum tempo. É perceptível na Tabela 8 que o exercício 1, normalmente
o primeiro a ser realizado, tem uma média de tempo maior que os outros 4
subsequentes, além de uma nota um pouco menor em relação aos outros, isto
pode indicar uma evolução dos alunos durante o experimento utilizando o
corretor.
O resultado obtido foi de que das 83 vezes que mensagens do corretor dinâmico
apareceram para todos os alunos, houve 43 (51,8%) utilizações do componente de exibição
dos casos de testes. Apesar deste número não ser ruim, afinal pelo menos metade das vezes o
aluno se interessa em verificar os casos, ele pode indicar que estas mensagens e o próprio
73
componente de exibição dos casos necessitam ser aprimorados de modo a deixar mais claro
para o aluno que problemas foram encontrados no momento de execução dos testes.
Mensagens das
Exercício 4 12 0 6 6 0%
Soluções Incorretas
EmptyBlocks Exercícios 1 e 2 12 8 0 4 66%
ReadAfterOperation Exercícios 1 e 2 2 0 0 2 0%
A partir dos dados coletados foi possível obter informações relevantes sobre o uso do
corretor estático pelos alunos:
nenhuma instrução. A taxa de eficiência foi de 66%, boa parte dos alunos que
receberam a mensagem conseguiram encontrar o erro e solucionar o problema.
Outros Tree Walkers: Nenhum outro tree walker foi capturado pelos testes,
acreditamos que o pouco tempo do experimento foi um dos fatores que
contribuíram. Um experimento durante todo um mês ou todo um semestre
letivo pode revelar informações mais consistentes.
75
5 CONCLUSÕES
Todos os tree walkers planejados foram desenvolvidos com êxito, desta forma o
corretor conta agora com um total de 12 tree walkers disponíveis para a utilização no
exercício. Foi possível perceber durante o desenvolvimento que não é complicado
desenvolver a maioria deles, e que os mesmos se assemelham muito, porém alguns tree
walkers mais complexos podem demandar muito tempo e teste, neste sentido, testes unitários
demonstraram ser de grande auxílio para a implementação dos mesmos.
O corretor estático ganhou novas funcionalidades e teve seu código aprimorado, além
de ter tido diversos problemas constatados e corrigidos. O mesmo foi incorporado em um
plug-in para o Portugol Studio, e já pode ser utilizado por alunos, desta maneira é possível
fazer download do corretor separadamente e instalar no editor. O plug-in também foi alterado
para gravar logs durante sua utilização, é esperado que com a utilização do mesmo seja
possível extrair informações valiosas sobre o uso do corretor pelos estudantes. Durante um
experimento com os alunos o corretor não se mostrou instável, apresentado apenas alguns
problemas que não impactaram seu uso e podem ser corrigidos facilmente.
Apesar do experimento com os alunos ter obtido uma quantidade de dados um pouco
menor do que esperado, ainda foi possível obter informações valiosas sobre o uso do corretor
pelos alunos. Constatamos que o aluno não usa o corretor em benefício próprio tentando, de
alguma forma, burlar o sistema corretor para obter nota máxima, isto pôde ser constatado
tanto pelos dados de utilização quanto por uma observação dos alunos durante a realização do
experimento.
76
O primeiro contato dos alunos com o corretor foi de descoberta de como o mesmo
funcionava, durante a execução do experimento era possível perceber que os alunos
começavam a usar o corretor com mais segurança conforme progrediam nos exercícios. De
modo geral a recepção dos alunos ao corretor foi bem positiva, acreditamos que a utilização
do corretor durante todo um semestre letivo pode deixar mais evidente a praticidade que o
mesmo pode oferecer para o professor e o aluno.
Observando os objetivos elucidados no item 1.3 deste projeto, pode-se considerar que
todos eles foram cumpridos.
Agora com o editor de exercícios desenvolvido, pode ser interessante avaliar o quanto
este editor contribui para a criação de questões para o corretor do Portugol Studio, se é
realmente fácil de usar quais dificuldades os usuários podem ter em utilizá-lo.
plug-in também precisa ser aprimorado na maneira em que se exibem os casos testados no
corretor dinâmico, da maneira que está hoje não se mostrou muito amigável.
A fórmula utilizada na para mensurar pode ser revista e melhorada, uma ideia é fazer
com que a rubrica “ATT” possa inferir positivamente no cálculo, já que se o aluno prestou
atenção na mensagem é um indício positivo que a mensagem está funcionando.
Sendo que existe uma metodologia bem definida e o instrumento de coleta de dados já
está desenvolvido, outros trabalhos podem aplicar novamente o experimento por um período
de tempo maior ou com um número de alunos mais considerável.
78
REFERÊNCIAS
AHO, A. V.; LAM, M. S.; SETHI, R.; ULLMAN, J. D. Compiladores: princípios, técnicas
e ferramentas. 3.ed. Editora Pearson, 2007.
BARBETTA, Pedro Alberto. Estatística Aplicada às Ciências Sociais, 5. ed.. Editora UFSC,
2002.
GAMMA, E.; HELM, R.; JOHNSON, R.; VLISSIDES, J. Design Patterns: Elements of
Reusable Object-Oriented Software. Addison-Wesley Professional; USA, 2 edition 1995.
HUANG, J.; PIECH, C.; NGUYEN, A.; GUIBAS, L. Syntactic and Functional Variability
of a Million Code Submissions in a Machine Learning MOOC. 1st Workshop on Massive
Open Online Courses at the 16th Annual Conference on Artificial Intelligence in Education,
p. 25–32, Memphis, Tennessee, USA, 2013.
KINNUNEN, P.; MALMI, L. Why students drop out CS1 course? Computer Science
Education. Second International Workshop On Computing Education Research, v. 24, n. 7,
p. 97–108, Houston, Texas, USA, 2006.
JONES, Joel. Abstract Syntax Tree Implementation Idioms. In: 10th Conference on
Pattern Languages of Programs, Illinois, EUA, 2003.
NGUYEN, A.; PIECH, C.; HUANG, J.; GUIBAS, L. Codewebs: Scalable Homework
Search for Massive Open Online Programming Courses. International World Wide Web
Conference, Seul, South Korea, 2014.
NOSCHANG, Luiz Fernando; PELZ, Fillipi; JESUS, Elieser A. de Jesus; RAABE, André L.
A. Uma IDE para Iniciantes em Programação. In: Workshop de Informática na Escola, No
prelo 2014.
PARR, T., Language Implementation Patterns: Create Your Own Domain-Specific and
General Programming Languages. The Pragmatic Bookshelf, 2009.
TRUONG, N.; ROE P.; BANCROFT, P. Static analysis of students' Java programs. In:
Conference On Australasian Computing Education, 6., Dunedin, New Zealand.
Proceedings… Darlinghurst:Australian Computer Society, jan. 2004. p. 317-325.
GLOSSÁRIO
Code Completion Funcionalidade em IDES que completa automaticamente trechos de
código.
Pseudolinguagem É utilizada como uma forma genérica de representar um algoritmo.
Scheme Uma linguagem de programação que suporta programação funcional e
procedural.
Semântica No contexto de compiladores é o significado que cada token tem um
programa.
Server-Side Denominação para um ambiente de execução de código em um
servidor.
Sintaxe no contexto de compiladores é como os programas de uma linguagem
são descritos.
Tree Walker Um algoritmo que percorre uma ASA a fim de encontrar padrões e
realizar uma ação.
Visitor Um padrão de projeto comportamental que representa uma operação a
ser realizada sobre elementos da estrutura de um objeto.
82
Questão 14: Faça um programa que solicita a data de nascimento de uma pessoa e a
data atual e exiba a idade desta pessoa em anos (A data deve ser armazenada em 3 variáveis
inteiras para ano, mês e dia).
Questão 18: Faça um programa que solicita ao usuário três números reais e exibe na
tela apenas o menor deles.
Questão 27: Faça um programa que solicita ao usuário uma quantidade indeterminada
de números inteiros. O programa deve calcular e escrever a média aritmética apenas dos
números pares. A entrada de dados deve ser encerrada quando o número 0 (ZERO) for
digitado.
Questão 29: Faça um programa para uma calculadora simples que solicita ao usuário
dois operandos como entrada, seleciona uma das opções da lista (1- soma, 2- produto, 3-
divisão, 4- potência) e exibe o resultado. O algoritmo deve executar repetidamente até que os
dois operandos informados sejam iguais a zero. Utilize uma variável do tipo real para exibir o
resultado.
Questão 30: Faça um programa que gere e exiba os 20 primeiros termos da série de
Fibonacci (Os dois primeiros termos da série são 1 e 1, os termos subsequentes são a soma
dos dois últimos. Observe o exemplo: 1,1,2,3,5,8,13,21,..)
Questão 34: Faça um programa que solicita o peso de 25 pessoas e exibe qual o maior
peso e qual o menor peso dentre os digitados.
Questão 40: Faça um programa que solicita ao usuário o número de alunos de uma
turma e o número de provas realizadas. A seguir o programa deve para cada aluno:
Após o término da digitação o programa deverá exibir o nome do aluno com maior
média. Saídas:
83
Após cada pedido de nome e nota será exibido o nome do aluno e média
aritmética;
Ao fim será exibido = “Aluno com melhor média: ”,seguido do nome do aluno
com melhor média.
Questão 45: Faça um programa que leia um vetor de 100 posições e mostre-o
ordenado em ordem crescente.
Questão 47: Faça um programa que solicita ao usuário 50 valores reais e armazene em
um vetor. O programa deve verificar e exibir quantos elementos não repetidos (diferentes)
existem neste vetor.
Questão 51: Faça um programa que preenche dois vetores de 5 posições inteiras. A
seguir crie um novo vetor contendo a união dos elementos dos dois vetores (A união deve
excluir elementos repetidos). Exiba os vetores originais e o vetor união.
Questão 57: Faça um programa que manipula uma matriz quadrada de qualquer
tamanho, somando os valores que não estão nem na diagonal principal nem na diagonal
secundaria.
Questão 60: Faça um programa que preenche uma matriz de 4X4 com números reais.
O programa deve exibir qual a posição (linha e coluna) do elemento minimax, ou seja, o
menor valor que esteja na linha em que se encontra o maior valor da matriz.