<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title> &#187; xBase</title>
	<atom:link href="https://www.appliserver.com/wordpress/?cat=6&#038;feed=rss2" rel="self" type="application/rss+xml" />
	<link>https://www.appliserver.com/wordpress</link>
	<description>Tecnica e programmazione</description>
	<lastBuildDate>Tue, 25 Feb 2025 22:08:05 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.2</generator>
		<item>
		<title>Scrivere applicazioni CGI in (x)Harbour &#8211; Parte I</title>
		<link>https://www.appliserver.com/wordpress/?p=87</link>
		<comments>https://www.appliserver.com/wordpress/?p=87#comments</comments>
		<pubDate>Sat, 27 Jul 2019 17:58:37 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[harbour]]></category>
		<category><![CDATA[programmazione]]></category>
		<category><![CDATA[xBase]]></category>
		<category><![CDATA[xharbour]]></category>

		<guid isPermaLink="false">http://www.appliserver.com/wordpress/?p=87</guid>
		<description><![CDATA[Le CGI CGI significa Common Gateway  Interface e designa una classe di programmi (applicazioni) fatti per funzionare in tandem con un web server. Queste applicazioni prevedono di essere invocate da un web server e restituiscono al medesimo una pagina HTML. Il &#8230; <a href="https://www.appliserver.com/wordpress/?p=87">Continua a leggere<span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><strong>Le CGI</strong></p>
<p>CGI significa Common Gateway  Interface e designa una classe di programmi (applicazioni) fatti per funzionare in tandem con un web server. Queste applicazioni prevedono di essere invocate da un web server e restituiscono al medesimo una pagina HTML.</p>
<p>Il web server sarà configurato in modo tale per cui l&#8217;applicazione CGI diventa a tutti gli effetti parte dell&#8217;URL del sito. Per esempio un URL (in ambiente Windows) del tipo: http://www.miosito.com/cgi-bin/MyCgi.exe invoca direttamente MyCgi.exe (nella directory convenzionale cgi-bin).</p>
<p>Il web server a sua volta restiturà pari pari tale pagina HTML al browser che ha invocato la CGI (cioè ha tentato di &#8220;navigare&#8221; l&#8217; URL che invoca la CGI), per esempio una stringa come la seguente (EOL=LF, chr(10) o CRLF, (chr(13)+chr(10)):</p>
<div><span style="font-size: 16px;">&#8220;Content-Type:text/html[</span><span style="font-size: 16px;">EOL][EOL]</span><span style="font-size: 16px;">Grazie per avermi invocato![EOL]&#8220;</span></div>
<p>La stringa viene ritrasmessa al browser chiamante, che la tratterà come una pagina statica. Dal punto di vista del browser che ha emesso la richiesta, ricevere una pagina HTML statica, ovvero il contenuto di un file situato sul server, oppure una pagina creata al momento non fa alcuna differenza: si tratta sempre di un flusso di bytes (uno stream) e verrà processato sempre allo stesso modo.</p>
<div><span style="font-size: 16px;">Tutto questo a poco servirebbe se non ci fosse modo di passare alla CGI anche una serie di valori che ne determinino il comportamento.</span></div>
<p><strong>Come passare parametri alla CGI</strong></p>
<p>Il web server fornisce un ambiente standard di esecuzione per i programmi CGI, completo di un set di variabili d&#8217;ambiente. In (x)Harbour possiamo leggere le variabili d&#8217;ambiente, conoscendo il loro nome, con l&#8217;istruzione GetEnv(&#8220;nomevar&#8221;). Per prima cosa quindi possiamo ricavare PATH_INFO, QUERY_STRING E CONTENT_LENGTH, variabili d&#8217;ambiente che dovrebbero contenere l&#8217;URL richiesto dal client, una parte specifica di esso e la lunghezza in bytes dello stream inviato dal client. Il modo più semplice quindi di trasmettere parametri è quello di includerli nell&#8217;URL, per esempio:<br />
www.miosito.com/cgi-bin/MyApp.cgi?cheoresono<br />
Si noterà che viene usato il carattere convenzionale &#8220;?&#8221; per delimitare l&#8217;inizio della parte dell&#8217;URL che contiene i parametri (la query string). Tutto quello che segue il &#8220;?&#8221; finisce nella variabile d&#8217;ambiente QUERY_STRING.</p>
<p>La CGI prende forma: essa deve quindi esaminare QUERY_STRING e agire di conseguenza. La risposta dovrà essere scritta su STDOUT. (x)Harbour ha la funzione OutStd() (e il comando qout, suo alias) che fa appunto questo. Per esempio:</p>
<pre>Procedure main()
cCommand:=getenv("QUERY_STRING")
if .not. empty(cCommand)
do case
case cCommand="cheoresono"
outStd("Content-Type:text/html"+chr(10)+chr(10))
outStd(""Sono le "+time()+"")
...
endcase
endif
return nil</pre>
<p>Un altro metodo utilizza specifici elementi HTML, ovvero i FORM. Un form è costituito da un &#8220;contenitore&#8221; e da un certo numero di controlli. Un form dispone di un METHOD e di una ACTION. I METHOD che ci interessano sono POST e GET, mentre la ACTION conterrà il comando da passare alla CGI. Per esempio: (Nota: questo editor è fatto con Javascript e HTML, quindi se tento di scrivere del codice HTML esso verrà interpretato anziché presentato in forma testuale. Per questo i simboli TAG inizio e fine sono sostituiti da parentesi quadre).</p>
<pre>[form action="cgi-bin/MyApp.exe" method="GET" name="myform"&gt;Importo:[input type="TEXT" name="IMPORTO" value="100"&gt;&lt;br&gt;&lt;br&gt; Rate:[input type="TEXT" name="RATE" value="12"&gt;&lt;br&gt; [input type="SUBMIT" value=""&gt;&lt;br&gt;&lt;/form&gt;</pre>
<div> <span style="font-size: 16px;">Il FORM quando SUBMITted trasmetterà al server una richiesta, corrispondente a:</span></div>
<p>www.miosito.com/cgi-bin/MyApp.exe?IMPORTO=100&amp;RATE=12, il che porrà in QUERY_STRING &#8220;IMPORTO=100&amp;RATE=12&#8243;. In pratica il metodo GET è equivalente a un URL. Notare come dal FORM vengano generate coppie di valori del tipo[VARIABILE]=[VALORE] separate questa volta dal carettere &#8220;&amp;&#8221;.</p>
<p>Se lo stesso FORM usasse il METHOD POST, il risultato sarebbe diverso.</p>
<form action="cgi-bin/MyApp.exe" method="POST" name="myform">
<pre>[form action="cgi-bin/MyApp.exe" method="POST" name="myform"&gt;Importo:[input type="TEXT" name="IMPORTO" value="100"&gt;&lt;br&gt;&lt;br&gt; Rate:[input type="TEXT" name="RATE" value="12"&gt;&lt;br&gt; [input type="SUBMIT" value=""&gt;&lt;br&gt;&lt;/form&gt;</pre>
</form>
<form action="cgi-bin/MyApp.exe" method="POST" name="myform"><span style="font-size: 16px;">Il metodo POST trasmette i dati del FORM su STDOUT (del client, arrivano al server su STDIN del server, il quale fa lo stesso e copia i dati sul suo STDOUT e questi arrivano su STDIN della CGI) e setta la variabile d&#8217;ambiente CONTENT-LENGTH. Come si fa a leggere STDIN via (x)Harbour? Anche se la docuentazione ufficiale non affronta specificamente il tema, ricordiamoci le funzioni FREAD() e FREADSTR(). Sono funzioni di basso livello che leggono uno stream e necessitano come argomento di un handle valido, solitamente ottenuto con una FOPEN() per leggere un file in modo &#8220;grezzo&#8221;. Orbene, se il numero di handle è 0 (zero), queste funzioni leggono STDIN.</span></form>
<p>La nostra CGI potrebbe a questo punto arricchirsi con un ulteriore confronto:</p>
<p>&#8230;<br />
IF VAL(GETENV(&#8220;CONTENT_LENGTH&#8221;))!=0<br />
cStream:=FREADSTR(0)</p>
<p>In questo modo possiamo riconosceer una richiesta POST e leggere lo stream via STDIN, viceversa leggeremo QUERY_STRING.</p>
<p>C&#8217;è un altro modo, simile al metodo GET, ovvero utilizzare Javascript per manipolare direttamente il contenuto dell&#8217;URL prima di effettuare il submit(). Il risultato sarà simile ad un GET.</p>
<p><strong>I ferri del mestiere</strong></p>
<p>A questo punto ci rendiamo conto di necessitare di qualche funzione specializzata: per esempio se l&#8217;URL inserito nel client comprende il carattere(ASCII 32), la Query String conterrà %20, ovvero il carattere &#8220;%&#8221; seguito dal codice ASCII in esadecimale. Questo vale per tutti i caratteri speciali, per cui ci occorrono un paio di funzioni: hexify() e dehexify() per convertire queste stringhe. Al posto di Qout() definiamo mediante il possente preprocessore di (x)Harbour:</p>
<pre>#command cgiout [&lt;xList&gt;] =&gt; ([OutStd(),] OutStd(chr(10)))</pre>
<p>Questo ci permetterà di stampare su STDOUT aggiungendo alla fine [EOL]. OutStd() infatti si limita a porre in STDOUT i caratteri passati, senza formattazione né EOL (che viene aggiunto invece dai comandi &#8220;?&#8221; e da &#8220;??&#8221;).</p>
<p>Dato che, come abbiamo visto, avremo a che fare con streams contenenti coppie separate da &#8220;&amp;&#8221; a loro volta composte da due elementi separati da &#8220;=&#8221;, ci occorre una funzione &#8220;splitter&#8221; che separi una stringa in base a un separatore arbitrario. La funzione estrai(stringa,separatore) restituisce un array con tanti elementi quanti i separatori nella stringa.<br />
Visto poi che tutte le pagine che la CGI dovrà produrre iniziano con &#8220;content-type&#8230;&#8221; ecc. e finiscono con il tag di chiusura, scriviamo le funzioni MakeHTMLHeader() e MakeHTMLBottom() che automatizzano in parte queste operazioni.</p>
<p>Anche l&#8217;errorsystem andrà modificato: se vogliamo che i messaggi di errore siano visibili, devono anche loro essere stampati su STDOUT e non visualizzati su schermo.</p>
<p>Con questo armamentario ridotto siamo già in grado di scrivere delle CGI, ma non bisogna farsi illusioni. Ci sono alcune complessità intrinseche nella programmazione di applicazioni CGI. Se leggere uno stream in entrata e scriverne uno in uscita non sono operazioni difficili, tutto quello che sta in mezzo invece lo è. Una difficoltà è ovviamente rappresentata dal fatto che bisogna generare in output codice HTML valido, e quindi una certa conoscenza di HTML è indispensabile. Un&#8217;altra difficoltà analoga alla prima riguarda Javascript: è evidente che, a parte applicazioni piuttosto scarne, bisognerà fare uso massiccio di Javascript, il che significa impararsi un nuovo linguaggio, niente meno, e per di più un linguaggio che, anche se apparentemente semplice, è invece un brutto cliente se si vuole cercare il pelo nell&#8217;uovo. Però bisogna dire che la situazione attualmente è meno tragica di quanto non fosse qualche anno fa: è vero che Javascript è implementato in modo diverso nei diversi browser, ma la corsa alla standardizzazione ha per fortuna ridotto le distanze. Fino a qualche anno fa era laborioso e complesso, oltre che fonte di innumerevoli dispute nei forum dei programmatori Javascript, produrre script  davvero robusti in grado di funzionare su qualsiasi browser.</p>
<p>Un&#8217;altra difficoltà consiste nel dover rivedere il paradigma di programmazione. Chi programma da tempo ha già dovuto affrontare il passaggio da programmazione procedurale a programmazione a oggetti. In entrambi i casi il programma dopo essersi avviato aspetta che l&#8217;utilizzatore emetta un comando e rimane in esecuzione svolgendo elaborazioni e/o attendendo altri input. Una CGI peraltro invece viene invocata, fa tutto quello che deve fare e termina. Questo significa che alla successiva chiamata la CGI sarà completamente immemore della chiamata precedente! Ogni invocazione della CGI è una esecuzione-e-termine del programma (ci sono tecniche per mantenere delle sessioni ma non verranno trattate qui).</p>
<p>La conseguenza più notevole è che l&#8217;output di una CGI deve essere costituito in realtà da una specie di programma che contiene tutte le istruzioni e i riferimenti per compiere l&#8217;operazione successiva. Chi ha visto il film Memento può avere un&#8217;idea del meccanismo: il protagonista per un disturbo della memoria vive in una specie di eterno presente. Unica guida sono le scritte che imprime sul suo stesso corpo, cosicché al risveglio saprà che fare. Analogamente il programma dovrà scrivere, nella pagina HTML che genererà, i form (o altro) contenenti i comandi da passare a se stesso corredati dai parametri necessari.</p>
<p>Il sorgente che segue è un omaggio a un bravo programmatore che molti anni fa pubblicò una rivista dal titolo &#8220;Clipper Magazine&#8221;. In uno dei numeri veniva descritta appunto la tecnica per creare delle CGI con Clipper. Si era nel 1996 o giù di lì e possiamo immaginare quanto fosse rivoluzionaria l&#8217;idea. Il fatto che dopo oltre 20 anni i concetti siano ancora validi è notevole. Il programmatore si chiamava Mario Lener e ho voluto conservare nel sorgente i suoi messaggi originali di copyright. In realtà non trovo più i sorgenti originali, per cui riporto uno dei miei esperimenti dell&#8217;epoca di diretta derivazione dal sorgente originale di Lener. Ci sono degli elementi &#8220;spurii&#8221; nel sorgente, come la funzione normalizza() ecc. introdotti da me. Per adesso ignoriamoli.</p>
<p>Il programma viene richiamato da un form, quindi per allestire questo test bisognerà avere il server web funzionante, la pagina HTML con il form al suo posto nella documentroot del web server, un database &#8220;ar_cli.dbf&#8221; con almeno i campi DITTA,CAP e CITTA in una directory accessibile dal nostro programma (C.\cgidata per esempio) e ovviamente Harbour o xHarbour installati.</p>
<p>Link per il sorgente: <a title="testcgi.prg" href="http://www.appliserver.com/cgi-bin/motsgd.cgi?/sgd/&amp;link&amp;12&amp;vis=1" target="_blank">Link</a></p>
]]></content:encoded>
			<wfw:commentRss>https://www.appliserver.com/wordpress/?feed=rss2&#038;p=87</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Harbour e xHarbour</title>
		<link>https://www.appliserver.com/wordpress/?p=24</link>
		<comments>https://www.appliserver.com/wordpress/?p=24#comments</comments>
		<pubDate>Thu, 27 Dec 2012 03:00:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[harbour]]></category>
		<category><![CDATA[programmazione]]></category>
		<category><![CDATA[xBase]]></category>
		<category><![CDATA[xharbour]]></category>

		<guid isPermaLink="false">http://www.appliserver.com/wordpress/?p=24</guid>
		<description><![CDATA[Per linguaggio di programmazione &#8220;xBase&#8221; si intende un insieme di &#8220;dialetti&#8221; che derivano in ultima analisi dal DBIII (anni &#8217;80) e successive migliorie (foxBase, Clipper, QuickSilver negli anni &#8217;80 e &#8217;90,  etc.), tutti linguaggi dedicati alla gestione di basi di &#8230; <a href="https://www.appliserver.com/wordpress/?p=24">Continua a leggere<span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Per linguaggio di programmazione &#8220;<strong>xBase</strong>&#8221; si intende un insieme di &#8220;dialetti&#8221; che derivano in ultima analisi dal DBIII (anni &#8217;80) e successive migliorie (foxBase, Clipper, QuickSilver negli anni &#8217;80 e &#8217;90,  etc.), tutti linguaggi dedicati alla gestione di basi di dati (database) e quindi dotati di specifiche funzioni per agevolare tali gestioni.</p>
<p>I linguaggi xBase si sono affermati come strumento di sviluppo di applicativi gestionali in un&#8217;epoca in cui non esisteva il mouse, non esisteva Windows, e gli utilizzatori interagivano con i programmi essenzialmente mediante un monitor monocromatico e una tastiera. Ebbe straordinaria fortuna <strong>Clipper</strong>, in tutto il mondo, che fu usato da milioni di programmatori (me compreso). Clipper non prevedeva di per sé Windows, ma aveva una struttura aperta, talmente aperta che degli sviluppatori indipendenti crearono un &#8220;ponte&#8221; tra Clipper e Windows, permettendo così al linguaggio xBase per eccellenza di non morire nel nuovo mondo informatico caratterizzato dalle finestre e dalla grafica. Gli odierni Harbour e xHarbour permettono di compilare senza praticamente modifiche persino i vecchi programmi scritti per DBIII, ma offrono anche un completo ambiente di sviluppo per creare applicazioni dotate di GUI (graphic user interface) e che sfruttano tutte le potenzialità dei moderni sistemi.</p>
<p>In breve, Harbour e xHarbour sono due <strong>compilatori</strong> in grado di trasformare un listato sorgente xBase in un eseguibile Windows/Linux/et.al. Essi derivano concettualmente da Clipper, di cui accettano linguaggio e sintassi, e replicano ed ampliano la struttura aperta.</p>
<p>Si tratta in realtà di due pseudo-compilatori che trasformano il <strong>sorgente</strong> (= il programma come lo scrive il programmatore, che è un essere umano e avrebbe terribili difficoltà a scrivere i programmi direttamente nel codice macchina che il computer può digerire) in una sorta di codice intermedio basato su un notissimo, basilare e universale linguaggio di programmazione, il <strong>linguaggio C</strong>, e poi richiamano un <strong>compilatore</strong>  C vero e proprio ( compilatore=programma che pre-digerisce i sorgenti e li trasforma in codice macchina) per generare l&#8217;eseguibile finale.</p>
<p>La base fornita dal comune denominatore C consente una estrema versatilità del linguaggio, il quale consente di incorporare nei programmi praticamente qualunque cosa, direttamente in linguaggio C o mediante componenti aggiuntivi basati sul C. Ricordo che anche Windows è scritto in gran parte in C, come pure Unix/Linux ecc.</p>
<p>Se qualcuno a questo punto si stesse chiedendo che bisogno ci sia di usare uno pseudo-compilatore C eccetera, e se non sarebbe meglio scrivere i programmi in C direttamente, potrebbe rispondersi da solo con una analogia, chiedendosi per esempio che bisogno ci sia di comprare le scarpe bell&#8217;e fatte quando si può benissimo comprare cuoio, gomma, colla e procedere con molta maggiore libertà e soddisfazione personale alla realizzazione delle proprie scarpe su misura.</p>
<p>Come ho detto prima, [x]Harbour e compagnia bella (Alaska xBase, Visual Foxpro, Flagship ecc.)  sono linguaggi &#8220;di alto livello&#8221; il che non significa che abbiano un rango nobiliare nei confronti dei linguaggi di &#8220;basso livello&#8221; come il C. Alto e basso livello nel gergo informatico stanno a designare in pratica il loro livello di astrazione rispetto al linguaggio macchina, l&#8217;ingestibile (per noi umani) codice binario che è l&#8217;unica cosa che in ultima analisi un computer esegue direttamente. Tanto più ci si astrae da queste istruzioni elementari, tanto più alto è il livello. In pratica una singola istruzione in un linguaggio di alto livello corrisponde a centinaia o migliaia di operazioni elementari o di basso livello. In questo modo il programmatore può scrivere meno codice e concentrarsi sulla logica del programma, tralasciando i dettagli. Naturalmente un linguaggio di alto livello non consente un controllo fine delle singole istruzioni o di fare particolari operazioni di dettaglio, allo stesso modo in cui un bulldozer non va bene per rimuovere un centimetro di sabbia da uno scavo archeologico,  ma questo controllo fine, per le applicazioni gestionali, non è necessario più di quanto sia necessario uno spazzolino di tasso per spianare un terreno in edilizia.</p>
<p>[x]Harbour sta ad indicare i due compilatori Harbour e xHarbour. Essi sono alquanto simili, ma questo è comprensibile se si pensa che essi sono in effetti due teste del medesimo&#8230; mostro.</p>
<p><strong></strong>La storia di questi compilatori è lunga e riporto qualche approfondimento di carattere &#8220;storico&#8221; <a href=" http://www.appliserver.com/wordpress/?p=31">qui</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://www.appliserver.com/wordpress/?feed=rss2&#038;p=24</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Storia dei compilatori xBase liberi</title>
		<link>https://www.appliserver.com/wordpress/?p=31</link>
		<comments>https://www.appliserver.com/wordpress/?p=31#comments</comments>
		<pubDate>Thu, 27 Dec 2012 02:57:49 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[harbour]]></category>
		<category><![CDATA[programmazione]]></category>
		<category><![CDATA[xBase]]></category>
		<category><![CDATA[xharbour]]></category>

		<guid isPermaLink="false">http://www.appliserver.com/wordpress/?p=31</guid>
		<description><![CDATA[Verso la metà degli anni &#8217;80 la scena informatica ha nella società Ashton-Tate uno dei suoi protagonisti indiscussi  tra gli sviluppatori di applicazioni gestionali, gli esperti e i semplici hobbisti. Con il DBIII, che è essenzialmente un database programmabile,  è &#8230; <a href="https://www.appliserver.com/wordpress/?p=31">Continua a leggere<span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Verso la metà degli anni &#8217;80 la scena informatica ha nella società <strong>Ashton-Tate</strong> uno dei suoi protagonisti indiscussi  tra gli sviluppatori di applicazioni gestionali, gli esperti e i semplici hobbisti. Con il <strong>DBIII</strong>, che è essenzialmente un database programmabile,  è possibile creare in modo semplice e intuitivo i propri archivi, ed anche scrivere delle procedure in un semplice linguaggio di alto livello, che permettono di gestire tali archivi. DBIII infatti disponeva di un suo linguaggio di programmazione dotato di decine di istruzioni specifiche per la manipolazione dei database. Era possibile quindi usare DBIII &#8220;direttamente&#8221; dandogli una istruzione alla volta, oppure per le operazioni ripetitive scrivere tali istruzioni in un file e poi far leggere tale file al DBIII, che le avrebbe eseguite sequenzialmente. Era anche possibile presentare dei menu di scelta e dare quindi in pasto ad utenti inesperti di programmazione dei veri e propri programmi gestionali completi, come per esempio una gestione ordini e fatturazione, inventari, gestione del magazzino ecc. In questo modo una impresa poteva acquistare il DBIII e poi incaricare un programmatore di progettare una intera gestione, magari scrivendo delle procedure ad hoc. Ben presto intraprendenti programmatori cominciarono a proporre queste gestioni bell&#8217;e pronte, o personalizzabili secondo le esigenze, ad un mercato in rapidissima espansione e praticamente vergine. All&#8217;epoca c&#8217; erano poco software e pochi programmatori, quindi il DBIII, che era infinitamente più potente, efficace e semplice dei tradizionali linguaggi di programmazione, si trovò rapidamente ad avere la parte del leone. Ma c&#8217;erano un paio di inconvenienti. Le procedure scritte per il DBIII richiedevano per essere eseguite che DBIII fosse installato sul computer che le avrebbe eseguite, e DBIII costava se non ricordo male un milione e mezzo di lire (rapportato ad oggi, almeno tre o quattromila euro), inoltre le procedure erano dei semplici files di testo e qualunque furbastro avrebbe potuto copiarle e riutilizzarle per conto proprio di nascosto dal legittimo autore. Quello che successe nella realtà fu che quasi tutti avevano una copia pirata del DBIII e fioriva un mercato nero assai vasto di programmi trafugati dalle varie aziende. I nerds dell&#8217;epoca ebbero così la possibilità di impossessarsi di moltissimi programmi e di studiarseli in santa pace, senza contare la vasta (per l&#8217;epoca) letteratura sul DBIII che completava gli ottimi manuali che accompagnavano il prodotto (e di cui quasi tutti naturalmente avevano una fotocopia abusiva).</p>
<p>La Ashton-Tate si era sempre rifiutata di dotare DBIII di un vero e proprio generatore di applicazioni che svincolasse il linguaggio, ossia le procedure, dal DBIII vero e proprio. Sarebbe stato possibile cioè far generare a DBIII dei programmi eseguibili anche su computer su cui DBIII non era stato installato, creando un modulo direttamente eseguibile dal computer ma impossibile o comunque difficilissimo da &#8220;spacchettare&#8221; per capire cosa c&#8217;era dentro. Potevano, ma non vedevano l&#8217;interesse a farlo: avrebbero agevolato i programmatori ma a loro interessava solo vendere copie del DBIII, senza rendersi conto che ormai il DBIII doveva la sua fortuna proprio ai programmatori, e almeno una forma di offuscamento del codice o pseudocompilazione o criptazione era essenziale per tutelare il lavoro dei programmatori, che mal tolleravano di dover dare in giro il loro sudato codice in forma non protetta e liberamente copiabile. Il mercato stava cambiando, e sempre meno persone avvertivano la necessità di usare direttamente il DBIII, dato che la disponibilità di software già pronto era vasta e crescente, quindi l&#8217;obbligo di comprarlo si riduceva alla necessità di essere in regola con le licenze d&#8217;uso ma appariva come una specie di tangente salatissima che si doveva pagare ad Ashton-Tate per poter eseguire programmi scritti per DBIII.</p>
<p>Verso la fine degli anni &#8217;80 un paio di società americane riuscirono a creare dei compilatori in grado di prendere le procedure scritte per il DBIII e trasformarle finalmente in programmi stand-alone che non necessitavano di nessun componente aggiuntivo per essere eseguiti: e fu la rivoluzione.</p>
<p>La Nantucket Corp. presentò <strong>Clipper</strong>, mentre l&#8217;altro prodotto che ricordo si chiamava Quicksilver. La spuntò Clipper, che era facilissimamente disponibile in versione &#8220;copia non ufficiale&#8221;, accompagnato da una essenziale ma completa documentazione, e dotato anche di alcune funzioni supplementari che rendevano ancora più potente il linguaggio, particolarmente un sistema per collegare Clipper al linguaggio C, rendendolo uno strumento potentissimo in mano sia al programmatore della domenica, che poteva compilare semplici procedure derivate dal DBIII, sia al vero esperto programmatore, che poteva sbizzarrirsi a fare qualunque tipo di applicazione.</p>
<p>La prima preda di Clipper furono i milioni di utilizzatori del DBIII, ormai quasi solo programmatori, che poterono finalmente distribuire i loro programmi in forma di eseguibile stand-alone, da cui era impossibile per l&#8217;utilizzatore risalire al sorgente (e quindi effettuare modifiche o aggiunte), e cominciò inoltre ad attrarre programmatori che abbandonavano i linguaggi tradizionali per passare al nuovo linguaggio. Clipper versione S87 era fatto straordinariamente bene. Consentiva di scrivere programmi in multiutenza, era solido come una roccia, quasi privo di bachi, efficiente e relativamente facile da imparare (soprattutto per chi proveniva dal DBIII). La sua parentela con il C non lo rendeva troppo esotico anche per chi proveniva da questo linguaggio, e come abbiamo visto questi programmatori disponevano di tutti gli strumenti per collegare Clipper proprio al C, per cui lo considerarono come una manna dal cielo.</p>
<p>La Nantucket fu acquistata all&#8217;apice del successo dalla Computer Associates, che era un colosso del software, quando aveva nel cassetto due prodotti più o meno pronti per il lancio, ossia la versione 5 di Clipper e Visual Object, che avrebbe dovuto costituire l&#8217;evoluzione di Clipper nel nuovo mondo informatico che si stava delineando e in cui mouse, finestre ed interfacce grafiche stavano prendendo il posto delle tristi schermate nere del DOS.</p>
<p>CA rilasciò in seguito la versione 5 di Clipper, che era in effetti una ulteriore rivoluzione: il linguaggio era stato reimplementato come un sottoinsieme di qualcosa di assai più vasto che prevedeva adesso anche una gestione ad oggetti, che nel frattempo si stava affermando come nuovo paradigma di programmazione. Il &#8220;qualcosa&#8221; era molto più chiaramente somigliante al C puro, sebbene conservasse la sua distinta identità. Apparve chiaramente la vera struttura interna del nuovo Clipper, ossia un insieme di centinaia di funzioni distinte, e di un &#8220;traduttore&#8221; che trasformava le classiche istruzioni DBIII nelle corrispondenti funzioni simil-C. La programmazione ad oggetti e la presenza di centinaia di nuove istruzioni facevano apparire come un piccolo sottoinsieme semplificato il tradizionale linguaggio DBIII, ed in questa fase molti programmatori rimasero costernati e perplessi. Devo ammettere che mi convertii alla nuova versione  di Clipper solo quando raggiunse la versione 5.2, e storcendo il naso.  Mi pare che fosse il 1991.</p>
<p>Nel frattempo Ashton-Tate aveva lanciato il DBIV, che ebbe poca fortuna, ed in seguito tentò di riciclarsi in ambiente Windows con il dBase 5, ma anche questo non ebbe grande successo ed alla fine fallì. Adesso dopo diversi passaggi Visual dBase sopravvive, sviluppato e commercializzato da una piccola società indipendente.</p>
<p>Il prodotto migliore dopo Clipper era probailmente <strong>Foxpro</strong>, che per certi versi era anzi anche meglio, e la versione per Windows, Visual Foxpro, era probabilmente la miglior implementazione del linguaggio dBase in tale ambiente. E&#8217; in questo periodo quindi che si comincia a parlare genericamente di linguaggi xBase, dato che erano presenti diversi prodotti, tutti basati sul vecchio DBIII ma dotati di varianti e caratteristiche proprie. Il vero problema era comunque come riuscire ad adattare il linguaggio dBase al nuovo ambiente Windows-centrico.</p>
<p>Il linguaggio di Clipper e degli altri prodotti concepiti per l&#8217;ambiente DOS si rifà ad uno stile di programmazione che è molto diverso dal funzionamento di Windows (o di altre GUI). La necessità di gestire bottoni, finestre, magari anche più finestre contemporaneamente aperte nello stesso programma, e la necessità di dialogare con Windows portano ad un modello di programmazione chiamato event-driven, cioè pilotato dagli eventi, contrapposto alla programmazione tradizionale, detta procedurale, in cui ogni programma fa in genere una sola cosa per volta secondo una successione prefissata. dBase V e Foxbase avevano risolto a modo loro, tracciando la via e creando le loro versioni del nuovo xBase, dotate di estensioni per la programmazione ad oggetti e di tutta la parte grafica. CA aveva rilasciato Visual Object, il successore di Clipper, innovativo e promettente, sebbene alquanto astruso e pieno di bachi che lo rendevano quasi inutilizzabile.</p>
<p>Intervenne a questo punto Microsoft, che acquistò Visual Foxpro. La mossa apparve come il riconoscimento che Visual Foxpro era il miglior strumento xBase disponibile, e che Microsoft si era decisa ad entrare nell&#8217;arena dei linguaggi xBase dalla porta principale. Molti programmatori acquistarono Foxpro (me compreso) serenamente pensando che il linguaggio non sarebbe morto e nuovi rosei sviluppi sarebbero arrivati. Niente di tutto ciò. Ben presto la vera strategia di Microsoft si chiarì: aveva acquistato Foxpro solo per toglierlo di mezzo e indirizzare i programmatori verso le sue alternative proprietarie. Foxpro fu lasciato morire lentamente e attualmente non è più nel catalogo Microsoft. L&#8217;ultima release è del 2007.</p>
<p>Ma qualche temerario aveva cominciato a lavorare in modo indipendente su Clipper:  aveva visto la luce infatti <strong>Clip4win</strong>, estensione che permetteva di collegare Clipper all&#8217;ambiente Windows (non ricordo l&#8217;autore). All&#8217;incirca in quello stesso periodo un certo <strong>Antonio Linares</strong>, un forte programmatore C con buonissime conoscenze dei meccanismi interni di Windows e che si era innamorato di Clipper, scrisse a sua volta una estensione che chiamò <strong>Fivewin</strong>. La bellezza e la profondità di Fivewin stanno nella semplicità del linguaggio creato da Linares (e dal suo pard Francisco Pulpòn) per gestire l&#8217;ambiente Windows, nella perfetta integrazione delle sue estensioni nel linguaggio esistente e nella fondamentale qualità del suo lavoro. Anche se Fivewin aveva qualche baco, la qualità generale era molto buona ed il costo accettabile: il prodotto ebbe subito successo tra i programmatori.</p>
<p>Ma CA aveva nel frattempo quasi abbandonato Clipper, che rimaneva un compilatore a 16 bit in un mondo dove ci si avviava a grandi passi verso i 32 e poi i 64 bit, e cominciava a soffrire di limitazioni strutturali insormontabili. Fu così che Linares cominciò a sviluppare un compilatore indipendente compatibile con Clipper (e Fivewin naturalmente) in grado di affrontare le sfide del futuro. La sua visione fu grandiosa e lo sforzo personale probabilmente immenso. La grossa novità fu che <strong>Harbour</strong> (il nuovo compilatore) nasceva come progetto Open Source, cioè di libero utilizzo da parte di chiunque. L&#8217;ultima versione che CA rilasciò di Clipper è la 5.3b nel 1997. Le alternative per la comunità di programmatori xBase erano costituite da pochi prodotti proprietari piuttosto costosi, come Alaska xBase++, Flagship, Visual Foxpro e dBase V. Nessuno di questi prodotti sembrava però in grado di raccogliere l&#8217;eredità di Clipper. Inoltre il solo Flagship era multipiattaforma, ovvero disponibile sia per il sistema Windows, sia per Linux.</p>
<p>L&#8217;idea del compilatore Open Source coagulò un certo numero di programmatori e il sistema cominciò pian piano a prendere piede. Presto fu disponibile la versione per Linux, il che consente ad un programmatore di scrivere un programma e di poterlo compilare ed eseguire senza particolari modifiche nei due ambienti. Ad un certo punto la creatura si rivoltò al suo padrone, se così possiamo dire. Proprio perché era un progetto &#8220;libero&#8221; un gruppo di programmatori in disaccordo con Linares sulle linee da seguire nello sviluppo del compilatore si separò dal progetto originario dando vita a xHarbour, che sta per extended Harbour (2001). Di xHarbour esistono due versioni, una free ed una a pagamento, mentre di Harbour esiste solo la versione free. I due progetti, Harbour e xHarbour, hanno molto in comune dato che derivano dallo stesso tronco, ma le differenze ci sono e non sono poche.</p>
<p>La situazione attuale vede Harbour come un progetto più vasto e disponibile per molte diverse piattaforme, come Windows, Linux, Mac OS X, MINIX 3, Windows CE, Pocket PC, Symbian, iPhone, QNX, VxWorks, OS/2/eComStation, BeOS/Haiku, AIX (xHarbour supporta in pratica solo Windows e Linux). Mediante il contributo di molti programmatori indipendenti il linguaggio dispone oggi di numerose alternative anche a livello di GUI oltre al citato Fivewin (che rimane comunque nella sua posizione di preminenza) e può collegarsi a SQL server come Oracle, PostgreSQL, MySQL ecc. e sfruttare tutta la potenza degli attuali PC a 32 o 64 bit. Personalmente utilizzo entrambi i compilatori in ambiente Windows e il solo Harbour in ambiente Linux. Lo sviluppo è costante e la comunità di programmatori è in perenne contatto in tutto il mondo mediante forum tecnici di discussione e mailing list.</p>
]]></content:encoded>
			<wfw:commentRss>https://www.appliserver.com/wordpress/?feed=rss2&#038;p=31</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
