sábado, 28 de enero de 2012

Divide y vencerás

No se trata del tipo de una estrategia militar ni de como resolver problemas familiares por una herencia. Divide y vencerás en algoritmos se refiere a una estrategia para resolver problemas matemáticos, recordemos que en un principio las computadoras fueron estudiadas y desarrolladas por físicos y matemáticos por lo que era obvio aplicar la forma en que ya resolvían cuestiones de álgebra (por mencionar una). También en un principio las computadoras fueron vistas precisamente para la automatización de cálculos que realizados por personas tomaban meses o incluso años u otros que requerían de rapidez como en la balística.

Es común ver en álgebra tomamos pequeñas partes de una ecuación para resolverlas por una parte, ya sea reduciendo si es una fracción, cancelando exponentes cuando se puede o aplicando una identidad trigonométrica y con esto simplificar la ecuación.

Es entonces que dividimos la ecuación en partes mas pequeñas y las resolvemos por separado, sumamos los resultados y obtenemos una solución satisfactoria y por eso decimos "Divide y vencerás".

miércoles, 25 de enero de 2012

Analisis de algoritmo

Bien puedo decir que el análisis del algoritmo es el paso mas importante para hacer un programa, de esto partimos para plantear bien un algoritmo y que este tenga el mejor orden.

En este paso podemos dejar de lado compiladores y editores gráficos. El análisis se refiere a estudiar el proceso para el cual queremos hacer un programa, ver las variables del proceso y de que tipo son así como plantear los cálculos que se requieran.

Otra importancia es que al realizar un análisis del resultado podemos definir cual seria el mejor lenguaje de programación que utilizaremos y si es que se requiere una base de datos para este, al igual que la plataforma que lo soportará.

Ahora bien, Aquí es necesario pensar en como resolver cada problema, si es cierto que mediante el uso de una computadora es posible simplificar mucho del trabajo rutinario solo que, pensar como programador también es pensar en un ordenador como una licuadora glorificada. La razón de esto es que una computadora no puede resolver un problema por si sola, es necesario decirle como hacerlo y como hacerlo bien.

Es entonces que un buen análisis del algoritmo dará un buen programa. Un buen comienzo es definir el problema, después plantear subproblemas mas pequeños. Con esto determinar las variables que intervienen y su interacción entre ellas para la solución final.


lunes, 23 de enero de 2012

Diseño de algoritmos


Hoy voy a escribir de forma breve lo que es el diseño de algoritmos. Ya mas adelante extenderé cada parte del tema pues este tema da para mucho mas que una entrada de blog

Conceptos básicos

En principio describiremos de forma general las técnicas para resolver algoritmos, estas no son otra cosa que estrategias utilizadas en la resolución de problemas que, originalmente fueron planteadas por matemáticos para su propio campo, y como estos mismos investigadores fueron los pioneros de la computación junto con físicos, aplicaron los mimos criterios para resolver los algoritmos. Cabe mencionar que en su principio la computación fue enfocada a la resolución de problemas matemáticos orientados a asuntos bélicos como la balística y que después se implementó el uso de las máquinas a cuestiones financieras; mismas que convergían en la solución de números.
Estas técnicas fueron nombradas de acuerdo al procedimiento que seguían, y las principlaes son:
  • Algoritmos voraces
  • Divide y vencerás
  • Programación dinámica
  • Vuelta atrás
  • Ramificación y poda

Niveles de abstracción para la construcción de algoritmos.

La construcción de algoritmos necesita de tres niveles de abstracción; es decir; son tres los pasos necesarios para su construcción. Estos son:
  1. Análisis
  2. Diseño
  3. Implementación

Análisis

Consiste en la recopilación de toda la información necesaria para el algoritmo, variables que lo rodean, el proceso que le demos a estas, y la salida que queremos encontrar.
Es aquí donde los procesos pueden identificarse como operaciones que se aplican a las variables del problema. Y se perfila el resultado deseado.

Diseño

Para esta etapa ya se tiene identificados y delimitado el problema, se conoce las variables involucradas y se sabe el los valores de salida deseados; no resueltas sino más bien que debemos esperar de estas; con lo cual se comienza a perfilar la solución mediante el planteamiento de la hipótesis, se modela el algoritmo mediante la aplicación de estructuras definidas para los algoritmos y se comienza hacer pruebas de su uso mediante laspruebas de escritorio

Implementación

En este paso ya se comienza la programación en un lenguaje adecuado al algoritmo basados en la solución que se tiene modelada.

Estructuras básicas de un algoritmo

En la implementación de algoritmos se puede observar la presencia de comportamientos clásicos y que están definidos a través de modelos previamente definidos.
Las estructuras típicas que podemos definir son:
  • Ciclos
  • Contadores
  • Acumuladores
  • Condicionales
  • Interruptores

Ciclos

Estas estructuras hacen que el algoritmo se repita de forma iterativa en función de una condición cumplida en un momento determinado.
Existen dos tipos de ciclos. Los que se ejecutan “mientras que” y los que se ejecutan “hasta que”

Mientras que:

