viernes, 16 de diciembre de 2016

Bitcoin : La moneda virtual

Bitcoin (signo: BitcoinSign.svg; abr.: BTC, XBT)3 es una criptodivisa concebida en 2009. El término se aplica también al protocolo y a la red P2P que lo sustenta y de forma común se denomina como una moneda digital. Generalmente se usa «Bitcoin» para referirse a la red o al protocolo y «bitcoin» (plural: «bitcoines») para referirse a las unidades monetarias.

Ver en este enlace : ¿Qué es el Bitcoin?

Noviembre 1, 2008 Satoshi Nakamoto publica el paper: "Bitcoin: A peer to peer Electronic Cash System"



1BTC = US $ 1023
Bitcoin se caracteriza por ser descentralizado, es decir, no está respaldado por ningún gobierno ni depende de la confianza en un emisor central. Por el contrario, utiliza un sistema de prueba de trabajo para impedir el doble gasto y alcanzar el consenso entre todos los nodos que integran la red intercambiando información sobre una red no confiable y potencialmente comprometida (resuelve el problema de los generales bizantinos). De igual forma, las transacciones no necesitan de intermediarios y el protocolo es código abierto.

Bitcoin es un proyecto innovador en constante evolución y cambio. Si bien los desarrolladores recomiendan investigar cómo funcionan previo a invertir en ellos o abrir una cartera para utilizarlos, también consideran que tiene la capacidad de cambiar el mundo en términos económicos.

Bitcoin, la moneda que está cambiando el mundo.

Bitcoin es una moneda, como el euro o el dólar estadounidense, que sirve para intercambiar bienes y servicios. Sin embargo, a diferencia de otras monedas, Bitcoin es una divisa electrónica que presenta novedosas características y destaca por su eficiencia, seguridad y facilidad de intercambio.
Su mayor diferencia frente al resto de monedas, se trata de una moneda descentralizada, por lo que nadie la controla. Bitcoin no tiene un emisor central como los dólares o los euros, la criptomoneda es producida por las personas y empresas de alrededor del mundo dedicando gran cantidad de recursos a la minería.
Si ya sabes qué es bitcoin y lo que tú buscas es directamente comprar bitcoins, aquí tienes una entrada de la web que lo explica. Vamos allá con la guía.

En esta guía aprenderás.

A elegir entre los diferentes tipos de wallets de Bitcoin ( ver mas en este enlace ) que existen, a poder explicar cómo funciona Bitcoin, sus distintos típos de direcciones, además de tener a vuestra disposición una página de preguntas frecuentes y un blog de Bitcoin donde de forma periódica, se van comentando los últimos acontecimientos de la moneda virtual más famosa.

Beneficios y ventajas de Bitcoin

En la actualidad, es la moneda digital más usada de todo el mundo y hay buenas razones por las cuales se está haciendo cada vez más popular. Tanto usuarios particulares como vendedores y propietarios de negocios encuentran en Bitcoin importantes ventajas que les han llevado a adoptar este sistema.





Proof of Work. Prueba de trabajo para tener consenso


Bitcoin podría operar perfectamente sin prueba de trabajo, siempre que todos los participantes fueran perfectamente honestos y altruistas. La prueba de trabajo es un método para establecer un consenso entre un número de personas interesadas, ninguna de las cuales está subordinada a otra, y existen incentivos considerables para resistirse a dicho consenso.

Antes de que un bloque nuevo sea generado, puede que haya muchos pagos pululando por la red sin existir respuesta objetiva acerca de qué pagos deberían ser validados. Algunos podrían ser inválidos, así que todos deben ser comprobados. Algunos pueden no incluir una tasa de transacción, así que debe decidirse si dejar a estos gorrones pasar, o si ignorarlos. Finalmente, podría haber un conjunto de 2 o más pagos que no pueden ser válidos simultáneamente. Por ejemplo, si alguien intenta gastar los mismos bitcoines en dos transacciones que aún no han sido confirmadas, habría que tomar una decisión sobre qué pago permitir.

De este modo, para un conjunto de pagos dado, pueden existir muchos bloques posibles que pueden construirse con ellos, ninguno de los cuales es objetivamente el más correcto. Tampoco habrá necesariamente un acuerdo acerca de qué resultado es preferible, porque los distintos bloques posibles benefician a distintas personas. Primeramente, está el beneficio que surge de generar un bloque en forma de nuevos bitcoines. Esto es necesario porque, si no existiera, habría muy poco incentivo para hacer la contabilidad para empezar. Con esta recompensa, cada minero naturalmente prefiere que el nuevo bloque sea su propuesta, y no la de cualquier otro.

Además puede haber comportamientos malintencionados. Por ejemplo un minero podría negarse a validar las transacciones procedentes de su enemigo, o podría mostrarse más o menos altruista con las tarifas por transacción que aceptará. Podría incluso proponerse estafar a alguien mediante el doble gasto: él mandaría un pago a la víctima a cambio de un bien determinado, pero solo confirmaría otro pago que hace a una cartera de su propiedad y que está en conflicto con el primero; esto invalidaría el primer pago, y acabaría quedándose con un bien por el que no ha pagado.

