PDA

View Full Version : Software multipiattaforma


JoJo
29-09-2009, 10:20
Dovrei realizzare un software di controllo per macchine CNC da utilizzare sia in ambiente Windows che in ambiente Linux.

Ho già realizzato tale software, anni fa, in VB6 per l'utilizzo unico su XPE (Windows XP Embedded) e adesso avrei la necessità di realizzare un porting (anche riscrivendolo tutto). Sapreste darmi qualche dritta su che linguaggio utilizzare per scrivere un codice (nativo) unico? Io pensavo al C++ con l'utilizzo di qualche libreria grafica multipiattaforma. Mi sapete dire qualcosa in più?

Ovviamente il software è completamente grafico in quanto è l'interfaccia utente per pilotare la macchina e interagire con la logica del CNC.

Grazie per le risposte, ciao!

banryu79
29-09-2009, 10:31
Ovviamente il software è completamente grafico in quanto è l'interfaccia utente per pilotare la macchina e interagire con la logica del CNC.

Nella tua applicazione hai dunque anche la neccessità di comunicare via seriale con il CNC?

JoJo
29-09-2009, 10:41
Scusate ma ho tralasciato alcune cosette nel primo post:

- il software non pilota direttamente la macchina ma interagisce con la sua logica con un colloquio di rete. Ho già realizzato il software anni fa in Vb6 per girare su XPE. Usa Winsock e molte altre API

- il software deve essere grafico (e orientato verso i touchscreen) in quanto è l'interfaccia utente di pilotaggio della macchina (né più, né meno dei pulsanti e della grafica)

- il software deve poter pilotare dei dispositivi posti sulla RS232, RS422 e RS485

Diciamo che il software, in ambiente Win32 è fatto (anche se mi piacerebbe ricrearlo multipiattaforma), dovrei realizzare la versione per Linux.

tomminno
29-09-2009, 11:43
Scusate ma ho tralasciato alcune cosette nel primo post:

- il software non pilota direttamente la macchina ma interagisce con la sua logica con un colloquio di rete. Ho già realizzato il software anni fa in Vb6 per girare su XPE. Usa Winsock e molte altre API

- il software deve essere grafico (e orientato verso i touchscreen) in quanto è l'interfaccia utente di pilotaggio della macchina (né più, né meno dei pulsanti e della grafica)

- il software deve poter pilotare dei dispositivi posti sulla RS232, RS422 e RS485

Diciamo che il software, in ambiente Win32 è fatto (anche se mi piacerebbe ricrearlo multipiattaforma), dovrei realizzare la versione per Linux.

Credo che in questo caso potresti usare wxWidgets.
Per il touch screen alla fine è solo questione di supporto del sistema operativo, per il software non ci sono differenze.
Il problema è che in ogni caso il software essendo in vb6 va riscritto da 0.

banryu79
29-09-2009, 11:43
Non sono sicuro di aver capito: il tuo software comunica sia via rete, che direttamente via porta seriale?

zulutown
29-09-2009, 12:41
Dovrei realizzare un software di controllo per macchine CNC da utilizzare sia in ambiente Windows che in ambiente Linux.

Ho già realizzato tale software, anni fa, in VB6 per l'utilizzo unico su XPE (Windows XP Embedded) e adesso avrei la necessità di realizzare un porting (anche riscrivendolo tutto). Sapreste darmi qualche dritta su che linguaggio utilizzare per scrivere un codice (nativo) unico? Io pensavo al C++ con l'utilizzo di qualche libreria grafica multipiattaforma. Mi sapete dire qualcosa in più?

Ovviamente il software è completamente grafico in quanto è l'interfaccia utente per pilotare la macchina e interagire con la logica del CNC.

Grazie per le risposte, ciao!

Ciao
su Java puoi scrivere parti del codice "comuni" e multipiattaforma e parti "native" ad esempio in C++

credo che con .NET tu possa far la stessa cosa.. scrivi in VB.Net (che probabilmente già conosci) la parte che non si interfacia al sistema operativa.. per windows ricicli il codice nativo che già avevi e per linux lo scrivi ad hoc, magari in C++, mentre la parte Vb.NET dovrebbe girarti su Mono

comunque, il primo passo che dovresti fare sarebbe cercare di slegare logicamente la parte "nativa" da quella "non nativa"..

2186
30-09-2009, 11:02
ciao allora se vuoi un linguaggio di programmazione multipiattaforma è solo ed escusivamente JAVA per quello che conosco io... JAVA essendo basato su una Virtual Machine si crea indipendentemente dal sistema i prori registri set istruzioni etc...
invece se usi il c++ non lo è dato che in linux ad esempio possiamo fare accessi in kernel mode, mentre in windows è tutto bloccato... mi spiegop meglio: in c++ se stai creando un'applicazione che comunichi con la seriale in linux basta scrivere e leggere all'indirizzo di mapping della seriale, la stessa cosa era possibile fino a windows 98 poi con xp vista seven sono diventati accessi indiretti e quindi ti servirebbe un device driver che ti permetta di comunicare direttamente con la periferica, il che quindi fa diventare non multipiattaforma il software ma ad hoc per un determinato os.
io uso anche il .net e ti dico che è favoloso... ma ripeto se vuoi il massimo della scalabilità tra i vari os non ti resta che usare JAVA ed i suoi derivati... come compilatore builder etc per java ti consiglio ECLIPSE che va veramente bene e supporta anche c++ e altri linguaggi...
ovviamente tieni a mente che più è scalabile un software minore sarà la sua ottimizzazione, ovvero: se scrivi lo stesso prog in assemby per il processore in uso sarà una scheggia ma usabile solo su quella macchina, viceversa in JAVA sarà relativamente piu lento (dipende da cosa devi fare, se son cavolate la differenza è apri a zero) ma usufruibile senza intoppi da tutti :-P

ciao :)

tomminno
30-09-2009, 11:56
ciao allora se vuoi un linguaggio di programmazione multipiattaforma è solo ed escusivamente JAVA per quello che conosco io... JAVA essendo basato su una Virtual Machine si crea indipendentemente dal sistema i prori registri set istruzioni etc...


