Está en la página 1de 8

UNIVERSIDAD NACIONAL AUTNOMA DE MXICO.

FACULTAD DE ESTUDIOS SUPERIORES ARAGN.

Artculo #3: Lenguaje ensamblador.

Alumno: Ponce Snchez Rubn Omar.

Grupo: 2657.

Fecha de entrega: 7 de Marzo del 2017


Un excelente cdigo va ms all de lo ordinario.
El mundo est lleno de estudios que esbozan los desastres de ingeniera de software. Casi todos los
programadores han trabajado en algn proyecto que incluye cdigo "punto menos que estelar", el cdigo fuente
era difcil de leer y mantener. En raras ocasiones, algunos programadores tienen la oportunidad de trabajar en un
sistema bien diseado, una verdadera obra de arte que los inspira y usualmente provoca admiracin, y
exclaman, "Este es verdaderamente un gran cdigo!"

Claramente, los ingenieros profesionales de software deberan esforzarse para alcanzar este nivel de grandeza
en todo su cdigo. Pero la verdadera pregunta es, " Qu hace excelente al cdigo?" No se llega a escribir un
gran cdigo con el solo "cumplir las especificaciones". Es verdad, en las condiciones actuales de desarrollo,
algunos podran creer que el solo hecho de cumplir las especificaciones hace que una aplicacin sobresalga, ya
que muchos proyectos de desarrollo fracasan para cumplir los objetivos de su diseo original.

Sin embargo, en otras reas, la grandeza es raramente definida al hacer lo esperado exitosamente; la grandeza es
definida por realizar algo ms all de lo esperado. Los ingenieros de Software no deberan conformarse con
menos que un gran cdigo - deberan ir ms all y por encima de los estndares convencionales para el
desarrollo.

La clave es la eficiencia.
Debido a que la grandeza es una virtud con mltiples facetas, un artculo tan corto como este, no puede tratar de
cubrir todos los componentes de una gran pieza de cdigo. En su lugar, este artculo describir un componente
de escribir un gran cdigo, que ha cado en el olvido en los ltimos aos, al mismo tiempo que las
computadoras han incrementado en capacidad y poder: La eficiencia.

Cualquiera que haya estado en esta industria alrededor de una dcada o ms, conoce perfectamente este
fenmeno: las mquinas son exponencialmente ms poderosas por unidad de costo, sin embargo, los usuarios no
perciben estas mejoras en las aplicaciones que ellos compran. Por ejemplo, mientras los procesadores de
palabra son claramente ms rpidos hoy, que lo que era hace 21 aos, no son 16,384 veces ms rpidos como la
Ley de Moore sugerira. Desde luego parte del problema es que algo del poder de procesamiento adicional se
emplea para soportar las nuevas caractersticas (tales como el desplegado a nivel de bits), pero una gran parte de
la razn de que los usuarios del software no vean incrementarse la rapidez, es porque muchos de los
programadores de hoy, no se toman el tiempo para escribir un cdigo eficiente, o simplemente no saben cmo
escribir software rpido.

Los mseros perodos otorgados al desarrollo de programas, no dan tiempo suficiente para desarrollar un cdigo
eficiente; Tambin es verdad que muchos programadores actuales, han crecido con ordenadores rpidos, cuya
velocidad encubre pobres hbitos de codificacin, y es as como muchos de estos programadores nunca han
tenido que aprender cmo escribir un cdigo rpido.

Desafortunadamente, cuando el desempeo de las aplicaciones es punto menos que ptimo, estos
programadores generalmente no saben cmo corregir los problemas con su cdigo. Frecuentemente mencionan
cosas como "la regla del 90-10," o "Yo usar un analizador de cdigo para corregir los problemas de
desempeo", pero la verdad es que no saben realmente como mejorar el desempeo de sus aplicaciones con bajo
rendimiento. Solamente mencionan, "ya encontrar un mejor algoritmo!" Sin embargo, el encontrar y plasmar
el algoritmo, si realmente existe, es otra cosa completamente distinta.
La mayora de las veces Ud. puede lograr un rendimiento ms elevado al mejorar la implementacin de un
algoritmo existente. Un cientfico en computacin, puede alegar que una mejora constante en rendimiento no es
tan buena, como por ejemplo, al ir de un algoritmo con rendimiento O(n^2) a uno con desempeo O(n log n),
pero la verdad es que la mayor parte del tiempo un factor constante de mejora de dos o tres veces, aplicada a
travs de un programa, puede hacer la diferencia entre una aplicacin prctica y otra que es simplemente muy
lenta para usarse confortablemente. Y es exactamente este tipo de optimizacin con la cual la mayora de los
programadores modernos tienen poca experiencia.

