Salta el contingut
 

Llenguatges de programació

Autor: Joan Puigcerver Ibáñez

Correu electrònic: j.puigcerveribanez@edu.gva.es

Llicència: CC BY-NC-SA 4.0

(Reconeixement - NoComercial - CompartirIgual) 🅭

Conceptes bàsics

Informàtica, binari, digital i software

La paraula informàtica ve d'"informació" i "automàtica". La informació és un conjunt de dades, i automàtic és que funciona per si mateix. D'aquesta manera, la informàtica és la ciència que estudia el tractament de la informació d'una mitjançant un sistema automàtic, 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 tenir dos estats (0, 1). A aquesta unitat se'l coneix com a bit o binary digit (b) i al conjunt de huit bits s'anomena byte (B). Un byte pot representar \(2^8\) caràcters, és a dir, 256 possibilitats diferents (Taula ASCII).

Quan un dispositiu qualsevol utilitza o emmagatzema informació en forma de bits diem que aquest dispositiu és digital. Quan el mecanisme que utilitza no és mitjançant aquest codi, com un rellotge clàssic o un termòmetre de mercuri, diem que és analògic.

El programari (software) és la part intangible d'un sistema informàtic, equivalent a l'equipament lògic. Tot programari està dissenyat per fer una tasca determinada al nostre sistema. Dins d'aquest programari podem distingir dos tipus diferents.

D'una banda, tenim les aplicacions, programari instal·lat sobre el sistema operatiu amb la funció de realitzar una tasca en concret (editar document, reproduir música,...)

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

Programar vs Desenvolupar programari

Es pot definir programar com especificar les ordres (instruccions) i dades a un ordinador (dispositiu) que aquest executarà per rebre una sèrie de resultats o provocar un cert comportament.

Nota

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

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

Fases del desenvolupament de programari

Autor desconegut

Figura 1. Fases del desenvolupament de programari

Llenguatges de programació

Segons el nivell d'abstracció

Els éssers humans ens comuniquem mitjançant llenguatges naturals que s'han anat originant i han anat evolucionant mitjançant segles. Aquests llenguatges són molt complexos, amb molts matisos i ambigüitats. Fins i tot, quan nosaltres ens comuniquem, podem arribar a malentesos o confondre'ns per culpa del llenguatge.

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

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

Aquests codis que el processador entén estan en binari i, per tant, són difícils d'utilitzar per a els éssers humans. Per facilitar aquesta tasca, existeix el llenguatge de baix nivell o assemblador, que és una relació entre els diferents codis del llenguatge màquina i paraules o valors fàcilment recordables (ADD en compte de 0110). No obstant això, són igualment difícils 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 anat creant 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, també tenen una alta abstracció respecte al maquinari de la plataforma on es desitgen executar.

Llenguatge d'alt nivell

Programming gecko, Wikimedia Commons

Figura 3. Llenguatge d'alt nivell

Segons el tipus d'execució

Hem comentat que els desenvolupadors prefereixen utilitzar llenguatges d'alt nivell per desenvolupar programari, però, en canvi, els dispositius sols entenen el llenguatge màquina dissenyat per a aquest. Per poder executar el codi desenvolupat mitjançant llenguatges d'alt nivell, cal traduir-lo abans a llenguatge que el dispositiu siga capaç d'entendre.

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

  • Llenguatges interpretats: El codi font va traduint-se instrucció per instrucció a mesura que s'executa el codi. El intèrpret tradueix cada instrucció a llenguatge màquina i aquest s'executa.

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

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

    Alguns exemples de llenguatges compilats son: C, C++, Objective C, Rust, Pascal, Haskell o VisualBasic.

Interpretats vs Compilats

Interpretats Compilats
Temps execució Son més lents perquè han de traduir mentre executen el codi. En ser traduïts d'avant mà, són més ràpids en executar-se.
Detecció errors de sintaxi Sols 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 pot executar sempre que hi haja un intèrpret. L'executable sols pot ser executat en l'arquitectura compilada.
Temps desenvolupament És més ràpid de provar, 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 han combinat els dos maneres de traducció per intentar aprofitar al màxim els avantatges de cada mètode. El llenguatge intermedi o bytecode és un llenguatge més abstracte respecte al maquinari que el codi màquina, però que ha generat un fitxer binari mitjançant el procés de compilació d'un llenguatge d'alt nivell. El bytecode és executat en el dispositiu mitjançant un intèrpret.

