Fecha actual Jue Ago 22, 2019 8:01 pm

Implementando un Compilador de C (v2017-11-08start)

Tecnología para implementar nuestro propio compilador e intérprete de código C.

Usuarios leyendo este tema: Ninguno

Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Mié Nov 08, 2017 9:22 am

ZIP COMPILER-2017-11-08start.zip

Actualmente la computación está atrapada
por compiladores de todos los lenguajes
que tratan de jalar a los usuarios a
sus propios nichos, como GCC para
código GNU y UNIX, Open Watcom
para proyectos misceláneos con gran
compatibilidad de la plataforma
DOS, Win9x y WinNT, además de Linux,
aparentemente en mucha menor medida,
los compiladores de Borland para
DOS y Windows de 16 y 32 bits,
Visual Studio para Windows,
y el resto de lenguajes para las
plataformas en las que sus
intérpretes/compiladores soporten
ser compilados.

Así que necesitamos un compilador
totalmente genérico, escrito en
lenguajes estándar pero totalmente
simples y soportados por todos los
compiladores, especialmente de C y
C++, aunque preferiblemente en C
y después en Ensamblador para tener
una herramienta que no esté atrapada
a ningún entorno, y sabiendo los trucos,
simplemente reimplementar en cada Ensamblador
nativo esos trucos con practicidad
y manteniendo el compilador junto al CPU
sin lenguajes de alto nivel para dar
acceso directo, global, a la
tecnología del software, que cada vez
queda más atrapada por más lenguajes,
compiladores y herramientas que ponen
más capas que dependen cada vez más de
sus propios nichos y que son cada vez más
complicadas y menos capaces, por ejemplo,
de generar binarios crudos por sí solas, que
también sería una respuesta aceptable para
liberar realmente el código fuente y hacerlo
ejecutable directamente hasta en los sistemas
más viejos o desconocidos.

_______________________________________
_______________________________________
_______________________________________
_______________________________________
Necesitamos hacer un compilador único y exclusivo para cada variedad de lenguaje, cada versión, cada lenguaje, cada arquitectura de CPU.




Para hacer un compilador de C, o en general, necesitamos nivel de C++ para entender lo que está pasando y tener suficientes referencias avanzadas como para implementar cualquier característica del lenguaje.


Marcar las áreas de comentarios y saltárselas de ahí en adelante.


Parsear el código de preprocesador, empezando por los #if... y los #includes, en varias jerarquías, hasta que no haya errores de preprocesador.


Generar un nuevo código con todo incluido y pre/postprocesado.


Resolver los tipos de datos.


Obtener las funciones y variables presentes, primero globalmente (con funciones de tipo OPCODE capaz de obtenerlas en cualquier scope). Marcar las funciones y otras cosas que tengan declaraciones de cabecera y las que no.



Los compiladores que quiero quiero que tengan la capacidad de anidar Ensamblador libremente para cualquier propósito, que no necesiten enlazadores linkers, que puedan incluir código activo en cualquier lugar, en cualquier orden como en JavaScript, no solo dentro de funciones, que puedan reconocer funciones y cualquier elemento de código como JavaScript, que primero hace un parsing completo para ver todas las declaraciones existentes y después resuelve el resto del código en cualquier orden, pero que sobre todo sea capaz de entender los lenguajes estándar existentes para poder aprovechar todo ese código y librerías existentes.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Mié Nov 08, 2017 12:17 pm

Necesito reconocer instrucciones de control (if, switch, case, while, breaks, continues, default, goto, for, do-while, etc.).

Instrucciones de control, operadores y expresiones (con/sin paréntesis, en/de llamadas de funciones).
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Jue Nov 09, 2017 7:58 pm

Lo primero a implementar es el
preprocesador. Este tiene que tener
absolutamente toda la capacidad de
interpretar el código de C en un entorno
separado pero compartido con el código
principal.

La diferencia es que debe ser procesado
antes que el código principal, y debe ser
procesado línea por línea, aunque hay
bloques compuestos como #if... #endif...
y definiciones multilínea, y multilínea
anidado dentro de multilínea, así que
hay que hacer que la capacidad de procesar
el código de C sea extremadamente fragmentada
con funciones OPCODE, capaz de procesar
el preprocesador, el código normal, código
fuera de funciones, y cualquier otro caso.

Así que lo primero a implementar es la
función opcode,

OPCODE__C89_Preprocessor_Resolve_Conditionals

#if
#ifdef
#if defined
#ifndef
#endif
#else
#elif



Antes de eso, necesito procesar los
comentarios y marcar las áreas
puramente de comentarios.

Antes de eso, el archivo de C principal
es el especificado al compilador. El
resto de archivos deben incluirse según
se especifique desde el archivo principal.
Al final, la compilación debe ser tan
simple como la de HTML/JavaScript, que
se inicia por la página web actualmente
vista, y desde ahí se ejecuta todo el
script incluyendo a medida se procesa.
Debe ser simple, limpio, con un único
comando, portable.

Debe haber un archivo o base de datos
de configuración mínima que especifique
el directorio de #includes predeterminado.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C

Notapor ~ » Jue Nov 09, 2017 8:53 pm

Necesito implementar una función
para obtener todos los caracteres
contiguos de un mismo tipo:

OPCODE__String_ASCII_8bit_getTypedContiguousString
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C

Notapor ~ » Vie Nov 10, 2017 9:14 am

Necesito una función que pueda reconocer cadenas
y comentarios al mismo tiempo para escapar ambos
casos de cadenas de código activo e inactivo aunque
estén contenidas unas en otras.

