¿Como programar un depurador avanzado?

Iniciado por Yuki, 22 Mayo 2017, 18:18 PM

0 Miembros y 2 Visitantes están viendo este tema.

Yuki

Buenas, hace un tiempo termine de desarrollar un lenguaje de programación orientado a objetos en español, debido a esto me encontré en la necesidad de escribir un depurador para que los programadores puedan detectar errores en su código de manera mas fácil.

El dilema es que no se como escribirlo de tal manera que se visualice la línea de código que se esta ejecutando en el momento ¿alguien tiene alguna referencia de como hacer este trabajo?

Serapis

Si declaraste tu lenguaje en un formato BNF, (o EBNF), no debería serte complicado chequear la semántica ni la sintaxis.

de hecho, eso te servirá luego para poderlo compilar, pués esa fase será necesaria (suponiendo que el lenguaje sea compilable e/(o no sólo) interpretado).

engel lex

agrego...

recuerda que para debug tienes un tipo de compilación especial, allí puedes agregar información extra que permita a tu programa relacionar entre el compilado y el texto
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Yuki

Cita de: NEBIRE en 22 Mayo 2017, 18:49 PM
Si declaraste tu lenguaje en un formato BNF, (o EBNF), no debería serte complicado chequear la semántica ni la sintaxis.

de hecho, eso te servirá luego para poderlo compilar, pués esa fase será necesaria (suponiendo que el lenguaje sea compilable e/(o no sólo) interpretado).

Es la primera vez que escucho sobre esa notación y no creo que sea el caso  :-\

Cita de: engel lex en 22 Mayo 2017, 18:50 PM
agrego...

recuerda que para debug tienes un tipo de compilación especial, allí puedes agregar información extra que permita a tu programa relacionar entre el compilado y el texto

Debido a que es un lenguaje compilado, tengo entendido que debo insertar interrupciones (int3), pero mas haya de eso no se que hacer.

Poyoncio

¿sabes como funciona un debugger a nivel interno? Deberias empezar por comprender como estan programados, y luego puedes adaptarlo a tu lenguaje

por cierto, buen trabajo por ese lenguaje, hace tiempo que le sigo la pista, sigue asi!
Curso de ensamblador desde cero

Serapis

#5
La notación "Backus Naur Form", es un metalenguaje que se utiliza para describir lenguajes, de ahí es tremendamente fácil verificar errores.

Si tienes descrito, por ejemplo:
<numero> = <numero> <digito>
<digito> = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
entonces resulta tremendamente fácil verificar que FF, no es un número y sí 135. Pero si describes:


<separador> = [[<separador>]] <espacio> | <tabulador>
<espacio> = " "
<tabulador> = "    "
<numero> =  <separador> (<numerodecimal>| "h" <numerohexadecimal>)
<numerodecimal> = [[<digitodecimal>]] | <numerodecimal> <digitodecimal>
<numerohexadecimal> = [[<digitohexadecimal>]] | <numerohexadecimal> <digitohexadecimal>
<digitodecimal> = <digito>
<digitohexadecimal> = <digito> | <digitohex>
<digito>   = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
<digitohex> = "A" | "B" | "C" | "D" | "E" | "F" | "a" | "b" | "c" | "d" | "e" | "f"

Es fácil ver si un número cumple las normas y si en ese caso es decimal o hexadecimal, etc... por ejemplo: 135, hFF, y por ejemplo es fácil ver que hFFJ no es un número ni decimal ni hexadecimal, así como tampoco 134p0, pero no hemos definido un número decimal, por ejemplo 234'456.