Desafortunadamente, el escribir un cdigo eficiente es una habilidad; una, que debe ser practicada para
aprenderla y otra, que debe ser practicada para mantenerla. Los programadores que nunca practican esta
habilidad, nunca sern capaces de aplicarla el da que ellos descubran que su cdigo est corriendo muy
lentamente. An si el programador ha dominado la habilidad de escribir un cdigo eficiente, debe practicarla
constantemente. As que hay dos razones por las cuales algunos programadores no escriben (un gran y) eficiente
cdigo hoy: ellos nunca aprendieron como escribir cdigo eficiente en primer lugar, o ellos han permitido que
sus habilidades de desarrollo se atrofien al punto que no son capaces de escribir ms un cdigo eficiente.

Practique Sus Habilidades.


Para programadores quienes han permitido simplemente que sus habilidades desmayen por falta de uso, la
solucin es obvia; practique codificar eficientemente, aun cuando el proyecto no lo requiere en lo absoluto. Esto
desde luego no significa que el ingeniero practicante, debe sacrificar los tiempos destinados para el proyecto, o
que deje de realizar un cdigo fcil de entender y mantener, u otros atributos importantes, en favor de la
eficiencia.

Lo que si significa, es que el Ing. en desarrollo de sistemas debe mantener en mente la eficiencia mientras
disea o implementa el cdigo. El programador debe elegir conscientemente una implementacin menos
eficiente, por sobre una implementacin ms eficiente, basado en decisiones econmicas o de ingeniera, ms
que simplemente codificar lo primero que le viene a la mente. La simple consideracin de implementar un
cdigo diferente (y posiblemente ms eficiente), es todo lo que se necesita para producir un gran cdigo.
Despus de todo, algunas veces la implementacin ms eficiente no es ms difcil de crear que la ineficiente.
Todos los ingenieros experimentados pueden necesitar mltiples opciones de las cuales elegir.

Desafortunadamente, los tiempos irreales otorgados al desarrollo, han llevado a muchos ingenieros
profesionales a desechar la revisin y la implementacin minuciosa. El resultado es que muchos programadores
profesionales han abandonado el hbito de escribir un gran cdigo. Afortunadamente, este proceso es fcil de
reversar al emplear metodologas de desarrollo efectivas, tales como la consideracin de mltiples algoritmos y
sus implementaciones, tan frecuentemente como sea posible.

Aprenda el Lenguaje Ensamblador.


Y en primer lugar, qu hay del programador que nunca ha aprendido a codificar eficientemente? Cmo
aprende uno a implementar eficientemente una aplicacin? Desafortunadamente las escuelas tcnicas y
universidades, intencionalmente toman la actitud de que si Ud. elige un buen algoritmo, no tiene que
preocuparse de la implementacin de se algoritmo. La mayora de los estudiantes salen de sus cursos de
estructuras de datos y algoritmos, con la actitud de que si Ud. puede lograr una unidad de contante de mejora
(esto es O (1)), Ud., realmente no ha logrado nada, y cualquier intento de mejorar es una prdida de tiempo.
Los avances en arquitectura de los ordenadores han exacerbado este problema - por ejemplo, Ud. podra
escuchar a un programador decir, "Y si este programa necesita ser un poco ms rpido, solo esperen un ao o un
poco ms y el CPU ser dos veces ms rpido; no hay de qu preocuparse". Y esta actitud, probablemente ms
que cualquier otra, es el por qu el rendimiento del cdigo no crece a la par con el desempeo del CPU.

Con cada nueva aplicacin, el programador escribe el cdigo ms lento de lo que debera correr en cualquier
CPU que ellos usen, creyendo que en el futuro, la mejora en el rendimiento del CPU solucionar sus
problemas. Desde luego, para el momento que el CPU es lo suficientemente rpido para ejecutar su cdigo, el
programador ha "mejorado" el programa, y ahora depende de una nueva versin del CPU para "mejorarlo" de
nuevo. El ciclo se repite casi invariablemente, con el rendimiento del CPU sin darse abasto para satisfacer las
demandas del software, hasta que finalmente, la vida del software llega a su fin, y el programador comienza de
nuevo el ciclo con una aplicacin distinta.

