Reutilizacion de Codigo Fuente Entre Lenguajes de Programacion
Reutilizacion de Codigo Fuente Entre Lenguajes de Programacion
Reutilizacion de Codigo Fuente Entre Lenguajes de Programacion
CÓDIGO FUENTE
ENTRE LENGUAJES DE
PROGRAMACIÓN
Dirigido por:
Paolo Rosso y Lidia Moreno
Friedrich Nietzsche
Resumen
IV
Agradecimientos
VI
Índice general
1. Introducción 1
1.1. Descripción del problema, motivación y objetivos . . 1
1.2. Estructura de la tesis . . . . . . . . . . . . . . . . . . 6
3. Modelos propuestos 25
3.1. Modelo a nivel de documento . . . . . . . . . . . . . 25
3.1.1. Preproceso . . . . . . . . . . . . . . . . . . . . 27
3.1.2. Estimación de similitud . . . . . . . . . . . . 29
3.2. Modelo a nivel de fragmento . . . . . . . . . . . . . . 30
3.2.1. Preproceso . . . . . . . . . . . . . . . . . . . . 31
3.2.2. Estimación de la similitud . . . . . . . . . . . 33
VIII
4.3.1. Ajustes en la aproximación a nivel de documento 41
4.3.2. Estimación de los parámetros del modelo a
nivel de fragmento . . . . . . . . . . . . . . . 47
4.3.3. Reutilización monolingüe sobre corpus CL-AT++ 51
4.3.4. Reutilización translingüe sobre corpus CL-AT++ 52
Bibliografı́a 67
X
Índice de tablas
XII
Capı́tulo 1
Introducción
1
de una obra de arte, o de lingüı́stica forense analizando notas de
suicidio sospechosas o mensajes de texto anónimos, o bien identificar
el autor de un programa malicioso. En esta lı́nea de investigación
se encuentran trabajos como el de Stein et al. [33], Stamatatos et
al. [32], Peng et al. [23] o Georgia Frantzeskou et al. [16].
do por la Universidad de Bayreuth tras las pruebas de plagio detectadas en su tesis doc-
toral: http://www.elpais.com/articulo/internacional/Dimite/ministro/Defensa/aleman/
plagiar/tesis/doctoral/elpepuint/20110301elpepuint_6/Tes
2 http://www.churnalism.com
Un caso particular se produce cuando estas obras publicadas con-
sisten en códigos fuente. En la actualidad, un amplio colectivo de
programadores pone a disposición pública códigos fuente bajo licen-
cias que protegen la propiedad de sus creaciones3 . Esta situación
propicia la reutilización de una parte o de la totalidad de cualquier
código fuente disponible en la red.
el material plagiado.
5 https://www.ipd.uni-karlsruhe.de/jplag/
de código abierto o con autorización de su desarrollador. En nume-
rosas ocasiones, empresas y organismos se ven envueltos en litigios
y acuerdos millonarios debido a la reutilización de código fuente no
autorizado como en el acuerdo firmado entre Microsoft y Novell,
donde esta última le pagaba 40 millones de dólares a Microsoft a
cambio de no demandar a los clientes de Novell que utilizan los
sistemas operativos Linux que parten de tecnologı́a patentada pro-
piedad de Microsoft6 . La posible demanda se basa en que Microsoft
asegura que son propietarios de las patentes en la que se basa parte
de la tecnologı́a que utilizan los sistemas operativos Linux. Tam-
bién Microsoft, que ya demandó a Motorola por sus teléfonos con
el sistema Android, ha presentado recientemente una denuncia por
violación de patente contra la librerı́a Barnes & Noble por su dispo-
sitivo electrónico de lectura NooK, ampliando el ataque legal contra
aparatos que cuentan con el sistema operativo Android de Google7 .
spitting-match-over-40m-ip-payoff/3988
7 http://www.microsoft.com/presspass/press/2011/mar11/03-21corpnewspr.mspx
Concluyendo, éstas son algunas de las razones del creciente in-
terés en el desarrollo de mecanismos dirigidos hacia la detección de
códigos similares y la posible reutilización de los mismos; incluso,
detectando casos en los que el plagio ha consistido en la traducción
de código fuente de un lenguaje de programación a otro distinto.
Sobre estos temas de reutilización de código fuente entre códigos
correspondientes a un mismo lenguaje de programación o distinto,
es decir, monolingüe o translingüe, se verán más detalles respectiva-
mente en los apartados 2.2 y 2.3.
9
mente ligada a otros campos de PLN como puede ser la atribución
de autorı́a [18, 33], siendo su diferencia en el propósito, uno intenta
encontrar partes escritas por otro autor, y el otro intenta identificar
a que autor pertenece un texto.
|A ∩ B|
J(A, B) = (2.1)
|A ∪ B|
En el mejor de los casos cuando el conjunto A es igual al conjunto
B, la intersección y la unión tienen el mismo valor y la división de
ambos tiene valor 1. En el peor de los casos la intersección devuelve
el valor nulo y la división vale 0, por lo que se tiene una medida de
similitud acotada en el rango 0-1. Otra de las medidas más utilizadas
es la de la similitud del coseno, que consiste en calcular el ángulo que
forman dos conjuntos de muestras dentro de un espacio vectorial.
La explicación de esta fórmula se encuentra más detallada en la
subsección 3.1.2 por haber sido utilizada en los experimentos de
este trabajo de investigación.
X A(x)
KL(A||B) = (A(x) − B(x)) log (2.2)
x∈X
B(x)
Whale [36] hizo un estudio sobre las técnicas más empleadas por
los estudiantes para dificultar el proceso de detección por parte del
profesor. Algunos de los cambios más frecuentes realizados por los
estudiantes son: cambios en comentarios, cambios de identificadores,
cambios de orden de operandos, cambio de tipos de datos, reem-
plazar expresiones por equivalentes, añadir sentencias redundantes,
cambios de sentencias independientes del orden de ejecución, etc.
X
idft · αt,d · βt,dq
t∈dq
Modelos propuestos
25
la detección de reutilización en el marco de este trabajo de investi-
gación basado en modelos aplicados a textos.
Nivel 6
Nivel 5
Nivel 4
Nivel 3
Nivel 2
Nivel 1
Nivel 0
Sin
cambios
Comentarios
Identificadores
Posición de variables
Combinación de funciones
Instrucciones del programa
Cambios de expresiones
A partir de este nivel, los cambios van a ser más complejos y van
a afectar a la forma de ejecutarse del código fuente internamente
aunque las modificaciones son realizadas sin intención de cambiar el
resultado final, sólo la apariencia del código fuente. La división en
funciones más pequeñas y combinación de funciones forman parte
del nivel 4 propuesto por Faidhi y Robinson. En el nivel 5 se incluye
el cambio de las instrucciones de un código fuente, por ejemplo cam-
biar la instrucción while por una que puede realizar la misma tarea
como la instrucción for. Finalmente, en el último nivel se incluye
cambiar partes de la estructura del código fuente, como por ejemplo
reorganizar secciones de código que no tengan dependencia y no sea
necesario ejecutarlas en un cierto orden.
3.1.1. Preproceso
Pn
A·B i=1 Ai × Bi
cos(θ) = = pPn pPn (3.2)
kAk kBk i=1 (A i )2×
i=1 (Bi )
2
35
tres lenguajes de programación y un segundo recurso que contiene
códigos fuente monolingüe y multilingüe facilitado por los autores
Arwin y Tahaghoghi.
en el resto de lenguajes.
Converter_Details.html
que se considerarán como reutilización para poder evaluar nuestras
aproximaciones.
4.3. Experimentos
Experimentos/n-gramas 1 2 3 4 5
full code 2,89 ± 1,10 1,00 ± 0,00 1,00 ± 0,00 1,00 ± 0,00 1,00 ± 0,00
fc-without comments 2,89 ± 1,10 1,00 ± 0,00 1,00 ± 0,00 1,00 ± 0,00 1,00 ± 0,00
only comments 3,43 ± 1,17 2,29 ± 1,57 2,29 ± 1,57 2,57 ± 1,49 2,71 ± 1,48
fc-only reserved words 2,56 ± 1,16 1,33 ± 0,66 1,56 ± 0,83 1,67 ± 0,82 1,67 ± 0,82
fc-without rw 2,67 ± 1,05 1,78 ± 1,22 1,44 ± 0,83 1,44 ± 0,83 1,56 ± 1,06
fc-wc-wrw 2,67 ± 1,05 1,89 ± 1,28 1,44 ± 0,83 1,44 ± 0,83 1,44 ± 0,83
Tabla 4.2: Resultados obtenidos comparando los documentos del corpus SPA-
DE escritos en C++ y en Java a nivel de documento, dónde cada documento
es pesado utilizando tf. La tabla refleja la media y desviación tı́pica de las posi-
ciones de los documentos considerados reutilizados respecto del documento que
está siendo analizado.
Experimentos/n-gramas 1 2 3 4 5
full code 2,78 ± 1,31 1,67 ± 1,33 1,44 ± 0,83 1,78 ± 1,13 1,78 ± 1,13
fc-without comments 2,67 ± 1,33 1,67 ± 1,33 1,44 ± 0,83 1,78 ± 1,34 1,78 ± 1,34
only comments 3,17 ± 1,06 1,50 ± 1,11 2,83 ± 1,34 2,50 ± 1,25 3,17 ± 1,21
fc-only reserved words 2,33 ± 1,24 2,22 ± 1,13 1,78 ± 1,02 1,67 ± 1,05 2,00 ± 0,94
fc-without rw 3,11 ± 1,19 2,11 ± 1,44 1,78 ± 1,13 1,67 ± 1,05 1,67 ± 1,05
fc-wc-wrw 2,89 ± 0,69 2,11 ± 1,44 1,67 ± 0,94 1,78 ± 1,06 1,89 ± 1,37
Tabla 4.3: Resultados obtenidos comparando los documentos del corpus SPADE
escritos en Python y en C++ a nivel de documento, dónde cada documento
es pesado utilizando tf. La tabla refleja la media y desviación tı́pica de las
posiciones de los documentos considerados reutilizados respecto del documento
que está siendo analizado.
Experimentos/n-gramas 1 2 3 4 5
full code 2,62 ± 1,10 1,75 ± 0,96 1,62 ± 1,10 1,62 ± 1,10 1,62 ± 1,10
fc-without comments 2,62 ± 1,10 1,75 ± 0,96 1,62 ± 1,10 1,62 ± 1,10 1,62 ± 1,10
only comments 2,33 ± 1,56 2,33 ± 1,56 3,00 ± 0,67 2,33 ± 1,56 3,33 ± 0,89
fc-only reserved words 2,50 ± 0,86 1,88 ± 1,05 1,75 ± 0,83 1,75 ± 1,09 1,75 ± 1,09
fc-without rw 2,50 ± 1,00 1,62 ± 1,10 2,00 ± 1,32 1,88 ± 1,16 1,75 ± 1,09
fc-wc-wrw 2,50 ± 1,50 1,67 ± 1,78 1,44 ± 0,69 1,78 ± 1,28 1,78 ± 1,28
Tabla 4.4: Resultados obtenidos comparando los documentos del corpus SPADE
escritos en Python y en Java a nivel de documento, dónde cada documento
es pesado utilizando tf. La tabla refleja la media y desviación tı́pica de las
posiciones de los documentos considerados reutilizados respecto del documento
que está siendo analizado.
Experimentos/n-gramas 1 2 3 4 5
full code 2,56 ± 0,69 1,00 ± 0,00 1,00 ± 0,00 1,00 ± 0,00 1,00 ± 0,00
fc-without comments 2,56 ± 0,69 1,00 ± 0,00 1,00 ± 0,00 1,00 ± 0,00 1,00 ± 0,00
only comments 2,43 ± 0,82 2,29 ± 1,92 2,14 ± 2,41 2,43 ± 2,24 2,57 ± 2,24
fc-only reserved words 2,56 ± 0,69 1,56 ± 0,47 1,56 ± 0,25 1,22 ± 0,17 1,44 ± 0,47
fc-without rw 2,56 ± 0,69 2,11 ± 2,54 2,89 ± 1,88 3,11 ± 2,32 1,89 ± 0,99
fc-wc-wrw 2,56 ± 0,69 2,11 ± 2,54 2,11 ± 2,54 2,11 ± 2,54 2,11 ± 2,54
Tabla 4.5: Resultados obtenidos comparando los documentos del corpus SPADE
escritos en C++ y en Java a nivel de documento, dónde cada documento es
pesado utilizando tf-idf. La tabla refleja la media y desviación tı́pica de las
posiciones de los documentos considerados reutilizados respecto del documento
que está siendo analizado.
Tabla 4.6: Resultados obtenidos comparando los documentos del corpus SPADE
escritos en Python y en C++ a nivel de documento, dónde cada documento es
pesado utilizando tf-idf. La tabla refleja la media y desviación tı́pica de las
posiciones de los documentos considerados reutilizados respecto del documento
que está siendo analizado.
Experimentos/n-gramas 1 2 3 4 5
full code 2,50 ± 1,50 1,62 ± 0,98 1,62 ± 1,23 1,62 ± 1,23 1,50 ± 0,75
fc-without comments 2,62 ± 1,23 1,62 ± 0,98 1,62 ± 1,23 1,62 ± 1,23 1,50 ± 0,75
only comments 2,00 ± 2,00 2,33 ± 1,56 3,00 ± 0,67 2,33 ± 1,56 4,00 ± 0,00
fc-only reserved words 2,50 ± 1,50 2,62 ± 0,98 2,62 ± 0,98 2,88 ± 1,11 2,88 ± 1,11
fc-without rw 2,50 ± 1,50 2,00 ± 1,50 2,50 ± 1,25 1,75 ± 0,19 3,50 ± 0,75
fc-wc-wrw 2,50 ± 1,50 2,00 ± 1,50 2,50 ± 1,25 1,75 ± 0,19 4,00 ± 0,00
Tabla 4.7: Resultados obtenidos comparando los documentos del corpus SPADE
escritos en Python y en Java a nivel de documento, dónde cada documento es
pesado utilizando tf-idf. La tabla refleja la media y desviación tı́pica de las
posiciones de los documentos considerados reutilizados respecto del documento
que está siendo analizado.
Tabla 4.8: Resultados obtenidos con trigramas de caracteres. Cada valor re-
presenta la media y la desviación tı́pica de la posición del código fuente en el
raking.
desplazamiento de la ventana: d={10, 20, 30, 40, 50, 60, 70, 80,
90, 100, 150, 200, 250, 300}
umbral: t={0, 1, 0, 2, . . . , 0, 9}
Pares de lenguajes Tam. vent. (s) Despl. (d) Umbr.(t) Pos. med.
C++−Java 50 50 0,8 1,000 ± 0,00
Python→C++ 50 50 0,1 1,375 ± 0,69
Python→Java 30 30 0,2 1,444 ± 0,71
En la figura 4.5 se muestra como los tres sistemas, tanto los dos
translingüe de este trabajo de investigación como JPlag con un pro-
blema monolingüe mantienen la precisión con valor 1 para valores
de recall similares, por debajo de 0, 1. Tanto el modelo a nivel de
fragmento como el modelo a nivel de documento han visto reduci-
das sus prestaciones al trabajar en un contexto más complejo como
es el translingüe. Como ocurrı́a con el corpus SPADE, las presta-
ciones del modelo a nivel de fragmento en el contexto translingüe
también son ligeramente mejores que las del modelo a nivel de do-
cumento. Además, las dos aproximaciones de este trabajo de inves-
tigación demuestran tener prestaciones similares o superiores al de
la herramienta JPlag, incluso trabajando en un contexto con más
complejidad que este último.
Capı́tulo 5
Conclusiones y Trabajos
Futuros
5.1. Conclusiones
La detección automática de reutilización de código fuente en un
contexto translingüe es un campo muy poco explorado, sólo se ha
encontrado un trabajo de investigación que aborde el problema en
código fuente a nivel translingüe [1]. Su complejidad aumenta al no
disponer de suficientes recursos ni herramientas con los que contras-
tar los resultados obtenidos1 .
55
Con la aproximación a nivel de documento, los mejores resultados
se han obtenido utilizando el código fuente entero, o bien el código
sin los comentarios. Analizando el corpus, se ha observado que la
existencia de comentarios es muy baja y en su mayorı́a el progra-
mador que ha reutilizado código ha desestimado los comentarios, o
bien los ha reescrito. Como la cantidad de comentarios en un códi-
go fuente es una cantidad reducida del código fuente, un alumno
no insertará comentarios si pretende evadir la detección automáti-
ca de código fuente reutilizado. El código fuente que implemente
un alumno se pretende que sea un código usable y entendible pa-
ra el profesor, por lo que se considera muy poco probable el caso
de introducir ruido a través de comentarios. Por otra parte, incluir
un preprocesado a las aproximaciones para eliminar los comentarios
supondrı́a tener un sistema dependiente del los lenguaje de pro-
gramación. Por estas razones, se considera que la mejor opción es
utilizar el código fuente entero.
2 http://swerc.eu/ o http://code.google.com/codejam/
3 http://rosettacode.org/wiki/Rosetta_Code
5.2.3. Explorar nuevas técnicas
Este trabajo de investigación se considera un primer acercamiento
a la detección de reutilización translingüe en código fuente utilizan-
do técnicas de PLN. Como primer paso, se ha utilizado el sistema
basado en n-gramas debido a que es el menos restrictivo de los uti-
lizados en otros trabajos dado que no requiere de ningún tipo de
corpus inicial con el que entrenar.
5 http://memex2.dsic.upv.es:8080/DeSoCoRe/
Bibliografı́a
63
ceedings of 2nd Workshop on Uncovering Plagiarism, Authors-
hip, and Social Software Misuse, PAN-2008, pages 9–13, Patras,
Greece, 2008.
Publicaciones y desarrollo
de la herramienta
DeSoCoRe
69
Desarrollo de un prototipo de la plataforma de detección de
reutilización de código fuente llamado DeSoCoRe (nombre del
inglés Detecting Source Code Re-use). Este prototipo compa-
ra dos códigos fuente a nivel de fragmento. Los resultados se
muestran gráficamente indicando las partes similares entre dos
códigos fuente estando escritos en el mismo o distinto lenguaje
de programación.