viernes, 10 de septiembre de 2010

Shell de UNIX

Histórico

• Thompson shell (sh) -- La primel shell Unix fue escrita por Ken Thompson en Bell Labs. Distribuida con la versión 1 hasta la 6 de Unix, desde 1971 a 1975. Es considerada muy rudimentaria por los estandarés modernos y no es usada en sistemas actuales. Existen algunas partes disponibles de la misma: Ancient UNIX Systems.

• PWB shell o Mashey shell (sh) -- Una versión de la shell de Thompson, creada por John Mashey y otros, mientras estuvieron en Bell Labs. Distribuida con el Programmer's Workbench UNIX, en 1976.

Shell de UNIX

Una Shell de Unix o también shell, es el término usado en informática para referirse a un intérprete de comandos, el cual consiste en la interfaz de usuario tradicional de los sistemas operativos basados en Unix y similares como GNU/Linux. Mediante las instrucciones que aporta el intérprete, el usuario puede comunicarse con el núcleo y por extensión, ejecutar dichas órdenes, así como herramientas que le permiten controlar el funcionamiento de la computadora. Los comandos que aportan los intérpretes, pueden usarse a modo de guión si se escriben en ficheros ejecutables denominados shell-scripts, de este modo, cuando el usuario necesita hacer uso de varios comandos o combinados de comandos con herramientas, escribe en un fichero de texto marcado como ejecutable, las operaciones que posteriormente, línea por línea, el intérprete traducirá al núcleo para que las realice. Sin ser un shell estrictamente un lenguaje de programación, al proceso de crear scripts de shell se le denomina programación shell o en inglés, shell programming o shell scripting.



Link http://es.wikipedia.org/wiki/Shell_de_UNIX 







Otros tipos de shells



Categorías de shell

Pueden dividirse en cuantro categorías: tipo Bourne, tipo consola C, no tradicional e histórica.

Compatibles con Bourne shell



• Bourne shell (sh) -- Escrita por Steve Bourne, cuando estaba en Bell Labs. Se distribuyó por primera vez con la Version 7 Unix, en 1978, y se mejoró con los años.

• Almquist shell (ash) -- Se escribió como reemplazo de la shell Bourne con licencia BSD; la sh de FreeBSD, NetBSD (y sus derivados) están basados en ash y se han mejorado conforme a POSIX para la ocasión.

• Bourne-Again shell (bash) -- Se escribió como parte del proyecto GNU para proveerlo de un superconjunto de funcionalidad con la shell Bourne.

• Debian Almquist shell (dash) -- Dash es un reemplazo moderno de ash en Debian.

• Korn shell (ksh) -- Escrita por David Korn, miestras estuvo en Bell Labs.

• Z shell (zsh) -- Considerada como la más completa: es lo más cercano que existe en abarcar un superconjunto de sh, ash, bash, csh, ksh, and tcsh.

Podemos de tallar algunos

Bourne Shell (sh): Bourne Shell era la shell por defecto de la versión 7 de Unix, y sustituyó a la Thompson shell, cuyo ejecutable tenía el mismo nombre: sh. Fue desarrollado por Stephen Bourne, de los Laboratorios Bell de AT&T, y vio la luz en la versión 7 de Unix distribuida a colegios y universidades. Todavía es una shell muy popular para cuentas Unix. En la mayor parte de los sistemas Unix el programa binario de la Bourne shell o un programa compatible se encuentra en /bin/sh. Link http://es.wikipedia.org/wiki/Bourne_shell

Objetivos principales





Esquema de elementos involucrados en una línea de órdenes.

Los principales objetivos de Bourne Shell eran aprovechar dos características claves del kernel de la versión 7:

• la lista de parámetros (argumentos) mucho más larga, limitada a 8192 bytes (anteriormente 127).

• las variables de entorno. Éstas eran una nueva característica de la versión 7, que permitía pasar mucha información a los programas a través del arranque.



Bourne-Again shell: Bash es un programa informático cuya función consiste en interpretar órdenes. Está basado en la shell de Unix y es compatible con POSIX. Fue escrito para el proyecto GNU y es el intérprete de comandos por defecto en la mayoría de las distribuciones de Linux. Su nombre es un acrónimo de Bourne-Again Shell (otro shell bourne) — haciendo un juego de palabras (born-again significa renacimiento) sobre el Bourne shell (sh), que fue uno de los primeros intérpretes importantes de Unix.

Link http://es.wikipedia.org/wiki/Bourne-Again_shell











Compatibles con la shell de C