Necesito, dado un offset inicial, ver si el siguiente
carácter es un inicio de cadena o un inicio
de comentario. Tengo que ver cómo manejar las nuevas
líneas en comentarios y cadenas, ver si se pueden
escapar las nuevas líneas o si esas cadenas
se vuelven inválidas si hay una nueva línea
antes de cerrarla.

En el caso de los comentarios //, tengo que
detectar todas las variedades de nueva línea,
aunque no sé si existen realmente en C89/C90.

OPCODE__String_ASCII_8bit_C89_findCommentOrQuotedString
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C

Notapor ~ » Vie Nov 10, 2017 11:53 am

El núcleo del compilador es la capacidad de interpretar expresiones anidadas con muchos paréntesis, cualquier tipo de operadores, y para cualquier tipo de efecto, así que lo que tenemos que lograr es aprender a manejar de forma dinámica una expresión con cualquier número de paréntesis, corchetes, llaves y cualquier otro carácter de agrupación, ya que si hago eso tendré resuelto prácticamente el compilador entero, dado que sabiendo eso generar el código de Ensamblador es muy fácil una vez desenvuelta la expresión.



--use-current-paths -- Para hacer que los #includes referencien la ruta relativa del archivo de código actual, aunque el código de Ensamblador generado con NASM (por lo menos para las versiones actuales de NASM) tienen que hacer referencia al directorio raíz del proyecto. Esto es probablemente lo mejor al usar diferentes librerías, que se compilan normalmente a archivos objeto intermedios y que siempre piensan que son la raíz actual de su propio proyecto, pero con nuestro compilador tendremos que escoger ya sea directorios relativos al directorio raíz del archivo principal (por defecto, igual que los compiladores normales o JavaScript ???) o el directorio actual del archivo de código actualmente procesado.

Otra cosa que necesito es hacer que el compilador pueda tener goto, pueda entender números binarios, octales, decimales, hexadecimales o de cualquier otra base.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C

Notapor ~ » Sab Nov 11, 2017 10:31 am

Como mínimo necesitto un compilador que sea capaz de
mostrarme los nombres actuales de las funciones y
variables de primer nivel, que me pueda mostrar los
tipos de datos existentes, la ruta de definición de
tipos de datos, lo que me indicará el tipo base de
los tipos de datos estándar.

Tengo que dominar eso al máximo, tengo que
perfeccionar este nivel de uso como para hacer
que el compilador me sirva para entender al máximo
la lista de tipos de datos en cuestión de forma
limpia y las funciones presentes.

Tengo que usar código que de verdad pueda usar
de inmediato, por ejemplo para extender el programa
de PCI de Craig Hart para que genere todos los buses
como un mapa en secuencia estático del espacio PCI
entero para simplificar una versión inicial del
kernel de LowEST, y así, ir procesando los programas
con código que sienta mejor, que más me ayudan.
Los programadores principalmente hablan en lenguajes
de programación, y yo lo que tengo que hacer es
liberar ese código al aprender a hacer mis propios
compiladores que lleven la simplicidad de uso de ese
código al de scripts como JavaScript, para todas las
plataformas. Ya que hay tanto código bueno y ya que
necesito aprender de este, necesito aprender realmente
a hablar el idioma de la programación, como aprendí
Inglés y estoy aprendiendo otros idiomas, y para eso
necesito pasar haciendo todo el tiempo mis propios
compiladores, llevar su implementación hasta
Ensamblador puro, empezando por x86 Portable de
NASM/YASM/Intel. Una vez que los tenga listos, voy
a poder avanzar, y muchísima gente también. No importa
cuánto me tarde, solo que aprenda, avance y logre
alcanzar de forma limpia y amigable a todos para que
aprendan a hacer programas desde la verdadera raíz base,
entendiendo el compilador.

Así que lo siguiente es empezar a implementar el compilador
para devolverme la estructura general y los tipos
de datos, ya que al definir eso con claridad voy a
poder empezar a aprovechar el código.


compiler\
compiler\c.exe
compiler\cpp.exe
compiler\js.exe
compiler\java.exe
compiler\pascal.exe
compiler\etc...
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Mar Nov 14, 2017 1:58 pm

Necesitamos resolver la precedencia del código:

- Correr el compilador deseado.
- Abrir el archivo principal.
- Ver qué tamaño tiene.


Necesitamos determinar la precedencia que realmente
se ha pensado cuando empezamos a interpretar el código
en cuestión.

Tal vez tengamos que empezar viendo qué son cadenas
o comentarios al mismo tiempo, marcar esos offsets
para evitar equivocarnos al hacer un parsing
de acceso aleatorio buscando diferentes elementos
de código según necesitemos.

C preprocessor newline escape
C strings newline escape



Creo que voy a empezar por convertir funciones que piense usar de inmediato. Así a medida avance en mis programas, también voy a avanzar en mi compilador, y también voy a hacer de caso en la práctica que ya tengo mi compilador listo, porque en mi máquina manual humana ya lo tengo realmente listo.

Voy a empezar con funciones individuales traducidas a Ensamblador crudo diseñado para usarse como código binario crudo independiente. Así voy a poder acelerar de inmediato en usar las funciones de programas/librerías existentes directa, simple y limpiamente en mis propios proyectos.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Mar Nov 14, 2017 6:48 pm

Necesito empezar por interpretar estructuras
con los corchetes de principio a fin.

Lo que es críticamente importante aquí
es que necesito generar el acceso base,
los tipos base, las instrucciones base
en Ensamblador, y también todas las formas
base de posiblemente acceder la variable,
también con Ensamblador base asociado,
para cada miembro de la estructura, e igual
para cada variable, función, etc.
Eso hará que pueda buscar esos tipos base,
encontrarlos y reconocerlos tan pronto
los encuentre, y hasta optimizar, sin mencionar
el encontrar errores o advertencias
en la forma de usar los datos.


