Entra

View Full Version : [C] Cosa per permette di fare il linguaggio C?


Bestseller
25-11-2010, 14:00
Buongiorno.
Attualmente mi ritrovo a studiare il linguaggio di programmazione C all'università e vi scrivo perchè vorrei avere delle delucidazioni in merito alle potenzialità di questo linguaggio. Infatti, per quello che stiamo studiando ora, mi sembra che il linguaggio C permetta di fare poche cose. Voglio dire: le funzioni for, if, while, printf, scanf mi sembra che permettano di fare poche cose. Credo sia soltanto una mia impressione, ma volevo sapere lo stesso il vostro parere.

goldorak
25-11-2010, 14:33
Buongiorno.
Attualmente mi ritrovo a studiare il linguaggio di programmazione C all'università e vi scrivo perchè vorrei avere delle delucidazioni in merito alle potenzialità di questo linguaggio. Infatti, per quello che stiamo studiando ora, mi sembra che il linguaggio C permetta di fare poche cose. Voglio dire: le funzioni for, if, while, printf, scanf mi sembra che permettano di fare poche cose. Credo sia soltanto una mia impressione, ma volevo sapere lo stesso il vostro parere.

E soltanto una tua impressione.
Il C come il C++ o Java o Eiffel o PL/I o COBOL o FORTRAN o Ada o Haskell o Lisp etc... sono linguaggi turing completi.
Questo significa che qualsiasi cosa ti possa esprimere in uno di questi linguaggi, lo puoi esprimere altrettanto bene negli altri.
Cambiera' la sintassi, magari il programma sara' piu' lungo, sara' piu' astruso etc... ma a livello computazionale non cambia niente.
Qualsiasi algoritmo ti possa scrivere in C, lo puoi scrivere negli altri linguaggi. E viceversa ovviamente.
Per un caso piu' estremo considera il linguaggio brainfuck : http://en.wikipedia.org/wiki/Brainfuck che ha una sintassi ancora piu' povera di quella del C e nonostante cio' ha lo stesso potere espressivo di qualsiasi altro linguaggio di programmazione turing completo.

Detto questo, i programmatori non partono ogni volta da zero, ci sia aiuta con le librerie. E qui ci sono differenze tra i vari linguaggi nel senso che alcuni dispongono di librerie sterminate (come Java) altri no hanno meno scelta.
Ma questo dal punto di vista computazione non incide sulla "potenza" del linguaggio.

banryu79
25-11-2010, 15:20
Il linguaggio di programmazione C è un sistema turing-completo, come la stragande maggioranza (forse tutti? non saprei, ad esempio SQL... mi pare sia diventato turing-completo da una certa versione in poi) dei linguaggi di programmazione "main stream".

Detto questo, per un linguaggio di programmazione, il fatto di essere turing-completo non ci dice nulla circa la velocità con cui esegue i calcoli, la sua minore o maggiore espressività (rispetto altri linguaggi), il numero e/o la tipologia di costrutti che mette a disposizione del programmatore, l'ortogonalità degli stessi ecc...

Se posso consigliarti una lettura nel forum circa le caratteristiche di diversi linguaggi di programmazione così come percepite da diversi programmatori ti indico questo thread (http://www.hwupgrade.it/forum/showthread.php?t=1979444)

downloader
26-11-2010, 10:25
Il C è un linguaggio che di fatto di permette di fare tutto, ma con una certa complessità non essendo orientato agli oggetti.

Cosa differente dal C++, c#, Java ecc

Quindi la domanda è, cosa vuoi fare? Devi sviluppare qualcosa? Devi imparare semplicemente a programmare?

banryu79
26-11-2010, 10:58
Il C è un linguaggio che di fatto di permette di fare tutto, ma con una certa complessità non essendo orientato agli oggetti.

Cosa differente dal C++, c#, Java ecc

Beh, secondo me il C++ è più complesso di C, come linguaggio.
Hai usato una parola problematica: "complessità" :)
E anche la questione dell'orientamento agli oggetti :D

Sarei d'accordo con te se la tua frase fosse differente, ad esempio sostituendo "una certa complessità" con "con minore produttività" e sostituendo "non essendo orientato agli oggetti" con "essendo povero di costrutti/feature di alto livello"

goldorak
26-11-2010, 11:01
Beh, secondo me il C++ è più complesso di C, come linguaggio.
Hai usato una parola problematica: "complessità" :)
E anche la questione dell'orientamento agli oggetti :D

