domingo, 4 de noviembre de 2007

GCC

Etapas de la compilación:

  • Preprocesado

  • Compilación

  • Ensamblado

  • Enlazado

Si tienes problemas al compilar en Ubuntu 7.04 posiblemente te falte la librería build-essential que tendrás que instalarlo desde el synaptic

Compilación directa:

$ gcc hello.c -o hello
$ ./hello
¡Hola, Mundo!

La primera orden le dice al gcc que compile y enlace el archivo fuente hello.c, generando el ejecutable indicado por el argumento -o hello. La segunda orden ejecuta el programa, obteniéndose como resultado la tercera línea.

Varias cosas han pasado sin darnos cuenta. Lo primero que ha hecho gcc es manda al preprocesador (cpp) el fichero hello.c para expandir macros e incluir el contenido de los archivo #included. Seguido, se compila el código preprocesado en código objeto, para finalmente el linkador (ld) crea el hello binario.

Veamos este proceso paso a paso. Si usamos la opción -E paramos el proceso justo después de realizarse la precompilación:

$ gcc -E hello.c -o hello.i

Podemos observar en el fichero hello.i el resultado del preprocesado, con el fichero stdio.h incrustado dentro de él. Continuando con el proceso, usaremos la opción -c para parar despúes de realizar la compilación.

$ gcc -c hello.i -o hello.o

Ya tan sólo queda enlazar el fichero objeto con las librerías del sistema para generar el ejecutable:

$ gcc hello.o -o hello

Para saber el punto de arranqu gcc se fija en la extensión del archivo de entrada.. Las extensiones más comunes reconocidas por gcc son:

Extensión

Tipo

.c
.C,.cc
.i
.ii
.S,.s
.o
.a,.so

Código fuente Lenguaje C
Código fuente Lenguaje C++
Código fuente C Preprocesado
Código fuente C++ Preprocesado
Código fuente Lenguaje Ensamblador
Código objeto compilado
Código de librería compilado

Aunque lo normal es crear un ejecutable a partir del código fuente, a veces resulta conveniente parar el proceso en un punto determinado. Un caso habitual es cuando queremos obtener el código objeto para integrarlo en una librería, por lo que no es necesario la etapa de enlace. Otro caso cuando queremos obtener el código del precompilado para chequear algún conflicto que tengamos entre los archivos includes y nuestro código.

La mayor parte de los programas de C se generan partiendo de varios fuentes, códigos objeto y librerías. gcc tomará los ficheros que le damos de entrada, los procesará convenientemente, y los enlaza para generar un único ejecutable. Para facilitar esta tarea se suele utilizar la utilidad make.

Opciones comunes de la línea de comandos

La lista de opciones ocuparía varias páginas, por lo que sólo veremos las opciones más comunes:

Opción

Descripción

-o

Nombre del archivo de salida. Si no se especifica al generar el ejecutable, el nombre por defecto será a.out

-c

Compilar sin enlazar

-DMAC=VAL

Define el macro MAC y le asigna el valor VAL

-IDIR

Sitúa el directorio DIR delante de la lista de directorios dónde buscar los ficheros includes.

-LDIR

Sitúa el directorio DIR delante de la lista de directorios dónde buscar las librerías.

-static

Enlaza con librerías estáticas. Por defecto enlaza las librerías dinámicamente.

-lFICH

Enlaza con la librería libFICH

-g

Incluye información estándar para depurado

-ggdb

Incluye información específica para el depurador gdb

-O

Optimiza el código compilado

-ON

Especifica un nivel de optimación del código entre 0 y 3

-ansi

Soporta el C ANSI/ISO estándar

-pedantic

Emite todos los avisos requeridos por el C ANSI/ISO

-pedantic-errors

Emite todos los errores requeridos por el C ANSI/ISO

-traditional

Soporta la sintáxis Kernighan & Ritchie del lenguaje C

-w

Suprime todos los mensajes de aviso (una mala idea)

-Wall

Emite todos los avisos que el gcc pueda generar.

-werror

Convierte todos los avisos en errores, lo que parará la compilación

-MM

Crea una lista de dependencias compatible con make

-v

Muestra los comandos utilizados en cada etapa de la compilación

Un compilador cruzado es un compilador capaz de crear código ejecutable en otra plataforma distinta a aquélla en la que él se ejecuta. Esta herramienta es útil cuando quiere compilarse código para una plataforma a la que no se tiene acceso, o cuando es incómodo o imposible compilar en dicha plataforma (como en el caso de los sistemas empotrados).
Un ejemplo de un compilador con estas posibilidades es el NASM, que puede ensamblar, entre otro formatos, ELF (para sistemas UNIX) y COM o EXE (para DOS).

El conjunto de gcc, binutils y gdb permiten la generación de compiladores cruzados - compiladores que generan código para plataformas distintas en las que se ejecután.

Hace falta una cadena de compilación completa, y aparte una implementació de yacc y lex (normalmente, si se está usando una máquina Linux o el port de win32 de las utilidades GNU, cygwin), estas son bison y flex)

La terminología que se usa en las cadenas de compilación de las utilidades GNU es:

  • build host: Máquina donde se va generar el compilador cruzado. los scripts de compilación detectan automáticamente el sistema operativo donde se está intentando compilar.
  • host: Máquina donde va a ejecutarse el compilador destino, suele coincidir con la máquina donde se está compilando.
  • target: Máquina y sistema destino para el cual el va a generarse los ficheros.

Tutorial sobre el compilador GCC