Este realiza la verificación de la condición antes de ejecutar una instrucción, así es que, si se cumple la condición puede realizar su función de otro modo salta a otro paso. Al terminar el proceso vuelve hacer la verificación.

Hasta que

Este ciclo realiza su propio proceso y después hace la verificación de la condición para que este se ejecute y esta le dice si debe volver a realizar el proceso o seguir con el algoritmo.
Ambas iteraciones tienen en común que se debe cumplir cierta condición para realizar su proceso.

Contadores

Esta estructura también realiza iteraciones de las instrucciones por un momento conocido. Esta estructura sufre incrementos o decrementos del valor asignado a ella y se ejecutará mientras no se cumpla su condición.

Acumuladores

Estos guardan valores crecientes o decrecientes a lo largo de la ejecución del algoritmo. Esto debido a que los primeros y últimos valores así como los intermedios son relevantes para la solución o forman parte de ella.

Condicionales

Esta estructura tiene como fin que se realice o no cierta parte del código de acuerdo a una condición definida. Esto lo hace si se cumple una condición se ejecuta una parte del código si no se ejecuta otra.

Interruptores

Estas estructuras disparan un código o parte de uno si se cumple una condición o evento sin hacer incrementos o decrementos, solo si se cumple o sucede una condición.

Estrategias de diseño de algoritmos

Toda modelación de un algoritmo debe caer o se debe diseñar por una de estas estrategias para la resolución de un problema.

Algoritmos voraces

Estos se utilizan para la solución de problemas de optimización, son sencillos de programar y pueden encontrar una solución en un tiempo corto.

Divide y vencerás

Toma el problema y lo divide en partes más pequeñas y por ende más sencillas del mismo. La solución la encuentra haciendo una sumatoria do todas estas partes pequeñas.

Programación dinámica

Defina sub-problemas superpuestos y sub-estructuras optimas, buscan soluciones óptimas del problema en su conjunto.

Vuelta atrás

Toma un valor del conjunto de posibles soluciones posibles al problema y lo evalúa para ver si es la solución deseada. Si se comprueba que este valor no es el mejor regresa al punto donde tomo la variable para evaluarla y elige el valor siguiente, Esto lo realizará hasta que encuentra un valor satisfactorio.

Ramificación y poda

Su estrategia es muy similar a vuelta atrás, solo que se diferencia en que puede ejecutar un conjunto de posibles soluciones a la vez y no hacer esto de una en una. De este proceso puede discriminar a un conjunto de posibles soluciones y descartar (poda) los valores que no satisfacen al algoritmo. Realiza una segunda evaluación de los valores restantes y descarta los menos óptimos. El proceso se ejecuta hasta que se obtiene un valor que resuelva el problema y se pueda determinar a alguno como el más óptimo.

sábado, 21 de enero de 2012

Ciclos de desarrollo de los sistemas


El ciclo de desarrollo de los sistemas o ciclo de vida de los sistemas (SDLC: Systems Devetopment Life Cycle) es un enfoque por etapas de análisis y de diseño, que postula que el desarrollo de los sistemas mejora cuando existe un ciclo específico de actividades del analista y de los usuarios.

En general, los analistas no están de acuerdo respecto al número exacto de etapas que conforman el ciclo de desarrollo de los sistemas; sin embargo, se reconoce la importancia de su enfoque sistemático. Se dividirá el ciclo de vida en siete etapas, que aunque se presentan de manera discreta, nunca se llevan a cabo como un elemento Independiente. En lugar de ello. se realizan al mismo tiempo diversas actividades, y éstas llegan a repetirse. Por ello es de mayor utilidad suponer que e! ciclo de desarrollo de los sistemas transcurre en etapas (con actividades en acción que luego cesan poco a poco) y no como elementos separados.

Identificación de problemas, oportunidades y objetivos

 

En esta primera etapa del ciclo de desarrollo de los sistemas, el analista se involucra en la identificación de los problemas, de las oportunidades y de los objetivos. Esta fase es crucial para el éxito del resto del proyecto, pues nadie estará dispuesto a desperdiciar su tiempo dedicándolo al problema equivocado.
La primera etapa requiere que el analista observe de forma objetiva lo que ocurre en una empresa. Luego, en conjunto con los otros miembros de la organización hará notar los problemas. Muchas veces esto ya fue realizado previamente: y por ello. es que se llega a invitar al analista.

Las oportunidades son acuellas situaciones que el analista considera que pueden perfeccionarse mediante el uso de los sistemas de información computarizados. Al aprovechar las oportunidades, la empresa puede lograr una ventaja competitiva o llegar a establecer un estándar industrial.

La identificación de objetivos también es un componente importante de la primera fase. En un comienzo, el analista deberá descubrir lo que la empresa intenta realizar, y luego estará en posibilidad de determinar si el uso de los sistemas de información apoyaría a la empresa para alcanzar sus metas, el encaminarla a problemas u oportunidades específicas.

Determinación de los requerimientos de información

 