Veramente non è esatto: Java è write-once run-everywhere, C++ è write-once compile-everywhere.
Altrimenti come spiegheresti l'esistenza di QT e wxWidgets che funzionano su più piattaforme?
E come spiegheresti la JVM che è compilata per tutte le piattaforme su cui esiste Java?


invece se usi il c++ non lo è dato che in linux ad esempio possiamo fare accessi in kernel mode, mentre in windows è tutto bloccato... mi spiegop meglio: in c++ se stai creando un'applicazione che comunichi con la seriale in linux basta scrivere e leggere all'indirizzo di mapping della seriale, la stessa cosa era possibile fino a windows 98 poi con xp vista seven sono diventati accessi indiretti e quindi ti servirebbe un device driver che ti permetta di comunicare direttamente con la periferica, il che quindi fa diventare non multipiattaforma il software ma ad hoc per un determinato os.


Veramente non c'è bisogno di arrivare a tanto per comunicare su una seriale.
Se prendi ad esempio la libreria wxCTB, consente di dialogare con una seriale su Windows, Linux e OSX, usando le api in user space messe a disposizione dai vari sistemi operativi.

2186
30-09-2009, 14:41
Veramente non è esatto: Java è write-once run-everywhere, C++ è write-once compile-everywhere.
Altrimenti come spiegheresti l'esistenza di QT e wxWidgets che funzionano su più piattaforme?
E come spiegheresti la JVM che è compilata per tutte le piattaforme su cui esiste Java?



Veramente non c'è bisogno di arrivare a tanto per comunicare su una seriale.
Se prendi ad esempio la libreria wxCTB, consente di dialogare con una seriale su Windows, Linux e OSX, usando le api in user space messe a disposizione dai vari sistemi operativi.


in risposta alla prima:
1) l'esistenza delle qt e delle wxWidgets che sono multipiattaforma non implica che lo sia anche il linguaggio adottato... ribadisco C++ non è multipiattaforma, cmq le parole contano poco: prendi un prog in c++ fatto per linux e mettilo su win e provalo a compilare poi vedrai che risate :D
2) JAVA lo già detto che è basata su una JVM e quindi multipiattaforma :D it's easy

in risposta alla seconda:
1) se usi librerie già fatte ti può andare bene se non hai da fare controlli in tempo reale critici o roba assurdamente veloce... ma se vuoi andare sul professionale implementi un codice asm nel sorgente

2)qui premetto che non ho mai usato le wxCTB, ma sempre scritto in asm o c++... cmq quello che vorrei sapere è:
se scrivo il sorgente per linux (ad esempio) usando queste librerie e successivamente compilandolo in ambienti diversi quindi sun linux win bsd unix etc... il programma viene complitao senza errori?
mio pensiero: non penso venga senza errori anzi... ogni os ha una propria interfaccia di gestione degli accessi quindi bisognerebbe usare librerie diverse in base al sitema... indi ribarirebbe il fatto che il C++ non è scalabile da un os ad un'altro :-P dato che è impossibile che 2 os diversi possano utilizzare in maniere identica delle librerie a meno che non siano due os basati sullo stesso motore :-P

cmq aspetto una risp dato che nell'ultimo punto ho dei dubbi :-P
ciao :)

tomminno
30-09-2009, 15:31
in risposta alla prima:
1) l'esistenza delle qt e delle wxWidgets che sono multipiattaforma non implica che lo sia anche il linguaggio adottato... ribadisco C++ non è multipiattaforma, cmq le parole contano poco: prendi un prog in c++ fatto per linux e mettilo su win e provalo a compilare poi vedrai che risate :D


Ne puoi scrivere a sfare di programmi C++ che compilano su tutte le piattaforme, anche quelle per cui non esiste la JVM.
Tra l'altro vanno inclusi anche tutti i programmi fatti con QT e wx.
C++ è uno standard internazionale, praticamente qualunque archiettura ha un compilatore per tale linguaggio.


2) JAVA lo già detto che è basata su una JVM e quindi multipiattaforma :D it's easy


Si vai a vedere le incompatibilità varie con la versione ME...


in risposta alla seconda:
1) se usi librerie già fatte ti può andare bene se non hai da fare controlli in tempo reale critici o roba assurdamente veloce... ma se vuoi andare sul professionale implementi un codice asm nel sorgente


Che vuol dire professionale?
Se non programmi in assembly non sei un professionista?
Quindi anche uno che sviluppa in Java non è un professionista?
Ho lavorato nel settore audio e anche lì ti ritrovi ad usare l'assembly solo in casi in cui ti accorgi che qualcuno del reparto commerciale ha lesinato sulla potenza del micro per risparmiare pochi euro (facendone spendere molti di più nello sviluppo), per il resto è tutto C.


2)qui premetto che non ho mai usato le wxCTB, ma sempre scritto in asm o c++... cmq quello che vorrei sapere è:
se scrivo il sorgente per linux (ad esempio) usando queste librerie e successivamente compilandolo in ambienti diversi quindi sun linux win bsd unix etc... il programma viene complitao senza errori?


Già, esiste il preprocessore.


mio pensiero: non penso venga senza errori anzi... ogni os ha una propria interfaccia di gestione degli accessi quindi bisognerebbe usare librerie diverse in base al sitema... indi ribarirebbe il fatto che il C++ non è scalabile da un os ad un'altro :-P dato che è impossibile che 2 os diversi possano utilizzare in maniere identica delle librerie a meno che non siano due os basati sullo stesso motore :-P

cmq aspetto una risp dato che nell'ultimo punto ho dei dubbi :-P
ciao :)

il seguente codice restituisce il numero di processori presenti sulla macchina su un discreto numero di sistemi:

