lunes, 22 de octubre de 2018

Lenguaje C la base de todo (o casi todo)

Saludos. En esta ocasión les comentaré sobre una letra, bueno no exactamente una letra, sino sobre un lenguaje de programación cuyo nombre es la tercera letra del alfabeto. Estoy hablando del lenguaje C, el cual ha sido la base de muchas de las cosas que usamos actualmente. sin mas preámbulos, empecemos.

Las computadoras están en todos lados, incluyendo en los smartphones, ya que estos al fin y al cabo son computadoras al igual que las tablets, peros estos aparatos no serian nada útil sin un sistema operativo que es el conjunto de programas que permiten a los seres humanos interactuar con una computadora siendo los mas conocidos Windows, Mac OS, GNU/Linux, Unix en el caso de los equipos de escritorio y laptops y Android, iOS,Windows Mobile y Blackberry OS en el caso de los smartphone y tablets son los sistemas operativos usados por dichos artefactos, pero hacen falta otras aplicaciones para sacar mayor provecho de estos, como es el caso de los navegadores o browsers que nos permiten acceder a Internet, siendo los mas conocidos Mozilla Firefox, Chrome, Safari, Opera Microsoft Edge e Internet Explorer y de los paquetes de ofimática, que son un conjunto de aplicaciones usados tanto en empresas como en el hogar que sirven para crear, modificar e imprimir archivos, como es el caso de Microsoft Office y LibreOffice. Pero todos estos sistemas operativos y aplicaciones creados por distintos fabricantes y usados en distintos equipos tienen algo en común y es la letra C. No, no está presente en el nombre sino es algo que es la base en la que se crearon ¿Que es ese algo? El lenguaje de programación C.

El lenguaje C es la base de muchos sistemas operativos y aplicaciones
El lenguaje C es la base de muchos sistemas operativos y aplicaciones

Lenguaje C



Es un lenguaje de programación de propósito general, esto significa que pueden ser usados para varios propósitos como acceso a bases de datos, comunicación entre computadoras y entre dispositivos, cálculos matemáticos, diseño de imágenes o páginas, crear sistemas operativos, manejadores de bases de datos, compiladores, etc. El lenguaje C es la base de muchos sistemas operativos y de otras aplicaciones como veremos a continuación.


Orígenes del lenguaje C



El lenguaje C fue creado por Dennis Ritchie, científico que laboraba en los Laboratorios Bell, que pertenecían en aquella época a la compañía AT&T), en los Estados Unidos, en el año 1972, para lo cual se basó en otro lenguaje de programación llamado B, para lo cual Ritchie estuvo haciéndole modificaciones, hasta que finalmente logra terminar su creación, llamándolo C por la sencilla razón que C es la letra que le sigue a B en el alfabeto.



Dennis Ritchie creador del lenguaje C
Dennis Ritchie creador del lenguaje C

¿Pero exactamente que fue lo que llevó a la creación del lenguaje C?



Como se dijo, el lenguaje C fue desarrollado a partir del lenguaje B, el cual fue a su vez fue creado para recodificar al sistema operativo UNIX, el cual había sido creado en el año 1969 en los laboratorios Bell (donde fueron también creados los lenguajes B y C) por Ken Thompson, Dennis Ritchie y Douglas McIlroy. En aquel entonces, Unix se programaba directamente en ensamblador, con el inconveniente de estar vinculado a equipos concretos (según el juego de instrucciones de cada uno de ellos), por lo que se hacía necesario un lenguaje que permitiese al programador abstraerse de la capa hardware y conseguir una mayor portabilidad del código, algo que se realizó con el lenguaje B.

Dennis Ritchie, tal como se dijo antes, modifica el lenguaje B aportando tipos y estructuras de datos que consiguiesen clarificar la programación y obtener un lenguaje mucho más eficiente, el cual permitía realizar una programación estructurada en la que se podían economizar las expresiones a usar y con el que los desarrolladores podrían contar con un buen conjunto de operadores y tipos de datos para programar tanto en alto como en bajo nivel de manera simultánea, dando como resultado a C. En el año 1973, Dennis Ritchie reescribe al sistema UNIX en lenguaje C, haciendo que este sistema operativo fuera independiente de la máquina. Eso permitió que UNIX fuese compatible con otras arquitecturas o familias y su expansión fuese de tipo viral. El primer compilador de C fue escrito por Dennis Ritchie para un DEC PDP-11 (un compilador es el que se encarga de traducir las instrucciones de al gun lenguaje en lenguaje de maquina, es decir 1 y 0, de modo que las computadoras lo entiendan).



El primer compilados para el lenguaje C fue escrito para una computadora DEC PDP-11
El primer compilados para el lenguaje C fue escrito para una computadora DEC PDP-11. Aquí vemos a Dennis Ritchie junto a Ken Thompson, uno de los creadores del sistema operativo UNIX trabajando en una de estas computadoras

La gran novedad y ventaja que proporcionó C sobre B fue el diseño de tipos y estructuras de datos. Los tipos estructurados básicos de C son las estructuras, las uniones y los arrays. Estos permiten la definición y declaración de tipos de mayor complejidad.

Existen otras versiones sobre como se llegó a crear al lenguaje C. Una de estas es que 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, Kenneth Thompson y Dennis 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, por lo que 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 se empezó a crear un nuevo lenguaje, que fue C.

La otra causa es que se buscaba crear un sistema que automatizase el archivo de patentes de los Laboratorios Bell y, dado que la versión original de UNIX se desarrolló en ensamblador, se usó C para rescribir el sistema operativo. No se sabe si algunas de estas versiones sean ciertas.

