Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori
Il primo headset open-back della linea INZONE arriva a 200 euro con driver derivati dalle cuffie da studio MDR-MV1 e un peso record di soli 199 grammi
Nutanix cambia pelle: dall’iperconvergenza alla piattaforma full stack per cloud ibrido e IA
Nutanix cambia pelle: dall’iperconvergenza alla piattaforma full stack per cloud ibrido e IA
Al .NEXT 2026 di Chicago, Nutanix ha mostrato quanto sia cambiata: una piattaforma software che gestisce VM, container e carichi di lavoro IA ovunque, dall’on-premise al cloud pubblico. Con un’esecuzione rapidissima sulle partnership e sulla migrazione da VMware
Recensione Xiaomi Pad 8 Pro: potenza bruta e HyperOS 3 per sfidare la fascia alta
Recensione Xiaomi Pad 8 Pro: potenza bruta e HyperOS 3 per sfidare la fascia alta
Xiaomi Pad 8 Pro adotta il potente Snapdragon 8 Elite all'interno di un corpo con spessore di soli 5,75 mm e pannello LCD a 144Hz flicker-free, per un tablet che può essere utilizzato con accessori dedicati di altissima qualità. Fra le caratteristiche esclusive, soprattutto per chi intende usarlo con la tastiera ufficiale, c'è la modalità Workstation di HyperOS 3, che trasforma Android in un sistema operativo con interfaccia a finestre
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: 2789
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: 12966
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


Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori Sony INZONE H6 Air: il primo headset open-back d...
Nutanix cambia pelle: dall’iperconvergenza alla piattaforma full stack per cloud ibrido e IA Nutanix cambia pelle: dall’iperconvergenza alla ...
Recensione Xiaomi Pad 8 Pro: potenza bruta e HyperOS 3 per sfidare la fascia alta Recensione Xiaomi Pad 8 Pro: potenza bruta e Hyp...
NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abbiamo provato il tris d'assi di NZXT NZXT H9 Flow RGB+, Kraken Elite 420 e F140X: abb...
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz ASUS ROG Swift OLED PG34WCDN recensione: il prim...
Ecovacs presenta la gamma 2026: paviment...
Efficienza energetica fino a 2.000 volte...
Lenovo 360: il programma di canale dell'...
Appena 10.000 qubit per rompere la critt...
Analisi dei transistor durante il funzio...
Attacco informatico a Booking.com: espos...
A quattro mesi dal divieto dei social ne...
NVIDIA GeForce RTX 5060 e 5060 Ti: in ar...
Rebellions, Arm e SK Telecom, nuova alle...
Modernizzazione delle app: Red Hat OpenS...
Nel mirino di Google c'è il back ...
PRAGMATA in bundle con GeForce RTX 5000:...
Le novità MOVA per il 2026: robot e impi...
Windows, stop all'attivazione telefonica...
ASUS porta la serie TUF nel formato Mini...
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: 23:46.


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