UInt32 OS::GetNumProcessors()
{
#if (__Win32__)
static UInt32 numCPUs = 0;
if (numCPUs == 0)
{
SYSTEM_INFO theSystemInfo;
::GetSystemInfo(&theSystemInfo);

numCPUs = (UInt32)theSystemInfo.dwNumberOfProcessors;
}
return numCPUs;
#endif

#if (__MacOSX__ || __FreeBSD__)
int numCPUs = 1;
size_t len = sizeof(numCPUs);
int mib[2];
mib[0] = CTL_HW;
mib[1] = HW_NCPU;
(void) ::sysctl(mib,2,&numCPUs,&len,NULL,0);
if (numCPUs < 1)
numCPUs = 1;
return (UInt32) numCPUs;
#endif

#if(__linux__ || __linuxppc__)
static UInt32 numCPUs = 0;
if (numCPUs == 0)
{
char cpuBuffer[8192] = "";
StrPtrLen cpuInfoBuf(cpuBuffer, sizeof(cpuBuffer));
FILE *cpuFile = ::fopen( "/proc/cpuinfo", "r" );
if (cpuFile)
{ cpuInfoBuf.Len = ::fread(cpuInfoBuf.Ptr, sizeof(char), cpuInfoBuf.Len, cpuFile);
::fclose(cpuFile);
}

StringParser cpuInfoFileParser(&cpuInfoBuf);
StrPtrLen line;
StrPtrLen word;
UInt32 numCPUs = 0;

while( cpuInfoFileParser.GetDataRemaining() != 0 )
{
cpuInfoFileParser.GetThruEOL(&line); // Read each line
StringParser lineParser(&line);
lineParser.ConsumeWhitespace(); //skip over leading whitespace

if (lineParser.GetDataRemaining() == 0) // must be an empty line
continue;

lineParser.ConsumeUntilWhitespace(&word);

if ( word.Equal("processor") ) // found a processor as first word in line
{ numCPUs ++;
}
}

if (numCPUs == 0)
numCPUs = 1;
}

return numCPUs;
#endif

#if(__solaris__)
{
static UInt32 numCPUs = sysconf(_SC_NPROCESSORS_ONLN); // Only ever called once

if (numCPUs <= 0)
numCPUs = 1;

return numCPUs;
}
#endif

#if(__sgi__)
UInt32 numCPUs = 0;

numCPUs = sysconf(_SC_NPROC_ONLN);

return numCPUs;
#endif

banryu79
30-09-2009, 16:00
#if(__linux__ || __linuxppc__)
static UInt32 numCPUs = 0;
if (numCPUs == 0)
{
char cpuBuffer[8192] = "";
StrPtrLen cpuInfoBuf(cpuBuffer, sizeof(cpuBuffer));
FILE *cpuFile = ::fopen( "/proc/cpuinfo", "r" );
if (cpuFile)
{ cpuInfoBuf.Len = ::fread(cpuInfoBuf.Ptr, sizeof(char), cpuInfoBuf.Len, cpuFile);
::fclose(cpuFile);
}

StringParser cpuInfoFileParser(&cpuInfoBuf);
StrPtrLen line;
StrPtrLen word;
UInt32 numCPUs = 0;

while( cpuInfoFileParser.GetDataRemaining() != 0 )
{
cpuInfoFileParser.GetThruEOL(&line); // Read each line
StringParser lineParser(&line);
lineParser.ConsumeWhitespace(); //skip over leading whitespace

if (lineParser.GetDataRemaining() == 0) // must be an empty line
continue;

lineParser.ConsumeUntilWhitespace(&word);

if ( word.Equal("processor") ) // found a processor as first word in line
{ numCPUs ++;
}
}

if (numCPUs == 0)
numCPUs = 1;
}

return numCPUs;
#endif


Ammazza quanto e' lunga la versione per linux :eek:

tomminno
30-09-2009, 16:23
Ammazza quanto e' lunga la versione per linux :eek:

Secondo me quel pezzo non è scritto proprio bene...
Si potrebbe ottimizzare tantissimo come numero di righe usando meglio il C++, alla fine si tratta di contare quante sono le righe che cominciano con "processor" all'interno del file /proc/cpuinfo.
Questo mi sembra faccia le stesse cose:

static UInt32 numCPUs = 0;
if (numCPUs == 0)
{
ifstream cpuinfo("/proc/cpuinfo");
if (cpuinfo.is_open())
{
string line;
while(getline(ifs, line))
{
while(line.find(" ") == 0)
line = line.substr(1);
if (line.find("processor") == 0)
++numCPUs;
}
}
if (numCPUs == 0)
numCPUs = 1;
}
return numCPUs;

E' bello notare come tutti gli altri sistemi operativi abbiano un'API per avere il numero di processori sulla macchina.

banryu79
30-09-2009, 17:04
E' bello notare come tutti gli altri sistemi operativi abbiano un'API per avere il numero di processori sulla macchina.
Più che bello, casca proprio l'occhio. Ma non vuol dire nulla, su un singolo caso. Più che altro, che fine avrà fatto Jojo?

2186
30-09-2009, 17:09
1) non intendo dire che se uno non usa asm n on sia un professionista, ma semplicemente che se lo usi di sicuro lo sei :-P dato che.... (non penso ci voglia una spiegazione o motivo... lo si intuisce)
2)un conto è restituire la lista dei processi o il suo numero un altro è lavorare in maniera pesante su registri, ram, tread, periferiche, e quant'altro... e ribadisco che non esite un linguaggio oltre al JAVA (di quelli che io conosca) che sia in grado di fungere su qualsiasi piattaforme dato che ha la la sua VM che gli facilita la vita e rendendo il sorgente esportabile in qualsiasi os... un codice in C++ molto difficilmente lo si può portare da un os ad un altro e farlo fungere senza metterci le lani su.... (anche se cambiare poche cose ma le si devono cambiare) con java SI! personalmete sperimentato con: debian lenny ubuntu opensun10 freebsd xp vista seven server03 comprensive tutte le versioni 32 e 64 bit ed i programmi fungono a prima botta :D
3)incompatibilità varie con la versione ME... purtoppo non ne sono informato quindi mi fido di quello che dici.
4)quando dici di risparmiare... beh... forse parli così solo perchè non ti sei posto mai la domanda, o perlomeno fatto 2 conti, su cosa significhi risparmiare anche solo 20 centesimi sul singolo chip... spendere 3gg in più per un software costa molto meno che pagare 20cent in più per 1000000000 di chip che usi (ovviamente vale il discorso per un azienda importate, altrimenti è stato un balengo a riparmiare per 2€ su una spesa di 100pz)

