¿Qué es un lenguaje de programación?

Muchas veces nos planteamos esta pregunta y es que la tecnología no da tregua a quien se queda por el camino. ¿Qué es un lenguaje de programación? Podría parecer una pregunta elemental, pero tiene tantos matices y es tan amplio el tema que debemos ir explicando los conceptos poco a poco.

¿Qué es un lenguaje de programación?

Cualquier lenguaje en sí supone un sistema de comunicación; y no difiere en el mundo digital, un lenguaje de programación es básicamente un sistema estructurado de comunicación, conformado por conjuntos de palabras claves, símbolos y reglas sintácticas y semánticas que permiten un entendimiento entre el programador y la máquina. Hablamos del conjunto de instrucciones que se agrupan con motivo de una orden específica que pasamos a cierto dispositivo en pos de obtener un resultado coherente a estas acciones ejecutadas.

Por ejemplo cuando en una calculadora sumamos dos número estamos programando la ejecución de una operación aritmética, cuya ejecución se dispara cuando presionamos la tecla de igual (=) y el resultado se nos muestra en pantalla. De igual manera ocurre con un lenguaje de programación:

…en estas líneas hemos declarado dos variables, una llamada operando1 que hemos igualado con el valor 10 y otra llamada operando2 con el valor de 5, luego creamos una constante de nombre resultado, donde acto seguido igualamos con la suma de las dos variables antes mencionada, por último imprimimos el valor ya almacenado en la constante resultado, que en este caso será el valor 15.

Este código es interpretado y validado en un proceso llamado compilación (del cual hablaremos más adelante) para obtener finalmente todas estas ordenes agrupadas en un módulo que estaría ya listo para ejecutarse, una acción que puede llevarse a cabo dando doble click (en dependencia del tipo de aplicación) sobre ella. Esta acción sería equivalente a presionar la tecla igual (=) en una calculadora. Obteniendo el valor 15 en pantalla.

Definición de lenguaje de programación

Aquí ocurre la primera confusión habitual y es que debemos distinguir entre lenguaje de programación y lenguaje informático. Todos los lenguajes de programación son a la vez informáticos, pero no todos los lenguajes informáticos son de programación. Por ejemplo como sucede con HTML, que es un lenguaje de maquetación web, pero no de programación.

Sin querer entrar en tecnicismos, ya que muchas veces estos terminan por decir bien poco al estudiante o al interesado neófito, digamos que un lenguaje de programación está compuesto por una serie de instrucciones (similares a las que acabamos de ver) que tras introducirlas en un máquina, se traducirán en una consecución de operaciones ejecutadas por dicho equipo. Esas acciones suponen órdenes muy precisas y concretas que persiguen un resultado específico, por ejemplo: sumar dos números enteros, controlar la temperatura de una caldera, el tratamiento de datos de un ordenador personal, etc.

Tipos de lenguaje de programación

Las máquinas o más concretamente sus procesadores, solo entienden un único lenguaje, el que conocemos como código binario. Este código está compuesto por unos y ceros y podría compararse al código morse (rayas y puntos), para que comprendas su versatilidad, a pesar de su sencillez.

Este código binario, conocido también como lenguaje máquina, resultaba un poco tedioso, sobre todo porque las órdenes que damos a un procesador son cada vez más complejas, lo que supone dedicar horas y horas a la introducción de líneas compuestas únicamente por unos y ceros. Es por eso que se han buscado formas intermedias de codificar estas órdenes binarias para agilizar los procesos.

Ahora diferenciaremos los tipos de lenguaje en dos grupos principales: de bajo nivel y de alto nivel, según estemos hablando del lenguaje más cercano al lenguaje máquina o del más próximo al empleado por un programador, respectivamente.

Lenguajes de programación de bajo nivel

Los lenguajes de bajo nivel son aquellos que se encuentran mucho más cerca del microprocesador, y con esto lo que intento decir es que su diseño está enfocado en acceder a registros y leer, escribir y mover bytes, está bien lejos de esas operaciones que hacemos en lenguajes de alto nivel donde tomamos una foto y la almacenamos en la nube.

