Archivio per la categoria 'C & C++'
Se conosco dei linguaggi di programmazione e, oltretutto, se mi sono appassionato alla programmazione, questo lo devo alle videolezioni realizzate dal prof. Camuso. Per pura casualità mi sono imbattuto nel suo sito web e così ho trovato finalmente qualcuno che fosse davvero capace di spiegare le basi della programmazione ad un principiante, a partire da 0.
A cominciare dalla programmazione procedurale con Pascal, Delphi, C++ fino alla programmazione ad oggetti con Visual c# e lo stesso Delphi. Consiglio i videocorsi in particolar modo agli utenti Windows, ma segnalo a tutti gli altri la presenza di un’ottimo introduzione al PHP e al MySQL.
Per tutti voi programmatori nascenti: non demoralizzatevi nel vedere che se per esempio scegliete di apprendere il Pascal non potete creare finestre Windows ma solo delle semplici righe di comando: i linguaggi procedurali saranno anche definiti obsoleti da molti ma sono essenziali per un buon apprendimento dei concetti di base.
Link alle Videolezioni –>

Fu ideato nei Bell Laboratories della AT&T nel 1972 da Dennis Ritchie come evoluzione del linguaggio B di Ken Thompson usato per la scrittura dei primi sistemi operativi UNIX. Lo stesso Thompson nel 1970 si era a sua volta ispirato al linguaggio BCPL di Martin Richards, anch’esso pensato per scrivere sistemi operativi e software di sistema. La definizione formale si ha nel 1978 a cura di B. W. Kernighan e D. M. Ritchie. Nel 1983 iniziò il lavoro di definizione di uno standard da parte dell’American National Standards Institute, che rilasciò nel 1990 lo Standard ANSI C (ISO C89).
Il C è tecnicamente un linguaggio di programmazione ad alto livello. Tuttavia, poiché esso mantiene evidenti relazioni semantiche con il linguaggio macchina e l’assembly, risulta molto meno astratto di linguaggi anche affini (appartenenti allo stesso paradigma di programmazione), come per esempio il Pascal. Per questo motivo, talvolta viene anche identificato con la locuzione (più ambigua) linguaggio di medio livello, se non addirittura (in modo certamente improprio) come macro-assembly, o assembly portabile.
Il C è rinomato per la sua efficienza, e si è imposto come linguaggio di riferimento per la realizzazione di software di sistema su gran parte delle piattaforme hardware moderne. La standardizzazione del linguaggio (da parte dell’ANSI prima e dell’ISO poi) garantisce la portabilità dei programmi scritti in C (standard, spesso detto ANSI C) su qualsiasi piattaforma.
Oltre che per il software di sistema, il C è stato a lungo il linguaggio dominante in tutta una serie di altri domini applicativi caratterizzati da forte enfasi sull’efficienza. Esempi tipici sono le telecomunicazioni, il controllo di processi industriali e il software real-time. Oggi il predominio del C in questi contesti è in parte diminuito a seguito dell’avvento di competitor significativi, primo fra tutti il C++; tuttavia, il tempo in cui il C si potrà considerare obsoleto appare ancora molto lontano.
Il C ha, e continua ad avere, anche una notevole importanza didattica, sebbene, per la sua complessità semantica e per le forti relazioni di tale semantica con il funzionamento dell’hardware dei computer, non si tratti di un linguaggio particolarmente intuitivo per i principianti, e in special modo a quelli sprovvisti di un adeguato background sull’elettronica dei calcolatori. Se un tempo scuole superiori e corsi universitari adottavano il C come linguaggio di riferimento a causa della sua importanza tecnica, oggi questa scelta trova un’ulteriore motivazione nella crescente importanza di linguaggi che dal C derivano (per esempio C++, Java e C#).

Salve a tutti, un argomento del quale vale la pena parlare a fondo è quello relativo alle variabili e alle costanti: strumenti importantissimi che permettono al programma di comportarsi in modo diverso a seconda degli input che gli vengono forniti, e aiutano nella comprensione del codice sorgente del programma stesso.
Variabili e costanti sono, in genere, ma non sempre, caratterizzati da un nome. In termini molto spiccioli, quel nome non è altro che un alias per un indirizzo di memoria RAM che conterrà il valore assunto da una variabile o da una costante, durante l’esecuzione del flusso di istruzioni del programma. Il valore di una variabile può mutare durante l’esecuzione del programma stesso, il valore di una costante è, invece, immutabile.
All’interno di un programma è possibile definire un numero arbitrario di variabili o costanti, a ciascuna delle quali sono associati dei dati.
Nei linguaggi tipizzati, come il C o il C++, ogni variabile ed ogni costante, sono sempre caratterizzate da un tipo, che definisce il modo in cui deve essere interpretato il dato rappresentato dalla variabile .
Si distingue in due generi di tipo di dato: tipi atomici e tipi composti. I tipi atomici, propri del lingaggio, sono utili alla memorizzzione di dati semplici, come un numero intero o reale, un carattere, un dato di tipo vero/falso.
I tipi composti, invece, si dividono a loro volta in tipi strutturati e non strutturati. La definizione di questi ultimi esula dall’articolo per il momento. Possiamo dire che un tipo strutturato consente di accorpare più dati fra loro, definendo una possibile correlazione esistente tra di essi. Pensiamo alla data: essa è composta da tre informazioni distinte: giorno, mese ed anno.
In C/C++ essistono i seguenti tipi atomici:
- int: intero con segno rappresentato su 4 byte
- unsigned int : intero senza segno rappresentato su 4 byte
- short int : intero con segno rappresentato su 2 byte
- unsigned short int : intero senza segno rappresentato su 2 byte
- long int : intero con segno rappresentato su 4 byte
- long long int: intero con segno rappresentato su 8 byte
- char : carattere rappresentato con 1 byte
- bool : true/false rappresentato con 1 byte
- float : reale mantissa + esponente su 4 byte
- double : reale a precisione doppia mantissa + esponente su 4 byte
Esistono i tipi puntatore, ognuno per un tipo atomico (ma è possibile definirne anche per tipi composti). Riprenderemo questo discorso in un altro articolo.
Trail tipo float e quello double, cambia il modo in cui il numero reale viene rappresentato. Il tipo float da più importanza alla mantissa, mettendo a disposizione più bit per la sua rappresentazione ( 23 bit per la mantissa, 8 per l’esponente, 1 per il segno). Il tipo double da molta più importanza all’esponente rispetto alla mantissa mettendo a disposizione 4 bit in più per la sua rappresenzazione (19 bit per la mantissa, 12 per l’espoente, 1 per il segno).
Per informazion ulteriori su ciò che concerne la rappresentazione dei numeri decimali, interi o reali, nel sistema numerico binario, si rimanda a manuali appositi (ci sarebbero troppe cose da spiegare…) .
Tra variabili atomiche, è possibile effettuare operazioni algebriche elementari come, sottrazione, moltiplicazione, divisione e divisione con resto. Il linguaggio c, come il c++, non mettono a disposizione operatori per la radice quadra, l’elevamento a potenza o cose così, per questo esistono delle librerie esterne che provvedono allo scopo. Questo sarà l’argomento della prossima lezione. A presto!

Salve a tutti. Essendo molto più che un semplice appassionato di computer e programmazione, mi è stato chiesto di dare una mano a questo progetto nascente. L’idea di poter insegnare ciò che ho appreso in anni di studi mi ha subito intrigato ed eccomi qui a scrivere.
Premetto subito che insegnare tramite lo schermo di un computer è molto difficile , imparare lo è ancora di più. Come sempre, un po’ di impegno non guasta. Miracoli non se ne fanno, ma se vi lascerete prendere dalla passione, vedrete che i risultati arriveranno molto presto.
Altra “raccomandazione” molto molto semplice : noterete presto che ogni tanto faccio qualche errore di grammatica o qualche errore sintattico. Vi chiedo in anticipo di perdonarmeli!
Detto questo si inizia a palla. La prima lezione riguarderà ciò che serve ad un buon programmatore per scrivere qualche cosa di utile.
Una prima cosa da imparare è cosa sia un linguaggio. Un linguaggio non è nient’altro che un insieme di simboli attraverso il quale si descrive qualche cosa. In informatica si distingue tra “linguaggi naturali”, l’italiano ne è un esempio, “linguaggi ad alto livello”, il C, il C++ il perl il Java…ecc ne sono un esempio, “linguaggi a basso livello”, istruzioni mnemoniche semplici come MOVE o ADD tipiche dell’Assembly, e i “linguaggi macchina”, sequenze infinite di 0100101001 …ne sono un esempio!
Oltre a queste classificazioni, ne esiste un’altra che fa riferimento al sistema che un linguaggio adopera per essere compreso dal processore. Questa classificazione comprende i “linguaggi interpretati” e i “linguaggi compilati”. La differenza, banale, è che i linguaggi compilati, una volta compilati (appunto), possono essere eseguiti direttamente dal processore. I linguaggi interpretati, hanno bisogno di un “programma interprete” che traduce le istruzioni da uno pseudo-linguaggio al linguaggio macchina.
Vantaggi?? I linguaggi compilati generano programmi più veloci ma… si dice che siano meno “portabili”. Ad esempio, se compiliamo un programma su linux, lo stesso non eseguirà su Windows…
I linguaggi interpretati (proprio perche c’è l’interprete) superano questo scoglio…ma riescono ad essere quasi 20 volte più lenti di un equivalente compilato…
Esempio: la chat di facebook.
Vi siete mai chiesti come mai sia così lenta e come mai si impalli così frequentemente la chat di facebook? Indovinate un po’…è scritta in Java (un linguaggio interpretato) per cui “funziona” ovunque ma con un piccolo prezzo dovuto in prestazioni…
Torniamo a noi…Per scrivere un buon programma c’è bisogno di buoni strumenti per la programmazione, così come per ogni mestiere sulla faccia della terra. Ciò che ci serve è :
- un editor di testo
- un formattatore di testo
- un compilatore
- un linker
- un debugger
Non chiudete ancora l’articolo e non vi spaventate!!!
Vediamo a cosa ci servono uno per uno questi strumenti. L’editor di testo ci serve a scrivere materialmente le istruzioni in un linguaggio ad alto livello (nel nostro caso il C o il C++) che il compilatore tradurrà in una sequenza di 0 o 1 comprensibili dal processore.
Il testo del programma può essere diviso in più “pagine” o “file”. Il linker si occupa di “attaccare” i segmenti del programma provenienti dai diversi file e generare il programma eseguibile vero e proprio.
Essendo esseri umani, possiamo sbagliare nello scrivere un programma. Esistono due tipi di errori in cui possiamo incorrere: errori di build-time ed errori di run-time.
Gli errori di build-time vengono generati dal modo insulso di scrivere un programma, ad esempio chiamando una istruzione che non esiste… Il compilatore SE NE ACCORGE e noi possiamo facilmente corregerli.
Errori di run-time, come dice il nome, si verificano durante l’esecuzione del programma.E’ facile osservare che il compilatore NON SI E’ ACCORTO DELLA PRESENZA DELL’ERRORE non perche sia una schifezza di compilatore ma per ben altri motivi… Non serve prendere a calci il pc. E’ solo colpa nostra. Il pc è un esecutore fedele: fa ciò che gli si dice di fare…
Gli errori a run-time sono difficili da scovare: ecco a cosa serve il debugger! Esso simula l’esecuzione del programma istruzione per istruzione, fermandosi dopo ognuna di esse, e consentendo di monitorarne il funzionamento.
Le cause di questi errori sono molteplici e la loro prevenzione esula dalla trattazione di questo articolo. Vedremo piano piano come fare ad evitarli.
I programmatori sono fortunati perché altri programmatori ci hanno fornito degli strumenti straordinariamente potenti. Esistono programmi che integrano tutte queste caratteristiche: gli IDE (Integrated Developmenent Environnement).
Io personalmente li odio ma li consiglio vivamente a chi si avvicina per le prime volte alla programmazione. Non importa quale usiate, funzionano tutti allo stesso identico modo. Iniziate a scaricarne qualcuno dalla rete (provate a cercare con google), così nel frattempo comincio a preparare la prossima lezione!
Alla prossima!