The GNU Compiler Collection includes front ends for C, C++, Objective-C, Fortran, Java, and Ada, as well as libraries for these languages (libstdx++, libgcj) . Tomado de la pagina web oficial: http://gcc.gnu.org/

GCC es un compilador integrado del proyecto GNU para C, C++, Objective C y Fortran; es capaz de recibir un programa fuente en cualquiera de estos lenguajes y generar un programa ejecutable binario en el lenguaje de la máquina donde ha de correr.
La sigla GCC significa "GNU Compiler Collection". Originalmente significaba "GNU C Compiler"; todavía se usa GCC para designar una compilación en C. G++ refiere a una compilación en C++.

Sintaxis.

gcc [ opción | archivo ] ...
g++ [ opción | archivo ] ...

Las opciones van precedidas de un guión, como es habitual en UNIX, pero las opciones en sí pueden tener varias letras; no pueden agruparse varias opciones tras un mismo guión. Algunas opciones requieren después un nombre de archivo o directorio, otras no. Finalmente, pueden darse varios nombres de archivo a incluir en el proceso de compilación.

Ejemplos.

gcc hola.c
compila el programa en C hola.c, genera un archivo ejecutable a.out.
gcc -o hola hola.c
compila el programa en C hola.c, genera un archivo ejecutable hola.
g++ -o hola hola.cpp
compila el programa en C++ hola.c, genera un archivo ejecutable hola.
gcc -c hola.c
no genera el ejecutable, sino el código objeto, en el archivo hola.o. Si no s indica un nombre para el archivo objeto, usa el nombre del archivo en C y le cambia la extensión por .o.
gcc -c -o objeto.o hola.c
genera el código objeto indicando el nombre de archivo.
g++ -c hola.cpp
igual para un programa en C++.
g++ -o ~/bin/hola hola.cpp
genera el ejecutable hola en el subdirectorio bin del directorio propio del usuario.
g++ -L/lib -L/usr/lib hola.cpp
indica dos directorios donde han de buscarse bibliotecas. La opción -L debe repetirse para cada directorio de búsqueda de bibliotecas.
g++ -I/usr/include hola.cpp
indica un directorio para buscar archivos de encabezado (de extensión .h).

Sufijos en nombres de archivo.

Son habituales las siguientes extensiones o sufijos de los nombres de archivo:
.c fuente en C
.C .cc .cpp .c++ .cp .cxx fuente en C++; se recomienda .cpp
.m fuente en Objective-C
.i C preprocesado
.ii C++ preprocesdo
.s fuente en lenguaje ensamblador
.o código objeto
.h archivo para preprocesador (encabezados), no suele figurar en la linea de comando de gcc

Opciones.

- c
realiza preprocesamiento y compilación, obteniento el archivo en código objeto; no realiza el enlazado.
- E
realiza solamente el preprocesamiento, enviando el resultado a la salida estándar.
-o archivo
indica el nombre del archivo de salida, cualesquiera sean las etapas cumplidas.
-Iruta
especifica la ruta hacia el directorio donde se encuentran los archivos marcados para incluir en el programa fuente. No lleva espacio entre la I y la ruta, así: -I/usr/include
-L
especifica la ruta hacia el directorio donde se encuentran los archivos de biblioteca con el código objeto de las funciones referenciadas en el programa fuente. No lleva espacio entre la L y la ruta, así: -L/usr/lib
-Wall
muestra todos los mensajes de error y advertencia del compilador, incluso algunos cuestionables pero en definitiva fáciles de evitar escribiendo el código con cuidado.
-g
incluye en el ejecutable generado la información necesaria para poder rastrear los errores usando un depurador, tal como GDB (GNU Debugger).
-v
muestra los comandos ejecutados en cada etapa de compilación y la versión del compilador. Es un informe muy detallado.

Etapas de compilación.

El proceso de compilación involucra cuatro etapas sucesivas: preprocesamiento, compilación, ensamblado y enlazado. Para pasar de un programa fuente escrito por un humano a un archivo ejecutable es necesario realizar estas cuatro etapas en forma sucesiva. Los comandos gcc y g++ son capaces de realizar todo el proceso de una sola vez.

Preprocesado.

En esta etapa se interpretan las directivas al preprocesador. Entre otras cosas, las variables inicializadas con #define son sustituídas en el código por su valor en todos los lugares donde aparece su nombre.

Usaremos como ejemplo este sencillo programa de prueba, circulo.c:

/* Circulo.c: calcula el área de un círculo.
Ejemplo para mostrar etapas de compilación.
*/
#define PI 3.1416

main()
{
float area, radio;

radio = 10;
area = PI * (radio * radio);
printf("Circulo.\n");
printf("%s%f\n\n", "Area de circulo radio 10: ", area);

}

El preprocesado puede pedirse con cualquiera de los siguientes comandos; cpp alude específicamente al preprocesador.
$ gcc -E circulo.c > circulo.pp
$ cpp circulo.c > circulo.pp
Examinando circulo.pp
$ more circulo.pp
puede verse que la variable PI ha sido sustituída por su valor, 3.1416, tal como había sido fijado en la sentencia #define.

Compilación.

La compilación transforma el código C en el lenguaje ensamblador propio del procesador de nuestra máquina.

$ gcc -S circulo.c
realiza las dos primeras etapas creando el archivo circulo.s; examinándolo con
$ more circulo.s
puede verse el programa en lenguaje ensamblador.

Ensamblado.

El ensamblado transforma el programa escrito en lenguaje ensamblador a código objeto, un archivo binario en lenguaje de máquina ejecutable por el procesador.