La verdad es que si es posible escribir programas eficientes que se ejecuten eficientemente en procesadores
contemporneos. Los programadores estaban haciendo grandes cosas con su cdigo en los das en que sus
aplicaciones corran en ocho bits a 5 MHZ en PCs 8088 (o an ms atrs en procesadores de mainframe
corriendo en sub-megahercio); Las mismas tcnicas que ellos usaron para exprimir hasta el ltimo bit de
desempeo de esos ordenadores de bajo poder, es la clave para el alto rendimiento de las aplicaciones actuales.
As, que cmo lograron ellos un desempeo razonable en procesadores de tan bajo poder? La respuesta no es
un secreto - ellos comprendieron como operaban esencialmente los "fierros" y escribieron su cdigo de acuerdo
a eso. Ese mismo conocimiento esencial del hardware, es la clave para codificar eficientemente hoy en da.

Frecuentemente, Ud. escucha a los viejos programadores comentar que el software realmente eficiente est
escrito en lenguaje ensamblador. Sin embargo, la razn la razn de que los programas sean eficientes, no es
porque el lenguaje otorgue propiedades mgicas de eficiencia a ese cdigo - es perfectamente posible escribir
software ineficiente en lenguaje ensamblador-. No, la razn real del porque los programas en lenguaje
ensamblador tienden a ser ms eficientes que los programas escritos en otros lenguajes, es simplemente porque
el lenguaje ensamblador forzar al programador a considerar como el hardware opera con cada instruccin que
ellos escriben. Y esto es la llave para aprender a codificar eficientemente - manteniendo la mirada atenta en la
capacidad de bajo nivel de la mquina.

Esos mismos viejos programadores que reclaman que los programas realmente eficiente estn escritos en
lenguaje ensamblador, tambin ofrecen otro consejo igualmente vlido - si quiere aprender a escribir un gran
cdigo en un lenguaje de alto nivel, aprenda a programar en lenguaje ensamblador.

Este es un consejo muy bueno. Despus de todo, los compiladores de alto nivel trasladan las instrucciones de
alto nivel a cdigo mquina de bajo nivel. As que si conoce el lenguaje ensamblador para su mquina en
particular ser capaz de correlacionar las instrucciones del lenguaje de alto nivel con el lenguaje de mquina
que el compilador genera. Y con este entendimiento, Ud. ser capaz de escoger las mejores instrucciones del
lenguaje de alto nivel basado en su conocimiento de cmo convierten los compiladores estas instrucciones a
cdigo de mquina.

Frecuentemente, los programadores de lenguaje de alto nivel eligen ciertas instrucciones del lenguaje, sin
conocimiento alguno del costo de ejecucin de esas instrucciones. El aprender el lenguaje ensamblador forzar al
programador a aprender los costos asociados con varias construcciones de alto nivel. As que, an si el
programador realmente nunca escribe aplicaciones en lenguaje ensamblador, ese conocimiento, hace que el
programador est consiente de los problemas que causan ciertas secuencias ineficaces, as que ellos las evitan
en su cdigo.

El aprender el lenguaje ensamblador, as como cualquier otro lenguaje, requiere de un esfuerzo considerable. El
problema es que el lenguaje ensamblador en s mismo, es engaosamente simple. Ud. puede aprender las 20 o
30 instrucciones que se encuentran comnmente en las aplicaciones en solo unos cuantos das. Ud. inclusive
puede aprender a encadenar varias instrucciones de esas para solucionar problemas, de la misma manera que
solucionara esos mismos problemas, con otro lenguaje en unas cuantas semanas.

Desafortunadamente, este no es el tipo de conocimiento que un programador de lenguaje de alto nivel


encontrar lo suficientemente til al intentar escribir cdigo eficiente de alto nivel. Para alcanzar los beneficios
del conocer el lenguaje ensamblador, un programador tiene que aprender a pensar en lenguaje ensamblador.
Solo entonces, tal programador puede escribir cdigo de alto nivel muy eficiente, mientras piensa en
ensamblador y escribe instrucciones de lenguaje de alto nivel. Aunque el cdigo escrito de esta manera es
grande realmente, hay un ligero problema con este acercamiento - que toma un esfuerzo considerable alcanzar
este nivel. Esa es una de las razones por la cuales tal cdigo es excelente - porque muy pocos practicantes son
capaces de producirlo.

