• Últimas noticias

    2. Conceptos sobre lenguajes de programación

    Segunda entrega  del curso de Java.

    Hasta el momento tenemos conocimientos de que los primeros programadores utilizaban tarjetas perforadas para introducir datos en computadoras tan grandes como una habitación y que surgió el lenguaje ensamblador como programa traductor del código de ensamblaje. Con ello surgieron nuevos lenguajes de programación y es aquí donde entra el concepto de abstracción en la informática.


    índice de este curso


    Versión de este curso en video


    Si querés podés ver el video correspondiente a este curso


    Definición

    La abstracción ignora selectivamente ciertas partes de un todo para el mejor entendimiento de un problema.

    ¿Qué quiere decir esto?

    Antes de explicar que significa exactamente la definición anterior, veamos un ejemplo, así luego se entiende mejor. Tenemos el siguiente programa escrito en lenguaje ensamblador en donde se le pide al usuario que ingrese dos números, el programa los suma y muestra el resultado por pantalla.

    mov ah,01h  ;Se guarda 01h en el registro ah
    int 21h     ;Se llama a la interrupción 21h
    sub al,30h  ;Se resta 30h para obtener el número ingresado
    mov var1,al ;Se guarda el número ingresado en var1
    mov ah,01h  ;Se guarda 01h en el registro ah
    int 21h     ;Se llama a la interrupción 21h
    sub al,30h  ;Se resta 30h para obtener el número ingresado 
    add al,var1 ;Se suma var1 y al y el resultado se guarda en el registro al
    mov dl,al   ;Se guarda el contenido del registro al en el registro dl
    add dl,30h  ;Se suma 30h al registro dl para obtener la suma en ASCII
    mov ah,02h  ;Se guarda 02h en el registro ah
    int 21h     ;Se llama a la interrupción 21h

    1. En la primer línea se guarda el valor hexadecimal 01h dentro del registro ah. El valor 01h representa la función que sirve para pedirle un valor al usuario. Se guarda en el registro ah ya que cuando se ejecuta la interrupción (lease interrupción como la ejecución de una rutina que ejecuta una función) 21h es en este registro donde se pregunta que función se debe ejecutar.

    2. En la segunda línea se llama a la interrupción 21h y esta ejecuta la función 01h por lo que se espera que el usuario ingrese un valor por teclado.
    3. Cuando el usuario ingresa un valor por teclado lo hace en formato ASCII, por lo tanto se debe restar el valor 30h en hexadecimal y de ésta manera (sin ahondar mucho en detalle) se obtiene el número entero que el usuario ingreso por teclado. El resultado de la resta es guardado en el registro de memoria al.
    4. El número ingresado, que se encuentra en el registro al, se pasa a la variable var1.
    5. En las líneas 5,6 y 7 se repiten los pasos 1,2 y 3 
    9. El número ingresado es sumado con el número guardado en var1 y el resultado se guarda en el registro de memoria dl.
    10. Se suma 30h en hexadecimal al resultado guardado en dl para poder mostrar la suma por pantalla en formato ASCII.
    11. Se guarda el valor 02h en el registro ah, para que de esta manera cuando se llama la interrupción 21h la computadora sepa que debe ejecutar la función que sirve para mostrar datos por pantalla.
    12. Finalmente se muestra el resultado de la suma por pantalla.

    Traduciendo esto a un pseudocódigo de fantasía que podría ser C, C++, Java, o cualquier otro lenguaje de alto nivel, tendríamos un código parecido al siguiente:
     int n1 = readNumber();
     int n2 = readNumber();
     printScreen(n1+n2);
    
    
    1. Se pide al usuario que ingrese un número y se guarda dicho número en la variable n1
    2. Se pide al usuario que ingrese otro número y se guarda dicho número en la variable n2
    3. Se realiza la suma de los dos números y se muestra el resultado por pantalla
    Como se puede observar, estas tres líneas de código hacen lo mismo que las 12 líneas de código en ensamblador, y esto es porque se abstrajeron características del lenguaje.

    ¿Cuáles son las diferencias?

    A simple vista se puede notar que el último programa es más fácil de entender. Esto es por dos cosas:

    En primer lugar el código se asemeja más al lenguaje natural humano, y si no lo ves con claridad es porque los lenguajes de programación están hechos en ingles. Si tradujéramos el código al español quedaría algo así:
     int n1 = leerNumero();
     int n2 = leerNumero();
     mostrarEnPantalla(n1+n2);
    
    ¿Ahora sí ves que se asemeja más al lenguaje que manejamos nosotros?. Éste código puede ser entendido con solo leerlo, incluso una persona que no sepa de programación puede deducir lo que hace el mismo.

    Además de todo esto (aunque no se vea) se trabaja (por lo general) en sistema decimal, el sistema numérico que nos enseñan desde que vamos al jardín de infantes. 

    El segundo punto que hace que éste código sea más fácil es que estamos ignorando partes del proceso que realiza la computadora. Ignoramos los movimientos de valores que se hacen a registros de la memoria del microprocesador, operaciones para mostrar un valor de forma correcta en formato ASCII, llamadas a interrupciones del procesador para ejecutar funciones, etc. Pero esto no quiere decir que esto no se haga. En el último código esa serie de movimientos en registros internos del procesador existen, pero nosotros no los vemos, esto quiere decir que estamos ignorando ciertas partes del proceso que es realizado por la computadora y nos enfocamos en resolver el problema en sí (el de ingresar dos números, sumarlos y mostrarlos en pantalla), y no en las operaciones internas que debe realizar el microprocesador. 

    Y esto nos revela la definición de abstracción. Estamos ignorando partes del proceso para entender mejor lo que estamos realizando en relación a nuestro problema. Esto quiere decir que los lenguajes tienen un cierto nivel de abstracción. Según eso los podemos clasificar en varios niveles de abstracción.

    Bajo nivel de abstracción

    Lenguajes como el ensamblador, son de bajo nivel de abstracción ya que permiten controlar directamente el hardware del dispositivo electrónico y son dependientes de la arquitectura del mismo. 

    Alto nivel de abstracción

    Luego del surgimiento del lenguaje ensamblador, los programadores comenzaron a desarrollar sus propios lenguajes de programación abstrayendo código para poder centrarse más en el problema a resolver que en el hardware sobre el cuál tiene que programar. Esto, además, incremento la eficiencia de los programadores ya que permitió que se puedan desarrollar sistemas enteros en mucho menos tiempo de lo que llevaba hacerlo en un lenguaje de bajo nivel.
    Lenguajes de alto nivel de abstracción, como por ejemplo, Fortran, Cobol, Pascal, Basic, Python, Perl, PHP, Java, C++, C#, entre otros, son lenguajes en los cuales la mera lectura del código puede ser entendida por cualquier persona ya que se asimila más al lenguaje natural humano que al lenguaje de máquina, y que están orientados a objetos, los cuales emergen de procedimientos.

    Medio nivel de abstracción

    Los lenguajes de programación de medio nivel de abstracción como BCPL, C y Basic, están en un intermedio entre los lenguajes de bajo nivel y los de alto nivel. Si bien estos lenguajes a menudo se los considera como de alto nivel, poseen la característica de poder programar directamente sobre el hardware como se hacía en lenguajes de bajo nivel y al mismo tiempo poder realizar operaciones de alto nivel. A diferencia de los lenguajes de alto nivel que están orientados a objetos, estos están orientados a procedimientos, los cuales se componen de procesos.

    Paradigmas de programación

    De la mano con el surgimiento de los lenguajes de programación, surgían los paradigmas de programación
    que muy a grandes rasgos son maneras o estilos de programar empleados. Estos paradigmas son enfoques propuestos para resolver problemas, los cuales tienen una aceptación por una comunidad de programadores. El surgimiento de nuevos paradigmas de programación supone mejoras en la forma de resolver problemas respecto a ya existentes, o bien el planteo de resolución de problemas para situaciones específicas.

    Entre los paradigmas de programación se puede encontrar el imperativo, representado por lenguajes como C, Basic o Pascal, el lógico representado por Prolog, el declarativo representado por lenguajes como Lisp, SQL, HTML o XML, el orientado a eventos representado por lenguajes como Visual Basic, Visual C#, Visual C++, Javascript o Actionscript, y el orientado a objetos representado por lenguajes como Smalltalk, Simula 67 o Java.

    El paradigma orientado a objetos fue tomando popularidad y se convirtió en el paradigma dominante  a mediados de los años ochenta. Este paradigma se basa en el manejo de datos mediante una entidad llamada objetos la cual a su vez puede relacionarse con otras entidades de este tipo, y hoy en día es el paradigma más usado por la gran mayoría de los programadores dadas sus ventajas frente a la resolución de problemas ya que este paradigma es muy flexible, presenta una manera de resolver problemas muy grandes en forma ordenada y sencilla, y presenta características para la reutilización
    de código.

    En este curso se abordara la enseñanza del lenguaje de programación JAVA basándose en los pilares fundamentales del paradigma orientado a objetos para su completa comprensión.

    En la próxima entrega veremos los conceptos de compilador e intérprete, los cuales son sumamente necesarios para entender las características más importantes de Java.


    ANTERIOR
    1. Breve historia de la programación
    SIGUIENTE
    3. Compiladores e intérpretes

    Autor: Pablo Jasinski

    Profesor en Escuela Técnica UBA y Escuela Técnica Nº35, especializado en materias de programación, arquitectura de las computadoras y redes. Profesional en el área de programación y desarrollo de videojuegos.

    1 comentario:

    1. Casinos Near Me - Hollywood Casino Tunica
      Get 과천 출장마사지 directions, reviews and information for Casinos Near 경기도 출장마사지 Me in Tunica, MS. The 포항 출장안마 casino features slot machines and other live entertainment 창원 출장샵 on the site. 영천 출장샵

      ResponderEliminar