El ensamblador se denomina as:
$ as -o circulo.o circulo.s
crea el archivo en código objeto circulo.o a partir del archivo en lenguaje ensamblador circulo.s. No es frecuente realizar sólo el ensamblado; lo usual es realizar todas las etapas anteriores hasta obtener el código objeto así:
$ gcc -c circulo.c
donde se crea el archivo circulo.o a partir de circulo.c. Puede verificarse el tipo de archivo usando el comando
$ file circulo.o
circulo.o: ELF 32-bit LSB relocatable, Intel 80386, version 1, not stripped

En los programas extensos, donde se escriben muchos archivos fuente en código C, es muy frecuente usar gcc o g++ con la opción -c para compilar cada archivo fuente por separado, y luego enlazar todos los módulos objeto creados. Estas operaciones se automatizan colocándolas en un archivo llamado makefile, interpretable por el comando make, quien se ocupa de realizar las actualizaciones mínimas necesarias toda vez que se modifica alguna porción de código en cualquiera de los archivos fuente.

Enlazado

Las funciones de C/C++ incluídas en nuestro código, tal como printf() en el ejemplo, se encuentran ya compiladas y ensambladas en bibliotecas existentes en el sistema. Es preciso incorporar de algún modo el código binario de estas funciones a nuestro ejecutable. En esto consiste la etapa de enlace, donde se reúnen uno o más módulos en código objeto con el código existente en las bibliotecas.

El enlazador se denomina ld. El comando para enlazar
$ ld -o circulo circulo.o -lc
ld: warning: cannot find entry symbol _start; defaulting to 08048184
da este error por falta de referencias. Es necesario escribir algo como
$ ld -o circulo /usr/lib/gcc-lib/i386-linux/2.95.2/collect2 -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o circulo /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/gcc-lib/i386-linux/2.95.2/crtbegin.o -L/usr/lib/gcc-lib/i386-linux/2.95.2 circulo.o -lgcc -lc -lgcc /usr/lib/gcc-lib/i386-linux/2.95.2/crtend.o /usr/lib/crtn.o
para obtener un ejecutable.

El uso directo del enlazador ld es muy poco frecuente. En su lugar suele proveerse a gcc los códigos objeto directamente:
$ gcc -o circulo circulo.o
crea el ejecutable circulo, que invocado por su nombre
$ ./circulo
Circulo.
Area de circulo radio 10: 314.160004
da el resultado mostrado.

Todo en un solo paso.

En programa con un único archivo fuente todo el proceso anterior puede hacerse en un solo paso:
$ gcc -o circulo circulo.c
No se crea el archivo circulo.o; el código objeto intermedio se crea y destruye sin verlo el operador, pero el programa ejecutable aparece allí y funciona.

Es instructivo usar la opción -v de gcc para obtener un informe detallado de todos los pasos de compilación:
$ gcc -v -o circulo circulo.c

Enlace dinámico y estático.

Existen dos modos de realizar el enlace:
- estático: los binarios de las funciones se incorporan al código binario de nuestro ejecutable.
- dinámico: el código de las funciones permanece en la biblioteca; nuestro ejecutable cargará en memoria la biblioteca y ejecutará la parte de código correspondiente en el momento de correr el programa.
El enlazado dinámico permite crear un ejecutable más chico, pero requiere disponible el acceso a las bibliotecas en el momento de correr el programa. El enlazado estático crea un programa autónomo, pero al precio de agrandar el tamaño del ejecutable binario.

Ejemplo de enlazado estático:
$ gcc -static -o circulo circulo.c
$ ls -l circulo
-rwxr-xr-x 1 victor victor 237321 ago 4 11:24 circulo
Si no se especifica -static el enlazado es dinámico por defecto.

Ejemplo de enlazado dinámico:

$ gcc -o circulo circulo.c
$ ls -l circulo
-rwxr-xr-x 1 victor victor 4828 ago 4 11:26 circulo


Notar la diferencia en tamaño del ejecutable compilado estática o dinámicamente. Los valores pueden diferir en algo de los mostrados; dependen de la plataforma y la versión del compilador.

El comando ldd muestra las dependencias de bibliotecas compartidas que tiene un ejecutable:

