View Full Version : [Creare un di programmazione]Funzioni,Metodi...
hollywoodundead
17-08-2013, 18:28
Prendiamo ad esempio il metodo in java println oppure la classe system, o ad esempio if e int che sono dati primitivi. Ecco, come vengono creati questi dati? Che linguaggio usano i programmatori per creare questi dati primitivi, o ad esempio per creare il metodo println? Vorrei levarmi questo dubbio. Va bene utilizzare le classi,le collection i metodi per metterli insieme e formare un programma ma da dove parte tutto. Come faccio a dire alla macchina che if sta per se nella lingua umana, come lo creo quell'if nel cervello della macchina? :)
Edit: Nel titolo manca la parola linguaggio, se qualcuno riesce a modificarla per correttezza, grazie ;)
AllerITA
17-08-2013, 19:22
Attenzione a confondere le funzioni della libreria standard (o meno) che fa parte integrante di un determinato linguaggio (vedi printf in C) con gli elementi della grammatica del linguaggio stesso (vedi if nella dichiarazione di una struttura condizionata del C).
La prima è una funzione (spesso creata nello stesso linguaggio che la utilizza) che viene eseguita di solito portando a fare un salto dell'esecuzione del programma in un modulo di libreria .Mentre l'altro è un elemento che il compilatore /interprete trasforma direttamente in istruzioni in linguaggio macchina /metalinguaggio per essere eseguito dalla macchina /macchina virtuale quando il tuo programma viene eseguito.
hollywoodundead
17-08-2013, 19:38
Attenzione a confondere le funzioni della libreria standard (o meno) che fa parte integrante di un determinato linguaggio (vedi printf in C) con gli elementi della grammatica del linguaggio stesso (vedi if nella dichiarazione di una struttura condizionata del C).
La prima è una funzione (spesso creata nello stesso linguaggio che la utilizza) che viene eseguita di solito portando a fare un salto dell'esecuzione del programma in un modulo di libreria .Mentre l'altro è un elemento che il compilatore /interprete trasforma direttamente in istruzioni in linguaggio macchina /metalinguaggio per essere eseguito dalla macchina /macchina virtuale quando il tuo programma viene eseguito.
ok ma l'altro elemento, ad esempio l'if, è sempre scritto nello stesso linguaggio in cui è scritto il primo elemento? e poi una cosa che non riesco a capire, ma che anche tu hai scritto come altri :) , l'if è un dato primitivo gia incluso ad esempio in java o piuttosto in c++, ma incluso in che senso? dove si trova il pezzo di codice dove la macchina virtuale o il compilatore in generale va a eseguire una volta che arriva a leggere "if" per tradurlo in bytecode e farlo eseguire dalla macchina ?
EDIT: L'unica soluzione che mi viene in mente è che i dati primitivi come l'if, l'int etc.. sia precaricari ad esempio per quanto riguarda il linguaggio java direttamente nella JVM (per precaricati intendo dire scritti direttamente al suo interno in linguaggio java) in moto tale che vengano interpretati in bytecode durante l'esecuzione della JVM, e cosi il programmatore non ha bisogno di scriverli nel programma. Vi torna? :)
AllerITA
17-08-2013, 20:13
Vedi tramite una grammatica è possibile creare un grafo che permette di tradurre i comandi del linguaggio tramite apposite tabelle in codice eseguibile.
A tal proposito, guarda la teoria dei compilatori e la teoria delle grammatiche non ambigue dei linguaggi di programmazione. Adesso come adesso non saprei che letture consigliare, io studiai l'argomento all'università molti anni fa.
Lascio a chi è più informato di me ulteriori precisazioni. :)
hollywoodundead
18-08-2013, 09:33
Vedi tramite una grammatica è possibile creare un grafo che permette di tradurre i comandi del linguaggio tramite apposite tabelle in codice eseguibile.
A tal proposito, guarda la teoria dei compilatori e la teoria delle grammatiche non ambigue dei linguaggi di programmazione. Adesso come adesso non saprei che letture consigliare, io studiai l'argomento all'università molti anni fa.
Lascio a chi è più informato di me ulteriori precisazioni. :)
Si ma nella teoria dei compilatori e nell'università non ti viene spiegato come viene interpretato l'if in linguaggio macchina e perchè non bisogna instanziarlo visto che fa parte già del linguaggio. Ti viene detto che funziona cosi e basta :). Vabbe in attesa di scoprirlo un giorno,vediamo se qualcun altro risponde ;)
hollywoodundead
18-08-2013, 10:16
eh? l'IF non è un dato primitivo, è una keyword del linguaggio in questione che il compilatore tradurrà con un controllo di un certo registro messo in un altro registro ed usato per gestire un salto, oppure no, in assembly. stop. istanziare una IF non vuole dire assolutamente niente.
Volevo scrivere int non if. Vale la stessa cosa anche per int che invece è un dato primitivo? E poi questo registro di cui parli è scritto sempre in linguaggio java per quanto riguarda il java? Comunque non ho scritto che l'if va istanziato. Ho scritto che nell'universita ti spiegano che non si instanzia l'if a differenza degli oggetti in quanto fa parte già del programma. :)
mone.java
18-08-2013, 10:27
Ma tu a che anno sei e di quale corso e in quale città?
C'è un bel po' di confusione.
Ogni linguaggio (in generale) si basa su almeno due cose:
1) alfabeto (set di simboli ammessi nel linguaggio, ad esempio nel caso dei linguaggi di programmazione è il set di simboli ASCII)
2) grammatica (set di regole che consentono di generare "parole" o "frasi" del linguaggio)
Generare una frase valida di un linguaggio e testare se una frase appartiene al linguaggio sono due cose diverse.
Un parser di un compilatore si occupa tipicamente di verificare se il programma scritto dall'utente (frase del linguaggio) sia corretto dal punto di vista grammaticale.
Ovvero:
int main(void)
{
return 0;
}
E' un programma C?
E questo?
main:
return 0
Le keyword di cui parli (if, int e quant'altro) fanno tipicamente parte della grammatica del linguaggio.
Dopo che il parser ha validato il programma, si passa ad altri moduli del compilatore che hanno il compito di ottimizzare il codice e tradurre in assembly (o in bytecode nel caso dei linguaggi managed).
Nota bene che almeno concettualmente ad ogni istruzione assembly corrisponde una istruzione macchina (in binario).
hollywoodundead
18-08-2013, 11:50
Ma tu a che anno sei e di quale corso e in quale città?
Torino, devo frequentare il primo anno. Il corso è informatica.
C'è un bel po' di confusione.
Ogni linguaggio (in generale) si basa su almeno due cose:
1) alfabeto (set di simboli ammessi nel linguaggio, ad esempio nel caso dei linguaggi di programmazione è il set di simboli ASCII)
2) grammatica (set di regole che consentono di generare "parole" o "frasi" del linguaggio)
Generare una frase valida di un linguaggio e testare se una frase appartiene al linguaggio sono due cose diverse.
Un parser di un compilatore si occupa tipicamente di verificare se il programma scritto dall'utente (frase del linguaggio) sia corretto dal punto di vista grammaticale.
Ovvero:
int main(void)
{
return 0;
}
E' un programma C?
E questo?
main:
return 0
Le keyword di cui parli (if, int e quant'altro) fanno tipicamente parte della grammatica del linguaggio.
Dopo che il parser ha validato il programma, si passa ad altri moduli del compilatore che hanno il compito di ottimizzare il codice e tradurre in assembly (o in bytecode nel caso dei linguaggi managed).
Nota bene che almeno concettualmente ad ogni istruzione assembly corrisponde una istruzione macchina (in binario).
Ho letto in giro e ho capito che il parser serve per verificare la "grammatica" ad esempio del testo scritto all'interno di un file. Adesso, per spiegarla in maniera semplice ma che sia comprensibile, quando il parser e il compilatore leggono un file in cui trovano un if e un int, per tradurli nel linguaggio macchina che cosa fanno? Lasciamo per il momento da parte il codice ASCII che servirebbe solamente per ricavare in maniera comprensibile per la macchina la scrittura "if" o "int". Quello che voglio capire io, è che cosa permette alla macchina di capire quando scrivo "if" per esempio che quello è un "se" per il significato umano? dove sta scritto che quella scrittura, vada interpretata come un "se"? :)
mone.java
18-08-2013, 12:04
Dai un occhiata qui: http://it.wikipedia.org/wiki/Compilatore quello che cerchi tu nello specifico (ovvero quella parte della compilazione che da il significato a quello che hai scritto), se non erro, è l'Analisi Semantica (http://it.wikipedia.org/wiki/Analisi_semantica)...
Comunque sono tutte cse che apprenderai nei corsi all'università (io sto facendo l'università a Bologna):
Linguaggi/Logica - Linguaggi di Programmazione - Architettura dei Calcolatori.
Si ma nella teoria dei compilatori e nell'università non ti viene spiegato come viene interpretato l'if in linguaggio macchina e perchè non bisogna instanziarlo visto che fa parte già del linguaggio. Ti viene detto che funziona cosi e basta :). Vabbe in attesa di scoprirlo un giorno,vediamo se qualcun altro risponde ;)
Torino, devo frequentare il primo anno. Il corso è informatica.
Devi frequentare ancora il primo anno e fai delle affermazioni certe su cosa non ti insegneranno all'università?
Torino, devo frequentare il primo anno. Il corso è informatica.
Ho letto in giro e ho capito che il parser serve per verificare la "grammatica" ad esempio del testo scritto all'interno di un file. Adesso, per spiegarla in maniera semplice ma che sia comprensibile, quando il parser e il compilatore leggono un file in cui trovano un if e un int, per tradurli nel linguaggio macchina che cosa fanno? Lasciamo per il momento da parte il codice ASCII che servirebbe solamente per ricavare in maniera comprensibile per la macchina la scrittura "if" o "int". Quello che voglio capire io, è che cosa permette alla macchina di capire quando scrivo "if" per esempio che quello è un "se" per il significato umano? dove sta scritto che quella scrittura, vada interpretata come un "se"? :)
Detta molto velocemente, c'è una tabella di corrispondenza scritta da chi fa il compilatore che seguirà anche le specifiche dell'assembly del processore su cui far girare il programma.
Esempio:
if (a < 47) ...
else ...
Viene processato in quelli che vengono chiamati token, dunque magari viene scomposto così:
<IF, indirizzo di A, lessthan, 47, indirizzo prossima istruzione>
E dopodiché c'è una semplice tabella di corrispondenza che dice come tradurre quel token in assembly.
A sua volta l'assembly viene tradotto in linguaggio macchina, che altro non sono che sequenze di numeri tipo:
<12, indirizzo di A, 3, 47, indirizzo prossima istruzione>
(dove indirizzo di A e indirizzo prossima istruzione sono numeri)
Ad ogni modo, l'argomento è lungo e in alcuni casi per nulla banale.
Per avere un quadro chiaro di tutto dovresti aver fatto già i corsi di fondamenti, architetture e compilatori.
http://en.wikipedia.org/wiki/Compiler
hollywoodundead
18-08-2013, 13:05
Dai un occhiata qui: http://it.wikipedia.org/wiki/Compilatore quello che cerchi tu nello specifico (ovvero quella parte della compilazione che da il significato a quello che hai scritto), se non erro, è l'Analisi Semantica (http://it.wikipedia.org/wiki/Analisi_semantica)...
Comunque sono tutte cse che apprenderai nei corsi all'università (io sto facendo l'università a Bologna):
Linguaggi/Logica - Linguaggi di Programmazione - Architettura dei Calcolatori.
Grazie per il link mone, era quello che stavo cercando, ma non capivo come venivano chiamati questi processi eseguiti all'interno di un compilatore.
http://lazzarini.altervista.org/Terza/Grammatica.html
http://www.hwupgrade.it/forum/showthread.php?t=1274080
Questo in particolare spiega bene quello che volevo capire, illustrando anche alcuni esempi concreti nella creazione di un parser:
http://digilander.libero.it/capano/lezioni/LEZIONE6.htm
Alla fine era come avevo immaginato,il significato di tutti questi tokens( adesso so come si chiamano :D )viene assegnato all'interno del compilatore.E' una sorta di "alfabeto" numerico e letterale come appunto quelli presenti nella lingua inglese o in altre lingue.Il cuore di tutto ciò sono i passaggi di analisi sintattica e semantica(questo passaggio da il significato "se" all'if,while etc.. :) ) eseguiti dal parser o anche detto compiler-compiler, una sorta di compilatore interno al compilatore che alla fine genera una tabella di simboli , contenente tutte queste regole, chiamata AST.
Mone forse ricordo male, ma te non eri la persona che chiedeva com'era l'università di torino, che è venuto pure a vederla e alla fine era rimasto a bologna? :)
hollywoodundead
18-08-2013, 13:11
Devi frequentare ancora il primo anno e fai delle affermazioni certe su cosa non ti insegneranno all'università?
Ho amici che mi hanno riferito certe informazioni, magari loro non sono ancora arrivati a fare certi argomenti che servirebbero per capire quello che chiedevo. Quindi la mia non era un affermazione fondata ma piuttosto una supposizione se ti fa stare piu tranquillo :D
mone.java
18-08-2013, 13:36
Mone forse ricordo male, ma te non eri la persona che chiedeva com'era l'università di torino, che è venuto pure a vederla e alla fine era rimasto a bologna? :)
hahaha si sono proprio io... ho anche fatto il "test" e lo avevo passato... ma son passati almeno 4 anni... come hai fatto a trovarmi? Cmq tranquillo non sono tornato a Bologna perchè l'università di Torino mi sembrava poco adatta o cose del genere... ma tutt'altri motivi! :D
hollywoodundead
18-08-2013, 13:58
hahaha si sono proprio io... ho anche fatto il "test" e lo avevo passato... ma son passati almeno 4 anni... come hai fatto a trovarmi? Cmq tranquillo non sono tornato a Bologna perchè l'università di Torino mi sembrava poco adatta o cose del genere... ma tutt'altri motivi! :D
OT:Vabbe ma il test tarm non è selettivo, serve per valutare prevalentemente le conoscenze che hai, certo è che se non sei almeno piu che buono in matematica, tutto va al rallentatore. Mi ricordavo il tuo avatar nel 3d che avevi aperto, perchè dovevo scegliere come te che università fare ;)
hollywoodundead
19-08-2013, 10:37
ma che vuol dire istanziare un IF? :mbe:
Non vuol dire niente, è senza senso in quanto non è un oggetto da creare :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.