Salta el contingut
 

Llenguatges de programació

Joan Puigcerver Ibáñez

Llicència: CC BY-NC-SA 4.0

(Reconeixement - NoComercial - CompartirIgual) 🅭

Conceptes bàsics

Informàtica, binari, digital i programari

La paraula informàtica ve d'informació i automàtica. La informació és un conjunt de dades, i un procés és automàtic quan funciona per si mateix. Per tant, la informàtica és la ciència que estudia el tractament de la informació de manera automàtica, mitjançant un sistema com pot ser un ordinador.

La informàtica permet automatitzar el processament de la informació. Tota la informació que utilitza un ordinador ha d'estar representada en una seqüència de zeros i uns (dígits) anomenada codi binari.

Això significa que cada unitat bàsica d'informació pot tindre dos estats (0 o 1). Aquesta unitat es coneix com a bit (binary digit, b) i un conjunt de huit bits s'anomena byte (B). Un byte pot representar \(2^8\) valors, és a dir, 256 possibilitats diferents, com els caràcters de la taula ASCII – Viquipèdia.

Quan un dispositiu utilitza o emmagatzema informació en forma de bits, es diu que és digital. En canvi, quan el mecanisme que utilitza no es basa en aquest codi, com un rellotge clàssic o un termòmetre de mercuri, es diu que és analògic.

El programari (software) és la part intangible d'un sistema informàtic, és a dir, el seu equipament lògic. Tot programari està dissenyat per fer una tasca determinada en el sistema. Dins del programari es poden distingir dos tipus diferents.

D'una banda, les aplicacions són programari instal·lat sobre el sistema operatiu amb la funció de realitzar una tasca concreta, com editar documents o reproduir música.

D'altra banda, el sistema operatiu és un programari amb la funció de proporcionar una plataforma única per a l'ús de la màquina, independentment del maquinari (hardware) que hi haja. El sistema operatiu és l'encarregat de comunicar-se amb el maquinari.

Programar vs. desenvolupar programari

Programar consisteix a especificar les ordres (instruccions) i les dades que un ordinador (dispositiu) executarà per obtindre una sèrie de resultats o provocar un cert comportament.

És important utilitzar la paraula dispositiu

Hui en dia es pot programar des d'un ordinador fins a una nevera, passant per unes sabatilles esportives o, per què no, fins i tot una catifa, si utilitzen informació digital. Cada vegada més elements de la vida quotidiana accepten ordres en forma de línies de codi o programes, dins del que es coneix com a Internet de les Coses (Internet of Things, IoT).

En canvi, desenvolupar programari va més enllà de programar. Inclou tot el procés d'analitzar, dissenyar, provar, documentar i mantindre el programari, que requereix molt més temps que el que es dedica exclusivament a escriure línies de codi.

Fases del desenvolupament de programari

Autoria desconeguda

Figura 1. Fases del desenvolupament de programari.

Llenguatges de programació

Els llenguatges de programació es poden classificar segons diversos criteris: el nivell d'abstracció, el tipus d'execució i el paradigma.

Segons el nivell d'abstracció

Els éssers humans es comuniquen mitjançant llenguatges naturals, que s'han originat i han evolucionat al llarg dels segles. Aquests llenguatges són molt complexos, amb molts matisos i ambigüitats. Fins i tot, quan les persones es comuniquen, poden arribar a malentesos per culpa del llenguatge.

Per contra, per donar instruccions a una màquina cal fer-ho d'una manera clara, concisa i que només tinga una única interpretació. Arran d'aquesta necessitat s'han creat els llenguatges de programació.

