Habi Hablóg
Declaro:
XML válidoXHTML válido800x600 +
RSS válidoCSS válidoNavegador digno
  Blog   Archivo   Contacto   Administración  

Acerca de

Matemático, informático, aficionado a la electrónica, friki... y otras cosas que no vienen a cuento ni pasan los filtros de palabras.

¿Queríais un blog? Ahí va.

Red antisocial

¡Me van a volver loca! 2.0
La Fragata Portuguesa

Z
¡Me van a volver loca!

Últimos posts

Crackeo preservativo
Restaurando ROMs
Una cosa lleva a la otra
Desbloqueando logros
Teclado en el PCW

Últimos comentarios

genocho
Victor Cortes Abad
Habi
Enrique
Dandare

Calendario

No hay fechas.

Categorías

Chorradas
Paranoias
Posts lúcidos
Tecnoesoterismo
Yuyus

Cenas de Abj

Abj debe 7 cenas.

Frase célebre

Abjurador dice: Huelo a hombre

Peñazo post

Habi - 17/10/2006 12:34:00 - Tecnoesoterismo

¡Atención! Este post contiene material de teoría de compiladores explícito. Si no se considera preparado, no lo lea (o sí, y suelte algunas de estas frases en sus reuniones de amigos y quede como un... friki).

Hoy voy a hablar del lenguaje ese que inventé y el cual tengo a medio implementar.

Lo primero que tengo que decir es que el código está organizado lógicamente en espacios de nombres anidados. El código fuente viene en archivos, los cuales no tienen necesariamente una correspondencia con esos espacios de nombres. Cada módulo puede tener varios (obligatoriamente debe contener al menos uno), y un mismo módulo puede estar definido en varios archivos (basta con usar el mismo nombre del espacio de nombres, el contenido se mezcla).

El compilador incluye también un intérprete pues, bajo ciertas condiciones, una función puede ser marcada para ser ejecutada en tiempo de compilación, y de esa manera generar código para ser compilado utilizando la potencia expresiva del propio lenguaje, y haciendo obsoleto el concepto de procesador de macros.

Cualquier convención de llamada de funciones, uso de registros, inclusión inline, y en general directivas de compilación no se pondrán como pragmas de preprocesadores, casos especiales de comentarios o palabras reservadas del lenguaje. Sencillamente serán etiquetas con valores dentro del propio código, como si las propias funciones fueran objetos en un lenguaje de objetos sin herencia.

El lenguaje es en sí mismo imperativo, pero con notación funcional y considerando como funciones todos los elementos sintácticos (lo cual es MUY útil en el caso de los IF para el tema de asignaciones). Permite anidar funciones, y tiene orientación a objetos con herencia simple e interfaces (ortogonales entre sí, claro). El nivel semántico queda definido por el sangrado (libre) del código, así no se necesitan delimitadores sintácticos a la { } o palabras reservadas del tipo Begin - End.

Tiene un sistema de tipos estricto y fuerte, con

La sintaxis a nivel externo es muy simple y matemática:

NameSpace Fulanito

Suma: Integer * Integer -> Integer
Suma(x, y)=
    Resultado: Integer
    Resultado = x + y
    Return Resultado

Por ejemplo; para desambiguar una variable que contenga una función de una declaración de función, hacemos un tipo único agrupado: (Integer * Integer -> Integer) en vez de la declaración de Suma. De igual manera, (Integer * Integer) -> Integer nos define una función que sólo tiene un parámetro, una tupla de dos valores enteros.

La compilación se hace en dos pasadas, pues se pueden usar variables y funciones definidas fuera de orden; el compilador mantiene todo en su base de datos de memoria, eliminando la necesidad de código objeto. Las librerías estáticas se enlazan en su forma de código intermedio, para así poder aplicar optimizaciones avanzadas al programa en conjunto (y de nuevo, no requerir código objeto propiamente dicho, sino una base de datos de espacios de nombres nativa al compilador).

De acuerdo, esto usa bastante memoria y enlentece el compilado, pero genera aplicaciones mucho más eficientes.

Finalmente, después de hacer las optimizaciones buenas, se traduce a la plataforma y se hacen las típicas optimizaciones de registros y mirilla típicas de la plataforma y a correr.

Si alguien ha entendido algo, ¿algún comentario?


Z de Zángana - 17/10/2006 12:54:30

Yo, yo! Yo comento. 
Hasta ahora bien, lo entiendo todo. Me he leído el primer y el último párrafo enteros, y no he perdido el hilo. 
 
Un día que me anime leeré el resto. 
 
Amables saludos, 
Z. 



L de LimónEDP - 18/10/2006 16:06:00

¡Yo también comento! Nunca es tarde si la picha es... no... ¿cómo era? 
 
Yo, que soy usuario por excelencia y me pongo pinocho con Matlab, digo: 
 
Si la sintaxis para una función que suma dos números es la que describes, Dios mío, no quiero pensar cómo puede ser programar un Newton-Raphson. 
 
En lugar de: 
 
NameSpace Fulanito 
Suma: Integer * Integer -> Integer 
Suma(x, y)= 
Resultado: Integer 
Resultado = x + y 
Return Resultado 
 
¿No se podría hacer: 
 
Suma(x,y) = x + y 
 
? A mí me gusta más.



H - 18/10/2006 17:24:19

Vayamos por partes, como Jack el Destripador. 
 
"NameSpace" es para el espacio de nombres, nada que ver con la función. 
 
Uso "Resultado" para que se vea como se declaran variables, de la misma forma que los prototipos de las funciones. 
 
Ciertamente, se puede hacer: 
 
Suma: Integer * Integer -> Integer  
Suma(x, y)= x + y 
 
No olvides que todas las funciones deben tener su prototipo, es un lenguaje de tipado fuerte; sencillamente aquí decido separarlas por notación, no porque haga falta ya que no hay cabeceras o compilaciones a código objeto para linkar; ambas cosas son algo que no hacen normalmente los lenguajes, lo cual es curioso, porque es más engorroso; hay que definir una sección de interfaz y otra de implementación, o archivos .h para include en el caso del C, porque NO tiene soporte para compilación separada, sino que delega en el linkador y el preprocesador, con los riesgos de seguridad e integridad que ello conlleva. 
 
También aprovecho para decir que no hay terminadores de sentencia (; del C) o separadores de las mismas (; del Pascal) porque van implícitos por las lineas.




Post cerrado