031.1 Lección 1
Certificación: |
Conceptos básicos de desarrollo web |
---|---|
Versión: |
1.0 |
Tema: |
031 Desarrollo de software y tecnologías web |
Objetivo: |
031.1 Conceptos básicos de desarrollo de software |
Lección: |
1 de 1 |
Introducción
Las primeras computadoras se programaron a través del agotador proceso de enchufar cables en enchufes. Los científicos informáticos pronto comenzaron una búsqueda interminable de formas fáciles de decirle a la computadora qué hacer. Este capítulo presenta las herramientas de programación. Analiza las formas clave en que las instrucciones de texto (lenguajes de programación) representan las tareas que un programador desea realizar y las herramientas que transforman el programa en una forma denominada lenguaje de máquina que una computadora puede ejecutar.
Note
|
En este texto, los términos programa y aplicación se usan indistintamente. |
Código Fuente
Un programador normalmente desarrolla una aplicación escribiendo una descripción textual, llamada código fuente, de la tarea deseada. El código fuente está escrito en un lenguaje de programación cuidadosamente definido que representa lo que la computadora puede hacer en una abstracción de alto nivel que los humanos pueden entender. También se han desarrollado herramientas para permitir a los programadores, así como a los no programadores, expresar sus pensamientos visualmente, pero escribir el código fuente sigue siendo la forma predominante de programar.
De la misma manera que un lenguaje natural tiene sustantivos, verbos y construcciones para expresar ideas de manera estructurada, las palabras y la puntuación en un lenguaje de programación son representaciones simbólicas de operaciones que se realizarán en la máquina.
En este sentido, el código fuente no es muy diferente de cualquier otro texto en el que el autor emplea las reglas bien establecidas de un lenguaje natural para comunicarse con el lector. En el caso del código fuente, el “lector” es la máquina, por lo que el texto no puede contener ambigüedades o inconsistencias, ni siquiera sutiles.
Y como cualquier texto que discute algún tema en profundidad, el código fuente también necesita estar bien estructurado y organizado lógicamente al desarrollar aplicaciones complejas. Se pueden almacenar programas muy simples y ejemplos didácticos en unas pocas líneas de un solo archivo de texto, que contiene todo el código fuente del programa. Los programas más complejos se pueden subdividir en miles de archivos, cada uno con miles de líneas.
El código fuente de las aplicaciones profesionales debe organizarse en diferentes carpetas, generalmente asociadas con un propósito particular. Un programa de chat, por ejemplo, se puede organizar en dos carpetas: una que contiene los archivos de código que manejan la transmisión y recepción de mensajes a través de la red, y otra carpeta que contiene los archivos que construyen la interfaz y reaccionan a las acciones del usuario. De hecho, es común tener muchas carpetas y subcarpetas con archivos de código fuente dedicados a tareas muy específicas dentro de la aplicación.
Además, el código fuente no siempre está aislado en sus propios archivos, con todo escrito en un solo lenguaje. En aplicaciones web, por ejemplo, un documento HTML puede incrustar código JavaScript para complementar el documento con funcionalidad adicional.
Editores de código e IDE
La variedad de formas en que se puede escribir el código fuente puede resultar intimidante. Por lo tanto, muchos desarrolladores aprovechan las herramientas que ayudan a escribir y probar el programa.
El archivo de código fuente es solo un archivo de texto sin formato. Como tal, puede ser editado por cualquier editor de texto, sin importar lo simple que sea. Para que sea más fácil distinguir entre el código fuente y el texto sin formato, cada lenguaje adopta una extensión de nombre de archivo autoexplicativa: .c
para el lenguaje C, .py
para Python, .js
para JavaScript, etc. Los editores de propósito general a menudo entienden el código fuente de los lenguajes populares lo suficientemente bien como para agregar cursiva, colores y sangría para que el código sea comprensible.
No todos los desarrolladores optan por editar el código fuente en un editor de propósito general. Un entorno de desarrollo integrado (IDE) proporciona un editor de texto junto con herramientas para ayudar al programador a evitar errores sintácticos e inconsistencias obvias. Estos editores se recomiendan especialmente para programadores menos experimentados, pero los programadores experimentados también los usan.
Los IDE populares como Visual Studio, Eclipse y Xcode observan inteligentemente lo que escribe el programador, sugiriendo con frecuencia palabras para usar (autocompletado) y verificando el código en tiempo real. Los IDE pueden incluso ofrecer pruebas y depuración automatizadas para identificar problemas cada vez que cambia el código fuente.
Algunos programadores más experimentados optan por editores menos intuitivos como Vim, que ofrecen una mayor flexibilidad y no requieren la instalación de paquetes adicionales. Estos programadores usan herramientas externas e independientes para agregar las funciones que están integradas cuando usa un IDE.
Mantenimiento de código
Ya sea en un IDE o usando herramientas independientes, es importante emplear algún tipo de sistema de control de versiones (VCS). El código fuente está en constante evolución porque es necesario corregir fallas imprevistas y deben incorporarse mejoras. Una consecuencia inevitable de esta evolución es que las correcciones y mejoras pueden interferir con otras partes de las aplicaciones en una gran base de código. Las herramientas de control de versiones como Git, Subversion y Mercurial registran todos los cambios realizados en el código y quién realizó el cambio, lo que le permite rastrear y eventualmente recuperarse de una modificación fallida.
Además, las herramientas de control de versiones permiten a cada desarrollador del equipo trabajar en una copia de los archivos de código fuente sin interferir con el trabajo de otros programadores. Una vez que las nuevas versiones del código fuente están listas y probadas, otros miembros del equipo pueden incorporar las correcciones o mejoras realizadas en una copia.
Git, el sistema de control de versiones más popular en la actualidad, permite que diferentes personas mantengan muchas copias independientes de un repositorio, que comparten sus cambios como desean. Sin embargo, ya sea que utilicen un sistema de control de versiones descentralizado o centralizado, la mayoría de los equipos mantienen un repositorio en cuyo código fuente y recursos se puede confiar. Varios servicios en línea ofrecen almacenamiento para repositorios de código fuente. Los más populares de estos servicios son GitHub y GitLab, pero también vale la pena mencionar Savannah del proyecto GNU.
Lenguajes de programación
Existe una amplia variedad de lenguajes de programación; cada década ve la invención de otros nuevos. Cada lenguaje de programación tiene sus propias reglas y se recomienda para propósitos particulares. Aunque los lenguajes muestran diferencias superficiales en sintaxis y palabras claves, lo que realmente distingue a los lenguajes son los profundos enfoques conceptuales que representan, conocidos como paradigmas.
Paradigmas
Los paradigmas definen las premisas en las que se basa un lenguaje de programación, especialmente en lo que respecta a cómo debe estructurarse el código fuente.
El desarrollador parte del paradigma del lenguaje para formular las tareas a realizar por la máquina. Estas tareas, a su vez, se expresan simbólicamente con las palabras y construcciones sintácticas que ofrece el lenguaje.
El lenguaje de programación es procedural cuando las instrucciones presentadas en el código fuente se ejecutan en orden secuencial, como un guión de película. Si el código fuente está segmentado en funciones o subrutinas, una rutina principal se encarga de llamar a las funciones en secuencia.
El siguiente código es un ejemplo de lenguaje de procedimiento. Escrito en C, define variables para representar el lado, área y volumen de formas geográficas. El valor de la variable side
se asigna en main()
, que es la función que se invoca cuando se ejecuta el programa. Las variables area
y volume
se calculan en las subrutinas square()
y cube()
que preceden a la función principal:
#include <stdio.h>
float side;
float area;
float volume;
void square(){ area = side * side; }
void cube(){ volume = area * side; }
int main(){
side = 2;
square();
cube();
printf("Volume: %f\n", volume);
return 0;
}
El orden de acciones definido en main()
determina la secuencia de estados del programa, caracterizada por el valor de las variables side
, area
y volume
. El ejemplo termina después de mostrar el valor de volume
con la declaración printf
.
Por otro lado, el paradigma de la programación orientada a objetos (POO) tiene como característica principal la separación del estado del programa en subestados independientes. Estos subestados y operaciones asociadas son los objetos, así llamados porque tienen una existencia más o menos independiente dentro del programa y porque tienen propósitos específicos.
Los distintos paradigmas no restringen necesariamente el tipo de tarea que puede realizar un programa. El código del ejemplo anterior se puede reescribir de acuerdo con el paradigma OOP usando el lenguaje C++:
#include <iostream>
class Cube {
float side;
public:
Cube(float s){ side = s; }
float volume() { return side * side * side; }
};
int main(){
float side = 2;
Cube cube(side);
std::cout << "Volume: " << cube.volume() << std::endl;
return 0;
}
La función main()
todavía está presente. Pero ahora hay una nueva palabra, class
, que introduce la definición de un objeto. La clase definida, denominada Cube
, contiene sus propias variables y subrutinas. En OOP, una variable también se llama attribute y una subrutina se llama method.
Está fuera del alcance de este capítulo explicar todo el código C++ en el ejemplo. Lo que es importante para nosotros aquí es que Cube
contiene el atributo side
y dos métodos. El método volume()
calcula el volumen del cubo.
Es posible crear varios objetos independientes de la misma clase y las clases pueden estar compuestas por otras clases.
Tenga en cuenta que estas mismas características se pueden escribir de manera diferente y que los ejemplos de este capítulo están demasiado simplificados. C y C++ tienen características mucho más sofisticadas que permiten construcciones mucho más complejas y prácticas.
La mayoría de los lenguajes de programación no imponen rigurosamente un paradigma, éstos permiten a los programadores elegir varios aspectos de un paradigma u otro. JavaScript, por ejemplo, incorpora aspectos de diferentes paradigmas. El programador puede descomponer todo el programa en funciones que no comparten un estado común entre sí:
function cube(side){
return side*side*side;
}
console.log("Volume: " + cube(2));
Aunque este ejemplo es similar a la programación procedimental, tenga en cuenta que la función recibe una copia de toda la información necesaria para su ejecución y siempre produce el mismo resultado para el mismo parámetro, independientemente de los cambios que ocurran fuera del alcance de la función. Este paradigma, llamado funcional, está fuertemente influenciado por el formalismo matemático, donde cada operación es autosuficiente.
Otro paradigma cubre los lenguajes declarativos, que describen los estados en los que desea que esté el sistema. Un lenguaje declarativo puede descubrir cómo lograr los estados especificados. SQL, el lenguaje universal para consultar bases de datos, a veces se denomina lenguaje declarativo, aunque realmente ocupa un nicho único en el panteón de la programación.
No existe un paradigma universal que pueda adaptarse a cualquier contexto. La elección del lenguaje también puede estar restringida por los lenguajes admitidos en la plataforma o el entorno de ejecución donde se utilizará el programa.
Una aplicación web que será utilizada por el navegador, por ejemplo, deberá estar escrita en JavaScript, que es un lenguaje compatible universalmente con los navegadores. (Se pueden usar algunos otros lenguajes porque proporcionan convertidores para crear JavaScript). Por lo tanto, para el navegador web, a veces llamado client side o front end de la aplicación web, el desarrollador tendrá que usar los paradigmas permitidos en JavaScript. El lado del servidor o el back-end de la aplicación, que maneja las solicitudes desde el navegador, normalmente se programa en un lenguaje diferente; PHP es el más popular para este propósito.
Independientemente del paradigma, cada lenguaje tiene bibliotecas predefinidas de funciones que se pueden incorporar al código. Las funciones matemáticas, como las que se ilustran en el código de ejemplo, no necesitan implementarse desde cero, ya que el lenguaje ya tiene la función lista para usar. JavaScript, por ejemplo, proporciona el objeto Math
con las operaciones matemáticas más comunes.
Incluso las funciones más especializadas suelen estar disponibles a través del proveedor del lenguaje o de desarrolladores externos. Estas bibliotecas de recursos adicionales pueden estar en forma de código fuente; es decir, en archivos adicionales que se incorporan al archivo donde se utilizarán. En JavaScript, la incrustación se realiza con import from
:
import { OrbitControls } from 'modules/OrbitControls.js';
Este tipo de importación, donde el recurso incrustado es también un archivo de código fuente, se usa con mayor frecuencia en los llamados lenguajes interpretados. Los lenguajes compilados permiten, entre otras cosas, la incorporación de funcionalidades precompiladas en lenguaje máquina, es decir, bibliotecas compiladas. La siguiente sección explica las diferencias entre estos tipos de lenguajes.
Compiladores e Intérpretes
Como ya sabemos, el código fuente es una representación simbólica de un programa que necesita ser traducido al lenguaje de máquina para poder ejecutarse.
A grandes rasgos, hay dos formas posibles de realizar la traducción: convirtiendo el código fuente de antemano para su ejecución futura o convirtiendo el código en el momento de su ejecución. Los lenguajes de la primera modalidad se denominan lenguajes compilados y los lenguajes de la segunda modalidad se denominan lenguajes interpretados. Algunos lenguajes interpretados ofrecen la compilación como una opción, para que el programa pueda iniciarse más rápido.
En los lenguajes compilados, existe una clara distinción entre el código fuente del programa y el programa en sí, que será ejecutado por la computadora. Una vez compilado, el programa generalmente funcionará solo en el sistema operativo y la plataforma para los que fue compilado.
En un lenguaje interpretado, el código fuente en sí se trata como el programa y el proceso de conversión a lenguaje de máquina es transparente para el programador. Para un lenguaje interpretado, es común llamar al código fuente un script. El intérprete traduce el script al lenguaje de máquina para el sistema en el que se está ejecutando.
Compilación y compiladores
El lenguaje de programación C es uno de los ejemplos más conocidos de lenguaje compilado. Las mayores fortalezas del lenguaje C son su flexibilidad y rendimiento. Tanto las supercomputadoras de alto rendimiento como los microcontroladores de los electrodomésticos se pueden programar en lenguaje C. Otros ejemplos de lenguajes compilados populares son C++ y C# (C sharp). Como sugieren sus nombres, estos lenguajes están inspirados en C, pero incluyen características que admiten el paradigma orientado a objetos.
El mismo programa escrito en C o C++ se puede compilar para diferentes plataformas, requiriendo poco o ningún cambio en el código fuente. Es el compilador el que define la plataforma de destino del programa. Hay compiladores específicos de plataforma, así como compiladores multiplataforma como GCC (que significa GNU Compiler Collection) que pueden producir programas binarios para muchas arquitecturas distintas.
Note
|
También existen herramientas que automatizan el proceso de compilación. En lugar de invocar al compilador directamente, el programador crea un archivo que indica los diferentes pasos de compilación que se realizarán automáticamente. La herramienta tradicional utilizada para este propósito es |
El proceso de compilación no siempre genera un programa binario en lenguaje de máquina. Hay lenguajes compilados que producen programas en un formato genéricamente llamado bytecode. Al igual que un script, el código de bytes no está en un lenguaje específico de la plataforma, por lo que requiere un programa de interpretación que lo traduzca al lenguaje de máquina. En este caso, el programa de interpretación simplemente se denomina runtime.
El lenguaje Java adopta este enfoque, por lo que los programas compilados escritos en Java se pueden utilizar en diferentes sistemas operativos. A pesar de su nombre, Java no está relacionado con JavaScript.
El código de bytes está más cerca del lenguaje de máquina que el código fuente, por lo que su ejecución tiende a ser comparativamente más rápida. Debido a que todavía hay un proceso de conversión durante la ejecución del código de bytes, es difícil obtener el mismo rendimiento que un programa equivalente compilado en lenguaje de máquina.
Interpretación e intérpretes
En lenguajes interpretados como JavaScript, Python y PHP, no es necesario precompilar el programa, lo que facilita su desarrollo y modificación. En lugar de compilarlo, el script lo ejecuta otro programa llamado intérprete. Por lo general, el intérprete de un lenguaje recibe el nombre del lenguaje en sí. El intérprete de una secuencia de comandos de Python, por ejemplo, es un programa llamado python
. El intérprete de JavaScript suele ser el navegador web, pero el programa node
también puede ejecutar scripts fuera de un navegador. Debido a que se convierte en instrucciones binarias cada vez que se ejecuta, un programa en lenguaje interpretado tiende a ser más lento que un equivalente en lenguaje compilado.
Nada impide que la misma aplicación tenga componentes escritos en diferentes idiomas. Si es necesario, estos componentes pueden comunicarse a través de una interfaz de programación de aplicaciones (API) mutuamente comprensible.
El lenguaje Python, por ejemplo, tiene capacidades de tabulación y minería de datos muy sofisticadas. El desarrollador puede elegir Python para escribir las partes del programa que tratan estos aspectos y otro lenguaje, como C++, para realizar el procesamiento numérico más pesado. Es posible adoptar esta estrategia incluso cuando no existe una API que permita la comunicación directa entre los dos componentes. El código escrito en Python puede generar un archivo en el formato adecuado para ser utilizado por un programa escrito en C++, por ejemplo.
Aunque es posible escribir casi cualquier programa en cualquier lenguaje, el desarrollador debe adoptar el que más se ajuste al propósito de la aplicación. Al hacerlo, se beneficia de la reutilización de componentes ya probados y bien documentados.
Ejercicios guiados
-
¿Qué tipo de programa se puede utilizar para editar el código fuente?
-
¿Qué tipo de herramienta ayuda a integrar el trabajo de diferentes desarrolladores en la misma base de código?
Ejercicios Exploratorios
-
Suponga que desea escribir un juego en 3D para jugarlo en el navegador. Las aplicaciones web y los juegos están programados en JavaScript. Aunque es posible escribir todas las funciones gráficas desde cero, es más productivo utilizar una biblioteca preparada para este propósito. ¿Qué bibliotecas de terceros proporcionan capacidades para la animación 3D en JavaScript?
-
Además de PHP, ¿qué otros lenguajes se pueden utilizar en el lado del servidor de una aplicación web?
Resumen
Esta lección cubre los conceptos más esenciales del desarrollo de software. El desarrollador debe conocer los lenguajes de programación importantes y el escenario de uso adecuado para cada uno. Esta lección abarca los siguientes conceptos y procedimientos:
-
Qué es el código fuente.
-
Editores de código fuente y herramientas relacionadas.
-
Paradigmas de programación procedimental, orientada a objetos, funcional y declarativa.
-
Características de los lenguajes compilados e interpretados.
Respuestas a los ejercicios guiados
-
¿Qué tipo de programa se puede utilizar para editar el código fuente?
En principio, cualquier programa capaz de editar texto plano.
-
¿Qué tipo de herramienta ayuda a integrar el trabajo de diferentes desarrolladores en la misma base de código?
Un sistema de control de versiones o fuentes, como Git.
Respuestas a los ejercicios de exploración
-
Suponga que desea escribir un juego en 3D para jugarlo en el navegador. Las aplicaciones web y los juegos están programados en JavaScript. Aunque es posible escribir todas las funciones gráficas desde cero, es más productivo utilizar una biblioteca preparada para este propósito. ¿Qué bibliotecas de terceros proporcionan capacidades para la animación 3D en JavaScript?
Hay muchas opciones para bibliotecas de gráficos 3D para JavaScript, como threejs y BabylonJS.
-
Además de PHP, ¿qué otros lenguajes se pueden utilizar en el lado del servidor de una aplicación web?
Cualquier idioma admitido por la aplicación del servidor HTTP utilizada en el host del servidor. Algunos ejemplos son Python, Ruby, Perl y el propio JavaScript.