Para evitar que se hagan manipulaciones interesadas Bitcoin añade requerimientos extra al protocolo que incrementan enormemente el coste de la deserción. Los bloques se generan aleatoriamente mediante un cálculo muy difícil, que requiere muchos recursos computacionales, y solo se propone un único bloque a la vez. Es anunciado y verificado por la mayoría de otros nodos (lo cual es fácil verificando los hashes). Cuando un bloque ha sido propuesto, los mineros tienen la opción de continuar buscando un bloque alternativo que les sea más favorable, o aceptar la propuesta (dar por verificado) y luego pasar a buscar el siguiente. Alguien que acepta el último bloque propuesto entiende que está siguiendo un proceso de consenso natural y que, si tiene la suerte de generar el siguiente bloque, será probablemente aceptado por las mismas razones que él aceptó el anterior. Por el otro lado, la opción de esperar e intentar encontrar un bloque más favorable para él es muy arriesgada, porque entonces tendría que convencer a un número suficiente de mineros de que podrá establecer un nuevo consenso, para que le sigan.

La regla general es que el primer bloque minado nunca es egoísta, porque nadie puede planear ser el primero en resolverlo. Uno solo puede ser el primero con suerte. Cualquiera que se desmarque de ese bloque levantará sospechas, porque tiene que rechazar una alternativa perfectamente válida y supuestamente altruista, y convencer a los demás de que hagan lo mismo; algo nada fácil de hacer.

La fortaleza de la firma realizada por la red Bitcoin es directamente proporcional al poder computacional total de todos los mineros. Cuanto mayor sea más difícil será (más poder computacional) cambiar la cadena de consenso.En esto se basa el protocolo de consenso de bitcoin, el cual puede manejar fallos bizantinos.

Si queremos cambiar un bloque de la cadena, cada bloque que viene después de ese bloque tiene que ser rehasheado y rehacer el trabajo. Esto hace que sea esencialmente imposible modificar un bloque.
Críticas

    Concentración del poder de creación de bloques: La especialización del proceso de minado, para hacerlo rentable, está provocando que el poder para crear bloques se esté centralizando en aquellos que emplean economías de escala para competir y que además estas entidades no tienen por qué tener muchos BTC's por lo que pueden no estar involucradas en el buen funcionamiento de la red. Este es el origen del uso de protocolos de consenso por prueba de participación. . Otra solución sería usar algoritmos por prueba de trabajo resistentes a tecnologías ASIC por ejemplo basándose en gastar recursos de almacenamiento en lugar de en recursos de CPU.
    Despilfarro de recursos en la minería: La cantidad de trabajo computacional que hoy día se gasta en el proceso de minería es extraordinario. Se critica del algoritmo de consenso de Bitcoin que todo ese trabajo que se realiza no se malgaste inútilmente reintentando hasta conseguir un valor hash con ciertas propiedades. Se podría aprovechar los cálculos para obtener algún beneficio para la sociedad. Se diría que tendríamos un algoritmo de prueba de trabajo útil (en inglés proof of useful work). Por ejemplo el algoritmo de consenso de Primecoin (buscan primos con ciertas características) y de Permacoin (basado en almacenamiento distribuido de información).

Rendimiento computacional de la minería

Dificultad relativa de minería, Nota  la escala es logarítmica.

Las estrategias para la extracción (en inglés, mining) de bitcoines se han ido perfeccionando progresivamente. En los primeros meses de funcionamiento de la red era posible extraer en solitario con una CPU estándar y obtener un bloque y sus  BTC asociados con una frecuencia relativamente alta. Posteriormente, la aparición de software de minería adaptado a tarjetas gráficas, mucho más eficiente, desplazó completamente a las CPUs. La minería por GPUs se fue profesionalizando, con grandes instalaciones en países con energía barata, configuraciones personalizadas con uso generalizado de overclocking y sistemas especiales de refrigeración. Con el aumento sostenido de la dificultad, los mineros comenzaron a organizarse en grupos independientes (en inglés, pools) para extraer de manera colectiva,45 desplazando así a los mineros en solitario que podían tardar meses o incluso años en encontrar un bloque de manera individual. El propietario del pool se lleva una comisión por encontrar un bloque. Los pools también compiten entre ellos para intentar atraer al mayor número de mineros.

Durante el año 2013 se inició la distribución de FPGAs y ASICs para extraer bitcoines de manera más eficiente. Si con la minería con CPUs y tarjetas gráficas, el coste de explotación provenía fundamentalmente del gasto energético, la comercialización de equipos especializados de bajo consumo está desplazando las inversiones de los mineros hacia hardware más sofisticado, e indirectamente hacia la investigación necesaria para el desarrollo de estos productos.

En enero de 2016, la dificultad alcanzó por primera vez el valor de 100 000 millones, superando también por primera vez una potencia de procesamiento de 1 exa-hash por segundo 48 (1 000 000 000 000 000 000 de hashes por segundo).

Entre enero de 2010 y febrero de 2016 la potencia de procesamiento se ha multiplicado por 150 000 millones.

Bitcoin Trading & Brokers

Si lo deseas donarme un tip,  esta es mi Bitcoin address:

 1GnewnbBPRe38SzySo32amxiq2pj8SBmsq



Conoce mas acerca del Bitcoin 

jueves, 15 de diciembre de 2016

Tablas de Verdad

Leyes lógicas

