Autor Tema: no se!!!!! ayuda por favor!!!! tema: compilador

0 Usuarios y 1 Visitante están viendo este tema.

29 Marzo, 2009, 07:14 pm
Leído 2179 veces

santi22

  • $$\Large \color{#5372a0}\pi\,\pi$$
  • Mensajes: 56
  • Karma: +0/-0
la pregunta es la siguiente :

el compilador es un programa, no, y este interpreta un programa hecho por mi por ejemplo.
ahora este compilador pasa mi programa a lenguajes ceros y uno y estos van al procesador y este interactua con las memorias, etcetcetc.
ahora cual es ese pasaje del compilador a cero y unos como es, es estandar osea por ejemplo yo ago un programa en c y dentro de este hay funciones ejemplo do while esta funcion el interprete o compilador como la pasa a ceros y unos con otra funcion, osea dice do=0011101 por ejemplo
while= 111000111, ejemplo, direccion 0111100101 al micro a la alu por ejemplo, es asi donde puedo sacar informacion o que libro debo consultar.
muchas gracias.

29 Marzo, 2009, 09:11 pm
Respuesta #1

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,797
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
No, no es estándar el proceso de compilación.
Lo que sí es estándar es el ''efecto final'' que debe producir una cierta instrucción, pero no el número de operaciones que realiza para llevarla a cabo.

Un compilador tiene dos aspectos: uno sintáctico y otro semántico.
La sintaxis es la simple verificación de que un programa está bien escrito, o sea, que respeta las reglas del lenguaje.
Esa parte sí es estándar, se puede hacer de manera sistemática.
Está explicado en el libro: Algoritmos + Estructuras de Datos = Programas, del autor Niklaus Wirth, capitulos 5 y 6 creo.

Una vez hecho esto, hay que realizar el proceso de traducción, o sea, interpretar las instrucciones con cierto significado, eso es la semántica. La implementación depende de la máquina en la cual quiera hacerse la compilación, o bien el sistema operativo en que corre el programa, etc. Hace falta tener convenciones de la plataforma en donde el programa ha de correr, y además, depende de las intenciones del diseñador del compilador, si desea que el compilador sea eficiente, rápido, o que cumpla ciertos requisitos.

A lo mejor hay convenciones estandarizadas, pero creo que este proceso no puede sistematizarse.
Y no conozco bibliografía al respecto.

Otro enfoque sería visualizar la computadora, con su memoria y su procesador como un objeto, y tratar de hacer programación orientada a objetos que comunique al objeto programa fuente con el objeto PC...

Si este enfoque no te gusta (que es muy posible), lo que yo haría sería un pre-compilador, o sea, algo que traduzca tu programa de alto nivel a uno de más bajo nivel.
Por ejemplo, pasar de C++ a un programa en C.

El C es un lenguaje casi de bajo nivel, está muy cerca del modo en que funciona la máquina.
Uno puede estudiar con más facilidad como es el manejo de la memoria, los punteros, las pilas de datos para almacenar funciones, etc.

Y simplemente tendrías que traducir un archivo de texto (el fuente en C++) en otro archivo de texto (el fuente en C).
La ventaja de esto es que las convenciones de C están en los libros, está estandarizado, etc.
Sería una especie compilación, aunque no directa, sino una mera traducción de un lenguaje a otro.

Luego se podría pasar del lenguaje C a algún lenguaje más simple, digamos D, que podrías inventar vos, y que solamente se encargue del manejo de punteros, pilas, y reservar memoria para operaciones de punteros.
Eso ya sería una programación en muy bajo nivel.

Luego, restaría hacer un compilador, que pase del lenguaje sencillo D al lenguaje Ensamblador.
Este lenguaje es casi ya de la máquina, pero todavía puede editarse como archivo de texto, y se pueden poner comentarios, además de que los registros de la máquina son legibles, así como las instrucciones de salto, y las posiciones de memoria.
Debieras conseguirte un manual de Ensamblador moderno, que contenga las instrucciones para los procesadores modernos.

Por último, habría que hacer el compilador definitivo de Ensamblador a lenguaje de máquina, y esto es traducir las instrucciones de Ensamblador a sus equivalentes hexadecimales.
Esto debiera figurar en algún manual de procesadores Intel, o AMD, puesto que se trata de una traducción directa.

Esta compìlación en etapas sucesivas podrían implementarse en un solo programa, que a simple vista sería un solo compilador que lleve de tu programa original a la máquina.

Creo que la traducción directa de un lenguaje de alto nivel a lenguaje de máquina es algo muy complicado, y que puede traer muchos dolores de cabeza, pero a lo mejor haya técnicas, las cuales yo no conozco en absoluto.




29 Marzo, 2009, 10:35 pm
Respuesta #2

Jabato

  • Visitante
De todas formas cabe decir que los sistemas operativos, Dos, Windows, Linux, etc, suelen incorporar sus propias rutinas que facilitan la programación, son las famosas interrupciones, que pueden ser llamadas por los programas escritos en lenguaje de alto nivel, de forma que un programa escrito en un lenguaje cualquiera, por ejemplo Visual Basic, puede llamar a una interrupción de Windows ó a una interrupción del propio PC, que tambien las tiene, estas llamadas ejecutan rutinas preprogramadas que vienen incorporadas con el sistema ó con el PC, por ejemplo escritura  ó lectura de disco y otras muchas, rutinas que ya están escritas en código máquina y que el microprocesador ejecuta muy rapidamente. Yo las he usado y son muy útiles, sirven lo mismo para controlar el mouse como para leer ó escribir el disco, ó en la memoria, ó incluso controlar los puertos, aunque para conocer cuales son y como trabajan es necesario acudir a los manuales para programadores, donde tienes el detalle de cada una, como llamarlas y que es lo que hacen. Tambien es posible diseñar uno mismo sus propias interrupciones e instalarlas en la memoria del PC y llamarlas cada vez que se necesiten, aunque eso ya es trabajo de virtuosos, pero puede hacerse, de hecho los sistemas operativos hacen exactamente eso, instalan sus propias rutinas en la memoria y las llaman cada vez que las necesitan. En Basic por ejemplo los comandos "Call" y "Call Interrupt" sirven para llamar a estas rutinas instaladas en la memoria y escritas en código máquina directamente.

Saludos, Jabato. ;D