$ gcc -o circulo circulo.c
$ ldd circulo
libc.so.6 => /lib/libc.so.6 (0x40017000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
$ gcc -static -o circulo circulo.c
$ ldd circulo
statically linked (ELF)
La compilación estática no muestra ninguna dependencia de biblioteca.

Resumen.

Para producir un ejecutable con fuente de un solo archivo:
$ gcc -o circulo circulo.c
Para crear un módulo objeto, con el mismo nombre del fuente y extensión .o:
$ gcc -c circulo.c
Para enlazar un módulos objeto:
$ gcc -o circulo circulo.o
Para enlazar los módulos objeto verde.o, azul.o, rojo.o, ya compilados separadamente, en el archivo ejecutable colores:
$ gcc -o colores verde.o azul.o rojo.o

Información adicional.

Sobre GCC:
man gcc
info gcc
página info de GCC, más completa y actualizada que la página man.

Sobre el depurador:
man gdb
info gdb
página info de GDB, más completa y actualizada que la página man.

Sobre uso de info:
info info
ofrece un tutorial paso a paso.
GNU info
un resumen de operación de info.




jueves, 4 de octubre de 2007

Super Basico

Construir el Código.

Regularmente cuando se trabaja a distancia con personas en diferente partes del mundo se hace primero el diagrama de flujo, el pseudocódigo y por ultimo el código fuente, todo esto por que no todos hablan tu idioma y este es el lenguaje universal del desarrollo de software.

sintaxis básica de C++ y los conceptos de construcción de programas suficientes para permitirle crear y ejecutar cualquier programa simple orientado a objetos. En el siguiente capítulo cubriremos la sintaxis básica de C y C++ en detalle. Todos los lenguajes de programación son traducidos de algo que suele ser fácilmente entendible por una persona (código fuente) a algo que es ejecutado por una computadora (código máquina). Los traductores tradicionalmente han sido divididos en dos categorías: intérpretes y compiladores.



BIBLIOTECAS EN PROGRAMACIÓN

En Informática(computación), una biblioteca es un conjunto de procedimientos y funciones (subprogramas) agrupadas en un archivo con el fin de que puedan aprovecharlas otros programas. Al proceso de hacer accesibles estos subprogramas al programa principal se le llama enlace (link).

Existen dos tipos de bibliotecas:

Las primeras se enlazan —o sea, arreglan las referencias a rutinas en el programa para que apunten a su localización en la biblioteca— en el momento de compilacióntiempo de ejecución. (en rigor en la fase de enlace de la construcción del programa objeto), mientras que las segundas se enlazan en

La denominación de biblioteca compartida hace énfasis en que, comúnmente, los procesos que la enlazan comparten una única parte de la memoria donde se encuentran las instrucciones de los subprogramas.

En Windows, archivos de bibliotecas dinámicas poseen extensión. DLL (Dynamic Link Library), mientras que las estáticas generalmente terminan en. LIB. En Unix y Linux, las bibliotecas dinámicas tienen extensión .so (Shared Object) y las estáticas .a (archive).

Nota terminológica

Habitualmente se emplea el término librería para referirse a una biblioteca, por la similitud con el original inglés library. Ambos términos, biblioteca y librería, son correctos según las definiciones ( [1], [2]) de la RAE, aunque los puristas consideran como correcta biblioteca. Esto se debe a que la traducción correcta de library es biblioteca, mientras que el término inglés para librería es book shoptienda de libros), aunque también podría ser bookshelf (estantería o mueble para guardar libros, librería). También es habitual referirse a ella con el término de origen anglosajón toolkit (conjunto, equipo, maletín, caja, estuche, juego (kit) de herramientas).

Aquí se muestra un contenido de las bibliotecas en Linux


En lenguaje C++ hay algunas bibliotecas


stdio.h


Que significa "standard input-output header" (cabecera estandar E/S), es en la librería estándar del lenguaje de programación C el archivo de cabecera que contiene las definiciones de macros, las constantes, las declaraciones de funciones y la definición de tipos usados por varias operaciones estándar de entrada y salida. Por motivos de compatibilidad, el lenguaje de programación C++ (derivado de C) también tiene su propia implementación de estas funciones, que son declaradas con el archivo de cabecera cstdio.
Las funciones declaradas en stdio.h son sumamente populares.

Funciones miembro
Las funciones declaradas en stdio.h pueden clasificarse en dos categorías: funciones de manipulación de ficheros y funciones de manipulación de entradas y salidas.

fclose, fopen, freopen, fdopen, remove, rename, rewind, tmpfile, clearerr, feof, ferror, fflush, fgetpos, getc, fgets, fputc, fputs, ftell, fseek, fsetpos, fread, fwrite, getc, getchar, gets, printf, fprintf, sprintfsnprintf, vprintf, perror, putc, putchar, fputchar, scanf, fscanf, sscanf, vfscanf, vscanf, vsscanf, setbuf, setvbuf, tmpnam, ungetc, puts

stdlib.h
Para usar todas las funciones de ésta biblioteca se debe tener la siguiente directiva
#include
Las funciones de la biblioteca pueden ser agrupadas en tres categorías básicas:
· Aritméticas;
· Números aleatorios; y
· Conversión de cadenas.
El uso de todas las funciones es sencillo. Se consideran dentro del capítulo en forma breve

atof, atoi, atol, strtod, strtol, strtoul, rand, srand, malloccallocrealloc, free, abort, abnormally, atexit, callback, exit, getenv, system, bsearch, qsort, abslabs, absolute value, divldiv.

conio.h
Declara varias funciones usadas llamando la consola del sistema operativo las rutinas de I/O.
Funciones disponibles:
cgets, clreol, clrscr, cprintf, cputs, cscanf, delline, getch, getche, getpass, gettext, gettextinfo, gotoxy, highvideo, inport, insline, kbhit, lowvideo, movetext, normvideo, outport, putch, puttext, textattr, textbackground, textcolor, textmode, ungetch, wherex, wherey, window, _setcursortype,

math.h
Funciones disponibles:
acos, asin, atan, atan2, ceil, cos, cosh, exp, fabs, floor, fmod, frexp, ldexp, log, log10, modf, pow, sin, sinh, sqrt, tan, tanh,

C / string.h
Funciones disponibles:
memchr, memcmp, memcpy, memmove, memset, strcat, strchr, strcmp, strcoll, strcpy, strcspn, strerror, strlen, strncat, strncmp, strncpy, strpbrk, strrchr, strspn, strstr, strtok, strxfrm,


INSTALACIÓN Dev-C++

PARA INSTALAR EL COMPILADOR SIGAN LAS SIGUIENTES INSTRUCCIONES:

1. ENTRAR A LA PAGINA SIGUIENTE:
http://sourceforge.net/project/downloading.php?groupname=dev-cpp&filename=devcpp-4.9.9.2_setup.exe&use_mirror=easynews

2. DESCARGAR LA VERSIÓN:
Dev-C++ 5.0 beta 9.2 (4.9.9.2)