Leyes de Identidad
p v F ≡ p
p ^ F ≡ F
p v V ≡ V
p ^ V ≡ p

Leyes de Complementación
p v ~p ≡ V
p ^ ~p ≡ F
Leyes de Idempotencia
p v p ≡ p
p ^ p ≡ p
Leyes Conmutativas
p v q ≡ q v p
p ^ q ≡ q ^ p
Leyes Asociativas
p v (q v r) ≡ (p v q) v r
p ^ (q ^ r) ≡ (p ^ q) ^ r
Leyes Distributivas
p v (q ^ r) ≡ (p v q) ^ (p v r)
p ^ (q v r) ≡ (p ^ q) v (p ^ r)
Leyes de Morgan
~ (p v q) ≡ ~ p v ~ q
~ (p ^ q) ≡ ~ p ^ ~ q
Ley de Involución
~ ~ p ≡ p
Leyes de Absorción
p v (p ^ q) ≡ p
p ^ (p v q) ≡ p
Equivalencias del condicional
  • p --> q ≡ ~ p v q
  • p --> F ≡ ~p
  • V--> q ≡ q
  • p --> V ≡ V
  • F --> q ≡ V
  • p --> p ≡ V
  • ~p --> p ≡ p
  • p --> ~ p ≡ ~ p
  • (p ^ q) --> r ≡ (p --> r) v (q --> r)
  • (p v q) --> r ≡ (p --> r) ^ (q --> r)
  • p --> (q ^ r) ≡ (p --> q) ^ (p --> r)
  • p --> (q v r) ≡ (p --> q) v (p --> r)
Equivalencias del Bicondicional
  • p <--> q ≡ (p --> q) ^ (q --> p)
  • p <--> V ≡ p
  • p <--> F ≡ ~ p
  • p <--> p ≡ V
  • p <--> ~ p ≡ F
  • ~ (p <--> q) ≡ ~ p <--> q
  • ~ (p <--> q) ≡ p <--> ~ q 

Conectivos

Conector Operación Significado
~ Negación No es cierto
^ Conjunción Y
v Disyunción Ó
--> Implicación Si..Entonces..
<--> Doble implicación ..Si y solo si..
v
-
Disyunción exclusiva O..o..

Tablas de la verdad

Negación
p ~p
V F
F V

Conjunción
p q p^q
V V V
V F F
F V F
F F F

Disyunción
p q pvq
V V V
V F V
F V V
F F F

Implicación
p q p-->q
V V V
V F F
F V V
F F V

Doble implicación
p q p<-->q
V V V
V F F
F V F
F F V

Disyunción exclusiva
p q p v
_
q
V V V
V F F
F V F
F F V


Demostrar: [(~p v q) ^ ~(p ^ q)] --> r ≡ p v r

[(~p v q) ^ ~(p ^ q)] --> r ≡ p v r Ley Condicional
~ [(~p v q) ^ ~(p ^ q)] v r ≡ p v r Ley de Morgan
~ [(~p v q) ^ (~p v ~ q)] v r ≡ p v r Ley de Morgan
[~ (~p v q) v ~ (~p v ~ q)] v r ≡ p v r Ley de Morgan y Involución
[ (p ^~q) v (p ^ q)] v r ≡ p v r Ley Distributiva
[ p ^ (~q v q)] v r ≡ p v r Ley de Complementación
[ p ^ V] v r ≡ p v r Ley de Identidad
p v r ≡ p v r



Make this truth table for P v (Q & R) <-> (P v Q) & (P v R)

|P|Q|R|~Q|Q&R|Pv(Q&R)|PvQ|PvR|(PvQ)&(PvR)|Pv(Q&R)<->(PvQ)&(PvR)|
|T|T|T| F| T |  T    | T | T |     T     |        T            |
|T|T|F| F| F |  T    | T | T |     T     |        T            |
|T|F|T| T| F |  T    | T | T |     T     |        T            |
|T|F|F| T| F |  T    | T | T |     T     |        T            |
|F|T|T| F| T |  T    | T | T |     T     |        T            |
|F|T|F| F| F |  F    | T | F |     F     |        T            |
|F|F|T| T| F |  F    | F | T |     F     |        T            |
|F|F|F| T| F |  F    | F | F |     F     |        T            |

The proposition is proved because there are only T's in the last 
column.

Therefore we can replace the biconditional symbol <->, by the
stronger equivalence symbol <=> and write

P v (Q & R) <=> (P v Q) & (P v R)
 
 
 


Enlace Ejercicios de Lógica

Ejercicios de Lógica

Soluciones Examenes

Symbolic Logic Richmond H. Thomasson 



miércoles, 14 de diciembre de 2016

Modelo OSI de Red

Modelo OSI

Pila de capas o niveles del modelo de redes OSI (Open System Interconnection).

El modelo de interconexión de sistemas abiertos (ISO/IEC 7498-1), más conocido como “modelo OSI”, (en inglés, Open System Interconnection) es un modelo de referencia para los protocolos de la red de arquitectura en capas, creado en el año 1980 por la Organización Internacional de Normalización (ISO, International Organization for Standardization). Se ha publicado desde 1983 por la Unión Internacional de Telecomunicaciones (UIT) y, desde 1984, la Organización Internacional de Normalización (ISO) también lo publicó con estándar. Su desarrollo comenzó en 1977.