La siguiente etapa que aborda el analista, es la determinación de los requerimientos de información a partir de los usuarios particularmente involucrados. Para identificar los requerimientos de información dentro de ¡a empresa, pueden utilizarse diversos instrumentos, los cuales incluyen: el muestreo, el estudio de los datos y formas usadas por la organización, la entrevista, los cuestionarios: la observación de la conducta de quien toma las decisiones, asi como de su ambiente: y también el desarrollo de prototipos.
En esta etapa el analista hace todo lo posible por identificar qué información requiere el usuario para desempeñar sus tareas. Puede ver, cómo varios de los métodos para establecer las necesidades de información, lo obligan a relacionarse directamente con los usuarios. Esta etapa sirve para elaborar la imagen que el analista tiene de la organización y de sus objetivos. En ocasiones, se llegan a concluir sólo las primeras dos etapas del ciclo de desarrollo de los sistemas.

Análisis delas necesidades del sistema

 

La siguiente etapa que ejecuta el analista de sistemas consiste en analizar las necesidades propias del sistema. Una vez más, existen herramientas y técnicas especiales que facilitan al analista la realización de las determinaciones requeridas. Estas incluyen el uso de los diagramas de flujo de datos (DFD)que cuentan con una técnica estructurada para representar en forma gráfica la entrada de datos de la empresa, los procesos y la salida de la información. A partir del diagrama de flujo de datos se desarrolla un diccionario de datos que contiene todos los elementos que utiliza el sistema, así como sus especificaciones, si son alfanuméricos, descripción, clave primaria, entre otros.
Durante esta fase el analista de sistemas también analiza las decisiones estructuradas por realizar, que son decisiones donde las condiciones, condiciones alternativas, acciones y reglas de acción podrán determinarse. Existen tres métodos para el análisis de las decisiones estructuradas: el lenguaje estructurado (en nuestro caso el español), las tablas de decisión y los árboles de decisión.

No todas las decisiones en las empresas se encuentran estructuradas; no obstante, es importante que las comprenda el analista de sistemas. Las decisiones semi-estructuradas (decisiones que se toman bajo nesgo) con frecuencia se apoyan en los Sistemas de Toma de Decisiones. Cuando analiza las decisiones semi-estructuradas. el analista las examina de acuerdo con el grado de complejidad del problema y con el número de criterios considerados al llevar a cabo las decisiones.

El análisis de decisiones de criterio múltiple (aquellas decisiones donde numerosos factores tienen que equilibrarse) también es parte de esta etapa. Se disponen de muchas técnicas para e' análisis de decisiones de criterio múltiple; incluyendo entre otras, e! proceso de intercambio y la aplicación de métodos de ponderado.

A esta altura del ciclo de desarrollo del sistema, el analista prepara una propuesta del sistema que resume todo lo que ha encontrado, presenta un análisis costo / beneficio de las alternativas y plantea las recomendaciones (si es que existen) de lo que deberá realizarse. Si la dirección acepta alguna de las recomendaciones, el analista procederá de acuerdo con ella.

Diseño del sistema recomendado

 

En esta etapa del ciclo de desarrollo de los sistemas, el analista de sistemas usa la información que recolectó con anterioridad y elabora el diseño lógico del sistema de Información. El analista diseña procedimientos precisos de captura de datos, con el fin de que los datos que se introducen al sistema sean los correctos. Ei analista también diseña accesos efectivos al sistema de información, mediante el uso de las técnicas de diseño de formularios y de pantallas.

Una parte del diseño lógico del sistema de información es el diseño de la interfaz con el usuario. La interfaz conecta al usuario con el sistema, y evidentemente, es de suma importancia. Serían ejemplos de interfaces para el usuario: el uso del teclado para introducir preguntas o respuestas, el uso de menús en la pantalla, con las opciones que tiene el usuario, el uso de dispositivos como el ratón (mouse) y muchos otros.

La etapa del diseño también incluye e! diseño de los archivos o la base de datos que almacenará aquellos datos requeridos por quien toma las decisiones en la organización. Una base de datos bien organizada es fundamental para cualquier sistema de información. En esta etapa, el analista diseña la salida (en pantalla o impresa) hacia el usuario, de acuerdo con sus necesidades de información.

Desarrollo y documentación del software

 

En esta etapa del ciclo de desarrollo de los sistemas, el analista trabaja con los programadores para desarrollar todo el software original que sea necesario. Dentro de las técnicas estructuradas para el diseño y documentación de! software se tienen: el método HIPO, los diagramas de flujo Nassi-Schneiderman, ios diagramas Warnier-Orr y el pseudocódigo. Aquí es donde, el analista de sistemas transmite al programador los requerimientos de programación.

Durante esta fase, el analista también colabora con los usuarios para desarrollar la documentación indispensable del software, incluyendo los manuales de procedimientos. La documentación le dirá al usuario como operar el software, y así también, qué hacer en caso de presentarse algún problema.

Pruebas y mantenimiento del sistema

 

El sistema de información debe probarse antes de utilizarlo. El costo es menor si se detectan los problemas antes cié la entrega del sistema. El programador realiza algunas pruebas por su cuenta, otras se llevan a cabo en colaboración con el analista de sistemas. En un principio, se hace una serie de pruebas, con datos tipo, para identificar las posibles fallas del sistema: más adelante, se utilizarán los datos reales.