5)non mi hai ancora risposto ad una domanda... se uso le wxCTB, e faccio un prog sotto linux... poi se passo il sorgente in win e lo compilo, viene compilato senza errori? se così fosse allora... :) sarei molto contento sia di aver imparato una cosa nuova, sia che mi si semplifica la vita da oggi in avanti :-P

PS: ho avuto modo di lavorare nel settore DSP ed effettivamente si utilizza quasi sempre C, ma io in particolare usavo mathlab e VHDL e quando c'èerano sorgenti da autocorrelare o filrare tramite IR IIR o altre cose simili ti garantisco che si progettava in C, poi si usava un tool che convertiva in asm e si ottimizzava l'asm per via circuitale tramite l'ISE (io usavo quello della XILINX)

cmq grazie ancora della chiacchierata :)
ciao :)

banryu79
30-09-2009, 17:13
1) non intendo dire che se uno non usa asm n on sia un professionista, ma semplicemente che se lo usi di sicuro lo sei :-P dato che.... (non penso ci voglia una spiegazione o motivo... lo si intuisce)

Dicesi: leggenda metropolitana. Anzi mi correggo, dicesi: affermazione basata sul niente.
Ora, visto che non capisco affermazioni del genere, ti chiedo: puoi dirmi quale e' la definizione di "professionista"?

2186
30-09-2009, 17:48
Dicesi: leggenda metropolitana. Anzi mi correggo, dicesi: affermazione basata sul niente.
Ora, visto che non capisco affermazioni del genere, ti chiedo: puoi dirmi quale e' la definizione di "professionista"?

allora la definizione di professionista la puoi tranquillamente trovare tra wikipedia e google :-P
per quanto riguarda il discorso dell'assembly ora mi spiego...
per usare il linguaggio asm non è come usare il c++ o vb o java delphi e via discorrendo... per usare in maniera corretta l'asm bisogna conoscere a fondo l'achitettura del controllore da programmare, quindi nonchè una buona conoscenza di sistemistica, controlli, elettronica e dulcis in "findus" :D anche un minimo di programmazione.... ora se sei in grado di conoscere vita morte e miracoli dell'architettura per cui stai sviluppando un software sigifica che non sei uno quaquaraqà.... anzi....per non parlare poi di ADA e VHDL (o verilog) meno complessi dell'asm e simili al c ma di gran lunga più complessi dato che per fare una buona struttura si deve conoscere a menadito la struttura interna del chip e quindi anche come lui stesso implementa le funzioni da noi scritte....

insomma spero di essermi spiegato :-P
ciao :)

tomminno
30-09-2009, 18:35
1) non intendo dire che se uno non usa asm n on sia un professionista, ma semplicemente che se lo usi di sicuro lo sei :-P dato che.... (non penso ci voglia una spiegazione o motivo... lo si intuisce)


L'Assembly è un linguaggio come un altro.
Oltretutto di Assembly ce ne sono tanti quante sono le architetture in circolazione


2)un conto è restituire la lista dei processi o il suo numero un altro è lavorare in maniera pesante su registri, ram, tread, periferiche, e quant'altro...


Registri? Ram? Periferiche? In Java?


e ribadisco che non esite un linguaggio oltre al JAVA (di quelli che io conosca) che sia in grado di fungere su qualsiasi piattaforme dato che ha la la sua VM che gli facilita la vita e rendendo il sorgente esportabile in qualsiasi os... un codice in C++ molto difficilmente lo si può portare da un os ad un altro e farlo fungere senza metterci le lani su.... (anche se cambiare poche cose ma le si devono cambiare)


Se ne sei convinto buon per te, sta di fatto che la realtà è un'altra.


con java SI! personalmete sperimentato con: debian lenny ubuntu opensun10 freebsd xp vista seven server03 comprensive tutte le versioni 32 e 64 bit ed i programmi fungono a prima botta :D


E io potrei anche dirti che la stessa cosa accade anche in C++, esistono là fuori uno scatafascio di software scritti in C++ che funzionano praticamente ovunque e non è che hanno scritto un programma diverso per ogni sistema operativo.


4)quando dici di risparmiare... beh... forse parli così solo perchè non ti sei posto mai la domanda, o perlomeno fatto 2 conti, su cosa significhi risparmiare anche solo 20 centesimi sul singolo chip... spendere 3gg in più per un software costa molto meno che pagare 20cent in più per 1000000000 di chip che usi (ovviamente vale il discorso per un azienda importate, altrimenti è stato un balengo a riparmiare per 2€ su una spesa di 100pz)


3gg? :asd:
Hai idea di cosa significhi sviluppare un firmware su un sample per poi scoprire che l'hardware di produzione se va bene avrà la metà della ram e una cpu che viagga a 3/4?


5)non mi hai ancora risposto ad una domanda... se uso le wxCTB, e faccio un prog sotto linux... poi se passo il sorgente in win e lo compilo, viene compilato senza errori? se così fosse allora... :) sarei molto contento sia di aver imparato una cosa nuova, sia che mi si semplifica la vita da oggi in avanti :-P


Certo. wxCTB (al di là del nome non hanno nessuna dipendenza dalle wxWidgets) semplicemente usano le funzioni messe a disposizione dal sistema operativo, se sei su Linux il preprocessore abilita la compilazione della parte Linux, e così analogamente avviene su Windows.
Prendi il sorgente ricompili e via.


PS: ho avuto modo di lavorare nel settore DSP ed effettivamente si utilizza quasi sempre C, ma io in particolare usavo mathlab e VHDL e quando c'èerano sorgenti da autocorrelare o filrare tramite IR IIR o altre cose simili ti garantisco che si progettava in C, poi si usava un tool che convertiva in asm e si ottimizzava l'asm per via circuitale tramite l'ISE (io usavo quello della XILINX)


Lo so ci sono passato, ma le routine da ottimizzare in assembly erano fortunatamente poche.


cmq grazie ancora della chiacchierata :)
ciao :)

Di niente! :)