Modelo de 7 capas.


El problema de trasladar información entre computadores se divide en siete problemas más pequeños y de tratamiento más simple en el modelo de referencia OSI. Cada uno de los siete problemas más pequeños está representado por su propia capa en el modelo. Las siete capas del modelo de referencia OSI son:

Capa 7: La capa de aplicación  
Capa 6: La capa de presentación  
Capa 5: La capa de sesión
Capa 4: La capa de transporte
Capa 3: La capa de red
Capa 2: La capa de enlace de datos
Capa 1: La capa física

Durante el transcurso de este semestre veremos las capas, comenzando por la Capa 1 y estudiando el modeloOSI capa por capa. Al estudiar una por una las capas del modelo de referencia OSI, comprenderá de qué manera los paquetes de datos viajan a través de una red y qué dispositivos operan en cada capa a medida que los paquetes de datos las atraviesan. Como resultado, comprenderá cómo diagnosticar las fallas cuando se presenten problemas de red, especialmente durante el flujo de paquetes de datos.






Arquitectura Cliente Servidor


La arquitectura cliente-servidor es un modelo de aplicación distribuida en el que las tareas se reparten entre los proveedores de recursos o servicios, llamados servidores, y los demandantes, llamados clientes. Un cliente realiza peticiones a otro programa, el servidor, quien le da respuesta. Esta idea también se puede aplicar a programas que se ejecutan sobre una sola computadora, aunque es más ventajosa en un sistema operativo multiusuario distribuido a través de una red de computadoras.

Algunos ejemplos de aplicaciones computacionales que usen el modelo cliente-servidor son el Correo electrónico, un Servidor de impresión y la World Wide Web


En esta arquitectura la capacidad de proceso está repartida entre los clientes y los servidores, aunque son más importantes las ventajas de tipo organizativo debidas a la centralización de la gestión de la información y la separación de responsabilidades, lo que facilita y clarifica el diseño del sistema.

La separación entre cliente y servidor es una separación de tipo lógico, donde el servidor no se ejecuta necesariamente sobre una sola máquina ni es necesariamente un sólo programa. Los tipos específicos de servidores incluyen los servidores web, los servidores de archivo, los servidores del correo, etc. Mientras que sus propósitos varían de unos servicios a otros, la arquitectura básica seguirá siendo la misma.

Una disposición muy común son los sistemas multicapa en los que el servidor se descompone en diferentes programas que pueden ser ejecutados por diferentes computadoras aumentando así el grado de distribución del sistema.

La red cliente-servidor es una red de comunicaciones en la cual los clientes están conectados a un servidor, en el que se centralizan los diversos recursos y aplicaciones con que se cuenta; y que los pone a disposición de los clientes cada vez que estos son solicitados. Esto significa que todas las gestiones que se realizan se concentran en el servidor, de manera que en él se disponen los requerimientos provenientes de los clientes que tienen prioridad, los archivos que son de uso público y los que son de uso restringido, los archivos que son de sólo lectura y los que, por el contrario, pueden ser modificados, etc. Este tipo de red puede utilizarse conjuntamente en caso de que se esté utilizando en una red mixta.


El lenguaje de programación Pascal

Lenguaje de Programación Pascal, llamado así en honor del matemático y filósofo francés BlaisePascal.
El Lenguaje Pascal es un lenguaje strongly typed.


  Breve historia del lenguaje Pascal


    El lenguaje de programación Pascal es un lenguaje de alto nivel y propósito general (aplicable a una gran cantidad de aplicaciones diversas) desarrollado por el profesor suizo Niklaus Wirth (Instituto Tecnológico de Zurich, Suiza). El propósito de Wirth era crear un lenguaje para la enseñanza de técnicas de programación a estudiantes universitarios. Pero a medida que pasaban los años, Pascal se iba convirtiendo en un estándar en el mundo de la programación.

    Una versión preliminar del lenguaje apareció en 1968 y el primer compilador totalmente completo apareció a finales de 1970. Desde entonces, muchos compiladores han sido construídos y están disponibles para diferentes máquinas. Durante muchos años, el libro Pascal User Manual and Report , publicado por Wirth y Kathleen Jensen en 1974, ha servido de facto como estándar de todas las versiones.

    Las diferentes versiones ofrecían iterpretaciones ligeramente diferentes que impedían la compatibilidad entre ellas. Por estas razones, diferentes proyectos se iniciaron para producir una definición estándar del lenguaje y culminaron en dos estándar: uno de la Internacional Standard Organization (ISO) en 1982 y otro por un comité conjunto del American National Standards Institute (ANSI) y del Institute of Electrical and Electronics Engineers (IEEE). Estas dos versiones o definiciones se conocen como ISO Pascal y ANSI/IEEE Pascal, y difieren en algunos aspectos no especialmente significativos. Sin embargo, una versión no estándar se ha popularizado considerablemente: Turbo Pascal (marca registrada por Borland International, Inc.). Esta versión ha contribuido en gran medida a la popularización del lenguaje Pascal.



    PASCAL es un lenguaje relativamente moderno, desarrollado por Niklaus Wirth