El Ensamblador No Est Muerto.


Desde luego, el lenguaje ensamblador desarroll una mala reputacin en todos los 90's. Avances en tecnologa
del compilador, mejoras en el desempeo del CPU, y la "crisis del software" todos conspiraron para sugerir que
el ensamblador era un lenguaje "muerto", que no se necesitaba ms. Como el lenguaje ensamblador era un poco
ms difcil de aprender que los lenguajes tradicionales de alto nivel, los estudiantes (y los maestros!)
gustosamente abrazaron estos nuevos lenguajes rpidamente asimilables, abandonando el difcil-de-aprender
ensamblador, en favor de lenguajes de cada vez ms alto nivel.

El nico problema fue que con el olvido del lenguaje ensamblador es que as como su popularidad se
desvaneci, tambin lo hizo el gran porcentaje de programadores que entendan las ramificaciones en el bajo
nivel, de las aplicaciones que ellos estaban escribiendo. Esos programadores quienes clamaban que el lenguaje
ensamblador ya haba muerto, ya saban cmo pensar en lenguaje ensamblador, y como aplicar el pensamiento
de bajo nivel a su cdigo de alto nivel; en efecto, gozaron los beneficios del lenguaje ensamblador mientras
escriban lenguaje de alto nivel. Sin embargo, cuando la nueva oleada de programadores se abri camino en el
ambiente, lo hicieron sin los beneficios de haber escrito varias aplicaciones en ensamblador, y la eficiencia de
las aplicaciones comenz a declinar.

Aunque sera tonto reclamar que los programadores comenzaran a escribir aplicaciones comerciales en lenguaje
ensamblador, hoy es claro, que la desaparicin de la popularidad del lenguaje ensamblador ha tenido un gran
impacto en la eficiencia del software moderno. Para reversar esta tendencia, tiene que suceder una de estas dos
alternativas: Los programadores deben empezar a estudiar el lenguaje ensamblador, o ellos deben obtener ese
conocimiento a bajo nivel de alguna otra manera.

El aprendizaje del lenguaje ensamblador an permanece como la mejor manera de aprender la organizacin
fundamental de la mquina. Esos programadores quienes se esfuerzan en dominar el lenguaje ensamblador,
llegan a ser de los mejores programadores de lenguaje de alto nivel en estos tiempos. Su habilidad para elegir
instrucciones apropiadas de cdigo eficiente del ms alto nivel, su habilidad para leer cdigo de alto nivel
desensamblado, y detectar errores nefastos en un sistema, y su conocimiento de cmo opera todo el sistema en
su totalidad, los eleva a ellos a estaturas legendarias entre sus compaeros de trabajo. Estos son los
programadores a los que todos van cuando tienen preguntas de cmo implementar algo, Estos son los ingenieros
que se ganan el respeto de todos a su alrededor. Esos son los programadores que todos tratan de emular. Estos
son los programadores que escriben un gran cdigo.

Si el conocimiento del lenguaje ensamblador, ayuda a hacer grandes programadores, la pregunta obvia es "Por
qu no hay ms programadores que aprendan ensamblador?" Parte del problema es el prejuicio: Muchos
instructores de escuelas tcnicas y universidades que ensean lenguaje ensamblador, comienzan su curso con un
comentario como "Realmente nadie necesita conocer esto, y ustedes nunca lo van a usar, pero este programa lo
requiere, as que vamos a batallar las prximas semanas estudiando este material". Despus de cuatro aos de
este tipo de actitud de sus profesores, no es sorprendente que los estudiantes realmente no quieran tener nada
que ver con utilizar el lenguaje ensamblador para programar.

An as, una vez que es obvio para el codificador que los verdaderos programadores son aquellos que han
dominado el lenguaje ensamblador, Ud. podra preguntar, por qu no hay ms programadores dispuestos a
aprender este conocimiento tan evaluable? El nico problema, es que tradicionalmente la mayora de los
programadores se han topado con la dificultad de dominar el lenguaje ensamblador. El ensamblador es
radicalmente diferente de los lenguajes de alto nivel, as que el aprender el lenguaje ensamblador, es casi tanto
como volver a empezar a programar.

