Llenguatges de programació

Un programa és un algorisme expressat de tal manera que un computador el pot entendre i executar. Hem insistit molt en el fet de que els computadors operen en llenguatge binari, i per a ells solament existeixen seqüències de 0 i 1. Per exemple, una operació bàsica com una suma es expressada per la màquina amb tres seqüències de ceros i uns: una seqüència per a cadascun dels operands i altra per a l’operador suma. Aquestos són els anomenats codis de màquina.

ba 0c 01
b4 09
cd 21
b8 00 4c
cd 21
48 65 6c 6c 6f 2c
20 57 6f 72 6c 64
21 0d 0a 24

Aquesta manera de comunicar-se amb la màquina resulta molt complicada per als humans, ja que cal recordar el codi corresponent a cadascuna de les operacions que la CPU pot realitzar. Per aquest motiu es va desenvolupar un llenguatge que permetera substituir alguns codis màquina per símbols fàcils de recordar com ADD per a la suma: el llenguatge assemblador.

.model small
.stack
.data
   saludo   db "Hola mundo!!!", "$"

.code

main  proc              ;Inicia proceso
   mov   ax,seg saludo     ;hmm ¿seg?
   mov   ds,ax          ;ds = ax = saludo

   mov   ah,09          ;Function(print string)
   lea   dx,saludo         ;DX = String terminated by "$"
   int   21h               ;Interruptions DOS Functions

;mensaje en pantalla

   mov   ax,4c00h       ;Function (Quit with exit code (EXIT))
   int   21h            ;Interruption DOS Functions

main  endp              ;Termina proceso
end main

De tota manera, encara que el llenguatge assemblador simplifica la programació una mica, aquesta continua sent una tasca complicada, ja que cal dir-li a la CPU totes i cadascuna de les operacions que cal fer una per una. També hi ha un altre problema: el llenguatge assemblador és diferent per a cada arquitectura concreta de computador, per la qual cosa cal re-escriure els programes per a que funcionen en diferents models de processadors.

Per resoldre els problemes del llenguatge assemblador i facilitar la creació de programes aparegueren, a finals de la dècada de 1950, els llenguatges de programació d’alt nivell. Aquestos llenguatges permetien escriure programes més simples i comprensibles, vàlids per diferents computadors i, en ocasions, per a diferents sistemes operatius.

El llenguatge de codis de màquina es considera un llenguatge de “baix nivell” per què és el que utilitza la màquina, mentre que el llenguatge assemblador és considerat un llenguatge de nivell intermedi, ja que s’acosta més al llenguatge dels humans. Els llenguatges de programació moderns més utilitzats es consideren de “alt nivell” ja que són similars al llenguatge natural dels humans.

El primer llenguatge d’alt nivell va ser FORTRAN, un llenguatge especialment adaptat per al càlcul numèric i la computació científica, però prompte aparegueren multitud de llenguatges com ADA, ALGOL, BASIC, C, COBOL, Java, Lisp, Pascal, Perl, PHP, Python, etcètera.

Cadascun d’aquestos llenguatges era de propòsit general o bé estava especialment adaptat a la resolució d’un tipus particular de problema (per exemple LISP a la intel·ligència artificial). Molts d’aquestos llenguatges han sigut abandonats, mentre que la importància d’altres ha augmentat. També han canviat els paradigmes de programació, passant de la programació estructurada a la més moderna programació orientada a objectes.


Programació estructurada

La programació estructurada pretén que els programes no solament funcionen, sinó que estiguen escrits de manera que facilite la seua lectura posterior. Segons aquest mètode de programació, qualsevol programa pot ser escrit utilitzant únicament tres tipus d’estructures (que hem vist anteriorment):

  • Seqüències
  • Condicionals
  • Iteracions o repeticions

Els programes es dissenyen de manera modular, separant les parts complexes del programa en segments que poden ser més tard re-utilitzats, i descendent, resolent els problemes de manera ordenada des del més general fins als més particulars.

ALGORITME.

Un algoritme és una sequencia de instruccions que s’encarreguen de sol·lucionar un problema. Per fer l’esbós d’un algoritme existeixen eines, aquestes ajuden a comunicar i entendre el seu funcionament, eines com el diagrama de fluxe i el pseudocodi, serveixen  per concretar i comunicar solucions, no implementen cap programa, sols indiquen els camins i que seguirà un algoritme.

 