El mantenimiento del sistema y de su documentación empiezan justamente en esta etapa: y después, esta función se realizará de forma rutinaria a lo largo de toda la vida del sistema. Las actividades de mantenimiento integran una buena parte de la rutina del programador, que para las empresas llegan a implicar importantes sumas de dinero. Sin embargo, el costo del mantenimiento disminuye de manera importante cuando el analista aplica procedimientos sistemáticos en el desarrollo de los sistemas.

Implantación y evaluación del sistema

 

En esta última etapa del desarrollo del sistema, el analista ayuda a implantar el sistema de información. Esto incluye el adiestramiento que el usuario requerirá. Si bien, parte de esta capacitación la dan las casas comerciales, la supervisión del adiestramiento es una responsabilidad del analista de sistemas. Más aún, el analista necesita planear la suave transición que trae consigo un cambio de sistemas.

Aunque la evaluación del sistema se plantea como parte integrante de la última etapa del ciclo de desarrollo de los sistemas; realmente, la evaluación toma parte en cada una de las etapas. Uno de los criterios fundamentales que debe satisfacerse, es que ei futuro usuario utilice el sistema desarrollado.

jueves, 19 de enero de 2012

Historia de los sistemas operativos


Década de 1940.

A finales de esta década se le puede considerar como el nacimiento de la primera generación de computadoras, donde se accedía a ellas de forma directa mediante micro-interruptores por los cuales se programa las funciones que realizarían en la memoria. Esto se realizaba si algún orden establecido como un estándar. En este momento de la historia no existía un sistema operativo por lo que los programadores hacían su trabajo sin ayuda externa, en pocas palabras en lenguaje máquina.

Década de 1950.

En esta década nacen los sistemas operativos con conceptos como el monitor residente, el proceso por lotes y almacenamiento temporal.

Década de 1960.

En esta década el avance fue muy grande produciendo cambios sumamente notorios para lo que se venía conociendo como lo fue la multiprogramación permitiendo que cuando la CPU ejecutará un operación podía pasar a ejecutar otra operación sin esperar a terminará la primera. Multiprocesador, esto evitaba que al ejecutarse dos proceso distintos entraran en conflicto al escribir o leer en memoria.

Década de 1970.

En esta década ya existían Atlas Supervisor y el OS/360 esta década marca el inicio de UNIX siendo este en el único SO escrito en un lenguaje de alto nivel hasta el momento. También se desarrolla el SO MULTIX y el BDOS pero todos mostraban los mismos inconvenientes; eran muy grandes y complejos. A pesar de ser un medio entre el usuario y la máquina para interactuar con ellos el usuario requería de grandes conocimientos de programación sin mencionar que el gran consumo de recursos limitaba su alcance.

Década de 1980.

Con la creación de los circuitos integrados sobrevinieron números avances en la computación como el nacimiento de C++ y el lenguaje Eiffel dentro del paradigma de orientación a objetos. Los sistemas operativos predominantes eran el MSDOS que Microsoft escribió para los ordenadores IBM y todos los que utilizaron el Intel 8088 y el UNIX para el Motorola 68000.
En 1984 aparece el Mc OS con una interface (GUI), multitareas y mouse. Por su parte Microsoft compra el QDOS que tras realizar unas adaptaciones se convierte en la primera versión del MSDOS y que a mediados de la década este forma parte de Windows que en estos años solo era una interfaz gráfica.

Década de 1990.

Microsoft mejora su Windows pero no es hasta su versión ME (Millenium) que deja de ser una interfaz gráfica y es un sistema operativo completo, antes de este cambio la versión 98 se consideró como la más rápida y dinámica de la década y después de esta la empresa se vio presionada por los avances en el Mc OS que ganaba muchos adeptos a pesar que en la década pasada los usuarios pensaban que el uso del mouse era lo más parecido a un juguete y tuvieron que cambiar su forma deber una computadora en líneas de comando; en estos años el concepto de la interfaz gráfica domina el mercado.
Esta década también vio nacer a LINUX que era una versión mejorada de UNIX que se caracterizó por trabajar con muchos comandos aunque se le integro el uso de un GUI que primero fue KDE y después su competencia fue GNOME.

Años 2000 y actualidad.

Los sistemas operativos evolucionan no solo a computadoras y en algunos casos a supercomputadoras y servidores, estos también se ven presentes en dispositivos móviles como teléfonos celulares. Hoy en día podemos ver un sistema operativo aplicado tabletas electrónicas teléfonos inteligentes e incluso línea blanca como refrigeradores.
Principalmente se puede elegir entre computadores con Mc OS, Windows y distribuciones Linux así como también en los últimos años ha destacado el surgimiento de sistemas operativos que corren solo en dispositivos móviles sin importa el chip que utilicen como lo es el Android que es software libre para teléfonos celulares.

miércoles, 18 de enero de 2012

Lenguajes de programación