Me refiero al lenguaje máquina o al lenguaje ensamblador. Mediante estos se programan los drivers de tu tarjeta de vídeo o de tu webcam, y esto aplica no solo a ordenadores personales, también se programa todo aquello que con un microcontrolador programable, ya sea un dispositivo móvil, un ordenador, un Raspberry Pi, la computadora interna de un carro o un brazo robótico Siemens. Las instrucciones que componen estos lenguajes ejercen un control directo sobre el equipo y su estructura física, creando un vínculo inseparable entre el hardware y el software donde estos lenguajes servirían de interfaz.

Lenguaje máquina

Pero a estos niveles todo no es color de rosa, ya que existen muchos fabricantes y cada uno establece sus pautas, las cuales tenemos que respetar si deseamos trabajar con sus dispositivos. Para los programadores esto se traduce en que tenemos que aprender el lenguaje máquina de cada plataforma, viéndonos en la situación que nuestro código solo serviría para una única familia de procesadores o dispositivos.

Por ejemplo, si hacemos un programa en lenguaje máquina para un microprocesador IBM este no se ejecutará en un dispositivo con microprocesador Intel o ARM, básicamente por la misma razón por la que un driver de una tarjeta gráfica de AMD no sirve para una tarjeta gráfica de NVIDIA, ambos GPU son distintos, y de igual manera estos microprocesadores cuentan con interrupciones distintas, no son compatibles. Cada tipo de CPU entiende su propio lenguaje de máquina y por ende tendríamos que crear versiones distintas de nuestro programa para cada uno de estos equipos.

Las instrucciones en lenguaje de máquina son números almacenados como bytes en memoria. Cada instrucción tiene su propio y único código llamado código de operación u opcode. Algo que dificulta grandemente la programación en este lenguaje, y es entendible ya que descifrar el significado de instrucciones codificadas numéricamente es tedioso para los humanos. Por ejemplo, la instrucción que suma los registros EAX y EBX y almacena el resultado en EAX está codificada por los siguientes códigos hexadecimales:

Esto claramente no es obvio y prácticamente no dice nada sin su contexto. Afortunadamente, el lenguaje ensamblador puede ayudarnos a realizar este tortuoso trabajo por nosotros.

Lenguaje Ensamblador

Un programa Escrito en lenguaje ensamblador es almacenado como texto (tal como programas de alto nivel). Cada instrucción representa exactamente una instrucción de la máquina. Por ejemplo, la instrucción de suma descrita arriba podría ser representada en lenguaje ensamblador como:

Acá el significado de la instrucción es mucho más claro que el código máquina. La palabra add es el mnemónico para la instrucción de suma. Vamos que hubo un salto cualitativo entre el lenguaje máquina y el lenguaje ensamblador, ahora ya es mucho más fácil para los programadores desarrollar sus herramientas o drivers, al mismo tiempo que resulta más rápido interpretar el código escrito por otros.

Lenguajes de programación de alto nivel

Luego de haber visto con ejemplos básicos los lenguajes de bajo nivel, es entendible la existencia de este grupo, donde nos enfocamos más en el ser humano, en la optimización del tiempo y en la industria del software.

Los lenguajes de alto nivel son más cercanos al programador o el lenguaje natural, como puedan ser el castellano, el inglés o el francés. A este nivel ya no interactuamos con instrucciones del microprocesador y sí con macroinstrucciones (como copiar archivo o leer archivo) que desencadenan en el sistema operativo y el procesador toda una serie de reacciones y codificaciones cuyo resultado es justo la acción que el programador solicita. De esta forma, ya no sería necesario escribir todas esas líneas que habría supuesto una sencilla orden en lenguaje máquina o ensamblador.

Estos lenguajes están orientados a una serie de procesos determinados, como el procesamiento de imágenes, la interacción con el usuario y la inserción de datos, el procesamiento de esta información y su almacenamiento en bases de datos, o también cálculos científico-matemáticos.

A diferencia de los lenguajes de bajo nivel con estos sí que podríamos migrar los programas de una máquina a otra, aunque en algunos casos fueran necesarias algunas modificaciones.