• C shell (csh) escrita por Bill Joy, mientras estuvo en la University of California, Berkeley. Se distribuyó por primera vez con BSD en 1979.

• TENEX C shell (tcsh).

C Shell: es un lenguaje de programación, conocido también como csh y que fue desarrollado por Bill Joy en la Universidad de Berkeley, California. Se le considera más idóneo para programadores que Bourne Shell (sh), además de hacer reflejar que la informática se estaba haciendo más interactiva. Hoy día, el original C Shell, no goza de un amplio uso en Unix; ha sido superado por otros Shells [1], como Tenex C Shell (tcsh) basado en el codigo original C Shell, pero incorporando finalización de nombres a ficheros, y edición a comandos de línea, comparables a Korn Shell (Ksh), y el GNU Bourne-Again Shell (Bash).

Link http://es.wikipedia.org/wiki/Csh

TENEX : tcsh es una shell de UNIX basada y compatible con C Shell (csh). Es esencialmente C Shell con mejoras y características (programables) como autocompletado de nombres y edición en línea de comandos entre otras tantas cualidades.

La "T" de tcsh, proviene de la T de TENEX, que es un sistema operativo que inspiró a Ken Greer, autor de tcsh, por su singular capacidad de autocompletado de comandos.

Ken Greer trabajó en su proyecto tcsh a finales de los años 70 en la Universidad de Carnegie Mellon. Tiempo después Paul Placeway de la Universidad de Ohio continuó el desarrollo en los años 80.

Wilfredo Sánchez (ex líder de ingenieros de Mac OS X) trabajó en tcsh a principio de los 90's en [[MIT]. Desde entonces tcsh es mantenido por numerosas personas alrededor del mundo.

En 1984, tcsh remplazó a csh como el interprete de comandos por defecto en FreeBSD, y recientemente, en Mac OS X.



Link http://es.wikipedia.org/wiki/Tcsh

Otros o exóticos

• fish, una shell amigable e interctiva , lanzada por primera vez en 2005.

• mudsh, una shell inteligente al estilo de los videojuegos que opera como un MUD.

• zoidberg, una shell modular escrita en Perl, configurada y de operación completamente en Perl.

• rc, el shell por defecto de Plan 9 from Bell Labs y Version 10 de Unix escrita por Tom Duff. Se han hecho ports para Inferno y para sistemas operativos basados en Unix.

• es shell (es), una shell compatible con RC escrita a mediados de los 90.

• scsh (Scheme Shell)

Archivos de configuración para shells

Un shell lee archivos de configuración en múltiples circunstancias bajo diferentes dependencias de la shell. Esta tabla muestra los achivos de configuración de las shells más populares:

sh ksh csh tcsh bash zsh

/etc/.login no no login login no no

/etc/csh.cshrc no no no yes no no

/etc/csh.login no no no login no no

~/.tcshrc no no no yes no no

~/.cshrc no no yes yes no no

~/.login no no login login no no

~/.logout no no login login no no

/etc/profile login login no no i.login no

~/.profile login login no no login no

~/.bash_profile no no no no login no

~/.bash_login no no no no login no

~/.bashrc no no no no n/login no

/etc/zshenv no no no no no yes

/etc/zprofile no no no no no login

/etc/zshrc no no no no no int.

/etc/zlogin no no no no no login

/etc/zlogout no no no no no login

~/.zshenv no no no no no yes

~/.zprofile no no no no no login

~/.zshrc no no no no no int.

~/.zlogin no no no no no login

~/.zlogout no no no no no login

Explicación:

• "no" significa que la shell no leerá el archivo en absoluto.

• "yes" significa que el archivo es siempre leído por el shell.

• "login" significa que el archivo es leído si la shell es una shell de sesión (loging shell).

• "n/login" significa que el archivo is leído si la shell no es una shell de sesión.

• "int." significa que un archivo es leído si es un shell interactivo.

• "i.login" significa que un archivo is leído si la shell es de sesión interactiva.













Otros o exóticos

• fish, una shell amigable e interctiva , lanzada por primera vez en 2005.

• mudsh, una shell inteligente al estilo de los videojuegos que opera como un MUD.

• zoidberg, una shell modular escrita en Perl, configurada y de operación completamente en Perl.

• rc, el shell por defecto de Plan 9 from Bell Labs y Version 10 de Unix escrita por Tom Duff. Se han hecho ports para Inferno y para sistemas operativos basados en Unix.

• es shell (es), una shell compatible con RC escrita a mediados de los 90.

