Consenso all'uso dei cookies

SITO1 -- SITO2 -- Forum1 -- CercaGlobale -- Informativa su Cookie e Privacy


Valutazione discussione:
  • 0 voto(i) - 0 media
  • 1
  • 2
  • 3
  • 4
  • 5
Differenze programmi Linux-Windows
#1
Buongiorno,
ho un dubbio che non riesco a trovare in rete: che differenza c'è, a livello di scrittura di codice, tra un programma per Linux e uno per Windows?

Avendo soltanto nozioni di programmazione non riesco a capire perché un programma scritto in "C" non possa girare sia su Linux che su Windows indistintamente. Che io sappia il linguaggio "C" non fa differenze tra sistemi operativi, anzi non dovrebbe proprio curarsene.

Si devono adottare accorgimenti diversi tra la scrittura di un programma per win e uno per Linux?
Il linguaggio "C" è lo stesso sia per Linux che per win?

Grazie.
Cita messaggio
Grazie da:
#2
Ciao,
il percorso di nascita di un programma tipico è:
scrittura del codice -> compilazione del codice -> programma nel linguaggio nativo del sistema operativo

Il lavoro più delicato quindi lo fa il compilatore. Linguaggi ad uso generale come C e C++ permettono di creare dei programmi molto portabili. Lo stesso codice compilato con compilatori diversi funziona su vari sistemi operativi. Ovviamente questo non è possibile quando un programma richiede una funzione specifica di un sistema operativo non presente in un altro. In questo caso il programma andrà modificato.

Java aveva risolto brillantemente questo problema permettendo di scrivere un codice valido per tutti i sistemi operativi. Anziché compilare il codice lo si portava in uno stato intermedio detto bytecode uguale per tutti i sistemi operativi. Era poi compito della Java Virtual Machine locale tradurre il bytecode in istruzioni compatibili col sistema operativo. Purtroppo la diffusione di Java è stata fortemente contrastata sia tra i sistemi chiusi che tra quelli open limitando quindi il suo potenziale.
Cita messaggio
Grazie da: cicca79 , cicca79
#3
(24-12-2017,11:25 )Blackstar Ha scritto: Ciao,
il percorso di nascita di un programma tipico è:
scrittura del codice -> compilazione del codice -> programma nel linguaggio nativo del sistema operativo

Il lavoro più delicato quindi lo fa il compilatore. Linguaggi ad uso generale come C e C++ permettono di creare dei programmi molto portabili. Lo stesso codice compilato con compilatori diversi funziona su vari sistemi operativi. Ovviamente questo non è possibile quando un programma richiede una funzione specifica di un sistema operativo non presente in un altro. In questo caso il programma andrà modificato.

Java aveva risolto brillantemente questo problema permettendo di scrivere un codice valido per tutti i sistemi operativi. Anziché compilare il codice lo si portava in uno stato intermedio detto bytecode uguale per tutti i sistemi operativi. Era poi compito della Java Virtual Machine locale tradurre il bytecode in istruzioni compatibili col sistema operativo. Purtroppo la diffusione di Java è stata fortemente contrastata sia tra i sistemi chiusi che tra quelli open limitando quindi il suo potenziale.

Quindi posso dire che finchè si parla di programmini "stupidi" non c'è problema di compatibilità mentre se si volessero gestire componenti hardware, lì il discorso cambia? 
Il linguaggio è universale, è la gestione dell'hardware (e non solo) che cambia tra Linux e win, giusto?
Cita messaggio
Grazie da:
#4
Non è tanto una questione di hardware o software ma di funzioni disponibili.
Pensa ad esempio ad un programma che apre il cassetto del DVD-ROM (lo so è un esempio stupido...). Questa funzione c'è sia in Windows che in Linux quindi tu puoi scrivere lo stesso programma e sarà il compilatore a tenere conto delle differenze che ci sono per accedere a questa funzione.

Pensa invece di voler creare un programma che legge ad alta voce un testo. In Windows esiste un sistema di sintesi vocale incluso nel sistema operativo (la voce italiana è Elsa). Nella maggior parte dei sistemi Linux non c'è una cosa simile o se c'è ha solo la voce in inglese. In questo caso scrivere un unico programma è impossibile. Potresti utilizzare una base comune ma poi dovresti personalizzare il codice. Per Windows ti basterebbe richiamare l'interfaccia di Elsa, per Linux dovresti invece verificare la presenza di un sistema di sintesi vocale, in sua assenza prevedere ad esempio al download e all'installazione e poi successivamente dovresti scrivere il codice per accedere a quel componente.
Cita messaggio
Grazie da: cicca79
#5
(24-12-2017,11:42 )cicca79 Ha scritto:
(24-12-2017,11:25 )Blackstar Ha scritto: Ciao,
il percorso di nascita di un programma tipico è:
scrittura del codice -> compilazione del codice -> programma nel linguaggio nativo del sistema operativo

