2. MATERYAL VE YÖNTEM
2.2. Deneyde Kullanılan Kimyasallar
...Em Ciência, noções como complexidade, imprevisibilidade, caos, por mais sugestivas que elas sejam, são noções vagas, sem grande valor, até ao momento em que são traduzidas em quantidades que possam ser expressas matematicamente e correspondam a grandezas que possam ser medidas...
R. Vilela Mendes in Colóquio Fundação Gulbenkian
5.1. Introdução
Neste capítulo descrevemos a amostra (o conjunto dos dados) sobre a qual trabalhamos, os programas utilizados no estudo experimental que efectuamos e apresentamos os resultados obtidos na experimentação. Concluímos este capítulo com a discussão das três primeiras hipóteses formuladas nesta dissertação.
5.2. Descrição da amostra
Na sua totalidade a amostra utilizada consiste num conjunto de programas escritos na linguagem C. Este conjunto pode ser descrito como constituído por dois grupos fundamentais: o grupo dos compiladores e o grupo dos não compiladores.
Neste último grupo encontram-se programas que implementam diversas funcionalidades, de entre elas: a contagem de elementos de um ficheiro, a ordenação de um ficheiro, a geração de números pseudo aleatórios e o cálculo de datas. E ainda: cálculo matricial, cálculo numérico em tratamento de séries, execução de contabilidade, execução de informação para gestão e aquisição de dados através de varrimento e outros dispositivos. Os programas foram escritos por diferentes programadores. Na sua totalidade, o conjunto de programas corresponde a cerca de 20.000 linhas de código. A variedade dos programas e o tamanho da amostra garantem a sua representatividade estatística.
O primeiro grupo é mais homogéneo, sendo constituído por 36 programas escritos em linguagem C, que implementam um compilador de uma linguagem estruturada em blocos, denominada zeta. Os referidos programas foram construídos por alunos do 3º ano da licenciatura em Engenharia Informática e Computadores do Instituto Superior Técnico, no ano lectivo 2000/2001, como trabalho prático da disciplina de compiladores, leccionada pelo Professor Doutor Thibault Langlois. O enunciado do trabalho prático referido encontra-se no anexo 5.2.1. Todos os programas têm mais de 2.000 linhas de código e em média 1400 palavras-chave. A implementação dos compiladores foi feita usando código gerado e código escrito. O código gerado foi obtido com os geradores de analisadores léxicos lex e geradores de analisadores sintácticos yacc. Estes geradores geram programas em C, que executam, respectivamente, a análise léxica e sintáctica do compilador. No anexo 5.2.2. encontra-se impresso um exemplo dos programas “makefile” que geram o compilador. O “makefile” varia de projecto para projecto.
A tabela 5.2.1 resume as principais características dos dois grupos fundamentais da amostra.
Tabela 5.2.1 Descrição dos dois grupos fundamentais da amostra
Grupo Tipo Nº de Programas Nºde linhas de código Primeiro Compiladores 36 74982 Segundo Programas variados 118 19992
Na verificação da primeira hipótese, segundo a qual, a classe funcional dos compiladores escritos em linguagem C tem uma distribuição de frequências de palavras-chave, distinta da distribuição de frequências de palavras-chave característica de um conjunto significativo de outros programas escritos em linguagem C, calculamos a distribuição de frequências das palavras-chave para cada um dos dois grupos fundamentais e obtivemos resultados substancialmente diferentes.
A partir dos programas constituintes do grupo fundamental foi possível verificar a validade da segunda hipótese, segundo a qual, a classe funcional dos compiladores codificados em linguagem C obedece à lei de Zipf ajustada. Os resultados da verificação de ambas as hipóteses são apresentados na secção 5.4. Entretanto recorda-se que a principal objectivo desta dissertação recai sobre a pesquisa de regularidades na estrutura sintáctica e na estrutura funcional dos programas escritos em C. Assim sendo, é necessário incluir na amostra grupos de programas, os quais por construção careçam de estrutura. Estes grupos, cujos elementos serão gerados aleatoriamente, servirão de controlo à experimentação das hipóteses. Mais ainda, torna-se necessário distinguir ausência de estrutura sintáctica e ausência de estrutura funcional. Para tal, a amostra passa a incluir mais três grupos de programas além dos dois grupos fundamentais. Os novos grupos são designados Grupo A, Grupo B e Grupo C têm a seguinte constituição:
Grupo A: um conjunto de 36 programas gerados a partir dos programas do primeiro grupo fundamental, sendo cada um dos programas do grupo A o resultado da sequenciação aleatória das palavras-chave de cada um dos programas do primeiro grupo fundamental. Como consequência estes programas: não têm estrutura sintáctica (apresentam erros de compilação) e tão pouco têm estrutura funcional, ou seja, não desempenham qualquer função.
Grupo B: um conjunto de 36 programas gerados, com o mesmo numero de linhas e sem a mesma distribuição de palavras-chave encontradas nos programas do primeiro grupo fundamental e construídos de forma a garantir em cada um dos programas do grupo B:
a ausência de erros de sintaxe e o não desempenho de qualquer função
Como consequência estes programas têm estrutura sintáctica (não apresentam erros de compilação) mas não têm estrutura funcional, ou seja, não desempenham qualquer função. Grupo C: um conjunto de 36 programas gerados a partir do mesmo conjunto de palavras- chave encontradas nos programas do primeiro grupo fundamental e construídos de forma a garantir em cada um dos programas do grupo C:
a ausência de erros de sintaxe,
o não desempenho de qualquer função e
a mesma distribuição de frequências de palavras-chave do primeiro grupo fundamental, Como consequência estes programas têm estrutura sintáctica (não apresentam erros de compilação) e não têm estrutura funcional, ou seja, não desempenham qualquer função. Quanto à distribuição de frequências das palavras-chave, é aproximada com uma diferença de menos de 1%.
Na tabela 5.2.2. apresentamos os três novos grupos da amostra – os grupos de controlo - todos eles com 36 elementos, e as suas principais propriedades. O termo “preservação da sintaxe” indica a situação de correcção sintáctica e o termo “preservação da distribuição” indica que se manteve a distribuição de frequências de palavras-chave característica do grupo de compiladores.
Tabela 5.2.2. Descrição dos três grupos de controlo da amostra
Grupo Nº de linhas de código Preservação da Sintaxe Preservação da Distribuição A 74982 Não Sim B ~74000 Sim Não C ~74000 Sim Sim
5.3. Descrição dos programas utilizados na experimentação
Registamos uma breve descrição dos programas utilizados sobre os cinco grupos da amostra. Pretendemos facilitar a compreensão dos processos de cálculo utilizados e evitar a necessidade de interpretação dos programas que listamos no anexo 5.3.1.
Keywords - recebe um ficheiro de texto e retorna um ficheiro que contém a sequência das
palavras-chaves da linguagem C pela ordem encontrada no ficheiro inicial. Cada linha do ficheiro corresponde a uma palavra-chave.
Lcr - recebe um ficheiro de texto com uma sequência de palavras-chaves da linguagem C e
retorna o gráfico das flutuações em relação à distância usada para calcular as flutuações F(l) e os valores da correlação de gama longa correspondentes.
Ale - recebe um ficheiro de texto com uma sequência de palavras-chaves da linguagem C e
retorna, para uma sequência aleatória, criada com as mesmas palavras-chaves da sequência de entrada, o gráfico das flutuações em relação à distância usada para calcular as flutuações F(l) e os valores da correlação de gama longa correspondentes.
Entropia - recebe um ficheiro de texto com uma sequência de palavras-chaves da linguagem
C e retorna, os valores da entropia de Shannon da série e da sucessão das entropias locais calculadas sobre partições da série de duas a dez partes.