• scsh (Scheme Shell)









jueves, 12 de agosto de 2010

Lenguaje C


UNIVERSIDAD NIHON GAKKO

“ESFUERZO Y DISCIPLINA PARA EL ÉXITO”



TRABAJO PRACTIVO

LENGUAJE PROGRAMACION C

TEMA:

LENGUAJE C

Prof.: Lic. Miguel Morel

Alumno: HUGO WILFRIDO JARA

Curso: INGENERIA INFORMATICA

Turno: Noche

AÑO: 2010













Introducción

Lenguaje C es un lenguaje de programación de propósito general que ofrece economía sintáctica, control de flujo y estructuras sencillas y un buen conjunto de operadores. No es un lenguaje de muy alto nivel y más bien un lenguaje pequeño, sencillo y no está especializado en ningún tipo de aplicación. Esto lo hace un lenguaje potente, con un campo de aplicación ilimitado y sobre todo, se aprende rápidamente. En poco tiempo, un programador puede utilizar la totalidad del lenguaje.

Este lenguaje ha sido estrechamente ligado al sistema operativo UNIX, puesto que fueron desarrollados conjuntamente. Sin embargo, este lenguaje no está ligado a ningún sistema operativo ni a ninguna máquina concreta. Se le suele llamar lenguaje de programación de sistemas debido a su utilidad para escribir compiladores y sistemas operativos, aunque de igual forma se puede desarrollar cualquier tipo de aplicación.

La base del C proviene del BCPL, escrito por Martin Richards, y del B escrito por Ken Thompson en 1970 para el primer sistema UNIX en un DEC PDP-7. Estos son lenguajes sin tipos, al contrario que el C que proporciona varios tipos de datos. Los tipos que ofrece son caracteres, números enteros y en coma flotante, de varios tamaños. Además se pueden crear tipos derivados mediante la utilización de punteros, vectores, registros y uniones. El primer compilador de C fue escrito por Dennis Ritchie para un DEC PDP-11 y escribió el propio sistema operativo en C.Introducción al lenguaje C (2).

La base del C proviene del BCPL, escrito por Martin Richards, y del B escrito por Ken Thompson en 1970 para el primer sistema UNIX en un DEC PDP-7. Estos son lenguajes sin tipos, al contrario que el C que proporciona varios tipos de datos. Los tipos que ofrece son caracteres, números enteros y en coma flotante, de varios tamaños. Además se pueden crear tipos derivados mediante la utilización de punteros, vectores, registros y uniones. El primer compilador de C fue escrito por Dennis Ritchie para un DEC PDP-11 y escribió el propio sistema operativo en C.

C trabaja con tipos de datos que son directamente tratables por el hardware de la mayoría de computadoras actuales, como son los caracteres, números y direcciones. Estos tipos de datos pueden ser manipulados por las operaciones aritméticas que proporcionan las computadoras. No proporciona mecanismos para tratar tipos de datos que no sean los básicos, debiendo ser el programador el que los desarrolle. Esto permite que el código generado sea muy eficiente y de ahí el éxito que ha tenido como lenguaje de desarrollo de sistemas. No proporciona otros mecanismos de almacenamiento de datos que no sea el estático y no proporciona mecanismos de entrada ni salida. Ello permite que el lenguaje sea reducido y los compiladores de fácil implementación en distintos sistemas. Por contra, estas carencias se compensan mediante la inclusión de funciones de librería para realizar todas estas tareas, que normalmente dependen del sistema operativo.

Originariamente, el manual de referencia del lenguaje para el gran público fue el librode Kernighan y Ritchie, escrito en 1977. Es un libro que explica y justifica totalmente el desarrollo de aplicaciones en C, aunque en él se utilizaban construcciones, en la definición de funciones, que podían provocar confusión y errores de programación que no eran detectados por el compilador. Como los tiempos cambian y las necesidades también, en 1983 ANSI establece el comité X3J11 para que desarrolle una definición moderna y comprensible del C. El estándar está basado en el manual de referencia original de 1972 y se desarrolla con el mismo espíritu de sus creadores originales. La primera versión de estándar se publicó en 1988 y actualmente todos los compiladores utilizan la nueva definición. Una aportación muy importante de ANSI consiste en la definición de un conjunto de librerías que acompañan al compilador y de las funciones contenidas en ellas. Muchas de las operaciones comunes con el sistema operativo se realizan a través de estas funciones. Una colección de ficheros de encabezamiento, headers, en los que se definen los tipos de datos y funciones incluidas en cada librería. Los programas que utilizan estas bibliotecas para interactuar con el sistema operativo obtendrán un comportamiento equivalente en otro sistema.