Las ventajas de los lenguajes de programación de alto nivel son:

  • Reducen el tiempo de programación y por ende facilitan el cumplimiento de las metas de un proyecto.
  • Son mucho más fáciles de aprender que los de bajo nivel y en la mayoría de los casos cuentan con una muy buena documentación.
  • Nos permiten desarrollar proyectos relativamente fáciles de escalar y mantener. Aunque estas características puedan estar más asociadas a la arquitectura del proyecto, el lenguaje juega un factor importante.
  • Permiten al programador abstraerse del funcionamiento interno de la máquina.

Esta forma de lenguaje informático ha supuesto un gran avance en el tipo de programas que pueden implementarse, haciendo más accesible la programación a muchas más personas y agilizando los procesos de desarrollo. Los programas que creamos con estos lenguajes nada más estén disponibles ya pueden ejecutarse en millones de dispositivos alrededor del mundo gracias a capas de abstracción creadas por plataformas como .NET de Microsoft, la JVM (Java Virtual Machine) de Oracle o Qt actualmente en propiedad de The Qt Company (antiguamente era de Nokia).

Mediante .NET tenemos aplicaciones corriendo en ordenadores con sistema operativo Windows, aplicaciones web y también aplicaciones móviles mediante Xamarin, mientras que en el caso de Java su JVM (Máquina Virtual de Java) permite la ejecución de aplicaciones en sistemas operativos Windows, Linux y macOS, siendo así una solución de lenguajes multiplataforma (Java, Scala, Kotlin… etc.), también podemos correr sus aplicaciones sobre tostadoras, cajeros automáticos, y móviles como en el caso de las aplicaciones para Android. Por último las aplicaciones en Qt también son multiplataforma, se desarrollan usando el lenguaje C++ y también cuentan con soluciones para equipos embebidos.

Los lenguajes de alto nivel han contribuido sin dudas a mejorar la industria, y han potenciado aun más la usabilidad / utilidad de muchos equipos electrónicos y digitales de cara al usuario final. Con esto lo que quiero decir es que sin los lenguajes de alto nivel difícilmente tuviéramos tantas aplicaciones disponibles para nuestros ordenadores, termostatos compatibles con HomeKit o para nuestros teléfonos inteligentes.

Tipos de programación

Existen diferentes tipos de programación o distintas maneras de enfocar el desarrollo de software. Siempre en dependencia de ciertos entornos de desarrollo y librerías, el proyecto que necesitemos construir, del momento histórico y también de cierto nivel de preferencia personal. Aquí nos centraremos en las más comunes y básicas, aunque existen más opciones.

Programación estructurada (PE): Es un paradigma de programación encaminado a optimizar el tiempo de depuración y mantenimiento de un programa, siendo estos cada vez más eficaces. También se disminuye considerablemente la posibilidad de tener errores, ya que hablamos de un número cada vez más limitado de estructuras. Sus principales ventajas son la simplicidad y facilidad para el programador, con la consecuente reducción del tiempo dedicado..

Este tipo de programación englobaría las siguientes características:

  • Diseño descendente o descomposición del problema en estructuras jerárquicas (top-dow).
  • Recursos abstractos que descomponen las acciones complejas en otras más sencillas o simples para resolverlas con mayor facilidad.
  • Estructuras básicas de tres tipos: secuenciales, selectivas y repetitivas.

Programación Orientada a Objetos (POO). Como su propio nombre indica, su elemento principal es el objeto y esto supone una mejora sustancial en el proceso de desarrollo, sobre todo gracias a la re-utilización de código. Un objeto es un conjunto de datos en relación a su propia naturaleza, dicho de otra forma, un grupo de procedimientos que comparten un estado. Un ejemplo pudiera ser un avión que modelaríamos con el objeto avión y con procedimientos como despegar, navegar y aterrizar y propiedades como la cantidad de asientos, la cantidad de turbinas, y resto de elementos que lo componen.

Este tipo de programación supone quizás un esfuerzo para cambiar nuestros parámetros de pensamiento, aunque se parece mucho a la forma de expresarnos en la vida real. Con él dividiríamos los tipos de programas en clases de objetos, pudiendo escribirlos, mantenerlos o reutilizarlos con mucha más facilidad, por ejemplo, la turbina del avión sería otro objeto, un objeto como propiedad o característica de otro, como un objeto en sí dada su complejidad de funcionamiento y los distintos tipos de turbinas que hay, como también sería otro objeto los asientos del avión con sus propiedades de materiales, ángulo de reclinado, etc.