Els avantatges d'aquests mètodes són:

  • El bytecode ha segut compilat, per tant, s'han pogut produir optimitzacions i s'han trobat errors de sintaxi.
  • El bytecode és un arxiu executable i, per tant, no cal recompilar-lo cada vegada.
  • El bytecode és portable i no depén de cap arquitectura.

Exemples d'aquest tipus de llenguatge són: Java, Kotlin (compatible amb Java), C#,...

Java

Un exemple d'utilització de llenguatges intermedis és Java. El procés d'execució d'un codi font Java és el següent:

Procés d'execució de codi Java

www.educba.com

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

  • Codi font: Conté el programa a executar en llenguatge Java (alt nivell). S'utilitza l'extensió .java.
  • Compilador: Es compila el codi font a bytecode amb el compilador de Java, que s'instal·la mitjançant el Java Development Kit (JDK).
  • Bytecode: Conté el programa en llenguatge intermedi en binari. S'utilitza l'extensió .class.
  • JVM: La Java Virtual Machine interpreta el bytecode i el tradueix a llenguatge màquina, entès pel nostre sistema operatiu. La JVM s'instal·la mitjançant el Java Runtime Environment (JRE), que ve inclòs amb el JDK.

Codi font:

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

Compilar:

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 ens mostra els arxius que hi ha en el directori actual.

Executar:

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

Segons el paradigma

Els llenguatges de programació també poden ser classificats segons el seu paradigma, és a dir, la seua manera de treballar i com estan estructurats.

  • Paradigma imperatiu: Els llenguatges imperatius es basen a conèixer l'estat de la màquina i modificar-lo mitjançant instruccions. Es diuen imperatius perquè fem servir ordres per dir al dispositiu què ha de fer i com fer-ho. La majoria d'arquitectures d'ordinadors segueixen una filosofia imperativa, 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 estan:
      • Llenguatges estructurats: Que sols permeten tres estructures: Seqüència, selecció i iteració. Això fa innecessari l'ús de salts (go to) i es consideren una mala pràctica, ja que empitjoren la llegibilitat i el manteniment del codi. No obstant això, se segueixen utilitzant salts com el break en alguns casos.
        • Exemples: Fortran, Algol, Cobol, Basic, Pascal, C, Ada,...
      • Llenguatges orientats a objectes: És una estratègia de construcció de programes basada en una abstracció del món real. Els objectes són combinació de dades (atributs) i mètodes que ens permeten interactuar amb ell. Aquest paradigma es basa en: abstracció, encapsulació, modularitat, jerarquia i polimorfisme.
        • Exemples: Java, C++, Python, C#,...
  • Paradigma declaratiu: Els llenguatges declaratius fixen un objectiu però no el camí per arribar-hi. S'indica quin valor es desitja obtindre i el dispositiu troba la solució seguint una lògica interna. Són llenguatges més propers a les matemàtiques.

    • Exemples: SQL, Prolog, LISP,...

Com triar llenguatge de programació?

Resoldre aquesta pregunta ens podria portar dies sencers divagant entre tots els possibles paradigmes i tipus de llenguatges i arribaríem a la conclusió de: DEPÉN.

Cada llenguatge de programació té unes característiques determinades que el fan més o menys apropiat per al context on el faces servir, podent ser determinants aquests factors:

  1. El sector productiu al qual va adreçada la teva aplicació: Medicina, acadèmic, videojocs, data mining,...
    • Existeixen llibreries que et faciliten la tasca?
  2. El tipus de dispositiu on s'executarà: mòbils, escriptori, IoT, web,...
  3. El sistema operatiu sobre la 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 de intèrprets per agilitzar el procés de desenvolupament i prova. 

Comentaris