[PROYECTO] XMachine - Cross C

Índice
1.0 - Introducción
2.0 - XMachine, concepto
3.0 - Cross C
4.0 - Cross ASM - Objetos de compilación
5.0 - Registros, flags y stack
6.0 - Descarga

1.0 - Introducción
Para empezar ya tengo asumido que este post no tendrá una gran repercusión, pues entiendo que a muchos no os interesará el tema.
También quiero comentar que sois libres de postear dudas o cuestiones de programación en este mismo hilo, y muy a gusto las voy a responder.

2.0 - XMachine, concepto
A lo que iba. El nombre en clave del proyecto que estoy creando es "XMachine". Consiste en una máquina virtual capaz de emular código en multiples plataformas (windows, linux, etc.). Para que os hagáis una idea viene siendo algo parecido a JAVA.

3.0 - Cross C
Para ello estoy creando un nuevo lenguaje de programación, el cual me gustaría llamar "Cross C". Seguramente os estaréis preguntando cual es la necesidad de crear un nuevo lenguaje. Bien, mi intención es crear un lenguaje que sea tan potente como C (o C++) pero que tenga la sencillez de otros lenguajes como Basic. Como podremos ver en un pequeño trozo de código que pondré a continuación, la sintaxis es muy parecida a la de C. Ahora bien, se ha simplificado la declaración de textos, no siendo necesario el uso de arrays (como en Basic) pero se ha mantenido los data types (como en C). Las declaraciones de funciones y demás siguen una estructura parecida a la de C, pero sin el uso de llaves para abrir y cerrar "{".
Veamos un ejemplo:
void test(string a)
   print(a)
   return 8;
endfunc

int main()
   string str = "Esto es una cadena de texto"
   int var_ret = test(str)
endfunc

Por el momento estas son las características funcionales (es decir, programadas).

4.0 - Cross ASM, Objetos de compilación
Los archivos de código "Cross C" se convierten en archivos objeto, los cuales están programados en ASM (prácticamente, tiene diferencias que lo hacen más sencillo). Estos pueden ser usados para compilar el ejecutable final, que se puede emular desde la XMachine.
Cabe destacar que cada XMachine compila los ejecutables de forma diferente, cifrandolos mediante parametros únicos de cada ordenador.
Si se desea ejecutar un ejecutable en otro ordenador con XMachine se puede dar permiso mediante un sistema de usuarios (aun no implementado).

El anterior código en Cross C compila en:
.data_segment:
db 0001
db 0001
db 0001

.text_segment:
Esto es una cadena de texto

.code_segment:
POP DS:[00000000]
MOV GR0, DS:[00000000]
PUSH GR0
INT4 print
POP GR0
PUSH 00000008
JMP 0000000A
PUSH 00000000
RET
INT3
INT3
INT3
MOV GR1,TS:0000001C
MOV DS:[00000003],GR1
MOV GR0, DS:[00000003]
PUSH GR0
CALL FFFFFFCB
POP GR0
MOV DS:[00000006],GR0
PUSH 00000000
RET
INT3
INT3
INT3

(No me hagáis comparaciones con el ASM puro y duro, porque no tiene ningún sentido)

5.0 - Registros, flags y stack
La máquina virtual consta de 4 registros de uso genérico, que normalmente se organizan así:
GR0 - Parámetros y return
GR1 - Asignar valores a variables
GR2 - Aún para asignar
GR3 - Aún para asignar
Además consta de todas las flags necesarias para operaciones condicionales, aunque no en uso aún.


Se que, como he dicho al principio, a pocos importará esto, pero bueno, me apetecía comentarlo, y, cuando el lenguaje esté un poquito, solo un poquito más avanzado, postearé la máquina virtual (junto al compilador y demás).

6.0 - Descarga
http://www.multiupload.com/XBUUGN3UZW
Leer el último post enviado por mi, viewtopic.php?f=18&t=1632648&p=1725456604#p1725456604

Salu2 y gracias por leer.


Futuras mejoras
- Constantes como parámetros de funciones
- Módulo matemático-lógico para expresiones como "a + 2 + 3 * c".
- Arrays
- Funciones varías para el diseño de GUI (en OpenGL)
- Punteros y memoria
- Ya se verá