Podríamos considerar que en este paradigma se gestionan grandes bloques de código y entidades lógicas como colecciones de objetos, pudiendo a su vez establecer diferentes jerarquías entre ellos, conectadas por relaciones de herencia, y con herencia me refiero a que todos los aviones heredan las alas, los trenes de aterrizajes, el timón de cola y otras características comunes que varían con cada modelo pero que siempre están presentes.

Un objeto sería algo así como un molde o un template, por ende con un objeto avión, con todos sus procedimientos y propiedades, podemos crear muchos otros aviones, incluso modelos distintos siempre que hereden estas características.

Programación Orientada a Protocolos (POP). Cuando hablamos de protocolos nos referimos a plantillas que empleamos para normalizar una especificación, ya sea una comunicación de red o un modelo de dato cualquiera. La programación orientada a protocolos se ha convertido prácticamente en un estándar a la hora de crear grandes proyectos de software y es el eje central del lenguaje Swift, de la programación en las plataformas Apple y de los frameworks que la conforman.

Para que se entienda mejor digamos que un protocolo Avión sería aquél blueprint donde se especifican los procedimientos y propiedades que debe tener un avión con tal de poder volar, con esto normalizamos el concepto de avión y su función. Luego cada vez que creemos objetos en representación de un avión tenemos que validarlos forzándolos a ajustarse con este protocolo.

El tema de la programación orientada a protocolos es compleja ya que para poder entenderla del todo nos obliga a dominar otros conceptos técnicos que van más allá de la intención de este artículo. Si deseas profundizar más te recomendamos los artículos donde hablamos sobre los protocolos en el lenguaje de programación Swift y el otro donde debatimos sobre la herencia, asociada a la programación orientada a objetos, y la composición como elección dentro de la programación orientada a protocolos.

Como les acabo de comentar el lenguaje Swift acoge esta filosofía desde sus inicios, si deseas conocer más sobre él agrego esta última recomendación a las anteriores: El Lenguaje de Programación Swift.

Compilación

La palabra ya nos va indicando por donde va la cosa, un compilador es el programa encargado del proceso de compilación, pero este muchas veces no funciona solo. Cuando compilamos procesamos cientos o miles de líneas de códigos segmentadas en varios ficheros fuente, una tarea que en ocasiones puede necesitar de otro programa llamado preprocesador en pos de ir preparando código para su análisis.

Interpretamos, validamos y pasamos a optimizar el código, el cual luego de estos pasos se encuentra en una estado de código objeto o código intermedio (bytecode), luego, o bien se ejecuta el código por algún sistema como el JRE (Java Runtime Environment, o Entorno de Ejecución Java) o se pasa directamente al paso de enlazado. Durante el proceso de enlazado se agrega tanto el código de las funciones que hemos utilizado de la librería estándar (o de terceros) como el código de las librerías del compilador, esto último a favor de que el ejecutable pueda comunicarse directamente con el sistema operativo, traduciendo así finalmente el código objeto a código máquina, y generando el binario ejecutable.

Gracias a estos procesos es que tenemos sistemas como LLVM (Low Level Virtual Machine, o Máquina Virtual de Nivel Bajo) en el cual gracias a su diseño agnóstico se aprovechan todas estas etapas al punto de procesar distintos lenguajes de programación (C / C++ / Python, Ruby, Objective-C / SwiftAda, incluso hasta bytecode de Java, entre otros) para luego en la implementación de capas intermedias procesar este código en estado abstracto (no está enfocado a ninguna arquitectura o sistema operativo) hacia el resto de pasos que ya hemos explicado.

Analizador lexicográfico

El analizador lexicográfico es la primera fase del proceso de compilación, en la cual se lee el código y se generan tokens en dependencia de las secuencias de caracteres procesadas. Estos tokens son los que se utilizan en la siguiente fase, así que podemos decir que el producto del analizador lexicográfico es la entrada del analizador sintáctico.