También puedo empezar por interpretar variables
globales y cuerpos de funciones, definiendo los
metadatos como las posiciones fijas de pila que
tendrá cada parámetro. Como podremos ver,
definir las cosas desde el principio de forma básica
hará que el compilador sea muchísimo más simple.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Sab Nov 18, 2017 5:22 am

Mientras compilemos, necesitaremos crear
un subdirectorio que contendrá todos los
resultados y datos temporales.

Podríamos llamarlo _build_ en el directorio
raíz del código fuente actual, en el mismo
directorio que el archivo principal
de código, que habrá sido especificado.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Sab Nov 18, 2017 1:00 pm

Guardar todo en el disco, no en memoria.
En memoria solo tener la definición de las
estructuras, campos y variables a manejar,
tener por lo menos 1 instancia pero no mucho
más. Esto hará que podamos compilar programas
muchísimo más grandes.


current_file -- 0.dat
current_offset -- 1.dat -- 8 bytes
included_files_log -- 2.dat
identifiers_log -- 3.dat
current_file_comments -- 4.dat
current_file_strings -- 5.dat
current_file_identifiers -- 6.dat
current_file_stage -- 7.dat -- 4 bytes
1 -- completed file open
-1 -- completed file close
2 -- completed detecting file size
3 -- detecting comments and strings
4 -- completed detecting comments and strings
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Piezas de Código del Compilador de C/C++ de ArcheFire (v2017-11-08start)

Notapor ~ » Dom Nov 19, 2017 8:31 am

Aunque no sepamos cómo agregarle cosas
a un programa o cómo definir de forma
tecnificada un problema o una solución,
siempre sabremos qué es lo siguiente
que necesitamos hacer, en términos generales,
para resolver una tarea.

En este caso necesitamos agregar una función
que registre el inicio y el final de cada área
en el código, de forma separada, donde haya
comentarios por un lado y cadenas literales
por otro lado. Esto hará que evitemos cualquier
mala interpretación del código en sí al
saber qué partes del código saltarnos en vez
de interpretarlo, o en el caso de los comentarios,
para ignorarlos por completo durante la compilación.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Lun Nov 20, 2017 7:46 am

Los siguientes archivos deben abrirse
al inicio del compilador, al comprobar
que se pudo abrir el archivo de código
principal especificado:

includes.dat
functions.dat
vars.dat
datatype.dat
strings.dat -- Las cadenas de texto serán acumuladas
para ponerse en una misma sección de datos
global.
expr.dat

Los siguientes archivos se deben abrir
cada vez que abramos un archivo
de código fuente y liberados
cada vez que cerremos dicho archivo:

lines.dat
#.dat
comments.dat


- includes.dat Lista de archivos de código fuente incluidos
en la secuencia especificada. El primer elemento
de 32 bits es una cuenta de cuántos elementos
de cadena siguen en dicho archivo.

- Cada vez que abramos el archivo de código fuente
actual, necesitamos volver a definir:

- lines.dat
- Número de elementos en el archivo de delimitación
de líneas.

- lines.dat
- Delimitar nuevamente las líneas.

- strings.dat
- comments.dat
- Detectar las áreas donde hay comentarios y cadenas.

- #.dat
- Detectar las áreas donde hay instrucciones
de preprocesador (para preparar e incluir
archivos de código sin errores).

- function.dat
- Al definir a bajo nivel los parámetros de funciones,
para el compilador x86, debemos listarlas
en orden opuesto. De esta forma vamos a poder
escribir de forma fácil el Ensamblador, y
resolveremos todos los detalles de nivel de CPU
desde lo más bajo del compilador de forma
automática.

- vars.dat
- datatype.dat



Lo primero que debemos hacer es ver que todos
los archivos a incluir estén presentes,
para lo que tendremos que analizar el
archivo de código principal, y archivos
subsiguientes, como para reconocer
comentarios, cadenas y directivas de
preprocesador para saber realmente qué
archivos deberíamos realmente cargar.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Lun Nov 20, 2017 4:07 pm

En el pasado he hecho un compilador
casi completo para RealC. Solo me ha
faltado el manejo de expresiones e
incluir varios archivos de una sola vez
de forma automática.

Ahora solo necesito que al final
de la primera etapa, después de identificar
todos los elementos de todos los archivos
que realmente se deben incluir,
que se genere el archivo stream.dat
que contenga exactamente la secuencia
de elementos a compilar secuencialmente.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Lun Nov 20, 2017 8:00 pm

Lo más fácil es implementar primero el preprocesador
con las directivas incondicionales, y después
implementar los #ifs, etc., y en el código del
compilador, encerrar lo incondicional
realmente dentro de los ifs correspondientes
a las directivas condicianales para que volvamos
a estructurar un código simple con una correspondencia
directa entre IFs y otras instrucciones y la sintaxis
del lenguaje.

Solo tenemos que formular el código más simple
para C y C++ en vez de RealC, aunque tal vez
podamos usar el código del compilador de RealC
como ejemplo en varios casos para reimplementar
rápido lo más simple, pero esta vez mejorado.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Mar Nov 21, 2017 10:55 am

Es como un CPU que lo único que hace es compilar programas.

La intención es tener opcodes de ese tipo en funciones de un programa, perdurables década tras década, estandarizados, porteables a cualquier lenguaje, mejorables pero sin modificar ni recortar su comportamiento fundamental, pero sí extenderlo a lo que cada OPCODE/instrucción necesita.