La palabra programación se define como el proceso de creación de un programa de computadora, mediante la aplicación de procedimientos lógicos, a través de los siguientes pasos:
  • El desarrollo lógico del programa para resolver un problema en particular.
  • Escritura de la lógica del programa empleando un lenguaje de programación específico (codificación del programa).
  • Ensamblaje o compilación del programa hasta convertirlo en lenguaje de máquina.
  • Prueba y depuración del programa.
  • Desarrollo de la documentación.
Para que la computadora entienda nuestras instrucciones debe usarse un lenguaje específico conocido como código máquina, el cual la máquina comprende fácilmente, pero que lo hace excesivamente complicado para las personas. De hecho sólo consiste en cadenas extensas de números 0 y 1.
Para facilitar el trabajo, los primeros operadores de computadoras decidieron hacer un traductor para reemplazar los 0 y 1 por palabras o abstracción de palabras y letras provenientes del inglés; éste se conoce como lenguaje ensamblador. Por ejemplo, para sumar se usa la letra A de la palabra inglesa add (sumar). El lenguaje ensamblador sigue la misma estructura del lenguaje máquina, pero las letras y palabras son más fáciles de recordar y entender que los números.

La necesidad de recordar secuencias de programación para las acciones usuales llevó a denominarlas con nombres fáciles de memorizar y asociar: ADD (sumar), SUB (restar), MUL (multiplicar), CALL (ejecutar subrutina), etc. A esta secuencia de posiciones se le denominó "instrucciones", y a este conjunto de instrucciones se le llamó lenguaje ensamblador. Posteriormente aparecieron diferentes lenguajes de programación, los cuales reciben su denominación porque tienen una estructura sintáctica similar a los lenguajes escritos por los humanos, denominados también lenguajes de alto nivel.
La primera programadora de computadora conocida fue Ada Lovelace, hija de Anabella Milbanke Byron y Lord Byron. Anabella introdujo en las matemáticas a Ada quien, después de conocer a Charles Babbage, tradujo y amplió una descripción de su máquina analítica. Incluso aunque Babbage nunca completó la construcción de cualquiera de sus máquinas, el trabajo que Ada realizó con éstas le hizo ganarse el título de primera programadora de computadoras del mundo. El nombre del lenguaje de programación Ada fue escogido como homenaje a esta programadora.

A finales de 1953, John Backus sometió una propuesta a sus superiores en IBM para desarrollar una alternativa más práctica al lenguaje ensamblador para programar la computadora central IBM 704. El histórico equipo Fortran de Backus consistió en los programadores Richard Goldberg, Sheldon F. Best, Harlan Herrick, Peter Sheridan, Roy Nutt, Robert Nelson, Irving Ziller, Lois Haibt y David Sayre.

El primer manual para el lenguaje Fortran apareció en octubre de 1956, con el primer compilador Fortran entregado en abril de 1957. Esto era un compilador optimizado, porque los clientes eran reacios a usar un lenguaje de alto nivel a menos que su compilador pudiera generar código cuyo desempeño fuera comparable al de un código hecho a mano en lenguaje ensamblador.
En 1960, se creó COBOL, uno de los lenguajes usados aún en 2010 en informática de gestión.

A medida que la complejidad de las tareas que realizaban las computadoras aumentaba, se hizo necesario disponer de un método más eficiente para programarlas. Entonces, se crearon los lenguajes de alto nivel, como lo fue BASIC en las versiones introducidas en los microordenadores de la década de 1980. Mientras que una tarea tan sencilla como sumar dos números puede necesitar varias instrucciones en lenguaje ensamblador, en un lenguaje de alto nivel bastará una sola sentencia.

Todos los lenguajes de programación tienen algunos elementos de formación primitivos para la descripción de los datos y de los procesos o transformaciones aplicadas a estos datos (tal como la suma de dos números o la selección de un elemento que forma parte de una colección). Estos elementos primitivos son definidos por reglas sintácticas y semánticas que describen su estructura y significado respectivamente.

A la forma visible de un lenguaje de programación se le conoce como sintaxis. La mayoría de los lenguajes de programación son puramente textuales, es decir, utilizan secuencias de texto que incluyen palabras, números y puntuación, de manera similar a los lenguajes naturales escritos. Por otra parte, hay algunos lenguajes de programación que son más gráficos en su naturaleza, utilizando relaciones visuales entre símbolos para especificar un programa.
La sintaxis de un lenguaje de programación describe las combinaciones posibles de los símbolos que forman un programa sintácticamente correcto. El significado que se le da a una combinación de símbolos es manejado por su semántica (ya sea formal o como parte del código duro de la referencia de implementación). Dado que la mayoría de los lenguajes son textuales, este artículo trata de la sintaxis textual.