Capítulo 1.

Estructura básica de un programa en C

La mejor forma de aprender un lenguaje es programando con él. El programa más sencillo que se puede escribir en C es el siguiente:

main( )

{

}

Como nos podemos imaginar, este programa no hace nada, pero contiene la parte más importante de cualquier programa C y además, es el más pequeño que se puede escribir y que se compile correctamente. En el se define la función main, que es la que ejecuta el sistema operativo al llamar a un programa C. El nombre de una función C siempre va seguida de paréntesis, tanto si tiene argumentos como si no. La definición de la función está formada por un bloque de sentencias, que esta encerrado entre llaves {}.

Un programa algo más complicado es el siguiente:

#include <stdio.h>

main( )

{

printf("Hola amigos!\n");

}

Con el visualizamos el mensaje Hola amigos! en el terminal. En la primera línea indica que se tengan en cuenta las funciones y tipos definidos en la librería stdio (standard input/output). Estas definiciones se encuentran en el fichero header stdio.h. Ahora, en la función main se incluye una única sentencia que llama a la función printf. Esta toma como argumento una cadena de caracteres, que se imprimen van encerradas entre dobles comillas " ". El símbolo \n indica un cambio de línea.



Hay un grupo de símbolos, que son tratados como caracteres individuales, que especifican algunos caracteres especiales del código ASCII. Los más importantes son:

\a Alerta

\b Espacio atrás

\f Salto de página

\n Salto de línea

\r Retorno de carro

\t Tabulación horizontal

\v Tabulación vertical

\\ Barra invertida

\' Comilla simple

\" Comillas dobles

\OOO Visualiza un carácter cuyo código ASCII es OOO en octal


\xHHH Visualiza un carácter cuyo código ASCII es HHH en hexadecimal

Un programa C puede estar formado por diferentes módulos o fuentes. Es conveniente mantener los fuentes de un tamaño no muy grande, para que la compilación sea rápida. También, al dividirse un programa en partes, puede facilitar la legibilidad del programa y su estructuración. Los diferentes fuentes son compilados de forma separada, únicamente los fuentes que han sido modificados desde la última compilación, y después combinados con las librerías necesarias para formar el programa en su versión ejecutable.

Capítulo 2.

Tipos básicos y variables

Los tipos de datos básicos definidos por C son caracteres, números enteros y números en coma flotante. Los caracteres son representados por char, los enteros por short, int, long y los números en coma flotante por float y double. Los tipos básicos disponibles y su tamaño son:

Char Carácter (normalmente 8 bits)

Short Entero corto con signo (normalmente 16 bits)

Int Entero con signo (depende de la implementación)

Unsigned Entero sin signo (depende de la implementación)

Long Entero largo con signo (normalmente 32 bits)

Float Flotante simple (normalmente 32 bits)

Double Flotante doble (normalmente 64 bits)

La palabra unsigned en realidad es un modificador aplicable a tipos enteros, aunque si no se especifica un tipo se supone int. Un modificador es una palabra clave de C que indica que una variable, o función, no se comporta de la forma normal. Hay también un modificador signed, pero como los tipos son por defecto con signo, casi no se utiliza.

Las variables son definidas utilizando un identificador de tipo seguido del nombre de la variable. Veamos el siguiente programa:

#include <stdio.h>

main()

{

float cels, farh;

farh = 35.0;

cels = 5.0 * ( farh - 32.0 ) / 9.0;

printf("-> %f F son %f C\n", farh, cels );

}

En el programa anterior se definen dos variables float, se asigna un valora la primera y se calcula la segunda mediante una expresión aritmética. Las asignaciones en C también son una expresión, por lo que se pueden utilizar como parte de otra expresión, pero según que prácticas de este tipo no son muy recomendables ya que reducen la legibilidad del programa. En la instrucción printf, el símbolo %f indica que se imprime un número en coma flotante.

Hay un tipo muy importante que se representa por void que puede significar dos cosas distintas, según su utilización. Puede significar nada, o sea que si una función devuelve un valor de tipo void no devuelve ningún resultado, o puede significar cualquier cosa, como puede ser un puntero a void es un puntero genérico a cualquier tipo de dato. Más adelante veremos su utilización.

Capítulo 3.

Funciones