La intención es agregar nuevos OPCODEs al mismo programa, en este caso el mismo compilador, para completar el CPU compilador a lo largo del tiempo, para cada lenguaje, extendiéndolo a medida pase el tiempo pero sin perder la compatibilidad, igual que el CPU x86, como si el programa fuera un emulador del CPU que ejecuta solo la aplicación esperada para dicho programa contenedor.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Mar Nov 21, 2017 10:58 am

Debería soportar todos los idioms y pragmas especiales de Visual Studio, GCC, Watcom, Turbo C, o lo que sea.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Mié Nov 22, 2017 11:35 am

compiler_get_next_typed_string

compiler_get_next_element

compiler_get_preprocessor_directives
compiler_get_comments
compiler_get_function_declarations
compiler_get_function_bodies


Este podría ser el primer nivel de parsing
del código de C. Más adelante podríamos
profundizar, pero los detalles más profundos
serán parte específica, única, privada,
integral, hasta duplicada, para cada uno de
los subprogramas que compilarán adecuadamente
cada palabra clave y elemento diferente
para el lenguaje C/C++.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Vie Nov 24, 2017 6:25 pm

Necesito tener un puntero en cualquier nivel,
por ejemplo en el scope global, y
necesito una forma de mantener y pasar
la dirección de esa variable a cualquier
scope, desde el nivel global y también
en funciones encadenadas.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Mar Nov 28, 2017 7:10 pm

Registro de cada palabra clave y símbolos básicos especiales.

Necesito empezar a manejar solo las palabras
clave que use en mis programas a medida quiera
compilarlos, de esta manera voy a poder tener
un compilador comppleto poco a poco solo
para el código que necesite manejar.

Así podemos preocuparnos solo en agregar
lo que vamos a usar en un momento dado,
y agregar poco a poco los elementos
adicionales, pero no sin antes tener los
elementos anteriores totalmente implementados
y depurados.

Es decir que para empezar, debería
agregar código para poder compilar
el siguiente programa con este compilador.
Esto es a lo que debo dedicarle todo el
tiempo hasta lograrlo:
Código: Seleccionar todo
#include <stdio.h>

int main(void)
{
 printf("Hello");

 return 0;
}


Necesito empezar por diseñar los esqueletos
de ejecutables para cada sistema operativo
a soportar.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Mar Nov 28, 2017 7:49 pm

Creo que podría tratar a los #includes
como cosas a sustutuir por archivos enteros,
pero en vez de eso voy a mantener un
archivo de datos con una cadena conteniendo
el nombre del archivo de código fuente
a compilar empezada y terminada con un
carácter nulo, después de la cadena
que diga el offset del archivo, la
línea y la columna para reanudar el
procesamiento de ese archivo una vez
terminemos de procesar el indicado.

También debería empezar con un DWORD/QWORD
que indique el offset del elemento anterior.
Así podremos regresar a este una vez
procesemos el archivo a incluir.

Esto es lo primerísimo a probar.

Podemos empezar por simplemente
ver si podemos reconocer todos los
#includes, e imprimir cómo los
procesamos a medida compilamos todo,
sin ponerle atención al resto de
instrucciones. Al implementar esto
por completo desde el principio,
ganaremos la capacidad completa de
procesar más de un archivo de
código fuente, como en los programas
normales de C que hacen hasta los
principiantes.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Mar Nov 28, 2017 7:59 pm

Puedo hacer un bucle principal del
compilador, que se vea igual que cualquier
emulador de CPU que he hecho para x86,
que recoge uno o más bytes en la posición
actual, convirtiéndolo a direcciones de
variables y funciones directamente si es
posible, y una vez reconocido el elemento
o carácter actual, entrar en un IF global
para resolver uno o más casos para una
misma base.

Debo saber en todo momento en dónde estoy
en una línea. Con eso podré saltarme
cualquier espacio en blanco o comentario
al inicio de línea y a continuación ver
si el carácter que sigue es #

Si es así, tengo que ver si es una directiva
include. Si es así, tengo que ver si empieza
con < o con ". Ahora tengo que convertir a
la ruta entera del archivo a incluir.

Con eso puedo empezar a tratar de crear una
función semirecursiva/pseudorecursiva
que pueda ver qué archivos queremos incluir,
y dependiendo de eso nos muestre una lista
de los archivos y offsets que deberemos procesar
en el orden real en el que los usaremos.


Aquí implementar el bucle puede ser tan
estático como implementar el bucle de cualquier
otro emulador de CPU. El compilador puede ser
tan duro como cualquier CPU en procesar cada
parte de cada instrucción según se le indique,
sin importar lo complejo que sea, así que usaremos
esa certeza para simplificar y robustecer nuestro
compilador desde el principio.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Mar Nov 28, 2017 8:21 pm

Necesitamos hacer un preprocesamiento cada vez que
tratemos de procesar el siguiente elemento. Hasta donde
sé en mi nivel inicial, parte de ese preprocesamiento
es tratar de saltarse cualquier espacio en blanco,
y registrar/saltarse cualquier comentario (eso es para
volver a reintegrar los cometarios en el código
de Emsamblador).
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Mar Nov 28, 2017 8:44 pm

El hecho de que podamos usar las funciones
desde cualquier punto siempre y cuando
hagamos una declaración de cabecera de las
funciones justo antes de su primer uso,
nos indica que C no necesita saber cómo está
hecha cada función, solo su declaración del
tipo de datos devuelto y sus parámetros.