Cuando hablamos de tokens nos referimos a ciertas pautas que van asociándose con instrucciones específicas propias del lenguaje, como por ejemplo palabras claves u operadores aritméticos. Para que se entienda mejor de lo que estamos hablando la siguiente tabla sin dudas servirá de ayuda:

Expresión Regular Token Valor de atributo
if IF Palabra clave if
while WHILE Palabra clave while
lastName, count, status2 ID Cualquier secuencia de caracteres seguidos por caracteres o dígitos
0, 1, 2, 500 NUM Cualquier número
“cadena de texto” STRING Cualquier cadena de texto
+ PLUS Operador de suma
> GT Greater than, o Mayor que
>=  GE Greater than or equal to, o Mayor o igual que
=  EQ Equal to, o Igual que
EOF End of file, o Fin de archivo

Ahora de paso ya sabemos por qué las palabras reservadas no se pueden usar para nombrar variables, claramente esto confundiría el analizador lexicográfico y haría mucho más compleja esta etapa. Otras operaciones que ocurren en esta etapa es la eliminación de los comentarios y los espacios en blanco.

Analizador sintáctico o semántico

En esta etapa es donde se validan los tipos de datos, los accesos a índices, que las variables en efecto se pueden modificar y las constantes no, etc. Un analizador semántico es lo que también se conoce como Parser, ese proceso que ejecutamos de manera bastante habitual cuando procesamos un JSON por ejemplo.

La semántica de un lenguaje proporciona significado a sus construcciones, a través de tokens y reglas sintácticas. La semántica ayuda a interpretar símbolos, sus tipos y sus relaciones entre sí. El análisis semántico juzga si una estructura sintáctica declarada en el código fuente deriva en algún significado o no. Por ejemplo:

… este código no debería emitir ningún error en la fase de análisis léxico y de sintaxis, ya que es léxica y estructuralmente correcta, pero debería generar un error semántico ya que el tipo de dato de la variable edad difiere del tipo de dato correspondiente al valor que estamos intentando almacenar.

No podemos copiar una cadena de caracteres dentro de una variable a la cual explícitamente hemos declarado como de tipo entero (Int). Estas reglas están establecidas por la gramática del lenguaje y se evalúan en análisis semántico.

Lenguajes de programación interpretados

Los lenguajes de programación interpretados son aquellos cuyo código es directamente interpretado, validado y ejecutado sin necesidad de pasar previamente por un proceso de compilación de estas instrucciones a sus equivalente en lenguaje máquina.

Es decir que para llegar a la ejecución del código no necesitamos pasar por la conversión de nuestro código fuente, ya que este estaría listo para su uso o su ejecución directa (en dependencia de la implementación). Nuestro código se ejecuta prácticamente de manera instantánea por otro programa que funge como analizador sintáctico, que valida la coherencia del código, y ejecuta las instrucciones.

Un ejemplo de esto sería Python cuyo código es procesado y Python como tal (el interprete) sería el que valida y traduce el código, para luego comunicarse directamente con el sistema operativo y el hardware en pos de lograr las funcionalidades deseadas. Otro ejemplo sería JavaScript que solo se ejecuta en los navegadores compatibles (actualmente todos) y mediante estos proveen de funcionalidades a los sitios web, o también lo que sucede con Node.js que interpreta el código JavaScript en pos de esa lógica necesaria tras un backend: la interacción con el frontend, las rutas, los templates, la gestión de la información con la base de datos, etc.

Los lenguajes interpretados siempre dependen del programa que los vuelve útiles, ya que sin estos no son más que ficheros de texto plano con códigos escritos esperando a que alguien haga algo con ellos.

Algunos de estos lenguajes son:

  • Java
  • Python
  • ECMAScript (JavaScript, ActionScript… etc)
  • PHP
  • ASP
  • SQL
  • Lisp

Lenguajes de programación compilados

Por otra parte los lenguajes compilados son mucho más rápidos e independientes, son interpretados igualmente que los anteriores pero con la diferencia de que el código se optimiza y se traduce a código máquina, generando un fichero ejecutable en lugar de un conjunto de acciones.