Para alguien que intenta aprender ensamblador, invariablemente parece que nada de su conocimiento de los
otros lenguajes pudiera ser de mucha ayuda. Frecuentemente, un ingeniero aprendiendo ensamblador se frustra
con el hecho de que ya saben cmo lograr los objetivos en otro lenguaje de alto nivel, pero simplemente no se
figuran como lograr lo mismo con el ensamblador. Para muchos programadores, el cambio de "pensar en un
lenguaje de alto nivel" a "pensar en lenguaje ensamblador" constituye una barrera infranqueable.

Como instructor de lenguaje ensamblador por ms de una dcada en la Universidad de California, tena pleno
conocimiento de los problemas que los estudiantes tienen para hacer la transicin del paradigma de lenguaje de
alto nivel al paradigma de programar a un bajo nivel.

A principios de los 90's, Microsoft proporcion una solucin con la introduccin del Microsoft Macro
Assembler (MASM) v6.0 - la inclusin de estructuras de control de alto nivel en el traductor del lenguaje
ensamblador. Mientras estas instrucciones no son realmente lenguaje ensamblador, ellas proporcionan una
agradable transicin de los tradicionales e imperativos lenguajes de alto nivel, al ensamblador. Un programador
puede continuar usando instrucciones como IF, WHILE, y FOR mientras aprende otros aspectos de los
programas en lenguaje ensamblador. Esto le permite al programador aprender gradualmente el ensamblador, en
lugar de tener que aprenderlo todo de una vez.

Igualmente, para el High-Level Assembler (HLASM) de IBM, se cuenta con varias bibliotecas macro que
implementan la misma funcionalidad desde hace varios aos.

Domine las Instrucciones de Bajo Nivel.


Desde luego, un programador no se puede llamar asimismo programador de lenguaje ensamblador, hasta que
haya dominado las instrucciones de bajo nivel equivalentes. An as, estas estructuras de control de alto nivel,
proveen un puente excelente entre los lenguajes de alto nivel y el lenguaje ensamblador, permitiendo a los
estudiantes utilizar su conocimiento de programacin de alto nivel, para aprender el lenguaje ensamblador.
Ah!, tambin hay unos cuantos textos apropiados que ensean la programacin en lenguaje ensamblador
usando este enfoque de estructuras de control de alto nivel que proporciona el MASM (o el HLASM).

Otro problema con la transicin de alto nivel a un bajo nivel, es que la mayora de lenguajes de alto nivel
proporcionan grandes bibliotecas que manejan tareas mundanas como entrada/salida, conversiones numricas, y
operaciones de encadenamiento. Un gran problema al que se enfrentan los programadores en ensamblador
principiantes, es que ellos tpicamente necesitan la habilidad de introducir y obtener cantidades numricas o
realizar conversiones numricas a cadenas (y viceversa), para escribir y probar programas muy simples.
Desafortunadamente la mayora de los sistemas de desarrollo en lenguaje ensamblador, le dejan la
responsabilidad al programador de proporcionar esta funcionalidad para sus aplicaciones. Esto presenta una
situacin muy sui-generis: es difcil aprender el lenguaje ensamblador sin estas funciones, ni tampoco puede
codificar tales funciones, hasta que aprenda a programar en ensamblador.

Estas piedras en el camino evitan efectivamente dominar el lenguaje ensamblador a la mayor parte de los
programadores, con excepcin de los ms determinados. De esta manera, durante los 90s y principios de este
siglo, el uso del ensamblador contina mengundose. Al ver la declinacin en la eficiencia y calidad del
software, percatndome que se relaciona con el bajo uso del ensamblador, comenc una cruzada a mediados de
los 90s para motivar a los programadores a aprender a programar en lenguaje ensamblador.

El primer gran logro que tuve, fue la liberacin a mediados de los 90s de la edicin electrnica de El Arte del
Lenguaje Ensamblador. Este libro, junto con el uso de la correspondiente biblioteca UCR Estndar para
programadores de Lenguaje Ensamblador en 80x86, redujo el esfuerzo necesario para el aprendizaje del
lenguaje ensamblador. Decenas de miles de programadores han aprendido a programar en ensamblador usando
esto libro de texto y el conjunto de bibliotecas de rutinas complementarias.