Podemos tratar de declarar solo a printf
en vez de incluir a stdio.h, y ver si es
suficiente. Eso nos dará una prueba con
compiladores existentes de los límites
mínimos para hacer uso de funciones de
librería.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Mar Nov 28, 2017 9:02 pm

Como era de esperarse, el siguiente código
funciona en vez de usar stdio.h así que podemos
avanzar sabiendo que nuestro compilador
funcionará si simplemente declaramos las
funciones antes de usarlas:
Código: Seleccionar todo
int printf ( const char * format, ... );

int main(void)
{
 printf("Hello");

 return 0;
}


Para main podemos agregar un caso para
llamar enlazando la declaración de main
con el esqueleto del ejecutable.

Recordemos que main simplemente está
declarado esperando a ser usado, y la parte
que enlaza el programa con el formato
ejecutable se encarga de escoger el
enlace correspondiente a la declaración
de main en el programa.

Al generar el ejecutable simplemente
llamamos a la dirección de memoria donde
está main así que basta con escribir una
función main en cualquier lugar del programa,
y podríamos obviarlo si el programa es un
binario crudo.


Para los espacios de indentación podemos registrar
la cantidad de espacios al inicio de la línea de código
para reindentar el ensamblador generado.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Mié Nov 29, 2017 2:29 am

El archivo lines.dat y elements.dat son básicamente todos los metadatos que necesitamos para manejar toda una compilación cualquiera.

El resto de archivos simplemente nos servirá para agregar la capacidad de poder compilar cosas aunque no estén declaradas antes de usarse, para saber si algo ha sido definido ya, pero sobre todo para mantener el control de cómo compilar cada función, variable, etc.




Otra cosa es que podremos usar las capacidades de NASM/YASM para generar EXEs de MS-DOS, ejecutables de Linux, y tal vez ejecutables de Win16 mientras no sepamos hacer esos esqueletos por nosotros mismos. Pero todos esos trucos quedarán archivados en versiones del compilador, así que no hay problema.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Mié Nov 29, 2017 3:30 am

The first thing I will process will be #include directives.

_____________
_____________
_____________
_____________
_____________
For #includes, I need:

- Offset of previous structure element on disk (to return to the previous source file and delete unused entries for already-processed files).

- Length of full path string of the source file (maybe relative, I will test).

- Source file path string (ASCIIZ).