Como se puede ver, ahí está definido que es un número, y se puede ver que acepta números decimales y hexadecimales y es relativamente fácil verificar.
Básicamente hay que escribir una función por cada definición, que chequea sus partes llamando a su vez a cada una de las funciones de las partes de que se compone... (hasta llegar a la básica que son letras, digitos, etc... cuando una funciópn devuelva false, se señala el punto donde está operando y se marca el error (cada función conoce por la expesión que trata, en qué consiste el error).

Igualmente es relativamente fácil describir, operadores, operaciones, funciones, propiedades, clases, etc...


Cuando se cambia de línea se verifica la que se acaba de editar. Además se puede (si es correcto) al final si se detecta una construcción especial, autocompletar partes de esa construcción, o sugerir opciones... al tiempo que si es incorrecto, señalar que falla.

Si nunca has oído hablar de ello, será por que nunca has estudiado teoría de compiladores.

p.d.: Un poco más completo, para ver mejor la potencia del sistema BNF. Tú mismo puedes describir las reglas de tu propio BNF, que eso lo hace además insuperable.

Yuki

Cita de: Poyoncio en 22 Mayo 2017, 20:20 PM
¿sabes como funciona un debugger a nivel interno? Deberias empezar por comprender como estan programados, y luego puedes adaptarlo a tu lenguaje

por cierto, buen trabajo por ese lenguaje, hace tiempo que le sigo la pista, sigue asi!


Si, he estudiado sobre depuradores y se como escribirlos, su estructura es muy simple, el problema que tengo es al momento de querer sincronizar los ejecutables depurados con código en texto plano.
Cita de: NEBIRE en 22 Mayo 2017, 22:24 PM
La notación "Backus Naur Form", es un metalenguaje que se utiliza para describir lenguajes, de ahí es tremendamente fácil verificar errores.

Si nunca has oído hablar de ello, será por que nunca has estudiado teoría de compiladores.

Pues mi experiencia con compiladores se basa en prueba y error. :P
Aunque tu explicación me recuerda a mi análisis previo antes de escribir el analizador sintáctico :laugh:

MCKSys Argentina

No sé mucho de compiladores, pero vas a tener un trabajo muy grande para hacer un debugger en el mismo IDE (si pensamos en algo como Visual Studio o similar).

Calculo que vas a tener que crear una VM en el IDE que entienda y ejecute un lenguaje intermedio generado a partir de las instrucciones. Incluso estaría muy cercano al analizador sintáctico, con la diferencia que debería ejecutar el código; por lo que debería tener su stack, registros, etc.

No creo que el código compilado te sea de utilidad ya que ahí pierdes todas las referencias al source.

En fin, es lo que se me ocurre con mi escaso conocimiento en el tema.

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


Serapis

#8
Créeme, no te compliques con tonterías, escribirás código infinito y siempre habrá errores imperceptibles y será muy lento, largo y complejo. cualquier cambio te dará una pereza enorme.

Describe tu lenguaje en notación BNF, luego te será tremendamente sencillo tratar semántica y sintaxis, incluso el mismo lenguaje ampliado te vale hasta para colorear (si asocias colores a cada identidad individual).

Lo mejor del BNF, es que puedes adaptarlo a tus necesidades e incluso sirve como ayuda para los usuarios al mostrar el BNF de tu lenguaje, pués sirve para saber qué se puede y qué no se puede hacer en él...

He editado mi mensaje anterior, para extenderme un poco y con más explicaciones...

Te adjunto, un ejemplo de como se describió, por ejemplo el lenguaje Algol 60, menos potente que el Algol 68, pero te sirve de ejemplo:
https://web.archive.org/web/20060925132043/https://www.lrz-muenchen.de/~bernhard/Algol-BNF.html




-----------------------------
----------------------------
Mensaje ORIGINALMENTE publicado en: Fecha del día 23 de mayo (por la tarde, hora de España) -------------
Me he molestado en buscar la especificación del EBNF (Extended-BNF), es más legible, cuando se describe en EBNF, que en BNF y las descripciones son más breves. Otra ventaja es que el analizador léxico, queda mucho más aproximado con EBNF.
El enlace de descarga (dentro del zip está el pdf):
http://standards.iso.org/ittf/PubliclyAvailableStandards/s026153_ISO_IEC_14977_1996(E).zip

Dado que (BNF) es tremendamente sencillo usarlo (bastan unas pocas horas para entenderlo bien), luego puedes ampliarlo y adaptarlo a tus necesidades.

MOD: Ya deberías saber que debes hacer doble post.

--------------------------------------------------------

Mensaje para el MOD: Por doble post, yo entiendo duplicar el mismo contenido de un mensaje en otra parte del foro (ya sería feo, hacerlo en el mismo sitio). Publicar un mensaje un día y otro mensaje otro día (aunque no haya un mensaje de nadie por medio, en le mismo hilo, JAMAS podré entenderlo como hacer doble post... la razón es muy simple: EDITAR un mensaje, no avisa a los interesados del cambio, publicar un nuevo mensaje posiblemente se vea, en cualquier caso son publicaciones distintas.
Por otro lado, determinados foros, reúnen en un mismo mensaje dos mensajes publicados por la misma persona en el mismo hilo, si no ha pasado cierta cantidad de tiempo, al momento de enviar.

Yo acostumbro a escribir mi mensaje y salvo que ponga código y crea conveniente repasarlo para corregir algún posible error, salto a otro lado, sin llegar a ver si hizo una u otra cosa. Los automatismos del foro, no me competen, creo que hay cierta capacidad de control desde el panel de administración del foro... y supongo que estará en las opciones que dueño del foro, le haya parecido más aceptable.