tomminno
30-09-2009, 18:43
allora la definizione di professionista la puoi tranquillamente trovare tra wikipedia e google :-P
per quanto riguarda il discorso dell'assembly ora mi spiego...
per usare il linguaggio asm non è come usare il c++ o vb o java delphi e via discorrendo... per usare in maniera corretta l'asm bisogna conoscere a fondo l'achitettura del controllore da programmare, quindi nonchè una buona conoscenza di sistemistica, controlli, elettronica e dulcis in "findus" :D anche un minimo di programmazione.... ora se sei in grado di conoscere vita morte e miracoli dell'architettura per cui stai sviluppando un software sigifica che non sei uno quaquaraqà.... anzi....per non parlare poi di ADA e VHDL (o verilog) meno complessi dell'asm e simili al c ma di gran lunga più complessi dato che per fare una buona struttura si deve conoscere a menadito la struttura interna del chip e quindi anche come lui stesso implementa le funzioni da noi scritte....

insomma spero di essermi spiegato :-P
ciao :)

Ti sfiderei a conoscere come il BPT di un processore ad esecuzione speculativa elabora quello che hai scritto in C.
Semplicemente impossibile, oltre che decisamente inutile.

Direi che, stando alla tua definizione di professionista, in circolazione nel nostro settore non ce ne sia nemmeno uno ;)

2186
30-09-2009, 18:52
ciao :) allora:
1)sono veramente contento che esistano le wxCTB!!!!! se è come dici corro subito a documentarmi perchè mi renderebbero la vita vermanete piu facileeee grazie per avermi messo a conoscenza della loro esistenza :D
2)mi spiace ma l'assembly non è un linguagggio come un altro... oserei dire che è IL LINGUAGGIO... e quello che puoi fare con quello te lo puoi sognare con gli altri... (a meno di implementare ad esmpio in un sorgente una porzione in asm stesso per fare la particolare operazione richiesta :D )
3)Registri? Ram? Periferiche? In Java? esatto proprio per questo dicevo che dipende cosa devi fare... nel momento in cui devi lavorare con quei componenti non userai mai java... ma non perchè non sia buono, ma semplicemente perchè non farà quello che vorrai e come lo vorrai soprattutto :)

ciao :) :D :)

2186
30-09-2009, 19:03
Ti sfiderei a conoscere come il BPT di un processore ad esecuzione speculativa elabora quello che hai scritto in C.
Semplicemente impossibile, oltre che decisamente inutile.

Direi che, stando alla tua definizione di professionista, in circolazione nel nostro settore non ce ne sia nemmeno uno ;)

ripeto non è la mia definizione.... la definizione la trovi tra google e wikipedia... il discorso è basato su una deduzione logica ovvero:
"dato che per conoscere bene l'assembly e quindi tutto quello che vi è dietro, è al quanto ovvio che non si sia di primo pelo, cosa che non si può dire al contrario dato che anche un bimbo se vuole inizia a programmare in vb/delphi/c/c++/java etc.. cosa non fattibile in asm"

cdimauro
30-09-2009, 20:47
allora la definizione di professionista la puoi tranquillamente trovare tra wikipedia e google :-P
per quanto riguarda il discorso dell'assembly ora mi spiego...
per usare il linguaggio asm non è come usare il c++ o vb o java delphi e via discorrendo... per usare in maniera corretta l'asm bisogna conoscere a fondo l'achitettura del controllore da programmare, quindi nonchè una buona conoscenza di sistemistica, controlli, elettronica e dulcis in "findus" :D anche un minimo di programmazione.... ora se sei in grado di conoscere vita morte e miracoli dell'architettura per cui stai sviluppando un software sigifica che non sei uno quaquaraqà.... anzi....per non parlare poi di ADA e VHDL (o verilog) meno complessi dell'asm e simili al c ma di gran lunga più complessi dato che per fare una buona struttura si deve conoscere a menadito la struttura interna del chip e quindi anche come lui stesso implementa le funzioni da noi scritte....

insomma spero di essermi spiegato :-P
ciao :)
Ti sei spiegato, ma non concordo. Si può programmare discretamente in assembly conoscendo lo stretto indispensabile per risolvere il problema a cui stai lavorando.
2)mi spiace ma l'assembly non è un linguagggio come un altro... oserei dire che è IL LINGUAGGIO... e quello che puoi fare con quello te lo puoi sognare con gli altri... (a meno di implementare ad esmpio in un sorgente una porzione in asm stesso per fare la particolare operazione richiesta :D )
IL linguaggio per eccellenza è quello macchina: l'UNICO col quale puoi fare veramente di tutto senza scendere a compromessi.

2186
30-09-2009, 21:26
Ti sei spiegato, ma non concordo. Si può programmare discretamente in assembly conoscendo lo stretto indispensabile per risolvere il problema a cui stai lavorando.

IL linguaggio per eccellenza è quello macchina: l'UNICO col quale puoi fare veramente di tutto senza scendere a compromessi.

si vero su questo sono daccordo anche io :-P :)
anche se quando intendo programmare in asm intendo vermante programmare e non solo conoscere quei set comandi che ti servono nello specifico...
ciau :)

cdimauro
01-10-2009, 07:06
Per me programmare in assembly, come per qualunque altro linguaggio, significa risolvere i problemi che mi vengono sottoposti. ;)

banryu79
01-10-2009, 08:28
3) Registri? Ram? Periferiche? In Java? esatto proprio per questo dicevo che dipende cosa devi fare... nel momento in cui devi lavorare con quei componenti non userai mai java... ma non perchè non sia buono, ma semplicemente perchè non farà quello che vorrai e come lo vorrai soprattutto :)