La sintaxis de los lenguajes de programación es definida generalmente utilizando una combinación de expresiones regulares (para la estructura léxica) y la Notación de Backus-Naur (para la estructura gramática).
La semántica estática define las restricciones sobre la estructura de los textos válidos que resulta imposible o muy difícil expresar mediante formalismos sintácticos estándar. Para los lenguajes compilados, la semántica estática básicamente incluye las reglas semánticas que se pueden verificar en el momento de compilar. Por ejemplo el chequeo de que cada identificador sea declarado antes de ser usado (en lenguajes que requieren tales declaraciones) o que las etiquetas en cada brazo de una estructura case sean distintas. Muchas restricciones importantes de este tipo, como la validación de que los identificadores sean usados en los contextos apropiados (por ejemplo no sumar un entero al nombre de una función), o que las llamadas a subrutinas tengan el número y tipo de parámetros adecuado, puede ser implementadas definiéndolas como reglas en una lógica conocida como sistema de tipos. Otras formas de análisis estáticos, como los análisis de flujo de datos, también pueden ser parte de la semántica estática. Nuevos lenguajes de programación como Java y C# tienen un análisis definido de asignaciones, una forma de análisis de flujo de datos, como parte de su semántica estática.

Un sistema de tipos define la manera en la cual un lenguaje de programación clasifica los valores y expresiones en tipos, como pueden ser manipulados dichos tipos y como interactúan. El objetivo de un sistema de tipos es verificar y normalmente poner en vigor un cierto nivel de exactitud en programas escritos en el lenguaje en cuestión, detectando ciertas operaciones inválidas. Cualquier sistema de tipos decidible tiene sus ventajas y desventajas: mientras por un lado rechaza muchos programas incorrectos, también prohíbe algunos programas correctos aunque poco comunes. Para poder minimizar esta desventaja, algunos lenguajes incluyen lagunas de tipos, conversiones explícitas no checadas que pueden ser usadas por el programador para permitir explícitamente una operación normalmente no permitida entre diferentes tipos. En la mayoría de los lenguajes con tipos, el sistema de tipos es usado solamente para checar los tipos de los programas, pero varios lenguajes, generalmente funcionales, llevan a cabo lo que se conoce como inferencia de tipos, que le quita al programador la tarea de especificar los tipos. Al diseño y estudio formal de los sistemas de tipos se le conoce como teoría de tipos.

Existen dos tipos de lenguajes claramente diferenciados; los lenguajes de bajo nivel y los de alto nivel.

El ordenador sólo entiende un lenguaje conocido como código binario o código máquina, consistente en ceros y unos. Es decir, sólo utiliza 0 y 1 para codificar cualquier acción.

Los lenguajes más próximos a la arquitectura hardware se denominan lenguajes de bajo nivel y los que se encuentran más cercanos a los programadores y usuarios se denominan lenguajes de alto nivel.

Lenguajes de bajo nivel

 

Lenguaje de máquina es el sistema de códigos directamente interpretable por un circuito microprogramable, como el microprocesador de una computadora o el microcontrolador de un autómata. Este lenguaje está compuesto por un conjunto de instrucciones que determinan acciones a ser tomadas por la máquina. Un programa consiste en una cadena de estas instrucciones de lenguaje de máquina (más los datos). Estas instrucciones son normalmente ejecutadas en secuencia, con eventuales cambios de flujo causados por el propio programa o eventos externos. El lenguaje de máquina es específico de cada máquina o arquitectura de la máquina, aunque el conjunto de instrucciones disponibles pueda ser similar entre ellas.

Los circuitos microprogramables son sistemas digitales, lo que significa que trabajan con dos únicos niveles de tensión. Dichos niveles, por abstracción, se simbolizan con el cero, 0, y el uno, 1, por eso el lenguaje de máquina sólo utiliza dichos signos. Esto permite el empleo de las teorías del álgebra booleana y del sistema binario en el diseño de este tipo de circuitos y en su programación.
El desarrollo tecnológico ha permitido evolucionar desde las redes de relés electromagnéticos de Shannon a circuitos con tubos de vacío, luego a redes transistorizadas, hasta llegar a los modernos circuitos integrados cuya cúspide lo forman los circuitos microprogramados.

Lenguajes de alto nivel

 

Un lenguaje de programación de alto nivel se caracteriza por expresar los algoritmos de una manera adecuada a la capacidad cognitiva humana, en lugar de a la capacidad ejecutora de las máquinas.
En los primeros lenguajes de alto nivel la limitación era que se orientaban a un área específica y sus instrucciones requerían de una sintaxis predefinida. Se clasifican como lenguajes procedimentales.
Otra limitación de los lenguajes de alto nivel es que se requiere de ciertos conocimientos de programación para realizar las secuencias de instrucciones lógicas. Los lenguajes de alto nivel se crearon para que el usuario común pudiese solucionar un problema de procesamiento de datos de una manera más fácil y rápida.

Por esta razón, a finales de los años 1950 surgió un nuevo tipo de lenguajes de programación que evitaba estos inconvenientes, a costa de ceder un poco en las ventajas. Estos lenguajes se llaman de tercera generación o de alto nivel, en contraposición a los de bajo nivel o de nivel próximo a la máquina.

Los lenguajes de alto nivel más conocidos son:
  • Ada
  • ALGOL
  • BASIC
  • C++
  • C#
  • COBOL
  • Fortran
  • Java
  • Lisp
  • Modula-2
  • Pascal
  • Perl
  • PHP
  • PL/1
  • PL/SQL

