Torna indietro   Hardware Upgrade Forum > Software > Programmazione

La rivoluzione dei dati in tempo reale è in arrivo. Un assaggio a Confluent Current 2025
La rivoluzione dei dati in tempo reale è in arrivo. Un assaggio a Confluent Current 2025
Siamo andati a Londra per partecipare a Current 2025, la conferenza annuale di Confluent. Il tema al centro dell'evento era l'elaborazione dei dati in tempo reale resa possibile da Apache Kafka, una piattaforma open source pensata proprio per questo. Si è parlato di come stia cambiando la gestione dei dati in tempo reale, del perché sia importante e di quali siano le prospettive per il futuro
SAP Sapphire 2025: con Joule l'intelligenza artificiale guida app, dati e decisioni
SAP Sapphire 2025: con Joule l'intelligenza artificiale guida app, dati e decisioni
A Madrid SAP rilancia sulla visione di un ecosistema integrato dove app, dati e AI generano un circolo virtuoso capace di affrontare l’incertezza globale. Joule diventa l’interfaccia universale del business, anche oltre il perimetro SAP
Dalle radio a transistor ai Micro LED: il viaggio di Hisense da Qingdao al mondo intero
Dalle radio a transistor ai Micro LED: il viaggio di Hisense da Qingdao al mondo intero
Una delle realtà a maggiore crescita nel mondo dell'elettronica di consumo, Hisense Group, affonda le sue radici nella storica città portuale di Qingdao, famosa per la sua birra. Ed è proprio qui il centro nevralgico dell'espansione mondiale dell'azienda, che sta investendo massicciamente in infrastrutture e ricerca per consolidare ulteriormente la propria leadership tecnologica.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 15-10-2010, 13:10   #1
vankar
Member
 
L'Avatar di vankar
 
Iscritto dal: Jun 2010
Messaggi: 225
[java] riconoscitore linguaggio di programmazione

Buongiorno a tutti. Per un progetto devo realizzare un riconoscitore di linguaggi di programmazione (C, Java, Python almeno). Come input ho il codice sorgente...

come posso fare? o meglio, io preso il codice sorgente, analizzo il lessico, ma come faccio a trovare delle peculiarità fra questi 3 linguaggi in modo efficiente così da riconoscerli in maniera abbastanza stabile?
vankar è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2010, 13:41   #2
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Problema interessante, non ci avevo mai pensato.
In pratica hai un problema di pattern-matching: dato un testo, riconoscere se quel testo rispsetta la sinatssi e la grammatica di uno dei linguaggi formali (Python, Java, C).