3. SEGUIR LAS INSTRUCCIONES.

4. ABRIR EL ARCHIVO (SI APARECE ALGUN TEXTO AL ABRIR EL ARCHIVO, SELECCIONAR TODO Y BORRAR EL TEXTO). ¡LISTO!

PARA CORRER UN PROGRAMA SIGAN LAS SIGUIENTES INSTRUCCIONES:

1. ESCRIBIR EL CÓDIGO:

#include<>
#include<>

main()
{
printf("HOLA MUNDO");
getch();
return 0;
}


NOTEN QUE COLOQUÉ getch(); Y LA BIBLIOTECA conio.h YA QUE ESTE COMPILADOR NECESITA HACER UNA PAUSA PARA MOSTRAR RESULTADOS.

ADEMÁS QUITE LA PALABRA void Y COLOQUÉ return 0; YA QUE ESTE COMPILADOR NO RECONOCE void.
SI UTILIZAN BORLAND C++ PUEDEN USAR void O return 0; SIN NINGÚN PROBLEMA.

3. GUARDAR EL ARCHIVO.

4. COMPILAR: DANDO CLIC EN EJECUTAR>COMPILAR O CON Ctrl + F9.

5. EJECUTAR: DANDO CLIC EN EJECUTAR>EJECUTAR O CON Ctrl + F10.

* O PUDEN COMPILAR Y EJECUTAR SOLO CON F9

6. EN CASO DE ERRORES: CORREGIR, COMPILAR Y EJECUTAR DE NUEVO.

¿CÓMO COMPILAR EN LINUX?

PARA COMPILAR Y EJECUTAR DESDE "GCC" SE DEBE HACER LO SIGUIENTE:

1. Ir a la carpeta en donde esta el archivo fuente.
2. DAR Clic con el botón secundario.
3. Actions.
4. Open terminal here.
5. Teclear gcc[nombre del archivo].c
6. Teclear a.out

para utilizar gcc, suministra un nombre de archivo fuente de C y utilice la opcion -o para especificar el nombre del archivo de salida. gcc preprocesará, compilará, ensamblara y vinculará (link) el programa, generando un archivo ejecutable, a menudo denominado binario. La sintaxis más simple se ilustra aquí:

gcc archivo_entrada.c [-o archivo_salida].

El archivo_entrada.c es un archivo de código fuente en C y -o establece que el nombre del archivo de salida será archivo_salida. Los corchetes([ ])indican a los argumentos opcionales. si el nombre del archivo de salida no se espesifica, gcc lo denominara a.out como opcion predeterminada.

EJEMPLO


/*Nombre del programa: hello.c*/

/*hola.c - programa canónico "¡hola,mundo!"

*/

#incluide

int main(void)

{

puts("¡piensa en linux y seras libre!");



retur 0;

}

para compilar y correr este programa, teclee

$ gcc hola.c -o hola

si todo salio bien, gcc realizara su trabajo en silencio y luego regresa a la señal de peticion de comandos del sistema operativo. gcc compila y linkea el archivo fuente hola.c, creando el archivo que fue especificado mediante el argumento -o, osea hola.

En Linux hay unos programitas muy secillo que te permiten hacer diagrams de flujo que son VCG y Xfig

posteriormente tratare de especificar detalladamente varios ejercicios súper básicos, comenzando desde el diagrama de flujo, pseudocódigo y código.

sábado, 29 de septiembre de 2007

Progamacion

Publicare una de las formas posibles de programación básica, programación básica en paralelo y programación básica con algoritmos y métodos numéricos . Posteriormente se publicará una programación avanzado con un núcleo de UNIX (opensolaris) aplicando todo lo que se ha aprendido con la finalidad de hacer un sistema.

Por favor agradecería que me comentaran si no le entienden para publicarlo mas detallado.

Gracias por su atención y comprensión




Aristóteles diría: “no somos Griegos ningunos atenienses, nosotros somos ciudadanos del mundo.”


1.- Algoritmos Estructura de datos (Lenguaje C)
2.- Programación Estructurada (Lenguaje C)
3.- Estructura y Programación de computadoras (Lenguaje C++)
4.- Programación Orientada a Objetos (Lenguaje C++)
5.- Programación Avanzada y Métodos Numéricos (Lenguaje C++)
6.- Diseño de sistemas Digitales
7.- Sistemas Operativos
8.- Bases de Datos
9.- Microprocesadores
10.- Compiladores


SÚPER BÁSICO

COMPILADOR

Es un programa informático que traduce un programa escrito en un lenguaje de programación a otro lenguaje de programación, a este progreso de traducción se le llama compilación. generando un programa equivalente que la maquina será capaz de interpretar. Este proceso se le conoce como compilación .

Se divide en dos parte:

Front End: es la parte que analiza el código fuente, comprueba su validez, genera el árbol de derivación y rellena los valores de la tabla de símbolos.

Back End: Es la parte que genera el código máquina, específico de una plataforma, a partir de los resultados de la fase de análisis, realizada por el front End.

Tipos de compilación:

Compiladores Cruzados: generan código para un sistema distinto del que están funcionando

Compiladores optimizadores: realizan cambios en el código para mejorar su eficiencia pero manteniendo la funcionalidad del programa original.

Compiladores Optimizadores: realizan cambios en el código para mejorar su eficiencia pero manteniendo la funcionalidad del programa original.

compiladores de una sola pasada: generan el código máquina a partir de una única lectura del código fuente.

Compiladores de varias pasadas: necesitan leer el código fuente varias veces antes de poder producir el código máquina.

