Karoshi MSX Community
06 de Julio de 2021, 12:17:05 am *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.

Ingresar con nombre de usuario, contraseña y duración de la sesión
Noticias:
 
   Inicio   Ayuda Buscar Ingresar Registrarse  
Páginas: 1 [2] 3
  Imprimir  
Autor Tema: Lenguage de Alto nivel  (Leído 16797 veces)
0 Usuarios y 1 Visitante están viendo este tema.
msxnake
Karoshi Fan
**
Mensajes: 86


Email
« Respuesta #15 : 28 de Abril de 2007, 10:47:09 am »

Aquí habrá un blog para que vayais viendo las evoluciones.

 http://pyasmsx.blogspot.com/
En línea
msxnake
Karoshi Fan
**
Mensajes: 86


Email
« Respuesta #16 : 09 de Mayo de 2007, 09:21:53 pm »

He llegado a las 500 lineas de código.

Viendo la complejidad de Python... creo que voy a hacer un Pseudo-Python-Msxero.
En línea
Sd-Snatcher
Karoshi Lover
***
Mensajes: 141


popolon@hotmail.com
Email
« Respuesta #17 : 10 de Mayo de 2007, 03:43:19 pm »

Aquí habrá un blog para que vayais viendo las evoluciones.

 http://pyasmsx.blogspot.com/

Muy interesante, quizas debiera ir yo haciendo lo mismo.
En línea
jltursan
Karoshi Forum's Guru
*******
Mensajes: 1516


¿Que es lo que has aprendido hoy?


WWW Email
« Respuesta #18 : 10 de Mayo de 2007, 08:08:18 pm »

Si que lo está; pena que mi nivel de Python no me permita seguir el hilo del desarrollo de msxnake...  Sad
En línea

Doom dee doom dee doom
msxnake
Karoshi Fan
**
Mensajes: 86


Email
« Respuesta #19 : 10 de Mayo de 2007, 09:49:53 pm »

 Bueno, Jltursan, comentarte que puedes contribuir despejando mis dudas en pseudocódigo.
 Ahora mismo tengo un dilema...

 el tema tiene que ver con la  recursividad:
 si yo creo una funcion, ejemplo:

 def sumar(a,b):
    codigo

 programa principal



 en principio mi compilador lo que realiza es una busqueda de todas las funciones definidas en el programa y guarda sus nombres. Pero se salta el paso de entrar en
cada función y traducir a assembler su contenido, lo veo totalmente ilogico, pues en el futuro pienso crear una biblioteca Msxera de gran tamaño, y claro no estaré compilando algo innecesario no?
 Pues tenemos:

 1ero - 1 trazado al programa para guardar nombres de funciones definidas  en todo el programa y librerias y variables utilizadas sólo en la zona global
 2o ---- 1 trazado que empieza a traducir todo lo que se encuentra el la zona global, o sea del ejemplo anterior lo que es el programa principal

si el programa ppal no llama a la funcion suma(a,b)... esta nunca se traducirá
por el contrario si se llama a suma... mi programa tiene que llamar otra vez a la función traducir para traducir el interior del bloque que contiene suma... si, a su vez:

def get_sumando(x):
   input(a)


def suma(a,b):
   get_sumando(a)
   get_sumando(b)
   return a+b


la función de suma llama a otra función de mi librería................ pues otra vez a llamar a la función de traducción de bloque,
y así hasta que se resuelve todo el embrollo...........pero tendré que utilizar un detector de recursividad porque si la funcion get_sumando(x) en su interior contubiera codigo que vuelve a llamar a la función suma(a,b) mi compilador entraría en un bucle indefinido y .......... cuelgue.

La verdad es que no se muy bien como deben funcionar los compiladores en este aspecto, si hay alguien que conozca el tema que me eche un cable.  Undecided
    l

En línea
jltursan
Karoshi Forum's Guru
*******
Mensajes: 1516


¿Que es lo que has aprendido hoy?


WWW Email
« Respuesta #20 : 10 de Mayo de 2007, 11:11:43 pm »

Caray Shocked

Bueno, comprendo que la situación que planteas es la lógica y bastante frecuente en intérpretes o compiladores; pero creo que no llega a darse el caso de que entres en un bucle infinito demasiadas veces. Si te entendido bien, la recursividad aparece cuando te encuentras con estas construcciones:

suma(suma(suma(a+b),c),d)

Entiendo que la forma más razonable de tratar esto es mediante niveles de pila en los que secuencialmente vas tratando los operandos de dentro a fuera (¿conoces la notación polaca inversa o el forth?), "simplificando" o resolviendo la expresión paso a paso. Las expresiones pueden ser todo lo complicadas que quieras; pero siempre limitadas por la memoria de la que dispongas, los bucles infinitos no deberían poderse dar o por lo menos no se como tal como lo veo (y si te he entendido bien Wink)
En general, lo que si te puedo comentar es que en funciones recursivas siempre tiene que existir una condición que indique que se abandona la recursión, en ese momento se retorna de todas las invocaciones, nivel a nivel. Un bucle infinito representa un error en la lógica de la función.

De todas formas el que conoce mejor los temas de intérpretes y compiladores es Sapphire, seguro que el tiene algo que opinar acerca de como se parsean (¿existe ya este término en el DRAE? Smiley) comunmente las expresiones en un lenguaje y de que posibles fenómenos pueden aparecer; creo que la recursividad es de los más comunes (incluyendo en el lenguaje humano).
« Última modificación: 10 de Mayo de 2007, 11:14:15 pm por jltursan » En línea

Doom dee doom dee doom
Sd-Snatcher
Karoshi Lover
***
Mensajes: 141


popolon@hotmail.com
Email
« Respuesta #21 : 11 de Mayo de 2007, 12:12:06 am »

He leido el post un poco por encima, ya que a estas horas o se esta lucido o se esta atontado.

Por como yo se como funciona un compilador que no un interprete (basic):

La funcion que se define o crea se define o crea una sola vez y se almacena en una parte de memoria, si quieres hacerlo puedes incluso tener el codigo ya compilado en una libreria.

 Luego en el cuerpo del programa no hay que compilar de nuevo ese codigo solo hacer como decia jl, poner en la pila los parametros y se llama a la direccion donde se ha colocado la funcion.

Diagamos que los pasos serian:

1- Ver que hay que compilar y que no.

2- Compilar todas las funciones necesarias.

3- Compilar el programa principal.

No genera ningun problema una recursividad.

Otra cosa seria hacerlo como lo hace Pascal, guarda los aprametros de manera fija en una zona de memoria, esto invalida por completo toda recursividad.
En línea
SapphiRe
Visitante
« Respuesta #22 : 11 de Mayo de 2007, 11:06:19 am »

Si te entendido bien, la recursividad aparece cuando te encuentras con estas construcciones:

suma(suma(suma(a+b),c),d)

Eso no es recursividad. La recursividad aparece cuando en el propio código de la función se hace una llamada explícita a la misma función (pero con unos argumentos que deben decrecer estrictamente en un preorden bien fundado inducido sobre el conjunto del tipo de los datos de entrada a la función... errr... que me salgo del tiesto).

Por ejemplo:

Código:
factorial(0) = 1
factorial(n) = n * factorial (n-1)

Por otro lado, es necesario que guardes, en las definiciones de funciones, todos los datos necesarios: número de parámetros y tipo de los mismos. ¿Qué tipos de datos estás considerando?

Un saludo
--
Sph.
En línea
msxnake
Karoshi Fan
**
Mensajes: 86


Email
« Respuesta #23 : 11 de Mayo de 2007, 01:07:27 pm »

Bueno, me refería a que si alguien malintencionadamente o por error teclea un programa de la forma:

def suma(a,b):
   return suma(a,b)

no tendría método para hallar el error de programación.

En cuanto a...

He leido el post un poco por encima, ya que a estas horas o se esta lucido o se esta atontado.

Por como yo se como funciona un compilador que no un interprete (basic):

La funcion que se define o crea se define o crea una sola vez y se almacena en una parte de memoria, si quieres hacerlo puedes incluso tener el codigo ya compilado en una libreria.

 Luego en el cuerpo del programa no hay que compilar de nuevo ese codigo solo hacer como decia jl, poner en la pila los parametros y se llama a la direccion donde se ha colocado la funcion.

Diagamos que los pasos serian:

1- Ver que hay que compilar y que no.

2- Compilar todas las funciones necesarias.

