Torna indietro   Hardware Upgrade Forum > Software > Programmazione

I nuovi notebook Acer al debutto al Computex 2025
I nuovi notebook Acer al debutto al Computex 2025
Al Computex 2025 di Taipei Acer mostra una completa gamma di soluzioni notebook delle famiglie Swift, Aspire, Predator e Nitro pensati per gli utenti consumer oltre che per coloro che ricercano elevata potenza di elaborazione, per lavorare o per giocare. In base al modello troviamo piattaforme Intel, AMD oppure Qualcomm anche in abbinamento alle nuove GPU NVIDIA GeForce RTX 5000
Nutanix .NEXT: così l'azienda vuole aiutare i clienti a limitare la dipendenza da Broadcom
Nutanix .NEXT: così l'azienda vuole aiutare i clienti a limitare la dipendenza da Broadcom
All'evento globale di Nutanix l'azienda ha presentato una serie di novità mirate a ridurre la dipendenza dalle soluzioni di VMware/Broadcom. Arriva Cloud Native AOS, soluzione che non richiede di appoggiarsi ad hypervisor. Novità per Nutanix Enterprise AI. Potenziata la collaborazione con Pure Storage per uno storage dedicato ad altissime prestazioni
HUAWEI WATCH FIT 4 Pro: lo smartwatch che non ha rivali a questo prezzo!
HUAWEI WATCH FIT 4 Pro: lo smartwatch che non ha rivali a questo prezzo!
HUAWEI è capace di sorprendere ancora e quest’anno lo fa con questo nuovo smartwatch WATCH FIT 4 Pro che coniuga un design elegante e moderno con funzionalità di prim’ordine. Ultra-sottile con display AMOLED, funzionalità avanzate per sport e salute, e un'autonomia fino a 10 giorni.
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: 12780
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


I nuovi notebook Acer al debutto al Computex 2025 I nuovi notebook Acer al debutto al Computex 202...
Nutanix .NEXT: così l'azienda vuole aiutare i clienti a limitare la dipendenza da Broadcom Nutanix .NEXT: così l'azienda vuole aiuta...
HUAWEI WATCH FIT 4 Pro: lo smartwatch che non ha rivali a questo prezzo! HUAWEI WATCH FIT 4 Pro: lo smartwatch che non ha...
Test NIU RQi Sport, vi spieghiamo perché una moto così è perfetta Test NIU RQi Sport, vi spieghiamo perché ...
Start Campus: il datacenter raffreddato dal mare Start Campus: il datacenter raffreddato dal mare
Hideo Kojima morirà, ma la sua cr...
Senti chi parla! Davvero, ora, grazie al...
Tesla sempre peggio in Europa: un'aziend...
Le minacce di Trump funzionano: un altro...
Cosa succede in Amazon? Sconti anomali s...
Flop Call of Duty Warzone Mobile, Activi...
Roborock Qrevo Curv, sconto di 400€ per ...
OLED LG 2024 in sconto su Amazon: 55'' S...
Claude AI inventa una citazione in tribu...
HP Victus con GeForce RTX 4070 e Intel C...
Samsung Galaxy S25 Ultra scende ancora d...
Ancora più giù i prezzi di...
Usare le scorie nucleari per ottenere en...
Dreame L40S Pro Ultra vs Dreame X40 Ultr...
OpenAI Codex scrive codice e lo testa da...
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: 04:21.


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