Compilador Jit: forma parte de un intérprete y compilan partes del código según se necesitan.



EDITOR DE TEXTO

U
n editor de texto es un programa que permite escribir y modificar archivos digitales compuestos únicamente por texto sin formato, conocidos comúnmente como archivos de texto.

Se distinguen de los procesadores de textos en que se usan para escribir sólo texto, sin formato y sin imágenes.
Hay una gran variedad de editores de texto. Algunos son de uso general, mientras que otros están diseñados para escribir o programar en un lenguaje. Algunos son muy sencillos, mientras que otros tienen implementadas gran cantidad de funciones.
El archivo creado por un editor de texto incluye por convención en DOS y Microsoft Windows la extensión .txt, aunque pueda ser cambiada a cualquier otra con posterioridad. El formato hoy en día es comúnmente de 7- o 8-bits en ASCII o UTF-8, rara vez EBCDIC.
Al trasladar archivos de texto de un sistema operativo a otro se debe considerar que existen al menos dos convenciones diferentes para señalar el término de una linea: Unix y Linux usan sólo retorno de carro en cambio Microsoft Windows usa al término de cada línea retorno de carro y salto de línea.


Editor de texto en Linux

Editor de texto en windows


PARESEO

(Parcing). Proceso de analizar una secuencia de símbolos a fin de determinar su estructura gramatical con respecto a una gramática formal dada. Formalmente es llamado análisis de sintaxis. Un parseador (parser) es un programa de computación que lleva a cabo esta tarea.

El parseo transforma una entrada de texto en una estructura de datos (usualmente un árbol) que es apropiada para ser procesada. Generalmente los parseadores primero identifican los símbolos de la entrada y luego construyen el árbol de parseo para esos símbolos.



DEPURADOR

Un depurador (en inglés, debugger), es un programa que permite depurar o limpiar de errores otro programa informático.

Uso

Al iniciarse la depuración, el depurador lanza el programa a depurar. Éste se ejecuta normalmente hasta que el depurador detiene su ejecución, permitiendo al usuario examinar la situación.

El depurador permite detener el programa en:

  • Un punto determinado mediante un punto de ruptura.
  • Un punto determinado bajo ciertas condiciones mediante un punto de ruptura condicional.
  • Un momento determinado cuando se cumplan ciertas condiciones.
  • Un momento determinado a petición del usuario.

Durante esa interrupción, el usuario puede:

  • Examinar y modificar la memoria y las variables del programa.
  • Examinar el contenido de los registros del procesador.
  • Examinar la pila de llamadas que han desembocado en la situación actual.
  • Cambiar el punto de ejecución, de manera que el programa continúe su ejecución en un punto diferente al punto en el que fue detenido.
  • Ejecutar instrucción a instrucción.
  • Ejecutar partes determinadas del código, como el interior de una función, o el resto de código antes de salir de una función.

El depurador depende de la arquitectura y sistema en el que se ejecute, por lo que sus funcionalidades cambian de un sistema a otro. Aquí se han mostrado las más comunes.

Información de depuración

Para poder aprovechar todas las posibilidades de depuración es necesario que, al compilar el programa a depurar, se indique al compilador que debe incluir instrucciones e información extra para la depuración del código. Dicha información extra consiste básicamente en la correspondencia entre las instrucciones del código ejecutable y las instrucciones del código fuente que las originan, así como información sobre nombres de variables y funciones.

Aún si no se incluye esta información de depuración, sigue siendo posible monitorizar la ejecución del programa. Sin embargo, resultará más difícil y compleja debido a esa falta de información del contexto en el que se ejecuta el programa.

Otros usos

Un depurador también puede usarse para realizar ingeniería inversa o evitar protecciones de copia. Mediante el uso del depurador se puede conocer el funcionamiento interno del programa examinado, ayudando al proceso de ingeniería inversa o permitiendo desarrollar técnicas para evadir las restricciones impuestas por el programa.

Efectos secundarios

Es importante notar que un programa que está siendo depurado puede presentar un comportamiento diferente a si se ejecuta en solitario debido a que el depurador cambia ligeramente los tiempos internos del programa. Estos cambios en los tiempos de ejecución afectan especialmente a sistemas complejos multihebra o sistemas distribuidos.

Ejemplos de depuradores

Véase también

DDD es un interfaz gráfico para el depurador gdb. La principal ventaja de ddd es la facilidad para mostrar los contenidos de las posiciones de memoria durante la ejecución de nuestro programa.


si abrimos la página (o un formulario del CRM) que contenga código JavaScript que ejecute la sentencia debugger, se nos mostrará un diálogo ofreciéndonos inicar la depuración. Si tenemos instalado Visual Studio nos dará la opción de utilizarlo como depurador para esa web



LIGADOR


Un ligador es un programa de sistema que combina dos o mas programas objeto separados y permite que se hagan referencias unos a otros, o sea, que cada uno de estos programas pueden hacer referencia a código ó variables de los otros programas con los que está enlazado.
En muchos programas el cargador hace la labor del programa de enlace, por que existe solo un "linking loader" y no existe programa de enlace independiente. Es importante señalar que no se necesita un programa de enlace ni un cargador separado para cada traductor en el sistema, ya que estos programas trabajan con el programa objeto, sin importar el lenguaje fuente. Por otro lado es importante que cada compilador o ensamblador produzca el programa objeto usando el mismo formato. Cada programa objeto es un archivo de récord.



CÓDIGO FUENTE

