sabato 23 dicembre 2023

CORSO STRUTTURA DI UN LINGUAGGIO DI PROGRAMMAZIONE: Lezione 2 Elementi chiave di un linguaggio di programmazione

2: Elementi chiave di un linguaggio di programmazione


2.1 Funzioni

Funzioni e metodi:

La sintassi per definire, chiamare e passare parametri alle funzioni o ai metodi può differire significativamente. Include la firma della funzione, la lista dei parametri e il corpo della funzione stesso.

Le funzioni e i metodi sono fondamentali nella programmazione e consentono di organizzare il codice in blocchi riutilizzabili che eseguono specifiche operazioni. La sintassi per definire, chiamare e passare parametri alle funzioni o ai metodi può variare notevolmente da un linguaggio all'altro, ma generalmente seguono dei concetti simili.


Definizione di una funzione o di un metodo:

Firma della funzione o del metodo:

Include il nome della funzione o del metodo e, in alcuni linguaggi, il tipo di ritorno.

Lista dei parametri:

Elenco dei parametri che la funzione o il metodo accetta. Ogni parametro può avere un nome e un tipo.

Corpo della funzione o del metodo:

Blocco di codice all'interno della funzione o del metodo che definisce cosa deve essere eseguito quando la funzione viene chiamata.


Esempi di definizione di funzioni in diversi linguaggi:

Python:

python

Copy code

def saluta(nome):

    print("Ciao,", nome)

def somma(a, b):

    return a + b


JavaScript:

javascript

Copy code

function saluta(nome) {

    console.log("Ciao, " + nome);

}

function somma(a, b) {

    return a + b;

}


Java:

java

Copy code

public int somma(int a, int b) {

    return a + b;

}

public void saluta(String nome) {

    System.out.println("Ciao, " + nome);

}


Chiamata di una funzione o di un metodo:

Una volta definita una funzione o un metodo, può essere chiamata all'interno del codice specificando il nome della funzione e, se necessario, fornendo i valori dei parametri.


Esempi di chiamata di funzioni:

Python:

python

Copy code

saluta("Alice")  # Chiamata alla funzione saluta

risultato = somma(5, 3)  # Chiamata alla funzione somma

JavaScript:

javascript

Copy code

saluta("Bob");  // Chiamata alla funzione saluta

var risultato = somma(2, 4);  // Chiamata alla funzione somma

Java:

java

Copy code

int risultato = somma(3, 7);  // Chiamata al metodo somma

saluta("Charlie");  // Chiamata al metodo saluta


Le funzioni e i metodi permettono di scrivere codice modulare e riutilizzabile, permettendo di evitare la duplicazione del codice e semplificando la manutenzione e la gestione del programma. La sintassi varia tra i linguaggi, ma i concetti fondamentali di definizione, chiamata e passaggio dei parametri rimangono simili.


2.2 Librerie e Moduli


Librerie:

Librerie di programmazione:

Le librerie sono raccolte di codice predefinito, funzioni, classi e strumenti che possono essere utilizzati per estendere le funzionalità di un linguaggio di programmazione.

Offrono una vasta gamma di funzionalità che vanno da operazioni matematiche a operazioni di rete, manipolazione di stringhe, manipolazione di file, interfacce grafiche, elaborazione dei dati e molto altro.

Consentono ai programmatori di risparmiare tempo e sforzi utilizzando funzioni predefinite invece di scrivere codice da zero per compiti comuni.

Esempi di librerie includono Pandas per l'analisi dei dati in Python, React per lo sviluppo web in JavaScript, TensorFlow per l'apprendimento automatico, ecc.

Le librerie di programmazione sono raccolte di codice predefinito, funzioni, classi e strumenti che estendono le funzionalità di un linguaggio di programmazione specifico. Queste librerie offrono una vasta gamma di funzionalità che vanno da operazioni matematiche a operazioni di rete, manipolazione di stringhe, manipolazione di file, interfacce grafiche, elaborazione dei dati e molto altro.


Caratteristiche delle librerie di programmazione:

Modularità: Le librerie sono modulari, cioè sono divise in moduli o pacchetti, ognuno dei quali contiene funzionalità specifiche. Questo permette agli sviluppatori di utilizzare solo le parti necessarie senza dover ricreare tutto da zero.

Riutilizzo del codice: Consentono il riutilizzo del codice già scritto e testato, risparmiando tempo e sforzi nello sviluppo di nuove applicazioni o funzionalità.

Documentazione: Le librerie di solito sono ben documentate, con dettagliate guide, documenti di riferimento e esempi di utilizzo, facilitando agli sviluppatori l'apprendimento e l'utilizzo delle funzionalità offerte.

Ampliamento delle funzionalità: Le librerie possono aggiungere funzionalità che non sono presenti nel linguaggio di programmazione base, estendendo le capacità del linguaggio.