Estos binarios ejecutables interactúan directamente con el sistema operativo y el hardware, lo que la mayoría de las veces se traduce con una mayor rapidez de ejecución, ya que claramente nos hemos saltado el paso del interprete que se encuentra constantemente de intermediario entre nuestro código y el ordenador.

Dicho esto último también entendemos por qué son más independientes, básicamente porque no necesitan de otro programa para su ejecución aunque si de alguna que otra librería, algo que si las licencias lo permiten pudiéramos solventar compilando de manera estática ese binario y sus assets (recursos como iconos, imágenes, etc.), obteniendo como producto un ejecutable final que podemos moverlo a otro ordenador bajo el mismos sistema operativo y sin necesidad de que las librerías que utiliza se encuentren instaladas, por ende nuestro programa se ejecutará sin problemas.

Algunos de estos lenguajes son:

  • C
  • C++
  • C#
  • Swift
  • Go

Los lenguajes compilados de medio o bajo nivel entran a consideración en especial cuando la eficiencia es nuestra prioridad. Desde estos lenguajes contamos con una correspondencia bastante directa entre el código programado y las operaciones de hardware realizadas por el código máquina, permitiendo a los programadores controlar más finamente el microprocesador y el uso de la memoria. Esta en parte es la razón por la que actualmente el desarrollo de videojuegos se realiza principalmente desde C++ y C#.

Programación funcional

La programación funcional es un paradigma de programación declarativa, mediante el cual gestionamos nuestro código de una manera distinta, basada en el uso y comportamiento de funciones matemáticas, y que se ha creado explícitamente para permitir un enfoque puramente funcional de la resolución de problemas.

Quizás lo anterior no te diga mucho, y es que la programación funcional es una de esas cosas que son muy difíciles de explicar a personas sin una base de programación o en matemáticas. No obstante digamos que va más allá de como estructuramos y organizamos nuestro código, en la programación funcional entran en consideración otros conceptos como las funciones puras, la integridad referencial y el uso de funciones de orden superior.

Sobre la programación declarativa y la imperativa no quiero que se abrumen. Básicamente porque es un tema avanzado del cual hablaremos en otro artículo y también porque la mayoría de lenguajes modernos son lo suficientemente flexibles para admitir varios paradigmas. Por ejemplo, Swift es tanto compatible con el paradigma de programación imperativa como con el paradigma de programación declarativa, de igual manera que C#, este último incluye extensiones del lenguaje que explícitamente fueron diseñadas para ser compatibles con la programación funcional y declarativa, incluidas las expresiones lambda, la inferencia de tipos y la tecnología LINQ.

La programación funcional es un tema bien amplio al cual dedicaremos un articulo completo así que aprovecho para invitarte a seguirnos en nuestras redes sociales y a suscribirte a nuestra la lista de correo para que no te pierdas ninguna de nuestras publicaciones futuras.

Antes de continuar nombremos algunas de las ventajas que ofrece la programación funcional frente a la imperativa:

  • Hacer test de código funcional es más sencillo ya que no dependemos de un estado que pueda ser alterado desde ningún sitio. Nuestra salida para la misma entrada siempre será la misma.
  • La programación concurrente o paralela es también mucho más simple. Ya que no dependemos de variables que haya que sincronizar, ni tenemos que implementar métodos con el objetivo de validar que solo se pueda acceder a ciertos bloques a través de un solo hilo, algo que nos ayuda grandemente a hacer todo mucho más simple.
  • Las aplicaciones escritas con código funcional suelen tener muchas menos líneas de código. Aparte de las características de cada uno de los lenguajes, al poder pasar y devolver funciones como parámetros nuestro código es mucho más reutilizable y sencillo de mantener.

También hay ciertos inconvenientes con la programación funcional, o digamos quizás, matices que en ocasiones pudieran no ser del todo ideales, pero estos ya los veremos en el artículo que dedicaremos al tema.

Los lenguajes de programación más populares