Iré actualizando el hilo con información sobre la funciones nativas de XMachine (como "print") y sobre el uso de la sintaxis y gramática de Cross C.

La intención de este nuevo mensaje es que sea educativo y fácil de aprender a la vez. Que permita generar aplicaciones de forma rápida.



Tutorial de Cross C
1.0 - Primeros pasos
2.0 - Funcionamiento de Cross C
3.0 - Variables
4.0 - Declarando una función

1.0 - Primeros pasos
XMachine no requiere ningún tipo de instalación, simplemente guardamos el ejecutable que lleva este mismo nombre ("XMachine.exe") en cualquier carpeta.
El siguiente paso es abrir cualquier editor de texto o código (menos Word o Writer) y empezar a programar.

2.0 - Funcionamiento de Cross C
Lo primero que debemos tener en cuenta es que cross C nos pide que exista, obligatoriamente, una función cuyo nombre sea "main". Las funciones son agrupaciones de código que, como su nombre indica, llevan a cabo una función concreta. Esta tal función "main" debe existir ya que es lo primero que se ejecutará del programa.
Pero, para poder declarar funciones debemos primero entender como funcionan las variables en Cross C:

3.0 - Variables
En Cross C existen 4 tipos de variables (la 3a y 4a aun no implementada). Se dividen en las siguientes:
int - Variables numéricas enteras
float - Variables númericas de coma flotante
char - Como int, de 0 a 255, para carácteres
string - Textos

Un ejemplo de funcionamiento sería el siguiente:
int var0 = 2
float var1 = 1.5
string var2 = "Hola Mundo"
char = 'H'


Como podéis notar, hay un par de cosas interesantes.
A) Las instrucciones terminan a fin de línea, no es necesario incluir ningún ";" al final de cada línea
B) Los textos se declaran sin necesidad de usar arrays, se inicializan como cualquiera variable.

4.0 - Declarando una función
Para declarar una función, además de los 4 tipos de variables normales, también tenemos el tipo "void". La única diferencia con los demás es que las funciones void no devuelven ningún tipo de valor al finalizar, y las otras sí. (Luego veremos que quiere decir esto).
Para que nos hagamos una idea de como se declara una función, declararemos la función "main":
int main()
...
endfunc

Es tan simple como indicar el tipo, "int", el nombre, "main", y los argumentos. Los argumentos son las variables que la función pide, en este caso, ninguno, puesto que entre los dos paréntesis no hay nada. Un ejemplo de función que pide argumentos podría ser:
void con_argumentos(int arg0, string arg1)

Finalmente, vemos como se indica que se acaba la función con "endfunc".
Interesante :O

Sigo el de Programación C desde el primer día!
DIOS!! Tio eres un máquina ( y encima eres catalán como yo)!! Es un orgullo poder leer tu tuto de C.
Suerte con ese proyecto que promete mucho :)
jaja tampoco hay para tanto =P

Si mi objetivo primario, al hacer este lenguaje, es crear un lenguaje más simple que C, y que a su vez, sirva para iniciarse a la programación y poder dar luego el salto a C sin dificultades.
Además, si todo va bien, añadiré soporte para el diseño de interfaces (ventanas) interactivas con el usuario, y a nivel de programación sería fácil fácil, incluso me he planteado la opción de hacer un editor visual (tipo los MFC o los diseños gráficos de los lenguajes .NET).

Ya veremos donde me lleva todo esto, pero espero conseguir algo decente =P


He añadido un poco del tutorial de funcionamiento de Cross C, pero aun no he puesto el link de descarga de la XMachine. El motivo es muy simple, aun que ya compila, aun no puede leer el archivo final y ejecutarlo.
Entre mañana y pasado trabajaré para acabar de implementar la emulación del poco código que de momento acepta y publicaré la XMachine.
Suerte con el proyecto, a ver como avanza.

Pero también te pongo una crítica (personal) constructuva:
Como podéis notar, hay un par de cosas interesantes.
A) Las instrucciones terminan a fin de línea, no es necesario incluir ningún ";" al final de cada línea