( Turing award 1984 ) y su grupo de Zurich en 1971. Se trata de un lenguaje de propósito general, esto quiere decir que se puede emplear para construir todo tipo de aplicaciones. En la práctica también quiere decir que se trata de un lenguaje no diseñado para desarrollar ningún tipo específico de aplicaciones. Pero el PASCAL es especialmente útil para algo: para la enseñanza de buenos modos de programación. El PASCAL es hoy en día el lenguaje más usado para la enseñanza de la programación por varios motivos:



    - Posee unas reglas sencillas de sintaxis.



    - Es un lenguaje muy estructurado.



    - Realiza una comprobación exhaustiva de tipos de datos




    El hecho de que tenga una estructuración muy marcada permite que los programas sean fáciles de leer e interpretar, y facilita la escritura de programas del modo que hoy en día se estima correcto.

    El compilador de PASCAL es relativamente sencillo de realizar, por lo que se ha extendido a muchos tipos de plataformas, desde los ordenadores personales a los grandes ordenadores corporativos. Cuando una aplicación se escribe en PASCAL estandard puede compilarse en cualquier máquina en la que exista compilador de PASCAL, que son la mayoría.

Programa HelloWord en lenguaje Pascal


Program HeloWord(Input,Output);
Begin
 Writeln("Hello World!!!!!!!!");
End.





LISP: Manipulación de Listas

Especificado originalmente en 1958 por John McCarthy y sus colaboradores en el Instituto Tecnológico de Massachusetts, el Lisp es el segundo más viejo lenguaje de programación de alto nivel de extenso uso hoy en día; solamente el FORTRAN es más viejo.

Al igual que el FORTRAN, el Lisp ha cambiado mucho desde sus comienzos, y han existido un gran número de dialectos en su historia. Hoy, los dialectos Lisp de propósito general más ampliamente conocidos son el Common Lisp y el Scheme.

El Lisp fue creado originalmente como una notación matemática práctica para los programas de computadora, basada en el cálculo lambda de Alonzo Church. Se convirtió rápidamente en el lenguaje de programación favorito en la investigación de la inteligencia artificial (AI). Como uno de los primeros lenguajes de programación, el Lisp fue pionero en muchas ideas en ciencias de la computación, incluyendo las estructuras de datos de árbol, el manejo de almacenamiento automático, tipos dinámicos, y el compilador auto contenido.

El nombre LISP deriva del "LISt Processing" (Procesamiento de LIStas). Las listas encadenadas son una de las estructuras de datos importantes del Lisp, y el código fuente del Lisp en sí mismo está compuesto de listas. Como resultado, los programas de Lisp pueden manipular el código fuente como una estructura de datos, dando lugar a los macro sistemas que permiten a los programadores crear una nueva sintaxis de lenguajes de programación de dominio específico empotrados en el Lisp.

La intercambiabilidad del código y los datos también da a Lisp su instantáneamente reconocible sintaxis. Todo el código del programa es escrito como expresiones S, o listas entre paréntesis. Una llamada de función o una forma sintáctica es escrita como una lista, con la función o el nombre del operador en primer lugar, y los argumentos a continuación; por ejemplo, una función f que toma tres argumentos puede ser llamada usando (f x y z)


El Cálculo lambda


El cálculo lambda es un sistema formal diseñado para investigar la definición de función, la noción de aplicación de funciones y la recursión. Fue introducido por Alonzo Church y Stephen Kleene en la década de 1930; Church usó el cálculo lambda en 1936 para resolver el Entscheidungsproblem. Puede ser usado para definir de manera limpia y precisa qué es una "función computable". El interrogante de si dos expresiones del cálculo lambda son equivalentes no puede ser resuelto por un algoritmo general. Esta fue la primera pregunta, incluso antes que el problema de la parada, cuya indecidibilidad fue probada. El cálculo lambda tiene una gran influencia sobre los lenguajes funcionales, como Lisp, ML y Haskell.

Se puede considerar al cálculo lambda como el lenguaje universal de programación más pequeño. Consiste en una regla de transformación simple (sustitución de variables) y un esquema simple para definir funciones.

El cálculo lambda es universal porque cualquier función computable puede ser expresada y evaluada a través de él. Por lo tanto, es equivalente a las máquinas de Turing. Sin embargo, el cálculo lambda no hace énfasis en el uso de reglas de transformación y no considera las máquinas reales que pueden implementarlo. Se trata de una propuesta más cercana al software que al hardware.

Este artículo se enfocará sobre el cálculo lambda sin tipos, como fue diseñado originalmente por Church.




El lenguaje de programación C

 
Historia del Lenguaje C .



C es un lenguaje de programación creado en 1972 por Dennis M. Ritchie en los Laboratorios Bell como evolución del anterior lenguaje B, a su vez basado en BCPL. Al igual que B, es un lenguaje orientado a la implementación de Sistemas Operativos, concretamente Unix. C es apreciado por la eficiencia del código que produce y es el lenguaje de programación más popular para crear software de sistemas, aunque también se utiliza para crear aplicaciones.

Se trata de un lenguaje débilmente tipificado ( weakly typed ) de medio nivel pero con muchas características de bajo nivel. Dispone de las estructuras típicas de los lenguajes de alto nivel pero, a su vez, dispone de construcciones del lenguaje que permiten un control a muy bajo nivel. Los compiladores suelen ofrecer extensiones al lenguaje que posibilitan mezclar código en ensamblador con código C o acceder directamente a memoria o dispositivos periféricos.