Se si potesse, basterebbe passare il testo alle N implementazioni di parser per i rispettivi N linguaggi e analizzare il risultato (n. errori di sintassi incontrati, porzione di testo valido prima del primo errore: questo nel caso il parsing fallisse in tutti e tre i casi; l'aspettativa è che almeno uno riesca).

Purtroppo io non so aiutarti, ma qui nel forum ci sono degli esperti che potrebbero fornirti delle buone idee.
Ciao
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2010, 13:58   #3
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2772
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Se si potesse, basterebbe passare il testo alle N implementazioni di parser per i rispettivi N linguaggi e analizzare il risultato (n. errori di sintassi incontrati, porzione di testo valido prima del primo errore: questo nel caso il parsing fallisse in tutti e tre i casi; l'aspettativa è che almeno uno riesca).
Stessa cosa che è venuta in mente a me.
Se scarichi JavaCC c'è inclusa tra gli esempi la grammatica java da cui generare il parser, per gli altri 2 linguaggi credo si possa trovare.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2010, 14:01   #4
shinya
Senior Member
 
L'Avatar di shinya
 
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
Umh... chissà cosa succede poi se gli dai in pasto uno di questi... http://en.wikipedia.org/wiki/Polyglot_(computing)
shinya è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2010, 14:06   #5
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da shinya Guarda i messaggi
Umh... chissà cosa succede poi se gli dai in pasto uno di questi... http://en.wikipedia.org/wiki/Polyglot_(computing)
OMG
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2010, 14:10   #6
vankar
Member
 
L'Avatar di vankar
 
Iscritto dal: Jun 2010
Messaggi: 225
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Se si potesse, basterebbe passare il testo alle N implementazioni di parser per i rispettivi N linguaggi e analizzare il risultato (n. errori di sintassi incontrati, porzione di testo valido prima del primo errore: questo nel caso il parsing fallisse in tutti e tre i casi; l'aspettativa è che almeno uno riesca).
vabbè, a sto punto prendo il nome del file sorgente, cerco il punto, ed esamino l'estensione... ^^

vabbè... io pensavo invece di fare 3 mappe, una per ciascun linguaggio di programmazione, contenente tutte le parole dei 3 linguaggi. esamino le prime 100 parole del file sorgente (togliendo commenti, "", () e tutte quelle robe là), e faccio una stima della percentuale corretta...

quello con percentuale maggiore è il più probabile... il problema è che sarebbe parecchio pesante, e poco stabile!
vankar è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2010, 14:13   #7
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da vankar Guarda i messaggi
...
quello con percentuale maggiore è il più probabile... il problema è che sarebbe parecchio pesante, e poco stabile!
Parecchio pesante penso di no, perchè dici?
Se con "stabile" intendi che produce risultati poco accurati/affidabili, sono d'accordo.

Quote:
Originariamente inviato da wingman87
Stessa cosa che è venuta in mente a me.
Se scarichi JavaCC c'è inclusa tra gli esempi la grammatica java da cui generare il parser, per gli altri 2 linguaggi credo si possa trovare.
Potrebbe essere un buon approccio? Magari verrebbe fuori qualcosa di carino.

Quote:
vabbè, a sto punto prendo il nome del file sorgente, cerco il punto, ed esamino l'estensione... ^^
Potrebbe anche essere un'idea :P ma se in input invece di un file hai uno stream di caratteri? Ti attacchi
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)

Ultima modifica di banryu79 : 15-10-2010 alle 14:17.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2010, 14:15   #8
vankar
Member
 
L'Avatar di vankar
 
Iscritto dal: Jun 2010
Messaggi: 225
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Parecchio pesante penso di no, perchè dici?
Se con "stabile" intendi che produce risultati poco accurati/affidabili, sono d'accordo.


Potrebbe essere un buon approccio? Magari verrebbe fuori qualcosa di carino.
bè, più pesante che non un parser! e comunque meno affidabile...

il punto è che non penso di poter scrivere il codice del parser...
vankar è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2010, 14:24   #9
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da vankar Guarda i messaggi
bè, più pesante che non un parser! e comunque meno affidabile...

il punto è che non penso di poter scrivere il codice del parser...
Il parser non lo devi mica per forza implementare a mano.
Ti appoggi a un generatore di parser.
Un generatore di parser fa quello che il suo nome suggerisce: gli dai una grammatica in pasto, e lui ti sputa il parser ad hoc.

Il tuo problema diverrebbe quindi quello di specificare le tre grammatiche dei tre linguaggi nel formato accettato come input dallo specifico generatore di parser a cui ti appoggi.

Fai un giro sul web e prova a leggerti qualcosa su JavaCC e Yacc.
Poi torna qua, magari qualche esperto si fa vivo (so che qualcuno qui ha avuto esperienze con questi tools)
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2010, 14:48   #10
vladix
Member
 
L'Avatar di vladix
 
Iscritto dal: Jan 2008
Città: roma
Messaggi: 296
c'e una libreria java ( jmimemagic ) che individua il mime type dei file che potrebbe fare al caso tuo, nn so però se sa riconoscere il sorgente oppure il compilato
Auguri
__________________
Acer 5940G{Intel Core i7 Q720 Quadri motore; 8Gb DDR3; ATI Radeon HD 4650 1024MB; 500Gb hdd}
vladix è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2010, 16:20   #11
vankar
Member
 
L'Avatar di vankar
 
Iscritto dal: Jun 2010
Messaggi: 225
ho avuto un'idea: sto facendo una selezione delle varie keywords dei tre linguaggi:
http://www.lattecafe.net/java/articoli/javakeyword.htm
http://it.wikipedia.org/wiki/C_(ling...#Parole_chiave
http://docs.python.org/release/2.3.5/ref/keywords.html

di modo da eliminare quelle che ci sono in tutti e 3 i linguaggi di programmazione. Sucessivamente pensavo di fare una ricerca nel file sorgente di alcune di queste, procedendo ad eliminare le alternative, determinando quale potrebbe essere il linguaggio di programmazione con il quale è stato scritto il codice sorgente.

Questo ovviamente con l'ipotesi che sia stato messo in input almeno uno dei tre linguaggi.

Poi devo varare alcune strategie per gestire frammenti di codice tipo:
"{}";
" ";
etc...

è meno pesante che compilarli tutti e 3, un po' impreciso, ma dovrebbe funzionare, che dite?? altre proposte?
vankar è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2010, 16:46   #12
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da vankar Guarda i messaggi
è meno pesante che compilarli tutti e 3, un po' impreciso, ma dovrebbe funzionare, che dite?? altre proposte?
Guarda che fare il parsing di un sorgente non significa compilarlo.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2010, 17:01   #13
vankar
Member
 
L'Avatar di vankar
 
Iscritto dal: Jun 2010
Messaggi: 225
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Guarda che fare il parsing di un sorgente non significa compilarlo.
sì, bè... intendevo quello per compilare ^^...

dici che potrebbe funzionare come metodo comunque?
vankar è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2010, 17:40   #14
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
edit
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2010, 17:58   #15
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da vankar Guarda i messaggi
dici che potrebbe funzionare come metodo comunque?
Immagino dipenda cosa tu intendi per "funzionare".

Procediamo con ordine: lo scopo è implementare un "riconoscitore di linguaggio".
Io un "riconoscitore di linguaggio" lo intendo così:
Input: uno stream di caratteri (del testo) arbitrario.
Output: una stringa che contenga il testo "sconosciuto" se l'input non appartiene a uno degli N linguaggi supportati dal riconoscitore, oppure una stringa che contenga il nome del linguaggio riconosciuto.

Già questo implica che bisogna definire i termini secondo i quali un dato testo T viene considerato come codice sorgente valido per il dato linguaggio L(T) e i termini secondo i quali non è considerato come un codice sorgente valido.

Ad esempio: il riconoscitore riconoscerà solo sorgenti sintatticamente validi? Oppure riconoscerà anche sorgenti contenenti errori di sintassi?

Come valuti se un testo arbitrario T è un codice sorgente valido, scritto in un dato linguaggio L? La risposta ovvia (dato che i linguaggi di programmazione sono linguaggi formali) sarebbe verificare se T è ben formato rispetto la grammatica di L.

Però nulla ti vieta di usare un qualsiasi approccio ti permetta di risolvere il tuo problema; solo che risolvere il problema significa soddisfare i requisiti del problema dunque (secondo me) dovresti prima interrogarti su quali siano i requisiti da soddisfare (che o ti sono stati dati, o puoi scegliere tu).

Altrimenti è difficile dirti qualcosa di concreto, almeno per me.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2010, 23:30   #16
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 12784
Secondo me servono i 3 parser dei 3 linguaggi di programmazione, in particolare una soluzione forse "banale" sarebbe quella di richiamare ed appoggiarti direttamente ai 3 compilatori e farti ritornare il risultato della compilazione.

Comunque pensandoci un po' credo che ognuno di quei 3 linguaggi ha caratteristiche peculiari che possono aiutarti.

Ad esempio un file Java ha sicuramente la keyword class e già da questo puoi fare delle ipotesi.

Un file C potrebbe avere delle direttive #include e comunque sicuramente ci sono delle parentesi graffe a delimitare i blocchi di codice (cosa che python non ha).

In ogni caso il codice C deve essere all'interno di una funzione, non può essere scritto a se stante, specialmente se è costituito da un solo file ci deve essere un main da qualche parte.

Questi tuttavia sono metodi "euristici" che possono servire più per andare ad esclusione. Se il tuo obiettivo è dire se un dato testo è un programma Java funzionante, allora non vedo altro modo che darlo in pasto al suo compilatore.

Se invece ti concentri solo sulle keyword puoi solamente dire che il file di testo contiene determinate keyword, ma non è detto che poi il contenuto del file di testo sia un programma funzionante.

Ultima modifica di WarDuck : 15-10-2010 alle 23:33.
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 16-10-2010, 08:50   #17
vankar
Member
 
L'Avatar di vankar
 
Iscritto dal: Jun 2010
Messaggi: 225
Quote:
Originariamente inviato da WarDuck Guarda i messaggi
Se invece ti concentri solo sulle keyword puoi solamente dire che il file di testo contiene determinate keyword, ma non è detto che poi il contenuto del file di testo sia un programma funzionante.
sì, ma non ho direttive in merito... Quindi penso sia lecito supporre che l'input dato sia funzionante in uno dei tre linguaggi. Per avere comunque maggiore solidità dovrei aggiungere un controllo sintattico, ma a questo punto davvero do in pasto a tutti e tre i compilatori. Dunque creo farò così:
1. controllo di estensione del file sorgente. (se mi viene dato un file .java, so che è scritto in java, anche se non compila)
2. riduco il codice così da ottenere una lista di parole "chiave";
3. inserisco le parole chiave "uniche" (quelle che si usano solo in uno dei 3 linguaggi) in 3 liste (rispettivamente java, c, python);
4. effettuo la ricerca delle parole delle 3 liste nell'elenco ottenuto dall'input;
5. Il programma da comunque una stima di quale sia il linguaggio che con maggior probabilità è stato utilizzato, per aggior completezza bisognerebbe creare anche un analizzatore sintattico.

punti deboli:
a. non è molto sicuro, ma da un'idea generale;
b. se viene messo in input un linguaggio sconosciuto, potrebbe uscire in output uno dei tre linguaggi;
c. classifica frammenti di codice non compilabili;
vankar è offline   Rispondi citando il messaggio o parte di esso
Old 16-10-2010, 11:54   #18
VICIUS
Senior Member
 
L'Avatar di VICIUS
 
Iscritto dal: Oct 2001
Messaggi: 11471
Non è tanto diverso dal capire in che lingua è scritto un documento di testo. Usa NGramJ http://ngramj.sourceforge.net/. Cancelli i profili per le lingue e ci metti i tuoi per linguaggi di programmazione ed hai finito. Per capire come creare profili ed aggiungerli alla lista leggi questo: http://blog.afterthedeadline.com/201...g-with-ngramj/

Ho fatto una prova veloce con solo java e php:
Codice:
java -jar cngram.jar -lang2 shared.make_timestamp.php 
speed: php:0.857 java:0.000 --:0.143 .. java:0.000 |0.0E0 |0.0E0 dt=1676

java -jar cngram.jar -lang2 CharTrie.java 
speed: java:0.970 php:0.000 --:0.030 .. php:0.000 |0.0E0 |0.0E0 dt=3055
Con profili creati da corpus da circa 100k è già molto preciso a dire quale linguaggio è.
VICIUS è offline   Rispondi citando il messaggio o parte di esso
Old 16-10-2010, 12:54   #19
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da VICIUS Guarda i messaggi
Non è tanto diverso dal capire in che lingua è scritto
un documento di testo. Usa NGramJ http://ngramj.sourceforge.net/...
Fico. Questo è un approccio "smart"
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 16-10-2010, 14:16   #20
vankar
Member
 
L'Avatar di vankar
 
Iscritto dal: Jun 2010
Messaggi: 225
l'idea sarebbe comunque che io trovi un metodo efficiente per risolvere un problema, senza "commissionarlo troppo" a pacchetti o software esterni...
vankar è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


La rivoluzione dei dati in tempo reale è in arrivo. Un assaggio a Confluent Current 2025 La rivoluzione dei dati in tempo reale è ...
SAP Sapphire 2025: con Joule l'intelligenza artificiale guida app, dati e decisioni SAP Sapphire 2025: con Joule l'intelligenza arti...
Dalle radio a transistor ai Micro LED: il viaggio di Hisense da Qingdao al mondo intero Dalle radio a transistor ai Micro LED: il viaggi...
Meglio un MacBook o un PC portatile con Windows, oggi? Scenari, dubbi e qualche certezza Meglio un MacBook o un PC portatile con Windows,...
realme GT7: un "flaghsip killer" concreto! La recensione realme GT7: un "flaghsip killer" concr...
ASRock ammette i problemi del BIOS, ma p...
Elon Musk annuncia i nuovi piani per la ...
Mafia: The Old Country in azione in un v...
Pulizie automatiche e senza grovigli: Ro...
Cybersecurity: così CrowdStrike p...
Rotterdam mette alla prova Artemis EF-12...
MSI MPG X870I Edge TI WiFi: la motherboa...
Download.it salva FilePlanet: oltre 120....
WhatsApp sta per introdurre gli username...
Successo per il primo test della PEC eur...
Cosa cambia con la partnership fra Pure ...
Sony abbandona la produzione interna deg...
Il futuro degli aerei elettrici passa pe...
Sentenza blocca i dazi di Trump: "I...
Xiaomi SU7 è super popolare nei m...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 18:41.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www2v