Cuando alguien adquiría una copia de UNIX recibía ademas un compilador de C gratis. Como UNIX fue escrito en C, entonces si alguien quería entender este sistema, tenia que aprender C. Esto dio como resultado que este lenguaje adquiriera popularidad, por lo que distintas empresas introdujeron sus propios compiladores C, que incluso podían ejecutarse en otros sistemas operativos distintos a UNIX.
La referencia para este lenguaje era el libro de Brian Kernighan y Dennis Ritchie, llamado El lenguaje de programación C, escrito en 1978, en donde se explica el desarrollo de aplicaciones en C.

En 1987 con la creación de "The American National Standars Institute (ANSI) version of C", mejor conocida como ANSI C se crea un estándar para este lenguaje. Posteriormente, en 1990, fue ratificado como estándar ISO (ISO/IEC 9899:1990). Su adopción es muy amplia por lo que, si los programas creados lo siguen, el código es portable entre plataformas y/o arquitecturas.


Durante la segunda mitad de la década de los 80, el lenguaje C se convirtió en el lenguaje elegido para el desarrollo de software comercial.

Los ancestros del lenguaje C


Ya se ha dicho varias veces que el lenguaje C fue creado a partir del lenguajes B. El mismo fue creado por Kenneth Thompson, con ayuda de Dennis Ritchie en los Laboratorios Bell en el año 1969. Entre sus características se tiene que era carente de tipos y estructuras. El nombre es una contracción de BCPL, aunque se piensa que Kenneth Thompson lo llamo B en honor a su esposa Bonni.

El lenguaje B está basado en otro mas, el BCPL, y era similar a este, excepto en si sintaxis. Para crear B, Thompson eliminó cualquier componente de BCPL que el consideró prescindible de forma que cupiese en la memoria de las computadoras de la época. El lenguaje también incluyó cambios de acuerdo con las preferencias de Thompson (Reducir el número de caracteres de un programa). Además solo manejaba un tipo de datos, que correspondía con una palabra de maquina.

BCPL son las siglas en ingles de Basic Combined Programming Language, el cual fue diseñado por Marin Richards en la Universidad de Cambridge, Gran Bretaña en 1966, motivado a las dificultades experimentadas con el lenguaje de programación CPL.

BCPL es un lenguaje de programación ordenado, potente y muy fácil de adaptar a diferentes arquitecturas, usaba flujo de control con If-Then, Test-Then-Else, Unless-Do, While-Do, Until-Do, Repeat, Repeatwhile, Repeatuntil, For-to-By-Do, Loop, Break and Switchon-Into-Case-Default-Endcase. Se popularizó en los programas de arranque de las computadoras (bootstraps en inglés) debido a sus compiladores simples y compactos, algunos con capacidad para correr en solo 16 kilobytes, Inclusive algunos sistemas operativos fueron escritos total o parcialmente en BCPL.

Con respecto a CPL que son las siglas en inglés de Combined Programming Language, podemos decir que fue creado conjuntamente por el laboratorio de Matemáticas de la Universidad de Cambridge y la Unidad Computación de la Universidad de Londres en 1963. Por lo tanto BCPL está basado o tiene influencias de CPL. Este lenguaje fue utilizado en Multics (siglas de Multiplexed Information and Computing Service, Servicio de información y cómputo con multiplexión) el cual fue uno de los primeros sistemas operativos de tiempo compartido y tuvo una gran influencia en el desarrollo de los posteriores sistemas operativos.

Pero a su vez CPL está basado en otro lenguaje de programación, el ALGOL, que son las siglas en ingles de ALGorithmic Oriented Language, y a diferencia de este que era extremadamente pequeño, elegante y simple, CPL era grande, moderadamente elegante y complejo. ALGOL fue creado en el año 1958 por un comité internacional con la finalidad de crear un lenguaje de programación que sea independiente de la máquina en que vaya a instalarse y que ademas solucionara algunos problemas presentados por Fortran otro lenguaje de programación antiguo. Una de las características de ALGOL es que utiliza bloques de declaraciones entre paréntesis y fue el primer lenguaje en emplear los términos BEGIN y END para delimitarlos. Fue el primer lenguaje estructurado, es decir que usaba el ciclo for, if-then-else, anidado, recursivo, y de libre forma y switch que es una generalización del goto de FORTRAN.

Por lo tanto, C ha sido producto de una secuencia de lenguajes de programación, los cuales cada uno fueron mejorando algunas características de los que les precedían, por lo que puede decir que C tiene su árbol genealógico.


Arbol genealógico del lenguaje C
Árbol genealógico del lenguaje C

Características de C



El lenguaje C tiene las siguientes características:
  • Programación estructurada
  • Un núcleo del lenguaje simple, con funcionalidades añadidas importantes, como funciones matemáticas y de manejo de archivos, proporcionadas por bibliotecas.
  • Un sistema de tipos que impide operaciones sin sentido.
  • Economía de las expresiones
  • Abundancia en operadores y tipos de datos
  • Codificación de alta y bajo nivel simultáneamente
  • Reemplaza ventajosamente a la programación en ensamblador
  • Utilización natural de las funciones primitivas del sistemas
  • No está orientado a ninguna área en especial
  • Producción de código objeto altamente optimizado
  • Facilidad de aprendizaje
  • Acceso a memoria de bajo nivel mediante el uso de punteros
  • Conjunto reducido de palabras reservadas
  • Paso de parámetros a funciones por valor
  • Tipos de datos agregados (struct) que permitían combinar, bajo un mismo tipo, datos de tipos distintos y manejarlos como uno solo