El llenguatge de programació més bàsic, però alhora més difícil d'utilitzar i d'entendre, és el llenguatge màquina. Aquest llenguatge és un sistema de codis directament interpretables per un processador concret, que realitzen diferents operacions (sumar, restar, moure dades d'un registre a un altre...).

Aquests codis estan en binari i, per tant, són difícils d'utilitzar per a les persones. Per facilitar aquesta tasca existeix el llenguatge de baix nivell o assemblador, que relaciona els codis del llenguatge màquina amb paraules o valors fàcils de recordar (ADD en lloc de 0110). No obstant això, continua sent difícil d'utilitzar.

Llenguatge màquina

German, Wikimedia Commons

Figura 2. Llenguatge màquina.

Perquè la tasca de desenvolupar codi siga més amigable, fàcil i flexible, s'han creat diferents llenguatges de programació d'alt nivell, cadascun amb diferents característiques, funcionalitats i propòsits. Aquests llenguatges s'assemblen més al llenguatge natural, però són clars i no permeten ambigüitats. A més, tenen una alta abstracció respecte al maquinari de la plataforma on s'executen.

Llenguatge d'alt nivell

Programming gecko, Wikimedia Commons

Figura 3. Llenguatge d'alt nivell.

Segons el tipus d'execució

L'equip de desenvolupament prefereix utilitzar llenguatges d'alt nivell per desenvolupar programari. No obstant això, els dispositius només entenen el llenguatge màquina dissenyat per a ells. Per tant, per poder executar el codi escrit en un llenguatge d'alt nivell, cal traduir-lo abans a un llenguatge que el dispositiu siga capaç d'entendre.

Segons com es faça aquesta traducció, els llenguatges de programació es classifiquen en dos tipus:

  • Llenguatges interpretats: el codi font es tradueix instrucció per instrucció a mesura que s'executa. L'intèrpret tradueix cada instrucció a llenguatge màquina i, tot seguit, s'executa.

    Alguns exemples de llenguatges interpretats són Python, Ruby, PHP (scripting i servidors web), JavaScript (client web), Bash, PowerShell (scripting) o altres com Perl, MATLAB o Mathematica.

  • Llenguatges compilats: el codi font, escrit en un llenguatge d'alt nivell, és traduït per un compilador a un fitxer executable comprensible per a la màquina en una plataforma determinada. Aquest executable es pot executar tantes vegades com siga necessari sense haver de repetir el procés de traducció.

    Alguns exemples de llenguatges compilats són C, C++, Objective-C, Rust, Pascal, Haskell o Visual Basic.

Interpretats vs. compilats

La taula següent compara els dos tipus de llenguatges segons diversos criteris:

Interpretats Compilats
Temps d'execució Són més lents perquè han de traduir mentre executen el codi. En ser traduïts per endavant, són més ràpids en executar-se.
Detecció d'errors de sintaxi Només poden trobar errors en el codi que s'executa. Poden trobar errors de sintaxi en tot el codi.
Optimització No poden aplicar optimitzacions. Poden aplicar optimitzacions en el codi.
Portabilitat Es poden executar sempre que hi haja un intèrpret. L'executable només es pot executar en l'arquitectura per a la qual s'ha compilat.
Temps de desenvolupament És més ràpid de provar, ja que no cal compilar-lo sencer. És més lent de provar, ja que cal compilar-lo sencer per poder executar-lo.1

Llenguatges intermedis o bytecode

Alguns llenguatges de programació més moderns combinen les dues maneres de traducció per aprofitar al màxim els avantatges de cadascuna. El llenguatge intermedi o bytecode és un llenguatge més abstracte respecte al maquinari que el codi màquina, però que es genera en un fitxer binari mitjançant la compilació d'un llenguatge d'alt nivell. Després, el bytecode s'executa en el dispositiu mitjançant un intèrpret.

Aquest mètode té els avantatges següents:

  • Optimització i detecció d'errors: el bytecode ha sigut compilat i, per tant, s'han pogut aplicar optimitzacions i s'han detectat els errors de sintaxi.
  • Sense recompilació: el bytecode és un fitxer executable i, per tant, no cal recompilar-lo cada vegada.
  • Portabilitat: el bytecode no depén de cap arquitectura.

Alguns exemples d'aquest tipus de llenguatge són Java, Kotlin (compatible amb Java) o C#.

Java

Un exemple de llenguatge intermedi és Java. La Figura 4 mostra el procés d'execució d'un codi font en Java.

Procés d'execució de codi Java

www.educba.com

Figura 4. Procés d'execució de codi Java.

  • Codi font: conté el programa en llenguatge Java (alt nivell) en fitxers amb l'extensió .java.
  • Compilador: compila el codi font a bytecode. El compilador de Java (javac) s'instal·la amb el Java Development Kit (JDK).
  • Bytecode: conté el programa en llenguatge intermedi, en binari, en fitxers amb l'extensió .class.
  • JVM: la Java Virtual Machine interpreta el bytecode i el tradueix a llenguatge màquina, que entén el sistema. La JVM s'instal·la amb el Java Runtime Environment (JRE), que ve inclòs en el JDK.
Exemple: Compilar i executar un programa en Java

Es parteix del codi font següent, guardat en el fitxer HolaMon.java:

public class HolaMon {
    public static void main(String[] args) {
        System.out.println("Hola món!");
    }
}

Primer, es compila el codi font amb l'ordre javac:

joapuiib@fpins:~/java $ ls # (1)!
HolaMon.java
joapuiib@fpins:~/java $ javac HolaMon.java
joapuiib@fpins:~/java $ ls
HolaMon.class  HolaMon.java
  1. L'ordre ls mostra els fitxers del directori actual.

S'observa que la compilació ha generat el fitxer HolaMon.class, que conté el bytecode. A continuació, s'executa amb l'ordre java:

joapuiib@fpins:~/java $ java HolaMon
Hola món!

Segons el paradigma

Els llenguatges de programació també es poden classificar segons el seu paradigma, és a dir, la seua manera de treballar i com s'estructuren.

  • Paradigma imperatiu: els llenguatges imperatius es basen a conéixer l'estat de la màquina i modificar-lo mitjançant instruccions. S'anomenen imperatius perquè utilitzen ordres per indicar al dispositiu què ha de fer i com fer-ho. La majoria d'arquitectures d'ordinadors segueixen una filosofia imperativa i, per tant, la traducció d'un llenguatge imperatiu a codi màquina és més senzilla que la dels llenguatges declaratius.

    Quasi tots els llenguatges són imperatius: C, Java, Python, JavaScript, PHP... Dins d'aquesta categoria hi ha:

    • Llenguatges estructurats: només permeten tres estructures: seqüència, selecció i iteració. Això fa innecessari l'ús de salts (go to), que es consideren una mala pràctica, ja que empitjoren la llegibilitat i el manteniment del codi. No obstant això, encara s'utilitzen salts com break en alguns casos.

      Alguns exemples són Fortran, Algol, Cobol, Basic, Pascal, C o Ada.

    • Llenguatges orientats a objectes: és una estratègia de construcció de programes basada en una abstracció del món real. Els objectes combinen dades (atributs) i mètodes que permeten interactuar amb ells. Aquest paradigma es basa en l'abstracció, l'encapsulació, la modularitat, la jerarquia i el polimorfisme.

      Alguns exemples són Java, C++, Python o C#.

  • Paradigma declaratiu: els llenguatges declaratius fixen un objectiu, però no el camí per arribar-hi. S'indica quin valor es vol obtindre i el dispositiu troba la solució seguint una lògica interna. Són llenguatges més propers a les matemàtiques.

    Alguns exemples són SQL, Prolog o LISP.

Com triar el llenguatge de programació?

Respondre aquesta pregunta podria portar dies sencers divagant entre tots els paradigmes i tipus de llenguatges, i s'arribaria a la conclusió següent: depén.

Cada llenguatge de programació té unes característiques que el fan més o menys apropiat per al context on s'utilitza. Alguns factors determinants són:

  1. El sector productiu al qual va adreçada l'aplicació: medicina, àmbit acadèmic, videojocs, mineria de dades... En aquest cas, convé valorar si hi ha biblioteques que faciliten la tasca.
  2. El tipus de dispositiu on s'executarà: mòbils, escriptori, IoT, web...
  3. El sistema operatiu sobre el qual s'executarà: Linux, Windows, Android, iOS...

Bibliografia

Aquests apunts s'han basat en el material de Sergio Badal.


  1. Molts llenguatges de programació compilats disposen d'intèrprets per agilitzar el procés de desenvolupament i de prova. ↩

📌 Aquest document pot quedar desactualitzat després d’imprimir-lo. Pots consultar la versió més recent a la pàgina web.
🌿 Abans d’imprimir aquest document, considera si és realment necessari. Redueix el consum de paper i ajuda a protegir el nostre entorn.