Risparmio di risorse: Utilizzando librerie esistenti anziché scrivere codice da zero, si risparmia tempo, risorse e si evitano errori comuni.

Tipi di librerie di programmazione:

Standard Libraries: Sono librerie integrate nei linguaggi di programmazione stessi e offrono funzionalità di base. Ad esempio, in Python ci sono le librerie standard come os, math, datetime che forniscono funzionalità comuni.

Librerie di terze parti: Sono librerie sviluppate da terze parti e non sono integrate direttamente nel linguaggio. Possono offrire funzionalità specializzate per specifici ambiti come analisi dei dati, machine learning, sviluppo web, ecc. Alcuni esempi includono Pandas, NumPy, TensorFlow in Python per l'analisi dei dati e l'apprendimento automatico.

Framework: Anche se non sono tecnicamente librerie, i framework sono un insieme strutturato di librerie e strumenti che facilitano lo sviluppo di applicazioni in un determinato dominio. Ad esempio, Django e Flask sono framework Python per lo sviluppo web.

Le librerie di programmazione sono fondamentali per gli sviluppatori, in quanto forniscono strumenti e funzionalità essenziali per creare applicazioni software complesse, permettendo loro di concentrarsi sullo sviluppo delle logiche di business senza dover reinventare la ruota.


Ecco alcuni esempi di librerie di programmazione utilizzate in diversi contesti:


Esempi di librerie standard:


Python - Libreria os:

La libreria os fornisce funzionalità per interagire con il sistema operativo.

Ecco un esempio di utilizzo:

python

Copy code

import os

# Ottieni il percorso corrente

current_path = os.getcwd()

print("Percorso corrente:", current_path)

# Lista dei file nella directory corrente

files = os.listdir()

print("Files nella directory:", files)


C++ - Libreria <vector>:

La libreria <vector> in C++ fornisce array dinamici con molte funzionalità utili. 


Ecco un esempio:

cpp

Copy code

#include <iostream>

#include <vector>

int main() {

    std::vector<int> v = {1, 2, 3, 4, 5};

    // Aggiungi un elemento alla fine del vettore

    v.push_back(6);

    // Stampa tutti gli elementi del vettore

    for (int i : v) {

        std::cout << i << " ";

    }

    return 0;

}


Esempi di librerie di terze parti:


Python - Libreria Pandas:

La libreria Pandas è utilizzata per l'analisi dei dati e la manipolazione di dati strutturati come i DataFrame.


Ecco un esempio:

python

Copy code

import pandas as pd

# Creazione di un DataFrame

data = {'Nome': ['Alice', 'Bob', 'Charlie'], 'Età': [25, 30, 35]}

df = pd.DataFrame(data)

# Stampare il DataFrame

print(df)


JavaScript - Libreria React:

React è una libreria JavaScript per la creazione di interfacce utente. 


Ecco un esempio di utilizzo:

javascript

Copy code

import React from 'react';

import ReactDOM from 'react-dom';

function App() {

    return <h1>Ciao, mondo!</h1>;

}

ReactDOM.render(<App />, document.getElementById('root'));


Esempi di Framework (insiemi di librerie):


Python - Framework Django:

Django è un framework Python per lo sviluppo di applicazioni web. 


Ecco un esempio di utilizzo:

python

Copy code

from django.http import HttpResponse

def hello(request):

    return HttpResponse("Ciao, mondo!")


JavaScript - Framework Express.js:

Express.js è un framework per lo sviluppo di applicazioni web in Node.js.


Ecco un esempio di utilizzo:

javascript

Copy code

const express = require('express');

const app = express();

app.get('/', (req, res) => {

    res.send('Ciao, mondo!');

});

app.listen(3000, () => {

    console.log('App in esecuzione sulla porta 3000');

});


Questi esempi mostrano come le librerie e i framework forniscono funzionalità pronte all'uso che consentono agli sviluppatori di estendere le capacità dei linguaggi di programmazione e di creare applicazioni più complesse in modo più efficiente.


Differenze:

Dizionari: Si riferiscono a una specifica struttura dati che associa chiavi univoche a valori, utilizzata per la gestione di associazioni chiave-valore.

Librerie: Si riferiscono a collezioni di codice predefinito che offrono funzionalità specifiche per estendere le capacità di un linguaggio di programmazione, consentendo di utilizzare funzioni predefinite per vari compiti.

Entrambi i concetti sono importanti nell'ambito della programmazione, con i dizionari che sono utilizzati per la gestione di dati strutturati, mentre le librerie forniscono funzionalità estese e predefinite che consentono ai programmatori di scrivere codice in modo più efficiente e completo.