El código fuente puede definirse:

  • Un conjunto de líneas que conforman un bloque de texto, escrito según las reglas sintácticas de algún lenguaje de programación destinado a ser legible por humanos.
  • Un Programa en su forma original, tal y como fue escrito por el programador, no es ejecutable directamente por el computador, debe convertirse en lenguaje de maquina mediante compiladores, ensambladores o intérpretes.

Normalmente está destinado a ser traducido a otro código, llamado código objeto, ya sea lenguaje máquina nativo para ser ejecutado por una computadora o bytecode para ser ejecutado por un intérprete.

Este proceso se denomina compilación y permite la realización de programas.

El proceso de formateado del código fuente para ayudar a su legibilidad se denomina estilo de programación.

Ejemplo pagina web Siladin


Este es uno de los códigos fuente que tienen las paginas web


INTERPRETE DE COMANDOS

Línea de comandos, Intérprete de mandatos, Intérprete de línea de mandatos, Intérprete de comandos, Terminal, Consola, Shell ó su acronimo en inglés CLI por Command line interface, es un programa informático que actúa como Interfaz de usuario para comunicar al usuario con el sistema operativo mediante una ventana que espera comandos textuales ingresados por el usuario en el teclado, los interpreta y los entrega al sistema operativo para su ejecución. La respuesta del sistema operativo es mostrada al usuario en la misma ventana. A continuación, la shell queda esperando más instrucciones. Se interactúa con la información de la manera más simple posible, sin gráficas, solo el texto crudo.

Por extensión también se llama Intérprete de comandos a algunas interfaces de programas (mayores) que comunican al usuario con el software o al Cliente (informática) de un Servidor, como por ejemplo, bancos de datos (MySQL, Oracle) u otros programas (openSSL, FTP) etc.

Dada la importancia de esta herramienta, existe ya desde los comienzos de la computación. Existen para diversos sistemas operativos, diversos hardware, con diferente funcionalidad. Suelen incorporar características tales como control de procesos, redirección de entrada/salida, listado y lectura de ficheros, protección, comunicaciones y un lenguaje de órdenes para escribir programas por lotes o (scripts o guiónes).

Es posible que un sistema operativo tenga varios intérpretes de comandos, es más, la visión lógica de un sistema operativo cambia según el intérprete de comandos usado. Ejemplo: Win32 sobre Windows o POSIX sobre LINUX.

Casi cualquier programa puede diseñarse para ofrecer al usuario alguna clase de Intérprete de comandos. Por ejemplo, casi todos los juegos de PC en primera persona tienen un Intérprete de comandos incorporada, utilizada para diagnostico y labores administrativas.

Su contraparte es la Interfaz gráfica de usuario que ofrece una estética mejorada a costa de mayor consumo de recursos computacionales, una mayor vulnerabilidad por complejidad y , en general, una reducción en la funcionalidad ofrecida.




como podemos ver la Konsola interactúa como interprete

PSEUDOCÓDIGO

Un pseudocódigo (falso lenguaje), es una serie de normas léxicas y gramaticaleslenguajes de programación, pero sin llegar a la rigidez de sintaxis de estos ni a la fluidez del lenguaje coloquial. Esto permite codificar un programa con mayor agilidad que en cualquier lenguaje de programación, con la misma validez semántica, normalmente se utiliza en las fases de análisis o diseño de Software, o en el estudio de un algoritmo. Forma parte de las distintas herramientas de la ingeniería de software. parecidas a la mayoría de los

No hay ningún compilador o intérprete de pseudocódigo informático (en el caso de que lo hubiera serían los lectores de dicho pseudocódigo informatico, por ej. una idea de un jefe de programación a el staff de programadores), y por tanto no puede ser ejecutado en un ordenador, pero las similitudes con la mayoría de los lenguajes informáticos lo hacen fácilmente convertible.

El pseudocódigo describe un algoritmo utilizando una mezcla de frases en lenguaje común, instrucciones de programación y palabras clave que definen las estructuras básicas. Su objetivo es permitir que el programador se centre en los aspectos lógicos de la solución a un problema.

No siendo el pseudocódigo un lenguaje formal, varían de un programador a otro, es decir, no hay una estructura semántica ni arquitectura estándar. Es una herramienta ágil para el estudio y diseño de aplicaciones, veamos un ejemplo, que podríamos definir como: lenguaje imperativo, de tercera generación, según el método de programación estructurada.

Pseudocódigo = Pseudo (Supuesto) + Código (Instrucción).




CÓDIGO OBJETO


Se llama código objeto en programación al código resultante de la compilacióncódigo fuente.
Consiste en lenguaje máquina o bytecode y se distribuye en varios archivos que corresponden a cada código fuente compilado.

Para obtener un programa ejecutable se han de enlazar todos los archivos de código fuente con un programa llamado enlazador (linker).


PROBLEMAS Y ALGORITMOS


Casi siempre, los humanos efectuamos cotidianamente una serie de pasos, procedimientos o acciones que nos permiten alcanzar un resultado o resolver un problema. Esta serie de pasos, procedimientos o acciones, comenzamos a aplicarlos muy temprano en la mañana cuando, por ejemplo, decidimos tomar n baño. Posteriormente cuando pensamos en desayunar también seguimos una serie de pasos que nos permiten alcanzar un resultado especifico: tomar el desayuno. La historia se repite innumerables veces durante el día.

“FORMALMENTE DEFINIMOS UN ALGORITMO COMO UN CONJUNTO DE PASOS, PROCEDIMIENTOS O ACCIONES QUE NOS PERMITEN ALCANZAR UN RESULTADO O RESOLVER UN PROBLEMA”