C es un lenguaje de alto nivel (aquel que se encarga de de mostrar distintos Algoritmos de modo tal de que un usuario pueda leerlo, reorganizarlo e interpretarlo), que es capaz de manipular la computadora a bajo nivel (cuando se habla de bajo nivel se se refiere al lenguaje que entienden las computadoras, es decir, 1 y 0, o lo que es lo mismo, código binario), tal como lo haría un lenguaje ensamblador y al tener un modesto conjunto de características, se pueden desarrollar compiladores de C fácilmente.


Una de las peculiaridades de C es su riqueza de operadores, puede decirse que prácticamente dispone de un operador para cada una de las posibles operaciones en código maquina. Hay toda una serie de operaciones que puede hacerse con el lenguaje C, que realmente no están incluidas en el compilador propiamente dicho, sino que las realiza un preprocesador (El preprocesador es un programa que forma parte del compilador y que modifica el código fuente antes de ser traducido a código binario) justo antes de cada compilación, siendo los mas importante #define (directriz de sustitución simbólica o de definición) e #include (directriz en el fichero fuente).


Estructura de un programa hecho en lenguaje C


Un programa hecho en lenguaje C está compuesto de la siguiente manera:


Estructura de un programa hecho en lenguaje C
Estructura de un programa hecho en lenguaje C

Explicaremos cada una de las partes que conforman un programa en C.

Archivo de cabecera

Los archivos de cabecera contienen diversos archivos y funciones predefinidos que sirven a la hora de correr el programa. Cada archivo de cabecera se identifica por la extensión .h (header file), como por ejemplo stdio.h, el cual contiene funciones para realizar operaciones de entrada y salida sobre archivos.

Otros archivos de cabecera son:
ctype.h: Funciones útiles para la clasificación y el mapeado de códigos.
float.h: Funciones que establecen algunas propiedades de las representaciones de tipos real.
limits.h: Funciones que establecen algunas propiedades de las representaciones de tipos enteros.
math.h: Funciones que sirven para realizar operaciones matemáticas comunes sobre valores de tipo double.
stdarg.h: Son declaraciones que permiten acceder a los argumentos adicionales sin nombre en una función que acepta un número variable de argumentos.
stdlib.h y a veces unistd.h: Declaraciones de una colección de funciones útiles. Entre ellas suele estar la función malloc que permite hacer peticiones de memoria dinámica al sistema.
string.h: Declaración de una colección de funciones útiles para manejar cadenas y otros arrays de caracteres.
time.h: Declaración de funciones para el manejo de fechas.
assert.h: Es proporcionar una definición de la macro assert, que imprime un mensaje de error y aborta el programa.
alloc.h: Existen funciones para asignar, liberar memoria, u obtener información de bloques de memoria.
dir.h: Esto permite ordenar, crear, modificar, mover y eliminar directorios
errno.h: Representa los números de error, después que ocurre un error se puede consultar el valor de la variable del sistema de errno para obtener mas información sobre ese error.
limits.h Define los limites de los diferentes tipos de enteros.
setjmp.h: Define el tipo de jmp_buf para algunas funciones.
signal.h: Contiene funciones de estado.
stdef.h: Se definen algunos tipos especiales
iostream.h: Funciones para ingresar y mostrar datos.

Para incluir a los archivos de cabecera se usa la palabra #include.

Cabecera de función

Una función es un conjunto de instrucciones que se la puede llamar desde el programa principal o desde otras funciones. En este caso, estas funciones se colocan en la cabeza o inicio del programa, ya que estas instrucciones se incluirán en todo el programa, por lo que a estas se les llama también variables globales. La función que se coloca al principio del programa es main(), que es la que ejecuta el sistema operativo al llamar a un programa C y que ademas puede llamar a otras funciones. Cada función va acompañada de paréntesis (). También se le coloca los parámetros de la función, que para main() es int que indica que la función es de tipo entero (trabaja con números enteros), pero esto es opcional.

Sentencias

Las sentencias o instrucciones se colocan entre llaves {}, estas manipulan los datos que se ingresan al programa para obtener un resultado esperado. De forma mas exacta, indica que es lo que va a realizar específicamente el programa. Cada una de estas instrucciones tienen un significado y que al juntarlas correctamente se obtendrá el resultado esperado por el programa y se representan por palabras claves, que significa que no se pueden utilizar como nombre de variables o constantes. Algunas de estas instrucciones son las siguientes:
printf: Significa imprimir o mostrar en pantalla.
scanf: Significa leer una variable.
break: significa interrumpir.
if: Significa si (condicional.)
if-else: sSignifica si sino (condicionales).
while: Significa mientras.
do-while: Significa hacer mientras.
return: Significa regresar.
continue: Significa continuar.
switch: Significa según sea.

Dentro de las sentencias se pueden incluir comentarios, que es información relativa a este. Estos comentarios si bien se añaden a la estructura del programa, no afectan a este, ya que solo es información complementaria.  


Tipos de datos usados por el lenguaje C


Los tipos de datos definidos por C son caracteres, números enteros y números en coma flotante y son representados por char, los enteros por short, int, long y los números en coma flotante por float y double.

Representación
Tipo
Tamaño
CHAR
carácter
normalmente 8 bits
INT enteros
enteros
depende de la implementación
FLOAT
números reales (flotante simple)
normalmente 32 bits

DOUBLE
números reales (flotante doble)
normalmente 64 bits
SHORT
números enteros cortos
normalmente 16 bits
LONG
números enteros largos
normalmente 32 bits
UNSIGNED
números enteros sin signo
depende de la implementación

Creación de un programa en lenguaje C