Un programa C está formado por un conjunto de funciones que al menos contiene la función main. Una función se declara con el nombre de la función precedido del tipo de valor que retorna y una lista de argumentos encerrados entre paréntesis. El cuerpo de la función está formado por un conjunto de declaraciones y de sentencias comprendidas entre llaves. Veamos un ejemplo de utilización de funciones:

#include <stdio.h>

#define VALOR 5

#define FACT 120

int fact_i ( int v )

{

int r = 1, i = 0;

while ( i <= v )

{

r = r * i;

i = i + 1;

}

return r;

}

int fact_r ( int v )

{

if ( v == 0 ) return 1;

else return v * fact_r(v-1);

}

main() {

int r, valor = VALOR;

if ( (r = fact_i(valor)) != fact_r(valor) ) printf("Codificación errónea!!.\n");

else if ( r == FACT ) printf("Codificación correcta.\n");

else printf("Algo falla!!.\n");

}

Se definen dos funciones, fact_i y fact_r, además de la función main. Ambas toman como parámetro un valor entero y devuelven otro entero. La primera calcula el factorial de un número de forma iterativa, mientras que la segunda hace lo mismo de forma recursiva.

Todas las líneas que comienzan con el símbolo # indican una directiva del precompilador. Antes de realizar la compilación en C se llama a un precompilador cuya misión es procesar el textoy realizar ciertas sustituciones textuales. Hemos visto que la directiva #include incluye el texto contenido en un fichero en el fuente que estamos compilando. De forma parecida, #define nombre texto sustituye todas las apariciones de nombre por texto. Así, en el fuente, la palabra VALOR se sustituye por el número 5.

El valor que debe devolver una función se indica con la palabra return. La evaluaciónde la expresión debe dar una valor del mismo tipo de dato que el que se ha definido como resultado. La declaración de una variable puede incluir una inicialización en la misma declaración.

Se debe tener muy en cuenta que en C todos los argumentos son pasados 'por valor'. No existe el concepto de paso de parámetros 'por variable' o 'por referencia'. Veamos un ejemplo:

int incr ( int v ) { return v + 1; }

main() {

int a, b;

b = 3;

a = incr(b);

/* a = 4 mientras que b = 3. No ha cambiado después de la llamada. */

}

En el ejemplo anterior el valor del parámetro de la función incr, aunque se modifique dentro de la función, no cambia el valor de la variable b de la función main. Todo el texto comprendido entre los caracteres /* y */ son comentarios al programa y son ignorados por el compilador. En un fuente C los comentarios no se pueden anidar.

















Capítulo 4.

Expresiones y operadores

Los distintos operadores permiten formar expresiones tanto aritméticas como lógicas. Los operadores aritméticos y lógicos son:

+, - suma, resta

++, -- incremento, decremento

*, /, % multiplicación, división, módulo

>>, << rotación de bits a la derecha, izquierda.

& AND booleano


OR booleano

^ EXOR booleano

~ complemento a 1

! complemento a 2, NOT lógico

==, != igualdad, desigualdad

&&,

AND, OR lógico

<, <= menor, menor o igual

>, >= mayor, mayor o igual

En estos operadores deben tenerse en cuenta la precedencia de operadores y las reglas de asociatividad, que son las normales en la mayoría de lenguajes. Se debe consultar el manual de referencia para obtener una explicación detallada. Además hay toda una serie de operadores aritméticos con asignación, como pueden ser += y ^=.

En la evaluación de expresiones lógicas, los compiladores normalmente utilizan técnicas de evaluación rápida. Para decidir si una expresión lógica es cierta o falsa muchas veces no es necesario evaluarla completamente. Por ejemplo una expresión formada <exp1>

<exp2>, el compilador evalúa primero <exp1> y si es cierta, no evalúa <exp2>. Por ello se deben evitar construcciones en las que se modifiquen valores de datos en la propia expresión, pues su comportamiento puede depender de la implementación del compilador o de la optimización utilizada en una compilación o en otra. Estos son errores que se pueden cometer fácilmente en C ya que una asignación es también una expresión.

Debemos evitar: if (( x++ > 3 )

( x < y ))

y escribir en su lugar: x++; if (( x > 3 )

( x < y ))

Hay un tipo especial de expresión en C que se denomina expresión condicional y está representada por los operadores ? : . Su utilización es como sigue: <e> ? <x> : <y>. Se evalúa si e entonces x; si no, y.

int mayor ( int a, int b ) {

return ( a > b ) ? TRUE : FALSE;

}

waste_time () {

float a, b = 0.0;

( b > 0.0 ) ? sin(M_PI / 8) : cos(M_PI / 4);

}