3- Compilar el programa principal.

No genera ningun problema una recursividad.

Otra cosa seria hacerlo como lo hace Pascal, guarda los aprametros de manera fija en una zona de memoria, esto invalida por completo toda recursividad.

Me parece bastante interesante. Pero ya se sale de mi filosofía de trabajo. Lo estudiaré.

Y tú Saphire que opinas de esto?
« Última modificación: 11 de Mayo de 2007, 01:09:20 pm por msxnake » En línea
Sd-Snatcher
Karoshi Lover
***
Mensajes: 141


popolon@hotmail.com
Email
« Respuesta #24 : 11 de Mayo de 2007, 01:31:55 pm »

Eso deberia detectartelo en la primera pasada, no puedes llamar a una funcion que aun no ha sido definida.

Error funcion desconocida.

En línea
SapphiRe
Visitante
« Respuesta #25 : 11 de Mayo de 2007, 01:43:34 pm »

Bueno, me refería a que si alguien malintencionadamente o por error teclea un programa de la forma:

def suma(a,b):
   return suma(a,b)

no tendría método para hallar el error de programación.

Es que eso no es un error de compilación. La función está bien definida, pero en tiempo de ejecución llenaría completamente la pila de retorno. Es como si tecleas en BASIC:

Citar
10 GOSUB 10

La funcion que se define o crea se define o crea una sola vez y se almacena en una parte de memoria, si quieres hacerlo puedes incluso tener el codigo ya compilado en una libreria.

Luego en el cuerpo del programa no hay que compilar de nuevo ese codigo solo hacer como decia jl, poner en la pila los parametros y se llama a la direccion donde se ha colocado la funcion.

Totalmente de acuerdo, así es como funcionan los compiladores.
En línea
jltursan
Karoshi Forum's Guru
*******
Mensajes: 1516


¿Que es lo que has aprendido hoy?


WWW Email
« Respuesta #26 : 11 de Mayo de 2007, 02:19:57 pm »

Citar
Es que eso no es un error de compilación. La función está bien definida, pero en tiempo de ejecución llenaría completamente la pila de retorno

Claro, tal como lo veo yo, no es un problema del compilador, si no que la solución se tiene que aportar dentro del código de suma (suponiendo que fuera una función recursiva). Como mucho el compilador podría avisar que se desbordará la pila si se usa así...no se, a ver que opinan los que entienden...
En línea

Doom dee doom dee doom
SapphiRe
Visitante
« Respuesta #27 : 11 de Mayo de 2007, 02:28:01 pm »

Como mucho el compilador podría avisar que se desbordará la pila si se usa así...no se, a ver que opinan los que entienden...

No pides tú na... pfufff... Para que un compilador pudiera decir eso, tendría que trabajar con asertos de lógica de primer orden que indicasen, en cada punto del código, las propiedades que se están cumpliendo. Después, debería operar con dichos asertos (para lo cual necesita pasar a una lógica superior, que ya sabemos que aunque correctas no son completas) para comprobar si hay un problema o no ante determinado código.

Vamos, si alguien lo consigue que me llame, que publicaríamos un artículo de investigación que revolucionaría el mundo.

Saludos
--
Sph.
En línea
jltursan
Karoshi Forum's Guru
*******
Mensajes: 1516


¿Que es lo que has aprendido hoy?


WWW Email
« Respuesta #28 : 11 de Mayo de 2007, 02:59:02 pm »

Hombreee; pero no que diera la información de forma certera sino que simplemente avisara a título informativo de que ahí existe riesgo. Cada vez que se invocara una función dentro de si misma; pues "warning" al canto, luego el programador ya decidiría si hay problema o no...
En línea

Doom dee doom dee doom
SapphiRe
Visitante
« Respuesta #29 : 11 de Mayo de 2007, 03:06:46 pm »

Hombreee; pero no que diera la información de forma certera sino que simplemente avisara a título informativo de que ahí existe riesgo. Cada vez que se invocara una función dentro de si misma; pues "warning" al canto, luego el programador ya decidiría si hay problema o no...

Bueno, eso sí se puede hacer, sería un "Warning! recursive function detected!"
En línea
Páginas: 1 [2] 3
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.21 | SMF © 2013, Simple Machines XHTML 1.0 válido! CSS válido!