Para crear un programa, primero se escriben, siguiendo la estructura antes descrita, las diferentes funciones y sentencias que lo conforman y se guarda. Este archivo, el cual consta de palabras que pueden ser entendidas por el ser humano es lo que se conoce como código fuente. Este código fuente posteriormente se compila, es decir, que se convierte en otro archivo en código objeto, el cual puede ser entendido por la computadora para finalmente ser convertido en código ejecutable, el cual tiene toda la información para que el microprocesador del computador pueda “correrlo o ejecutarlo” y realizar la actividad para la que fue hecho el programa.

C puede ser compilado al lenguaje de maquina en casi todas las computadoras y se programa con una serie de funciones que se llaman unas a otras para el procesamiento. Los programadores pueden elegir la elección entre el uso de la biblioteca estándar que se provee con el compilador, el uso de funciones de terceros creadas por otros proveedores de C, o el desarrollo de sus propias funciones.

La compilación de un programa en C se realiza en varias fases que normalmente son automatizadas y ocultadas por los entornos de desarrollo:
  1. Preprocesado consistente en modificar el código fuente en C según una serie de instrucciones (denominadas directivas de preprocesado) simplificando de esta forma el trabajo del compilador. Por ejemplo, una de las acciones más importantes es la modificación de las inclusiones (#include) por las declaraciones reales existentes en el archivo indicado.
  2. Compilación que genera el código objeto a partir del código ya preprocesado.
  3. Enlazado que une los códigos objeto de los distintos módulos y bibliotecas externas (como las bibliotecas del sistema) para generar el programa ejecutable final.
Si hay un error en la compilación del programa, este se se puede depurar para corregir estos errores.




Ventajas del lenguaje C

  • Lenguaje muy eficiente puesto que es posible utilizar sus características de bajo nivel para realizar implementaciones óptimas.
  • A pesar de su bajo nivel es el lenguaje más portado en existencia, habiendo compiladores para casi todos los sistemas conocidos.
  • Proporciona facilidades para realizar programas modulares y/o utilizar código o bibliotecas existentes.
  • La programación en C tiene una gran facilidad para escribir código compacto y sencillo a su misma vez.

Desventajas del lenguaje C

No todo es perfecto, ya que C presenta las siguientes desventajas:
  • Carece de instrucciones de entrada/salida, de instrucciones para manejo de cadenas de caracteres.
  • La excesiva libertad en la escritura de los programas puede llevar a errores en la programación que, por ser correctos sintacticamente no se detectan a simple vista.
  • Las precedencias de los operadores convierten a veces las expresiones en pequeños rompecabezas.
  • No tiene soporte para programación orientada a objetos y para programación multihilo.

Lenguajes derivados de C



A partir del lenguaje C se crean otros lenguajes de programación tales como:

  • C++
    Creado en 1979 por el profesor de ciencias de la computación de la Universidad A&M de Texas, Estados Unidos Bjarne Stroustrup. Este lenguaje cuenta, ademas de todas las funcionalidades de C, otras mas como clases, sobrecarga de funciones, herencia entre clases, etc. A diferencia de C, que es un lenguaje de programación estructurado, es decir, que sigue tres estructuras de control que son secuencia que es la sucesión simple de dos o mas operaciones, selección, que es la bifurcación condicional de una o mas operaciones e interacción, que es la repetición de una operación mientras se cumple una operación, C++ está orientado a objetos, es decir, que trabaja con objetos visibles, entendiendo como objeto a entidades que contienen datos y los que cada uno de los cuales posee sus propias características, métodos y eventos y toma como entidad principal los objetos de la naturaleza misma que contienen sus propias características y alguna función de utilidad.

  • Objective-C
    Creado en 1981 por el experto en ciencias de la computación y matemático Brad Cox y está caracterizado por su aplazamiento a muchas decisiones hasta que se cumple el tiempo de corrida del programa creado y al igual que C++ está orientado a objetos. Objective-C es un lenguaje compilado. pero también es al mismo tiempo un lenguaje enlazado . Esto quiere decir básicamente que el resultado del compilador no es el programa final sino que existe una segunda fase que lleva a cabo el enlazador, que es el responsable de recoger el código compilado y de juntarlo con otro código compilado: el de las librerías que el programa utilice. En Objective-C, el compilador tan solo tiene en cuenta los archivos de cabecera. Por lo tanto si una clase no está definida en los archivos de cabecera es como si no existiese, mientras que el enlazador es un paso posterior al compilador. Eso significa que un código puede compilar bien pero puede tener errores del enlazador.
  • C# (se pronuncia C Sharp)
    Creado por Microsoft en el año 2000 como parte de .NET, que es una plataforma de desarrollo de software con énfasis en transparencia de redes, con independencia de plataforma de hardware y que permite un rápido desarrollo de aplicaciones, con el fin de facilitar la interconexión de distintas plataformas de hardware, software, información y usuarios. El nombre del lenguaje, C#, proviene de dibujar dos signos positivos encima de los dos signos de suma de C++, queriendo dar una imagen de evolución tal como ocurrió con el paso de C a C++. C# es un lenguaje de programación orientado a objetos y se caracteriza por su sencillez de uso, ya que elimina muchos elementos añadidos por otros lenguajes y que facilitan su uso y compresión, como por ejemplo ficheros de cabecera y no incorpora elementos como macros y herencia múltiple. Asimismo incorpora elementos útiles como tipos decimales o booleanos, un tipo básico string, así como una instrucción que permita recorrer vectores con facilidad (instrucción foreach) e incluye mecanismos de control de acceso a tipos de datos, lo que garantiza que no se produzcan errores difíciles de detectar.

Otros lenguajes basados en C o que han sido influenciados por este son Swift el cual fue creado por Apple en el año 2014, está basado tanto en C, como en Objective-C. También se cuentan entre estos lenguajes a Python, Ruby y PHP .


El lenguaje ha sido la base de otros lenguajes de programacion
El lenguaje ha sido la base de otros lenguajes de programación  

Lenguaje C base de sistemas operativos


Se dijo que el sistema operativo UNIX está hecho en C, pero hay otros sistemas basados en este, y que por lo tanto está presente este lenguaje, como es el caso de BSD, siglas de Berkeley Software Distribution, cuya última versión fue la 4.4 lanzada en el año 1995 y de la cual fueron creados otros sistemas como FreeBSD, OpenBSD y NetBSD. Asimismo, otro sistema operativo basado en UNIX, que es Solaris, creado por la la empresa Sun Microsystems y que en la actualidad es propiedad de la empresa Oracle. A partir de Solaris surgieron otros sistemas como son OpenIndiana e Illumos y Nexenta OS. Al ser todos estos sistemas operativos basados en UNIX y al ser este creado en lenguaje C, todos estos serán sus descendientes.


Otro descendiente del lenguaje C es macOS (antes llamado OS X o Mac OS X), que es el sistema operativo desarrollado por Apple que fue lanzado en el año 2001 y el cual está basado en NeXTSTEP, que fue el sistema operativo creado por NeXT, la empresa creada por Steve Jobs luego de su salida de Apple, y que a su vez está basado en BSD, y tal como se dijo en el párrafo anterior, está basado en UNIX, por lo que C está presente en el mismo. El núcleo de macOS está hecho en BSD y por tanto en UNIX (al igual que el de NeXTSTEP) y gran parte del sistema está escrito en Objective C, por lo que C está presente en este sistema operativo. Pero ya antes del lanzamiento de macOS, las versiones anteriores de este sistema operativo, conocidas con Mac OS Classic, a partir de la versión System 7 lanzada en 1991 eran escritas en lenguaje C. Hasta la versión System 6 se escribían en lenguaje emsamblador (que es la representación del que entienden las maquinas directamente).

Muchos sistemas operativos han sido basados en UNIX y este a su vez fue escrito en C
Muchos sistemas operativos han sido basados en UNIX y este a su vez fue escrito en C, por lo que estos sistemas son "primos"
  
Otro sistema operativo que tienen como base el lenguaje C es GNU/Linux. Este sistema esta compuesto por el núcleo o kernel Linux, creado por Linus Torvald en el año 1991, y GNU, que es el resto del sistema, el cual fue idea de Richard Stallman con la intención de tener un sistema operativo libre, es decir, cuyo código fuente sea abierto y de libre distribución al cual le faltaba el núcleo o kernel, por lo que se le incorporó Linux el cual fue escrito en gran parte en lenguaje C. Asimismo, los elementos que conforman GNU tales como librerías, utilidades, gestores de paquetes, programas de configuración, entornos de escritorios, gestores de ventanas y aplicaciones gráficas de usuario, también están escritos en este lenguaje.  

Tanto el núcleo como el resto del sistema GNU/Linux está escrito en lenguaje C
Tanto el núcleo como el resto del sistema GNU/Linux está escrito en lenguaje C

Otro sistema operativo en donde el lenguaje C está presente, es en el mas usado a nivel mundial que es Windows, que como se sabe es creación de Microsoft, esto se aplica desde la versión Windows 3.1 hasta la mas reciente que es Windows 10 (Windows 1.0, 2.0 y 3.0 están escritos en Basic). Específicamente estas versiones de Windows están escritas tanto en lenguaje C como en C++ y en C#, una parte está escrita en lenguaje ensamblador (que es la representación del que entienden las maquinas directamente).  


Lenguaje C presente en los smartphones



Así como hay sistemas operativos para computadoras (eso incluye de escritorio y laptops) hechos en C, tanto directa como indirectamente (como por ejemplo, el caso de macOS), lo mismo ocurre también con los sistemas operativos para smartphones, tal como veremos a continuación.

Tenemos el caso de iOS (abreviatura de iPhone OS), el sistema operativo creado por Apple para sus smartphones iPhone y para sus iPad y iPod touch (y para nadie mas), y el cual fue lanzado de forma oficial el 6 de marzo de 2008. iOS está basado en macOS, que como se dijo en párrafos anteriores, fue desarrollado a partir BSD y este a partir de UNIX, que a su vez fue escrito en lenguaje C, asimismo, al igual que su hermano mayor macOS, iOS está escrito en parte en Objective-C, así como en Swutf, ambos creados a partir del lenguaje C.


Para Android, el famoso sistema operativo para smartphones y tablets de diferentes fabricantes (al contrario de iOS que solo puede ser instalado en los equipos fabricados por Apple), lanzado el 23 de septiembre de 2008 y que actualmente es propiedad de Google, también tiene al lenguaje C en su interior, ya que su núcleo Linux (el mismo que tiene GNU/Linux) y el cual, como se dijo anteriormente está hecho en lenguaje C. Una parte del sistema está escrito en ese mismo lenguaje y en C++ (La mayor parte lo está en Java).

Los principales sistemas operativos para smartphones tienen al lenguaje C como parte de su estructura
Los principales sistemas operativos para smartphones tienen al lenguaje C como parte de su estructura


Si bien Microsoft domina el mercado de los sistemas operativos de escritorio, en el caso de los smartphone y tablets, su participación es minoritaria. Su sistema operativo para estos dispositivos, Windows 10 Mobile y su antecesor Windows Phone, están escritos en C++ (que como se sabe es un derivado del lenguaje C), al igual que en su momento fue un gigante esta área y que ahora su cuota de mercado es mínima como es Blackberry OS, desarrollado por la empresa Blackberry. Por lo tanto cuando se use un smartphone o tablet, hay que recordar la presencia de C en estos.


El lenguaje C presente en aplicaciones



Al igual que en los sistemas operativos en los que están instaladas, muchas aplicaciones están escritas, o por lo menos en parte, en lenguaje C o en algunos de sus derivados. Tal es el caso de las suites ofimáticas, las cuales son un conjunto de aplicaciones que permiten manipular, crear, modificar archivos y documentos. Microsoft Office, que es la suite ofimática mas usada a nivel mundial, está escrito C++, mientras su alternativa en software libre que es LibreOffice está escrito en parte en dicho lenguaje (derivado de C).

Otras aplicaciones importantes son los navegadores web o browsers, que nos permiten acceder a Internet. Muchos de estos están hechos en C o en sus derivados. Los navegadores web mas usados como Google Chrome y Mozilla Firefox están escritos en parte en C++. En ese mismo lenguaje están escritos otros navegadores como Opera y Microsoft Edge y su antecesor Internet Explorer. Safari, el browser creado por Apple también está escrito en parte en C++, en Objective-C y en Switf, todos derivados de C.

Otras aplicaciones hechas en C o en sus derivados son todos los productos de Adobe (Photoshop, Acrobat, Illustrator, etc) los cuales están escritos en C y C++, AutoCAD, usado para diseño, originalmente fue escrito en C, pero las nuevas versiones están hechas en C++, y MySQL y PostgreSQL, sistemas de gestión de bases de datos muy populares, los cuales están escrito en en C y C++.


El lenguaje C es la base de muchas aplicaciones
El lenguaje C es la base de muchas aplicaciones


El lenguaje C presente en Internet



Al conectarnos a Internet, debemos recordar que el lenguaje C está presente en dicha conexión. Como se dijo antes, los navegadores web o browsers están escrito en este lenguaje o en sus derivados, al igual que el sistema operativo tanto de la computadora, laptop, tablet o smartphone en el que están instalados como del servidor al cual accedemos. Asimismo dichos servidores también tendrán instalados programas con PHP, cin el que se elaboran paginas web dinámicas con el que llenamos formularios, cuyos datos se guardan en servidores de base de datos, pata lo que se cuentan sistemas de gestión de base de datos (SGBD) como MySQL o PostgreSQL, que están desarrollados en C y en C++.

El lenguaje C de una forma u otra esta presente en Internet
El lenguaje C de una forma u otra está presente en Internet

Asimismo, muchas de las páginas web y redes sociales mas populares como Google, Facebook, Rwitter, Youtube, Wikipedia, WordPress usan C o sus derivados como C++ y PHP.

Bueno, vamos a dejarlo hasta aquí. Espero que haya sido de su agrado. Si tienen algun comentario, pueden hacerlo y no olviden suscribirse. ¡Hasta la próxima!

lunes, 3 de septiembre de 2018

La sucesion de Fibonacci

Saludos En esta publicación haré una explicación de la sucesión o serie de Fibonacci, así que empecemos,

Primero que nada debemos saber:

¿Qué es una sucesión?


Una sucesión es un conjunto de cosas (normalmente números) una detrás de otra, en un cierto orden.

Conocido esto, vamos a ver que:

¿Qué es la sucesión de Fibonacci?


La sucesión o serie de Fibonacci es una sucesión infinita de números naturales: 0, 1, 1, 2, 3, 5, 8, 13, 21,…

Los dos primeros números de la sucesión son 0 y 1. Los otros términos son la suma de los 2 términos anteriores en la sucesión: 0+1=1, 1+1=2, 1+2=3, 2+3=5, 3+5=8, 5+8=13, 8+19=21…

A los elementos de esta sucesión se les llama números de Fibonacci.

Cada número se calcula sumando los dos anteriores a él.
El 2 se calcula sumando (1+1)
El 3 es (1+2)
El 5 es (2+3)
y así sucesivamente

Basándose en lo anterior, la sucesión de Fibonacci se puede escribir como una regla, la cual es

Xn = Xn-1 + Xn-2
Donde:
Xn es el término en posición "n"
Xn-1 es el término anterior (n-1)
Xn-2 es el anterior a ese (n-2)

Por ejemplo el sexto término, es decir, n=6, se calcularía así:

X6 = X6-1 + X6-2 = X5 + X4 = 5 + 3 = 8

Lo anterior es valido si y solo si n es mayor o igual a 2: n 2

Si n es igual a 0, el termino obtenido es igual a 0:
Si n=0, entonces: X0 = 0

Si n es igual a 1, el termino obtenido es igual a 1:
Si n=1, entonces: X1 = 1

Por lo tanto, la sucesión de Fibonacci también se puede representar así:


Sucesion de Fibonacci
Sucesión de Fibonacci

El nombre de sucesión de Fibonacci se debe a Leonardo de Pisa, también conocido como Fibonacci, quien fue un matemático italiano que vivió en el siglo XIII, si bien esta sucesion ya se conocia en la India mucho tiempo antes.

Fibonacci presentó la sucesión en su obra Liber Abaci, en 1202, y manifiesta haberla encontrado al resolver el problema de la cría de conejos: "Cierto hombre tenía una pareja de conejos juntos en un lugar cerrado y desea saber cuántos son creados a partir de este par en un año, cuando es su naturaleza parir otro par en un simple mes, y en el segundo mes los nacidos parir también".

Esto seria así:
Partimos de una pareja de conejos el primer mes.
El segundo mes la pareja envejece pero no procrea.
El tercer mes la pareja procrea otra pareja (tenemos dos parejas).
El cuarto mes, la primera pareja vuelve a procrear y la pareja nueva envejece sin procrear (tenemos tres parejas).
El quinto mes, las dos parejas más viejas vuelven a procrear mientras que la nueva pareja no procrea (tenemos cinco parejas)

Origen de la sucesion de Fibonacci
Origen de la sucesión de Fibonacci

Se tiene la siguiente sucesión: 1, 1, 2, 3, 5,,,,,, esto seguirá indefinidamente

Asimismo se tiene que: 1 + 1 = 2
1 + 2 = 3
2 + 3 = 5
Y asi sucesivamente.

Otras formas de determinar la sucesión de Fibonacci


La sucesión de Fibonacci también se puede determinar de las siguientes maneras.

Función generadora


Cada número de Fibonacci se puede calcular por medio de la función generadora que es igual a:

Funcion generadora
Función generadora

Por medio del número áureo


Cada número de Fibonacci se puede calcular por el número áureo así:

Fibonacci-numero aureo
Calculo de números de Fibonacci por el numero áureo
Donde:
Φ: número áureo, que es aproximadamente igual a 1,618…
n es el número de Fibonacci a buscar

También la sucesión de Fibonacci se obtiene por medio del llamado triangulo de Pascal, de la siguiente manera:

Fibonacci-Pascal
Determinación de la sucesión de Fibonacci por el triangulo de Pascal

Otras características de la sucesión de Fibonacci


Si se construye un rectángulo con cuadrados internos que son la longitud de los números de Fibonacci, este se asemeja al rectángulo áureo.


Fibonacci-rectangulo aureo
Rectángulo áureo a partir de la sucesión de Fibonacci

En la sucesión de Fibonacci, un termino de cada 3 es par, un termino de cada 4 es múltiplo de 3, un termino de 5 es múltiplo de 5 y un termino de cada 7 es múltiplo de 13.

Multiplos en la sucesion de Fibonacci
Múltiplos en la sucesión de Fibonacci


El máximo común divisor de dos números de Fibonacci es otro número de Fibonacci.


Bueno vamos a dejarlo hasta aquí. Espero les sirva de utilidad esta introducción a la sucesión de Fibonacci ¡Hasta la próxima!

viernes, 31 de agosto de 2018

Numeros primos y su utilidad

Saludos. En esta publicación veremos un tipo de números muy especial que son los números primos ¿Por que son especiales? Lo sabremos en las siguientes lineas, así como su utilidad.

¿Que son números primos?


Un numero primo es aquel número entero que solo puede ser divisible entre el mismo y 1. Los números primos fueron definidos por primera vez por el matemático griego Euclides en su obra Los Elementos publicada alrededor del año 300 A.C. Ejemplos de números primos son el 2, el 7 y 11, ya que solo pueden dividirse entre ellos mismos y el 1. En cambio, 4, 6, 8, 9 y 0 no son primos ya que todos tienen otros divisores ademas de ellos mismos y la unidad

El matemático griego Eratóstenes ideó una forma, que es conocida como criba de Eratostenes, para saber cuales números son primos. Si se tienen los números del 1 al 100, :se trata de ir buscando los que sean múltiplos de algún otro número, aparte de ellos mismos y el 1.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100

El 2, 7 y 11, solo pueden dividirse entre ellos mismos y el 1, por lo tanto son primos. En cambio, 4, 6, 8, 9 y 10 no son primos ya que todos tienen otros divisores ademas de ellos mismos y la unidad Se indican aquellos números que son primos, es decir que solo pueden dividirse entre ellos mismos y el 1 mediante un sombreado amarillo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100

Si se toman en cuenta solo los números primos, comprendidos entre 1 y 100, la lista se vera mas reducida tal como se muestra:

2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97








A continuación se muestran los 168 primeros números primos, que son los comprendidos entre 1 y 1000:

2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
101
103
107
109
113
127
131
137
139
149
151
157
163
167
173
179
181
191
193
197
199
211
223
227
229
233
239
241
251
257
263
269
271
277
281
283
293
307
311
313
317
331
337
347
349
353
359
367
373
379
383
389
397
401
409
419
421
431
433
439
443
449
457
461
463
467
479
487
491
499
503
509
521
523
541
547
557
563
569
571
577
587
593
599
601
607
613
617
619
631
641
643
647
653
659
661
673
677
683
691
701
709
719
727
733
739
743
751
757
761
769
773
787
797
809
811
821
823
827
829
839
853
857
859
863
877
881
883
887
907
911
919
929
937
941
947
953
967
971
977
983
991
997

Como cada cierto tiempo se descubre un nuevo número primo, se dice que estos son infinitos. El número primo mas largo hasta el momento de escribir esta nota fue encontrado por cálculos hechos en a computadora en la Facultad de Ingeniería de la UNAM (Universidad Autónoma de México) el 15 de octubre de 2016 y consta de 1 001 953 (un millón mil novecientas cincuenta y tres) cifras.

¿Qué es un número compuesto?


Aquel número que no es primo se le llama compuesto. Un número compuesto es aquel que tiene varios divisores aparte del mismo y de la unidad (1). Ejemplo: 4, 6 y 9.

Teorema fundamental de la aritmética


Este teorema dice que todo entero positivo mayor que 1 es un número primo o bien un producto de números primos. Ejemplo:
2 = 2 (es un número primo)
6 = 2 x 3 (2 y 3 son primos)
15 = 3 x 5
25 = 52 = 5 x 5 (el número primo 5 se expresa en forma de potencia)
120 = 23 x 3 x 5 (el número primo 2 se expresa en forma de potencia)

Cómo saber si un número es primo o no


Para saber si un número es primo o no se le dividirá entre los números primos menores que este. Si no es divisible por ninguno de estos, entonces será primo. Pero si resulta divisible por alguno de esto entonces será compuesto. Aquí se muestran algunas indicaciones para facilitar los cálculos:
  • A excepción del 2, todo número par es compuesto, ya que son divisibles entre 2, es decir, 4, 8, 12, 22, 38, son números compuestos.
  • Todo número que termine en 5 es compuesto, ya que será divisible entre 5, como por ejemplo: 15, 25, 35.
  • Todo número que termine en 0 será divisible tanto entre 2 como entre 5, tal como 10, 20, 100, 1050.

¿Es el número 1 un número primo?


Durante mucho tiempo se consideró como primo al número 1, pero ha sido excluido de este grupo. Una razón la podemos encontrar en el teorema fundamental de la aritmética, el cual fue descrito anteriormente. Otra razón es que un numero primo solo admite dos divisores: él mismo y la unidad, por lo que se descartaría el 1. De allí fue que se acordó excluir al 1 como número primo.

Algunos tipos de números primos



Números primos de Mersenne


Se le llama número primo de Mersenne a aquel que es de la forma 2n - 1.

Descubiertos en 1644 por el monje francés Marin Mersenne quien afirmó que los números 2n - 1 eran primos para n = 2, 3, 5, 7, 13, 17, 19, 31, 67, 127 y 257, y que eran compuestos para los restantes enteros positivos n < 257. Para el año 1947 se terminó de chequear el rango de Mersenne, n <= 258, y se determinó que la lista correcta es: n = 2, 3, 5, 7, 13, 17, 19, 31, 61, 89, 107 y 127. Actualmente se conocen 50 primos de Mersenne, siendo este último número descubierto denominado como M77232917 y el cual es igual a:
M77232917 = 277232917 – 1

Donde M77232917 tiene más de 23 millones de dígitos.


Números primos de Sophie Germain


Un número primo de Sophie Germain es aquel que al multiplicarlo por 2 y sumarle 1 el resultado es también un número primo.
Ejemplo: Sea el número 2, si se multiplica por 2 y se le suma 1 se tiene que
2x2+1=5
Como 5 es un número primo, entonces 2 es número primo de Sophie Germain.


Números primos de Fermat


Un número primo de Fermat es aquel que cumple con la ecuación:
22n + 1, donde n es un numero natural.
Solo se conocen cinco primos de Fermat:
3 (n=0)
5 (n=1)
17 (n=2)
257 (n=3)
65537 (n=4)

Utilidad de los números primos



Los números primos suelen utilizarse en la seguridad informática, específicamente en el la criptografía que trata de codificar o cifrar mensajes, tal como veremos en el siguiente ejemplo.

A cada letra del abecedario le corresponderá un número de dos cifras:

A=01 B=02 C=03 D=04 E=05 F=06 G=07 H=08 I=09 J=10
K=11 L=12 M=13 N=14 Ñ=15 O=16 P=17 Q=18 R=19 S=20
T=21 U=22 V=23 W=24 X=25 Y=26 X=27 Y=28 Z=29

Quien envía el mensaje usa este método de cifrado, si el número que corresponde a la letra es primo, se deja como está, y si es compuesto, se le suma un número, que en este caso será 5:

A=06 B=02 C=03 D=09 E=05 F=11 G=07 H=13 I=14 J=15
K=11 L=17M=13 N=19 Ñ=20 O=21 P=17 Q=23 R=19 S=25
T=26 U=27 V=23 W=29 X=30 Y=31 X=32 Y=33 Z=29

Por lo tanto, la palabra “Agua” sería 06072706.

Para descifrar un mensaje, agrupamos el número en partes de dos cifras, como en este caso que queremos descifrar 13211706 0613140721. 

Agrupamos en partes de dos cifras:
13 21 17 06 06 13 14 07 21

Si buscamos la letra correspondiente en la tabla tendremos que 13 21 17 06 06 13 14 07 21 significa “Hola Amigo”.

La criptografía es usada en páginas web donde se necesita seguridad al realizar transacciones monetarias como en el sitio web de un banco o en el comercio electrónico, para lo cual se cuentan con algoritmos como el RSA (que son las iniciales de los apellidos de sus creadores: Rivest, Shamir y Adleman) el cual fue creado en el año 1977 por Ron Rivest, Adi Shamir y Leonard Adleman, del Instituto Tecnológico de Massachusetts (MIT) y está basado en la factorización de números enteros.

En los sistemas de criptografía como los usados en los bancos y en otras organizaciones donde se requieran hacer operaciones seguras, un usuario posee una clave pública y otra privada. Cuando el emisor obtiene la clave pública del receptor, cifra el mensaje con esa clave, y una vez que se recibe, el receptor usa su clave privada para descifrar la información. El cifrado con algoritmo RSA transforma el mensaje del emisor en una cifra resultante del producto de dos números primos grandes elegidos al azar: entre más grandes sean los números, más complicado será saber cuál es el producto de esas dos cifras y, por ende, más seguro será el sistema.

Parecería sencillo romper el cifrado, pues bastaría con descomponer un número en sus factores primos; pero, cuando se trabaja con primos de 100 dígitos, al multiplicarlos se obtendrá un número de tal magnitud que descomponerlo supondría una tarea de extrema dificultad.


En realidad el algoritmo RSA, como otros usados en encriptación son mas complicados y su explicación se hace mas larga, por lo que lo explicaré en otra oportunidad. Por ahora lo dejaré hasta aquí. Recuerden comnetar y suscribirse ¡Hasta la próxima!