La primera estandarización del lenguaje C fue en ANSI, con el estándar X3.159-1989. El lenguaje que define este estándar fue conocido vulgarmente como ANSI C. Posteriormente, en 1990, fue ratificado como estándar ISO (ISO/IEC 9899:1990). La adopción de este estándar es muy amplia por lo que, si los programas creados lo siguen, el código es portátil entre plataformas y/o arquitecturas.



Filosofía

Uno de los objetivos de diseño del lenguaje C es que sólo sean necesarias unas pocas instrucciones en lenguaje máquina para traducir cada elemento del lenguaje, sin que haga falta un soporte intenso en tiempo de ejecución. Es muy posible escribir C a bajo nivel de abstracción; de hecho, C se usó como intermediario entre diferentes lenguajes.

En parte a causa de ser de relativamente bajo nivel y de tener un modesto conjunto de características, se pueden desarrollar compiladores de C fácilmente. En consecuencia, el lenguaje C está disponible en un amplio abanico de plataformas (seguramente más que cualquier otro lenguaje). Además, a pesar de su naturaleza de bajo nivel, el lenguaje se desarrolló para incentivar la programación independiente de la máquina. Un programa escrito cumpliendo los estándares e intentando que sea portátil puede compilarse en muchos computadores.

C se desarrolló originalmente (conjuntamente con el sistema operativo Unix, con el que ha estado asociado mucho tiempo) por programadores para programadores. Sin embargo, ha alcanzado una popularidad enorme, y se ha usado en contextos muy alejados de la programación de sistemas, para la que se diseñó originalmente.
Historia

El desarrollo inicial de C se llevó a cabo en los Laboratorios Bell de AT&T entre 1969 y 1973; según Ritchie, el periodo más creativo tuvo lugar en 1972. Se le dio el nombre "C" porque muchas de sus características fueron tomadas de un lenguaje anterior llamado "B".

Hay muchas leyendas acerca del origen de C y el Sistema de Operación con el que está íntimamente relacionado, Unix. Algunas de ellas son:

El desarrollo de C fue el resultado del deseo de los programadores de jugar con Space Travel. Habían estado jugando en el mainframe de su compañía, pero debido a su poca capacidad de proceso y al tener que soportar 100 usuarios, Thompson y Ritchie no tenían suficiente control sobre la nave para evitar colisiones con los asteroides.

Por ese motivo decidieron portar el juego a un PDP-7 de la oficina que no se utilizaba; pero esa máquina no tenía sistema operativo, así que decidieron escribir uno. Finalmente decidieron portar el sistema operativo del PDP-11 que había en su oficina, pero era muy costoso, pues todo el código estaba escrito en lenguaje ensamblador.

Entonces decidieron usar un lenguaje de alto nivel y portátil para que el sistema operativo se pudiera portar fácilmente de un ordenador a otro. Consideraron usar B, pero carecía de las funcionalidades necesarias para aprovechar algunas características avanzadas del PDP-11. Entonces empezaron a crear un nuevo lenguaje, C.

La justificación para obtener el ordenador original que se usó para desarrollar Unix fue crear un sistema que automatizase el archivo de patentes. La versión original de Unix se desarrolló en lenguaje ensamblador. Más tarde, el lenguaje C se desarrolló para poder reescribir el sistema operativo.

En 1973, el lenguaje C se había vuelto tan potente que la mayor parte del kernel Unix, originalmente escrito en el lenguaje ensamblador PDP-11/20, fue reescrita en C. Éste fue uno de los primeros núcleos de sistema operativo implementados en un lenguaje distinto al ensamblador. (Algunos casos anteriores son el sistema Multics, escrito en PL/I, y Master Control Program para el B5000 de Burroughs, escrito en ALGOL en 1961).




El C de Kernighan y Ritchie

En 1978, Ritchie y Brian Kernighan publicaron la primera edición de El lenguaje de programación C, también conocido como La biblia de C. Este libro fue durante años la especificación informal del lenguaje. El lenguaje descrito en este libro recibe habitualmente el nombre de "el C de Kernighan y Ritchie" o simplemente "K&R C" (La segunda edición del libro cubre el estándar ANSI C, descrito más abajo.)

Kernighan y Ritchie introdujeron las siguientes características al lenguaje:

    El tipo de datos struct.
    El tipo de datos long int.
    El tipo de datos unsigned int.
    Los operadores (=+ y =-) fueron sustituidos por (+= y -=) para eliminar la ambigüedad sintáctica de expresiones como (i=-10), que se podría interpretar bien como (i =- 10) o bien como (i = -10).

El C de Kernighan y Ritchie es el subconjunto más básico del lenguaje que un compilador debe de soportar. Durante muchos años, incluso tras la introducción del ANSI C, fue considerado "el mínimo común denominador" en el que los programadores debían programar cuando deseaban que sus programas fueran transportables, pues no todos los compiladores soportaban completamente ANSI, y el código razonablemente bien escrito en K&R C es también código ANSI C válido.

En estas primeras versiones de C, las únicas funciones que necesitaban ser declaradas si se usaban antes de la definición de la función eran las que retornaban valores no enteros. Es decir, se presuponía que una función que se usaba sin declaración previa (prototipo) devolvería un entero.
Variantes