Associazioni chiave-valore
Le associazioni chiave-valore sono una forma di rappresentazione dei dati che collega una chiave univoca a un valore corrispondente all'interno di una struttura dati. Questa struttura consente l'accesso efficiente e veloce ai dati utilizzando la chiave come indice per ottenere il valore associato. Le associazioni chiave-valore sono utilizzate ampiamente in molte aree della programmazione e sono implementate attraverso diverse strutture dati.

Caratteristiche delle associazioni chiave-valore:

Univocità delle chiavi: Ogni chiave all'interno della struttura dati è univoca e non può essere duplicata.

Corrispondenza tra chiave e valore: Ogni chiave è associata a un solo valore. In alcuni casi, un valore può essere associato a più chiavi, ma in generale, ogni chiave è legata a un valore specifico.

Accesso efficiente ai dati: Le associazioni chiave-valore permettono di recuperare i dati associati a una chiave specifica in modo rapido, poiché l'accesso avviene direttamente tramite la chiave senza dover scorrere l'intera struttura dati.

Flessibilità nella gestione dei dati: Consentono di memorizzare dati di diversi tipi e strutture, come numeri, stringhe, oggetti, altre strutture dati o anche funzioni.

Strutture dati che implementano associazioni chiave-valore:

Dizionari (o Mappe):

I dizionari, noti anche come mappe, sono una delle implementazioni più comuni di associazioni chiave-valore. Sono strutturati in modo che ogni chiave corrisponda a un valore all'interno della collezione.

Esistono implementazioni di dizionari in vari linguaggi di programmazione, come il dict in Python, l'HashMap in Java, il map in C++ e JavaScript, e così via.

Tabelle Hash:

Le tabelle hash sono una struttura dati che implementa le associazioni chiave-valore tramite una funzione di hash. Questa funzione assegna un valore univoco a ciascuna chiave, consentendo un accesso rapido ai valori associati alle chiavi.

Array Associativi:

Gli array associativi sono una forma di struttura dati in cui le chiavi non sono necessariamente numeriche, ma possono essere stringhe o altri tipi. Sono spesso presenti in linguaggi come PHP, Perl e altri.

Le associazioni chiave-valore sono fondamentali nella programmazione in quanto offrono un meccanismo efficiente per gestire e organizzare dati in modo flessibile e strutturato, consentendo un accesso rapido ai valori in base a chiavi specifiche.



2.3 Gestione della memoria


La gestione della memoria è un aspetto cruciale nella programmazione e consiste nell'allocazione e nella deallocazione corrette delle risorse di memoria per garantire che un programma utilizzi in modo efficiente lo spazio disponibile.


Allocazione della memoria
L'allocazione della memoria è il processo di riservare spazio nella memoria per memorizzare dati o strutture dati. In molti linguaggi di programmazione, ci sono due tipi principali di allocazione della memoria:

Allocazione statica: Questa avviene a tempo di compilazione e la memoria viene assegnata prima dell'esecuzione del programma. Ad esempio, le variabili globali e le costanti sono allocate staticamente.

Allocazione dinamica: Questa avviene a tempo di esecuzione e consente di richiedere memoria secondo necessità. In linguaggi come C, C++, Python, ecc., si utilizzano funzioni specifiche come malloc, new o alloc per allocare memoria dinamicamente.

Ad esempio, in C, si potrebbe utilizzare malloc per allocare memoria per un array di interi.


c

Copy code

int *array;

array = (int *)malloc(5 * sizeof(int)); // Allocazione dinamica di un array di 5 interi


Deallocazione della memoria

La deallocazione della memoria è il processo inverso, dove la memoria precedentemente allocata viene liberata e resa disponibile per altre operazioni. È altrettanto importante deallocare la memoria quando non è più necessaria per evitare perdite di memoria (memory leaks).


In linguaggi come C, C++ che richiedono la gestione esplicita della memoria, è necessario chiamare manualmente la funzione free o delete per liberare la memoria allocata dinamicamente.


c

Copy code

free(array); // Liberare la memoria allocata per l'array

In linguaggi con gestione automatica della memoria come Python, Java o C#, il processo di deallocazione della memoria è gestito dal "garbage collector" o dal meccanismo interno del linguaggio, che si occupa automaticamente di rilasciare la memoria quando non ci sono più riferimenti agli oggetti.


python

Copy code

# Esempio in Python

array = [1, 2, 3, 4, 5]

# Non è necessario deallocare manualmente la memoria


È importante ricordare che una cattiva gestione della memoria può portare a problemi come perdite di memoria (memory leaks), sovrascrittura della memoria, puntatori selvaggi (wild pointers) e altri errori che possono compromettere il corretto funzionamento di un programma.


Un'allocazione e una deallocazione efficienti della memoria sono cruciali per garantire le prestazioni e la stabilità del software, specialmente in applicazioni che richiedono un uso intensivo delle risorse di memoria.

 

Nessun commento:

Posta un commento