Il lavoro più delicato quindi lo fa il compilatore. Linguaggi ad uso generale come C e C++ permettono di creare dei programmi molto portabili. Lo stesso codice compilato con compilatori diversi funziona su vari sistemi operativi. Ovviamente questo non è possibile quando un programma richiede una funzione specifica di un sistema operativo non presente in un altro. In questo caso il programma andrà modificato.

Java aveva risolto brillantemente questo problema permettendo di scrivere un codice valido per tutti i sistemi operativi. Anziché compilare il codice lo si portava in uno stato intermedio detto bytecode uguale per tutti i sistemi operativi. Era poi compito della Java Virtual Machine locale tradurre il bytecode in istruzioni compatibili col sistema operativo. Purtroppo la diffusione di Java è stata fortemente contrastata sia tra i sistemi chiusi che tra quelli open limitando quindi il suo potenziale.

Quindi posso dire che finchè si parla di programmini "stupidi" non c'è problema di compatibilità mentre se si volessero gestire componenti hardware, lì il discorso cambia? 
Il linguaggio è universale, è la gestione dell'hardware (e non solo) che cambia tra Linux e win, giusto?
Io piuttosto direi che, se ti procuri il codice sorgente di un programma e lo compili usando il medesimo computer che poi dovrà usare il programma compilato, e fai la stessa cosa per tutte le dipendenze del programma in questione, il programma compilato dovrebbe funzionare senza alcun problema.
Disgraziatamente un programma scritto per un Sistema Operativo potrebbe prevedere l'utilizzo di istruzioni non incluse nel codice sorgente perché già incluse nel Sistema Operativo per cui il codice è stato scritto; in questo caso, la ricompilazione del codice non risolve il problema. Ovviamente il programmatore può evitare il problema evitando di scrivere programmi che richiamano funzioni tipiche di un determinato Sistema Operativo, ma l'utente finale non può farci nulla.
Questo inconveniente si verifica anche per TUTTI i programmi, indipendentemente dal linguaggio per cui sono stati scritti (quindi compreso java) ed indipendentemente dalla piattaforma (quindi un programma per Windows 10 può non funzionare nè su Linux, nè su una versione di Windows più vecchia di Window 10
Linux: PCLinuxOS + OpenSUSE + Ubuntu + Linux Mint + Fedora
Smartphone: Alcatel PIXI4 +tablet AMTC MD7305 (Android 4.1) +tablet SurfTab® wintron 7.0 (Windows™ 10©)
http://sargonsei.altervista.org/hardware...r-fisso-2/
Cita messaggio
Grazie da: cicca79
#6
(24-12-2017,10:21 )cicca79 Ha scritto: ho un dubbio che non riesco a trovare in rete: che differenza c'è, a livello di scrittura di codice, tra un programma per Linux e uno per Windows?
nessuna,
perlomeno per applicazioni che girino da console (terminale); per i programmi con interfaccia grafica invece bisogna usare le API (componenti software) grafiche specifiche di ciascun sistema operativo. La ricompilazione del codice è necessaria in ogni caso.

(24-12-2017,10:21 )cicca79 Ha scritto: Avendo soltanto nozioni di programmazione non riesco a capire perché un programma scritto in "C" non possa girare sia su Linux che su Windows indistintamente. Che io sappia il linguaggio "C" non fa differenze tra sistemi operativi, anzi non dovrebbe proprio curarsene.
se programmi usando solo il C standard, almeno sulla carta il programma non deve essere modificato ma "solo" ricompilato, perché uno dei passi della costruzione del codice eseguibile è effetuato da uno stgrumento chiamato LINKER (collegatore), che serve ad includere le librerie specifiche del sitema operativo che permettono l'esecuzione del programma. Ho evidenziato "sulla carta" perché può succedere che la semplice ricompilazione non sia sufficiente ed occorrano aggiustamenti specifici a seconda del sistema operativo.

(24-12-2017,10:21 )cicca79 Ha scritto: Si devono adottare accorgimenti diversi tra la scrittura di un programma per win e uno per Linux?
vedi le precedenti risposte: in caso di applicazioni grafiche vanno usate le librerie/chiamate specifiche del sistema operativo più eventuali correzioni dipendenti dal sistema operativo.

(24-12-2017,10:21 )cicca79 Ha scritto: Il linguaggio "C" è lo stesso sia per Linux che per win?

si (a patto di usare lo stessa versione del compilatore)
Il mio blog: ZEROZEROCENT.BLOGSPOT.COM
LEGGE DI MURPHY: SE QUALCOSA PUO' ANDAR MALE, LO FARA'
VERSIONE QUANTISTICA DELLA LEGGE DI MURPHY: TUTTO VA MALE CONTEMPORANEAMENTE
Cita messaggio
Grazie da: cicca79
#7
Grazie Blackstar, Sargon6 e BAT siete stati molto chiari. Adesso ho le idee un po' più chiare di prima. Credo di aver capito il concetto.

Grazie ancora a tutti!
Cita messaggio
Grazie da:


Vai al forum:


Utenti che stanno guardando questa discussione: 1 Ospite(i)