Desde el inicio del lenguaje han surgido varias ramas de evolución que han generado varios lenguajes:

    Objective-C es un primer intento de proporcionar soporte para la programación orientada a objetos en C, de escasa difusión, pero actualmente usado en Mac OS X y GNUstep.
    C++ (pronunciado C Plus Plus) diseñado por Bjarne Stroustrup fue el segundo intento de proporcionar orientación a objetos a C y es la variante más difundida y aceptada. Esta versión combina la flexibilidad y el acceso de bajo nivel de C con las características de la programación orientada a objetos como abstracción, encapsulación y ocultación.

También se han creado numerosos lenguajes inspirados en la sintaxis de C, pero que no son compatibles con él:

    Java, que une una sintaxis inspirada en la del C++ con una orientación a objetos más similar a la de Smalltalk y Objective C.
    JavaScript, un lenguaje de scripting creado en Netscape e inspirado en la sintaxis de Java diseñado para dar a las páginas web mayor interactividad. A la versión estandarizada se la conoce como ECMAScript.
    C# (pronunciado C Sharp) es un lenguaje desarrollado por Microsoft derivado de C/C++ y Java.



El programa HelloWord escrito en lenguaje C

 
 
#include <stdio.h>

int main()
{
        printf("Hola mundo");
        return 0;
}
 
 

Para descargar

 
El programa HelloWord pdf
 
Software Testing Tools 
 
Software Tools
 
The C Programming language Kernighan-Ritchie 
 
lenguaje C
 
The C programming Language 
 
SoftwareTools  Swap 

FORTRAN:lenguaje de programación alto nivel

John Warner Backus (Dic 3, 1924 – Mar17, 2007) dirigió el equipo que inventó el lenguaje de programación FORTRAN ( FORmula TRANslator ) e inventor de la Backus–Naur form (BNF),  notation para definir la sintaxis de un lenguaje formal. La primera versión de  FORTRAN fué dada en el año 1957 como "programming tool" para el  IBM 704. Ganador del Premio Turing en 1977.

 Ejemplo de programa en FORTRAN



PROGRAM EJEMPLO
REAL :: A, B, C
A=1
B=A+1
PRINT *, A,B
C=A+B+1
PRINT *,'C es igual a=',C
END



PROGRAM ejemplo1
          !
          ! Este programa lee tres números y calcula su suma y su media
          !
            IMPLICIT NONE
            REAL :: N1, N2, N3, Average = 0.0, Total = 0.0
            INTEGER :: N = 3
            PRINT *,' Introduce tres numeros (separados por espacio o coma).'
            PRINT *,' '
            READ(*,*),N1,N2,N3
            Total =  N1 + N2 + N3
            Average = Total/N
            PRINT *,'La suma de los tres numeros es ',Total
            PRINT *,'Y su promedio es ',Average
 
 END PROGRAM ejemplo1


11. Subprogramas

Cuando un programa tiene más de cien líneas, es difícil de seguir. Los códigos de Fortran que resuelven problemas reales de ingeniería por lo general tienen decenas de miles de líneas. La única forma para manejar códigos tan grandes, es usar una aproximación modular y dividir el programa en muchas unidades independientes pequeñas llamadas subprogramas. Un subprograma es una pequeña pieza de código que resuelve un subproblema bien definido. En un programa grande, se tiene con frecuencia que resolver el mismo subproblema con diferentes tipos de datos. En vez de replicar el código, estas tareas pueden resolverse con subprogramas. El mismo subprograma puede ser llamado varias veces con distintas entradas de datos.
En Fortran se tienen dos tipos diferentes de subprogramas, conocidas como funciones y subrutinas.

Funciones

Las funciones en Fortran son bastante similares a las funciones matemáticas: ambas toman un conjunto de variables de entrada (parámetros) y regresan un valor de algún tipo. Al inicio de la sección se comento de los subprogramas definidas por el usuario, pero Fortran 77 tiene también funciones incorporadas. Un ejemplo simple muestra como usar una función:
      x = cos(pi/3.0)
En este caso la función coseno cos de 60º, asignará a la variable x el valor de 0.5 (si pi ha sido definido correctamente; Fortran 77 no tiene constantes incorporadas). Hay varias funciones incorporadas en Fortran 77. Algunas de las más comunes son:

      abs     valor absoluto
      min     valor mínimo
      max     valor máximo
      sqrt    raíz cuadrada
      sin     seno
      cos     coseno
      tan     tangente
      atan    arco tangente
      exp     exponencial (natural)
      log     logaritmo (natural) 
 
En general, una función siempre tiene un tipo. Varias de las funciones incorporadas mencionadas anteriormente son sin embargo genéricas. Por lo tanto en el ejemplo anterior pi y x podrían ser del tipo real o del tipo double precision. El compilador revisará los tipos y usará la versión correcto de la función cos (real o double precision). Desafortunadamente, Fortran no es un lenguaje polimórfico, por lo que en general, el programador debe hacer coincidir los tipos de las variables y las funciones. Se revisa a continuación como implementar las funciones escritas por el usuario. Supongamos el siguiente problema: un meteorólogo ha estudiado los niveles de precipitación en el área de una bahía y ha obtenido un modelo (función) ll(m,t) donde ll es la cantidad de lluvia, m es el mes, y t es un parámetro escalar que depende de la localidad. Dada la fórmula para ll y el valor de t, calcular la precipitación anual
La forma obvia de resolver el problema es escribir un ciclo que corra sobre todos los meses y sume los valores de ll. Como el cálculo del valor de ll es un subproblema independiente, es conveniente implementarlo como una función. El siguiente programa principal puede ser usado:

      program lluvia
      real r, t, suma
      integer m
 
      read (*,*) t
      suma = 0.0
      do m = 1, 12
         suma = suma + ll(m, t)
      end do
      write (*,*) 'La precipitación Anual es ', suma, 'pulgadas'

      stop
      end