El nico problema con la edicin electrnica de El Arte del Lenguaje Ensamblador y las Bibliotecas UCR
Estndar para programadores de lenguaje ensamblador para mquina 80x86, es que se hicieron obsoletas al
momento de la aparicin en el Internet, porque enseaban al lector como crear aplicaciones DOS en 16-bits (su
aparicin casi coincidi con la liberacin de Windows 95, que fue uno de los ltimos clavos en el atad de
programacin de 16 bits.

An en la cruzada, empec a trabajar en un completamente nuevo ensamblador de Alto Nivel (HLA), una nueva
versin del Arte del Lenguaje Ensamblador, y un nuevo conjunto de bibliotecas de rutinas basadas en HLA para
32-bit. Este esfuerzo culmin con la publicacin de la edicin de El Arte del Ensamblador (AoA) en el 2003. A
la fecha, miles y miles de programadores han adoptado entusiastamente esta nueva manera de aprender el
lenguaje ensamblador, usando AoA, HLA, y la Biblioteca Estndar de HLA.

Aunque el Arte del Lenguaje Ensamblador y el HLA han logrado incrementar el nmero de programadores en
ensamblador da a da, la solucin que ellos proporcionan es para la siguiente generacin de programadores.

Que hay acerca de los actuales programadores, que han perdido la oportunidad de aprender el lenguaje
ensamblador cuando estuvieron en la escuela y lograron dominar los conceptos de organizacin de la mquina
antes que la realidad de los proyectos les robaran el tiempo para desarrollar el conocimiento necesario para
escribir un gran cdigo? La pregunta es, "La organizacin de la mquina puede ser efectivamente enseada a
programadores profesionales sin ensearles el lenguaje ensamblador simultneamente?"

Mientras est perfectamente claro que el aprendizaje del lenguaje ensamblador es el mejor consejo que yo le
puedo dar a alguien interesado en escribir un gran y eficiente cdigo, tambin estoy convencido que alguien
puede estudiar la organizacin de la mquina SANS ensamblador y an aprender cmo escribir un mejor
cdigo. Quizs su cdigo no ser tan bueno como el de quienes dominen el lenguaje ensamblador, pero ser
mejor que el software que han escrito desprovistos de este conocimiento.

Ms importantemente, mientras es difcil vender la idea de aprender el lenguaje ensamblador a la generacin


actual de programadores (dos dcadas de propaganda anti-ensamblador se han asegurado de esto), la mayor
parte de los programadores se dan cuenta que si solo "aprendieran un poco ms acerca de cmo trabaja las capas
fundamentales del hardware", ellos seran capaces de escribir un mejor cdigo. As que lo que se necesita es una
coleccin de materiales que enseen representacin de datos, organizacin de la memoria, elementos de
arquitectura de la computadora, cmo funciona el proceso de entrada/salida y la correspondencia entre las
instrucciones de programacin del lenguaje de alto nivel.

Esto es, ensearles todas las cosas que tendran que aprender cuando aprenden el lenguaje ensamblador, con la
sola excepcin de dominar la programacin en ensamblador. Recientemente, me he comenzado a enfocar en
este grupo, trabajando en libros como Escriba Gran Cdigo, Primer Volumen: Entendiendo la Mquina (Write
Great Code, Volume One: Understanding the Machine), un libro sobre la organizacin de la mquina que no
ensea a programar en ensamblador especficamente. Mientas que alguien que estudia la organizacin de la
mquina podra no escribir un gran cdigo como alguien que se ha tomado el tiempo de dominar el lenguaje
ensamblador, mi esperanza es que esos que nunca consideraran aprender el lenguaje ensamblador, podran
interesarse en rescatar un libro como Escriba un Gran Cdigo, y aprenda a codificar mejor, aunque no sea un
gran cdigo.

Comentario.
Escog este tema ya que aunque el Lenguaje ensamblador hoy en da sea muy poco usado, es un lenguaje muy
importante ya es el lenguaje que ms se acerca al lenguaje mquina, adems ste lenguaje es la base de los
lenguajes que se conocen hoy en da, cuando se cre el lenguaje ensamblador, fue un gran cambio en tanto a la
programacin, se dej de lado el lenguaje Fortran y las tarjetas perforadas.

Fuentes.
Randall Hyde (traduccin: Miguel Soltero Daz), Por qu es an una buena idea aprender Ensamblador.
http://www.bixoft.nl/espanol/hyde.htm