Conceptes generals de programació
...intro...
Contingut
Codi font i executable
Tipus de codi:
- Codi font: conjunt d'arxius de text amb instruccions d'alt nivell, fàcilment llegible per humans, no executable per la computadora. L'objectiu és facilitar la tasca als programadors.
- Codi màquina o executable: conjunt d'instruccions directament executables per un microprocessador o CPU. Alta complexitat. Instruccions molt específiques que realitzen tasques de molt baix nivell.
Característiques:
- El procés per generar codi executable a partir del codi font és la compilació.
- No és possible (o seria altíssimament complex) deduïr un codi font a partir d'un executable. D'aquí la importància del "codi lliure".
- Una sola instrucció de codi font pot produïr centenars o milers d'instruccions màquina.
- Una compilació és específica per una màquina i arquitectura. Els executables no són portables (tot i que sí es podrien executar amb un emulador).
Llenguatges compilats vs. interpretats
Distingirem entre:
- Llenguatges compilats. Utilitzen un compilador.
- Llenguatges interpretats. Utilitzen un intèrpret.
Llegiu els articles de la Wikipèdia al respecte.
Algunes notes addicionals:
- El llenguatge compilat revisa la correcció del tot el codi abans de generar l'executable.
- El llenguatge interpretat agafa una instrucció a cada moment i no comprova la totalitat, només el què està a punt d'executar.
- El compilador només tradueix un sol cop a codi màquina. A partir d'aquí l'execució del codi màquina (executable) és directa.
- Un intèrpret ha de traduïr de cou el programa cada cop que s'executa.
- Els llenguatges interpretats solen ser típicament 10 cops més lents que els executables.
- Els llenguatges compilats permeten la ocultació del codi font. Els interpretats no.
Avantatges de cadascun:
- Compilats = rendiment: uns 10 cops més ràpids.
- Interpretats = portabilitat: el mateix codi pot funcionar el diverses plataformes amb diferent hardware.
Compiladors i intèrprets
De fet, no son tan diferents. Consten de les següents parts, quasi totes comunes menys la darrera part.
- Preprocessador: expandeixen macros, substitueixen constants, etc.
- Anàlisi lèxica: separen els tokens (elements del llenguatge).
- Anàlisi sintàctica: comprovació dels tipus
- Anàlisi semàntica: (semàntica = significat) es decideix què fa la instrucció.
- Generació/execució:
- El compilador enllaça les llibreries (linker) i genera un arxiu executable.
- L'intèrpret executa directament les instruccions.
Codi intermig i màquines virtuals
Hi ha un seguit de llenguatges com Java que venen a ser híbrids. Java es compila (arxiu *.class) però no sobre l'arquitectura de la màquina en què treballem, sinó sobre l'arquitectura de la Java Virtual Machine:
Així, el codi resultant no es pot executar directament sobre el nostre hardware, sinó que cal una màquina virtual que realitzi la traducció final. L'objectiu és aconseguir un codi multiplataforma, fent que aquest codi sigui exectuable en qualsevol plataforma que implementi la JVM (Java Virtual Machine).
Accelerant les VMs: JIT i d'altres
La JVM fa que l'execució sigui molt més lenta, però l'aparició de l'intèrpret del la JVM anomenat JIT (Just In Time) va accelerar molt el rendiment. El què fa el JIT és permetre la reutiltizació del codi executable sobre la plataforma, tenint rendiments propers als del codi natiu.
Python, té un altre model, no té una VM com el Java, sinó un intèrpret clàssic. Però també implementa un sistema per millorar el rendiment realitzant traduccions al C del codi Python, que es poden compilar sobre la plataforma. Això ho realitza automàticament (com el JIT) i és transparent al desenvolupador.
És per aquest motiu que en determinats frameworks podeu trobar arxius *.pyc al cosat del vostre *.py