Tancàvem la lliçó anterior amb una constatació: la història no ens ha deixat un llenguatge de programació, sinó centenars, cadascun amb les obsessions de l'època i l'àmbit en què va néixer. Per a algú que comença, aquesta abundància és més un problema que un avantatge. Per on s'hi entra? Tant se val quin es triï primer? N'hi ha algun de «millor»?
Aquesta lliçó hi posa ordre. Aprendràs els quatre eixos amb què es classifica qualsevol llenguatge —nivell d'abstracció, forma d'execució, sistema de tipus i paradigma—, veuràs una comparativa pràctica dels llenguatges més utilitzats avui i en sortiràs amb criteris reals per triar-ne un davant d'un projecte concret. Acabarem justificant per què aquest curs fa servir Python, que no és una elecció òbvia ni l'única possible.
Un advertiment útil des del principi: no existeix el millor llenguatge, existeix el llenguatge adequat per a un context. Qui afirmi el contrari està venent alguna cosa, normalment la seva pròpia experiència disfressada de llei universal.
Contingut
- Nivells d'abstracció: màquina, assemblador i alt nivell
- Formes d'execució: compilat, interpretat i bytecode
- Sistemes de tipus: estàtic vs dinàmic, fort vs feble
- Paradigmes de programació
- Comparativa de llenguatges actuals
- Com triar un llenguatge: criteris pràctics
- Per què aquest curs fa servir Python
- Errors comuns i consells
- Exercicis
- Conclusió
- Nivells d'abstracció: màquina, assemblador i alt nivell
El primer eix mesura quanta màquina cal tenir al cap per escriure una línia de codi.
| Nivell | Què s'escriu | Portable | Exemple |
|---|---|---|---|
| Llenguatge màquina | Binari que el processador executa directament | No: lligat a un processador | 10110000 01100001 |
| Assemblador | Noms curts per a instruccions del processador | No: lligat a una família | MOV AL, 61h |
| Alt nivell | Idees properes al problema | Sí, en general | print("Hola") |
Comparem la mateixa operació —sumar dos nombres i mostrar el resultat— als dos extrems. En assemblador (x86, simplificat):
mov eax, 12 ; carrega el valor 12 al registre EAX
add eax, 30 ; suma 30 a EAX; ara EAX val 42
mov [total], eax ; desa EAX a la posicio de memoria anomenada 'total'
; ...i encara falten ~15 linies per convertir el numero a text
; i invocar el sistema operatiu per escriure'l a la pantallaEn Python:
Les diferències que importen:
- Registres i memòria. En assemblador decideixes tu en quin registre va cada valor. En Python ni tan sols saps que existeixen els registres.
- Volum de codi. El que en alt nivell són dues línies, en assemblador són vint.
- Portabilitat. El codi Python funciona al Windows del Luis i al macOS de la Nuria sense tocar res. L'assemblador de dalt no funciona ni en un mòbil.
Hi ha un matís que convé tenir clar: el baix nivell no és «pitjor». L'assemblador i C es continuen fent servir on cal esprémer cada cicle o controlar el maquinari directament: nuclis de sistemes operatius, controladors de dispositiu, microcontroladors, videojocs exigents. Només és una eina cara: es paga en temps de desenvolupament i en probabilitat d'error.
Dins de l'«alt nivell» hi ha graus. C és d'alt nivell comparat amb l'assemblador, però molt proper a la màquina comparat amb Python. És més útil pensar en un gradient que en calaixos:
flowchart LR
A["Llenguatge maquina"] --> B["Assemblador"] --> C["C"] --> D["Java / C#"] --> E["Python / JavaScript"] --> F["SQL"]
A -.- G["Mes control<br/>sobre la maquina"]
F -.- H["Mes a prop<br/>del problema"]
- Formes d'execució: compilat, interpretat i bytecode
A la primera lliçó vam veure la diferència entre compilar i interpretar. Ara completem el quadre amb el cas intermedi, que és el que fan servir Java, C# i —parcialment— el mateix Python.
Compilació anticipada. El compilador tradueix tot el codi font a codi màquina del sistema de destinació i produeix un executable. És el que fan C, C++, Rust i Go.
Interpretació. Un intèrpret llegeix el codi font i l'executa sobre la marxa. No hi ha executable: per llançar el programa cal l'intèrpret instal·lat.
Bytecode i màquina virtual. Un pas intermedi: el codi es compila a un format compacte anomenat bytecode, que no és codi màquina de cap processador real sinó d'una màquina virtual. Aquesta màquina virtual, que sí que existeix per a cada sistema, executa el bytecode. Així s'aconsegueix això de Java: es compila una vegada i el resultat funciona en qualsevol sistema que tingui la màquina virtual.
flowchart TD
A["Codi font"] --> B["Compilacio anticipada<br/>C, C++, Rust, Go"]
A --> C["Compilacio a bytecode<br/>Java, C#"]
A --> D["Interpretacio<br/>Python, JavaScript, PHP"]
B --> B1["Executable natiu<br/>(.exe, binari)"] --> Z["Processador"]
C --> C1["Bytecode<br/>(.class)"] --> C2["Maquina virtual<br/>(JVM)"] --> Z
D --> D1["L'interpret llegeix i executa"] --> Z
| Aspecte | Compilat | Bytecode + VM | Interpretat |
|---|---|---|---|
| Què es distribueix | Executable natiu | Bytecode + requereix VM | Codi font + requereix intèrpret |
| Portabilitat | Baixa: un per sistema | Alta | Alta |
| Velocitat típica | Molt alta | Alta | Mitjana |
| Cicle escriure-provar | Lent (recompilar) | Mitjà | Ràpid |
| Errors de sintaxi | Detectats abans d'executar | Detectats abans d'executar | En arribar a la línia |
Un detall sobre Python que sol confondre: Python també compila a bytecode, de manera automàtica i transparent (són aquests fitxers .pyc que apareixen en una carpeta __pycache__). La diferència amb Java és que en Python passa en el moment d'executar, sense un pas explícit, i per això a efectes pràctics es comporta com un llenguatge interpretat. Les fronteres són més borroses del que suggereixen les etiquetes.
- Sistemes de tipus: estàtic vs dinàmic, fort vs feble
El tipus d'una dada és la mena de valor que és: un nombre enter, un text, un valor de veritat. Els llenguatges es diferencien en quan comproven els tipus i en quant es prenen seriosament aquesta comprovació. Són dos eixos independents que es confonen constantment.
Estàtic vs dinàmic: quan es comprova
En un llenguatge de tipatge estàtic, cada variable té un tipus declarat o deduït en el moment de compilar, i no canvia. Els errors de tipus es detecten abans d'executar.
// Java: tipatge estatic
int quantitatTasques = 5;
quantitatTasques = "moltes"; // ERROR en compilacio: no compilaEn un llenguatge de tipatge dinàmic, el tipus va associat al valor, no a la variable, i es comprova durant l'execució.
# Python: tipatge dinamic
quantitat_tasques = 5
quantitat_tasques = "moltes" # Perfectament valid: ara es un textEn Python la segona línia no dóna cap error: la variable simplement passa a referir-se a una altra cosa. La comoditat té preu: un error de tipus no es descobreix fins que la línia afectada s'executa, que pot ser en producció, un dimarts, amb un client al davant.
Fort vs feble: quant es respecta el tipus
Aquest eix mesura si el llenguatge converteix tipus pel seu compte quan l'operació no encaixa.
# Python: tipatge fort
print("Tasques: " + 5)
# TypeError: can only concatenate str (not "int") to strPython s'hi nega: sumar un text i un nombre no significa res, així que dóna error i t'obliga a decidir. La forma correcta seria print("Tasques: " + str(5)).
// JavaScript: tipatge feble
console.log("Tasques: " + 5); // "Tasques: 5" -> converteix el numero a text
console.log("5" - 2); // 3 -> ara converteix el text a numero
console.log("5" + 2); // "52" -> i aqui torna a convertir al revesJavaScript sempre troba la manera que l'operació signifiqui alguna cosa. És còmode fins que produeix resultats absurds que ningú no detecta.
Els quatre quadrants
| Tipatge fort | Tipatge feble | |
|---|---|---|
| Estàtic | Java, C#, Rust, Go | C |
| Dinàmic | Python, Ruby | JavaScript, PHP |
I el resum d'avantatges i inconvenients, que és el que de debò es fa servir en triar:
| Tipatge estàtic | Tipatge dinàmic | |
|---|---|---|
| Errors detectats | Abans d'executar | En executar |
| Verbositat | Més gran: cal declarar tipus | Més petita |
| Velocitat d'escriptura | Menor | Major |
| Ajuda de l'editor | Excel·lent (sap els tipus) | Limitada |
| Idoni per a | Sistemes grans i equips nombrosos | Prototips, scripts, aprenentatge |
Un apunt per al futur: Python permet des de fa anys anotar tipus de manera opcional (quantitat: int = 5). No els comprova en executar, però ajuden l'editor i les eines d'anàlisi. És un exemple de com els llenguatges es copien les bones idees entre si; no ho farem servir en aquest curs, però convé saber que existeix.
- Paradigmes de programació
Un paradigma és una manera d'organitzar el pensament sobre el programa: què es considera la peça bàsica i com es combinen les peces. Vegem els quatre principals amb un fragment mínim de cadascun. Tots resolen la mateixa tasca: obtenir les tasques de prioritat alta d'Estudi Alba.
Imperatiu i estructurat
Es descriu pas a pas com arribar al resultat, amb seqüències, condicions i bucles. És el paradigma amb què es comença sempre i el que domina els mòduls 2 a 5 d'aquest curs.
# Imperatiu: descrivim el procediment
tasques = ["Logo Sole (alta)", "Cartell fira (baixa)", "Web Nuria (alta)"]
urgents = []
for tasca in tasques: # recorre una a una
if "(alta)" in tasca: # si compleix la condicio...
urgents.append(tasca) # ...l'afegeix a la llista de resultatOrientat a objectes
La peça bàsica és l'objecte: un paquet que conté dades i les operacions que hi actuen. Es modela el món com a entitats que col·laboren.
# Orientat a objectes: la tasca sap coses sobre si mateixa
class Tasca:
def __init__(self, titol, responsable, prioritat):
self.titol = titol
self.responsable = responsable
self.prioritat = prioritat
def es_urgent(self):
return self.prioritat == "alta"
t = Tasca("Logo Sole", "Luis", "alta")
print(t.es_urgent()) # TrueL'estudiarem a fons al mòdul 7. De moment n'hi ha prou amb quedar-se amb la idea: les dades i el seu comportament viatgen junts.
Funcional
La peça bàsica és la funció, entesa en sentit matemàtic: rep dades i retorna un resultat, sense modificar res extern. S'evita canviar l'estat i es afavoreix compondre funcions.
# Funcional: descrivim la transformacio, no el procediment
tasques = ["Logo Sole (alta)", "Cartell fira (baixa)", "Web Nuria (alta)"]
urgents = list(filter(lambda t: "(alta)" in t, tasques))No hi ha bucle ni llista que es va omplint: es declara què es vol («les que compleixen aquesta condició») i la maquinària del llenguatge s'encarrega del com. Ho veurem a Funcions com a valors.
Declaratiu: el cas de SQL
Es descriu què es vol obtenir, sense dir en absolut com obtenir-ho. El cas més conegut és SQL, el llenguatge de les bases de dades.
SELECT titol, responsable
FROM tasques
WHERE prioritat = 'alta' AND estat = 'pendent'
ORDER BY responsable;Enlloc no es diu com recórrer les dades ni en quin ordre: això ho decideix el gestor de la base de dades. És l'abstracció portada a l'extrem, i funciona molt bé en dominis acotats.
| Paradigma | Peça bàsica | Pregunta que respon | Exemple de llenguatge |
|---|---|---|---|
| Imperatiu/estructurat | La instrucció | Quins passos cal fer? | C, Python |
| Orientat a objectes | L'objecte | Quines entitats hi ha i què fan? | Java, C++, Python |
| Funcional | La funció | Quina transformació aplico? | Haskell, Scala, Python |
| Declaratiu | La descripció del resultat | Què vull obtenir? | SQL, HTML |
Fixa't que Python apareix en tres files. La majoria de llenguatges moderns són multiparadigma: no t'obliguen a triar, i en un mateix programa conviuen un bucle imperatiu, una classe i una funció lambda. Aquesta és una altra raó per la qual Python funciona bé com a primer llenguatge: permet recórrer els tres estils sense canviar d'eina.
- Comparativa de llenguatges actuals
| Llenguatge | Tipatge | Execució | Usos típics | Corba d'aprenentatge |
|---|---|---|---|---|
| Python | Dinàmic, fort | Interpretat (bytecode intern) | Ciència de dades, IA, automatització, web backend, scripting | Suau |
| JavaScript | Dinàmic, feble | Interpretat (JIT al navegador) | Web frontend, backend amb Node.js, apps mòbils híbrides | Mitjana (el llenguatge és fàcil; l'ecosistema, no) |
| Java | Estàtic, fort | Bytecode + màquina virtual | Programari empresarial, Android, sistemes de gran mida | Mitjana-alta (molta cerimònia inicial) |
| C | Estàtic, feble | Compilat a natiu | Sistemes operatius, controladors, sistemes encastats | Alta (memòria manual, punters) |
| C# | Estàtic, fort | Bytecode + CLR | Aplicacions Windows, videojocs amb Unity, backend empresarial | Mitjana |
| SQL | — (declaratiu) | Interpretat pel gestor | Consulta i manipulació de bases de dades | Suau per al bàsic, alta per a l'avançat |
| Go | Estàtic, fort | Compilat a natiu | Serveis al núvol, eines de xarxa, contenidors | Mitjana-suau (llenguatge deliberadament petit) |
| Rust | Estàtic, fort | Compilat a natiu | Sistemes crítics, rendiment amb seguretat de memòria | Molt alta |
| PHP | Dinàmic, feble | Interpretat | Webs de servidor, WordPress, comerç electrònic | Suau |
Algunes lectures que convé fer sobre aquesta taula:
- La corba d'aprenentatge no mesura la potència. Rust és dificilíssim perquè t'obliga a demostrar al compilador que la teva gestió de memòria és correcta. Això no el fa millor per escriure un gestor de tasques de tres persones.
- Els llenguatges se solapen. Python, Java, C# i Go poden escriure tots el backend d'una aplicació web. L'elecció depèn més del context que de les capacitats.
- SQL no competeix amb els altres. És un llenguatge especialitzat que es fa servir des dels altres: un programa Python que consulta una base de dades conté SQL a dins. Sabràs Python i sabràs SQL, no l'un o l'altre.
- Com triar un llenguatge: criteris pràctics
Quan algú pregunta «quin llenguatge faig servir?» sense dir per a què, la pregunta no té resposta. Aquests són els quatre criteris que sí que la donen.
1. El domini del problema. És, amb diferència, el criteri més determinant. Hi ha àmbits on la decisió està pràcticament presa per endavant:
| Si el problema és... | El natural és... | Perquè... |
|---|---|---|
| Interactivitat en una pàgina web | JavaScript | És l'únic que executen els navegadors |
| Anàlisi de dades o machine learning | Python | Allà hi ha pandas, NumPy, scikit-learn, PyTorch |
| App nativa d'iPhone | Swift | És l'ecosistema oficial d'Apple |
| App nativa d'Android | Kotlin | És l'ecosistema oficial de Google |
| Nucli d'un sistema operatiu | C o Rust | Requereixen control directe de memòria i maquinari |
| Consultar una base de dades | SQL | És el llenguatge del gestor |
2. L'ecosistema. Un llenguatge sense biblioteques és un llenguatge sense utilitat pràctica. Abans de triar, pregunta't si hi ha biblioteques madures per al que necessites, documentació abundant, respostes als problemes típics i gent que el mantingui. Un llenguatge elegant amb ecosistema pobre t'obligarà a reescriure coses que en un altre lloc són una línia.
3. L'equip. El millor llenguatge per a un projecte sol ser el que ja sap la gent que l'ha de mantenir. Introduir un llenguatge nou costa mesos de productivitat i crea una dependència perillosa: si l'única persona que el domina se'n va, el projecte queda orfe. Aquest criteri, poc glamurós, decideix moltíssims projectes reals.
4. El rendiment i les restriccions tècniques. Importa menys del que la gent es pensa, però quan importa és innegociable. Si has de processar milions d'operacions per segon, o executar en un microcontrolador amb 16 KB de memòria, o garantir un temps de resposta màxim, la llista de candidats es redueix sola.
flowchart TD
A["Tinc un problema"] --> B{"El domini imposa<br/>un llenguatge?"}
B -->|Si| C["Fes-lo servir:<br/>navegador, iOS, BBDD..."]
B -->|No| D{"Hi ha restriccions dures<br/>de rendiment o maquinari?"}
D -->|Si| E["Llenguatge compilat:<br/>C, C++, Rust, Go"]
D -->|No| F{"L'equip ja domina<br/>algun llenguatge adequat?"}
F -->|Si| G["Fes servir aquest"]
F -->|No| H["Tria per ecosistema<br/>i facilitat d'aprenentatge"]
Un consell que estalvia discussions: el segon llenguatge costa molt menys que el primer. Els conceptes d'aquest curs —variables, condicionals, bucles, funcions, estructures de dades, objectes— són els mateixos en gairebé tots. Canvia la sintaxi, que és el barat. Aprendre'n bé un val més que picotejar en cinc.
- Per què aquest curs fa servir Python
Amb tot l'anterior sobre la taula, l'elecció de Python per aprendre a programar deixa de ser una moda i passa a ser una decisió defensable:
- Sintaxi mínima.
print("Hola")és un programa complet: no cal declarar una classe, ni un mètode principal, ni importar res. Comparat amb les sis línies que exigeix Java per al mateix, l'alumne gasta la seva atenció en el concepte i no en la cerimònia. - Cicle escriure-provar molt curt. En ser interpretat, entre escriure una línia i veure'n el resultat hi ha dos segons. Aprendre és provar moltes vegades, i cada segon d'espera desincentiva provar.
- Llegibilitat per disseny. La indentació obligatòria força un codi ordenat des del primer dia. Un programa Python ben escrit es llegeix gairebé com a pseudocodi, cosa que ajuda molt quan encara estàs traduint entre idea i codi.
- Multiparadigma. Permet recórrer l'imperatiu (mòduls 2-3), el funcional (mòdul 4) i l'orientació a objectes (mòdul 7) sense canviar de llenguatge ni d'eines.
- Utilitat real immediata. No és un llenguatge «de joguina» per a classe. És una de les eines més demandades del mercat en automatització, dades i IA. El que aprenguis aquí serveix a fora.
- Ecosistema i comunitat enormes. Gairebé qualsevol dubte que tinguis ja l'ha tingut algú i està respost per escrit.
També és honest dir què no és el millor de Python: no és el llenguatge més ràpid en execució, el seu tipatge dinàmic deixa passar a producció errors que un llenguatge estàtic detectaria abans, i gestionar dependències entre projectes exigeix disciplina (per això existeixen els entorns virtuals que veurem a la propera lliçó). Per a TascaFàcil —un programa petit, per a tres persones, que ha d'estar en marxa aviat— cap d'aquestes pegues no és rellevant. Aquest raonament, i no la llista de virtuts, és la manera correcta de triar un llenguatge.
Errors Comuns i Consells
Buscar «el millor llenguatge». No existeix. Existeix el millor llenguatge per a aquest problema, aquest equip i aquest termini. Les discussions sobre superioritat absoluta consumeixen molt de temps i no produeixen res.
Confondre tipatge dinàmic amb «sense tipus». Python té tipus, i molt estrictes: per això "Tasques: " + 5 falla. El que és dinàmic és quan es comproven, no que no existeixin.
Creure que interpretat significa lent i punt. Per al 95 % dels programes, la velocitat del llenguatge és irrellevant davant del temps de xarxa, de disc o del mateix usuari. Optimitzar el llenguatge abans de saber on és el coll d'ampolla és temps perdut; ho veurem a Eficiència i notació Big-O.
Saltar de llenguatge cada poques setmanes. És l'error més car de qui comença: s'acumulen cinc introduccions i cap programa acabat. Acaba aquest curs amb Python; el segon llenguatge et costarà una fracció de l'esforç.
Pensar que aprendre Python és aprendre a programar. El que estàs aprenent són conceptes —descompondre problemes, controlar el flux, estructurar dades— que sobreviuen al llenguatge. Python és el vehicle, no la destinació.
Consell: quan llegeixis codi d'un llenguatge que no coneixes, no intentis entendre cada símbol. Busca primer les tres estructures de la programació estructurada —seqüència, condició, repetició— i les funcions. Amb això reconeixeràs la lògica de gairebé qualsevol codi, encara que la sintaxi et resulti aliena.
Exercicis
Exercici 1: Classificar llenguatges
Per a cada llenguatge, indica: (a) si el seu tipatge és estàtic o dinàmic, (b) si és fort o feble, (c) la seva forma d'execució habitual, i (d) un ús típic.
- Python
- Java
- JavaScript
- C
Exercici 2: Triar llenguatge amb criteri
Per a cada escenari, proposa un llenguatge i justifica l'elecció amb almenys dos dels quatre criteris de l'apartat 6 (domini, ecosistema, equip, rendiment):
- Estudi Alba vol que el web que ensenya als clients tingui un formulari que validi les dades sense recarregar la pàgina.
- Una empresa necessita el microprogramari d'un sensor amb 32 KB de memòria que ha de respondre en menys d'un mil·lisegon.
- La Marta vol un informe mensual que llegeixi un fitxer de vendes i calculi mitjanes i gràfics. A l'estudi ningú no programa, però la Nuria va fer un curs de Python.
- Un banc ha de mantenir un sistema de 400.000 línies escrit en Java fa quinze anys, amb un equip de dotze persones que el coneixen.
Exercici 3: Identificar el paradigma
Indica a quin paradigma correspon cada fragment i explica en què t'has fixat:
# D
class GestorTasques:
def comptar_pendents(self):
return len([t for t in self.tasques if t.estat == "pendent"])Solucions
Solució 1.
| Llenguatge | Tipatge (quan) | Tipatge (quant) | Execució | Ús típic |
|---|---|---|---|---|
| Python | Dinàmic | Fort | Interpretat (amb bytecode intern) | Dades, IA, automatització |
| Java | Estàtic | Fort | Bytecode + màquina virtual | Programari empresarial, Android |
| JavaScript | Dinàmic | Feble | Interpretat al navegador | Web frontend |
| C | Estàtic | Feble | Compilat a natiu | Sistemes operatius, encastats |
El cas de C sorprèn molta gent: és estàtic però feble, perquè permet conversions implícites entre tipus numèrics i punters que poden produir resultats sense sentit sense que el compilador es queixi.
Solució 2.
- JavaScript. Domini: és l'únic llenguatge que executen els navegadors, així que validar sense recarregar la pàgina ho imposa. Ecosistema: hi ha biblioteques madures de validació de formularis a punt per fer servir.
- C, o Rust si l'equip el domina. Rendiment i restriccions: amb 32 KB no hi cap un intèrpret de Python ni una màquina virtual, i el temps de resposta garantit exigeix control del maquinari. Domini: els sistemes encastats són territori històric de C, amb compiladors per a pràcticament qualsevol microcontrolador.
- Python. Equip: la Nuria ja té una base, i en un estudi de tres persones això pesa molt més que qualsevol avantatge tècnic. Ecosistema: pandas i matplotlib resolen lectura de dades, càlculs i gràfics gairebé sense codi propi.
- Java. Equip: dotze persones coneixen el sistema; reescriure'l en un altre llenguatge destruiria quinze anys de coneixement acumulat i de casos límit ja resolts. Ecosistema: l'entorn al voltant d'aquestes 400.000 línies (biblioteques, servidors, eines) ja està muntat i provat. La resposta «ho reescrivim en alguna cosa moderna» és gairebé sempre l'equivocada.
Solució 3.
- A: imperatiu/estructurat. Es descriu el procediment pas a pas: una variable acumuladora, un bucle que recorre elements i una condició. Es diu com comptar.
- B: declaratiu. Es descriu el resultat desitjat sense indicar cap recorregut ni ordre. El gestor de la base de dades decideix com obtenir-lo.
- C: funcional. S'aplica una transformació (
filter) amb una funció anònima (lambda) i es compon el resultat, sense variables que es van modificant ni bucle explícit. - D: orientat a objectes. El codi viu dins d'una classe i opera sobre les dades del mateix objecte (
self.tasques); les dades i el comportament estan empaquetats junts. Fixa't que a dins fa servir una construcció d'estil funcional: els paradigmes es barregen amb tota naturalitat.
Conclusió
Els llenguatges de programació es classifiquen per quatre eixos que ara saps llegir: el seu nivell d'abstracció (de la màquina al problema), la seva forma d'execució (compilat, bytecode sobre màquina virtual o interpretat), el seu sistema de tipus (estàtic o dinàmic, fort o feble) i el seu paradigma (imperatiu, orientat a objectes, funcional o declaratiu). Cap eix no estableix superioritat: estableix compromisos. I triar és qüestió de quatre criteris —domini, ecosistema, equip i rendiment— aplicats a un context concret, no de preferències personals.
Amb aquests criteris hem justificat Python per a aquest curs i per a TascaFàcil: sintaxi mínima, cicle de prova curt, llegibilitat forçada per disseny, multiparadigma i amb una utilitat professional real més enllà de l'aula. Els seus inconvenients existeixen, però cap no afecta un programa petit per a un estudi de tres persones.
Ja sabem què és programar, d'on ve l'ofici i amb què ho farem. Falta el més terrenal: muntar el lloc de treball. A la lliçó següent, Entorns de desenvolupament, instal·larem Python en Windows, macOS o Linux, comprovarem que funciona, aprendrem la diferència entre l'intèrpret interactiu i executar un fitxer, triarem editor, organitzarem les carpetes del projecte i crearem per fi tascafacil.py, el fitxer que ens acompanyarà la resta del curs.
Fonaments de la Programació
Mòdul 1: Introducció a la Programació
- Què és la programació?
- Història de la programació
- Llenguatges de programació
- Entorns de desenvolupament
- Del problema a l'algorisme
Mòdul 2: Conceptes Bàsics
- Variables i tipus de dades
- Operadors i expressions
- Entrada i sortida de dades
- Conversió de tipus i validació de dades
Mòdul 3: Estructures de Control
Mòdul 4: Funcions i Procediments
- Definició i ús de funcions
- Paràmetres i retorn de valors
- Àmbit de variables
- Descompondre un programa en funcions
- Funcions com a valors: lambda i ordre superior
Mòdul 5: Estructures de Dades
- Llistes i arrays
- Cadenes de caràcters
- Diccionaris i conjunts
- Tuples i estructures imbricades
- Desar dades en fitxers: text, CSV i JSON
Mòdul 6: Algorismes Bàsics
Mòdul 7: Objectes i Organització del Codi
- De les dades als objectes: classes i instàncies
- Atributs, mètodes i constructor
- Col·leccions d'objectes
- Mòduls, paquets i importacions
Mòdul 8: Bones Pràctiques i Eines
- Documentació i comentaris
- Depuració i gestió d'errors
- Control de versions
- Proves automatitzades
- Estil, llegibilitat i refactorització