Supongamos que simplemente tenemos que abrir una puerta. Lo hemos hecho tantas veces que difícilmente nos ponemos a enumerar los pasos para alcanzar este objetivo. Lo haceos de manera automática. Lo mismo ocurre cuando tenemos que subir algunas escaleras etc. Esos son algoritmos las cuales programarlos o desarrollarlos es lo mas fácil, claro con la practica.


De mi parte voy hacer todo lo posible para explicarme lo mejor que se pueda, are todo lo posible por enseñarles a resolver un problema, enseñar y analizar al mismo tiempo y ha poder enseñar a pensar.

Las características que los algoritmos deben reunir son las siguientes:

PRECISION: Los pasos a seguir en el alritmo deben de ser precisados claramente.

DETERMINISO : El algoritmo, dado un conjunto de datos identicos de entrada y siempre debe arrojar los mismos resultados.

FINITUD: El algoritmo, independientemente de la complejidad del mismo, siempre debe ser longitud finita.

Tambien consta de tres secciones o modulos principales como en la figura siguiente:



DIAGRAMAS DE FLUJO

Un diagrama de flujo representa la esquematización gráfica de un algoritmo, muestra graficamente los pasos o precesos para alcanzar la solucion de un problema. Si el diagrama de flujo está completo y correcto, el paso del mismo a un lenguaje de programación es relativamente simple y directo.

Un diagrama de flujo debe ilustrar gráficamente los pasos o precesos a seguir para alcanzar la solucion de un problema. Los símbolos presentados, colocados adecuadamente, permiten crear una estructura gráfica flexible que ilustra los pasos a seguir para alcanzar un resultado específico. El diagrama de flujo facilitará mas tarde la escritura del programa en algún lenguaje de programación.


Las líneas utilizadas para indicar la dirección del flujo del diagrama deben ser rectas, verticales y horizontales, no deben de ser inclinadas y tampoco deben de cruzarse. El diagrama de flujo debe ser construido de arriba hacia abajo y de izquierda a derecha, la notación utilizada en el diagrama de flujo debe ser independiente del lenguaje de programación, la solución presentada en el diagrama puede escribirse posteriormente y fácilmente en diferentes lenguajes de programación, es conveniente poner comentarios cuando se hace una tarea compleja que expresen o ayuden hacer los que hicimos, Si el diagrama de flujo requiriera más de una hoja para su construcción, debemos utilizar los conectores adecuados y enumerar las páginas convenientes, No se puede tener mas de una linea de símbolo.


DATOS NUMERICOS

Dentro de los tipos de datos numéricos encontramos los enteros y los reales. los enteros son números que pueden estar precedidos del signo + ó - y que no tienen parte decimal (-12, -714, 784, 45 etc). Los reales son números que pueden estar precedido del signo + ó -, y que tienen parte decimal (7.5, -4.8, 1245 etc).

DATOS ALFANUMERICOS

Dentro de este tipo de datos encontramos los de tipo caracter (simple) y cadena de caracteres (estructurado). Son datos cuyos contenido pueden ser letras del abecedario (a,b,c,d...,z) digitos (0,1,2,..,9) ó simbolos especiales (#,$,*), y que van encerrados entre comillas o dobles comillas dependiendo del lengaje de programacion. Debemos remarcar que aunque este típo de datos pueden contener números, no pueden ser utilizados para realizar operaciones aritméticas. (´a´, ' b´ ,´$´,). Un datos tipo de cadena de caracteres contiene un conjunto. La longitud de una cadena depende de los lenguajes de programacion, aunque normalmente se acepte una longitud máxima de 255 ("abcde", "b", "$", "Carlos Gomez")

DATOS LIGICOS

Un tipo de datos encontramos los booleanos. Son datos que soólo pueden tomar dos valores: verdadero (true) o falso (falso)

IDENTIFICADORES, CONSTANTES Y VARIABLES.

IDENTIFICADORES.

Los datos a procesar por una computadora, ya sean simple o estructurados, deben almacenarse en casillas o celdas de mamoria para su posterior utilizacion.
Llamaremos identificador al nombre que se les da a las casillas de momoria. Un identificador se forma de acuerdo a ciertas reglas (las mismas pueden tener alguna variante dependiendo del lenguaje de promación utilizado):

CONSTANTES

Las constantes son datos que no cambian durante la ejecucion de un programa. Para nombrar las constantes que utilizamos los identificadores que mencionamos anteriormente. Puede haber constantes enteras, reales, caracter, cadena de caracter, booleanas, etc.

VARIABLES

Las variables son objeto que pueden cambiar su valor durante la ejecucion de un programa. Para nombrar las variables utilizaremos los identificadores que hemos explicado con anterioridad. Al igual que las constantes, pueden existir tipos de variables como tipos de datos.

OPERACIONES ARITMETICAS

Para poder realizar operaciones aritméticas necesitamos de operadores aritméticos. Estos operadores nos permitirán realizar operaciones aritméticas entre operandos: números, constantes o variables. El resultado de una operación aritmética sera un número.

Ejemplo:

LAS REGLAS PARA RESOLVER UNA EXPRESION ARITMETICA.

1.- Si una expresión contiene subexpresiones entre paréntesis. éstas se evaluan primero; respentando claro está la jerarquia de los operadores aritméticos en esta subexpresión. si las subexpresiones que se encuentran en el último nivel de anidamiento.

2.- Los operadores aritméticos se aplican teniendo en cuenta la jerarquía y de izquierda a derecha.

Ejemplos:

Segundo ejemplo:





Gracias.