Además, la función ll tiene que ser definida como una función de Fortran. La fórmula del meteorólogo es:
      ll(m,t) = t/10 * (m**2 + 14*m + 46) si la expresión es positiva
      ll(m,t) = 0                         otro caso               
La correspondiente función en Fortran es
      real function ll(m,t)
         integer m
         real t

         ll = 0.1*t * (m**2 + 14*m + 46)
         if (ll .LT. 0) ll = 0.0

         return
      end
Se puede observar que la estructura de una función es parecida a la del programa principal. Las diferencias son:
  • Las funciones tienen un tipo. El tipo debe coincidir con el tipo de la variable que recibirá el valor.
  • El valor que devolverá la función, deberá ser asignado en una variable que tenga el mismo nombre que la función.
  • Las funciones son terminadas con la sentencia return en vez de la sentencia stop.
Para resumir, la sintaxis general de una función en Fortran 77 es:
      tipo function nombre (lista_de parámetros)
         declaraciones
         sentencias
         return
      end
La función es llamada simplemente usando el nombre de la función y haciendo una lista de argumentos entre paréntesis.

Subrutinas

Una función de Fortran puede devolver únicamente un valor. En ocasiones se desean regresar dos o más valores y en ocasiones ninguno. Para este propósito se usa la construcción subrutina. La sintaxis es la siguiente:
      subroutine nombre (lista_de_parámetros)
         declaraciones
         sentencias
         return
      end
Observar que las subrutinas no tienen tipo y por consecuencia no pueden hacerse asignación al momento de llamar al procedimiento. Se da un ejemplo de una subrutina muy sencilla. El propósito de la subrutina es intercambiar dos valores enteros.
      subroutine iswap (a, b)
         integer a, b
c Variables Locales
         integer tmp

         tmp = a
         a = b
         b = tmp

         return
      end
Se debe observar que hay dos bloques de declaración de variables en el código. Primero, se declaran los parámetros de entrada/salida, es decir, las variables que son comunes al que llama y al que recibe la llamada. Después, se declaran las variables locales, esto es, las variables que serán sólo conocidas dentro del subprograma. Se pueden usar los mismos nombres de variables en diferentes subprogramas.

Llamada por referencia

El lenguaje Fortran 77 usa el paradigma de llamada por referencia. Esto significa que en vez de pasar los valores de los argumentos a la función o la subrutina (llamada por valor), se pasa la dirección (apuntadores) de los argumentos.
      program llamaint
         integer m, n
c
         m = 1
         n = 2 

         call iswap(m, n)
         write(*,*) m, n

         stop
      end
La salida de este programa es "2 1", justo como se habría esperado. Sin embargo, si Fortran 77 hubiera hecho una llamada por valor entonces la salida hubiera sido "1 2", es decir, las variables m y n hubieran permanecido sin cambio. La razón de esto último, es que solamente los valores de m y n habrían sido copiados a la subrutina iswap, a pesar de que a y b hubieran sido cambiados dentro de la subrutina, por lo que los nuevos valores no sería regresados al programa que hizo la llamada. En el ejemplo anterior, la llamada por referencia era lo que se quería hacer. Se debe tener cuidado al escribir código en Fortran, porque es fácil introducir efectos laterales no deseados. Por ejemplo, en ocasiones es tentador usar un parámetro de entrada en un subprograma como una variable local y cambiar su valor. No se deberá hacer nunca, ya que el nuevo valor se propagará con un valor no esperado.
Se revisará más conceptos cuando se vea la sección de Arreglos en subprogramas para pasar arreglos como argumentos.


Ejercicios

Ejercicios A
Escribir una función llamada fac que tome un entero n como entrada y regrese n! (factorial de n). Probar la función usando el siguiente programa main
      program prbfac
c
c Ejercicio A, seccion 11.
c Programa Main para probar la función factorial.
c
      integer n, fac

  10  continue
         write(*,*) 'Dame n: '
         read (*,*) n
         if (n.gt.0) then
            write(*,*) ' El factorial de', n, ' es', fac(n)
            goto 10
         endif
c     End of loop

      stop
      end
(Tip: Se tiene que usar un ciclo para implementar la función ya que Fortran 77 no soporta llamadas recursivas.)
Ejercicio B
Escribir una subrutina cuad que tome tres números reales a,b,c como entrada y encuentre las raíces de la ecuación ax**2 + bx + c = 0. Si las raíces son complejas, se deberá mostrar un mensaje de error como el siguiente:
      write(*,*) 'Advertencia: Raices Complejas.'
También se deberá escribir un programa main que pruebe la subrutina.



Programando en FORTRAN pdf download

Introducción al FORTRAN pdf  

Programación en FORTRAN pdf