Ma appunto non è il linguaggio che non te lo permette, attenzione, ma solo la sa implementazione. Quando programmi in Java, come target hai una Virtual Machine.
Con Java in quanto linguaggio ci puoi scrivere (e si sta facendo) anche un sitema operativo (vedi JNode (http://www.jnode.org/node/1)).

Inoltre: un programmatore risolve problemi.
Sono i problemi che deve risolvere e i requisiti che essi determinano per la soluzione a determinare il preciso livello di astrazione al quale il programmatore deve operare.
E questo non ha niente a che vedere con la professionalità; sono solo ambiti diversi di competenze (e domini di conoscenza diversi).
La professionalità di un programmatore si misura in base alla sua capacità di risolvere i problemi per i quali è richiesta la sua opera. Se i problemi che deve risolvere richiedono l'uso del linguaggio assembly e la conscenza minuziosa di una specifica architettura, bene, quello deve sapere; viceversa se i problemi da risolvere richiedono l'uso di un linguaggio di alto livello e la conoscenza minuziosa di alcune librerie, bene, quello deve sapere.
A volte poi capita di avere bisogno di risolvere problemi che richiedono competenze "trasversali": bene, quelle competenze bisogna avere.
Non si può ogni volta "assolutizzare": esistono diversi strati o livelli di astrazione dalla macchina nuda & cruda e diverse "brache" di sapere: inutile e privo di fondamento dire che un pezzo del quadro è più importante degli altri.
Ciao :)

2186
01-10-2009, 09:53
Ma appunto non è il linguaggio che non te lo permette, attenzione, ma solo la sa implementazione. Quando programmi in Java, come target hai una Virtual Machine.
Con Java in quanto linguaggio ci puoi scrivere (e si sta facendo) anche un sitema operativo (vedi JNode (http://www.jnode.org/node/1)).

Inoltre: un programmatore risolve problemi.
Sono i problemi che deve risolvere e i requisiti che essi determinano per la soluzione a determinare il preciso livello di astrazione al quale il programmatore deve operare.
E questo non ha niente a che vedere con la professionalità; sono solo ambiti diversi di competenze (e domini di conoscenza diversi).
La professionalità di un programmatore si misura in base alla sua capacità di risolvere i problemi per i quali è richiesta la sua opera. Se i problemi che deve risolvere richiedono l'uso del linguaggio assembly e la conscenza minuziosa di una specifica architettura, bene, quello deve sapere; viceversa se i problemi da risolvere richiedono l'uso di un linguaggio di alto livello e la conoscenza minuziosa di alcune librerie, bene, quello deve sapere.
A volte poi capita di avere bisogno di risolvere problemi che richiedono competenze "trasversali": bene, quelle competenze bisogna avere.
Non si può ogni volta "assolutizzare": esistono diversi strati o livelli di astrazione dalla macchina nuda & cruda e diverse "brache" di sapere: inutile e privo di fondamento dire che un pezzo del quadro è più importante degli altri.
Ciao :)

si esatto su questo quoto in pieno anche io... ma non mi puoi negare che programmare in asm sia una cosa banale o come un altro linguaggio, perchè non lo è affatto...anzi...

ciao :)

banryu79
01-10-2009, 10:07
si esatto su questo quoto in pieno anche io... ma non mi puoi negare che programmare in asm sia una cosa banale o come un altro linguaggio, perchè non lo è affatto...anzi...

E chi ha banalizzato?
Io, personalmente, cerco di non banalizzare ne dare per scontato nulla, nei miei limiti.
Per me l'attività di programmare, non è mai banale. Tra l'altro la conoscenza di un linguaggio è solo uno degli strumenti di conoscenza che entrano in ballo, in tale attività.
Dunque, dal mio punto di vista, non è banale programmare ne in assembly, ne in C, ne in Java, ne in C#, ne in SmallTalk, ne in Delphi, ne in Eiffel, ne in Factor, ne in Haskell, ne in Lisp, ne in Ada, ne in Python, ne in.... credo si sia capito :D

Proprio per il fatto che saper programmare non significa la mera conoscenza del linguaggio (anche se la presuppone).

2186
01-10-2009, 11:37
Si, vero... ma io personalmente reputo linguaggio e linguaggio... anche se sono orientati a sviluppi differeni (settori) di certo non posso dire che il c++ sia piu difficile del VHDL e di certo che il vhdl lo sia piu di un ASM... insomma analizzando in maniera oggettiva dal mio punto di vista ci sono linguaggi e linguaggi, e come tale ne esistono di più semplici e più complicati, e questo penso sia innegabile.

banryu79
01-10-2009, 12:43
insomma analizzando in maniera oggettiva dal mio punto di vista ci sono linguaggi e linguaggi, e come tale ne esistono di più semplici e più complicati, e questo penso sia innegabile.
Beh, se ognuno dovesse portare la sua personale "visione" non ci basterebbe un secolo per metterci tutti d'accordo.
Quello che dici ha un senso solo entro il limite determinato dal significato che tu attribuisci alla parola "semplice", e alla parola "complicato" nel contesto della tua affermazione.

In ogni caso, anche ammettendo che un linguaggio X è più complicato (facciamo sia da imparare che a utilizzare, in genere) di un linguaggio Y, anche prendendo due diversi programmatori A e B, che devono tipicamente risolvere problemi appartenenti a diverse branche applicative, ognuna delle quali richiede di operare a un diverso livello di astrazione BASSO oppure ALTO, dove A conosce X e opera al livello BASSO e B conosce Y e opera al livello ALTO, ancora non possiamo dire nulla su chi dei due sia più professionale.

Ovvero: non importa quanto è complicato il linguaggio che utilizza un certo programmatore: il solo fatto di utilizzarlo in ambito professionale (e quindi, presumibilmente, averlo padroneggiato) non ci dice nulla circa la sua professionalità in assoluto, e neppure relativamente ad altri programmatori che utilizzano linguaggi diversi.
Potrebbe al massimo darci un'idea stereotipata, parziale e di massima circa la sua "forma mentis" nell'approcciare e risolvere un problema dalla sua prospettiva; potrebbe anche darci una vaga idea dei campi applicativi in cui più spesso è richiesta la sua opera.

Tutto questo valutando le cose in modo "asettico"; cioè senza considerare che ogni programmatore ha invetibilmente dei gusti e delle inclinazioni particolari, e le sue idiosincrasie. E ricordandoci che stiamo solo pensando ai linguaggi, lasciando fuori tutto il resto (un'enormita' di roba). Ad esempio le concrete esperienze maturate in un certo dominio di problemi.

cdimauro
01-10-2009, 13:54
si esatto su questo quoto in pieno anche io... ma non mi puoi negare che programmare in asm sia una cosa banale o come un altro linguaggio, perchè non lo è affatto...anzi...

ciao :)
Si, vero... ma io personalmente reputo linguaggio e linguaggio... anche se sono orientati a sviluppi differeni (settori) di certo non posso dire che il c++ sia piu difficile del VHDL e di certo che il vhdl lo sia piu di un ASM... insomma analizzando in maniera oggettiva dal mio punto di vista ci sono linguaggi e linguaggi, e come tale ne esistono di più semplici e più complicati, e questo penso sia innegabile.
Prova a buttare giù del codice Python (che è un linguaggio di altissimo livello) che, scrivendo questo:
DB.PartnersSubAreas['id', 'name'].orderby['id desc'].limit[0, 5].List(partnerid = 1)
è in grado di tirarti fuori la seguente query:
SELECT id, name FROM PartnersSubAreas WHERE (partnerid = %s) ORDER BY id desc LIMIT %s, %s
passargli i seguenti parametri:
[1, 0, 5]
eseguirla sul DB, e restituire una lista di lista di elementi (id e name).

