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".
sábado, 28 de enero de 2012
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.
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:
- Análisis
- Diseño
- 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 las
“pruebas 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.
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.
¿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?
En realidad no, siempre podemos pensar en linux, aunque aqui nos topamos con varios puntos a considerar.
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.
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
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.
Suscribirse a:
Entradas (Atom)