martes, 17 de enero de 2012

Primer computador en México


Parte Frontal de la IBM 650
La iniciativa por instalar un computador electrónico en México, específicamente en la UNAM; máxima casa de estudios del país, nace de un proyecto de colaboración entre esta universidad y la UCLA (Universidad de California los Ángeles) en el que se requería resolver sistemas de ecuaciones muy complejos, los cuales a los investigadores mexicanos les tomo nueve meses y cuando le enviaron sus resultados a su contraparte en Estados Unidos a estos les tomo solo 3 semanas el proceso. 

Este hecho logro llamar la atención del Dr. Nabor Carrillo Flores; entonces rector de la UNAM en 1955; pues para lograr el tiempo para la resolución de estos cálculos en el mencionado tiempo se necesitaría de la mitad de la población Norte Americana. Al cuestionar al director del proyecto en la UCLA responde que los cálculos fueron elaborados con el CEREBRO ELECTRONICO NACIONAL el cual era un computador IBM-650 mismo modelo que fue instalado en el país en renta, pues se enfrentaron a la falta de presupuesto para este proyecto y a la oposición de otros investigadores que consideraban que los $25,000.00 mensuales eran un gasto innecesario. Sin mencionar que el equipo no era nuevo pues fue heredado de la UCLA.Es entonces que el 8 de Junio de 1958, abre sus puertas el Centro de Cálculo Electrónico (CEE) ubicado en el sótano de la antigua Facultad de Ciencias.
Panel trasero de la IBM 650

El IBM-650 era un computador de bulbos y operaba con un tambor magnético con capacidad de 20,000 dígitos, efectuaba 13,000 operaciones de suma y resta por segundo y operaba con una lectora-perforadora de tarjetas además de un ensamblador llamado SOAP y un pseudo-compilador llamado RUNCIBLE. Las primeras tareas que resolvió fueron problemas de física, astronomía e ingeniería química. 

En 1960 el CEE debido a la demanda de usuarios y a que el proyecto resulto ser rentable gracias a al subarrendamiento del equipo el CEE instalo un equipo BENDIX G-15 semi-transistorizada con un tambor magnético con memoria de 2,160 palabras de 29bits. También se montó un equipo de lectora-perforadora de cinta de papel y una máquina de escribir que funcionaba como consola. En este mismo año se desarrolló en el Departamento de Teoría Administrativa de la UNAM, la computadora analógica UNIKORNIO, que puede considerarse como la primera computadora de este tipo que se construyó en México.
En 1961 se crea otro centro de cómputo en la parte baja de Rectoría de la UNAM: la Unidad de Sistematización de Datos. El Dr. Manny Lemann fue invitado en 1962 a la UNAM y con su ayuda se diseñó la computadora digital MAYA, basándose en el diseño de la SABRE, que era una máquina que daba servicio en la Universidad de Israel.
En 1962 se renta un equipo BULL GAMMA-30 con memoria de ferrita y totalmente transistorizada.



Bulbo para IBM 650
En 1965 se instaló en la UNAM el primer computador con el fin de brindar apoyo administrativo, automatización de nóminas y contabilidad; una IBM-1440 y con esto evento se crea el Departamento de Sistemas del Patronato Universitario.

En 1961 el Instituto Politécnico Nacional (IPN) crea el Centro Nacional de Cálculo donde se instaló una IBM-709 que a diferencia de la computadora de la UNAM la del CENAC no fue rentado si no que fue una donación por parte de IBM. Después el CENAC adquirió una computadora analógica PACE-231 y otra digital IBM-1620.

En el año de 1965, el CENAC crea una maestría en ciencias con especialidad en computación. Dos años más tarde la Escuela Nacional Mecánica y Eléctrica (ESIME) incorpora a su plan de estudios la especialidad en Computación.
En 1967, el Instituto Tecnológico y de Estudios Superiores de Monterrey comenzó a impartir cursos introductorios a la computación a nivel licenciatura desde mediados de 1960 y en 1967 crea la carrera en Ingeniería en Sistemas Computacionales.

En la década de los 70’s se crean distintos centros de investigación especializados en computadoras, así como la implementación de programas a nivel licenciatura en escuelas como la Universidad Autónoma de Puebla con su licenciatura en Computación dentro del su Escuela de
Físico-Matemáticas.

A principios de la década de 1980 el CEE tenía ya bien definida la diferencia en sus actividades de investigación y la automatización administrativa siendo esta rama la que crea la División General de Servicios de Cómputo Académico (DGSCA), mientras la segunda se convierte en el Instituto en Investigaciones en Matemáticas Aplicadas y Sistemas (IIMAS) mismo que llego a contar con 23 investigadores trabajando a tiemplo completo. Pero estos avances se vieron frenados con la situación económica que trajo consecuencias trágicas desintegrando a la mayor parte de grupos de investigadores, ejemplo claro fue que el ya mencionado IIMAS termino solo con solo 4 investigadores. Pero aun así se crea el CIMAT en el IPN en 1983 para poder satisfacer la demanda de esta ciencia en el país.