En la definición de lenguaje de programación hablábamos de esa forma en que podían entenderse máquinas y programadores para obtener el resultado esperado. Pues bien, existe un índice general internacional, el TIOBE  Index, que nos indica cuáles son los más usados o populares. En lo que va de año TIOBE señala a la cabeza los lenguajes Java, C, C++, Pyhton, C# y Javascript.

Este índice se elabora gracias a variables como la cantidad de programadores cualificados, la demanda laboral. el interés por la comunidad tras las búsquedas en motores como Google y Bing, o la demanda de cursos para uno u otro lenguaje.

Software de programación

Un software de programación o mejor dicho el software que utilizamos para desarrollar aplicaciones no es más que un conjunto de todas aquellas herramientas que nos permiten escribir código, orientado a crear, depurar, mantener y empaquetar nuestros proyectos. Estas suite de desarrollo usualmente están compuestas por pequeños programas que gestionan alguna de las distintas etapas por las que pasará nuestro proyecto durante su creación. Algunos de estos son:

  • Editores de código: Mediante estos escribimos nuestros código y obtenemos servicios de auto completado, marcado de errores sintácticos, así como refactorización.
  • Compiladores: Ya hemos hablado antes de ellos y traducen el código fuente a lenguaje máquina. Generan binarios ejecutables, a estos usualmente es a donde apuntan los iconos de enlace directo que tienes en tu escritorio.
  • Depuradores. Son un gran aliado de los programadores, nos sirven para monitorear línea por línea la ejecución de un programa, haciendo seguimiento de los valores de ciertas variables, referencias a objetos en memoria, ayudándonos a corregir esos errores que no saltan a la vista y por ende optimizando nuestro tiempo de desarrollo.

IDE (Integrated Development Environment)

El IDE (Integrated Development Environment) o Entorno de Desarrollo Integrado, no es más que ese software de programación al que nos referíamos en el apartado anterior y que vamos a intentar entender mejor.

Como ya sabemos un IDE es una aplicación informática que emplean los programadores y que proporciona una serie de servicios que facilitan la programación de software. En la actualidad contamos con algunos bien completos y complejos, pero por lo general disponen de una interfaz gráfica en la cual se concentran todas sus opciones a nuestra disposición: un editor de código fuente, servicios de auto completado, integración con sistemas de control de versiones, gestión de conexiones a bases de datos, simuladores de dispositivos:

Simuladores de dispositivos en Xcode

…un depurador para agilizar el proceso de desarrollo de software, entre otras muchas funcionalidades.

Visual Studio

Microsoft Visual Studio en un IDE bastante famoso, con soporte para múltiples lenguajes de programación y al que usualmente se le asocia con el desarrollo de aplicaciones en plataformas Microsoft Windows y esto es correcto, pero tenemos que puntualizar los pasos que ha dado hacia el Open Source, de hecho ya contamos con versiones relativamente completas para macOS y Linux.

Visual Studio permite a los desarrolladores crear sitios y aplicaciones web, así como servicios web en cualquier entorno con soporte para la plataforma .NET. Así, se pueden crear aplicaciones que se comuniquen entre estaciones de trabajo, páginas web, dispositivos móviles, dispositivos embebidos y consolas de videojuegos, entre otros.

Xcode

Xcode es un IDE de los más avanzados del mercado. Dispone de todo lo que puedas necesitar durante el desarrollo de aplicaciones para las plataformas Apple. Xcode es increíblemente rápido y estable mientras trabajas, incluso editando los archivos más grandes. Cuenta con nuevas y poderosas funcionalidades de refactorización, renombrando de símbolos a través de Swift e incluso archivos de interfaz de usuario.

Xcode

Este formato aporta una ingeniería de diseño y desarrollo para la creación de aplicaciones (siempre hablando de iPhone, Mac e iPad, al menos de momento) que no puedes dejar pasar, sobre todo si pretendes dedicarte a la programación.

Editores de Código

Los editores de código surgieron como una alternativa más ligera a los clásicos IDE, y con un enfoque bien claro en la productividad. En un inicio fueron muy utilizados en el desarrollo web pero actualmente cuentan con soporte para casi todos los lenguajes programación. Veamos los más representativos:

Visual Studio Code