Sempre es convenient fer una explicació textual i comentada tant del problemea com de la solució que proporciona l’algoritme.

 

Pseudocodi i ordinogrames

El pseudocodi i els ordinogrames seran les dues eines que s’empren per expressar algorismes. Són les maneres que pots utilitzar per dissenyar “en brut” un algorisme sense tenir que pensar en la sintaxi d’un llenguatge de programació concret.

Pseudocodi

El pseudocodi no és un llenguatge de programació però tampoc té la llibertat del llenguatge col·loquial. En realitat és una forma d’expressar els algorismes on es segueixen una serie de normes i s’utilitzen símbols i instruccions que més tard podran ser traduïdes a un llenguatge de programació concret.

Hi ha exemples de pseudocodi a l’apartat d’estructures bàsiques dels algorismes, però cal destacar la diferència entre assignació = i comparació ==. Assignació. L’expressió a = 3 significa que la variable anomenada “a” emmagatzema el valor 3.

Comparació. L’expressió a == 3 avaluarà si la variable a és igual al valor 3 i retornarà el valor vertader en cas afirmatiu, i fals en cas contrari.

Ordinogrames

Un ordinograme sempre té un únic punt d’inici i un únic punt de finalització. A més, tot camí d’execució ha de permetre arribar des de l’inici fins al final.

Les següents són accions prèvies a la realització del diagrama de flux:

  • Identificar les idees principals a ser incloses en el diagrama de flux. Han d’estar presents el propietari o responsable del procés, els propietaris o responsables del procés anterior i posterior i d’altres processos interrelacionats, així com les terceres parts interessades.
  • Definir què s’espera obtenir del diagrama de flux.
  • Identificar qui ho farà servir i com.
  • Establir el nivell de detall requerit.
  • Determinar els límits del procés a descriure.

Els passos a seguir per construir el diagrama de flux són:

  • Establir l’abast del procés a descriure. D’aquesta manera quedarà fixat el començament i el final del diagrama. Sovint el començament és la sortida del procés previ i el final l’entrada al procés següent.
  • Identificar i llistar les principals activitats/subprocessos que estan inclosos en el procés a descriure i el seu ordre cronològic.
  • Si el nivell de detall definit inclou activitats menors, llistar-les també.
  • Identificar i llistar els punts de decisió.

Un ordinograma és un diagrama de flux que serveix per representar un algorisme. En ells es poden utilitzar els símbols de la taula següent.

Símbol Significat
_images/ordinograma_inici.png Inici i fi de l’algorisme
_images/ordinograma_accio.png Acció
_images/ordinograma_entrada.png Entrada o sortida
_images/ordinograma_decisio.png Decisió
_images/ordinograma_connector.png Connector
_images/ordinograma_subrutina.png Subrutina

Estructures bàsiques dels algorismes

Els algorismes tenen tres tipus d’estructures:

  • Estructures seqüencials: seguit de passos que es realitzen un rere l’altre.
  • Estructures alternatives: En funció d’una determinada condició es realitzarà una o altra acció.
  • Estructures repetitives: Una determinada acció o conjunt d’accions es repetiran fins que es complisca o es deixe de complir una determinada condició.

Estructures seqüencials

La seqüència d’ordres estarà expressada com a pseudocodi simplement col·locant les ordres una rere l’altra i en els ordinogrames encadenant-les amb fletxes:

acció1
acció2

_images/estructura_sequencial.png

Estructures alternatives

Alternativa simple (SI)

Un cert bloc de codi serà executat unicament si una determinada condició resulta ser vertadera:

si condició llavors
    acció
fsi

_images/alternativa_simple.png

Alternativa doble (SI-SINO)

També hi haurà una condició que pot ser vertadera o falsa, i dues accions: si la condició resulta vertadera es realitzarà una de les accions, i si es falsa es realitzarà l’altra:

si condició llavors
    acció1
sino
    acció2
fsi

_images/alternativa_doble.png

Estructures repetitives

Iteració (MENTRE)

L’acció es realitzarà si una determinada condició es vertadera, i es continuarà repetint fins que aquesta condició siga falsa:

mentre condició fer
    acció
fmentre

_images/iteracio.png

Iteració alternativa (PER-FINS)

L’acció es realitzarà fins que es complisca (o es deixe de complir) una determinada condició. En l’exemple següent, la variable index pren un valor inicial que va incrementant a cada repetició. L’acció es repetirà fins que index arribe a un cert valor final:

per índex = valor inicial fins valor final fer
    acció
    índex = índex + increment
fper

_images/iteracio_alternativa.png

 


Eficència i complexitat algoritmica.

La tasca de la programació té com objectiu oferir algoritmes de resolució de problemes amb la major eficència possible.

Amb aquest objectiu bàsic sorgeixen diferents maneres de resoldre un mateix problema, oferint solucions alternatives.

Pot ser que no hi hagi una solució perfecte que sigui la més eficient per a totes les possibles problemàtiques. La complexitat de resolució es mida amb el paràmetre O(n) on s’avalua sempre pel pitjor cas d’execució de l’algoritme. podeu veure a l’enllaç diferents càlculs per esbrinar la complexitat de un algoritme.

 

Exemples d’algoritmes d’ordenació d’elements.

El problema sorgeix per la necessitat d’ordenar elements d’una llista.

El problema.

  • Una llista com 8,4,2,3,4,5 volem que ens torni com 2,3,4,4,5,8.
  • L’estructura bàsica que emprarem és un array de nombres (podria ser un array definit d’altres tipus de variables). Un array permet emmagatzemar dins una posició concreta (de 0 a N) una variables.
  • Un array es sol representar com a A=[8,4,2,3,4,5] on A és el nom de la variable, cada un dels elements ocupa una posició. Començant de la posició 0 fins a la N.
  • Un array té N+1 elements.

Una solució, L’algoritme d’inserció.

[one_half]

Algoritme d’ordenament mitjançant inserció.

i ← 1
while i < length(A)
    j ← i
    while j > 0 and A[j-1] > A[j]
        swap A[j] and A[j-1]
        j ← j - 1
    end while
    i ← i + 1
end while

La complexitat d’aquest algoritme és O(ne2).

on n és el nombre d’elements, si n=5 farà 25 voltes.

[/one_half]

[one_half_last]
Anàlisi, A=[8,4,2,3,4,5]  

i j A[j] A[j-1] Array
1 1 4 8 [4,8,2,3,4,5]
2 2 2 8 [4,2,8,3,4,5]
1  2 4 [2,4,8,3,4,5]
3 3 3 8 [2,4,3,8,4,5]
2 3 4 [2,3,4,8,4,5]
1 4 3
4 4 4 8 [2,4,3,4,8,5]
3 4 3
2 3 4 [2,3,4,4,8,5]
1 3 2
5 5 5 8 [2,3,4,4,5,8]
4 5  4
3 4 4
2 4 3
1 3  2

[/one_half_last]

[one_half]

Algoritme Merge Sort.

El algoritmo de ordenamiento por mezcla (merge sort en inglés) es un algoritmo de ordenamiento externo estable basado en la técnica divide y vencerás. Es de complejidad O(n log n).

function mergesort(m)
  var list left, right, result
  if length(m) ≤ 1
      return m
  else
      var middle = length(m) / 2
      for each x in m up to middle - 1
          add x to left
      for each x in m at and after middle
          add x to right
      left = mergesort(left)
      right = mergesort(right)
      if last(left) ≤ first(right) 
         append right to left
         return left
      result = merge(left, right)
      return result
function merge(left, right)
  var list result
  while length(left) > 0 and length(right) > 0
      if first(left) ≤ first(right)
          append first(left) to result
          left = rest(left)
      else
          append first(right) to result
          right = rest(right)
  if length(left) > 0 
      append rest(left) to result
  if length(right) > 0 
      append rest(right) to result
  return result

[/one_half]

[one_half_last]

Anàlisi del comportament de l’algoritme mergeSort sobre una llista de nombres A=[38,27,43,3,9,82,10]

[/one_half_last]

 

 

Referències:

https://scorazon.perexat.net/~perexat/apuntsTIC/index.html

https://www.toptal.com/developers/sorting-algorithms/

http://solisgomez03.blogspot.com.es/2014/10/diagrama-de-flujo-en-programacion.html

https://en.wikipedia.org/wiki/Insertion_sort

 

admin2on batxilleratLlenguatges de programació Un programa és un algorisme expressat de tal manera que un computador el pot entendre i executar. Hem insistit molt en el fet de que els computadors operen en llenguatge binari, i per a ells solament existeixen seqüències de 0 i 1. Per exemple, una operació bàsica...Blog Aula Informàtica Gimnèsia