En la década de los noventas, los grupos de investigación en el área toman un respiro pues se crean nuevos centros de investigación tales como: El Centro de Investigación en Computación (CIC) del Instituto Politécnico Nacional, el Laboratorio Nacional de Informática Avanzada (LANIA) en Xalapa, Veracruz; la Coordinación de Ciencias Computacionales del Instituto Nacional de Astrofísica, Óptica y Electrónica (INAOE) y el Departamento de Ciencias de la Computación del Centro de Investigación Científica y de Educación Superior de Ensenada (CICESE), entre otros.

lunes, 16 de enero de 2012

Lenguaje de altonivel

¿Cual es la razón para llamar al lenguaje como de alto nivel?

¿Es acaso software muy especializado? o solo lo usan ciertas personas en trabajos como los que usan en la NASA para lanzar naves espaciales.

Bueno en realidad no es así, los lenguajes de alto nivel se llaman de esta forma porque están mas arriba (en posición) del lenguaje maquina. Osea, si tomamos como base al lenguaje de maquina (lenguaje de bajo nivel por estar en la base) arriba de este tendrá otro lenguaje que se parezca mas al lenguaje nativo de quien programa; por ejemplo ensamblador. Arriba de estos, el de maquina y el ensamblador están ahora si los lenguajes de alto nivel como el C++, PHP, Fortran y varios mas, todos algo mas parecidos al lenguaje que utilizamos ya que en ningún momento vemos 0's y 1's solo comandos a modo de palabras.

  • En resumen, el lenguaje de mas bajo nivel es el lenguaje maquina que solo son 0 y 1 
  • Arriba están los lenguajes de bajo nivel como el ensamblador que son un conjunto de instrucciones aritmeticológicas sin la capacidad de encapsular dichas instrucciones en funciones que no estén ya contempladas en la arquitectura del hardware.
  • Y mas arriba los lenguajes de alto nivel que ya son parecidos al lenguaje nativo y tienen orden, gramática y vocabulario 

domingo, 15 de enero de 2012

Migrar o no migrar a linux, esa es la cuestión.

A ultimas fechas he dejado de ver esa hegemonía de windows como OS en todos las computadoras que veo; es cierto que windows Xp fue demasiado popular y a últimas fechas los usuarios de las Mac's han ido en aumento. ¿Pero en realidad estas son las únicas opciones que tenemos?

Windows o Mac

En realidad no, siempre podemos pensar en linux, aunque aqui nos topamos con varios puntos a considerar.

  • Windows será feo y todo pero linux lo es un mas
  • Mac Os si es realmente bonito
  • Podre hacer todo lo necesito en linux como en windows
  • y así muchas otras
Mucho de esto es valido lo se, o al menos lo fue mejor dicho, hoy en día linux ha evolucionado mucho junto con los programas que usa. Lo que si es cierto es que tenemos que cambiar nuestro paradigma con respecto a Microsoft y esto en gran manera a las suites de ofimatica con todo de que MS Oficce es un gran conjunto de herramientas; yo creo que es la mejor suite para su fin; también hay que ver existen otras opciones muy buenas y que en realidad pueden hacer cualquier documento igual que en office solo que debemos machetearle un poco mas.

Y en general para cualquier programa existe una opción de software libre para linux. tal vez solo el Adobe Flash para la creación de animaciones, juegos y otros contenidos interactivos no tenga su símil para linux o al menos no al momento que escribo esta entrada porque hasta el silverlight de microsoft tiene su contra parte en moonlight que es lo mismo pero para linux.

Pero ya estando dentro de lo que es migrar a linux primero hay que ver que existen varias distribuciones y todas las podemos ver en este link. Aqui veremos que existe no solo linux si no que esta Ubuntu, Linuxmint, Suse.... y muchos mas y en un comienzo hay que ver que si todos son linux pero tambien existen varias empresas que pueden hacer desarrollo sobre el mismo sistema operativo ya que linux es un sistema operativo este se queda solo en el núcleo y la interacción con el usuario se realiza mediante un gestor de archivos o un gestos de escritorio tal como GNOME o KDE y otros mas.

Cada distribución tiene una filosofía diferente, Ubuntu se define como un SO basado en software libre dirigido a un publico general y que en un sentido comienzan a hacer la migración desde windows pero que tampoco pretende ser una herramienta netamente para principiantes ya que permite hacer todas las fusiones avanzadas que necesitemos. También existen distros enfocados y desarrollados por empresas instituciones e incluso gobiernos. Uno de ellos es GOOBUNTU que es desarrollado y soportado por Google y que solo se usa de forma interna y gnuLinex que es desarrollado por el gobierno de Extremadura en España.

En si todas son iguales lo que hay que observar es el escritorio que queremos usar, Ubuntu utiliza GNOME y existe la posibilidad de utilizar KDE si en su lugar instalamos Kubuntu o LXE si optamos por Lubuntu que vuelvo a que son lo mismo solo cambia el escritorio y con ello algo como el rendimiento y otras opciones. Para este blog me enfocare en Ubuntu, que es lo que utilizo.