Como ya se podrán imaginar este editor de código es desarrollado por Microsoft, es gratuito, multiplataforma y actualmente de los más usados en todo el mundo, incluso en sistemas Linux y macOS donde históricamente ha habido cierta reticencia a usar productos de Microsoft.

Visual Studio Code en Ubuntu

Incluye soporte para la depuración, control integrado de Git, resaltado de sintaxis, finalización inteligente de código, fragmentos y refactorización de código. Visual Studio Code es también altamente personalizable, por lo que los usuarios pueden cambiar el tema del editor, los atajos de teclado y las preferencias. Es gratuito y de código abierto.

Atom

Atom es desarrollado por GitHub, es un editor de código fuente gratuito y mediante el cual podemos gestionar nuestros proyectos de software, también es multiplataforma y de código abierto. Cuenta con una muy buena documentación, es un editor muy flexible que podemos personalizar a gusto, tiene soporte para plug-ins escritos en Node.js, y la integración de Git es genial… ¡está hecha por GitHub después de todo!

Atom en Ubuntu

Si hay un aspecto negativo de Atom, es que a veces se siente lento. Hay ocasiones en que cuando abrimos un archivo grande o cambiamos entre pestañas, si tenemos muchas abiertas, es donde nos percatamos de un retardo, hay cierto delay que resulta bastante molesto y más aún cuando tenemos ordenadores potentes donde esto jamás debería de ocurrir.

El problema del rendimiento no es nuevo, desde sus inicios ya se hablaba sobre esto, fue un tema bastante debatido por toda la comunidad, pero muchos quisieron darle una oportunidad, era un proyecto de los chicos de GitHub (del cual todos somos fan), era nuevo y se encontraba en fase Beta, ¡ya mejorará! dijimos muchos. Ciertamente así fue, ha dado un salto cualitativo desde entonces, pero la frustración sigue ahí, en menor frecuencia pero aún persiste.

Atom es una gran herramienta, especialmente para aquellos que desean personalizar su editor fácilmente, y más allá de lo que otros ofrecen. Como desarrollador, la libertad de modificar, agregar y ampliar su editor le da una increíble sensación de poder. También me encantan sus documentos. El Manual de vuelo Atom proporciona un excelente punto de partida para nuevos usuarios.

Atom fue muy popular y en parte aún lo es, pero actualmente muchos desarrolladores han abogado por otras alternativas y se encuentran usando de manera muy activa Visual Studio Code.

Conclusiones

Todo cuanto hemos visto en este artículo ya nos debería de dar idea de esos lenguajes que hacen funcionar muchas de las aplicaciones que usamos a diario, y aunque pueden estar desarrolladas con diferentes lenguajes de programación, casi todos tienen bases comunes que hacen que aprender cualquiera de estos sea una tarea relativamente fácil, una vez ya dominado uno.

Ahora ya te pueden preguntar ¿qué es un lenguaje de programación? Sin dudas posees los conocimientos elementales para poder establecer una conversación e incluso un debate sobre esto. Esperamos haber resuelto todas tus dudas o alguna de ellas, y en el mejor de los casos haberte orientado a la hora de escoger tu próxima meta educativa o laboral.

Falta aún mucho por aprender en nuestro camino a convertirnos en iOS Developer. Suscríbete a nuestra lista de correo mediante el formulario en el panel derecho y síguenos en nuestras redes sociales. Mantente así al tanto de todas nuestras publicaciones futuras.

Espero que todo cuanto se ha dicho aquí, de una forma u otra le haya servido de aprendizaje, de referencia, que haya valido su preciado tiempo. Este artículo, al igual que el resto, será revisado con cierta frecuencia en pos de mantener un contenido de calidad y actualizado.

Si tienes alguna duda puedes dejarla en los comentarios, te prometo leerla y de ser necesario añadirla a este artículo en pos de que sea mucho más completo y pueda ayudar a muchas más personas.

RECIBE CONTENIDO SIMILAR EN TU CORREO

RECIBE CONTENIDO SIMILAR EN TU CORREO

Suscríbete a nuestra lista de correo y mantente actualizado con las nuevas publicaciones.

Se ha suscrito correctamente!

Close

Adblock Detected

Please consider supporting us by disabling your ad blocker