Ti assicuro che non è affatto banale. E non sto lavorando in assembly. :read: :O

tomminno
01-10-2009, 14:49
Prova a buttare giù del codice Python (che è un linguaggio di altissimo livello) che, scrivendo questo:
DB.PartnersSubAreas['id', 'name'].orderby['id desc'].limit[0, 5].List(partnerid = 1)
è in grado di tirarti fuori la seguente query:
SELECT id, name FROM PartnersSubAreas WHERE (partnerid = %s) ORDER BY id desc LIMIT %s, %s
passargli i seguenti parametri:
[1, 0, 5]
eseguirla sul DB, e restituire una lista di lista di elementi (id e name).

Ti assicuro che non è affatto banale. E non sto lavorando in assembly. :read: :O

Che fai PyLINQ?

2186
01-10-2009, 15:18
Prova a buttare giù del codice Python (che è un linguaggio di altissimo livello) che, scrivendo questo:
DB.PartnersSubAreas['id', 'name'].orderby['id desc'].limit[0, 5].List(partnerid = 1)
è in grado di tirarti fuori la seguente query:
SELECT id, name FROM PartnersSubAreas WHERE (partnerid = %s) ORDER BY id desc LIMIT %s, %s
passargli i seguenti parametri:
[1, 0, 5]
eseguirla sul DB, e restituire una lista di lista di elementi (id e name).

Ti assicuro che non è affatto banale. E non sto lavorando in assembly. :read: :O
non dico che sia banale e non l'ho mai detto... ma se vuoi ti pasto il codice di un dsp scritto in asm che è nelle tastiere della korg :-P neanche immagini che lavoro da bestie c'è dietro tra FFT STFT OVERLAP etc... cmq fa nulla...:)

2186
01-10-2009, 15:21
fatto sta che tanto ognuno rimarrà della propria idea, com'è anche giuisto che sia.... io quel ke ho detto l'ho detto per esperienza personale...immagino e spero anche voi...
cmq son contento ugualmente di aver scambiato idee ed opinioni con voi, rimandendo però ferreo sulle mie (per ora)... kissà un dì potrei anche ricredermi e appoggiare le vostre tesi, ma per il momento no.
Grazie ancora della chiacchierata :)
ciao :)

marco.r
01-10-2009, 16:06
Prova a buttare giù del codice Python (che è un linguaggio di altissimo livello) che, scrivendo questo:
DB.PartnersSubAreas['id', 'name'].orderby['id desc'].limit[0, 5].List(partnerid = 1)
è in grado di tirarti fuori la seguente query:
SELECT id, name FROM PartnersSubAreas WHERE (partnerid = %s) ORDER BY id desc LIMIT %s, %s
passargli i seguenti parametri:
[1, 0, 5]
eseguirla sul DB, e restituire una lista di lista di elementi (id e name).

Ti assicuro che non è affatto banale. E non sto lavorando in assembly. :read: :O
Beh li' e' colpa piu' del linguaggio, che non e' facilmente estendibile

cdimauro
01-10-2009, 19:12
Che fai PyLINQ?
Francamente no, e nemmeno ci pensavo.

In questi giorni ho finito un progetto, e mi sono messo a rifattorizzare il codice, e ho notato dei pattern precisi per quanto riguarda le classiche operazioni al database. E' capitato anche con tanti altri progetti, ma questa volta avevo un po' di tempo e cominciato a raggruppare il codice in funzioni, a parametrizzarle, ecc.

Così sono arrivato a crearmi 4 funzioni abbastanza generali per coprire le classiche SELECT, INSERT, DELETE e UPDATE di SQL.

Ma non mi bastava. Anche se il codice era molto più pulito e lineare, non mi sembrava "naturale". Così ho cominciato a pensare come sarebbe stato comodo de dalla classe DB che usavo per crearmi la connessione al database, avessi potuto "estrarre" l'istanza di un'altra che rappresentasse l'entità tabella desiderata. E così via, da lì ho fatto diventare la classe DB una factory per la classe Entity che ho creato e che incapsulava tutte e 4 le operazioni SQL sopra citate.

Non so, magari sono stato influenzato da LINQ a causa dei numerosi esempi che ho visto da parte di gugoXX e di Tigershark, e incosciamente sono stato portato a creare un modello simile.

Simile, ma diverso, perché LINQ è un approccio alla manipolazione dei dati, mentre il mio voleva essere soltanto un metodo più naturale e semplice per gestire le 4 operazioni su DB.

E infatti sto già pensando di farlo evolvere in modo da poter rappresentare condizioni molto più complesse per la parte WHERE, e magari aggiungere le operazioni di UNION, INTERSECT, le JOIN, e così via.

