|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Oct 2005
Città: AP
Messaggi: 168
|
Linguaggi di programmazione con tipi statici
Sto studiando per un'esame sui linguaggi di programmazione. Mi sono imbattuto in questa domanda..
Si consideri il seguente frammento in uno pseudolinguaggio con tipi statici, dove f e una certa funzione di due argomenti: int i,j; float y,z; y = f(i,j); z = f(y,i); Si fornisca (i) una possibile intestazione per la funzione f e (ii) le ipotesi che occorre fare sul sistema di tipi dello pseudolinguaggio anche l'intestazione data in (i) sia corretta. La prima risposta che mi viene in mente è che se il linguaggio supporta funzioni polimorfe, potrei semplicemente avere una funzione f così definita: float f(<T1> param1, <T2> param2)
__________________
The Grand essentials of happiness are: something to do, something to love, and something to hope for. Ultima modifica di g0t3nk5 : 12-11-2013 alle 02:59. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Mar 2006
Città: Genova
Messaggi: 2457
|
cavolo la teoria è anni che non la vedo in questi termini... tieni conto di una cosa. A una funzione che richiede float puoi passare degli int quindi la firma
potrebbe essere benissimo float f(float paramA, float paramB) e funzionare tranquillamente
__________________
tag XBOX live Aldair74 Nick PSNRiordian Affari conclusi con: Anf3t4m1n Krocca magomagnani amoredipippa mone_82 raszagale bizzy89 Andrew_db |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
|
Quote:
int f (int paramA, int paramB) come pure: double f (double paramA, double paramB) e ogni possibile combinazione di tipi numerici dei parametri e del valore di ritorno. In alcuni casi perdi precisione o avrai troncamento, in altri "sprechi" memoria. Mentre non credo che tu possa usare tipi parametrici, vista la tipizzazione statica.
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes] "Pirating software? Choose Microsoft!" |
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Mar 2006
Città: Genova
Messaggi: 2457
|
Quote:
__________________
tag XBOX live Aldair74 Nick PSNRiordian Affari conclusi con: Anf3t4m1n Krocca magomagnani amoredipippa mone_82 raszagale bizzy89 Andrew_db Ultima modifica di Riordian : 12-11-2013 alle 11:44. |
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
|
Quote:
Codice:
#include <stdio.h>
int f (int paramA, int paramB) {
return paramA+paramB;
}
int main(int argc, char *argv[]) {
float a = 5.5f;
float b = 6.6f;
printf("somma: %d\n", f(a,b));
return 0;
}
compilato con Codice:
gcc -Wall -pedantic -o test test.c gcc 4.8.2 tra l'altro c# permette i generici, non credo sia un linguaggio fortemente tipizzato
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes] "Pirating software? Choose Microsoft!" Ultima modifica di Oceans11 : 12-11-2013 alle 12:06. Motivo: typo |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Mar 2006
Città: Genova
Messaggi: 2457
|
Quote:
guarda ho provato, una cosa del genere o la casto o non compila. E il risultato che mi darebbe è 11 invece di 12.1.
__________________
tag XBOX live Aldair74 Nick PSNRiordian Affari conclusi con: Anf3t4m1n Krocca magomagnani amoredipippa mone_82 raszagale bizzy89 Andrew_db |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
|
11 è il risultato che mi aspetto infatti. Il problema della compilazione starà nel compilatore che usi. Qual'è?
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes] "Pirating software? Choose Microsoft!" |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
|
wikipedia
Gli ultimi due punti dell'elenco: Quote:
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes] "Pirating software? Choose Microsoft!" |
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Mar 2006
Città: Genova
Messaggi: 2457
|
Quote:
__________________
tag XBOX live Aldair74 Nick PSNRiordian Affari conclusi con: Anf3t4m1n Krocca magomagnani amoredipippa mone_82 raszagale bizzy89 Andrew_db |
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Mar 2006
Città: Genova
Messaggi: 2457
|
Quote:
http://msdn.microsoft.com/it-it/library/ms173105%28v=vs.90%29.aspx
__________________
tag XBOX live Aldair74 Nick PSNRiordian Affari conclusi con: Anf3t4m1n Krocca magomagnani amoredipippa mone_82 raszagale bizzy89 Andrew_db |
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
|
Quote:
Detto questo, personalmente, tra le varie risposte poi, sceglierei quella che procuri meno problemi. ps: grazie per il link, devo non aver capito le differenze tra staticamente tipizzato e le conversioni di tipo.
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes] "Pirating software? Choose Microsoft!" Ultima modifica di Oceans11 : 12-11-2013 alle 13:26. Motivo: edit |
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Mar 2006
Città: Genova
Messaggi: 2457
|
Quote:
Di nulla per il link |
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
|
ok, in realtà non avevo proprio capito una mazza!
per tipizzazione statica si intende che il tipo di una variabile è deciso a compile time. c, java, c#, c++ vs javascript (ad esempio) o python. (Non riesco ad ogni modo a spiegarmi i generici e i template, o il polimorfismo) le conversioni (implicite ed esplicite) dipendono dunque dal compilatore e linguaggio, a prescindere dalla tipizzazione. @g0t3nk5: sorry per il leggero OT, spero sia stato utile.
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes] "Pirating software? Choose Microsoft!" |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
I generici sono come i template del C++ dal punto di vista della tipizzazione, che rimane forte e statica. C# è anche più tipizzato di C++ perchè non permette appunto di assegnare un double ad un int senza cast esplicito, cosa permessa in C++ perchè si porta dietro la retrocompatibilità col C.
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
|
Quote:
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes] "Pirating software? Choose Microsoft!" |
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Mar 2006
Città: Genova
Messaggi: 2457
|
non sono un bravo prof per cui ti passo un link
http://msdn.microsoft.com/it-it/library/ms173152.aspx poi io mi ricordo che anche l'overload era una tecnica per il polimorfismo oltre l'override http://msdn.microsoft.com/it-it/libr...vs.100%29.aspx
__________________
tag XBOX live Aldair74 Nick PSNRiordian Affari conclusi con: Anf3t4m1n Krocca magomagnani amoredipippa mone_82 raszagale bizzy89 Andrew_db Ultima modifica di Riordian : 12-11-2013 alle 13:51. |
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
Parli di ereditarietà. Il polimorfismo è una conseguenza dell'ereditarietà.
E' una cosa necessaria perchè altrimenti si escluderebbe una grossa fetta di problemi risolvibili con il linguaggio. Semplicemente: in alcuni casi non è in alcun modo possibile stabilire a compile time il tipo di oggetti che saranno utilizzati nel programma. Ad esempio, se il programma chiede all'utente di riempire un array di forme geometriche con triangoli, quadrati, cerchi a suo piacimento. Tieni conto però che ereditarietà non significa mancanza di tipizzazione. Il tuo programma in C++/C#/Java eccetera dovrà maneggiare, nel senso che allocherà, puntatori alla classe base, ad esempio "FormaGeometrica", e poi assegnerà a questi puntatori oggetti di classe derivata, FormaGeometrica* forma = new Cerchio(raggio); allocati dinamicamente nella heap. Quindi non farti ingannare: la tipizzazione è cmq statica, perchè a compile time sai che nella stack allocherai memoria per tenere un puntatore a FormaGeometrica, e solo a runtime assegnerai un oggetto a quel puntatore. Il polimorfismo è una conseguenza: a prescindere dal fatto che la tua forma geometrica sia un cerchio o un rettangolo, ad un certo punto nel codice vorrai calcolarne l'area. Però il tuo codice viene compilato prima di sapere cosa maneggerai, e quindi devi metterci una funzione che vada bene per tutte le possibili forme geometriche. Allora si stabilisce un'interfaccia comune alle forme geometriche, cioè che ogni oggetto che deriva dalla classe base abbia dei metodi con lo stesso nome, cosicchè il codice scritto a compile time sia valido, ma poi a runtime venga chiamata la versione "specializzata" per quella particolare forma geometrica in modo automatico. Il polimorfismo significa questo: stesso nome della funzione (o metodo) per tutte le classi che derivano da, e quindi hanno proprietà in comune con, una classe base più generica, ma comportamento diverso in base alla vera natura dell'oggetto di quella classe (nell'esempio, cambia la formula con cui si vuole calcolare l'area). Ultima modifica di vendettaaaaa : 12-11-2013 alle 14:11. |
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
|
Quote:
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes] "Pirating software? Choose Microsoft!" |
|
|
|
|
|
|
#19 |
|
Member
Iscritto dal: Oct 2005
Città: AP
Messaggi: 168
|
Vi ringrazio a tutti delle risposte, non mi aspettavo una discussione così accesa.
Ne approfitto per porre un altro quesito sempre sulla tipizzazione. Si consideri il seguente frammento di codice Java, dove A e B sono due classi diverse, di tipo non confrontabile: A[] as = new A[10]; Object[] ao = as; B[0] = new B(); Si dica se il precedente frammento e corretto oppure no dal punto di vista dei tipi. Sulla terza riga, ovvero l'assegnamento di B[0], non c'è un errore in quanto l'array B non eiste/non è stato inizializzato??? Un'altra domanda che mi ha messo in difficoltà è questa: Nello scope delle dichiarazioni: int n; string s; int g(int x, real y){...} si consideri l'espressione g(f(n), f(s)) Si diano ipotesi sul linguaggio e/o sul nome f anche tale espressione sia correttamente tipizzata. A differenza della prima domanda del thread in questo caso una variabile è numerica e l'altra di tipo string, che non sono tipi compatibili tra loro (nel senso che non credo che il compilatore farebbe cast implicito). Grazie di nuovo.
__________________
The Grand essentials of happiness are: something to do, something to love, and something to hope for. Ultima modifica di g0t3nk5 : 12-11-2013 alle 15:13. |
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Mar 2006
Città: Genova
Messaggi: 2457
|
Quote:
float f(float paramA, float paramB) a cui puoi passare sia float che int con tipizzazione statica
__________________
tag XBOX live Aldair74 Nick PSNRiordian Affari conclusi con: Anf3t4m1n Krocca magomagnani amoredipippa mone_82 raszagale bizzy89 Andrew_db |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:50.




