Para mí más que interesante me parece un handicap puesto que por legibilidad de código se suelen efectuar saltos de línea.
Mmmh... no te acabo de seguir.
Digamos que en Cross C cada instrucción termina a fin de linea. De hecho en C es mas de lo mismo, porque aun que cada instrucción termine en ";", para facilitar la lectura se termina en salto de línea.

Explícame a que te referías, que me interesa tener opiniones y mejorar =P
En que cuando tienes por ejemplo un condicional de 3 pares de narices, normalmente se hacen saltos de linea para tener una lectura de código decente sin tener que hacer scroll horizontal.
Si tú implementas para que un salto de línea signifique dar por terminado algo una de dos o dejas la linea eterna, o petará cuando se compile.
Bueno, pero evidentemente los condicionales se podrán alargar a más de una línea, de igual forma que las cadenas de texto y demás.
No se si conoces el operando \ de C, utilizado en las declaraciones de macros que ocupan más de una línea. La idea es la misma.

No estoy tan loco como para hacer obligatoria la declaración de un condicional en una sola línea jajaj
alex231 está baneado por "usar clon para saltarse baneo de subforo"
como va eso Blipi?

Suerte salu2
No me gusta eso de no llevar ; al final, asi queda mas organizado.

Aun me acuerdo de cuando usaba C... ahora no puedo imaginar un codigo sin POO, pero bueno... :P
Perdón por la tardanza en responder.

Mmm el tema del ";"
Sinceramente, soy el primero que programa en C/C++ o PHP, y los 3 piden un ";" al final de cada instrucción. Pero siendo realistas, cuantos de nosotros no incluimos un salto de línea después de cada ";". Realmente, desorganizado no queda, ya que en el fondo haces lo mismo pero sin ";". Quizás es ya más cuestión de la tradición xd

Progresos:
- Compilación y emulación -> 100% para Hello World
- Tenéis abajo un link de descarga.

La versión alpha NO soporta aún (en la emulación, SÍ en la compilación) las llamadas a funciones.
El código de un Hello World en Cross C:
int main()
   string str = "Hola Mundo"
   print(str)
endfunc


(Nótese que hay una línea en blanco al final, de momento es OBLIGATORIA, perdón).

Y bueno, la XMachine soporta los siguientes comandos:
cd directorio
Cambia el path a "directorio", puede ser relativo o completo

compile archivo.ext
Compila el archivo especificado. Puede ser con ruta relativa o completa

run archivo.ext [-d]
Ejecuta un archivo ya compilado
Opcional -d, muestra el tiempo tardado en ejecutarse

help
Da información sobre los comandos que acepta


Descarga
http://www.multiupload.com/XBUUGN3UZW

Imagenes:
Imagen
Imagen

(Los archivos ya compilados, .xme, por ahora son intransferibles sry)
(El archivo a compilar debe tener una extensión de 3 carácteres, de momento obligatorio).
si es multiplataforma, por que es un .exe?
yo no puedo correr de manera nativa en GNU-Linux .exe

hay planes para ampliarlo o va a seguir asi?
Sí, perdón jaja
La frase adecuada debería ser: "será multiplataforma".

El código está hecho en C++, usando funciones accesibles desde ambos sistemas operativos (excepto un tema de la encriptación, que no supondrá mucho problema cambiar). Solo haría falta cambiar unos pocos #include.
El problema está en que ahora estoy en el portatil de mi padre (mi PC lo tiene él, porque estaba de exámenes). En breves lo recuperaré, y cuando lo haga allí si que tengo un compilador GCC...

Además del 24 al 30 estoy fuera. Lo siento mucho por todos los usuarios de OS unix y demás. En breves tendréis una versión.
Me parece muy interesante tu proyecto. Sin embargo yo me replantearía lo de los punto y coma ; :p
Hay casos aparte de los condicionales que si que salen líneas bastante largas. A mi en java por ejemplo me acaba de salir una así: Font awtFont = Font.createFont(Font.TRUETYPE_FONT, new FileInputStream(new File("data/upheavtt.ttf"))); que si queremos seguir el estándar de 80 caracteres de ancho, habría que hacerlo así:

Font awtFont = Font.createFont(Font.TRUETYPE_FONT,
new FileInputStream(new File("data/upheavtt.ttf")));

Pero vamos que si dices que vas a incluir el caracter \ puede valer, por que al fin y al cabo es lo que existe en Python para esto.

Por cierto ahora que nombro a Python, que ventaja ofrecería Cross C respecto a éste? Lo digo porque Python es sencillísimo de utilizar, multiplataforma y muy potente.
No creo que me replantee lo del ";", pero bueno, tengo en cuenta las opiniones jeje
Sinceramente, no lo se xd
De momento el buffer de línea está en 260 carácteres. Ya veremos que hago al final. Como eso solo es necesario para compilar, no ejecutar, no me preocupa demasiado.

Este proyecto es más un hobby y ganas de aprender más (al encontrarme con situaciones realmente raras), que el "deseo" de crear el lenguaje más potente del mundo. Pretendo hacer un lenguaje sencillo que permita mediante pocas líneas tener una interfaz gráfica potente y una gran portabilidad. Además pretendo (lo estoy haciendo), que cada ejecutable se cifre de manera única para cada PC. Son cifrados muy sencillos, para evitar perder tiempo en descifrados.
(También existe, o existirá, la opción de no cifrar el "ejecutable" o compartir, mediante sistema online de usuarios, la clave de desencriptación).
La verdad, no se que más ofrecerá. Nunca pienso (se que hago mal) antes de programar, así que, lo que salga saldrá xd

Recordar que ya hay un link de descarga para una versión "alpha".
También decir que ya estoy instalando cygwin en el portatil de mi padre y las herramientas necesarias para el cross compiling, asi que probablemente la versión para gnu saldrá antes de lo previsto.
Puyover escribió:Me parece muy interesante tu proyecto. Sin embargo yo me replantearía lo de los punto y coma ; :p
Hay casos aparte de los condicionales que si que salen líneas bastante largas. A mi en java por ejemplo me acaba de salir una así: Font awtFont = Font.createFont(Font.TRUETYPE_FONT, new FileInputStream(new File("data/upheavtt.ttf"))); que si queremos seguir el estándar de 80 caracteres de ancho, habría que hacerlo así:

Font awtFont = Font.createFont(Font.TRUETYPE_FONT,
new FileInputStream(new File("data/upheavtt.ttf")));

Pero vamos que si dices que vas a incluir el caracter \ puede valer, por que al fin y al cabo es lo que existe en Python para esto.

Por cierto ahora que nombro a Python, que ventaja ofrecería Cross C respecto a éste? Lo digo porque Python es sencillísimo de utilizar, multiplataforma y muy potente.


aunque halla un salto de linea el compilador podria notar que el parentesis no se ha cerrado y seguir con la siguiente linea como si fuera la misma orden, ¿no?
highfredo escribió:aunque halla un salto de linea el compilador podria notar que el parentesis no se ha cerrado y seguir con la siguiente linea como si fuera la misma orden, ¿no?


Por poder se podría, pero eso presenta problemas. Imagínate que simplemente se ha olvidado del ")". El compilador leería el archivo entero, perdiendo tiempo innecesario, para compilar algo erróneo (o simplemente no compilar y soltar un error).
Además, el buffer necesario para tener "constancia" de las líneas anteriores sería cada vez más y más grande.
Realmente, no se como enfocaré esta parte al final. De momento no estoy pensando en este aspecto, sino que sigo con el propio lenguaje. Llegado el punto en que esté más o menos decente, ya empezaré a plantear problemas de "comodidad de uso".

Salu2!
Muy interesante este proyecto. ¿Podrías poner el código fuente?
Wow, ahms, perdona por tardar tanto en responder. No estoy seguro de poder hacer esto, ya que depende de como esto sera mi proyecto de fin de carrera... Asi que..

Pero si te interesa alguna parte en concreto, no habría problema en postear esa parte del código.

Salu2,
Blipi
19 respuestas