Le potenzialità offerte dall'overloading degli operatori sono incredibili, e mi stanno facendo ammattire (nel senso buono). :p
non dico che sia banale e non l'ho mai detto... ma se vuoi ti pasto il codice di un dsp scritto in asm che è nelle tastiere della korg :-P neanche immagini che lavoro da bestie c'è dietro tra FFT STFT OVERLAP etc... cmq fa nulla...:)
fatto sta che tanto ognuno rimarrà della propria idea, com'è anche giuisto che sia.... io quel ke ho detto l'ho detto per esperienza personale...immagino e spero anche voi...
cmq son contento ugualmente di aver scambiato idee ed opinioni con voi, rimandendo però ferreo sulle mie (per ora)... kissà un dì potrei anche ricredermi e appoggiare le vostre tesi, ma per il momento no.
Grazie ancora della chiacchierata :)
ciao :)
Anch'io parlo per esperienza personale (cerca "the best amiga fighting game", e vedi cosa trovi :cool: ), visto che ho passato buona parte della mia vita da programmatore a lavorare in assembly. E tutta l'esperienza accumulata a basso livello non fa che farmi apprezzare i vantaggi e le potenzialità dei linguaggi di alto livello.

Fermo restando che, basso o alto livello che sia, da buon programmatore ribadisco che m'interessa risolvere i problemi che mi vengono sottoposti.
Beh li' e' colpa piu' del linguaggio, che non e' facilmente estendibile
Mumble. Francamente mi sono divertito molto e non ho trovato particolari impedimenti a livello di linguaggio, a parte una cosa. Questa:
DB.formats(name = 'Pippo') *= {id = 1}
che non posso scrivere perché non si può utilizzare l'operatore di moltiplicazione inplace sull'invocazione di una funzione. Per cui sono stato costretto a utilizzare l'operatore di indicizzazione / accesso a un vettore:
DB.formats[{'name' = 'Pippo'}] *= {id = 1}
Avrei preferito una catena di chiamata a metodi. Ma va bene anche così. Quindi ho riservato l'operatore di chiamata a funzione esclusivamente per implementare le SELECT, e dove serve passare parametri o impostare certe configurazioni (come orderby e limit, ad esempio), utilizzato l'operatore getitem.

Comunque sarei molto interessato a sapere in che modo avresti pensato di implementarlo. Quindi quale sintassi sarebbe stata più comoda per te (se Python lo avesse permesso).

gugoXX
02-10-2009, 08:26
Francamente no, e nemmeno ci pensavo.

In questi giorni ho finito un progetto, e mi sono messo a rifattorizzare il codice, e ho notato dei pattern precisi per quanto riguarda le classiche operazioni al database. E' capitato anche con tanti altri progetti, ma questa volta avevo un po' di tempo e cominciato a raggruppare il codice in funzioni, a parametrizzarle, ecc.

Così sono arrivato a crearmi 4 funzioni abbastanza generali per coprire le classiche SELECT, INSERT, DELETE e UPDATE di SQL.

Ma non mi bastava. Anche se il codice era molto più pulito e lineare, non mi sembrava "naturale". Così ho cominciato a pensare come sarebbe stato comodo de dalla classe DB che usavo per crearmi la connessione al database, avessi potuto "estrarre" l'istanza di un'altra che rappresentasse l'entità tabella desiderata. E così via, da lì ho fatto diventare la classe DB una factory per la classe Entity che ho creato e che incapsulava tutte e 4 le operazioni SQL sopra citate.

Non so, magari sono stato influenzato da LINQ a causa dei numerosi esempi che ho visto da parte di gugoXX e di Tigershark, e incosciamente sono stato portato a creare un modello simile.

Simile, ma diverso, perché LINQ è un approccio alla manipolazione dei dati, mentre il mio voleva essere soltanto un metodo più naturale e semplice per gestire le 4 operazioni su DB.

E infatti sto già pensando di farlo evolvere in modo da poter rappresentare condizioni molto più complesse per la parte WHERE, e magari aggiungere le operazioni di UNION, INTERSECT, le JOIN, e così via.
.

Eheh.

LINQ ha parecchi flavour.
Il primo, generalmente il piu' usato, anche qui sul forum, e' "LINQ to Object", ovvero il manipolare i dati gia' presenti nelle collezioni in memoria.
Il secondo e' "LINQ to SQL", che fa proprio quello che stavi studiando, ovvero prendere una sequenza di istruzioni funzionali e trasformarla in una istruzione SQL da sottomettere al DB di turno.
Che e' simile se non identico a quanto stai studiano.

Ci sono poi "LINQ to XML" e "LINQ to Dataset".

Relativamente a "LINQ to SQL" c'e' gia' stata un'evoluzione, sotto il nome di Entity Framework.


Impagabile vedere trasformare cose come

var res = Persone.Where(persona => persona.Nome.StartsWith("Pippo"))
.OrderBy(persona => persona.Cognome)
.Select(persona=> new {persona.citta, persona.indirizzo});

in

SELECT Citta,Indirizzo
FROM Persone
WHERE Nome LIKE 'pippo%'
ORDER BY Cognome

cdimauro
02-10-2009, 09:01
Concordo: è una goduria. :D

Ed effettivamente sono molto simili (d'altra parte queste soluzioni sono nate per risolvere gli stessi problemi).

Io ho usato una notazione forse un po' troppo stringata, ma mi sembra che bene o male sia comprensibile.

Ovviamente ogni suggerimento è il benvenuto. ;)

cdimauro
05-10-2009, 13:06
marco.r, perché non ti spieghi? Guarda che non ti mangio mica! :D Sono seriamente interessato al tuo punto di vista (e, tempo fa, anche a quello sui thread). ;)

cionci
05-10-2009, 15:33
Dovrei realizzare un software di controllo per macchine CNC da utilizzare sia in ambiente Windows che in ambiente Linux.

Puoi indicare brevemente la composizione hardware della macchina che controlla la CNC ?
Spesso sono macchine vecchie e poco performanti.

marco.r
06-10-2009, 08:54
marco.r, perché non ti spieghi? Guarda che non ti mangio mica! :D Sono seriamente interessato al tuo punto di vista (e, tempo fa, anche a quello sui thread). ;)
Carenza di tempo :D. Oggi provero' ad esporre con calma il discorso.

cdimauro
06-10-2009, 19:41
Ma no, guarda: prenditi pure tutto il tempo che vuoi. E' già tanto se mi risponderai, e ti ringrazio anticipatamente per il disturbo. :)