Sarei d'accordo con te se la tua frase fosse differente, ad esempio sostituendo "una certa complessità" con "con minore produttività" e sostituendo "non essendo orientato agli oggetti" con "essendo povero di costrutti/feature di alto livello"

He he mi hai preceduto, stavo rispondendo ma alla fine ho lasciato correre, si rischia di infiammare una guerra di religione su questo tema. :asd:

downloader
26-11-2010, 11:03
Beh, secondo me il C++ è più complesso di C, come linguaggio.
Hai usato una parola problematica: "complessità" :)
E anche la questione dell'orientamento agli oggetti :D

Sarei d'accordo con te se la tua frase fosse differente, ad esempio sostituendo "una certa complessità" con "con minore produttività" e sostituendo "non essendo orientato agli oggetti" con "essendo povero di costrutti/feature di alto livello"

nono l'idea era quella :D

La programmazione orientata agli oggetti da un vantaggio in termini di tempi di sviluppo notevoli rispetto al realizzare la stessa cosa in C.

Quindi la mia complessità è riferita al reale utilizzo del linguaggio (prova a progettare un qualcosa che sia modulare come lo è il C++ in C, ti ritroverai a gestire liste dinamiche di puntatori a funzione con parametri variabili)

ovviamente invece, lato puramente dottrinale, è il caso di apprendere prima il C che il C++... ma a quel punto... io farei partire chiunque con il basic per i costrutti iniziale per poi passare la persona al c# o al java per apprendere la programmazione oop

goldorak
26-11-2010, 11:13
nono l'idea era quella :D

La programmazione orientata agli oggetti da un vantaggio in termini di tempi di sviluppo notevoli rispetto al realizzare la stessa cosa in C.


Dipende da cio' che devi sviluppare.


Quindi la mia complessità è riferita al reale utilizzo del linguaggio (prova a progettare un qualcosa che sia modulare come lo è il C++ in C, ti ritroverai a gestire liste dinamiche di puntatori a funzione con parametri variabili)


E credi che il C++ ti sollevi da questo ? :asd:



ovviamente invece, lato puramente dottrinale, è il caso di apprendere prima il C che il C++... ma a quel punto... io farei partire chiunque con il basic per i costrutti iniziale per poi passare la persona al c# o al java per apprendere la programmazione oop

Il Basic ? :Puke: Se proprio ci vuole un linguaggio imperativo come primo tentativo farei usare il Pascal o una delle sue varianti, Oberon o Modula-2/3. Altrimenti ce' Scheme che funziona benissimo pur essendo un linguaggio funzionale.
Infine non ce' proprio bisogno del c# o java per capire i concetti fondamentali della progettazione/programmazione orientata agli oggetti.
Tanto che l'Objective-C sarebbe una scelta migliore per chi volesse fare oo e venisse da C (e se sviluppi su ios non hai scelta....).

downloader
26-11-2010, 11:19
Pascal anche al posto del basic, non cambia.

Il c++ è orientato ad oggetti e quindi ovvio che ti solleva dal dover implementare da te l'OOP.

Forse non mi sono spiegato bene nel dire cosa intendevo infatti.

Hai mai in C creato qualcosa che funzioni e sia modulare ESATTAMENTE come lo è già il C++?

Non so se è chiaro, ti sto chiedendo se hai mai simulato l'uso di classi e oggetti in C.

pabloski
26-11-2010, 11:23
Hai mai in C creato qualcosa che funzioni e sia modulare ESATTAMENTE come lo è già il C++?

Non so se è chiaro, ti sto chiedendo se hai mai simulato l'uso di classi e oggetti in C.

brrrrr perchè parlate di cose così brutte? :D ....la vita è già piena di problemi senza l'oop in C

p.s. però il multithreading in C è ancora peggio dell'OOP :D

banryu79
26-11-2010, 11:24
...si rischia di infiammare una guerra di religione su questo tema. :asd:

Vedo che avete fatto presto a passare "dalle parole ai fatti" :asd:

downloader
26-11-2010, 11:28
Tanto che l'Objective-C sarebbe una scelta migliore per chi volesse fare oo e venisse da C (e se sviluppi su ios non hai scelta....).

Se uno viene dal C la scelta per me è il puro C++, però è questione di esperienze e opinioni, io la vedo così. Dico c#, java... perché per la mia esperienza sono ottimi per far apprendere l'OOP, senza distrazioni su puntatori e altro (che comunque esistono in questi linguaggi, ma tutto è o dovrebbe essere controllato, compreso l'uso della memoria)

goldorak
26-11-2010, 12:11
Pascal anche al posto del basic, non cambia.

Il c++ è orientato ad oggetti e quindi ovvio che ti solleva dal dover implementare da te l'OOP.