- Last source file pointer position, but mainly the last processed line/character position processed (should be after the last/current #include directive).

_____________
_____________
_____________
_____________
_____________

Start of lines and end of lines are also code elements.

Before trying to process the next code element I need to be able to skip blank spaces and comments to get to the actual code no matter how padding is arranged.

The source code itself already has a formal structure, so the compiler should be able to process the code back and forth in the same way as a CPU emulator following the sequence of opcodes. C code is more dense than the basic CPU instructions, but it can still be treated by opcode-styled functions for code generation.

Each C/C++ language element is a complete program in itself. Each element needs to be sequentially recorded individually with the line number, and start/end character/column number. It's type also needs to be recorded to make sure that the compiler is recognizing each element properly. Later the sequence of keywords will decide if it's a variable, function body, function declaration, preprocessor, etc., in the main compiler loop using a tree of IFs in the same way of a CPU emulator.

At the first level, the array of structures are always stored in files, not in memory, although the wrappers could be rewritten to use memory or other media.

The main parsing loop is thought to parse the code with precedence. First the things that need to be resolved first. I will start by processing very simple programs as they are already complex enough to start by supporting very few keywords.

The compiler is fully expression-oriented. Everything is an extension to arithmetic or bitwise expressions. Comments, declarations, blank spaces, etc., are detected in the main loop and treated by their respective programs which will process them fully.

It's like a sequential CPU emulator, where the context is followed by first inspecting the first byte for an instruction, entering a global IF or subfunction call, and testing all known cases.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Mar Dic 12, 2017 12:04 pm

Tenemos que tener un conjunto conocido de tipos de datos
resueltos y no resueltos posibles, y ser capaz de buscarlos
todos en el código. Tenemos que tener un conjunto de instrucciones
de Ensamblador para cada tipo que vayamos a manejar.




A continuación lo que queremos es poder cargar
y descargar en un mismo bucle diferentes archivos
de código según se necesite, empezando desde el
archivo principal.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Mié Dic 13, 2017 1:02 pm

He estado extendiendo las funciones
del compilador que abren y definen
las líneas de texto como un proceso
de carga para que sean capaces de
usar solo manejadores de archivo
en vez de nombres de archivo.

Todavía no abren por su cuenta los
archivos a partir de un nombre/ruta
de archivo, aunque tal vez deberían
para hacer transparentes las operaciones
de apertura de archivos de código fuente
y dar el efecto de carga de datos a
manejar con una sola llamada a
OPCODE__Compiler_Load_ASCII_Text_File
como parte del administrador de líneas
del compilador.

Ahora no solo se usa el archivo
lines_dat, aunque la estructura del
compilador me da la impresión de que
tendré que voy a tener que crear
un archivo de metadatos de líneas separado
para cada archivo de código abierto,
y solo abrir uno a la vez, hacer posible
seleccionarlos, cerrarlos y volver a
abrirlos de forma intercambiable con
la función "switch" del administrador
de líneas.

Esto es usar el lenguaje de programación,
pensar en algo que implementar, pensar
en la estructura general (orientada a opcodes
en este caso) y después implementarlo
en C.

También usar nuestro proyecto, sentir que
este nos guía cada vez que todo lo que nos
rodea se hace totalmente ilógico por solo
haber ruido presente.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Dom Dic 24, 2017 1:21 pm

I have uploaded the code to SourceForge.net and updated the first message in this topic:
http://sourceforge.net/projects/c-compiler/files/


So far I've written code to generate text lines, and to generate the structures that indicate the start/end offset of each line excluding the newline sequence. Now my line-counting function can dynamically keep track of the line metadata in any file, not just lines.dat, and with that I've started to include a text line manager and a source file manager, very tiny and OPCODE-function based.

Now I need to add an OPCODE function to search for exact, case-insensitive text, in a text file, to know whether I already added a source file in some index, and need to add code to dynamically generate the file names for the line metadata files using the index of each file in the order found by #includes, starting by the source file specified in the command line. Although a source file should be able to be included more than once so searching whether it's already present seems to be an obvious error.



The idea that has helped me the most from this thread is to use a stack of unsigned long offsets to hold in which order I should keep parsing source files. Add a new file to the list of source files (filelist.txt) when finding a #include as well as pushing the index of that file, and popping every time I reach the end of the current source file.

This idea of a stack of source files will be completed by holding the information of which was the last line/character number and raw offset in the file before opening another one in a nested way because of a #include. In this way when I reach the end of a nested include source file and pop it from the stack, I can reopen the previous file, the file that included that other file, and immediately position the file manager and file pointers to their previous offsets using only 1 file handle for all the source files of a project but instead using on-disk structures to hold the metadata files to handle all other files provided by the user.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Mié Ene 03, 2018 11:11 am

Necesito agregar código para recorrer todos
los archivos de forma secuencial.

También necesito empezar por hacer un primer
escaneo para obtener todas las declaraciones
externas a funciones. Esto nos permitirá
poder declarar y llamar funciones en cualquier
punto del código, lo que hará que este
se vuelva tan accesible como en JavaScript,
aunque es posible que tengamos que poner de
alguna forma las declaraciones efectivas
al principio del código Ensamblador generado
para que no den problemas en Ensamblador,
o averiguar si NASM puede usar/llamar etiquetas
antes de declararlas.


Tengo que haber ganado el impulso absoluto para el
8 de enero del 2018 en poder estar concentrado
en hacer el compilador sin que nada más logre distraerme
o hacer menos densa la actitud contra pensar que
si solo hago un proyecto principal pierdo el tiempo
en todo lo demás porque si le hago caso, todo se me
desmorona y no desarrollo nada clave. Es 1 semana antes
de las clases de plan básico en el país.

Para el 12 de febrero, que se supone que es cuando empiezan
las clases en el ITCA, ya tengo que tener listo el árbol
de sintaxis solo para dedicar el resto del tiempo a
desarrollarlo en el año, aunque debería tenerlo listo
mucho antes.

Así debería siempre usar los inicios de clases, ciclos
o actividades para darme impulso que encaje con la demás gente y
alimentarles el estudio también.

Debería ver qué programas, qué proyectos grandes
de gran ciencia y tecnología pueden servir para cubrir
lo que dan cada año de estudio, de 1° a 9°,
kinder, prekinder, bachillerato, y darles esa forma
para que expliquen los trucos que se contienen en
esos grados. Lo único que sé realmente es que
el truco del calendario es apropiado paa enriquecer el segundo año
de bachillerato.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Vie Ene 05, 2018 5:58 am

Aprenderse los opcodes que estamos haciendo para el compilador
en sí, ya que al aprendérnoslos podremos meditar y diseñar
más y más funciones mientras descansamos sin que se nos olviden
las funciones que tenemos disponibles, y eso nos bloquee.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Vie Ene 05, 2018 7:45 pm

Necesito la capacidad de poder leer varias líneas
libremente, o limitar la lectura solo hasta el final
de la línea actual para aplicar de forma eficiente
varios trucos.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Sab Ene 06, 2018 5:36 am

Grande o pequeño, necesito pasarle el grueso del
esfuerzo de cálculos y funcionamiento correcto a
la computadora, recompilando, corriendo el programa
con casos de prueba función por función, y viendo
que funcione, pero en base a casos de prueba iguales
que los que hay que resolver en el mundo real.

Esto va a hacer que produzcamos más, que hagamos todo
el peso de desarrollo, no encerrado en nuestra mente,
sino que en la computadora y otros medios de implementación
externos que se pueden expandir fuera de nosotros y que
se sostendrán mejor ejecutándose fura de nuestra mente
para trabajar masivamente en el exterior.

El usar casos de prueba del mundo real va a hacer
que nos mantengamos pensando y trabajando en términos
de metas claras que resolver, casos claros, e implementación
de grupos de funciones que son las necesarias para
resolver de forma inmediata el problema, lo que será más
rápido y mucho más liviano a nuestra cabeza que hacer todo
primero en la mente y después vertirlo poco a poco en
el medio de desarrollo exterior.

Aquí vamos a tener la ayuda de la computadora porque es esta
la que nos va a demostrar de inmediato si el código que
hemos escrito está bien, sin errores, o qué cosas necesitaremos
corregir.

Hasta cuando se trate de trucos puramente mentales, todavía
podremos usar la computadora como extensión de nuestro cerebro,
como un segundo ayudante especialista en que le demos el planteamiento
claro y ejecutable de un truco, para que pruebe a calcularlo
para ver si está bien, pero eso es algo que nosotros evaluamos,
la computadora solo nos va a ayudar a probar a calcular el
planteamiento y ya, pero sin hacer esfuerzo mental adicional.

Así que a escribir, compilar y correr el programa. En vez de
pensar demasiado si hemos calculado bien la forma en la que
el programa funcione, hay que dejar eso a correr el programa,
ver los datos generados y corregir poco a poco, afinando, como
tocar una cuerda de guitarra y afinarla cada vez hasta que se
oiga bien. Es algo fácil e instantáneo de hacer en JavaScript,
pero tendremos que acostumbrarnos a hacerlo repetidamente en C
y otros lenguajes compilados/ensamblados, es de tener un poco más
de paciencia pero nos quedará más ventaja que solo usando JavaScript.

Si nos ponemos a pensar en eso, hasta el uso de la sintaxis
y las funciones es algo que la computadora nos puede ayudar
a calcular con errores y advertencias, en vez de hacer el
esfuerzo principal solo para mantener la sintaxis, así tendremos
más energía para avanzar poco a poco entre la computadora y
nosotros, no solo nosotros haciendo todo el esfuerzo enorme.

Es como si en vez de discutir mejor nos ponemos a escribir un programa,
le ponemos todo lo que se nos ocurra, y sabemos lo que necesita,
así que lo corremos, y vemos poco a poco lo que hace falta,
le agregamos algo nuevo, lo corremos y vemos si lo nuevo funciona bien,
hasta que en base a parches en los que vemos qué más tendríamos que
agregar, lo completemos y corra como sabemos que debería, en
vez de formular las cosas solo en la mente, viendo directamente
los valores que el código que hemos hecho genera para seguir
agregando código y corrigiéndolo acorde a los datos generados
contra los que deberían ser.

Sabremos que lo estamos haciendo bien porque se nos quitará
el tedio, el aburrimiento y sobre todo eso, el estancamiento.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Sab Ene 06, 2018 5:58 am

Necesito hacer una prueba de readline parcial
y total, y de mover el puntero hacia líneas,
caracteres, usando los offsets del archivo lines.dat
para un archivo en particular y nada más, para
ver si realmente se mantienen y se calculan
bien en todos los casos.

Pero más que esta prueba tonta, quizás debería
pensar en qué más código agregar al compilador
que necesite funcionar y usar eso como prueba
de funcionamiento hasta que la función del mundo
real a implementar funcione bien.

Usar las funciones nuevas agregadas que sean
las funciones del mundo real a usar, como los
casos en sí de prueba en vez de código de prueba
que después borraríamos y que se convertiría
realmente en una pérdida de tiempo. Con esto mantenemos
contenido nuestro esfuerzo e inversión de tiempo
en probar las funciones con otras funciones finales
a desarrollar, y con eso tendremos un resultado
sólido de desarrollo que no tendrá pérdidas probando
código temporal inútil para el problema a resolver,
sino que verificando que todo lo que agreguemos
siga funcionando bien.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Mar Ene 09, 2018 6:18 am

tipo declaracion_funcion(parametros); <<<---

tipo declaracion funcion(parametros)
{ <<<---


Dependiendo del carácter que le siga a una definición de función,
sea ; o {, sabemos si se trata de una simplemente definición
de función (;), o si es la definición con el cuerpo entero de la
función ({).

Pero eso sí, todas las declaraciones de una misma función
en C tienen que ser idénticas por lo menos en los tipos de
datos usados; sino estaríamos hablando de sobrecarga (overloading)
de funciones, que deberíamos saber desde ya para saber cómo
manejar de forma intercambiable a C/C++ en nuestro compilador
ya que, como sabemos, este compilador tiene que poder manejar
todas las características de C y C++ de forma intercambiable
como si de JavaScript se tratara, solo de usar y generar código
sin errores.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Mié Ene 24, 2018 5:44 am

Necesito traducir a C clásico, independiente del sistema,
con librerías autocontenidas, con tanto código que corra
directamente en cualquier sistema, como sea posible.

Necesito hacer versiones separadas para cada sistama a
compilar, agregarle las librerías que necesite,
usar diferentes compiladores para ver si corre hasta en
DOS de 16 bits si es posible.

Necesito traducir sobre todo GCC, después programas más
normales como Digger.org, Wolf3D, etc., hasta lograr que
el código se vuelva portable a todos los compiladores
que conozco, usando funciones de tipo OPCODE para ganar
dicha portabilidad al máximo, por ejemplo, para la forma
en la que escribo en la pantalla.

Puedo en cualquier momento agregar funciones a un programa
cualquiera, hasta a un esqueleto que no use #includes
(excepto para compiladores viejos inestables) para revisar
que lo he traducido correctamente.

___________________________________________
___________________________________________
___________________________________________
___________________________________________
Ensamblador o parte del compilador que pueda usar
de forma intercambiable la sintaxis de NASM, GAS,
MASM, TASM, traduciendo todo hacia NASM portable.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Vie Feb 23, 2018 5:27 pm

Hacer los tipos de datos de C que varían se puedan configurar
al tamaño máximo de los registros del CPU, a su tamaño
normal como los chars, o configurable como si los las variables
fueran de 16 bits por los registros para que programas que
realmente sean de 16 bits y tengan esas limitaciones puedan
recompilarse sin cambio alguno.

Este tipo de ideas, de control, es bueno para quebrar la lógica anómala
de cualquier problema, como si esos problemas tuvieran que ver
con dimensionar mal las cosas.






Empezar con datos estáticos configurados a sus valores por defecto,
como se haría en una función de inicialización, para después
usar ese mismo código en una función de inicialización y así
podamos avanzar más rápido en el punto inicial donde se
inicializa realmente, que es donde más fácil es trabajar,
en los puntos iniciales donde realmente se necesita algo.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Vie Feb 23, 2018 9:13 pm

Creo que puedo controlar y entender de forma
fácil a nivel de Ensamblador C si agrego todas
las opciones manuales que conozco en forma de
pragmas para controlar los detalles internos
del lenguaje y le agrego mis tipos de datos
de Ensamblador portable.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Vie Mar 02, 2018 4:52 am

Podríamos hacer que recoger las declaraciones globales
sea parte de la pasada del preprocesador. A medida vamos
corriendo dicha pasada, deberíamos ir formando un solo
archivo de C ya con el resultado para que podamos inspeccionar
que dicha pasada no tenga errores. Más adelante ya no
usaremos los archivos originales de código sino que este,
y a su vez generaremos un archivo de código C más resolviendo
los tipos de datos solo hacia tipos de datos genéricos del
más bajo nivel para que la lectura sea máximamente fácil
e igual el ensamblador generado. Intentaremos usar etiquetas
legibles en C, aunque es un estilo de programación a aprender.

Bien pudiéramos generar un archivo de Ensamblador en ese punto
en vez de generar solo los tipos base, o ambos, pero ya que
queremos que nuestro compilador sea más un explicador de código
que un mero compilador tenemos que evaluar qué y cómo hacer las
cosas para que funcionen y se vuelvan fácilmente legibles.







Por ejemplo, los char individuales o cosas como unsigned int,
int, son los más fáciles de pasar a Ensamblador. A partir de
cosas como char * tenemos que pensar en las mejores formas de
generar el ensamblador para estos.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Vie Mar 02, 2018 8:25 am

* == unptr
& == ptr

despuntar


Quizás internamente cosas como Windows usan
compiladores de C/C++ unificados y simples
capaces de generar cualquier formato, y
capaces de compilar código ASCII, UTF-8
y UTF-16, entre otras codificaciones
secundarias directamente con las funciones
privadas correspondientes contenidas en el
sistema mismo.

A nivel de cadenas o a nivel de archivos
individuales.

Necesitaremos un editor de texto capaz de
escoger una codificación de caracteres específica
pero también trabajar en modo binario para no
alterar lo que no esté en esa codificación, y
poder usar #defines con cosas como cadenas de
caracteres, que las incluya en modo binario para
poder mezclar cadenas en todas las codificaciones
en modo binario para trabajar fácil con estas.




pragma flotat size
pragma double size
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Sab Mar 03, 2018 3:52 pm

Para indicar un offset inválido para una cadena no encontrada usando solo enteros sin signos, podemos devolver un offset mayor al tamaño del búfer/cadena que estamos analizando. Así sabremos que nos está indicando que no la encontró sin necesidad de recortar nuestra capacidad de recorrer offsets válidos solo por usar -1.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Lun Mar 05, 2018 11:13 am

Hay que tener cuidado de que funciones usadas recursivamente no hagan uso de código que numca se completará entre sí, pero es algo complejo de saber y tendríamos que correr el programa para asegurarnos de que no tengamos ese bucle infinito por lógica incompleta que nunca se va a completar.



Un programa puede ser más simple que los que vemos, pero estos por facilidad reusan funciones ya existentes en el programa, así que habría que pensar más veces desde cero para que el código sea simple al máximo con funciones sin dependencias intrincadas solo por la conveniencia del reuso de funciones que realmente no se pensaron para usarse juntas. Podría ser un mejor programa desde el punto de vista de que será muchísimo más usable, autocontenido y estandarizable como librería de funciones, aunque necesita más trabajo y más espacio, pero si se hace valdría la pena.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Lun Abr 09, 2018 12:28 pm

Podemos resolver el código de C++ hacia tipos básicos de C,
y lo que no, podemos convertirlo en parte de la librería
estándar escrita en C con llamadas, estructuras, variables
y convenciones de llamada especiales a especificar en la
declaración de la función.



C shape == ASM shape
El código de Ensamblador debe verse igual que el de C.
Por ejemplo si usamos inline functions de C++, entonces
debe haber un código centralizado que no llamemos pero
al que sí podamos usar una instrucción JMP de Ensamblador
para ejecutarlas y regresar, que es exactamente como se mira
una función inline. Eso hará que probemos convenientemente
nuestros conceptos humanos, a nivel humano, en la máquina.




Oír música de guitarra de todo tipo, nos va a hacer
pensar como C/C++ mientras afinamos nuestras habilidades
y conocimiento. Con letra, sin letra, que sintamos que
nos ayuda.

Oír música de piano para tener ideas profundas
de algoritmos.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Jue May 31, 2018 9:45 am

Cosas que mantener en el código generado como comentarios.

Las llaves de principio y fin del cuerpo de las funciones, bucles.

La indentación.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm

Re: Implementando un Compilador de C (v2017-11-08start)

Notapor ~ » Jue May 31, 2018 9:56 am

Lo más simple de lograr para una base inicial de
desarrollo escalable y reusable del compilador
este año es aprender a convertir manualmente a
Ensamblador el código de C y C++ que necesitemos
sin importar el que sea, sabiendo cómo generar
las estructuras internas de procesamiento del
código para después hacerlo manualmente, pero
teniendo como mínimo los trucos de compilación
hechos por nosotros para compilar ya sea manual,
automáticamente o un poco de los dos como para
quedarnos solo completando el compilador a medida
pase el tiempo y aprendamos trucos, pero siempre
concentrado inicialmente este año.
Imagen
IP for hosts file (email udocproject@yahoo.com to get updates if website becomes offline):
Código: Seleccionar todo
190.150.9.244 archefire.org



See what I'm doing in real time:
Main Desktop 1
Main Desktop 2
Avatar de Usuario
~
Site Admin
 
Mensajes: 2958
Registrado: Sab Nov 10, 2012 1:04 pm


Volver a Compilador de C

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 24 invitados


cron