Forse non mi sono spiegato bene nel dire cosa intendevo infatti.

Hai mai in C creato qualcosa che funzioni e sia modulare ESATTAMENTE come lo è già il C++?

Non so se è chiaro, ti sto chiedendo se hai mai simulato l'uso di classi e oggetti in C.

No non ho mai avuto il dispiacere di dover simulare l'uso di classi e oggetti in c, ma questo e' del tutto ortogonale al problema della modularita' dei programmi. Classi ed oggetti non sono necessari per rendere modulare un programma.

WarDuck
26-11-2010, 12:20
brrrrr perchè parlate di cose così brutte? :D ....la vita è già piena di problemi senza l'oop in C

p.s. però il multithreading in C è ancora peggio dell'OOP :D

E' chiaro che la programmazione object oriented risulti molto più "intuitiva" (se mi passate il termine) di quella procedurale, nel qual caso si tratta di faticare di più.

Per il multi-threading c'è l'ottima libreria pthread (sotto linux, ma so che esiste un porting anche su Win) che non sfigura di certo.

Comunque tutto il computabile può essere fatto con il costrutto while ed il costrutto if, per cui con C puoi fare semplicemente tutto.

Il punto è COME.

!fazz
26-11-2010, 12:56
Buongiorno.
Attualmente mi ritrovo a studiare il linguaggio di programmazione C all'università e vi scrivo perchè vorrei avere delle delucidazioni in merito alle potenzialità di questo linguaggio. Infatti, per quello che stiamo studiando ora, mi sembra che il linguaggio C permetta di fare poche cose. Voglio dire: le funzioni for, if, while, printf, scanf mi sembra che permettano di fare poche cose. Credo sia soltanto una mia impressione, ma volevo sapere lo stesso il vostro parere.

ti permette di fare tutto quello che fai con gli altri programmi anzi anche qualcosina in più di parecchi altri linguaggi visto la facilità con cui puoi interagire a basso livello.

ovviamente programmare in C risulta spesso più problematico e lungo rispetto ad esempio un c# perchè per parecchie cose non hai già la pappa pronta ma questo non pregiudica affatto la qualità del risultato finale.

giusto per farti un esempio, la stragrande maggioranza di tutti i dispositivi elettronici vengono programmati in ansi c e in nessun altro linguaggio

E' chiaro che la programmazione object oriented risulti molto più "intuitiva" (se mi passate il termine) di quella procedurale, nel qual caso si tratta di faticare di più.

Per il multi-threading c'è l'ottima libreria pthread (sotto linux, ma so che esiste un porting anche su Win) che non sfigura di certo.

Comunque tutto il computabile può essere fatto con il costrutto while ed il costrutto if, per cui con C puoi fare semplicemente tutto.

Il punto è COME.

anche con un JNZ :D:D:D

ingframin
26-11-2010, 13:02
mhmhm...
secondo me il più grosso limite di un linguaggio di programmazione sta nel programmatore. :)
Con ogni linguaggio si può in teoria fare tutto ma alcune cose sono più semplici con alcuni linguaggi che con altri. Dipende dallo scopo finale.
Poi sicuramente ci sarà qualche pazzo che prova a fare la programmazione web in assembly ma questo è un altro paio di maniche.
Il discorso sulle potenzialità di un linguaggio in ambito di produzione/lavorativo si apprezza solo in azienda, all'università o a livello amatoriale cambia molto poco da un linguaggio all'altro. E comunque per rispondere al thread originale:
C è una buona scelta come linguaggio, è molto richiesto in giro e domin ala grande il mondo embedded.
Uno dei parametri che prendo di solito per valutare l'"utilià" di studiare o meno un linguaggio e l'indice TIOBE: http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
Come vedi C è secondo in classifica come utilizzo, ha davanti solo il Java.
A conclusione di tutto:
1) C è un linguaggio che ti permette di fare di tutto, soprattutto in certi ambiti specifici.
2) Quanto vale il "di tutto" dipende praticamente solo da te
Saluti :-)

downloader
26-11-2010, 13:04
No non ho mai avuto il dispiacere di dover simulare l'uso di classi e oggetti in c, ma questo e' del tutto ortogonale al problema della modularita' dei programmi. Classi ed oggetti non sono necessari per rendere modulare un programma.

infatti ho detto che aiuta non che è necessario. A suo tempo vedi come era divertente scrivere applicazioni abbastanza complesse (gestionali ecc) di natura grafica in puro C e con le poche librerie grafiche a disposizione poi... na pacchia :D