PDA

View Full Version : [C++]Unire più file .exe


Pagine : 1 [2] 3

tomminno
28-03-2008, 11:47
Ti lamenti per poco. Usa Visual Studio su una codebase da 2M di loc e poi troverai nuovi significati al termine "frustrazione".

Esistono alternative più valide di VS in questi casi?

tomminno
28-03-2008, 11:48
Poi ho iniziato a lavorare con il designer (dato che era un Dialog) per modificare il secondo dialog, eliminando componenti che non mi servivano, aggiungendone altri e rinominandoli e mi è scoppiato tutto.
Ovviamente me ne sono accorto solo quando sono andato a riaprire il file originale nel designer.... :muro:


Ah! Le partial class :asd:
Avendo copiato il file lui ha preso come riferimento sottostante la stessa partial class (generata automaticamente dall'editor) del file originale.

In questo caso è un problema che niente ha a che vedere con il refactoring, questo è proprio un problema intrinseco del funzionamento del C# dal 2.0 in poi.


what is Ankh? :fagiano:


Plugin SVN per VS.


Con eclipse se copi il file nella stessa directory ti rinomina anche la classe seguendo il nome del nuovo file.
Ma in effetti fa lo stesso anche se fai un semplice rename di file o se lo sposti di package.
Tutto in automatico e finora non mi pare mai di averlo visto creare casini.


Java non usa le partial class per l'interfaccia grafica, generando sotto banco tonnellate di codice altamente incomprensibile, come fa C# per mezzo dell'editor.


:doh:
ennesimo motivo per non programmare in c++... come se non ce ne fossero già abbastanza :asd:


Sinceramente a me il C++ piace e non capisco tutto questo astio nei confronti di questo linguaggio.

M$ sta spingendo il .NET e tutto il resto è rimasto fermo, quindi chi sviluppa in C++ è un cretino da trascurare.

fek
28-03-2008, 12:12
Esistono alternative più valide di VS in questi casi?

Si'. La preghiera.

cdimauro
28-03-2008, 12:19
Io ti conosco come persona ragionevole, non in questa veste da Criceto, davvero.

Per usare Python da shell devi scaricare qualcosa? Si'. L'ambiente.
Per usare C# da shell devi scaricare qualcosa? Si'. Il programmino che ti fa da shell.

Che sia terze parti, prime parti, prodotto dal padre eterno in persona non cambia nulla, C# puo' essere usato da shell esattamente come Python scaricando l'apposito strumento. Con C# neppure ti serve l'SDK, ti basta il programmino. Come volevasi dimostrare.
No, il programmino non ti basta. Hai dimenticato da dove è partito questo ramo della discussione. Ecco qui: http://www.hwupgrade.it/forum/showpost.php?p=21741819&postcount=213

Della shell possiamo fare a meno, infatti. Il concetto è che io questo:
pippo = open('Pippo.txt').read()

t = 0
for ch in pippo:
if ch == 'a': t += 1

print "Ecco i caratteri 'a': ", t
codice lo posso eseguire così com'è.

Io posso:
- aprirmi un prompt dei comandi e digitare python Pippo.py per lanciarlo;
- trascinare l'icona di Pippo.py nel file pythonw.exe;
- aprirmi un prompt dei comandi, digitare python senza argomenti per lanciare la shell interattiva, e incollare il codice di cui sopra;
- usare qualunque IDE che abbia scaricato da qualunque posto e darglielo in pasto.

Il sorgente non mi cambia di una virgola: è quello. La scelta di come farlo eseguire, è tutta mia.

In C#, oltre al codice "nudo e crudo" che ti fa il lavoro vero e proprio devi inserire il "contorno" di cui parlavo prima:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace Stampofile
{
class Program
{
static void Main(string[] args)
{
// Qui ci sta il codice vero e proprio.
}
}
}
Detto ciò, non vedo cosa ci sia di irragionevole nell'affermare che il "pacchetto base" di Python sia costituito da VM, "compilatore" e librerie standard: sono cose che trovi in qualunque "distribuzione" di questo ambiente.

Per lavorare in C# almeno un compilatore da riga di comando MS te lo dà, Mono su Linux & OS X pure.

Non v'è, dunque, alcuna differenza: qualcosa per compilare il codice devi averlo, per poi poterlo eseguire. Questo è il concetto fondamentale e spero che almeno su questo saremo tutti d'accordo.

Della shell, infatti, possiamo farne a meno, non c'è problema: tanto la questione che era stata sollevata era un'altra, e cioé che il codice di cui sopra in Python non richiede nessun "contorno", qualunque sia l'ambiente sul quale lo farai girare: command line, shell interattiva, IDE, ecc.

Poi ognuno è libero di scaricarsi tutte le utility di questo mondo, non c'è problema. ;)

fek
28-03-2008, 12:35
No, il programmino non ti basta. Hai dimenticato da dove è partito questo ramo della discussione.

Non e' vero la Shell basta e avanza per eseguire codice C#.

Io posso:
- aprirmi un prompt dei comandi e digitare python Pippo.py per lanciarlo;
- trascinare l'icona di Pippo.py nel file pythonw.exe;
- aprirmi un prompt dei comandi, digitare python senza argomenti per lanciare la shell interattiva, e incollare il codice di cui sopra;
- usare qualunque IDE che abbia scaricato da qualunque posto e darglielo in pasto.


Esattamente come in C#.


Il sorgente non mi cambia di una virgola: è quello. La scelta di come farlo eseguire, è tutta mia.

Esattamente come in C#.


In C#, oltre al codice "nudo e crudo" che ti fa il lavoro vero e proprio devi inserire il "contorno" di cui parlavo prima:

Non devi, puoi. Quando usi una shell o un programmino di scripting e' perfettamente equivalente a Python quando usa una shell. Chi produce questo pezzo di software e' del tutto ortogonale alla soluzione del problema "Eseguire codice C# come un linguaggio di scripting".


Della shell, infatti, possiamo farne a meno, non c'è problema: tanto la questione che era stata sollevata era un'altra, e cioé che il codice di cui sopra in Python non richiede nessun "contorno", qualunque sia l'ambiente sul quale lo farai girare: command line, shell interattiva, IDE, ecc.

Quel codice di Python non richiede alcun contorno perche' quel contorno e' stato scritto da qualcun altro nell'interprete. Esattamente come quel contorno per C# puo' essere scritto da qualcun altro.

L'ambiente .NET, inoltre, ti fornisce la flessibilita' di poterlo (non doverlo) scrivere da solo dove necessario.

Stai facendo grossa confusione fra l'ambiente che fa da host al linguaggio, e la grammatica del linguaggio. Scrivere o meno quel contorno non e' una caratteristica del linguaggio, ma dell'ambiente nel quale questo linguaggio e' ospitato.

Mi sembra di discutere con Criceto :|

cdimauro
28-03-2008, 12:55
OK, quindi puoi scrivere questo:
string pippo = File.ReadAllText("Pippo.txt");

int t = 0;
foreach (char ch in pippo)
if (ch == 'a') t++;

Console.WriteLine("Ecco i caratteri 'a': "+t);
codice così com'è, e ti funzionerà?

Giusto per capire.

cionci
28-03-2008, 12:56
Fortunatamente no :D
Sono l'unico che on ci vede assolutamente alcun vantaggio nel poterlo fare ? Se ci fate caso è la stessa cosa che permette di fare il "blasonato" PHP ;)

fek
28-03-2008, 12:59
OK, quindi puoi scrivere questo:
string pippo = File.ReadAllText("Pippo.txt");

int t = 0;
foreach (char ch in pippo)
if (ch == 'a') t++;

Console.WriteLine("Ecco i caratteri 'a': "+t);
codice così com'è, e ti funzionerà?

Giusto per capire.

Assolutamente si'. Tutta la parte di Code Generation e CodeDom di C# e' ottima.

cdimauro
28-03-2008, 13:01
Fortunatamente no :D
Sono l'unico che on ci vede assolutamente alcun vantaggio nel poterlo fare ? Se ci fate caso è la stessa cosa che permette di fare il "blasonato" PHP ;)
Non è questione di vantaggio o meno: in Python non serve dover definire una classe con un metodo Main statico (come in Java) per poter lanciare un qualunque pezzo di codice. ;)

La similitudine con PHP finisce qui: in Python ogni file è un modulo, con tutte le conseguenze del caso.

PHP, invece, è il degno erede del C: include a manetta.

Sono due approcci completamente diversi. ;)
Assolutamente si'. Tutta la parte di Code Generation e CodeDom di C# e' ottima.
Mai sentito di queste cose: mi devo aggiornare.

Va bene, grazie :)

fek
28-03-2008, 13:01
Fortunatamente no :D
Sono l'unico che on ci vede assolutamente alcun vantaggio nel poterlo fare ? Se ci fate caso è la stessa cosa che permette di fare il "blasonato" PHP ;)

Non so sei l'unico, ma spesso e' volentieri poter generare codice da altro codice e compilarlo al volo (ovvero l'idea di base della shell della quale stavamo parlando) e' una cosa utilissima. Il sistema di generazione degli shader del quale parlavo, ad esempio, non e' altro che un generatore di codice HLSL, che usa il compilatore HLSL per generare i binari. Ma logicamente e' equivalente a generare codice C# (o leggerlo da tastiera, o da file, o da dove pare a Cesare :D), compilarlo e eseguirlo.

cionci
28-03-2008, 13:02
Ma grazie a quella shell si può fare...in pratica è un equivalente del comando eval di tanti linguaggi interpretati ?

fek
28-03-2008, 13:03
Non è questione di vantaggio o meno: in Python non serve dover definire una classe con un metodo Main statico (come in Java) per poter lanciare un qualunque pezzo di codice. ;)

Perche' lo fa implicitamente l'ambiente, non c'entra con il linguaggio! :muro:

fek
28-03-2008, 13:08
Ma grazie a quella shell si può fare...in pratica è un equivalente del comando eval di tanti linguaggi interpretati ?

Si'.
E' molto piu' flessibile, ma credo non ci voglia molto a scrivere l'esatto equivalente di un eval.

Esempietto:

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
class Program
{
static void Main(string[] args)
{
var csc = new CSharpCodeProvider(new Dictionary<string, string>() { { "CompilerVersion", "v3.5" } });
var parameters = new CompilerParameters(new[] { "mscorlib.dll", "System.Core.dll" }, "foo.exe", true);
parameters.GenerateExecutable = true;
CompilerResults results = csc.CompileAssemblyFromSource(parameters,
@"using System.Linq;
class Program {
public static void Main(string[] args) {
var q = from i in Enumerable.Rnge(1,100)
where i % 2 == 0
select i;
}
}"
);
results.Errors.Cast<CompilerError>().ToList().ForEach(error => Console.WriteLine(error.ErrorText));
}
}



Al posto di quella stringa puoi passare un file, ad esempio, con il codice da mettere dentro il main per avere l'esatto equivalente di Python in 10 righe di codice.
Poi un sistema piu' robusto richiedera' un po' piu' di lavoro (ad esempio il parsing delle clausole using), ma concettualmente e' tutto qui.

cdimauro
28-03-2008, 13:09
Scusami, ma nelle specifiche del (linguaggio) C# è previsto che il codice "di partenza" venga eseguito da una classe che abbia un metodo Main statico?

Nelle specifiche di Python (linguaggio) no.

L'ambiente non l'ho tirato in mezzo.

fek
28-03-2008, 13:12
Scusami, ma nelle specifiche del (linguaggio) C# è previsto che il codice "di partenza" venga eseguito da una classe che abbia un metodo Main statico?

No. E' una specifica dell'ambiente di .NET.
Il CLR si va a cercare nell'assembly una classe con un Main statico e la esegue.
Se il codice C#, ad esempio, viene eseguito da NUnit, l'ambiente si va a cercare tutti i metodi con un attributo Test ed esegue quelli.
Il linguaggio specifica solo la grammatica.


L'ambiente non l'ho tirato in mezzo.

E qui sta il tuo errore, quale metodo, codice, classe lanciare e' un problema definito dall'ambiente host, non dal linguaggio.

Esempio di valutatore di espressioni matematiche scritte in C#:

http://www.c-sharpcorner.com/UploadFile/mgold/CodeDomCalculator08082005003253AM/CodeDomCalculator.aspx?ArticleID=b6bf78d0-28cd-4622-ab4d-f253533dc018

cdimauro
28-03-2008, 13:20
OK, ho capito cosa intendi finalmente (lo so: sono duro :D).

Io m'ero lasciato ingannare da questo http://download.microsoft.com/download/3/8/8/388e7205-bc10-4226-b2a8-75351c669b09/CSharp%20Language%20Specification.doc

The Hello class declared by the “Hello, World” program has a single member, the method named Main. The Main method is declared with the static modifier. While instance methods can reference a particular enclosing object instance using the keyword this, static methods operate without reference to a particular object. By convention, a static method named Main serves as the entry point of a program.

Comunque qui parla di convenzione, in effetti: non è un obbligo.

DioBrando
28-03-2008, 14:18
Ti spiego, questo perché l'unico che posta quando qualcuno chiede "con quale linguaggio posso fare questo" è sempre e solo Cesare e la risposta è sempre e solo Python. Una situazione del genere mi sembra più vicina al tentativo di indottrinamento che al consiglio sulla base delle effettive qualità del linguaggio e le necessità del richiedente. E' per questo che questa volta mi sono permesso non solo di consigliare una strada alternativa, ma anche di giustificarla. Spesso non lo faccio (e lascio che non ci siano contraddittori), ma questa volta mi è sembrato giusto, visto che la situazione lo richiedeva.
Obiettivamente, visti gli scopi di chi ha creato il thread, cioè creare un programma di monitoraggio e rilevamento della caratteristiche hardware, avresti consigliato Python ? Questo un giorno potrebbe avere la necessità di scrivere un driver...e gli si consiglia Python ?

Sinceramente non ho seguito bene tutto il thread quindi non sò quali siano le esigenze dell'autore; in ogni caso sempre se non ho capito male mi pare sia a digiuno quasi totale dell'argomento programmazione quindi sostanzialmente si trattava di consigliare uno strumento affinchè potesse imparare.
In questo contesto immagino entri il consiglio di Cesare, che per altro non è vero che raccomanda sempre e solo Python: se vai a rileggerti gli ultimi thread (anche piuttosto lunghi a dire il vero) che hanno toccato questo argomento, i consigli suoi sono quelli + o - di tutti, ovvero di cominciare con un linguaggio piuttosto didattico che con strumenti di sviluppo adeguati al livello di esperienza e che consentano una curva di apprendimento bilanciata tra il tempo investito ad imparare come funzionano rispetto alla necessità di essere produttivi (Java, C#, Python, Ruby, sempre quelli sono).
Che poi questo debba essere valutato anche in un'ottica di esigenze soggettive sono d'accordo ma fino a un certo punto, perchè alla fine l'obiettivo è quello di imparare a programmare e i primi passi saranno uguali per tutti a prescindere dal futuro lavorativo e la branca di specializzazione scelta.

A me sembra stiate montando un caso per niente, finchè si scherza ok, poi però lo scherzo a un certo punto finisce...
Sulla non sufficiente conoscenza di C# per poter fare un confronto a tutto tondo si è espresso lui stesso più volte e mi sembra si possa dire serenamente che non ci siano problemi se qualcosa sfugga tra gli interlocutori.


Quindi secondo te uno che inizia dovrebbe automaticamente cominciare con Python sempre e comunque ? Secondo me dipende anche dalle motivazioni per cui inizia a programmare.
Di conseguenza io ho consigliato C# per diminuire il suo percorso di apprendimento, visto che un giorno vorrebbe andare a lavorare a basso livello.
Credo che un percorso di apprendimento Python -> C# -> C++ sia ben più lungo di un percorso C# -> C++, nonostante la supposta facilità di apprendimento del Python rispetto al C#, soprattutto considerando la distanza fra questi due linguaggi.

Partendo dal presupposto che imparare a programmare per poter scrivere driver mi sembra fare un percorso un po' troppo vincolante (anche perchè suppongo, presumo che l'autore del thread se mai dovesse diventare un programmatore, se mai dovesse lavorare nel settore, dubito si trovi a scrivere driver per tutta la sua vita e basta...o almeno me lo auguro :D), il tuo consiglio è ragionevole ma non dimenticare che Python può essere esteso tramite librerie native C e C++ (quest'ultimo attraverso Boost per esempio).
Il core stesso è stato scritto in C (progetto PyPy a parte).

Quindi se è vero che dal punto di vista sintattico ci siano delle differenze tra Python e i linguaggi C-like, non è vero per quanto riguarda il supporto e gli strumenti messi a disposizione.
E quindi un percorso diverso da quello che hai messo in luce tu non è così assurdo.
Chiaramente per poterlo consigliare e prenderlo in esame bisogna anche averci lavorato, oltre che leggere qualche specifica qui e là...questo sempre nel discorso di cui ti facevo sopra riguardo all'esperienza.

cionci
28-03-2008, 18:28
i consigli suoi sono quelli + o - di tutti, ovvero di cominciare con un linguaggio piuttosto didattico che con strumenti di sviluppo adeguati al livello di esperienza e che consentano una curva di apprendimento bilanciata tra il tempo investito ad imparare come funzionano rispetto alla necessità di essere produttivi (Java, C#, Python, Ruby, sempre quelli sono).
Mai detto il contrario, infatti ho consigliato C#.
Che poi questo debba essere valutato anche in un'ottica di esigenze soggettive sono d'accordo ma fino a un certo punto, perchè alla fine l'obiettivo è quello di imparare a programmare e i primi passi saranno uguali per tutti a prescindere dal futuro lavorativo e la branca di specializzazione scelta.
Invece secondo me è fondamentale, se il linguaggio con cui si inizia permette di avvicinarsi all'obiettivo che ci siamo prefissi sarà sicuramente più divertente imparare e molto più appagante.

Chiaro che non debba, fare solo driver, infatti gli ho consigliato C# :D

Cesare è libero di consigliare sempre Python come io sono libero di elencarne quali secondo me sono i difetti di tale linguaggio ed i motivi per cui me ne tengo lontano (sempre partendo da quello che ho letto).
Quindi davvero secondo te conviene partire da Python e non da C# se una persona si pone l'obiettivo di scrivere programmi che interagiscono a basso livello con l'hardware ? Secondo me è un'assurdità.
Nota bene che io non dico che sia un'assurdità imparare a programmare con Python, tutt'altro, dico che è assurdo in questo caso.

okay
28-03-2008, 22:06
Mai detto il contrario, infatti ho consigliato C#.

Invece secondo me è fondamentale, se il linguaggio con cui si inizia permette di avvicinarsi all'obiettivo che ci siamo prefissi sarà sicuramente più divertente imparare e molto più appagante.

Chiaro che non debba, fare solo driver, infatti gli ho consigliato C# :D

Cesare è libero di consigliare sempre Python come io sono libero di elencarne quali secondo me sono i difetti di tale linguaggio ed i motivi per cui me ne tengo lontano (sempre partendo da quello che ho letto).
Quindi davvero secondo te conviene partire da Python e non da C# se una persona si pone l'obiettivo di scrivere programmi che interagiscono a basso livello con l'hardware ? Secondo me è un'assurdità.
Nota bene che io non dico che sia un'assurdità imparare a programmare con Python, tutt'altro, dico che è assurdo in questo caso.



scusa cionci... sono rientrato adesso e mi metto a riposare sono stato a cena e sono alticcio...;)

Non è il caso che apro un 3d (ma leggendo questo che seguo) mi viene da chiederti una cosa.

Hai chiuso il 3d a quell'utente che chiedeva un programmino perchè il suo amico aveva al massimo 50 ore di adsl ecc ecc e gli hai messo il link di dove scaricarei programma già bello che pronto... okay và bene.

Io però gli avevo promesso che gli è lo avrei fatto per lunedì/martedi mentre invece l'ho finito... l'ho fatto solo per mio divertimento (hobby nei ritagli di tempo)... và bhè.

Dunque anche se non gli passo il programma (free naturalmente) mi sono fermato su questa cosa, che ora sono alticcio e non mi di ragionarci (domani magari...) tanto per finire il prg iniziato.


Dunque ho fatto una cosa semplice si lancia il prg e si dà lo start prendo il Timer e controllo i secondi passati:

la classica cosa per il tempo

iTimeLeft = Timer - iTime
iTime = Timer
'la classica cosa...

questa è la funzione in cui stampo i valori di hh:mm:ss

Public Function MyFormat(ByVal iTime As Double) As String
hh = iTime \ 3600
iTime = iTime - hh * 3600
mm = iTime \ 60
iTime = iTime - mm * 60
ss = iTime
MyFormat0 = Format(hh, "00") & ":" & Format(mm, "00") & ":" & Format(ss, "00")

End Function


okay


ora quando esce dal programma salvo le ore i minuti e i secondi

quindi all'apertura del prg rileggo in input ore, minuti e secondi bene la domanda è:

Considerando che faccio per conteggiare il tempo Timer

Come faccio, supponendo che il formato di partenza è ora es.: 02:12:08

a riprendere da quì e continuare con il conteggio?

Devo per caso aggiungere a Timer (che sono i secondi trascorsi) 2*3600+12*60+8...???

ora vado a cuccia... a domani

cdimauro
28-03-2008, 22:33
Quindi davvero secondo te conviene partire da Python e non da C# se una persona si pone l'obiettivo di scrivere programmi che interagiscono a basso livello con l'hardware ? Secondo me è un'assurdità.
Nota bene che io non dico che sia un'assurdità imparare a programmare con Python, tutt'altro, dico che è assurdo in questo caso.
from ctypes import *
hw = windll.WinRing0

def c_intToStr(Value):
return ''.join(chr((Value >> Shift) & 255) for Shift in (0, 8, 16, 24))

def c_intToNibbles(Value):
return tuple((Value >> Shift) & 15 for Shift in(0, 4, 8, 12, 16, 20, 24, 28))

def BitSetToStringList(Value, Names):
List = []
for Name in Names:
if Name and (Value & 1):
List.append(Name)
Value >>= 1
return List

def CPUID(Function):
eax = c_int(); ebx = c_int(); ecx = c_int(); edx = c_int()
hw.Cpuid(Function, byref(eax), byref(ebx), byref(ecx), byref(edx))
return eax.value, ebx.value, ecx.value, edx.value

EDXFeatures = ('Floating-point unit on-Chip',
'Virtual Mode Extension',
'Debugging Extension',
'Page Size Extension',
'Time-Stamp Counter',
'Model Specific Registers',
'Physical Address Extension',
'Machine Check Exception',
'CMPXCHG8 Instruction Supported',
'On-chip APIC Hardware Supported',
'',
'Fast System Call',
'Memory Type Range Registers',
'Page Global Enable',
'Machine Check Architecture',
'Conditional Move Instruction Supported',
'Page Attribute Table',
'36-bit Page Size Extension',
'Processor serial number is present and enabled',
'CLFLUSH Instruction supported',
'',
'Debug Store',
'Thermal Monitor and Software Controlled Clock Facilities supported',
'Intel Architecture MMX technology supported',
'Fast floating point save and restore',
'Streaming SIMD Extensions supported',
'Streaming SIMD Extensions 2',
'Self-Snoop',
'Multi-Threading',
'Thermal Monitor supported',
'IA64 Capabilities',
'Pending Break Enable')

ECXFeatures = ('Streaming SIMD Extensions 3',
'',
'64-Bit Debug Store',
'MONITOR/MWAIT',
'CPL Qualified Debug Store',
'Virtual Machine Extensions',
'Safer Mode Extensions',
'Enhanced Intel SpeedStep Technology',
'Thermal Monitor 2',
'Supplemental Streaming SIMD Extensions 3',
'Context ID',
'',
'',
'CMPXCHG16B',
'Send Task Priority Messages',
'Performance Capabilities MSR',
'',
'',
'Direct Cache Access',
'Streaming SIMD Extensions 4.1',
'Streaming SIMD Extensions 4.2',
'',
'',
'POPCNT instruction',
'',
'',
'',
'',
'',
'',
'',
'RAZ')

try:
hw.InitializeDll()

eax, ebx, ecx, edx = CPUID(0)
print 'CPU VendorID is:', c_intToStr(ebx) + c_intToStr(edx) + c_intToStr(ecx)

eax, ebx, ecx, edx = CPUID(0x80000002)
Brand = c_intToStr(eax) + c_intToStr(ebx) + c_intToStr(ecx) + c_intToStr(edx)
eax, ebx, ecx, edx = CPUID(0x80000003)
Brand += c_intToStr(eax) + c_intToStr(ebx) + c_intToStr(ecx) + c_intToStr(edx)
eax, ebx, ecx, edx = CPUID(0x80000004)
Brand += c_intToStr(eax) + c_intToStr(ebx) + c_intToStr(ecx) + c_intToStr(edx)
print 'CPU Brand is:', ''.join(Ch for Ch in Brand if Ch != '\x00')

eax, ebx, ecx, edx = CPUID(1)
print 'CPU Stepping: %s, Model: %s, Family: %s, Processor Type: %s' % c_intToNibbles(eax)[ : 4]

print 'CPU Features:'
for Feature in BitSetToStringList(edx, EDXFeatures) + BitSetToStringList(ecx, ECXFeatures):
print ' ', Feature
finally:
hw.DeinitializeDll()
OUTPUT:
CPU VendorID is: AuthenticAMD
CPU Brand is: AMD Athlon(tm) 64 Processor 2800+
CPU Stepping: 0, Model: 12, Family: 15, Processor Type: 0
CPU Features:
Floating-point unit on-Chip
Virtual Mode Extension
Debugging Extension
Page Size Extension
Time-Stamp Counter
Model Specific Registers
Physical Address Extension
Machine Check Exception
CMPXCHG8 Instruction Supported
On-chip APIC Hardware Supported
Fast System Call
Memory Type Range Registers
Page Global Enable
Machine Check Architecture
Conditional Move Instruction Supported
Page Attribute Table
36-bit Page Size Extension
CLFLUSH Instruction supported
Intel Architecture MMX technology supported
Fast floating point save and restore
Streaming SIMD Extensions supported
Streaming SIMD Extensions 2
E' abbastanza assurdo per te? :p

P.S. Il programma ha bisogno che i file WinRing0.dll e WinRing0.sys della cartella "release" del progetto http://openlibsys.org/ siano presenti nella cartella da cui verrà lanciato (oppure che si trovino nel path). ;)

gugoXX
28-03-2008, 23:10
Dai, cosi' torniamo anche un po' In-Topic.
Comunque scherzo, lasciami questa licenza poetica.
Tanto l'ho capito che lo puoi fare in IronPython (forse)
E comunque questo sottolinea come la liberia (Framework) faccia tantissimo.
E qui sto solo interrogando il processore.
Ce ne sarebbe da tirare fuori... si potrebbe fare un bel clone di SisoftSandra.
Forse anche qualcosa di piu'.

Ahiahiahi signora Longari, quanto codice :D

ManagementClass mc = new ManagementClass("Win32_Processor");
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
Console.WriteLine("---------------");
Console.WriteLine(mo.Properties["DeviceID"].Value);
Console.WriteLine("---------------");
var props=mo.Properties.Cast<PropertyData>();
var sysprops = mo.SystemProperties.Cast<PropertyData>();
var insieme = props.Union(sysprops);
var filtrino = insieme.Where(u => u.Value != null);
var ordino = filtrino.OrderBy(u => u.Name);

foreach (var inst in ordino)
{
Console.WriteLine("{0} - {1}", inst.Name, inst.Value);
}
}

Risultato

---------------
CPU0
---------------
__CLASS - Win32_Processor
__DERIVATION - System.String[]
__DYNASTY - CIM_ManagedSystemElement
__GENUS - 2
__NAMESPACE - root\cimv2
__PATH - \\INTELE6600\root\cimv2:Win32_Processor.DeviceID="CPU0"
__PROPERTY_COUNT - 44
__RELPATH - Win32_Processor.DeviceID="CPU0"
__SERVER - INTELE6600
__SUPERCLASS - CIM_Processor
AddressWidth - 32
Architecture - 0
Availability - 3
Caption - x86 Family 6 Model 15 Stepping 6
CpuStatus - 1
CreationClassName - Win32_Processor
CurrentClockSpeed - 3000
CurrentVoltage - 13
DataWidth - 32
Description - x86 Family 6 Model 15 Stepping 6
DeviceID - CPU0
ExtClock - 332
Family - 2
L2CacheSize - 4096
Level - 6
LoadPercentage - 0
Manufacturer - GenuineIntel
MaxClockSpeed - 3000
Name - Intel(R) Core(TM)2 CPU 6600 @ 2.40GHz
PowerManagementSupported - False
ProcessorId - BFEBFBFF000006F6
ProcessorType - 3
Revision - 3846
Role - CPU
SocketDesignation - Socket 775
Status - OK
StatusInfo - 3
Stepping - 6
SystemCreationClassName - Win32_ComputerSystem
SystemName - INTELE6600
UpgradeMethod - 4
Version - Model 15, Stepping 6
---------------
CPU1
---------------
__CLASS - Win32_Processor
__DERIVATION - System.String[]
__DYNASTY - CIM_ManagedSystemElement
__GENUS - 2
__NAMESPACE - root\cimv2
__PATH - \\INTELE6600\root\cimv2:Win32_Processor.DeviceID="CPU1"
__PROPERTY_COUNT - 44
__RELPATH - Win32_Processor.DeviceID="CPU1"
__SERVER - INTELE6600
__SUPERCLASS - CIM_Processor
AddressWidth - 32
Architecture - 0
Availability - 3
Caption - x86 Family 6 Model 15 Stepping 6
CpuStatus - 1
CreationClassName - Win32_Processor
CurrentClockSpeed - 3000
CurrentVoltage - 13
DataWidth - 32
Description - x86 Family 6 Model 15 Stepping 6
DeviceID - CPU1
ExtClock - 332
Family - 2
L2CacheSize - 4096
Level - 6
LoadPercentage - 0
Manufacturer - GenuineIntel
MaxClockSpeed - 3000
Name - Intel(R) Core(TM)2 CPU 6600 @ 2.40GHz
PowerManagementSupported - False
ProcessorId - BFEBFBFF000006F6
ProcessorType - 3
Revision - 3846
Role - CPU
SocketDesignation - Socket 775
Status - OK
StatusInfo - 3
Stepping - 6
SystemCreationClassName - Win32_ComputerSystem
SystemName - INTELE6600
UpgradeMethod - 4
Version - Model 15, Stepping 6

DioBrando
29-03-2008, 00:27
Mai detto il contrario, infatti ho consigliato C#.


Non hai capito quello che ho scritto.
Io mi riferivo al fatto che adducevi ma non solo tu, che Cesare ogni volta che ci sia una richiesta di consiglio su quale linguaggio utilizzare lui spunti fuori sempre e solo con Python.
Questo non è vero, ti invito a prendere i thread di cui sopra per accertartene, i consigli che dà sono quelli che diamo + o - tutti (perchè sono quelli + sensati, per chi si avvicina alla programmazione da neofita).


Invece secondo me è fondamentale, se il linguaggio con cui si inizia permette di avvicinarsi all'obiettivo che ci siamo prefissi sarà sicuramente più divertente imparare e molto più appagante.

Peccato che dietro questa motivazione poi si diano consigli allucinanti quali quelli di iniziare con C o C++.
Ah poi ci sono i geni della lampada che citano Assembly o dicono che la allocazione/deallocazione della memoria, insieme alle eccezioni sono mattoni fondamentali per imparare a programmare.
Ma vabbè qui scendiamo nel paranormale...


Chiaro che non debba, fare solo driver, infatti gli ho consigliato C# :D

Cesare è libero di consigliare sempre Python come io sono libero di elencarne quali secondo me sono i difetti di tale linguaggio ed i motivi per cui me ne tengo lontano (sempre partendo da quello che ho letto).

Cionci, tu forse non hai capito la critica che ti sto muovendo e il fatto per cui tu debba ogni volta "crocifiggere Python", quindi te la riscrivo in parole più chiare.
Partendo dal presupposto ( e ci mancherebbe) che ognuno è libero di dire quello che vuole e che vi sono caratteristiche di un linguaggio che possano piacere o non piacere a prescindere, trovo che la critica mossa a priori sempre e comunque da chi in Python non ci ha mai sviluppato seriamente sia un po' debole rispetto a chi l'ha fatto, sia che lo critichi sia che invece ne apprezzi le caratteristiche.


Quindi davvero secondo te conviene partire da Python e non da C# se una persona si pone l'obiettivo di scrivere programmi che interagiscono a basso livello con l'hardware ?

Rileggi quel che ti ho scritto, perchè il significato che hai inteso non è quello che le mie parole dicono.
Ho scritto che pensare ad un percorso come quello prospettato da Cesare non è così assurdo, non che sia migliore o preferibile rispetto al tuo (per altro non avendo mai avuto esperienze simili nè essendomi mai trovato a scrivere driver, trovo difficile dare dei consigli così netti come fate voi).


Secondo me è un'assurdità.
Nota bene che io non dico che sia un'assurdità imparare a programmare con Python, tutt'altro, dico che è assurdo in questo caso.

Ok allora spiegami quale sarebbe l'assurdità.
Hai la possibilità di interfacciarti con le librerie C/C++ piuttosto facilmente, hai la possibilità di accedere alle API di Windows, gli ambienti di sviluppo sono comuni (alcuni peculiari per Python come ce ne sono per C++ ecc. ma la maggiorparte, quelli multilinguaggio supportano sia Python che C++ che C#...), dove starebbe il problema?
Sintassi a parte, qualche caratteristica che può non piacere...ok ma siamo lontani da quello che definisco io come "assurdo".
Io almeno, per cui vorrei sapere i motivi per cui definisci un percorso come quello prospettato in questi termini così decisi e "sprezzanti".

cionci
29-03-2008, 08:38
Cesare: non sei riuscito a rilevare i dati che aveva messo nel suo esempio:
http://www.pctunerup.com/up//results/_200802/20080225172331_Immagine.PNG
Visto che la libreria non ci arriva ora come fai ?

DioBrando: mi sembra di non essere stato solo io ad aver notato che Cesare consiglia sempre Python, anche quando non c'entra assolutamente niente con l'argomento. Quindi un fondo di verità forse c'è ?
Io per obiettare sull'uso di Python mi baso su quello che ho visto di Python (chiaro che un minimo me lo sia guardato) e su quello che dice Cesare. Io obietto direttamente sugli argomenti che tira fuori lui come vantaggio. C'è qualcosa di errato in questa pratica ?
Ad esempio la questione multiparadigma: ho fatto la stessa critica decine di volte per quanto riguarda C++, Cesare lo cita come argomento a favore di Python, perché non posso muovere la stessa critica che muovo a C++ anche a Python ?

okay
29-03-2008, 09:43
OT x cionci come da mia richiesta di ieri sera:

ho risolto così:

iTimeLeft = Timer + iTimeLeft - iTime

okay tutto ok

cdimauro
29-03-2008, 09:45
Cesare: non sei riuscito a rilevare i dati che aveva messo nel suo esempio:
http://www.pctunerup.com/up//results/_200802/20080225172331_Immagine.PNG
Visto che la libreria non ci arriva ora come fai ?
Riccardo, il tuo problema è che parli senza nemmeno conoscere, e per giunta andando fuori tema.

Quello di sopra era un esempio che ho tirato fuori IN RISPOSTA A PRECISE COSE che avevi scritto in un messaggio, e che tra l'altro avevo pure sottolineato.

Giusto per ricordartelo, sostenevi questo:

obiettivo di scrivere programmi che interagiscono a basso livello con l'hardware

dico che è assurdo in questo caso


Ti ho dimostrato con un esempio "minchione" (leggi: è un banale "proof of concept") che posso accedere tranquillamente all'hardware anche con Python, e per far questo mi affido a una libreria che è stata scritta allo scopo e che fornisce esempi esclusivamente in C++ e C#.

Nessun altro mi risulta l'abbia usata finora con Python (ho fatto un po' di ricerche, ma non ho trovato nulla), per cui ho dovuto studiarmi quel tanto che basta della libreria standard ctypes per poterla usare allo scopo (ben 5 minuti!!!) e poi ho perso MOLTO più tempo a rispolverare i rispettivi manuali di Intel e AMD sull'argomento CPUID.

Per il resto con la shell interattiva ho smanettato un po' e man mano mi sono costruito tutto ciò che mi serviva, arrivando alla versione finale del programma, che se è tanto lungo è esclusivamente perché ho voluto fornire un output carino con informazioni più umane che una banale sfilza di 0 e 1 spiattellati per visualizzare le "feature" della CPU.

Come vedi con Python accedere a una QUALUNQUE libreria è una cazzata immane: bastano DUE righe di codice:
from ctypes import *
hw = windll.WinRing0
Niente include, niente namespace da definire che eseguono il wrapping delle funzionalità esposte, ma da adesso in poi posso utilizzare TUTTE le API che espone la libreria WinRing0.

Il resto è mero esercizio accademico.

Se vuoi ottenere TUTTE le informazioni presenti nell'immagine che hai riportato basta che vai a recuperare la documentazione di AMD sui suoi processori, e ti spulci gli altri registri di CPUID, i machine register, il real time clock, ed eventualmente le porte di I/O: tutte cose a cui puoi accedere tranquillamente e MOLTO semplicemente tramite quella libreria.
DioBrando: mi sembra di non essere stato solo io ad aver notato che Cesare consiglia sempre Python, anche quando non c'entra assolutamente niente con l'argomento. Quindi un fondo di verità forse c'è ?
Ma dove, scusa? Fammi un esempio in cui la soluzione che ho proposto non fosse attinente al topic.

Ad esempio ti ho appena fatto vedere che per lo scopo del thread Python si può usare tranquillamente, quando invece sono stato crocifisso soltanto perché avevo consigliato questo linguaggio per IMPARARE A PROGRAMMARE (vatti a rileggere il thread).
Io per obiettare sull'uso di Python mi baso su quello che ho visto di Python (chiaro che un minimo me lo sia guardato) e su quello che dice Cesare. Io obietto direttamente sugli argomenti che tira fuori lui come vantaggio. C'è qualcosa di errato in questa pratica ?
Ad esempio la questione multiparadigma: ho fatto la stessa critica decine di volte per quanto riguarda C++, Cesare lo cita come argomento a favore di Python, perché non posso muovere la stessa critica che muovo a C++ anche a Python ?
Perché non hai ancora capito come funziona Python, dove gli elementi con cui lavori sono tutti oggetti che... espongono delle funzionalità che puoi "combinare" come vuoi per simulare diversi paradigmi di programmazione.

Pura programmazione a oggetti, quindi (quasi: con Python 3.0 verrà rimosso qualche "refuso", tipo l'istruzione print che diventerà un oggetto built-in di tipo "funzione"; ma si tratta di quisquilie: pochissima roba che non inficia la generalità del discorso, e che comunque verranno sistemate con la prossima "major release" del linguaggio).

Tra l'altro hai fatto critiche a funzionalità che espongono tranquillamente linguaggi come Haskell che sono particolarmente apprezzate dai matematici, che non si scandalizzano certamente per un meccanismo come le list comprehension visto che lo trovano perfettamente "naturale".

Sui gusti non si discute, e se non ti piacciono certe cose io non ho nulla da dire, ma non mi pare il caso di muovergli una critica a tutto tondo, tra l'altro provando, da un esempio, a generalizzare sulla "bontà" del linguaggio, come hai fatto in passato, che non mi sembra un atteggiamento corretto...

cdimauro
29-03-2008, 09:48
Dai, cosi' torniamo anche un po' In-Topic.
Comunque scherzo, lasciami questa licenza poetica.
Tanto l'ho capito che lo puoi fare in IronPython (forse)
E comunque questo sottolinea come la liberia (Framework) faccia tantissimo.
E qui sto solo interrogando il processore.
Ce ne sarebbe da tirare fuori... si potrebbe fare un bel clone di SisoftSandra.
Forse anche qualcosa di piu'.

Ahiahiahi signora Longari, quanto codice :D
Sì, con IronPython puoi accedere al framework e quindi alle stesse informazioni. Il listato per fare le STESSE cose sarà, quindi, simile (e corto). ;)

Detto ciò, non so quali informazioni mette a disposizione la libreria che hai usato, ma ad esempio non noto tutte le informazioni sulle "feature" della CPU che, invece, ho tirato fuori col mio programmino.

Comunque la libreria che ho usato ha esempi esclusivamente per C++ e C#, quindi potresti provare a realizzare tu il codice necessario per tirare fuori le STESSE informazioni che ho visualizzato io (magari con lo stesso output).

Potrebbe essere un confronto utile, che ne dici? :)

gugoXX
29-03-2008, 10:27
Ma, sinceramente volevo provare a vedere se sarei riuscito a tirare fuori quello che serviva al nostro amico all'inizio, ovvero
-Frequenza CPU, nome CPU, Frequenza BUS e temperature.
I primi sono li', ma sono anche poi riuscito a tirare fuori la temperatura.

Comunque non e' una libreria generica.
E' l'incapsulamento di tutta la WMI messa a disposizione per .net, direttamente dalla Microsoft.
E' davvero immensa, penso che in qualche modo abbiano anche portato fuori le informazioni della CPUID, ma non ne sono sicuro.

Fra le sole Win32_Classes c'e' da sbizzarrirsi. Riporto qui un elenco
http://msdn2.microsoft.com/en-us/library/aa394084(VS.85).aspx

Ce ne sono anche tante altre. La temperatura (in decimi di Kelvin!!) l'ho trovata qui dentro, in mezzo ad altre cose.
root\WMI MSAcpi_ThermalZoneTemperature
I valori non sono tutti in sola lettura. Per esempio ho potuto cambiare la frequenza di campionamento della temperatura. Non mi ha dato errore, ma non ho controllato se e' stata recepita.
Ovviamente la tua utenza deve avere i privilegi per farlo, tipicamente administrator.

Se vuoi provare a leggere la WMI direttamente in Python con l'SDK puoi farlo, ma non so se e' altrettanto agevole.
Le classi bisogna scriverle almeno una volta, e io non l'ho dovuto fare perche' erano gia' tutte belle pronte.

Comunque per la sola CPUID e' chiaro che il programma e' una palla, il 90% delle tue righe erano solo la descrizione di ciascuno dei bit.
Se proprio dovessi eseguirla prenderei la strada con il minimo sforzo.
Poiche' in .net posso linkare progetti che arrivano da diversi linguaggi, nella soluzione aggiungerei semplicemente un progetto C++, con una sola funzione, il cui corpo sarebbe

public int getCPUID()
{
int ret;
__asm{
mov eax, 1
cpuid
mov ret, eax
}
return ret;
}

Dovrebbe funzionare anche al di fuori del ring0, ma mi riservo di provare.
In C# poi, per trasformare l'intero nei singoli bit userei semplicemente:

BitArray ba = new BitArray(BitConverter.GetBytes(fromCPUID));

Da li' si tratterebbe solo di stampare le stringhe pallosissimamente messe.

fek
29-03-2008, 11:30
Sì, con IronPython puoi accedere al framework e quindi alle stesse informazioni. Il listato per fare le STESSE cose sarà, quindi, simile (e corto). ;)

E meno leggibile.
Piu' corto non vuol dire migliore, piu' leggibile e piu' mantenibile. Meno punti funzionali vuol dire (generalmente) piu' semplice, non meno caratteri.

Secondo me in molti esempi di Python che ti ho visto scrivere fai un errore: ti fai prendere dallo scrivere "cute code" sfruttando caratteristiche del linguaggio. E questo e' sbagliato. Io spesso non capisco a prima vista il codice che riporti in Python, lo devo rileggere, poi andarmi a guardare quello che scrivi e cercare la caratteristica del linguaggio che hai usato.

Al contrario, spesso, io faccio leggere il mio codice ad un artista e se mi dice che non capisce quello che sto facendo, quando ho tempo, lo riscrivo in maniera piu' chiara.

Le caratteristiche del linguaggio vanno usate per scrivere codice piu' chiaro e leggibile, non perche' fa figo.

E ora per cortesia non riportarmi un paio di righe di Python dicendo "a me sembrano chiare", perche' nove su dieci lo sembrano solo a te e a chi conosce bene Python ;)

fek
29-03-2008, 11:35
Poiche' in .net posso linkare progetti che arrivano da diversi linguaggi, nella soluzione aggiungerei semplicemente un progetto C++, con una sola funzione, il cui corpo sarebbe

Farei anch'io cosi'. Quando per gioco ho scritto un engine 3d consumabile da .NET il lavoro era piacevolissimo. Scrivevo la classe .NET in C++/CLI (che e' molto simile a C#), dentro lo stesso metodo iniziavo a scrivere C++ nativo che faceva il lavoro sporco di pilotare D3D native. C# o Comega (al tempo) consumavano le classi ad alto livello per la gestione di Mesh, Fisica, Texture, etc. Comodo ed elegantissimo.

^TiGeRShArK^
29-03-2008, 13:49
Dai, cosi' torniamo anche un po' In-Topic.
Comunque scherzo, lasciami questa licenza poetica.
Tanto l'ho capito che lo puoi fare in IronPython (forse)
E comunque questo sottolinea come la liberia (Framework) faccia tantissimo.
E qui sto solo interrogando il processore.
Ce ne sarebbe da tirare fuori... si potrebbe fare un bel clone di SisoftSandra.
Forse anche qualcosa di piu'.

Ahiahiahi signora Longari, quanto codice :D

ManagementClass mc = new ManagementClass("Win32_Processor");
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
Console.WriteLine("---------------");
Console.WriteLine(mo.Properties["DeviceID"].Value);
Console.WriteLine("---------------");
var props=mo.Properties.Cast<PropertyData>();
var sysprops = mo.SystemProperties.Cast<PropertyData>();
var insieme = props.Union(sysprops);
var filtrino = insieme.Where(u => u.Value != null);
var ordino = filtrino.OrderBy(u => u.Name);

foreach (var inst in ordino)
{
Console.WriteLine("{0} - {1}", inst.Name, inst.Value);
}
}

fichissimo, pure io ho un Q6600@3.0 sulla mia workstation :asd:

gugoXX
29-03-2008, 13:53
fichissimo, pure io ho un Q6600@3.0 sulla mia workstation :asd:


NVidiaaaa... il mio e' solo un E6600 @ 3000 (a casa)
Mi ha tirato fuori solo 2 CPU infatti.

^TiGeRShArK^
29-03-2008, 14:03
NVidiaaaa... il mio e' solo un E6600 @ 3000 (a casa)
Mi ha tirato fuori solo 2 CPU infatti.

ah vabbè...non avevo fatto caso al numero di cpu :p
a casa cmq io ho solo un athlon 64 3000+@4000+ come pc fisso...
Il q6600 è al lavoro....
Però in effetti mi sto consolando col nuovo mac book pro :D

cionci
29-03-2008, 16:37
Ti ho dimostrato con un esempio "minchione" (leggi: è un banale "proof of concept") che posso accedere tranquillamente all'hardware anche con Python, e per far questo mi affido a una libreria che è stata scritta allo scopo e che fornisce esempi esclusivamente in C++ e C#.
Scusa, ma se la libreria che legge quello che serve al nostro amico non esiste...se la scrive da solo ? Per questo ho consigliato C#, perché con un solo strumento può fare tutto ciò che gli serve. Al contrario con Python dovrebbe impararsi a scrivere la libreria in C# o C++ e poi usarla con Python. Hai capito ora cosa intendo ?

wizard1993
29-03-2008, 17:10
Scusa, ma se la libreria che legge quello che serve al nostro amico non esiste...se la scrive da solo ? Per questo ho consigliato C#, perché con un solo strumento può fare tutto ciò che gli serve. Al contrario con Python dovrebbe impararsi a scrivere la libreria in C# o C++ e poi usarla con Python. Hai capito ora cosa intendo ?

scusate l'intromissione, sono perfettamente d'accordo con te cionci. non ha senso in python dover utilizzare una libreria in c++, a quel punto si usa la piattaforma .net
io modificherei l'affermazione di cdimauro così:"In python, we often trust"

cdimauro
29-03-2008, 21:13
Ma, sinceramente volevo provare a vedere se sarei riuscito a tirare fuori quello che serviva al nostro amico all'inizio, ovvero
-Frequenza CPU, nome CPU, Frequenza BUS e temperature.
I primi sono li', ma sono anche poi riuscito a tirare fuori la temperatura.
Mumble. Per il nome della CPU OK, ma per frequenza e bus non so se sono quelli fissi (rilevati alla partenza del s.o.) oppure calcolati dinamicamente.

Considerato lo scopo del progetto (che è orientato per gli overclocker), propenderei per la seconda, ma bisogna vedere, appunto, cosa viene restituito dalle classi WMI.
Comunque non e' una libreria generica.
E' l'incapsulamento di tutta la WMI messa a disposizione per .net, direttamente dalla Microsoft.
E' davvero immensa, penso che in qualche modo abbiano anche portato fuori le informazioni della CPUID, ma non ne sono sicuro.

Fra le sole Win32_Classes c'e' da sbizzarrirsi. Riporto qui un elenco
http://msdn2.microsoft.com/en-us/library/aa394084(VS.85).aspx
Ho fatto qualche ricerca, ma non ho trovato nulla su Win32_Classes e CPUID. Ho recuperato questa http://msdn2.microsoft.com/en-us/library/aa394373(VS.85).aspx ma parla di CPUID soltanto per quanto riguarda il tipo di processore:

ProcessorId
Data type: string
Access type: Read-only

Processor information that describes the processor features. For an x86 class CPU, the field format depends on the processor support of the CPUID instruction. If the instruction is supported, the property contains 2 (two) DWORD formatted values. The first is an offset of 08h-0Bh, which is the EAX value that a CPUID instruction returns with input EAX set to 1. The second is an offset of 0Ch-0Fh, which is the EDX value that the instruction returns. Only the first two bytes of the property are significant and contain the contents of the DX register at CPU reset—all others are set to 0 (zero), and the contents are in DWORD format.
Ce ne sono anche tante altre. La temperatura (in decimi di Kelvin!!) l'ho trovata qui dentro, in mezzo ad altre cose.
root\WMI MSAcpi_ThermalZoneTemperature
I valori non sono tutti in sola lettura. Per esempio ho potuto cambiare la frequenza di campionamento della temperatura. Non mi ha dato errore, ma non ho controllato se e' stata recepita.
Ovviamente la tua utenza deve avere i privilegi per farlo, tipicamente administrator.
Sì, dipende dalle informazioni a cui vuoi accedere e/o modificare. Per la CPUID non ce n'è bisogno: con un account limitato viene eseguita senza problemi.
Se vuoi provare a leggere la WMI direttamente in Python con l'SDK puoi farlo, ma non so se e' altrettanto agevole.
Le classi bisogna scriverle almeno una volta, e io non l'ho dovuto fare perche' erano gia' tutte belle pronte.
Ma non sono classi .NET? Se è così, dovrebbero essere accessibili senza problemi da IronPython...
Comunque per la sola CPUID e' chiaro che il programma e' una palla, il 90% delle tue righe erano solo la descrizione di ciascuno dei bit.
Esattamente. :) Ma volevo spedire in output qualcosa di umanamente comprensibile... :fagiano:
Se proprio dovessi eseguirla prenderei la strada con il minimo sforzo.
Poiche' in .net posso linkare progetti che arrivano da diversi linguaggi, nella soluzione aggiungerei semplicemente un progetto C++, con una sola funzione, il cui corpo sarebbe

public int getCPUID()
{
int ret;
__asm{
mov eax, 1
cpuid
mov ret, eax
}
return ret;
}

Dovrebbe funzionare anche al di fuori del ring0, ma mi riservo di provare.
Sì, funziona, ma per le altre istruzioni, tipo quelle per accedere ai machine register, serve essere in ring0.

Comunque l'approccio di cui sopra ti costringerebbe comunque a doverti scrivere un driver per poter lavorare in ring0 e accedere a tutte le informazioni che ti servono.

Considerato che la libreria che ho usato fa già tutto, sarebbe come reinventarsi la ruota...

Tra l'altro ha driver certificati MS e funziona su qualunque versione di Windows, anche x64 (io l'ho provata con Python a 32 bit su Vista x64 con utenza limitata). ;)
In C# poi, per trasformare l'intero nei singoli bit userei semplicemente:

BitArray ba = new BitArray(BitConverter.GetBytes(fromCPUID));

Da li' si tratterebbe solo di stampare le stringhe pallosissimamente messe.
Certamente. :)
E meno leggibile.
Piu' corto non vuol dire migliore, piu' leggibile e piu' mantenibile. Meno punti funzionali vuol dire (generalmente) piu' semplice, non meno caratteri.
Ma io avevo scritto questo:

simile (e corto)

in risposta a questo:

quanto codice

che aveva scritto gugoXX.

Volevo semplicemente sottolineare che con IronPython non ci sarebbero state sostanziali differenze (ho parlato di codice "simile", infatti), e visto che il codice di gugoXX è corto, sarebbe stato corto anche quello con IP. ;)

Non ho parlato di codice più o meno corto né tanto meno di maggior o minor leggibilità. :fagiano:

Tu invece stai ipotizzando che sarebbe meno leggibile, senza nemmeno averlo visto. :stordita:

Possibilissimo (conoscendomi :D), ma chi ti dice che non venga fuori un codice almeno leggibile quanto quello in C# (sarebbe sufficiente "ricalcare" la struttura di quello in C#)? ;)
Secondo me in molti esempi di Python che ti ho visto scrivere fai un errore: ti fai prendere dallo scrivere "cute code" sfruttando caratteristiche del linguaggio. E questo e' sbagliato. Io spesso non capisco a prima vista il codice che riporti in Python, lo devo rileggere, poi andarmi a guardare quello che scrivi e cercare la caratteristica del linguaggio che hai usato.

Al contrario, spesso, io faccio leggere il mio codice ad un artista e se mi dice che non capisce quello che sto facendo, quando ho tempo, lo riscrivo in maniera piu' chiara.

Le caratteristiche del linguaggio vanno usate per scrivere codice piu' chiaro e leggibile, non perche' fa figo.

E ora per cortesia non riportarmi un paio di righe di Python dicendo "a me sembrano chiare", perche' nove su dieci lo sembrano solo a te e a chi conosce bene Python ;)
Lo so, e infatti ho cercato di scrivere un codice che fosse più leggibile anche per gli altri. :D

Ad esempio questa:
def BitSetToStringList(Value, Names):
List = []
for Name in Names:
if Name and (Value & 1):
List.append(Name)
Value >>= 1
return List
l'avrei potuta scrivere usando una list comprehension in una sola (complessa) riga , ma poi saresti sceso da Guildford con la mazza ferrata di Zio Paperone per prendermi a randellate... :asd:

Questa mi sembra invece piuttosto leggibile per chiunque, no? :)

Comunque rivedendo il sorgente che avevo postato mi sono reso conto che utilizzando una variabile "intermedia" per memorizzare il risultato di una list comprehension, il codice diverrebbe più leggibile. Ad esempio questo:
def c_intToStr(Value):
return ''.join(chr((Value >> Shift) & 255) for Shift in (0, 8, 16, 24))
si potrebbe scrivere così:
def c_intToStr(Value):
Characters = (chr((Value >> Shift) & 255) for Shift in (0, 8, 16, 24))
return ''.join(Characters)
Usando una funzione di supporto verrebbe ancora meglio:
def c_intToStr(Value):

def ConvertByteToCharacter(Shift):
return chr((Value >> Shift) & 255)

Characters = (ConvertByteToCharacter(Shift) for Shift in (0, 8, 16, 24))
return ''.join(Characters)
Dipende tutto da quello che si vuole ottenere... :fagiano:
Scusa, ma se la libreria che legge quello che serve al nostro amico non esiste...se la scrive da solo ? Per questo ho consigliato C#, perché con un solo strumento può fare tutto ciò che gli serve. Al contrario con Python dovrebbe impararsi a scrivere la libreria in C# o C++ e poi usarla con Python. Hai capito ora cosa intendo ?
A parte il fatto che con IronPython, che è un linguaggio .NET, si potrebbe fare lo stesso tutto, visto che può benissimo "consumare" tutte le classi messe a disposizione dal framework oppure altre "esterne", per quello che deve farci http://www.hwupgrade.it/forum/showpost.php?p=21336592&postcount=1 http://www.hwupgrade.it/forum/showthread.php?p=21295820 "Mazda" (visto che dovremmo rimanere in topic, no? :O) non ha certo bisogno di andare a scriversi dei driver, come gli era stato suggerito in precedenza.

Quella di andare a smanettare con l'hardware è un'esigenza vecchia quanto il cucco, e da "secoli" sono disponibili soluzioni (come quella che ho impiegato): basta cercarle e usarle.

Fino a Windows ME era possibile accedere direttamente all'hardware, ma con Windows NT, e in ogni caso da Windows 2000 in poi, ciò non è più possibile e bisogna necessariamente ricorrere a un driver e/o libreria. Che qualcuno, appunto, ha scritto.

Rimane semplicemente da interfacciarvisi, e ho postato un esempio con Python che dimostra quanto ciò sia semplice. O non sei d'accordo?
Stessa cosa si può fare con C++ o C#, di cui il pacchetto fornisce include / namespace ed esempi (molto più facile: io ho dovuto scrivermi tutto da zero, anche se ho impiegato pochissimo :cool:).

Non vedo quale sia il problema, quindi. ;)

Questo, ripeto, non volendo considerare come soluzione IronPython, ma semplicemente Python.
scusate l'intromissione, sono perfettamente d'accordo con te cionci. non ha senso in python dover utilizzare una libreria in c++, a quel punto si usa la piattaforma .net
io modificherei l'affermazione di cdimauro così:"In python, we often trust"
Vedi sopra: per .NET c'è IronPython che può "consumare" qualunque classe scritta per questo framework.

Tra l'altro se il framework .NET non permette di accedere a tutte le informazioni necessarie (e finora mi sembra che alcune manchino), giocoforza anche con C# sarà necessario rivolgersi a una libreria come quella che ho usato, oppure reinventarsi la ruota appoggiandosi a C++/CLR per realizzare le API / classi necessarie.

Nessuna differenza con C#, quindi.

Mah. Mi sembra una polemica inutile...

Mazda RX8
29-03-2008, 21:24
quindi ke linguaggio devo usare... sembra più semplice qsto phyton...

cdimauro
29-03-2008, 21:31
Se:
- non devi scrivere un driver;
- il tuo scopo rimane esattamente quello che hai esposto qui http://www.hwupgrade.it/forum/showpost.php?p=21351633&postcount=10;
- come programmazione sei più bianco di un lenzuolo e devi, quindi, imparare partendo dalle basi;

POTRESTI (metto il condizionale, altrimenti qui mi crocifiggono nuovamente, pur essendo in topic; vedi punto 2 qui sopra) prendere in seria considerazione Python (o IronPython se le classi della libreria standard .NET permettono di estrapolare TUTTE le informazioni che ti servono). ;)

dupa
29-03-2008, 21:33
quindi ke linguaggio devo usare... sembra più semplice qsto phyton...

io che sono un Javista e che quindi non sono nè un fan boy di Python nè di .NET ti consiglio di farlo in C#.

ciao

fek
29-03-2008, 21:53
l'avrei potuta scrivere usando una list comprehension in una sola (complessa) riga , ma poi saresti sceso da Guildford con la mazza ferrata di Zio Paperone per prendermi a randellate...

Ti avrei preso a randellate fino allo sfinimento :D

cdimauro
29-03-2008, 21:59
Quello lo farai sicuramente. Prevedo 4 mesi terribili per me, pensando che dovrai lavorare con la tool chain scritta in Python fino alla chiusura di Fable 2... :cry:

okay
29-03-2008, 22:09
fek, cdimauro... grandi!

ma anche gugoXX... cionci gran mediatore

ma anche gli altri del 3d...

da okay per hobby;)

ciao vado a cuccia... sono alticcio anche stasera


ciao


Edit: Mazda RX8 sei in un momento fortunato... sfruttalo e inizia a digitare!!!

cdimauro
29-03-2008, 23:25
Ho rifattorizzato un po' il codice per renderlo più leggibile, e ho introdotto anche il calcolo della frequenza della CPU usando il timestamp (che, col Cool'n'Quite di mezzo, è abbastanza impreciso; comunque avevo voglia di provare qualcosa di nuovo :D):
import threading, time
from ctypes import *
hw = windll.WinRing0

def c_intToString(Value):

def ConvertByteToCharacter(Shift):
return chr((Value >> Shift) & 255)

Characters = (ConvertByteToCharacter(Shift) for Shift in (0, 8, 16, 24))
return ''.join(Characters)


def c_intToNibbles(Value):

def ConvertToNibble(Shift):
return (Value >> Shift) & 15

Nibbles = (ConvertToNibble(Shift) for Shift in(0, 4, 8, 12, 16, 20, 24, 28))
return tuple(Nibbles)


def CPUIDFunctionToString(Function):

eax, ebx, ecx, edx = CPUID(Function)
return c_intToString(eax) + c_intToString(ebx) + c_intToString(ecx) + c_intToString(edx)


def BitSetToStringList(Value, Names):
List = []
for Name in Names:
if Name and (Value & 1):
List.append(Name)
Value >>= 1
return List



class WaitingThread(threading.Thread):

def run(self):

global TimeElapsed

time.sleep(10)
TimeElapsed = True



def CPUID(Function):

eax = c_int(); ebx = c_int(); ecx = c_int(); edx = c_int()
hw.Cpuid(Function, byref(eax), byref(ebx), byref(ecx), byref(edx))

return eax.value, ebx.value, ecx.value, edx.value


def RDTSC():

eax = c_int(); edx = c_int()
hw.Rdtsc(byref(eax), byref(edx))
return eax.value + (edx.value << 32)


EDXFeatures = ('Floating-point unit on-Chip',
'Virtual Mode Extension',
'Debugging Extension',
'Page Size Extension',
'Time-Stamp Counter',
'Model Specific Registers',
'Physical Address Extension',
'Machine Check Exception',
'CMPXCHG8 Instruction Supported',
'On-chip APIC Hardware Supported',
'',
'Fast System Call',
'Memory Type Range Registers',
'Page Global Enable',
'Machine Check Architecture',
'Conditional Move Instruction Supported',
'Page Attribute Table',
'36-bit Page Size Extension',
'Processor serial number is present and enabled',
'CLFLUSH Instruction supported',
'',
'Debug Store',
'Thermal Monitor and Software Controlled Clock Facilities supported',
'Intel Architecture MMX technology supported',
'Fast floating point save and restore',
'Streaming SIMD Extensions supported',
'Streaming SIMD Extensions 2',
'Self-Snoop',
'Multi-Threading',
'Thermal Monitor supported',
'IA64 Capabilities',
'Pending Break Enable')

ECXFeatures = ('Streaming SIMD Extensions 3',
'',
'64-Bit Debug Store',
'MONITOR/MWAIT',
'CPL Qualified Debug Store',
'Virtual Machine Extensions',
'Safer Mode Extensions',
'Enhanced Intel SpeedStep Technology',
'Thermal Monitor 2',
'Supplemental Streaming SIMD Extensions 3',
'Context ID',
'',
'',
'CMPXCHG16B',
'Send Task Priority Messages',
'Performance Capabilities MSR',
'',
'',
'Direct Cache Access',
'Streaming SIMD Extensions 4.1',
'Streaming SIMD Extensions 4.2',
'',
'',
'POPCNT instruction',
'',
'',
'',
'',
'',
'',
'',
'RAZ')


hw.InitializeDll()
try:
eax, ebx, ecx, edx = CPUID(0)
print 'CPU VendorID is:', c_intToString(ebx) + c_intToString(edx) + c_intToString(ecx)

Brand = CPUIDFunctionToString(0x80000002) + CPUIDFunctionToString(0x80000003) + CPUIDFunctionToString(0x80000004)
NoZeroCharsBrand = (Ch for Ch in Brand if Ch != '\x00')
print 'CPU Brand is:', ''.join(NoZeroCharsBrand)

eax, ebx, ecx, edx = CPUID(1)
print 'CPU Stepping: %s, Model: %s, Family: %s, Processor Type: %s' % c_intToNibbles(eax)[ : 4]

print 'CPU Features:'
for Feature in BitSetToStringList(edx, EDXFeatures) + BitSetToStringList(ecx, ECXFeatures):
print ' ', Feature

TimeElapsed = False
StartCounter = RDTSC()
WaitingThread().start()
while not TimeElapsed:
pass
StopCounter = RDTSC()
if StartCounter > StopCounter:
StartCounter, StopCounter = StopCounter, StartCounter
print 'CPU is running at (about) %s Mhz' % ((StopCounter - StartCounter) / 10000000)

finally:
hw.DeinitializeDll()
C'è pure un esempio di utilizzo dei thread in Python (che è veramente banale: guardare credere :D).

Per adesso è tutto.

Buonanotte :)

gugoXX
30-03-2008, 00:11
Vabbe' basta.
Lo faccio in C# (e qualcosa di C++/asm) proprio perche' cosi' poi studiamo i confronti di linguaggio.
A vista continuo a sostenere che non ci sia cosi' grande differenza.
spero che la CPUID possa essere usata anche dal ring3, altrimenti lascio.

Per intanto leggendo il tuo codice ho visto che devo restituire 4 registri e non 1 solo. Dal C++ lo saprei fare in modo semplice con una struct (cosi' evito marshaling pesanti verso il C#). Qualche altro suggerimento?

Poi ho trovato un punto da migliorare ovvero la tua funzione
BitSetToStringList
Non ho ancora piena proprieta' di LINQ, ma se tutto va bene provo a stupirti un po' li'.

I nibble fanno proprio pena pero' cribbio. Ma come gli e' venuto in mente? Usare i nibble... vabbe'. Mi sa che copio il tuo codice perche' non mi viene in mente nulla di meglio.

gugoXX
30-03-2008, 01:00
Per intanto ho testato la CPUID e funziona anche in Ring3, cosi' abbiamo la fattibilita'.
Questo e' il codice C++ della parte che ci serve.
Dato un intero (il parametro), restituisco al C# la struttura riempita con i 4 registri.

Niente privilegi, call gate o simili. Meno male.
Qualcuno sa se posso "condividere" la definizione della struttura tra C# e C++?
Intendo, so che non sono la stessa cosa, ma la scrittura e' praticamente identica.
Si possono "includere" in entrambi i posti?
Boh, comunque non si muore, sono 5 righe, ma e' solo per saperlo, magari per il futuro (anche se sto per cambiare lavoro, e non penso proprio di usare il C++ neppure li')


#define DllExport __declspec( dllexport )
typedef struct
{
int reg_eax;
int reg_ebx;
int reg_ecx;
int reg_edx;
} REGS;

DllExport REGS GetCPUID(unsigned int input)
{
REGS val;
__asm
{
mov eax,input
cpuid
mov val.reg_eax,eax
mov val.reg_ebx,ebx
mov val.reg_ecx,ecx
mov val.reg_edx,edx
}
return val;
}

gugoXX
30-03-2008, 01:56
Ed ecco la parte C#. Non ho messo la lettura del counter della CPU perche' ho letto che sulle WMI dovrebbe essere proprio la frequenza istantanea, quindi va meglio la versione di ieri.


[DllImport("CPUID_DLL.dll")]
static extern REGS GetCPUID(uint eax);

// Classe di ritorno dal C++
struct REGS
{
public int reg_eax;
public int reg_ebx;
public int reg_ecx;
public int reg_edx;
}

// Classe per contenere le stringhe associate ad un registro
// E il metodo per restituire le interessate
public class REGSSplitted
{
private string[] assoc;
public REGSSplitted(string[] stampas)
{
assoc = stampas;
}

// E' la funzione chiave, stampa le stringhe relative alle feature
// Il ritorno potrebbe anche essere string[], forse piu' chiaro
// Ho messo l'enumerable, perche' meno si ritorna agli scalari
// Meglio e' per i parallelismi futuri del PLINQ
// Una funzione che ritorna un enumerable viene valutata
// Effettivamente quanto serve (Lazy Evaluation)
// In cascata, tutto insieme, e parallelizzato nel futuro PLINQ
// Su core/processori separati.
public IEnumerable<string> GetFromInt(int src)
{
// Spettacolo. Spero sia comprensibile
// Restutisco le stringhe che hanno il bit corrispondente ad 1
var strs =
from t in Enumerable.Range(0,32)
where ( ( src & (1<<t)) !=0 )
select assoc[t];

return strs;
}
}

private static REGSSplitted ecxfeat1 = new REGSSplitted(
new []{
"Streaming SIMD Extensions 3",
"",
...
"",
"RAZ",
}
);


private static REGSSplitted edxfeat1 = new REGSSplitted(
new []{
"Floating-point unit on-Chip",
"Virtual Mode Extension",
...
"IA64 Capabilities",
"Pending Break Enable"
}
);

// Restitusice la rappresentazione dei caratteri
// relativi ai byte di un intero
static string GetStringRepr(int val)
{
// Prendo l'intero, lo converto in byte
byte[] bytearr = BitConverter.GetBytes(val);
// converto tutti i byte in caratteri
char[] chararr = bytearr.Cast<char>().ToArray();
// stringo
string ret = new string(chararr);
return ret;
}

//Restituisce i primi 4 nibble di un intero.
static byte[] FromIntToNibbleOnly4(int intero)
{
//Copiato da te.
//Lasciato funzionale perche' elegante, anche se incasinato
//L'ho scritto prima procedurale e faceva altrettanto schifo.
//Lo faccio solo per 4 valori... gli altri si cestinano comunque :)
var ogni4 = new[] { 0, 4, 8, 12 };
var nibbles = ogni4.Select(t => (byte)((intero >> t) & 15));
return nibbles.ToArray();
}

//Stampo le 4 stringhe dei 4 registri in ordine.
//Funzionale mi sembra un po' esagerato.
static void GetStringRepr(StringWriter sw,REGS complete)
{
sw.Write(GetStringRepr(complete.reg_eax));
sw.Write(GetStringRepr(complete.reg_ebx));
sw.Write(GetStringRepr(complete.reg_ecx));
sw.Write(GetStringRepr(complete.reg_edx));
}

static void Main(string[] args)
{
REGS zero = GetCPUID(0);
Console.WriteLine("CPU Vendor: {0}{1}{2}", GetStringRepr(zero.reg_ebx),
GetStringRepr(zero.reg_edx), GetStringRepr(zero.reg_ecx));

//Prendo le stringhe dei registri, e le unisco di volta in volta
StringWriter sw = new StringWriter();
REGS due = GetCPUID(0x80000002);
GetStringRepr(sw,due);

REGS tre = GetCPUID(0x80000003);
GetStringRepr(sw, tre);

REGS quattro = GetCPUID(0x80000004);
GetStringRepr(sw,quattro);

Console.WriteLine("CPU Brand : {0}", sw.ToString());

REGS uno = GetCPUID(1);
byte[] vers = FromIntToNibbleOnly4(uno.reg_eax);

// Qui non sono soddisfatto. Non so se riesco a far passare
// come parametri diversi da stampare, quelli che e' il contenuto
// dell'array.
Console.WriteLine(@"CPU Stepping: {0}, Model: {1}, Family: {2},
Processor Type: {3}", vers[0], vers[1], vers[2], vers[3]);

Console.WriteLine("");
Console.WriteLine("Features");

var stringhe = edxfeat1.GetFromInt(uno.reg_edx);
stringhe=stringhe.Union(ecxfeat1.GetFromInt(uno.reg_ecx));

//Stampo in versione funzionale. Eccessivo, ma solo per studio.
stringhe.ToList().ForEach(t => Console.WriteLine(t));

//Quella sopra e' la versione funzionale del codice seguente
//foreach (string s in stringhe)
//{
// Console.WriteLine(s);
//}

Console.ReadKey();
}

gugoXX
30-03-2008, 01:57
Il risultato


CPU Vendor: GenuineIntel
CPU Brand : Intel(R) Core(TM)2 CPU 6600 @ 2.40GHz
CPU Stepping: 6, Model: 15, Family: 6, Processor Type: 0

Features
Floating-point unit on-Chip
Virtual Mode Extension
Debugging Extension
Page Size Extension
Time-Stamp Counter
Model Specific Registers
Physical Address Extension
Machine Check Exception
CMPXCHG8 Instruction Supported
On-chip APIC Hardware Supported
Fast System Call
Memory Type Range Registers
Page Global Enable
Machine Check Architecture
Conditional Move Instruction Supported
Page Attribute Table
36-bit Page Size Extension
CLFLUSH Instruction supported
Debug Store
Thermal Monitor and Software Controlled Clock Facilities supported
Intel Architecture MMX technology supported
Fast floating point save and restore
Streaming SIMD Extensions supported
Streaming SIMD Extensions 2
Self-Snoop
Multi-Threading
Thermal Monitor supported
Pending Break Enable
Streaming SIMD Extensions 3
64-Bit Debug Store
MONITOR/MWAIT
CPL Qualified Debug Store
Virtual Machine Extensions
Enhanced Intel SpeedStep Technology
Thermal Monitor 2
Supplemental Streaming SIMD Extensions 3
CMPXCHG16B
Send Task Priority Messages
Performance Capabilities MSR

Mazda RX8
30-03-2008, 08:31
Se:
- non devi scrivere un driver;
- il tuo scopo rimane esattamente quello che hai esposto qui http://www.hwupgrade.it/forum/showpost.php?p=21351633&postcount=10;
- come programmazione sei più bianco di un lenzuolo e devi, quindi, imparare partendo dalle basi;

POTRESTI (metto il condizionale, altrimenti qui mi crocifiggono nuovamente, pur essendo in topic; vedi punto 2 qui sopra) prendere in seria considerazione Python (o IronPython se le classi della libreria standard .NET permettono di estrapolare TUTTE le informazioni che ti servono). ;)

io che sono un Javista e che quindi non sono nè un fan boy di Python nè di .NET ti consiglio di farlo in C#.

ciao

ecco qui, siamo sempre li, cosa fare?

PS Potrei aprire un sondaggio ke dice di votare il linguaggio più semplice da imparare da un nubbio completo come me...:fagiano:

okay
30-03-2008, 08:48
ecco qui, siamo sempre li, cosa fare?

PS Potrei aprire un sondaggio ke dice di votare il linguaggio più semplice da imparare da un nubbio completo come me...:fagiano:


no... non ci siamo...

non dici cosa hai installato come tool e neppure ses hai digitato una qualche riga di codice... no non va bene.

Da come scrivi si potrebbe, come succede sempre, innescare un flame, e questo non va bene.

Devi capire che puoi iniziare anche con qbasic quando hai capito come funziona "il programmare" allora imparare altri linguaggi è una cosa semplicissima.

Non c'è il linguaggio migliore. Devi iniziare a usarne uno poi imparerai tutti gli altri e quello che ti conviene di + per ciò che intendi fare.

Mazda RX8
30-03-2008, 08:58
phyton sembra più facile...:fagiano:

cionci
30-03-2008, 08:59
phyton sembra più facile...:fagiano:
Convinto te...secondo me nella curva di apprendimento c'è poca differenza fra Python e C#...

cionci
30-03-2008, 09:01
Tra l'altro il thread sul linguaggio da cui iniziare c'è già stato, inutile ripetere le stesse cose. Certo il richiedente non aveva le stesse tue esigenze.
http://www.hwupgrade.it/forum/showthread.php?t=1563542&highlight=imparare

Mazda RX8
30-03-2008, 09:03
ragazzi, vi dovete mettere d'accordo...:cry: :cry:

cdimauro
30-03-2008, 09:03
Vabbe' basta.
Lo faccio in C# (e qualcosa di C++/asm) proprio perche' cosi' poi studiamo i confronti di linguaggio.
A vista continuo a sostenere che non ci sia cosi' grande differenza.
spero che la CPUID possa essere usata anche dal ring3, altrimenti lascio.
Sì, l'avevo scritto prima che poteva essere usata. :)
Per intanto leggendo il tuo codice ho visto che devo restituire 4 registri e non 1 solo. Dal C++ lo saprei fare in modo semplice con una struct (cosi' evito marshaling pesanti verso il C#). Qualche altro suggerimento?
Mi spiace non averti potuto dare qualche suggerimento, ma generalmente non arrivo a stare in piedi fino alle 3 di notte. :p
Poi ho trovato un punto da migliorare ovvero la tua funzione
BitSetToStringList
Non ho ancora piena proprieta' di LINQ, ma se tutto va bene provo a stupirti un po' li'.
Ehm... Io non l'ho scritta con una sola riga usando un'opportuna list comprehension per non farmi randellare da Fran, perché altrimenti me ne sarei potuto uscire così:
def BitSetToStringList(Value, Names):
return [Name for Shift, Name in enumerate(Names) if Name and ((Value >> Shift) & 1)]
Rivedendola non sembra (A ME!!! :)) neppure tanto complessa e illeggibile, ma ho preferito evitare per i motivi di cui sopra. :p
I nibble fanno proprio pena pero' cribbio. Ma come gli e' venuto in mente? Usare i nibble... vabbe'. Mi sa che copio il tuo codice perche' non mi viene in mente nulla di meglio.
Vabbé, quella è la parte più semplice, perché in quel registro i primi 4 campi sono, appunto, dei nibble: ce ne sono altri che mi pare non siano usati, ma hanno un'ampiezza diversa da 4 bit. :D

Ho visto che ti sei passato il tempo stanotte e hai fatto un gran lavoro: complimenti. :)

Tornando a quanto decevi all'inizio del messaggio, personalmente, confrontando le due versioni, mi sembra più semplice e più leggibile quella in Python (e non ho messo nemmeno un commento :D).
L'impressione che ho è che il messanismo tipo "LINQ" di C# che hai usato soffra di analoghi problemi di leggibilità di cui si lamentano gli altri per le list comprehension di Python, e che mi hanno costretto a usare una variabile locale di appoggio autoesplicativa per identificare il risultato dell'operaziome.

E' una prima impressione, comunque. Così, "a naso", come si suol dire. :p

Vediamo cosa dicono anche gli altri. :)

cdimauro
30-03-2008, 09:05
ragazzi, vi dovete mettere d'accordo...:cry: :cry:
Confronta le due versioni e vedi quale ti sembra più semplice.

Fanno lo stesso lavoro (a parte quello in Python che calcola pure la frequenza della CPU usando un thread). ;)

cionci
30-03-2008, 09:06
ragazzi, vi dovete mettere d'accordo...:cry: :cry:
E' impossibile mettersi d'accordo ;)

Ribadisco. Secondo me non fanno le stesse cose, se un giorno avessi la necessità di scrivere codice a basso livello in un linguaggio C-Style ci metteresti molto di più a passare da Python a quel linguaggio. Necessità messa in evidenza tra l'altro dal codice di Cesare: non a caso si è appoggiato ad una libreria esterna scritta in C++ per recuperare i dati relative alla CPU (e non tutti quelli che volevi te).

cionci
30-03-2008, 09:14
Confronta le due versioni e vedi quale ti sembra più semplice.
Non puoi confrontare quei due programmi, non fanno le stesse cose. L'unico modo per confrontarli è usando la stessa libreria.

cdimauro
30-03-2008, 09:18
E' impossibile mettersi d'accordo ;)

Ribadisco. Secondo me non fanno le stesse cose, se un giorno avessi la necessità di scrivere codice a basso livello in un linguaggio C-Style ci metteresti molto di più a passare da Python a quel linguaggio. Necessità messa in evidenza tra l'altro dal codice di Cesare: non a caso si è appoggiato ad una libreria esterna scritta in C++ per recuperare i dati relative alla CPU (e non tutti quelli che volevi te).
Se avessi usato IronPython "consumando" il codice C++ per la CPUID non sarebbe cambiato niente. ;)

Per il codice a basso livello è un discorso inutile, visto che finora è possibile tranquillamente "aggirare" il problema.
Non puoi confrontare quei due programmi, non fanno le stesse cose.
Infatti il mio calcola anche la frequenza della CPU :p, ma togliendo questo fanno ESATTAMENTE la stessa cosa.
L'unico modo per confrontarli è usando la stessa libreria.
Non c'è problema: lo faccia qualcuno.

Tanto cambierebbe poco dal codice di gugoXX: invece di usare l'API scritta in C++, si usa quella di libreria. Amen. ;)

cionci
30-03-2008, 09:27
Tanto ognuno resta della sua idea, inutile andare avanti :boh:

gugoXX
30-03-2008, 09:39
Confronta le due versioni e vedi quale ti sembra più semplice.

Fanno lo stesso lavoro (a parte quello in Python che calcola pure la frequenza della CPU usando un thread). ;)

Comunque prima di approcciare una parte funzionale di un linguaggio di programmazione e' bene che si impari la parte procedurale, con cui puoi fare comunque tutto.
Poi, (secondo me dopo qualche anno) potra' pensare a fare di piu', se quella e' la sua strada oppure se e' un matematico.
Non baserei la sua scelta sul fatto che la parte funzionale di uno o dell'altro sono piu' o meno belle.

Io, fossi in uno che deve iniziare oggi da zero, prenderei un qualsiasi linguaggio procedurale, anche brutto purche' semplice, e ci passerei sopra un po', per poi passare agli OO procedurali (e se poi proprio mi dovesse piacere, agli OO Funzionali).
Non che i funzionali siano indispensabili. Se ne puo' fare a meno.
Una volta capiti pero' il codice resta piu' compatto. Putroppo non sono sempre cosi' leggibili. Si potrebbero fare salti mortali con i funzionali, ma secondo me e' bene restare molto semplici proprio per evitare di dover perdere tempo prezioso a "capire" cosa si sarebbe voluto fare, magari durante fasi di Debug.

PS: Io i commenti li metto comunque sempre
E sono un fautore dell'arte del commento in azienda. C'e' chi sa commentare e chi non lo sa fare.
Quello che quasi tutti scrivono e' COSA sta facendo il codice
Tipo: Faccio un ciclo che sposta questo in quell'altro, accende un pixel e pulisce la memoria.
Putroppo non serve a nulla commentare cosi'. Lo vedo benissimo anche io cosa sta facendo quel codice.
Non e' necessario che me lo ripeti qui.
Quello che mi serve sapere e' PERCHE' hai fatto quelle cose.
Meno codice il piu' delle volte equivale meno errori

Fosse per me io partire con un linguaggio procedurale che non abbia bisogno di troppi tecniciscmi per partire.
Un paio di settimane o un mesetto di QBasic per esempio andrebbe bene, esistesse ancora.

Impara il concetto di variabile.
Stampa qualcosina a caso, leggi come fare per accettare cose da tastiera e stampare stringhe sul video.
Impara il costrutto IF..THEN..ELSE
Impara bene cosa sono e cosa servono gli array, che sono la base di tutto.
Impara il concetto di ciclo e come farlo nel linguaggio scelto.
Inizierei dal goto per esempio, capendo bene il suo funzionamento.
Capito cosa serve cercherei di capire i suoi problemi e quindi perche' si deve passare ai cicli controllati piu' complessi.
(Ho inziato con la famiglia Commodore, il cui Basic integrato in ROM aveva solo il goto (e le chiamate a subroutine). L'ho usato per 4 anni e sono ancora vivo)
Mescola questi concetti insieme e si possono gia' fare cose interessanti.

Il tuo target e' comunque molto lontano, ma non scoraggiarti.
Meglio, se vuoi puoi gia' copiare e incollare i pezzi di programma che abbiamo scritto finora. Ma e' come usare il pesce pescato da noi. Se vuoi la canna e' molto lontana.
Ma ricorda anche che questa canna puo' servirti non solo per divertirti (sempre se ti piace), ma anche proprio per mangiare.

cdimauro
30-03-2008, 09:42
Tanto ognuno resta della sua idea, inutile andare avanti :boh:
Ma di quale idea parli? Ma dico, stiamo scherzando?

I due programmi sono FUNZIONALMENTE IDENTICI. A parte una piccola differenza di formattazione (e poi ovviamente i risultati diversi a causa delle due architetture su cui sono stati lanciati) FANNO LA STESSA COSA.

Tu, invece, ti stai fissando sul COME lo fanno. E questo mi sembra OVVIO, visto che i linguaggi usati sono DIVERSI, e si appoggiano a soluzioni diverse per prelevare i dati "grezzi" che servono.

Ma, come si suol dire, chi se ne frega? Il RISULTATO è quello, non si scappa.

Posto che l'output sia lo stesso, si possono confrontare le soluzioni nei due diversi linguaggi, e qui starà a Mazda giudicare.

x gugoXX: concordo (a parte sul goto, che ODIO :D) e ti assicuro che per imparare a programmare Python è pure più semplice del QBasic, ma ti offre la possibilità di sperimentare, oltre che col paradigma procedurale, con quello funzionale, a oggetti e con la metaprogrammazione. ;)

cionci
30-03-2008, 09:43
Non sono d'accordo sull'inizio in un linguaggio procedurale, secondo me il paradigma ad oggetti è egualmente intuitivo, anzi, molto spesso si può riportare più facilmente a paragoni con la vita quotidiana che fanno sicuramente bene alla comprensione.

cionci
30-03-2008, 09:47
Ma di quale idea parli? Ma dico, stiamo scherzando?

I due programmi sono FUNZIONALMENTE IDENTICI. A parte una piccola differenza di formattazione (e poi ovviamente i risultati diversi a causa delle due architetture su cui sono stati lanciati) FANNO LA STESSA COSA.

Tu, invece, ti stai fissando sul COME lo fanno. E questo mi sembra OVVIO, visto che i linguaggi usati sono DIVERSI, e si appoggiano a soluzioni diverse per prelevare i dati "grezzi" che servono.

Ma, come si suol dire, chi se ne frega? Il RISULTATO è quello, non si scappa.

Posto che l'output sia lo stesso, si possono confrontare le soluzioni nei due diversi linguaggi, e qui starà a Mazda giudicare.
Che vuol dire scusa ? Ribadisco per l'ennesima volta il concetto. Se mi servisse un parametro a basso livello che non esiste in una libreria esterna come diavolo lo scrivo in Python ? Devo ad ogni costo imparare C++...e passare da Python a C++ non è facile, al contrario del passaggio da C# a C++.
Praticamente tutti i linguaggi permettono di utilizzare DLL esterne, allora qualsiasi linguaggio è ugualmente adatto a realizzare un'applicazione di monitoring hardware ?

cdimauro
30-03-2008, 09:52
Che vuol dire scusa ? Ribadisco per l'ennesima volta il concetto. Se mi servisse un parametro a basso livello che non esiste in una libreria esterna come diavolo lo scrivo in Python ? Devo ad ogni costo imparare C++...e passare da Python a C++ non è facile, al contrario del passaggio da C# a C++.
E' inutile bagnarsi prima dell'acqua: è un'ipotesi, e pure molto remota.

Altrimenti facciamo una cosa: visto che gugoXX è dovuto ricorrere all'ASSEMBLY per invocare l'istruzione CPUID, facciamolo partire da questo linguaggio. Tanto se in futuro dovrà scendere a basso livello, gli servirà, giusto?
Praticamente tutti i linguaggi permettono di utilizzare DLL esterne, allora qualsiasi linguaggio è ugualmente adatto a realizzare un'applicazione di monitoring hardware ?
Dipende dal tipo di applicazione. Per programmi come quello che servono a Mazda e alla maggior parte della gente comune, penso di sì.

Su questa base poi è da vedere il COSTO della realizzazione dell'applicazione, e qui possiamo confrontare le soluzioni coi diversi linguaggi. ;)

gugoXX
30-03-2008, 10:03
Secondo me Mazda dovrebbe capire che
imparare a programma
e
fare il suo programmino

Sono 2 cose molto distanti.
Non partirei a pensare cosa fare per imparare a programmare il piu' velocemente possibile per poter fare il mio programmino.
Se non ci fossero state le parti di WMI gia' pronte per C# o per IronPython, quindi se fossimo dovuti andare a prendere i dati dirattamente della SDK (Cosa che con il Python che stai usando tu cdimauro, dovresti fare o sbaglio?)
allora saremmo comunque in grado di farlo.
Ma l'ordine di complessita' e' molto piu' alto. Ci si deve sporcare le mani con chiamate di sistema, e quelle sono anche abbastanza incasinate.

Insomma, secondo me, se vuoi imparare a programmare dimentica il tuo programmino.
Se invece vorresti imparare a programmare solo per fare il tuo programmino, lascia perdere. Fatti un po' di copia incolla, impara come piazzare due textbox su una form (in C# o IronPython) e hai finito.

cdimauro
30-03-2008, 10:07
se fossimo dovuti andare a prendere i dati dirattamente della SDK Cosa che con il Python che stai usando tu cdimauro, dovresti fare o sbaglio?) allora saremmo comunque in grado di farlo.
Ma l'ordine di complessita' e' molto piu' alto. Ci si deve sporcare le mani con chiamate di sistema, e quelle sono anche abbastanza incasinate.
Esattamente e, per quanto mi riguarda, fra chiamate di sistema o una DLL non c'è nessuna differenza.

Per il resto, concordo con quanto hai scritto. ;)

cionci
30-03-2008, 10:07
Chiaro che non debba imparare a programmare per farsi il suo programmino, ma averlo in mente come obiettivo e fare le sue scelte di conseguenza secondo me è fondamentale. Anche solo per una questione di motivazione.

Comunque, visto che i dati sono a disposizione, perché non fate l'esatto equivalente di questo screenshot (http://www.pctunerup.com/up//results/_200802/20080225172331_Immagine.PNG), interfaccia utente compresa ?
Almeno alla fine si chiarirà le sue idee e deciderà.

shinya
30-03-2008, 10:07
ragazzi, vi dovete mettere d'accordo...:cry: :cry:

"Mettersi d'accordo" tra programmatori è un problema NP-completo.

cdimauro
30-03-2008, 10:09
Sull'interfaccia utente non c'ho mai lavorato, per cui chiederò aiuto a qualcuno che c'ha già smanettato.

Per le altre informazioni, appena ho un po' di tempo vedo dove poterle recuperare per Intel e AMD, e aggiorno il programma.

cdimauro
30-03-2008, 10:10
"Mettersi d'accordo" tra programmatori è un problema NP-completo.
Peggio: è un problema indecidibile... :asd:

Mazda RX8
30-03-2008, 10:10
Secondo me Mazda dovrebbe capire che
imparare a programma
e
fare il suo programmino

Sono 2 cose molto distanti.
Non partirei a pensare cosa fare per imparare a programmare il piu' velocemente possibile per poter fare il mio programmino.
Se non ci fossero state le parti di WMI gia' pronte per C# o per IronPython, quindi se fossimo dovuti andare a prendere i dati dirattamente della SDK (Cosa che con il Python che stai usando tu cdimauro, dovresti fare o sbaglio?)
allora saremmo comunque in grado di farlo.
Ma l'ordine di complessita' e' molto piu' alto. Ci si deve sporcare le mani con chiamate di sistema, e quelle sono anche abbastanza incasinate.

Insomma, secondo me, se vuoi imparare a programmare dimentica il tuo programmino.
Se invece vorresti imparare a programmare solo per fare il tuo programmino, lascia perdere. Fatti un po' di copia incolla, impara come piazzare due textbox su una form (in C# o IronPython) e hai finito.

io voglio imparare a programmare...

cdimauro
30-03-2008, 10:12
Allora vai di Python. :)

Mazda RX8
30-03-2008, 10:14
Allora vai di Python. :)

però ora arrivan gli altri e dicono di andare su C# o C++... nn so ke fare!!! :cry: :cry:

cdimauro
30-03-2008, 10:15
Confronta le due soluzioni, quella in Python e quella in C#: quale ti sembra più "semplice" e "comprensibile"? ;)

P.S. Lascia perdere il C++!!!

Mazda RX8
30-03-2008, 10:16
Confronta le due soluzioni, quella in Python e quella in C#: quale ti sembra più "semplice" e "comprensibile"? ;)

P.S. Lascia perdere il C++!!!

il phyton è più semplice...:stordita:

cionci
30-03-2008, 10:16
io voglio imparare a programmare...
Allora leggiti il thread che ti ho linkato nella pagina precedente. Lì ci sono tutte le tue riposte, ma anche no :D

cdimauro
30-03-2008, 10:18
il phyton è più semplice...:stordita:
Non avevo dubbi. :)

Comunque ti puoi anche leggere il thread segnalato da cionci (che è molto utile sull'argomento), ma sono convinto che arriversti alla stessa conclusione. :p

Mazda RX8
30-03-2008, 10:20
quale link? :confused:

cdimauro
30-03-2008, 10:21
Questo: http://www.hwupgrade.it/forum/showthread.php?t=1563542&highlight=imparare

gugoXX
30-03-2008, 10:21
però ora arrivan gli altri e dicono di andare su C# o C++... nn so ke fare!!! :cry: :cry:

Ma se io ti proposto addirittura di iniziare con il QBasic.
Inizia con qualsiasi cosa, programmare significa riuscire ad "inventare" algoritmi, mica si impara a programmare solo per un linguaggio.


un algoritmo si può definire come un procedimento che consente di ottenere un risultato atteso eseguendo, in un determinato ordine, un insieme di passi semplici

Sia io che cdimauro penso potremmo passare da Python a C# e viceversa in una settimana.
Tu invece devi imparare a programmare. Per imparare a programmare occorrono mesi, indipendentemente dal linguaggio.
Per Cionci. Non ho letto nulla a riguardo e non ho mai insegnato a nessuno a programmare. Pero' penso che iniziare con un procedurale puro possa avvicinare lentamente a quello che e' il concetto di algoritmo.
Tanto all'inzio per "hello world" oppure "Stampa la somma dei numeri che ho appena inserito" non e' che servano proprio le classi.

cionci
30-03-2008, 10:23
il phyton è più semplice...:stordita:
Come fai a dirlo se non hai ancora visto due programmi C# e Python equivalenti ?

cdimauro
30-03-2008, 10:24
Ma se io ti proposto addirittura di iniziare con il QBasic.
Inizia con qualsiasi cosa, programmare significa riuscire ad "inventare" algoritmi, mica si impara a programmare solo per un linguaggio.



Sia io che cdimauro penso potremmo passare da Python a C# e viceversa in una settimana.
Tu invece devi imparare a programmare. Per imparare a programmare occorrono mesi, indipendentemente dal linguaggio.
Per Cionci. Non ho letto nulla a riguardo e non ho mai insegnato a nessuno a programmare. Pero' penso che iniziare con un procedurale puro possa avvicinare lentamente a quello che e' il concetto di algoritmo.
Tanto all'inzio per "hello world" oppure "Stampa la somma dei numeri che ho appena inserito" non e' che servano proprio le classi.
Beh, no, anche il linguaggio è importante: altrimenti potrebbe benissimo partire da linguaggio macchina (e dopo qualche minuto desistere dall'idea di imparare a programmare :asd: ).

Leggi anche tu il thread di cui sopra: ne abbiamo parlato in abbondanza. ;)

x cionci: li ha già visti. FUNZIONALMENTE sono uguali. ;)

Mazda RX8
30-03-2008, 10:24
Questo: http://www.hwupgrade.it/forum/showthread.php?t=1563542&highlight=imparare

ok, leggererò...:fagiano:

il QBasic com'è come linguaggio, semplice?

cdimauro
30-03-2008, 10:26
E' molto semplice, ma IMHO Python lo è ancora di più (e ti permette di fare MOOOOOOLTE più cose). ;)

gugoXX
30-03-2008, 10:28
ok, leggererò...:fagiano:

il QBasic com'è come linguaggio, semplice?

Tanto semplice quanto castrato.
Ovvero non puoi fare praticamente nulla di particolare.

Ma secondo me, personalissima opinione, una settimana o 2 di QBasic (o simili) fanno capire i concetti fondamentali della programmazione.

E poi, se piace, via con qualcosa di piu' serio.

cdimauro
30-03-2008, 10:29
Tanto vale che utilizzi Python fin dall'inizio allora (che è pure più semplice). :p

cionci
30-03-2008, 10:31
x cionci: li ha già visti. FUNZIONALMENTE sono uguali. ;)
Scusa, ma se uno deve decidere sul codice ed utilizzano librerie diverse è chiaro che i codici sorgenti possono essere anche diametralmente opposti. Su uno ci possono volere anche 500 righe per fare la stessa cosa che in un altro fa tutto la libreria. Allora mi metto tutto in una DLL e scrivo un programma in C:

#include "miadll.h"
#include <stdio.h>

main()
{
puts(ottieniLeCaratteristicheDelProcessore());
}

Questo sorgente è più semplice di quello scritto in Python e di quello scritto in C# :D
E sono FUNZIONALMENTE identici !!! :D

cdimauro
30-03-2008, 10:33
Perché non modifichi il programmino in C# per fargli usare la DLL che uso io? Così avremo risolto il problema, no? ;)

E sei pure avvantaggiato che hai tutto bello e pronto, visto che ci sono pure gli esempi in C# (e C++). :O

cionci
30-03-2008, 10:36
Visto che sarebbe inutile andare a prendere codice a giro, visto che non sarebbero comunque una traduzione 1 a 1 fra i due linguaggi, per amore di chiarezza, se poi non vi interessa pace, sarebbe utile fare un confronto sia a pari funzionalità che a parità di struttura del sorgente. Ma anche una cazzata: un programma che prende in input un vettore di interi e ne fa la somma e poi la stampa a video.
Prima magari uno la scrive in un linguaggio e poi l'altro la traduce nell'altro.

cdimauro
30-03-2008, 10:41
Una traduzione "1:1" non puoi averla, visto che i linguaggi sono diversi e offrono costrutti sintattici diversi, che ognuno è libero di usare o meno per arrivare alla soluzione del problema.

Visto che per te è troppo importante utilizzare gli stessi "componenti" per ottenere le informazioni che servono, partiamo dalla stessa base: la libreria che ho usato e che fa già tutto lei.

Il confronto lo possiamo poi fare soltanto sull'output, che imponiamo essere uguale a entrambe le versioni.

Mi sembra perfettamente sensato ed equilibrato come confronto, non credi?

Tra l'altro è un'applicazione NON banale rispetto a quella di lavorare su un semplice array, visto che all'inizio confronti del genere sono stati fatti e hanno portato a poco o nulla.

Con un'applicazione come quella realizzata si può già intravedere la differenza fra di due linguaggi, e infatti le impressioni di Mazda lo confermano.

gugoXX
30-03-2008, 10:41
Visto che sarebbe inutile andare a prendere codice a giro, visto che non sarebbero comunque una traduzione 1 a 1 fra i due linguaggi, per amore di chiarezza, se poi non vi interessa pace, sarebbe utile fare un confronto sia a pari funzionalità che a parità di struttura del sorgente. Ma anche una cazzata: un programma che prende in input un vettore di interi e ne fa la somma e poi la stampa a video.
Prima magari uno la scrive in un linguaggio e poi l'altro la traduce nell'altro.

Eh. Purtroppo mi sa che al giorno d'oggi vengono fuori 3 righe di codice.

Confrontare il C# e il Python (o altri, ce ne sono tanti e tutti equivalenti) per decidere cosa usare per imparare a programmare secondo me e' una stortura.

Ma per Mazda sarebbe, secondo me, utile affrontare questo problema in modo classico. Con le Input (o scanf che dir si voglia), gli array, i cicli, etc.
Cosi' impara a programmare.
Il QBasic e' carino perche' puo' anche tralasciare lo studio dell'IDE, di compilatori, di linker, di runtime, Virtual Machine o altro.
Schiaccia un pulsante e gli viene fuori un exe
Ne schiaccia un altro e fa il debug.
80 colonne, pochi menu' per sbagliarsi (Se aprissi visualStudio 2008 oggi per la prima volta mi spaventerei e forse lascerei perdere tutto)

gugoXX
30-03-2008, 10:43
Una traduzione "1:1" non puoi averla, visto che i linguaggi sono diversi e offrono costrutti sintattici diversi, che ognuno è libero di usare o meno per arrivare alla soluzione del problema.

Visto che per te è troppo importante utilizzare gli stessi "componenti" per ottenere le informazioni che servono, partiamo dalla stessa base: la libreria che ho usato e che fa già tutto lei.

Il confronto lo possiamo poi fare soltanto sull'output, che imponiamo essere uguale a entrambe le versioni.

Mi sembra perfettamente sensato ed equilibrato come confronto, non credi?

Tra l'altro è un'applicazione NON banale rispetto a quella di lavorare su un semplice array, visto che all'inizio confronti del genere sono stati fatti e hanno portato a poco o nulla.

Con un'applicazione come quella realizzata si può già intravedere la differenza fra di due linguaggi, e infatti le impressioni di Mazda lo confermano.

Io continuo a sostenere che sono invece proprio identici.
Differente sarebbe stato quanto scritto in C o C++.
Ma qui... una riga io una te.
Un approccio io, un approccio identico te.
Quasi le possiamo mettere a fianco su un WinDiff per leggere le righe appaiate...

cdimauro
30-03-2008, 10:46
Io li vedo abbastanza diversi, e a quanto pare Mazda pure. ;)

Comunque sul QBasic non concordo: IMHO Python è molto più semplice da imparare (e lasciamo perdere le scanf, che è meglio: altrimenti potrebbe già vedere i primi segmentation fault e spaventarsi :asd:)

cionci
30-03-2008, 10:52
Cesare perché invece non scrivi la versione WMI con IronPython ? Sono sempre poche righe, ma almeno si vedono anche nello stesso ambiente. Tra l'altro la versione WMI è più completa.

cdimauro
30-03-2008, 10:54
Non ho mai lavorato né con IronPython né tanto meno con .NET, e al momento non ho abbastanza tempo da dedicarci... :|

gugoXX
30-03-2008, 10:57
Alla fine pero' per lavoro non servono solo le stampe su console.

Vogliamo provare a fare
- Una pagina Web con una textbox e un pulsante di login.
- L'utente entra nel sito e digita il proprio id.
- Il Web Server chiede al Database se questo ID e' autorizzato, prelevandone il nome.
- Il Web Server forza il browser dell'utente a scrivere: "Benvenuto " e il suo nome. Possibilmente senza forzare il refresh della pagina.

Vogliamo vedere quanto tempo ci si mette?
Ti avviso, penso di non metterci piu' di 5 minuti e una manciata di righe, tutte sullo stesso file (a parte la definzione XML della pagina).

cdimauro
30-03-2008, 11:03
Non mi sono occupato esattamente di queste cose. Ho realizzato delle applicazioni web, ma per uso interno alla mia azienda e che generano HTML nudo e crudo (con qualche riga di JavaScript): per la serie foglio completamente bianco e scritte nere... :asd:

Invece ho realizzato dei server (con Ice) per applicazioni distribuite client/server: vogliamo vedere quanto ci metti con C# a fare lo stesso? :p

Per la serie: così non ce ne usciamo più, visto che ognuno ha sviluppato competenze diverse. ;)

Comunque al momento Mazda deve imparare a programmare: mi sembra un tantino prematuro parlare di queste così. Finiamo per confondergli la testa ancora di più.

Penso che, da quello che ci siamo detti, abbia sufficienti elementi per valutare da solo quale strada seguire.

Tanto per imparare ALTRO e consolidare le sue basi come programmatore avrà tutto il tempo, no? ;)

okay
30-03-2008, 11:09
in visual basic ho finito proprio ora...

Utilizzo della CPU in una label

riferendomi a cionci per quanto riguarda lo screenshoot...

ma cmq sono tutte chiamate di api

gugoXX
30-03-2008, 11:10
Ed e' proprio quello che intendo io.
Per imparare a programmare e' inutile confrontare questi due linguaggi.
Parti con qualcosa, quasliasi cosa, tanto all'inizio non li userai come si potrebbe fare.
Scrivi, debugga, rompiti la testa sulle cose di base.

Cosa intendi per applicazioni client/server distribuite? Calcolo parallelo o server da una parte e (tanti) client dall'altra?

cdimauro
30-03-2008, 11:19
Entrambe le cose. :) Il mio ultimo progetto prevedeva una serie di server che si spartivano le richieste dei client, e il sistema era completamente fault-tolerant con carico distribuito. ;)

Per il resto, rispondendo alla parte iniziale del tuo messaggio, ti chiedo: perché non partire da Python allora? Tu avevi proposto QBasic addirittura, da "buttare" dopo un paio di settimane.
Io ti propongo un linguaggio con una sintassi molto semplice e pulita, che è tutt'altro che "morto" e che ha svariati ambiti applicativi (anche web, che non ho mai approfondito comunque). ;)

gugoXX
30-03-2008, 11:45
Entrambe le cose. :) Il mio ultimo progetto prevedeva una serie di server che si spartivano le richieste dei client, e il sistema era completamente fault-tolerante con carico distribuito. ;)


Uhm. Il modo piu' veloce che IO conosco per fare una cosa simile e' un cluster di WebServer (problema sistemistico gia' affrontato piu' volte, simile ai load balancer), con WebService che risolvono le richieste. Non e' calcolo distribuito pero', solo ben fault tolerant, e di scrittura molto semplice.
Ovviamente di nuovo il linguaggio centra poco. A parte quelli in cui non si possono fare i WebService, ovviamente.
Fattibile?

mindwings
30-03-2008, 11:57
http://www.invece.org/translations/pparadox.html

:D

gugoXX
30-03-2008, 12:01
http://www.invece.org/translations/pparadox.html

:D


Bell'articolo, solo un po' vecchio.
Nel 2004 magari no, ma l'approccio di risovere i problemi del C# oggi permette di fare le stesse cose del Python, da quanto ho capito fin'ora.
Solo in un ambiente Strong-Typed, che e' proprio quello che voglio.

Fra l'altro ieri ho comprato un bel libro sul F#. Di nuovo mi sembra che cambi poco.

mindwings
30-03-2008, 12:07
Bell'articolo, solo un po' vecchio.
Nel 2004 magari no, ma l'approccio di risovere i problemi del C# oggi permette di fare le stesse cose del Python, da quanto ho capito fin'ora.
Solo in un ambiente Strong-Typed, che e' proprio quello che voglio.

Fra l'altro ieri ho comprato un bel libro sul F#. Di nuovo mi sembra che cambi poco.

Ad ogni modo il linguaggio è solo uno strumento :D secondo me è molto importante essere poliglotti ! Ormai i linguaggi aggiungo features che sono
prese da altri linguaggi ehm C# coff coff :fagiano:

cdimauro
30-03-2008, 12:37
Uhm. Il modo piu' veloce che IO conosco per fare una cosa simile e' un cluster di WebServer (problema sistemistico gia' affrontato piu' volte, simile ai load balancer), con WebService che risolvono le richieste. Non e' calcolo distribuito pero', solo ben fault tolerant, e di scrittura molto semplice.
Ovviamente di nuovo il linguaggio centra poco. A parte quelli in cui non si possono fare i WebService, ovviamente.
Fattibile?
Certamente, ma i webservice sono "pesanti" (non solo in termini di risorse consumate, ma anche per il tempo impiegato per scrivere applicazioni): io preferisco nettamente Ice in questi casi. ;)
http://www.invece.org/translations/pparadox.html

:D
:ave: Come non approvare! :p
Bell'articolo, solo un po' vecchio.
Nel 2004 magari no, ma l'approccio di risovere i problemi del C# oggi permette di fare le stesse cose del Python, da quanto ho capito fin'ora.
Solo in un ambiente Strong-Typed, che e' proprio quello che voglio.

Fra l'altro ieri ho comprato un bel libro sul F#. Di nuovo mi sembra che cambi poco.
Anche Python è strong-typed, eh! :O

Che possano fare le stesse cose, non ci sono dubbi: vedi i nostri due sorgenti che si divertono a dialogare a basso livello con l'hardware. :)

Poi bisogna vedere in che modo i problemi si risolvono, e IMHO la "dinamicità" di Python semplifica molto la vita al programmatore (Fran, t'ho visto sai! Metti giù la mazza ferrata!!! :D).

Se hai tempo, ti consiglio di smanettarci un po': male che vada, è un altro linguaggio che si aggiungerà al tuo ricco curriculum (e aziende come Google, Yahoo, IBM, ma anche la stessa MS ormai, apprezzano: vedi sopra sul "paradosso di Python" :)).

OK, adesso vado a narcotizzare il piccolo, così mi posso godere in pace (pura utopia: per la legge di Murphy si sveglierà o alla partenza, o peggio ancora all'arrivo :asd:) la MotoGP, e poi... si esce per una passeggiata con la piccola (un buon programmatore applica l'algoritmo divide & conqueror per accontentare entrambi i figli :asd:). :D

||ElChE||88
30-03-2008, 12:45
divide & conqueror
:eek:
E' nuovo? :asd:

gugoXX
30-03-2008, 12:57
:eek:
E' nuovo? :asd:

Voleva chiaramente dire
Command & Conqueror
:D:D

Mazda RX8
30-03-2008, 13:08
qsta guida com'è?

http://programmazione.html.it/guide/lezione/1286/introduzione-e-un-po-di-storia/

DioBrando
30-03-2008, 13:40
Bell'articolo, solo un po' vecchio.
Nel 2004 magari no, ma l'approccio di risovere i problemi del C# oggi permette di fare le stesse cose del Python, da quanto ho capito fin'ora.
Solo in un ambiente Strong-Typed, che e' proprio quello che voglio.

Fra l'altro ieri ho comprato un bel libro sul F#. Di nuovo mi sembra che cambi poco.

OT: Foundations of F# o Expert F#? :)

gugoXX
30-03-2008, 13:48
OT: Foundations of F# o Expert F#? :)

Foundation of F# in copertina rigida.
Ben fatto direi, pero' ora non lo sto affrontando come richiederebbe.

^TiGeRShArK^
30-03-2008, 13:50
Alla fine pero' per lavoro non servono solo le stampe su console.

Vogliamo provare a fare
- Una pagina Web con una textbox e un pulsante di login.
- L'utente entra nel sito e digita il proprio id.
- Il Web Server chiede al Database se questo ID e' autorizzato, prelevandone il nome.
- Il Web Server forza il browser dell'utente a scrivere: "Benvenuto " e il suo nome. Possibilmente senza forzare il refresh della pagina.

Vogliamo vedere quanto tempo ci si mette?
Ti avviso, penso di non metterci piu' di 5 minuti e una manciata di righe, tutte sullo stesso file (a parte la definzione XML della pagina).
http://media.rubyonrails.org/video/rails_take2_with_sound.mov
:fiufiu:
sul fatto della velocità per sviluppo web mi sa che RoR è inarrivabile per ora :p

DioBrando
30-03-2008, 13:51
DioBrando: mi sembra di non essere stato solo io ad aver notato che Cesare consiglia sempre Python, anche quando non c'entra assolutamente niente con l'argomento. Quindi un fondo di verità forse c'è ?

ok correggo il tiro allora: mi riferisco a te e a tutti quelli che l'hanno detto.
Lo consiglia spesso ma non solo Python, per cui mi sembra una esagerazione, la vostra.
E in ogni caso ribadisco, lo consiglia dopo qualche anno di positiva esperienza non perchè "gli piace e basta": c'è una bella differenza.


Io per obiettare sull'uso di Python mi baso su quello che ho visto di Python (chiaro che un minimo me lo sia guardato) e su quello che dice Cesare. Io obietto direttamente sugli argomenti che tira fuori lui come vantaggio. C'è qualcosa di errato in questa pratica ?

E' errato se nella tua critica presupponi di andare a valutare situazioni in cui solo dopo aver sperimentato (e avendo avuto esperienza di programmazione con Python ma vale per qualsiasi linguaggio strumento) puoi realmente essere in grado di fornirle.
Ed è una cosa che hai fatto tu in questo thread ma non solo quello.
Tanto per farti un parallelo: è come se tu leggessi le caratteristiche di una macchina, guardi i cavalli guardi le dimensioni, il tipo di motore.
Fin qui sei in grado di dire se è il modello che fa per te o meno, ma quando una persona ti dice "guarda che l'esperienza di guida, almeno la mia è stata molto positiva, perchè X, Y, Z ragioni", tu come fai a rispondere senza averla mai provata?
Non puoi.

Stesso discorso qui.
Francesco invece ha avuto una sua esperienza, negativa e quindi a ben donde ha tutti i diritti di mostrare il suo disappunto e dire il perchè si sia trovato male e il perchè non lo consiglia (contrapponendosi a Cesare).
Mi pare siano due piani ben distinti.


Ad esempio la questione multiparadigma: ho fatto la stessa critica decine di volte per quanto riguarda C++, Cesare lo cita come argomento a favore di Python, perché non posso muovere la stessa critica che muovo a C++ anche a Python ?

E' una critica sbagliata, che per altro hai fatto tu e se non sbaglio kont3 in altri thread, a cui vi è stata data risposta sia qui che altrove, per cui è inutile tornarci sopra.

cionci
30-03-2008, 13:55
E' una critica sbagliata, che per altro hai fatto tu e se non sbaglio kont3 in altri thread, a cui vi è stata data risposta sia qui che altrove, per cui è inutile tornarci sopra.
Che sia sbagliata lo dici te e Cesare :D Io continuo ad essere fermamente convinto di questo e credo di avere il diritto a continuare a tirarlo fuori a discapito di linguaggi quali Python, PHP, C++ e compagnia bella.
Tra l'altro la stessa critica era stato mossa da molti a C++ diversi anni fa, sempre in questa sezione, se non ricordo male c'era anche Cesare fra questi, ma potrei anche sbagliarmi.

DioBrando
30-03-2008, 13:57
Foundation of F# in copertina rigida.
Ben fatto direi, pero' ora non lo sto affrontando come richiederebbe.

Sì entrambi sono stati recensiti da + parti con ottimi voti. Io mi sono orientato sul secondo e devo dire che non mi ha deluso.
In generale sto apprezzando l'Apress come casa editrice e la consiglio a chi vuole imparare a programmare (che non ricordo più chi sia :stordita: )

DioBrando
30-03-2008, 14:00
Che sia sbagliata lo dici te e Cesare :D Io continuo ad essere fermamente convinto di questo e credo di avere il diritto a continuare a tirarlo fuori a discapito di linguaggi quali Python, PHP, C++ e compagnia bella.
Tra l'altro la stessa critica era stato mossa da molti a C++ diversi anni fa, sempre in questa sezione, se non ricordo male c'era anche Cesare fra questi, ma potrei anche sbagliarmi.

Fai come credi :)

Ma sul resto delle argomentazioni hai poco da obiettare ;)
Lavora con Python 1-2-3 anni e poi torna su questi schermi :D


E vieni a seguire PyCon2 così ti fai una full immersion di qualche giorno :sofico:

Tra l'altro saresti anche piuttosto vicino :)

cionci
30-03-2008, 14:07
Ma sul resto delle argomentazioni hai poco da obiettare ;)
Invece obietto, se vuoi ricomincio, tra l'altro ho continuato a spiegare perché secondo me aveva meno senso della scelta C#.
Lavora con Python 1-2-3 anni
Spero vivamente di no.

DioBrando
30-03-2008, 14:13
Invece obietto, se vuoi ricomincio, tra l'altro ho continuato a spiegare perché secondo me aveva meno senso della scelta C#.


Ok ricomincia allora se ti fa piacere, ma evita di riproporre come argomentazioni i discorsi su librerie e ambienti di programmazione, che sono già stati smontati.

L'Assurdità cmq è diventata ora "meno senso". E' già qualcosa :D


Spero vivamente di no.

Io proverei una cosa prima di dire no a priori, poi de gustibus.
Contento te contenti tutti. :)

fek
30-03-2008, 14:14
Lavora con Python 1-2-3 anni e poi torna su questi schermi :D


Been there done that. Neppure nei miei incubi peggiori.

cionci
30-03-2008, 14:15
Ok ricomincia allora se ti fa piacere, ma evita di riproporre come argomentazioni i discorsi su librerie e ambienti di programmazione, che sono già stati smontati.
E chi l'avrebbe smontate ? Rimangono sicuramente motivazioni valide per scegliere C# al posto di Python.

DioBrando
30-03-2008, 14:22
E chi l'avrebbe smontate ? Rimangono sicuramente motivazioni valide per scegliere C# al posto di Python.

1) Gli IDE sono i medesimi
2) puoi interfacciarti alle medesime librerie (C/C++) o framework NET tramite IronPython.

Smontate.

Hai altro da aggiungere?

cionci
30-03-2008, 14:27
Visual Studio supporta IronPython ?

2) il discorso sulle librerie era diverso, è quello a cui mi riferivo qualche post sopra

gugoXX
30-03-2008, 14:39
C'e' qualcuno che usa IronPython al quale posso chiedere un paio di cose?

Comunque, per Mazda.


using (SpeechSynthesizer synth = new SpeechSynthesizer())
{
synth.SelectVoiceByHints(VoiceGender.Female,VoiceAge.Teen, 0);
synth.Speak("Another visitor! Stay awhile! Stay Forever!");
}



Si capisce? E' solo un consiglio comunque.

cdimauro
30-03-2008, 17:53
:eek:
E' nuovo? :asd:
Voleva chiaramente dire
Command & Conqueror
:D:D
:doh: Macché, è tutta colpa sua http://en.wikipedia.org/wiki/Konqueror :muro:
qsta guida com'è?

http://programmazione.html.it/guide/lezione/1286/introduzione-e-un-po-di-storia/
E' molto semplice, ma se vuoi una guida completa usa questa http://www.python.it/doc/Howtothink/Howtothink-html-it/index.htm ;)
Che sia sbagliata lo dici te e Cesare :D Io continuo ad essere fermamente convinto di questo e credo di avere il diritto a continuare a tirarlo fuori a discapito di linguaggi quali Python, PHP, C++ e compagnia bella.
Tra l'altro la stessa critica era stato mossa da molti a C++ diversi anni fa, sempre in questa sezione, se non ricordo male c'era anche Cesare fra questi, ma potrei anche sbagliarmi.
Non mi risulta.

Comunque per il discorso del "multiparadigma" lo ripeto per l'n-esima volta: quando parli di Python lo fai senza avere conoscenza di ciò che dici.

Python è strettamente monoparadigma: è a oggetti, ogni elemento è un oggetto, e ogni cosa si può ricondurre a "messaggi" che si inviano a oggetti, o a una lora interazione.

Giusto per essere chiari (e spero sia la volta buona):
>>> def f(x, y):
... return x + y
...
>>> f
<function f at 0x027F8F30>
>>> isinstance(f, object)
True
>>> callable(f)
True

>>> t = type(f)
>>> t
<type 'function'>
>>> isinstance(t, object)
True
>>> callable(t)
True

>>> class c: pass
...
>>> c
<class __main__.c at 0x02830930>
>>> isinstance(c, object)
True
>>> callable(c)
True

>>> 1
1
>>> isinstance(1, object)
True
>>> callable(1)
False

>>> object
<type 'object'>
>>> isinstance(object, object)
True
>>> callable(object)
True
Come vedi tutto è in perfetta armonia: la definizione di una funzione comporta la CREAZIONE DI UN OGGETTO, che discende da object, e che è "callable" ("invocabile"; in questo caso la sua invocazione richiede la presenza di due parametri).

Il tipo di questa funzione è, a sua volta, un oggetto, che discende da object e che è "callable" (richiede due parametri: un oggetto di tipo "code" e un dizionario per i nomi degli argomenti della funzione che si sta creando).

Allo stesso modo, la definizione di una classe comporta la creazione di un oggetto, discendente da object e ancora... callable (la sua invocazione restituisce un oggetto, che è istanza della classe).

Continuando puoi vedere che il numero 1 è ancora un discendente di object, ma NON è "callable" (ovviamente).

Infine, perfino object è a sua volta un oggetto, che discende da object e che è "callable" (crea un oggetto di tipo... oggetto).

Come puoi ben vedere, TUTTO è un oggetto, e si lavora sempre e soltanto con oggetti (che interagiscono) che hanno ognuno particolari proprietà e comportamenti.

E' soltanto grazie a queste proprietà e comportamenti che è possibile SIMULARE i paradigmi di programmazione che ho elencato: procedurale, funzionale, a oggetti e multiprogrammazione (e anche la programmazione orientata agli aspetti: eseguire hooking delle funzioni / metodi è banale con Python).

Spero che il concetto sia chiaro una volta per tutte, e che non mi debba sentire ripetere le stesse cose dalle stesse persone in futuro...
Visual Studio supporta IronPython ?
http://www.codeplex.com/IronPythonStudio
2) il discorso sulle librerie era diverso, è quello a cui mi riferivo qualche post sopra
Sì, ne abbiamo già parlato e mi pare che IronPython non sia messo male, potendo sfruttare sia le librerie native che quelle di .NET.

using (SpeechSynthesizer synth = new SpeechSynthesizer())
{
synth.SelectVoiceByHints(VoiceGender.Female,VoiceAge.Teen, 0);
synth.Speak("Another visitor! Stay awhile! Stay Forever!");
}



Si capisce?
http://upload.wikimedia.org/wikipedia/en/9/9d/C64_Impossible_Mission.png

:O :p

VICIUS
30-03-2008, 18:30
Mi avete fatto venire una voglia matta di scrivere cpuid in ruby. Maledetti! :D

http://upload.wikimedia.org/wikipedia/en/9/9d/C64_Impossible_Mission.png
OT, ci gioco ancora.

xblitz
30-03-2008, 20:59
scusate se mi intrometto nella conversazione però avrei qualcosa da dire che reputo abbastanza interessante ma prima ci tengo subito a precisare che non voglio scatenare flames

sarò breve: sul libro postato da cdimauro si legge:


Come puoi facilmente immaginare, prima di poter usare una funzione devi averla definita: la definizione della funzione deve sempre precedere la sua chiamata.


ma allora perché la virtual machine mi esegue correttamente il seguente codice:


def trerigevuote ():
unarigavuota()
unarigavuota()
unarigavuota()

def unarigavuota ():
print

print ("prima riga vuota")
trerigevuote()
print ("seconda riga vuota")


non mi pare abbia molto senso: oltre a essere in contradizione con quello che ce scritto sopra (se ho capito bene quello che ce scritto, altrimenti sono proprio rincoglionito) è una cosa che non ho mai visto su altri linguaggi (C++,Java e PBASIC)

Mazda RX8
30-03-2008, 21:01
qsta guida com'è?

http://programmazione.html.it/guide/lezione/1286/introduzione-e-un-po-di-storia/

up!

gugoXX
30-03-2008, 21:02
trerigevuote e' solo una definizione. Li' non viene eseguito nulla.

xblitz
30-03-2008, 21:12
trerigevuote e' solo una definizione. Li' non viene eseguito nulla.

ok grazie della spiegazione, però, se ho capito bene questo non dovrebbe funzionare:


def trerigevuote ():
unarigavuota()
unarigavuota()
unarigavuota()

print ("prima riga vuota")
trerigevuote()
print ("seconda riga vuota")

def unarigavuota ():
print



e invece fa eppure: ok trerigevuote (mamma mia che errore grammaticale speriamo sia la stanchezza :rolleyes: ) è una definizione ma viene evocata prima della definizione di unarigavuota () :fagiano: non mi torna...

gugoXX
30-03-2008, 21:21
Evidentemente quella frase si riferisce a quando usi Python dalla sua linea di comando, quella con i >>>
e non invece quando si compila un sorgente

xblitz
30-03-2008, 21:30
Evidentemente quella frase si riferisce a quando usi Python dalla sua linea di comando, quella con i >>>
e non invece quando si compila un sorgente

credo di aver risolto l'arcano: non so come ma devo aver mandato in esecuzione una versione salvata in precedenza corretta :rolleyes: :muro:: copiando l'ultimo codice postato effettivamente da errore (come era giusto che facesse del resto):


NameError: global name 'unarigavuota' is not defined

gugoXX
30-03-2008, 21:32
Gia'.
Per ulteriori approfondimenti attendiamo gli esperti.

cionci
31-03-2008, 07:52
Comunque per il discorso del "multiparadigma" lo ripeto per l'n-esima volta: quando parli di Python lo fai senza avere conoscenza di ciò che dici.
Invece tu sei bravissimo a travisare volontariamente le parole degli altri, perché ti avevo già spiegato cosa intendevo e nuovamente l'hai travisato.
Mi riferisco al fatto di poter mischiare programmazione procedurale, programmazione ad oggetti e programmazione a moduli nello stesso programma.

cdimauro
31-03-2008, 08:50
Mi avete fatto venire una voglia matta di scrivere cpuid in ruby. Maledetti! :D
Fallo. :)
OT, ci gioco ancora.
Non sei il solo (quando riesco ad avere qualche briciola di tempo e non ci sono i miei figli a torturarmi :asd:).
scusate se mi intrometto nella conversazione però avrei qualcosa da dire che reputo abbastanza interessante ma prima ci tengo subito a precisare che non voglio scatenare flames

sarò breve: sul libro postato da cdimauro si legge:


ma allora perché la virtual machine mi esegue correttamente il seguente codice:


def trerigevuote ():
unarigavuota()
unarigavuota()
unarigavuota()

def unarigavuota ():
print

print ("prima riga vuota")
trerigevuote()
print ("seconda riga vuota")


non mi pare abbia molto senso: oltre a essere in contradizione con quello che ce scritto sopra (se ho capito bene quello che ce scritto, altrimenti sono proprio rincoglionito) è una cosa che non ho mai visto su altri linguaggi (C++,Java e PBASIC)
ok grazie della spiegazione, però, se ho capito bene questo non dovrebbe funzionare:


def trerigevuote ():
unarigavuota()
unarigavuota()
unarigavuota()

print ("prima riga vuota")
trerigevuote()
print ("seconda riga vuota")

def unarigavuota ():
print



e invece fa eppure: ok trerigevuote (mamma mia che errore grammaticale speriamo sia la stanchezza :rolleyes: ) è una definizione ma viene evocata prima della definizione di unarigavuota () :fagiano: non mi torna...
credo di aver risolto l'arcano: non so come ma devo aver mandato in esecuzione una versione salvata in precedenza corretta :rolleyes: :muro:: copiando l'ultimo codice postato effettivamente da errore (come era giusto che facesse del resto):


NameError: global name 'unarigavuota' is not defined

Molto probabilmente lavorando con la shell interattiva avevi definito già "unarigavuota", che era rimasta quindi disponibile. Ecco perché il tuo secondo sorgente funzionava ugualmente.

Il primo sorgente invece funziona perfettamente perché le varie def portano soltanto alla creazione dei rispettivi oggetti, e il loro codice viene semplicemente compilato in bytecode. E' soltanto nella fase di esecuzione che, una volta trovato dentro "trerigevuote" che si deve eseguire una chiamata a "unarigavuota", la virtual machine va a recuperare quest'oggetto e prova a eseguirlo (se è "callable").
Invece tu sei bravissimo a travisare volontariamente le parole degli altri, perché ti avevo già spiegato cosa intendevo e nuovamente l'hai travisato.
Mi riferisco al fatto di poter mischiare programmazione procedurale, programmazione ad oggetti e programmazione a moduli nello stesso programma.
E ti ho già risposto, e più volte, che Python è rigorosamente MONOPARADIGMA.

In particolare nell'ultimo messaggio ti ho fatto anche vedere il perché sia così (ma te l'avevo già spiegato qui http://www.hwupgrade.it/forum/showpost.php?p=21740061&postcount=195 ).

Per il resto, io non ci trovo nulla di male a mischiare paradigmi di programmazione diversi per risolvere un problema (con buona pace del buon PGI-Bis :D).

D'altra parte tu sostieni che Java sia monoparadigma ( http://www.hwupgrade.it/forum/showpost.php?p=21740206&postcount=200 ), il che è semplicemente falso:
public class Prova {
public static void main(String[] args) {
int i, j, k;
i = 1
j = 2
k = i + j;
}
}
Dove sta la programmazione a oggetti qui? E' codice puramente procedurale: i, j e k sono dati scalari, NON oggetti, e non c'è nessuna spedizione di messaggi fra di loro né tanto meno invocazione di metodi.

Ma anche:
public class Prova {
private static int i() {
return 1;
}

private static int j() {
return 2;
}

private static int k() {
return i() + j();
}

public static void main(String[] args) {
k();
}
}
e questo è puramente funzionale.

Non sono io che "traviso": sei tu che ti ostini a ignorare quello che dicono gli altri...

Per inciso, guarda qui:
>>> dir(1)
['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__str__', '__sub__', '__truediv__', '__xor__']
Sono tutti i METODI che l'oggetto 1 (che è un numero intero) mette a disposizione (in Python).

Fammi vedere qualcosa di simile in Java per "int i = 1".

P.S. La programmazione a moduli non esiste. Esiste quella procedurale.

cdimauro
31-03-2008, 08:54
up!
Ti avevo già risposto qui http://www.hwupgrade.it/forum/showpost.php?p=21790418&postcount=373 ;)

Te lo ripeto:

E' molto semplice, ma se vuoi una guida completa usa questa http://www.python.it/doc/Howtothink/Howtothink-html-it/index.htm

:)

cionci
31-03-2008, 08:56
Secondo me è un male mescolare paradigmi diversi nello stesso linguaggio (PS: ma mi sembra o hai parlato anche te di mischiare paradigmi ?). Se per te è una feature valida, come la chiami ?
P.S. La programmazione a moduli non esiste. Esiste quella procedurale.
Come la chiami allora la possibilità di mettere codice nudo e crudo dentro ad un file .py ?

banryu79
31-03-2008, 09:04
Fallo. :)

Per inciso, guarda qui:
>>> dir(1)
['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__str__', '__sub__', '__truediv__', '__xor__']
Sono tutti i METODI che l'oggetto 1 (che è un numero intero) mette a disposizione (in Python).

Fammi vedere qualcosa di simile in Java per "int i = 1".

P.S. La programmazione a moduli non esiste. Esiste quella procedurale.

Integer i = new Integer(1);
e poi vai di reflection sull'oggetto "i" per recuperare i nomi dei metodi.

Però è vero, ci sono anche i normali int...
Ma Java è diverso da Python, sono due linguaggi diversi e se fanno cose simili fanno anche cose molto diverse.

Alla fine uno usa lo strumento che ritiene migliore (oggettivamente, in teoria; soggettivamente, nella pratica) per risolvere lo specifico problema.

Ritengo molto importante la sensazione di "comodità, e familiarità" che un linguaggio ti da, anche se nell'usarlo sulla carta magari stai facendo una scelta leggermente meno produttiva di un altro linguaggio: l'ideale sarebbe poi provare ad imparare il linguaggio alternativo e farci esperienza per farsi un'idea propria.

Giusto per non essere troppo OT:
Mazda, il mio consiglio non è su che linguaggio usare, il 3D è già pieno di idee in merito; quello che ti consiglio è di sceglierne tu uno, e cominciare a darci dentro.

Se ti interessa la programmazione sappi che ti aspetta un sacco di studio, ci sono molte cose da imparare, per cui non darti una scadenza temporale: comincia con un buon manuale del linguaggio scelto, scaricati il relativo compiler/ide e preparati alla scoperta di un nuovo mondo! :D

cdimauro
31-03-2008, 09:08
Secondo me è un male mescolare paradigmi diversi nello stesso linguaggio (PS: ma mi sembra o hai parlato anche te di mischiare paradigmi ?). Se per te è una feature valida, come la chiami ?
Sul fatto che per te sia un male e per me potremmo continuare a parlarne a non finire: non ne usciremmo più. :O

A me premeva chiarire un concetto fondamentle: Python è MONOPARADIGMA (è puramente a oggetti).

Poi, proprio grazie agli oggetti che mette a disposizione, è possibile "simulare", nella stesura del codice, paradigmi di programmazioni diversi.

Fino a qui siamo d'accordo? Così ci mettiamo una pietra sopra. :D
Come la chiami allora la possibilità di mettere codice nudo e crudo dentro ad un file .py ?
Dipende. Potrei mettere il codice in un file .py (o di testo, ecc.), per poi leggerlo e compilarlo al volo "integrandolo" nell'attuale namespace. In soldoni: è quello che altri linguaggi di programmazione fanno con la famigerata direttiva (o istruzione) "include" (che Python non possiede, ma... si simula :p).

L'operazione di suddividere il codice in moduli/unit/package, ecc. è chiamata "modularizzazione", o anche "programmazione modulare", ma NON è un paradigma di programmazione, quanto più che altro una "best practice".

I paradigmi di programmazione sono i seguenti:
- procedurale;
- funzionale;
- logico;
- a oggetti;
- ad aspetti (questo è il più recente, ma non me ne sono mai interessato).

:)

cdimauro
31-03-2008, 09:10
Integer i = new Integer(1);
e poi vai di reflection sull'oggetto "i" per recuperare i nomi dei metodi.

Però è vero, ci sono anche i normali int...
Esatto: non è un caso se abbia usato un int anziché un Integer... :fiufiu: Per la serie: "bastardi dentro". :D

cionci
31-03-2008, 09:22
Chi ha parlato di suddividere il codice in moduli ?????
Ora ci attacchiamo alla terminologia ? Hai capito bene a cosa mi riferisco. Parlo di mettere le istruzioni, senza una funzione, senza una classe, direttamente all'interno di un modulo. Come lo chiami ?
Sul fatto che per te sia un male e per me potremmo continuare a parlarne a non finire: non ne usciremmo più. :O

A me premeva chiarire un concetto fondamentle: Python è MONOPARADIGMA (è puramente a oggetti).
Ok, allora tanto per chiarire dammi un termine per definire la possibilità mescolare la creazione di funzioni e di classi.

cdimauro
31-03-2008, 09:40
Chi ha parlato di suddividere il codice in moduli ?????
Ora ci attacchiamo alla terminologia ? Hai capito bene a cosa mi riferisco.
No, non l'avevo capito. Parlando di programmazione "a moduli" pensavo ti riferissi alla più nota "programmazione modulare".
Parlo di mettere le istruzioni, senza una funzione, senza una classe, direttamente all'interno di un modulo. Come lo chiami ?
Indipendentemente da quello che ci vai a mettere, parliamo di programmazione modulare nel caso in cui esiste il concetto di modulo/unit/package, ecc. che racchiude degli "oggetti" (non nel senso della programmazione a oggetti, ovviamente).

Esteso da tempo anche a linguaggi che non hanno il concetto di "modulo", ma devono far ricorso ai file include per separare l'interfaccia dall'implementazione.

Ma questo, ripeto, non è un paradigma di programmazione, quanto una "best practice" incoraggiata in ingegneria del software.
Ok, allora tanto per chiarire dammi un termine per definire la possibilità mescolare la creazione di funzioni e di classi.
Nel caso di Python, si parla di creazione di oggetti (di tipo diverso).

Sì, se non si fosse capito, ci sto girando attorno. :p Anche perché POSSO FARLO, visto che Python è un linguaggio puramente a oggetti e non sto facendo altro che descrivere cosa avviene quando si "definiscono" funzioni e classi. ;)

Per contro, in Java come giustifichi / classifichi la possibilità di creare funzioni e classi nello stesso package? Tipo l'esempio che ti ho riportato sopra? ;)

cionci
31-03-2008, 09:56
E' chiaro che anche in Java si può fare programmazione procedurale, come in C si può fare programmazione ad oggetti, ma è comunque scoraggiata dalle caratteristiche stesse del linguaggio. Al contrario in Python le caratteristiche del linguaggio incoraggiano a fare programmazione procedurale, ma incoraggiano anche a mettere codice non strutturato, perdonami ma non so come chiamarlo, visto che nemmeno tu mi hai suggerito come, all'interno del modulo. Quale miglior modo per confondere le idee a chi lo studia ? Siamo addirittura ai livelli di PHP per queste caratteristiche.

Visto che ti piace girare intorno al problema, noto anche sull'inserimento di codice non strutturato all'interno dei moduli, ne deduco che non ti interessi la discussione, quindi per me si chiude qui. Dopo tutto sono riuscito a spiegare cosa intendevo, nonostante i tuoi tentativi di sviare la discussione, quindi per me la questione è chiusa qui.

Mazda RX8
31-03-2008, 10:00
Ti avevo già risposto qui http://www.hwupgrade.it/forum/showpost.php?p=21790418&postcount=373 ;)

Te lo ripeto:

E' molto semplice, ma se vuoi una guida completa usa questa http://www.python.it/doc/Howtothink/Howtothink-html-it/index.htm

:)

ok, THK! :)

cdimauro
31-03-2008, 10:19
E' chiaro che anche in Java si può fare programmazione procedurale, come in C si può fare programmazione ad oggetti, ma è comunque scoraggiata dalle caratteristiche stesse del linguaggio. Al contrario in Python le caratteristiche del linguaggio incoraggiano a fare programmazione procedurale, ma incoraggiano anche a mettere codice non strutturato, perdonami ma non so come chiamarlo, visto che nemmeno tu mi hai suggerito come, all'interno del modulo. Quale miglior modo per confondere le idee a chi lo studia ? Siamo addirittura ai livelli di PHP per queste caratteristiche.
Non scherziamo: PHP non è né carne né pesce. E' una versione del C mascherata da linguaggio di scripting, realizzato sul modello del "mi serve qualcosa, aggiungo una pezza" (ma soprattutto: "mi servono delle nuove funzionalità, e aggiungo n-mila funzioni all'interprete").

In Python il codice che tu pensi sia "non strutturato" è sempre racchiuso in un "modulo": anche l'applicazione "principale" (ossia il file lanciato con python.exe) lo è:
>>> __name__
'__main__'
e il codice eseguito è quello che viene chiamato di "inizializzazione" in altri linguaggi che mettono a disposizione il concetto di "modulo" (che in Python... è sempre un oggetto).

In PHP non esiste il concetto né di modulo (come sopra) né tanto meno di codice di "inizializzazione": tutto viene eseguito così com'è, partendo dall'inizio fino alla fine.
Visto che ti piace girare intorno al problema, noto anche sull'inserimento di codice non strutturato all'interno dei moduli, ne deduco che non ti interessi la discussione, quindi per me si chiude qui. Dopo tutto sono riuscito a spiegare cosa intendevo, nonostante i tuoi tentativi di sviare la discussione, quindi per me la questione è chiusa qui.
Sviare? Ti ho semplicemente DIMOSTRATO come stanno le cose: Python è un linguaggio puramente a oggetti, Java no.

Per il resto, è il programmatore che fa la differenza: ti ho fatto vedere che in Java si può benissimo lavorare con la programmazione procedurale o funzionale, senza utilizzare MAI il concetto di classe / oggetto.

E' inutile che tendi di nascondere il tutto dietro la parola "incoraggiare": sono i FATTI che contano, quelli che ti ho portato con tanto di esempi che dimostrano qual è la situazione REALE con entrambi i linguaggi.

fek
31-03-2008, 10:28
Per inciso, guarda qui:
>>> dir(1)
['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__str__', '__sub__', '__truediv__', '__xor__']
Sono tutti i METODI che l'oggetto 1 (che è un numero intero) mette a disposizione (in Python).

Fammi vedere qualcosa di simile in Java per "int i = 1".

P.S. La programmazione a moduli non esiste. Esiste quella procedurale.

Cesare, questo e' capzioso da morire. Sai benissimo che i numeri sono trattata in Java (e in ogni linguaggio che si rispetti) come tipi puri per questioni di performance. Questo non vuol dire che scrivendo 2+2 si stia programmando con paradigma procedurale. Non arrampichiamoci sui vetri qui.

Scrtivere (-1).abs non rende il linguaggio particolarmente cool. Solito cute code senza motivo di esistere, quando il linguaggio poi non ti prende gli errori di sintassi a tempo di compilazione facendoti perdere tempo. Sono queste le cose importanti.

In C#, per altro, il boxing permette di passare da scalare a oggetto ed invocarne eventuali metodi.

fek
31-03-2008, 10:33
Sviare? Ti ho semplicemente DIMOSTRATO come stanno le cose: Python è un linguaggio puramente a oggetti, Java no.

Falso. Anche Java e' un linguaggio puramente ad oggetti.

2 + 3

Invoca il metodo + sull'oggetto 2 con parametro 3. La sintassi e' una questione di semplice comodita'. Il 2 e' trattato (giustamente) come scalare a tempo di esecuzione per questioni di performance.

cdimauro
31-03-2008, 10:46
Cesare, questo e' capzioso da morire. Sai benissimo che i numeri sono trattata in Java (e in ogni linguaggio che si rispetti) come tipi puri per questioni di performance. Questo non vuol dire che scrivendo 2+2 si stia programmando con paradigma procedurale. Non arrampichiamoci sui vetri qui.
Nessuna "capziosità": int, float, bool, ecc. NON sono oggetti in Java, e questo è un dato di fatto. ;)

Mi premeveva sottolineare due cose:
- le differenze fra Python (ma anche Ruby, SmallTalk, ecc.) e Java;
- il fatto che anche in Java si può benissimo programmare in maniera procedurale, funzionale o anche mischiando entrambi i paradigmi, senza utilizzare minimamente il concetto di "classe" / "oggetto".

Forse sono stato un po' troppo irruento nel farlo. :stordita:

Non condivido però il "linguaggio che si rispetti" col fatto che dia la possibilità o meno di utilizzare tipi scalari senza che questi siano oggetti, quindi per questioni puramente legate alle prestazioni: dipende dal tipo di applicazioni che si sviluppano.
E, come tu insegni, se un codice non è particolarmente performante, profiler alla mano si individuano i punti deboli, e in primis si cerca una soluzione algoritmica. Se non c'è possibilità, si può pensare (nel caso di Python, visto che esiste) di utilizzare un compilatore JIT. Se ancora non è soddisfacente, si riscrive quella parte in un linguaggio di più basso livello.

In 3 anni e mezzo non sono dovuto ricorrere a nessuna delle tre possibilità. ;)
Scrtivere (-1).abs non rende il linguaggio particolarmente cool. Solito cute code senza motivo di esistere.
Su questo concordo, anche se preferisco questa notazione a quella funzionale.

Per inciso, in Python si scrive abs(-1), oppure len('Pippo'), ma NON condivido questa notazione: personalmente, visto che si tratta di oggetti, preferisco nettamente -1.abs() e 'Pippo'.len.

Opinione personale, lo ribadisco.
In C#, per altro, il boxing permette di passare da scalare a oggetto ed invocarne eventuali metodi.
Sì, ne sono al corrente. E mi pare che pure in Java da qualche tempo il boxing (e l'unboxing) sia automatico, se non ricordo male.
Falso. Anche Java e' un linguaggio puramente ad oggetti.

2 + 3

Invoca il metodo + sull'oggetto 2 con parametro 3. La sintassi e' una questione di semplice comodita'. Il 2 e' trattato (giustamente) come scalare a tempo di esecuzione per questioni di performance.
Sei sicuro di questo? Vogliamo vedere il bytecode generato dal compilatore Java? Scommetto che non c'è nessuna traccia di chiamata a metodi. ;)

EDIT: ho visto che hai modificato il messaggio precedente aggiungendo una stoccata sugli errori di sintassi. :|

VICIUS
31-03-2008, 10:59
Fallo. :)
Non ho la più pallida idea di come mandare i vari cpuid da ruby. Se mi tocca scrivere una estensione in C sarà da suicidio. :muro:

fek
31-03-2008, 11:17
Nessuna "capziosità": int, float, bool, ecc. NON sono oggetti in Java, e questo è un dato di fatto. ;)

Si', lo sono invece!
Qui stai facendo una marea di confusione fra la sintassi di un linguaggio e la sua coerenza.
E' sintatticamente comodo scrivere "2 + 2" invece di 2.add(2) ma sono logicamente oggetti in Java. Infatti puoi invocarci metodi sopra via boxing.

Sei sicuro di questo? Vogliamo vedere il bytecode generato dal compilatore Java? Scommetto che non c'è nessuna traccia di chiamata a metodi. ;)

Ho gia' scritto nel messaggio precedente che l'implementazione per questioni di efficienza elimina totalmente qualunque invocazione. Sono ragionevolmente certo che anche l'interprete Python esegue 2 + 2 con una add e non con un'invocazione a metodo.

gugoXX
31-03-2008, 11:18
Non ho la più pallida idea di come mandare i vari cpuid da ruby. Se mi tocca scrivere una estensione in C sarà da suicidio. :muro:

Se vuoi posso passarti la DLL di qualche pagina fa, gia' compilata dal C++
E' ovviamente banalissima.
Se da ruby si possono chiamare funzioni esterne come penso, dovrebbe essere semplice.

VICIUS
31-03-2008, 11:56
Se vuoi posso passarti la DLL di qualche pagina fa, gia' compilata dal C++
E' ovviamente banalissima.
Se da ruby si possono chiamare funzioni esterne come penso, dovrebbe essere semplice.
Grazie ma non avrei macchine con Windows su cui usare la dll :D

Scrivere una estensione è stato più facile del previsto.
#include <ruby.h>

static VALUE do_cpuid(VALUE self, VALUE ax)
{
int op = NUM2INT(ax);
unsigned int regs[4];

__asm__ __volatile__ (
"mov %%ebx, %%esi\n\t"
"cpuid\n\t"
"xchg %%ebx, %%esi"
: "=a" (regs[0]), "=S" (regs[1]),
"=c" (regs[2]), "=d" (regs[3])
: "0" (op)
);

return rb_ary_new3(4, INT2NUM(regs[0]), INT2NUM(regs[1]), INT2NUM(regs[2]), INT2NUM(regs[3]));
}

void Init_cpuid()
{
rb_define_global_function("do_cpuid", do_cpuid, 1);
}
Devo solo capire come mai ruby mi va in paranoia se provo a passare 0x80000001 come operando.

gugoXX
31-03-2008, 12:26
Devo solo capire come mai ruby mi va in paranoia se provo a passare 0x80000001 come operando.

Prova a vedere se lo stai passando come signed o come unsigned.
Io ho dichiarato apposta "unsigned int" nel passaggio, sia in C# che in C++.
Magari e' solo una specie di "mismatch" che hai introdotto...

gugoXX
31-03-2008, 12:32
Ho gia' scritto nel messaggio precedente che l'implementazione per questioni di efficienza elimina totalmente qualunque invocazione. Sono ragionevolmente certo che anche l'interprete Python esegue 2 + 2 con una add e non con un'invocazione a metodo.

Mmmh. da quanto ho letto finora potrebbe non essere cosi' scontato.
Gli interi possono essere lunghi a piacere, il che sarebbe difficilmente compatibile con una compilazione "statica" di qualche opcode macchina.

Mi spiego, magari alla fine c'e' una specie di switch dinamico che si chiede se l'intero che si sta trattando e' sufficientemente "piccolo", oppure gia' grosso, per trattarli di conseguenza nel modo piu' efficiente.
Ma essendoci bisogno di questo switch presumo che il tutto sia all'interno di un metodo, fossanche alla fine realizzato con una funzione inline, e non di un semplice opcode assembly add che si puo' invece trovare nel C#.
Insomma, ogni volta che sommo 2 interi in Python "forse" ho bisogno di una call. Oppure anche solo di uno switch.
Ma tanto non e' questo uno dei problemi oggi, almeno fino a quando si usa il linguaggio per architetture e non per progetti in cui le performance non sono critiche.

Uno degli utlimi pregi del C# sono le class extension, ovvero la decorazione di oggetti con nuove funzioni.
Oggi possiamo "decorare" l'oggetto
int
con nuove funzioni, esattamente come si otterrebbe con il python, pur rimanendo pero' nello spazio degli oggetti di tipo value.
Tranne appunto per gli operatori, mi sembra di aver capito. E forse ne intuisco anche il motivo a questo punto.

cdimauro
31-03-2008, 12:34
Si', lo sono invece!
Qui stai facendo una marea di confusione fra la sintassi di un linguaggio e la sua coerenza.
E' sintatticamente comodo scrivere "2 + 2" invece di 2.add(2) ma sono logicamente oggetti in Java. Infatti puoi invocarci metodi sopra via boxing.
Suvvia Fran: se fossero "logicamente oggetti" non ci sarebbe bisogno né di boxing né di autoboxing (introdotto con la versione 5 di Java). ;)

Guarda qui http://java.sun.com/developer/technicalArticles/releases/j2se15/

Autoboxing and Auto-Unboxing of Primitive Types

Converting between primitive types, like int, boolean, and their equivalent Object-based counterparts like Integer and Boolean, can require unnecessary amounts of extra coding, especially if the conversion is only needed for a method call to the Collections API, for example.

The autoboxing and auto-unboxing of Java primitives produces code that is more concise and easier to follow. In the next example an int is being stored and then retrieved from an ArrayList. The 5.0 version leaves the conversion required to transition to an Integer and back to the compiler.

E' la stessa Sun che fa distinzione fra tipi primitivi e oggetti. Infatti nella parte che ho evidenziato ne esplicita chiaramente la differenza.

Comunque non c'è problema: possiamo anche considerarli "logicamente oggetti", ma a questo punto possiamo estendere lo stesso concetto a qualunque linguaggio (a oggetti) che faccia differenza fra tipi primitivi e oggetti. :)
Ho gia' scritto nel messaggio precedente che l'implementazione per questioni di efficienza elimina totalmente qualunque invocazione. Sono ragionevolmente certo che anche l'interprete Python esegue 2 + 2 con una add e non con un'invocazione a metodo.
Sbagli (una delle rarissime volte). :)

>>> class MyInt(int):
... def __add__(self, other):
... return super(MyInt, self).__add__(other) + 1000
... def __radd__(self, other):
... return super(MyInt, self).__radd__(other) + 1000000
...
>>> a = MyInt(0)
>>> a + 10
1010
>>> 10 + a
1000010
Voilà: ecco il mio nuovo tipo, derivato da int, che quando gli si somma a destra "qualcosa" (potrebbe essere anche un float, un complex, o altro) vi aggiunge 1000, e quando viene sommato a "qualcosa" gli aggiunge 1000000.

Da notare che, onde evitare ricorsioni infinite, richiamo il METODO della classe da cui deriva, che poi è quello che si occupa a tutti gli effetti di eseguire l'operazione di addizione. ;)

In Python qualunque è un oggetto, e ogni operazione eseguita comporta l'esecuzione di metodi. Come SmallTalk, e Ruby. :)

E' inefficiente? Sicuramente, ma poco importa: non ho mai avuto la necessità di sbattermi la testa per velocizzare il mio codice, e semmai dovesse succedere seguirò la trafila che anche tu suggerisci da quando ti conosco. ;)

cdimauro
31-03-2008, 12:35
Mmmh. da quanto ho letto finora potrebbe non essere cosi' scontato.
Gli interi possono essere lunghi a piacere, il che sarebbe difficilmente compatibile con una compilazione "statica" di qualche opcode macchina.

Mi spiego, magari alla fine c'e' una specie di switch dinamico che si chiede se l'intero che si sta trattando e' sufficientemente "piccolo", oppure gia' grosso, per trattarli di conseguenza nel modo piu' efficiente.
Ma essendoci bisogno di questo switch presumo che il tutto sia all'interno di un metodo, fossanche alla fine realizzato con una funzione inline, e non di un semplice opcode assembly add che si puo' invece trovare nel C#.
Insomma, ogni volta che sommo 2 interi in Python "forse" ho bisogno di una call. Oppure anche solo di uno switch.
Ma tanto non e' questo uno dei problemi oggi, almeno fino a quando si usa il linguaggio per architetture e non per progetti in cui le performance non sono critiche.

Uno degli utlimi pregi del C# sono le class extension, ovvero la decorazione di oggetti con nuove funzioni.
Oggi possiamo "decorare" l'oggetto
int
con nuove funzioni, esattamente come si otterrebbe con il python, pur rimanendo pero' nello spazio degli oggetti di tipo value.
Tranne appunto per gli operatori, mi sembra di aver capito. E forse ne intuisco anche il motivo a questo punto.
Esattamente. Vedi sopra. :p

fek
31-03-2008, 12:55
Suvvia Fran: se fossero "logicamente oggetti" non ci sarebbe bisogno né di boxing né di autoboxing (introdotto con la versione 5 di Java). ;)

Ripeto, sono logicamente oggetti, l'implementazione in bytecode e' una questione di efficienza, non di coerenza del linguaggio infatti via boxing puoi invocarci metodi sopra per mantenere la coerenza interna del linguaggio.

Comunque non c'è problema: possiamo anche considerarli "logicamente oggetti", ma a questo punto possiamo estendere lo stesso concetto a qualunque linguaggio (a oggetti) che faccia differenza fra tipi primitivi e oggetti. :)

Assolutamente si': C# e' equivalente da questo punto di vista.


Sbagli (una delle rarissime volte). :)

Hai ragione, ho sbagliato, ho dato troppo credito a chi ha implementato Python pensando che fosse abbastanza sveglio da trattare trasparentemente i tipi primitivi in maniera efficiente.
Evidentemente non lo e' :fagiano:


E' inefficiente? Sicuramente, ma poco importa: non ho mai avuto la necessità di sbattermi la testa per velocizzare il mio codice, e semmai dovesse succedere seguirò la trafila che anche tu suggerisci da quando ti conosco. ;)

Premature optimization is the root of all evil but blind pessimization the source of no good ;)

DioBrando
31-03-2008, 13:21
Visual Studio supporta IronPython ?

2) il discorso sulle librerie era diverso, è quello a cui mi riferivo qualche post sopra

Cesare ti ha già risposto cmq preciso il primo punto.

Hai 3 modi per utilizzare VisualStudio:
1. usi IronPythonStudio come ha detto Cesare che è basato su IronPython e VS2008 Shell
2. usi il pacchetto IronPython per ASP.NET
3. usi extensibility program attraverso l'SDK di VS, integrando una versione preesistente dell'IDE Microsoft (però è richiesto come minimo VS2005 perchè Ironpython non funziona con versioni antecedenti al framework 2.0)

Nessuna delle 3 và ad intaccare in alcun modo versioni preinstallate di VS.


Hai altra carne (nuova) da mettere al fuoco?
Che però non siano paragoni con PHP, il simbolo dello spaghetti code del 21° secolo, per cortesia (e che ha aggiunto funzionalità legate all'OOP dalla versione 5, mentre Python è stato progettato in questo modo fin dall'inizio da Van Rossum :rolleyes: ), perchè qui cominci a farla davvero fuori dal vaso, per usare un francesismo...

tomminno
31-03-2008, 13:23
Esatto: non è un caso se abbia usato un int anziché un Integer... :fiufiu: Per la serie: "bastardi dentro". :D

Anche in .NET i value types (int, double, datatime,...) non sono degli oggetti (non derivano da Object) ma struct, per semplici motivi di performance.

cdimauro
31-03-2008, 13:27
Ripeto, sono logicamente oggetti, l'implementazione in bytecode e' una questione di efficienza, non di coerenza del linguaggio infatti via boxing puoi invocarci metodi sopra per mantenere la coerenza interna del linguaggio.

Assolutamente si': C# e' equivalente da questo punto di vista.
Perfetto. Basta chiarire e si risolvono tutte le incomprensioni. :)
Hai ragione, ho sbagliato, ho dato troppo credito a chi ha implementato Python pensando che fosse abbastanza sveglio da trattare trasparentemente i tipi primitivi in maniera efficiente.
Evidentemente non lo e' :fagiano:
Il problema è che... non esistono tipi primitivi. :D In Python qualunque tipo è un oggetto, e gli interi non fanno eccezione.

Esempio:
>>> 1 << 256
115792089237316195423570985008687907853269984665640564039457584007913129639936L
:D

Idem per SmallTalk e, penso (ma non ne sono sicuro) Ruby. :fagiano:

Sono linguaggi pensati per obiettivi diversi. :)
Premature optimization is the root of all evil but blind pessimization the source of no good ;)
:rotfl: Mi fai morire!!! :D

VICIUS
31-03-2008, 13:30
Prova a vedere se lo stai passando come signed o come unsigned.
Io ho dichiarato apposta "unsigned int" nel passaggio, sia in C# che in C++.
Magari e' solo una specie di "mismatch" che hai introdotto...
Avevi ragione. Mi è bastato usare NUM2UINT ed ha smesso di rompere.

Alla fine è venuto veramente bene. Molto più chiaro di quello di Cesare in python. :Prrr:

cdimauro
31-03-2008, 13:30
Anche in .NET i value types (int, double, datatime,...) non sono degli oggetti (non derivano da Object) ma struct, per semplici motivi di performance.
Sì, ne ero al corrente. Il vantaggio di linguaggi come C#, però, è che eseguono automaticamente il de/boxing da e verso le rispettive classi.

Non so se altri linguaggi .NET offrono caratteristiche similiari. Mi piace molto Delphi, e c'è una versione .NET, ma onestamente non mi sono interessato (la diatriba, però, mi ha incuriosito :D).

fek
31-03-2008, 13:32
Il problema è che... non esistono tipi primitivi. :D In Python qualunque tipo è un oggetto, e gli interi non fanno eccezione.

Quindi, per riassumere, ho un linguaggio che:
- Per design non fa ha check della sintassi a compile-time (tutto dinamico)
- Puo' portare a scrivere codice altamente offuscato se si usano le sue caratteristiche peculiari
- E' volutamente pessimizzato nelle performance per supportare la tipizzazione

Dove metto la firma? :D

Sono linguaggi pensati per obiettivi diversi. :)

Si', l'obiettivo e' farmi ammattire :D

:rotfl: Mi fai morire!!! :D

Ho un quote per ogni occasione!

Disclaimer: questo post e' stato scritto con le difficolta' imposte da un processo in Python in background che sta occupando 1gb di ram e 100% di un dual core e gira da mezz'ora per fare una cosa che dovrebbe impiegare 30 secondi al massimo.

cdimauro
31-03-2008, 13:32
Avevi ragione. Mi è bastato usare NUM2UINT ed ha smesso di rompere.

Alla fine è venuto veramente bene. Molto più chiaro di quello di Cesare in python. :Prrr:
Opinabile. :O

cdimauro
31-03-2008, 13:41
Quindi, per riassumere, ho un linguaggio che:
- Per design non fa ha check della sintassi a compile-time (tutto dinamico)
- Puo' portare a scrivere codice altamente offuscato se si usano le sue caratteristiche peculiari
- E' volutamente pessimizzato nelle performance per supportare la tipizzazione

Dove metto la firma? :D
GLOM. :| Giudizio severo. -_-
Si', l'obiettivo e' farmi ammattire :D
Non dirmi che pensi di abbandonare Ruby dopo questa discussione... :stordita:

A parte gli scherzi, considerata la notevole spinta che stanno avendo i linguaggi "di scripting" (ma preferirei chiamarli "dinamici"), e che hanno bene o male "problemi" simili, tu cosa ne pensi? Di farne a meno? Considerato in particolare il campo in cui lavori...

EDIT: :rotfl: Ho appena visto la parte in piccolo che hai aggiunto. :D :D :D

fek
31-03-2008, 13:47
A parte gli scherzi, considerata la notevole spinta che stanno avendo i linguaggi "di scripting" (ma preferirei chiamarli "dinamici"), e che hanno bene o male "problemi" simili, tu cosa ne pensi? Di farne a meno? Considerato in particolare il campo in cui lavori...

Sai gia' che cosa voglio fare: aspettare un linguaggio dinamico che mi permetta di scegliere che cosa rendere statico e fortemente tipizzato, di modo da evitare tutte le trappole e trappoline di Python&soci. In questo momento mi sto studiando F# comunque. (Aspettando che Python in background decida di finire e lasciarmi lavorare :D)

F# is a pragmatically-oriented variant of ML that shares a core language with OCaml. F# programs run on top of the .NET Framework. Unlike other scripting languages it executes at or near the speed of C# and C++, making use of the performance that comes through strong typing. Unlike many statically-typed languages it also supports many dynamic language techniques, such as property discovery and reflection where needed. F# includes extensions for working across languages and for object-oriented programming, and it works seamlessly with other .NET programming languages and tools.

Sweetness...

VICIUS
31-03-2008, 13:55
Opinabile. :O
Sospeso due giorni per contestazione pubblica di quello che dice un mod! :mad:

A parte gli scherzi devo ancora capire come mai hai gestito brand e vendor in due maniere diverse. Nella parte in cui stampi step e compagnia non potevi usare delle variabili? Quel "% c_intToNibbles(eax)[ : 4]" mi ha confuso non poco :)

tomminno
31-03-2008, 14:01
Sì, ne ero al corrente. Il vantaggio di linguaggi come C#, però, è che eseguono automaticamente il de/boxing da e verso le rispettive classi.


Non mi risultano esistere le rispettive classi, visto che non c'è una classe Int32 ma solo una struct che non deriva da Object.
Se vuoi fare il boxing in C# devi scrivere:

int i = 0;
object o = (object)i;

Tutt'altro che automatico.

cdimauro
31-03-2008, 14:18
Sai gia' che cosa voglio fare: aspettare un linguaggio dinamico che mi permetta di scegliere che cosa rendere statico e fortemente tipizzato, di modo da evitare tutte le trappole e trappoline di Python&soci. In questo momento mi sto studiando F# comunque. (Aspettando che Python in background decida di finire e lasciarmi lavorare :D)
Mah. F# è un bel linguaggio ma è molto diverso da quelli che uso abitualmente. Preferirei Cobra, che viene incontro a tutte le tue esigenze (a parte l'indentazione forzata :D).

P.S. Se Python il collo di bottiglia, prova questo: http://psyco.sourceforge.net/
Per usarlo è sufficiente aggiungere le seguenti due righe di codice nel sorgente del modulo principale:
import psyco
psyco.full()
:)
Sospeso due giorni per contestazione pubblica di quello che dice un mod! :mad:
:eek: Questo è abuso di potere! Ne parlerò con Corsini!! Vedrai... che per l'occasione mi bannano. :asd:
A parte gli scherzi devo ancora capire come mai hai gestito brand e vendor in due maniere diverse. Nella parte in cui stampi step e compagnia non potevi usare delle variabili? Quel "% c_intToNibbles(eax)[ : 4]" mi ha confuso non poco :)
Prendiamo l'istruzione incriminata:
print 'CPU Stepping: %s, Model: %s, Family: %s, Processor Type: %s' % c_intToNibbles(eax)[ : 4]
Dalla stringa di formattazione è chiaro che deve stampare 4 valori, corrispondenti ai 4 %s in essa presenti.

c_intToNibbles(eax) è una funzione che converte il valore a 32 bit di eax nei corrispondenti nibble, che sono 8 (4 * 8 = 32). Infatti Nibble(s) = più di un nibble, l'avevo messo apposta come nome.

Però a me non interessano tutti e 8, ma soltanto i primi 4, quindi applicando lo slicing [ : 4] tiro fuori tutti gli elementi dal primo fino al 4o escluso.

Usando delle variabili intermedie, come chiedi, avrei potuto riscrivere quel codice così:
Nibbles = c_intToNibbles(eax)[ : 4]
print 'CPU Stepping: %s, Model: %s, Family: %s, Processor Type: %s' % Nibbles
Oppure così:
Stepping, Model, Family, ProcessorType = c_intToNibbles(eax)[ : 4]
print 'CPU Stepping: %s, Model: %s, Family: %s, Processor Type: %s' % (Stepping, Model, Family, ProcessorType)
O ancora:
Values = dict(zip(('Stepping', 'Model', 'Family', 'ProcessorType'), c_intToNibbles(eax)[ : 4])
print 'CPU Stepping: %(Stepping)s, Model: %(Model)s, Family: %(Family)s, Processor Type: %(ProcessorType)s' % Values
Non mi vengono in mente altri modi al momento. :D
Non mi risultano esistere le rispettive classi, visto che non c'è una classe Int32 ma solo una struct che non deriva da Object.
Se vuoi fare il boxing in C# devi scrivere:

int i = 0;
object o = (object)i;

Tutt'altro che automatico.
Vero, hai ragione. Ricordavo male. :)

fek
31-03-2008, 14:21
Mah. F# è un bel linguaggio ma è molto diverso da quelli che uso abitualmente. Preferirei Cobra, che viene incontro a tutte le tue esigenze (a parte l'indentazione forzata :D).

Ma purtroppo e' scritto da un solo ragazzo e non sara' mai supportato.
Mentre dietro F# c'e' tutta MS:

F# is statically typed. This means that all expressions are given a type through the static typing rules of the language. F# code is also dynamically typed in the sense that certain values permit the runtime discovery of type information through type tests, and dynamic types such as obj can represent essentially any F# value. Types whose values do not permit any additional discovery of information through runtime type tests are called simple types. Types such as int and string are simple types, as indeed are all .NET value types, .NET delegate types, sealed (final) .NET reference types, F# record types and F# union types .

Che bell che bello.


P.S. Se Python il collo di bottiglia, prova questo: http://psyco.sourceforge.net/
Per usarlo è sufficiente aggiungere le seguenti due righe di codice nel sorgente del modulo principale:
import psyco
psyco.full()
:)


Meno mi avvicino al codice Python piu' la mia vita e' serena e rigogliosa :D

cdimauro
31-03-2008, 14:24
:rotfl: La modifica fagliela apportare al tuo collega pythonista... :fiufiu:

Sì, so che F# è supportato da MS, ma non riesco a farmelo piacere (a parte per le caratteristiche).

Peccato per Cobra: alla MS abbiano già investito abbastanza su IronPython, e penso che difficilmente supporteranno un altro linguaggio "simile".

cionci
31-03-2008, 14:49
perchè qui cominci a farla davvero fuori dal vaso, per usare un francesismo...
DioBrando, sinceramente mi hai stancato, evito di raccogliere la provocazione, adios.

fek
31-03-2008, 14:55
:rotfl: La modifica fagliela apportare al tuo collega pythonista... :fiufiu:

Sembra abbiano gia' fatto.
Ti assicuro che avere il mio collega fra i pythonisti non vi fa alcun onore :D


Sì, so che F# è supportato da MS, ma non riesco a farmelo piacere (a parte per le caratteristiche).

Peccato per Cobra: alla MS abbiano già investito abbastanza su IronPython, e penso che difficilmente supporteranno un altro linguaggio "simile".

Sostituisci difficile, con impossibile.

DioBrando
31-03-2008, 15:47
DioBrando, sinceramente mi hai stancato, evito di raccogliere la provocazione, adios.

Nessuna provocazione, è stato risposto a tutte le tue osservazioni, puntualmente.
Tu non vuoi aggiungere nient'altro di nuovo? Perfetto allora la cosa finisce automaticamente qui, ma che finisca qui però anche le volte future, senza che si vedranno le medesime critiche qui "once-4-all" smentite.

Tra () io trovo sia molto più provocatorio fissarsi e criticare pregiudizialmente un linguaggio che è evidente tu non conosca bene tanto quanto altri e che dovresti, invece, per portare acqua al tuo mulino.


Senza rancore cmq.
Aloha :)

cionci
31-03-2008, 16:00
Ammetto che certe mie posizioni erano errate come il supporto a .Net di cui non conoscevo l'esistenza, ma ad esempio ci sono altre che rimangono tuttora in piedi e mi sentirò libero di chiamarle in causa quando più mi pare e piace. O devo chiedere il tuo permesso ?

gugoXX
31-03-2008, 16:07
Beh, allora smettiamo anche di dire che in Python si fanno cose che il C#3.5 richiede 10 volte tanto tempo o 10 volte tante righe, perche' come abbiamo visto prima il numero di righe e' lo stesso, con stessi identici concetti.
Se invece il paragone fosse tra C#2.0 e Python allora ammetto che la mancanza della parte funzionale potrebbe farsi sentire in qualche caso.

Comunque, a parte IronPython di cui tutti parlano ma nessuno sembra usarlo,
le librerie del C#, sia basso livello verso l'SDK di Windows, sia alto livello verso le GUI, sono piu' numerose (e anche molto facili da usare).

E' sempre il solito discorso. C# e' un linguaggio tanto bello, ma se non fosse per il framework io non lo userei.
Il linguaggio non e' tutto. Molto, quasi tutto, fanno le librerie.
Certo, va tanto bene, ma solo sotto Windows.
Ecchissenefrega.
Essendo cablato proprio su questo sistema, con C# si potranno far fare cose a Windows che con gli altri e' piu' difficile fare.

DioBrando
31-03-2008, 16:09
Ammetto che certe mie posizioni erano errate come il supporto a .Net di cui non conoscevo l'esistenza, ma ad esempio ci sono altre che rimangono tuttora in piedi

Tipo quali?


e mi sentirò libero di chiamarle in causa quando più mi pare e piace. O devo chiedere il tuo permesso ?

Ovviamente no, ma trovo risibile il fatto che si debbano ripetere obiezioni legate al funzionamento di un linguaggio che però non è mai stato osservato "al lavoro".
Più in generale, trovo sia + sensato per una discussione parlare di cose che si conoscono, invece di criticare andando a tentoni e poi dire "ah scusa non lo sapevo".
Meglio informarsi prima e poi discuterne no?


Ovviamente se poi ti riferisci a caratteristiche intrinseche tipo "non mi piace la sintassi", non serve certo averci programmato e non ti posso dire niente perchè tutto sommato è abbastanza soggettiva.
A me non piace Ruby che trovo un po' troppo "perliano" per i miei gusti, ma di certo non ci faccio un sermone sopra ("che schifo Ruby, spero di non averci mai a che fare ecc. ecc."
Compris? ;)

Poi vedi tu, non puoi pretendere però che a certe persone non dia fastidio un atteggiamento simile.
E da un mod magari magari mi aspetterei dell'altro, pur fatti patti saldi che il "de gustibus..." vale per tutti, mod compresi.

cdimauro
31-03-2008, 16:17
Beh, allora smettiamo anche di dire che in Python si fanno cose che il C#3.5 richiede 10 volte tanto tempo o 10 volte tante righe, perche' come abbiamo visto prima il numero di righe e' lo stesso, con stessi identici concetti.
Se invece il paragone fosse tra C#2.0 e Python allora ammetto che la mancanza della parte funzionale potrebbe farsi sentire in qualche caso.
Ne abbiamo già parlato il "10 volte" è un'esagerazione sicuramente, e tra l'altro non mi pare che il confronto fosse con C#. ;)

Quanto al numero di righe, conta sicuramente (tu hai postato una versione "castrata" del tuo script ;)), ma la "complessità" del codice in C# è, IMHO, superiore.

Il codice di Python (ma anche l'implementazione di Ruby realizzata d Vicius non è da meno) lo trovo molto più semplice e leggibile.

Potremmo anche fare un confronto "row-by-row", analizzando ogni "elemento" del codice, e te ne renderesti conto subito. ;)
Comunque, a parte IronPython di cui tutti parlano ma nessuno sembra usarlo,
le librerie del C#, sia basso livello verso l'SDK di Windows, sia alto livello verso le GUI, sono piu' numerose (e anche molto facili da usare).
Non lo uso semplicemente perché non ne ho avuto mai bisogno, ma rimane il fatto che può "consumare" qualunque classe .NET, come C#, quindi dal punto di vista del framework a cui attingere non cambia nulla (tranne che IronPython ha pure le sue librerie standard che si trascina dietro ;)).
E' sempre il solito discorso. C# e' un linguaggio tanto bello, ma se non fosse per il framework io non lo userei.
Il linguaggio non e' tutto. Molto, quasi tutto, fanno le librerie.
Certo, va tanto bene, ma solo sotto Windows.
Ecchissenefrega.
Essendo cablato proprio su questo sistema, con C# si potranno far fare cose a Windows che con gli altri e' piu' difficile fare.
Non ho mai posto vincoli di piattaforma nei confronti. :)

DioBrando
31-03-2008, 16:19
Beh, allora smettiamo anche di dire che in Python si fanno cose che il C#3.5 richiede 10 volte tanto tempo o 10 volte tante righe, perche' come abbiamo visto prima il numero di righe e' lo stesso, con stessi identici concetti.

Vabbè dai adesso andiamo a prendere una frase su mille interventi, per ribattere qualcosa :D

Non c'è bisogno di smettere di dirlo, perchè l'ha scritto una volta Cesare in un contesto, per altro ammettendo la sua scarsa conoscenza riguardo a C# e in generale (mi pare) del framework NET.

Sui tempi di esecuzione bisognerebbe fare una prova, certo è che nei test del 2006 IronPython era risultato addirittura + veloce di CPython quindi tanto male non dev'essere, ma cmq su pezzi di codice lunghi nemmeno una pagina non si possono fare chissà quali valutazioni.


Se invece il paragone fosse tra C#2.0 e Python allora ammetto che la mancanza della parte funzionale potrebbe farsi sentire in qualche caso.

Comunque, a parte IronPython di cui tutti parlano ma nessuno sembra usarlo,
le librerie del C#, sia basso livello verso l'SDK di Windows, sia alto livello verso le GUI, sono piu' numerose (e anche molto facili da usare).

E' sempre il solito discorso. C# e' un linguaggio tanto bello, ma se non fosse per il framework io non lo userei.
Il linguaggio non e' tutto. Molto, quasi tutto, fanno le librerie.
Certo, va tanto bene, ma solo sotto Windows.
Ecchissenefrega.
Essendo cablato proprio su questo sistema, con C# si potranno far fare cose a Windows che con gli altri e' piu' difficile fare.

Ovviamente, è tutto connesso, se lavori con C# o ASP.NET fuori dall'ambiente MS non è esattamente la stessa pacchia, per quanto Mono stia effettivamente crescendo.
Lo stesso dicasi per Python, IronPython è un progetto relativamente giovane, ma tieni presente che (cmq non ci lavora nessuno è un po' grossa, siamo in 4-5 e non puoi tirare fuori una statistica in base a questo...se vai a vedere in giro, nei forum et similia lo si usa e non poco anche perchè CodePlex è una community meno pubblicizzata di SourgeForce ma che funziona) nella versione 2 c'è il supporto a Silverlight, insomma non male.

Il discorso cmq era partito dalla richiesta di fare un percorso didattico e sono state proposte due alternative.
Alla luce di quanto è stato scritto non mi sembra così fuori dal mondo sostituire C# a Python: posso disporre delle librerie C/C++, del framework NET (tanto + che IronPython è scritto a sua volta in C# quindi è perfettamente coerente con l'ambiente NET), insomma non mi sembra così malvagio.

Poi per carità si possono avere le proprie preferenze, io su queste non discuto ci mancherebbe.

fek
31-03-2008, 16:48
Il discorso cmq era partito dalla richiesta di fare un percorso didattico e sono state proposte due alternative.
Alla luce di quanto è stato scritto non mi sembra così fuori dal mondo sostituire C# a Python: posso disporre delle librerie C/C++, del framework NET (tanto + che IronPython è scritto a sua volta in C# quindi è perfettamente coerente con l'ambiente NET), insomma non mi sembra così malvagio.

A) Buongiorno io avrei bisogno di un buon cavatappi che cosa mi consigliate?

C) Un martello! Guarda mi ci trovo splendidamente a piantare chiodi ed ho sentito che qualcuno lo ha usato come cavatappi, quindi vai sul sicuro.

B) Veramente a lui serve cavare tappi non piantare chiodi.

C) Un martello va benissimo anche per cavare tappi! Guarda come e' semplice piantarci un chiodo... pam pam e il chiodo va dentro... Comodissimo!

B) Pero' credo che un cavatappi sia meglio.

D) Io ho provato a cavare un tappo con un martello e mi sono fatto male.

C) No no ti assicuro il martello e' perfetto, adesso ti faccio vedere come ci cavo un tappo, guarda... Io lo trovo molto piu' semplice di un cavatappi e poi c'e' cosi' tanta gente che lo usa per piantarci i chodi e vuoi che non sia facile usarlo per i tappi?

E cosi' avanti per venti pagine... Qui qualcuno ha perso di vista il concetto "Lo strumento giusto per il problema da risolvere".

cdimauro
31-03-2008, 16:53
http://blogs.ugidotnet.org/Franny/archive/2007/11/27/89972.aspx :asd:

fek
31-03-2008, 16:59
A) Salve dovrei scrivere un driver in ring0 che mi consigliate?

C) USA PYTHON!!!!!!!111

A) Salve dovrei scrivere l'engine 3d di un gioco per PS2 che mi consigliate?

C) USA PYTHOOOOOOOOOOOOOON!!!111

A) Salve dovrei scrivere un pixel shader che mi consigliate?

C) OVVIO PYTHOOOOOOOOOOOOOOOOOON!!!!!!!11

:asd:

cdimauro
31-03-2008, 17:00
http://www.hwupgrade.it/forum/showpost.php?p=21351633&postcount=10 :fiufiu:

fek
31-03-2008, 17:01
http://www.hwupgrade.it/forum/showpost.php?p=21351633&postcount=10 :fiufiu:

Hai niente per scriver pixel e vertex shader? :asd:

cdimauro
31-03-2008, 17:06
In tutta onestà qualche anno fa m'ero appassionato alla GPGPU e pensavo di scrivere qualche generatore di shader in Delphi, e poi in Python (ovviamente :asd:), ma poi ho perso interesse nella cosa (anche perché dovevo studiarmi per bene HLSL e mi scocciava non poco :asd:).

MasterDany
31-03-2008, 17:18
fek hai un pvt

fek
31-03-2008, 17:33
fek hai un pvt


Ti e' venuto il sospetto che mandarmi dieci pvt al giorno e creare venti utenti differenti con i quali trillare ogni cinque minuti mentre sono al lavoro non e' esattamente il modo migliore per farti rispondere?

MasterDany
31-03-2008, 17:35
scusa cionci ma è l'unico modo:
leggi bene enll'ot che ci sta scritto poi riposta..leggi la frase:

quando hai....

MasterDany
31-03-2008, 17:38
mo cionci mi banna:
fek per favore leggi bene...te lo cjhiedo per favore...anche solo due secondi

^TiGeRShArK^
31-03-2008, 17:44
http://blogs.ugidotnet.org/Franny/archive/2007/11/27/89972.aspx :asd:
pure io ho subito pensato a quella :asd:
..ma ce l'hai nei bookmarks? :rotfl:

^TiGeRShArK^
31-03-2008, 17:46
Hai niente per scriver pixel e vertex shader? :asd:
io ho un gattone che è braviffffffimo... :fagiano:
però li scrive rigorosamente in Mouse (http://en.wikipedia.org/wiki/Mouse_(programming_language)) :O

:asd:

cdimauro
31-03-2008, 17:46
pure io ho subito pensato a quella :asd:
..ma ce l'hai nei bookmarks? :rotfl:
Ho solo il link al blog di Fran: arrivarci poi è un colpo, anche perché certe perle sono indimenticabili. :p

^TiGeRShArK^
31-03-2008, 17:48
mo cionci mi banna:
fek per favore leggi bene...te lo cjhiedo per favore...anche solo due secondi
:mbe:
:uh:

MasterDany
31-03-2008, 17:50
:cry: :cry: :cry:

adesso cionci :banned:

per favore fek

gugoXX
31-03-2008, 17:52
Alla luce di quanto è stato scritto non mi sembra così fuori dal mondo sostituire C# a Python: posso disporre delle librerie C/C++, del framework NET (tanto + che IronPython è scritto a sua volta in C# quindi è perfettamente coerente con l'ambiente NET), insomma non mi sembra così malvagio.

Ma e' la stessa cosa che dico io.
Usate Python, usate C#, usate quello che volete.
Pero' non dite ai Niubbi che Python e' 10 volte piu' veloce a scriversi e 10 volte meglio del C#, perche' questo e' opinabile, e secondo me non e' vero.
La mia critica era solo per il fattore 10.

E sul dynamic typing, del quale non sono per nulla un fan.
Sto cercando addirittura di eliminare le stored procedure in azienda.
E anche il javascript.
Basta, non ne posso piu' di spendere ore-uomo a debuggare problemi che potrebbero essere tirati fuori dal sistema prima di essere usato (compilazione).
E non parlatemi di test. Siamo pieni di test.
Ma in Javascript bisognerebbe testare tutto, tutto.
E nel passaggio alle chiamate alle Stored Procedure dei database pure.
E in Python forse non tutto, ma molto di piu' del C#.

In C# almeno se riesco a chiamare una funzione che accetta un intero, sono sicuro che a runtime la variabile esistera', e che non sara' NULL.
In javascript devo spendere ore per mettere tutti sti controlli.
Ore a debuggare o ore a mettere controlli, scegli come vuoi passare il tempo.

cionci
31-03-2008, 18:50
Tipo quali?
Se magari ti prendevi la briga di leggere le ultime pagine le trovavi.
Meglio informarsi prima e poi discuterne no?
Credi che mi sia messo a discutere su Python senza averlo osservato bene ? Dire studiato, certo sarebbe dire troppo. E' altresì chiaro che non posso saperne quanto uno che ci lavora tutti i giorni.
Poi vedi tu, non puoi pretendere però che a certe persone non dia fastidio un atteggiamento simile.
Anche te non puoi pretendere che non dia fastidio vedere consigliare sempre lo stesso strumento, a ripetizione.
E da un mod magari magari mi aspetterei dell'altro, pur fatti patti saldi che il "de gustibus..." vale per tutti, mod compresi.
Guarda che io sono intervenuto proprio perché vedevo questa tiritera che si ripeteva ogni volta che si chiedeva quale linguaggio usare e per qualsiasi esigenza si rispondeva Python. Mi sembrava appunto una politica di evangelizzazione che sinceramente non mi va bene in sezione. Ora abbiamo appurato che Cesare ci crede davvero, anche tu ci credi. Puoi permettere che io non ci creda ? Oppure ti provoca fastidio ?

cionci
31-03-2008, 18:56
Il discorso cmq era partito dalla richiesta di fare un percorso didattico e sono state proposte due alternative.

No, il discorso è partito da voglio fare un programma che legge il CPUID, la frequenza della CPU, la frequenza di bus e le temperature.
Quindi richiesta mirata e non generica.
E cosi' avanti per venti pagine... Qui qualcuno ha perso di vista il concetto "Lo strumento giusto per il problema da risolvere".
Sinceramente...cosa avresti consigliato ?

fek
31-03-2008, 19:51
No, il discorso è partito da voglio fare un programma che legge il CPUID, la frequenza della CPU, la frequenza di bus e le temperature.
Quindi richiesta mirata e non generica.

Sinceramente...cosa avresti consigliato ?

C# + C++/CLI

dupa
31-03-2008, 20:15
Eh. Purtroppo mi sa che al giorno d'oggi vengono fuori 3 righe di codice.

Confrontare il C# e il Python (o altri, ce ne sono tanti e tutti equivalenti) per decidere cosa usare per imparare a programmare secondo me e' una stortura.

Ma per Mazda sarebbe, secondo me, utile affrontare questo problema in modo classico. Con le Input (o scanf che dir si voglia), gli array, i cicli, etc.
Cosi' impara a programmare.
Il QBasic e' carino perche' puo' anche tralasciare lo studio dell'IDE, di compilatori, di linker, di runtime, Virtual Machine o altro.
Schiaccia un pulsante e gli viene fuori un exe
Ne schiaccia un altro e fa il debug.
80 colonne, pochi menu' per sbagliarsi (Se aprissi visualStudio 2008 oggi per la prima volta mi spaventerei e forse lascerei perdere tutto)

finalmente qualcuno che la pensa (quasi) come me.
si impara a programmare partendo da qui:

http://www.b0sh.net/wp-content/uploads/2007/11/main.gif

gugoXX
31-03-2008, 20:41
finalmente qualcuno che la pensa (quasi) come me.
si impara a programmare partendo da qui:

http://www.b0sh.net/wp-content/uploads/2007/11/main.gif


Be, forse il C non lo consiglierei per imparare (forse non lo consiglierei piu'), ma sicuramente da qualcosa di semplice senza troppi tecnicismi di linguaggio ne' di IDE.
Qualcosa che permetta di contare da 1 a 100 in fretta, stampando su schermo.
Va benissimo il Python, ma altrettanto bene tanti altri.
Ancora meglio andrebbe secondo me un bel Commodore Vic20, con 5K di RAM.
Accendi e sei subito pronto per scrivere in Basic. Non puoi fare nient'altro.

^TiGeRShArK^
31-03-2008, 20:42
finalmente qualcuno che la pensa (quasi) come me.
si impara a programmare partendo da qui:

http://www.b0sh.net/wp-content/uploads/2007/11/main.gif

:rotfl:
e fu la fine :asd:

peccato che n + 1 persone ti hanno detto n! volte di essere partite da lì e di aver bestemmiato in aramaico per passare alla programmazione ad oggetti VERA dovendo estirpare a forza dalla mente la programmazione procedurale :asd:

fek
31-03-2008, 21:07
finalmente qualcuno che la pensa (quasi) come me.
si impara a programmare partendo da qui:

Eccolo qui.
E' la gara a chi evangelizza il suo linguaggio del cuore, possibilmente senza leggere le decine di volte nelle quali e' stato contraddetto.

cdimauro
31-03-2008, 21:09
Sto cercando addirittura di eliminare le stored procedure in azienda.
E anche il javascript.
Basta, non ne posso piu' di spendere ore-uomo a debuggare problemi che potrebbero essere tirati fuori dal sistema prima di essere usato (compilazione).
E non parlatemi di test. Siamo pieni di test.
Ma in Javascript bisognerebbe testare tutto, tutto.
E nel passaggio alle chiamate alle Stored Procedure dei database pure.
E in Python forse non tutto, ma molto di piu' del C#.
Alt! Fermiamoci un attimo: spiegami perché non bisognerebbe usare le Stored Procedure. Solo perché si devono testare? E' normale: il codice VA testato, perché nessuno qui mi pare abbia la patente per tirare fuori codice con zero bug.

L'alternativa alle SP è scrivere lo stesso codice all'esterno del db, e quindi interrogandolo continuamente facendo transitare sulla rete TONNELLATE di dati che per lo più verranno SCARTATI perché filtrati in qualche modo dalla business logic.

Insomma, quelle porcate immani di script PHP (o ASP.NET) che fanno collassare i db a causa delle MIRIADI di select (in primis).
E qui hwupgrade ne sa qualcosa mi pare, visto l'enorme stress che hanno i server per gestire soltanto i forum...

Le SP sono una CONQUISTA a cui NON SI PUO' RINUNCIARE, per giunta proprio adesso che blasonati engine come MySQL si sono finalmente degnati di mettere a disposizione dopo che per DECENNI altri engine l'hanno fatto rendendo molto più facile la vita ai programmatori e ai manteiner del db.

In C# almeno se riesco a chiamare una funzione che accetta un intero, sono sicuro che a runtime la variabile esistera', e che non sara' NULL.
In javascript devo spendere ore per mettere tutti sti controlli.
Ore a debuggare o ore a mettere controlli, scegli come vuoi passare il tempo.
Debugger? Vade retro! :D

Test Driven Development.

I test servono e sono molto importanti. Siamo pieni di test? Io penso che siamo troppo carenti di test. Se siamo pieni di test e ci lamentiamo, per me vuol dire soltanto una cosa: I TEST SONO FATTI MALE.

Perché una unit-test fatta come fek, ehm, come dio comanda :D permette di dormire sonni tranquilli e lavorare al codice senza avere il terrore che qualcosa salti nel pezzo di codice X soltanto perché s'è cambiato il pezzo di codice Y.

Non dico che coi test si risolvano tutti i problemi: sarei un idiota se sostenessi una cosa del genere. Ma certamente un test ben fatto mette una buona ipoteca alla solidità del codice.

Ad esempio i problemi che hai sulle variabili NULL con JavaScript (ma anche con Python ci sono problematiche simili, eh! E Fran ne sa qualcosa, purtroppo :stordita:), sarebbero facilmente risolvibili.
Ti dirò di più: il problema di utilizzare variabili mai inizializzate con Python penso sia risolvibile con dei test che controllino ogni "biforcazione" del codice, che se ci pensi bene è la condizione minimale per testare del codice ("biforcazione" -> il codice segue due strade -> servono due test quanto meno per verificare ognuno dei rami -> se il test controlla ognuno dei rami, se ci sarà l'uso di qualche variabile non inizializzata verrà rilevato a causa dell'eccezione sollevata).

Da qualche tempo nella cartella di ogni progetto a cui lavoro ne è spuntata un'altra chiamata "Test" in cui infilo le varie unit test che sto realizzando.
Non è molto, ma man mano che ho qualche briciola di tempo mi sto organizzando per creare un ambiente simile a quello di Diamonds, con la batteria di test che si può lanciare in qualunque momento e che controlla in automatico tutti i test disponibili.
E' l'obiettivo che mi sono posto, e che devo cercare di raggiungere per migliorare la qualità del mio lavoro, ma soprattutto della mia vita.

Tra l'altro in questi giorni m'è venuta un'ideuzza su come realizzare dei test-case in Python lasciandoli dentro il codice, e devo fare qualche prova per vedere se effettivamente può aprire la strada per semplificare questo processo. :cool:
Anche te non puoi pretendere che non dia fastidio vedere consigliare sempre lo stesso strumento, a ripetizione.

Guarda che io sono intervenuto proprio perché vedevo questa tiritera che si ripeteva ogni volta che si chiedeva quale linguaggio usare e per qualsiasi esigenza si rispondeva Python. Mi sembrava appunto una politica di evangelizzazione che sinceramente non mi va bene in sezione. Ora abbiamo appurato che Cesare ci crede davvero, anche tu ci credi. Puoi permettere che io non ci creda ? Oppure ti provoca fastidio ?
Non ho mai mancato di fornire argomentazioni, e non sono andato OT. Ma ne parlo meglio dopo.
No, il discorso è partito da voglio fare un programma che legge il CPUID, la frequenza della CPU, la frequenza di bus e le temperature.
Quindi richiesta mirata e non generica.
Appunto. E ho fornito anche una soluzione parziale, ma funzionante, che dimostra che il problema è facilmente risolvibile anche con Python.

Se la mia fosse una politica di evangelizzazione fine a se stessa non avrei speso ORE E ORE del mio tempo ad argomentare, fornire spiegazioni, consigli, e anche codice bello e pronto. Avrei detto: "usa Python che è il più fico", e la cosa sarebbe finita lì.

Siccome non mi considero né un troll né un fanatico integralista, non ho mancato di disquisire e di confrontarmi, e anche di ammettere di aver commesso un errore quando è capitato.
finalmente qualcuno che la pensa (quasi) come me.
si impara a programmare partendo da qui:

http://www.b0sh.net/wp-content/uploads/2007/11/main.gif
Guarda, sul C da usare per imparare a programmare troverai persino Fran ben disposto a piantarti con sommo piacere i chiodi da 20 per attaccarti alla croce... :asd:
Be, forse il C non lo consiglierei per imparare (forse non lo consiglierei piu'), ma sicuramente da qualcosa di semplice senza troppi tecnicismi di linguaggio ne' di IDE.
Qualcosa che permetta di contare da 1 a 100 in fretta, stampando su schermo.
Va benissimo il Python, ma altrettanto bene tanti altri.
for i in range(1, 101): print i
:fiufiu:
Ancora meglio andrebbe secondo me un bel Commodore Vic20, con 5K di RAM.
Accendi e sei subito pronto per scrivere in Basic. Non puoi fare nient'altro.
GLOM. Lo ricordo fin troppo bene: BASIC di Commodore Vic 20 & 64 = SPAGHETTI BASIC!!! No, grazie. :(

Con Python hai già una shell interattiva che è comodissima per smanettare e pacioccare liberamente col codice. Ottima per imparare, ma anche per il lavoro di tutti i giorni per provare velocemente pezzi di codice senza necessariamente lanciare un'applicazione. Impagabile. :)
EDIT:
Eccolo qui.
E' la gara a chi evangelizza il suo linguaggio del cuore, possibilmente senza leggere le decine di volte nelle quali e' stato contraddetto.
C.V.D. :p

gugoXX
31-03-2008, 21:43
Alt! Fermiamoci un attimo: spiegami perché non bisognerebbe usare le Stored Procedure. Solo perché si devono testare? E' normale: il codice VA testato, perché nessuno qui mi pare abbia la patente per tirare fuori codice con zero bug.

L'alternativa alle SP è scrivere lo stesso codice all'esterno del db, e quindi interrogandolo continuamente facendo transitare sulla rete TONNELLATE di dati che per lo più verranno SCARTATI perché filtrati in qualche modo dalla business logic.

Insomma, quelle porcate immani di script PHP (o ASP.NET) che fanno collassare i db a causa delle MIRIADI di select (in primis).
E qui hwupgrade ne sa qualcosa mi pare, visto l'enorme stress che hanno i server per gestire soltanto i forum...

Le SP sono una CONQUISTA a cui NON SI PUO' RINUNCIARE, per giunta proprio adesso che blasonati engine come MySQL si sono finalmente degnati di mettere a disposizione dopo che per DECENNI altri engine l'hanno fatto rendendo molto più facile la vita ai programmatori e ai manteiner del db.


Non ho mai detto di rinunciare alle stored procedure.
Solo non vorrei vederle scritte nel linguaggio proprietario del DB di turno, che peraltro e' praticamente sempre un procedurale che puzza di vecchio (Con i controsensi che sto intuendo proprio in questo periodo dell'avere un linguaggio procedurale per gestire i dati strutturati di un DB)
E infatti sia in Oracle che in SqlServer (che sono tra i migliori, potete dire cosa volete), si possono scrivere StoredProcedure in Java nel primo, e in C# nel secondo.
Codice C# compilato, richiamabile dal C# di altri parti, debuggabile e testabile senza troppi problemi e con le possibilita' che permette tale linguaggio.
Sono pezzi di codice che vanno comunque a finire dentro il DB, ma scritti in un linguaggio che e' ben diverso dal PL/SQL o dal T-SQL.
Tutto all'interno della stessa soluzione, in progetti diversi, tanto che non ti sembra neppure di avere delle stored procedure.
E non ti sembra neppure di avere un database, dato che anche la definizione delle tabelle e delle viste si puo' fare "disegnando" un diagramma E-R, sempre in un opportuno modulo della soluzione.
Con la possibilita' non indifferente di usare, senza troppi salti mortali, i vari prodotti di SourceSafe, SubVersion & C.

E comunque non sarebbe neppure vero che il programmare in C# e basta genererebbe tanto traffico di rete.
Prima si', era facile cadere nella trappola. Ora con il LINQ non sarebbe piu' cosi' tanto vero, e lo sto sperimentando proprio in questi giorni.
Il motore LINQ genera al volo le istruzioni SQL da sottomettere al database, sono progettate per essere funzionali, e l'istruzione SQL viene generata tutta insieme e sottomessa al database senza dover scartare nulla, se l'ho sfruttata bene.


Debugger? Vade retro! :D

Test Driven Development.

I test servono e sono molto importanti. Siamo pieni di test? Io penso che siamo troppo carenti di test. Se siamo pieni di test e ci lamentiamo, per me vuol dire soltanto una cosa: I TEST SONO FATTI MALE.

Ad esempio i problemi che hai sulle variabili NULL con JavaScript (ma anche con Python ci sono problematiche simili, eh! E Fran ne sa qualcosa, purtroppo :stordita:), sarebbero facilmente risolvibili.


Ma sono d'accordo.
Sono stato tra i primi nell'azienda dove lavoravo prima a sfruttare il test driven development.
Pero' quello che appunto e' che se il linguaggio mi permette di fare meno test, tanto di guadagnato.
Ripeto, un test fatto bene in javascript dovrebbe controllare, per ciascuna funzione, la validita' di tutti i parametri.
E sono chili di codice di test che qualcuno deve scrivere, e che in C# non dovrebbe fare.
Se vado a leggere i test che sono stati fatti sul progetto in cui sto lavorando ora, sono tutti test che servono per coprire problemi a runtime, tipo valori inseriti o derivati dagli utenti o simili.
Se il linguaggio mi permette di avere meno errori a runtime, meno test dovro' scrivere.
Idem per le biforcazioni che suggerisci. E comunque il test dovrebbe essere scritto prima e a prescindere dalla implementazione dello sviluppatore, e idealmente da una persona diversa. Non dovresti sapere quali biforcazioni far fare ai test, dovrebbe essere tutto astratto.


Da qualche tempo nella cartella di ogni progetto a cui lavoro ne è spuntata un'altra chiamata "Test" ...
E' l'obiettivo che mi sono posto
E fai benissimo. In azienda da noi si usa uno stile di programmazione che si chiama Extreme Programming, uno dei cui pilastri e' proprio il test driven development.
Per come ci e' stato insegnato nei corsi iniziali, dopo la debita progettazione da parte degli architetti, i quali preparano anche i principali moduli da riempire, parte anche la QA. La QA e' il gruppo che si occupera' alla fine di ogni step, della Quality Assurance, ovvero in pratica a cercare i bachi.
Ma all'inzio di ogni step, intanto che non ha nulla da testare, dovrebbe (e dico dovrebbe perche' onestamente non lo fa quasi mai) scrivere i test per i vari moduli, indipendentemente dagli sviluppatori.
I quali aggiungeranno ovviamente i loro test, ma il concetto e' chiaro.


for i in range(1, 101): print i
:fiufiu:



for (int u=0;u<100;u++)
Console.WriteLine(u);

Enumerable.Range(1,100).ForEach( t => Console.Writeline(t) );


Secondo me cosi' non si impara a programmare.
Troppe cose insieme, non sai cosa fa veramente la macchina.
Non mi sembra che risolvano il cocetto mentale di algoritmo.

A me sembra servirebbe di piu' partire proprio con
- il concetto di variabile
- di assegnazione di valori ad una variabile
- di if.then.else
- di goto

Poi posso sbagliare, non sono un professore.

DioBrando
31-03-2008, 21:48
Ma e' la stessa cosa che dico io.
Usate Python, usate C#, usate quello che volete.
Pero' non dite ai Niubbi che Python e' 10 volte piu' veloce a scriversi e 10 volte meglio del C#, perche' questo e' opinabile, e secondo me non e' vero.
La mia critica era solo per il fattore 10.

La parte a cui ti avevo risposto è quella che hai scelto di non quotare.
Te la ribadisco: Cesare ha scritto fattore 10 ammettendo poi però di aver esagerato non conoscendo in ogni caso granchè bene C#.
Fin qui ci siamo?


E sul dynamic typing, del quale non sono per nulla un fan.
Sto cercando addirittura di eliminare le stored procedure in azienda.
E anche il javascript.
Basta, non ne posso piu' di spendere ore-uomo a debuggare problemi che potrebbero essere tirati fuori dal sistema prima di essere usato (compilazione).
E non parlatemi di test. Siamo pieni di test.
Ma in Javascript bisognerebbe testare tutto, tutto.
E nel passaggio alle chiamate alle Stored Procedure dei database pure.
E in Python forse non tutto, ma molto di piu' del C#.

In C# almeno se riesco a chiamare una funzione che accetta un intero, sono sicuro che a runtime la variabile esistera', e che non sara' NULL.
In javascript devo spendere ore per mettere tutti sti controlli.
Ore a debuggare o ore a mettere controlli, scegli come vuoi passare il tempo.

Al di là del discorso sui test, premesso che i linguaggi dinamicamente tipati mi piacciono, la comparazione con Javascript è un po' debole, nel senso che lì i problemi sono tanti e derivano oltre che dal design anche dalle scelte burocratiche.
Di fatto gli sviluppatori web sono in balia di standard-nonstandard, di implementazioni che dipendono poi a monte dalle SWHouse che rilasciano i browser e se vuoi anche dalla libertà dell'utente (perchè nel momento in cui javascript è disabilitato, puoi spesso e volentieri dire addio alla tua bella webapp AJAX...ecco perchè predico a lavoro siti accessibili, fintantochè posso).
Ci sono framework, ci sono tentativi di darci un linguaggio di scripting client-side che sia un minimo + coerente e omogeneo ma nzomma...la strada è lunga al di là dei proclami MS-Mozilla.

gugoXX
31-03-2008, 22:01
La parte a cui ti avevo risposto è quella che hai scelto di non quotare.
Te la ribadisco: Cesare ha scritto fattore 10 ammettendo poi però di aver esagerato non conoscendo in ogni caso granchè bene C#.
Fin qui ci siamo?

Si', ok, ho capito che forse ho travisato io e me ne scuso.
Quello su cui infatti stavo dibattendo prima con lui non era sul fattore 10 o 2.
Volevo far passare che secondo me non c'e' proprio alcun fattore, e sulla velocita' di sviluppo sono tanto uguali.
P.Es. Mi e' sembrato a tratti di intuire che non si conoscesse la versione Funzionale del C#, e che fosse usata come vessillo per muovere il consenso verso Python.

Poi ripeto, per me quello che fa di piu' e' la libreria.
Non servira' a nulla, ma in 8 righe di codice posso far dire "Good Morning Vietnam", posso leggere la temperatura della CPU e intanto (E' asincrono :D) suonare in streaming una WebRadio.
Sono tutti giochini che servono a poco, ma mi sembra che 9 interventi su 10 su questo forum siano proprio per questi giochini.
E che magari si potranno anche fare in IronPython, ma mi sembra di aver capito che qui nessuno possa aiutare in questa direzione.

PS: L'ho scaricato IronPython. Ma ho delle domande da fare... :cry:

cdimauro
31-03-2008, 22:02
Non ho mai detto di rinunciare alle stored procedure.
Solo non vorrei vederle scritte nel linguaggio proprietario del DB di turno, che peraltro e' praticamente sempre un procedurale che puzza di vecchio (Con i controsensi che sto intuendo proprio in questo periodo dell'avere un linguaggio procedurale per gestire i dati strutturati di un DB)
E infatti sia in Oracle che in SqlServer (che sono tra i migliori, potete dire cosa volete), si possono scrivere StoredProcedure in Java nel primo, e in C# nel secondo.
Codice C# compilato, richiamabile dal C# di altri parti, debuggabile e testabile senza troppi problemi e con le possibilita' che permette tale linguaggio.
Sono pezzi di codice che vanno comunque a finire dentro il DB, ma scritti in un linguaggio che e' ben diverso dal PL/SQL o dal T-SQL.
Tutto all'interno della stessa soluzione, in progetti diversi, tanto che non ti sembra neppure di avere delle stored procedure.
E non ti sembra neppure di avere un database, dato che anche la definizione delle tabelle e delle viste si puo' fare "disegnando" un diagramma E-R, sempre in un opportuno modulo della soluzione.
Con la possibilita' non indifferente di usare, senza troppi salti mortali, i vari prodotti di SourceSafe, SubVersion & C.
Adesso il discorso cambia completamente e sono d'accordo. Tra l'altro è proprio l'orientamento degli engine SQL quello di integrare il supporto ai linguaggi di programmazione tradizionali.
E comunque non sarebbe neppure vero che il programmare in C# e basta genererebbe tanto traffico di rete.
Prima si', era facile cadere nella trappola. Ora con il LINQ non sarebbe piu' cosi' tanto vero, e lo sto sperimentando proprio in questi giorni.
Il motore LINQ genera al volo le istruzioni SQL da sottomettere al database, sono progettate per essere funzionali, e l'istruzione SQL viene generata tutta insieme e sottomessa al database senza dover scartare nulla, se l'ho sfruttata bene.
Non penso risolva pienamente il problema.

In una SP capita, ad esempio, di eseguire un ciclo su un certo numero n di record per poi lavorarci, scartarne alcuni e infine tornare soltanto gli m <= n i dati che servono.

Delegando all'esterno le operazioni, in ogni caso i dati degli n record dovranno essere prelevati dall'applicazione, elaborarli, e poi si dovranno eseguire eventuali altre m <= n query per recuperare le informazioni finali.

C'è un passaggio di dati inutile fra client e server: con le SP il primo riceve soltanto i dati che gli servono.

Non so se sono stato chiaro.
Ma sono d'accordo.
Sono stato tra i primi nell'azienda dove lavoravo prima a sfruttare il test driven development.
Pero' quello che appunto e' che se il linguaggio mi permette di fare meno test, tanto di guadagnato.
Ripeto, un test fatto bene in javascript dovrebbe controllare, per ciascuna funzione, la validita' di tutti i parametri.
E sono chili di codice di test che qualcuno deve scrivere, e che in C# non dovrebbe fare.
Se vado a leggere i test che sono stati fatti sul progetto in cui sto lavorando ora, sono tutti test che servono per coprire problemi a runtime, tipo valori inseriti o derivati dagli utenti o simili.
Se il linguaggio mi permette di avere meno errori a runtime, meno test dovro' scrivere.
Idem per le biforcazioni che suggerisci. E comunque il test dovrebbe essere scritto prima e a prescindere dalla implementazione dello sviluppatore, e idealmente da una persona diversa. Non dovresti sapere quali biforcazioni far fare ai test, dovrebbe essere tutto astratto.

E fai benissimo. In azienda da noi si usa uno stile di programmazione che si chiama Extreme Programming, uno dei cui pilastri e' proprio il test driven development.
Per come ci e' stato insegnato nei corsi iniziali, dopo la debita progettazione da parte degli architetti, i quali preparano anche i principali moduli da riempire, parte anche la QA. La QA e' il gruppo che si occupera' alla fine di ogni step, della Quality Assurance, ovvero in pratica a cercare i bachi.
Ma all'inzio di ogni step, intanto che non ha nulla da testare, dovrebbe (e dico dovrebbe perche' onestamente non lo fa quasi mai) scrivere i test per i vari moduli, indipendentemente dagli sviluppatori.
I quali aggiungeranno ovviamente i loro test, ma il concetto e' chiaro.
Mumble. Con la TDD ho imparato che prima si scrivono i test, e poi il codice (che, all'inizio, deve far fallire il test per indicare la condizione d'errore -> il requisito non soddisfatto oppure il bug che viene "esercitato").

Il codice non va progettato in maniera tradizionale: viene costruito in maniera evolutiva in base anche alle condizioni che, e lo sappiamo benissimo, cambiano col tempo.

Ecco qui http://martinfowler.com/articles/designDead.html un ECCELLENTE articolo sull'argomento. E' lunghetto, ma ne vale la pena. :)

for (int u=0;u<100;u++)
Console.WriteLine(u);

Enumerable.Range(1,100).ForEach( t => Console.Writeline(t) );


Secondo me cosi' non si impara a programmare.
Troppe cose insieme, non sai cosa fa veramente la macchina.
Non mi sembra che risolvano il cocetto mentale di algoritmo.
Non c'è alcun bisogno di conoscere cosa fa "veramente" la macchina per imparare a programmare: i programmatori devono risolvere problemi, non studiarsi le architetture su cui girano le applicazioni (che tra l'altro possono anche cambiare). ;)
A me sembra servirebbe di piu' partire proprio con
- il concetto di variabile
- di assegnazione di valori ad una variabile
- di if.then.else
- di goto

Poi posso sbagliare, non sono un professore.
Nooo. Ti prego, il goto nooooo!!! :cry:

IMHO bisogna partire dal concetto di dato, tipo di dato, operazione, condizione, e così via.

DioBrando
31-03-2008, 22:03
Se magari ti prendevi la briga di leggere le ultime pagine le trovavi.


Ah scusa no perchè io rispondo senza leggere quello che gli altri mi scrivono...naturalmente quoto anche a caso perchè non leggendo n posso fare altro.

I discorsi sugli IDE sono stati enucleati, accesso a framework NET, disponibilità di librerie C/C++ idem.
C'è altro? (e due)


Credi che mi sia messo a discutere su Python senza averlo osservato bene ? Dire studiato, certo sarebbe dire troppo. E' altresì chiaro che non posso saperne quanto uno che ci lavora tutti i giorni.


Non l'ho mai detto che non hai nemmeno dato un occhiata al codice che produce, ma permettimi che se spari nel mucchio dicendo che non è supportato dal framework NET oppure te ne esci non sapendo che in Python realmente tutto è un oggetto, non mi dai l'idea di saperne così tanto da poter confutare opinioni di chi ci ha lavorato dimostrando di essere produttivo + di prima quando usava evidentemente strumenti diversi.
Anche te non puoi pretendere che non dia fastidio vedere consigliare sempre lo stesso strumento, a ripetizione.


Guarda che io sono intervenuto proprio perché vedevo questa tiritera che si ripeteva ogni volta che si chiedeva quale linguaggio usare e per qualsiasi esigenza si rispondeva Python.

Ed io ti ribadisco che non è così, state esagerando.
Riprendete i thread in cui sono intervenuto io o Cesare e leggete


Mi sembrava appunto una politica di evangelizzazione che sinceramente non mi va bene in sezione.

A parte il fatto che il termine evangelizzazione mi sembra improprio (perchè in italiano ha una valenza religiosa che proprio per questo si basa su argomentazioni che non sono confutabili: o credi o non credi...quindi la traduzione dall'inglese "evangelist" non è corretta perchè ha una connotazione semantica totalmente diversa), ti ripeto che
1) sono stati dati tanti suggerimenti su richieste da parte di n utenti che non fossero solo "Python", ma strumenti che io o chi altri riteniamo fossero in quello specifico consigliabili.
Quindi mi fai la cortesia prima di ripetere per la decima volta "consigliate solo Python", di riprendere quei thread e guardarteli con attenzione.
Se non lo fai tu, lo faccio io e te li linko qui.
Basta che la si smetta con questa nenia, che è oltre che noiosa piuttosto offensiva (mi ritengo una persona un pelo pià intelligente di un automa che ripete quella e sempre quella).

2) i consigli sono sempre stati circostanziati, con argomentazioni che ovviamente possono essere criticabili e a cui si può obiettare con delle altre, ma sono ben lontano dal concetto di "evangelizzare"


Ora abbiamo appurato che Cesare ci crede davvero, anche tu ci credi.

Ma credo in cosa?
Stai cominciando ad irritarmi, dico davvero.
Anche perchè distorci fatti e parole a tuo uso e consumo.
Da una persona equilibrata oltre che super parte mi aspetto dell'altro e di meglio soprattutto.


Puoi permettere che io non ci creda ? Oppure ti provoca fastidio ?

Tu puoi credere o non credere in quello che ti pare.
Sono mai venuto a sindacare?
Non lo farei mai e visto che mi hai visto scrivere da qualche anno non serve che te lo spieghi.
Quello che mi dà fastidio è che primo si faccia di un'erba un fascio, secondo si parli a volte senza cognizione di causa.
Questo sì mi dà molto fastidio.

DioBrando
31-03-2008, 22:08
Si', ok, ho capito che forse ho travisato io e me ne scuso.
Quello su cui infatti stavo dibattendo prima con lui non era sul fattore 10 o 2.
Volevo far passare che secondo me non c'e' proprio alcun fattore, e sulla velocita' di sviluppo sono tanto uguali.
P.Es. Mi e' sembrato a tratti di intuire che non si conoscesse la versione Funzionale del C#, e che fosse usata come vessillo per muovere il consenso verso Python.

Poi ripeto, per me quello che fa di piu' e' la libreria.
Non servira' a nulla, ma in 8 righe di codice posso far dire "Good Morning Vietnam", posso leggere la temperatura della CPU e intanto (E' asincrono :D) suonare in streaming una WebRadio.
Sono tutti giochini che servono a poco, ma mi sembra che 9 interventi su 10 su questo forum siano proprio per questi giochini.
E che magari si potranno anche fare in IronPython, ma mi sembra di aver capito che qui nessuno possa aiutare in questa direzione.

PS: L'ho scaricato IronPython. Ma ho delle domande da fare... :cry:

Ok non c'è problema fraintendimento risolto :flower:

Io ci ho smanettato l'anno scorso scoprendolo alla conferenza, poi per motivi di tempo ecc. non ho approfondito e non è che mi ricordi moltissimo.
Boh puoi provare a chiedermi.
Mmm pvt? Vabbè che qui con gli OT...:D

gugoXX
31-03-2008, 22:10
Non penso risolva pienamente il problema.

In una SP capita, ad esempio, di eseguire un ciclo su un certo numero n di record per poi lavorarci, scartarne alcuni e infine tornare soltanto gli m <= n i dati che servono.

Delegando all'esterno le operazioni, in ogni caso i dati degli n record dovranno essere prelevati dall'applicazione, elaborarli, e poi si dovranno eseguire eventuali altre m <= n query per recuperare le informazioni finali.

C'è un passaggio di dati inutile fra client e server: con le SP il primo riceve soltanto i dati che gli servono.

Non so se sono stato chiaro.


Ho capito benissimo. Proprio in questo periodo sto cercando di capire il limite di questo approccio "puro".
Muovi pero' il LINQ sulle stored procedure del database scritte in C#. Una pacchia.

Nooo. Ti prego, il goto nooooo!!! :cry:

IMHO bisogna partire dal concetto di dato, tipo di dato, operazione, condizione, e così via.
E' il discorso - se lo conosci lo eviti -.
A parte gli scherzi mi sembra concettualmente corretto insegnare il goto.
E' insito anche nei flow-chart (ma si insegnano ancora?)
Per il resto sono d'accordo.

DioBrando
31-03-2008, 22:11
:rotfl:
e fu la fine :asd:

peccato che n + 1 persone ti hanno detto n! volte di essere partite da lì e di aver bestemmiato in aramaico per passare alla programmazione ad oggetti VERA dovendo estirpare a forza dalla mente la programmazione procedurale :asd:

Cmq il K&R per l'età che ha è stato pioneristico nell'impaginazione :O

Cerco di sorridere di fronte ai discorsi in loop che saltano puntualmente fuori :D

cdimauro
31-03-2008, 22:24
Ho capito benissimo. Proprio in questo periodo sto cercando di capire il limite di questo approccio "puro".
Muovi pero' il LINQ sulle stored procedure del database scritte in C#. Una pacchia.
Immagino, e lo vedrai sicuramente a breve. :)
E' il discorso - se lo conosci lo eviti -.
A parte gli scherzi mi sembra concettualmente corretto insegnare il goto.
E' insito anche nei flow-chart (ma si insegnano ancora?)
Per il resto sono d'accordo.
Li insegnano suppongo, ma dovrebbero anche insegnare un famosissimo (non per Torvalds :asd:) teorema che dimostra la possibilità di eliminare completamente il goto usando gli altri costrutti iterativi (eventualmente con l'aggiunta di opportune variabili booleane). :)

GOTO IS EVIL! :D

Tra l'altro esistono linguaggi come Python (ma anche Modula & derivati / successori) che NON hanno proprio il goto come istruzione. :p

P.S. Comunque la versione "funzionale" del C# la conosco fin da quando Fran mi passò, molto tempo fa, il link a un articolo che parlava della versione 3.0 del linguaggio che a breve sarebbe arrivata. ;)

fek
31-03-2008, 22:38
A parte il fatto che il termine evangelizzazione mi sembra improprio (perchè in italiano ha una valenza religiosa che proprio per questo si basa su argomentazioni che non sono confutabili: o credi o non credi...quindi la traduzione dall'inglese "evangelist" non è corretta perchè ha una connotazione semantica totalmente diversa), ti ripeto che

Anche a me sembra un tentativo di evangelizzazione e non nella terminologia inglese. Mi ricorda da vicinissimo l'evangelizzazione degli Apple fanatici :D

gugoXX
31-03-2008, 22:44
Io ci ho smanettato l'anno scorso scoprendolo alla conferenza, poi per motivi di tempo ecc. non ho approfondito e non è che mi ricordi moltissimo.
Boh puoi provare a chiedermi.
Mmm pvt? Vabbè che qui con gli OT...:D

E' molto banale quanto da vergognarsi.
Ho scaricato e installato (Anche se non mi sembra abbia installato nulla)
IronPython2.0
Mi aspettavo di avere una integrazione con Visual Studio, un po' come quando si installano i vari linguaggi come C++, VB.net, etc., con la loro bella macro-area e i loro "template" di progetto.
E invece mi e' comparsa solo la command line con
>>>

Ovviamente starei provando IronPython per l'integrazione con .net e tutte le altre facilities come i disegni delle Forms, l'integrazione in soluzioni con altri linguaggi, etc.etc
Anche perche' altrimenti mi sarei limitato a Python normale (CPython?)

C'e' quanto mi stavo aspettando e solo non l'ho trovato?

gugoXX
31-03-2008, 22:52
Immagino, e lo vedrai sicuramente a breve. :)


Dai, a proposito di evangelisti, se avete tempo guardatevi questo
http://www.microsoft.com/emea/msdn/spotlight/sessionh.aspx?videoid=716

Fra l'altro, tra gli italiani c'e' un nutrito gruppo che spinge sul LINQ
I principali autori dei libri e delle presentazioni su LINQ sono proprio italiani.
E questo ci fa onore direi.
A parte il fortissimo accento italiano della presentazione...

^TiGeRShArK^
31-03-2008, 23:38
E' molto banale quanto da vergognarsi.
Ho scaricato e installato (Anche se non mi sembra abbia installato nulla)
IronPython2.0
Mi aspettavo di avere una integrazione con Visual Studio, un po' come quando si installano i vari linguaggi come C++, VB.net, etc., con la loro bella macro-area e i loro "template" di progetto.
E invece mi e' comparsa solo la command line con
>>>

Ovviamente starei provando IronPython per l'integrazione con .net e tutte le altre facilities come i disegni delle Forms, l'integrazione in soluzioni con altri linguaggi, etc.etc
Anche perche' altrimenti mi sarei limitato a Python normale (CPython?)

C'e' quanto mi stavo aspettando e solo non l'ho trovato?
Cesare ti ha già risposto cmq preciso il primo punto.

Hai 3 modi per utilizzare VisualStudio:
1. usi IronPythonStudio come ha detto Cesare che è basato su IronPython e VS2008 Shell
2. usi il pacchetto IronPython per ASP.NET
3. usi extensibility program attraverso l'SDK di VS, integrando una versione preesistente dell'IDE Microsoft (però è richiesto come minimo VS2005 perchè Ironpython non funziona con versioni antecedenti al framework 2.0)

Nessuna delle 3 và ad intaccare in alcun modo versioni preinstallate di VS.

mi sa che nel marasma del thread ti sei perso questo post di diobrando e il messaggio precedente con il link ad ironpythonstudio fornito da cesare :asd:

cionci
01-04-2008, 02:17
Anche a me sembra un tentativo di evangelizzazione e non nella terminologia inglese. Mi ricorda da vicinissimo l'evangelizzazione degli Apple fanatici :D
Ma che dici...l'ho visto solo io :O E solo io ho visto consigliare un martello per svitare una vite ;)

cdimauro
01-04-2008, 07:28
Anche a me sembra un tentativo di evangelizzazione e non nella terminologia inglese. Mi ricorda da vicinissimo l'evangelizzazione degli Apple fanatici :D
:| Vabbé, e a quelli che consigliano C, C++ o addirittura l'assembly come gli chiamiamo? Matti da legare? -_-
Dai, a proposito di evangelisti, se avete tempo guardatevi questo
http://www.microsoft.com/emea/msdn/spotlight/sessionh.aspx?videoid=716

Fra l'altro, tra gli italiani c'e' un nutrito gruppo che spinge sul LINQ
I principali autori dei libri e delle presentazioni su LINQ sono proprio italiani.
E questo ci fa onore direi.
A parte il fortissimo accento italiano della presentazione...
http://blogs.ugidotnet.org/janky/Default.aspx :fiufiu:

Comunque installo SilverLight e vediamo che dice il link... :p
Ma che dici...l'ho visto solo io :O E solo io ho visto consigliare un martello per svitare una vite ;)
Riccardo, mi faresti vedere anche soltanto UNA volta in cui il concetto che hai esposto si applichi a me, cortesemente?

Così vediamo chi dei due parla più del dovuto... :rolleyes:

Tra l'altro Fran parla di "evangelizzazione", e questo, logica alla mano, non implica che si applichi necessariamente a chi consiglia di utilizzare un martello al posto di un cacciavite...

tomminno
01-04-2008, 09:00
Non ho mai detto di rinunciare alle stored procedure.
Solo non vorrei vederle scritte nel linguaggio proprietario del DB di turno, che peraltro e' praticamente sempre un procedurale che puzza di vecchio (Con i controsensi che sto intuendo proprio in questo periodo dell'avere un linguaggio procedurale per gestire i dati strutturati di un DB)
E infatti sia in Oracle che in SqlServer (che sono tra i migliori, potete dire cosa volete), si possono scrivere StoredProcedure in Java nel primo, e in C# nel secondo.


Eh?
Stored procedure da linguaggio?
Vorrai dire stored procedure temporanee, che sono di una lentezza impressionante (fare il count su una tabella con 20000 elementi impiega 250ms contro gli 0ms di una query diretta).


Codice C# compilato, richiamabile dal C# di altri parti, debuggabile e testabile senza troppi problemi e con le possibilita' che permette tale linguaggio.
Sono pezzi di codice che vanno comunque a finire dentro il DB, ma scritti in un linguaggio che e' ben diverso dal PL/SQL o dal T-SQL.


Potresti fornire dei riferimenti, non mi risulta che si possano scrivere e di conseguenza salvare su DB Stored Procedure (se non appunto SP temporanee) in C#.


E comunque non sarebbe neppure vero che il programmare in C# e basta genererebbe tanto traffico di rete.


Traffico di rete no, visto che transiterebbero gli stessi dati sia usando una interfaccia nativa sia ADO.NET o qualunque altro wrapper.


Prima si', era facile cadere nella trappola. Ora con il LINQ non sarebbe piu' cosi' tanto vero, e lo sto sperimentando proprio in questi giorni.
Il motore LINQ genera al volo le istruzioni SQL da sottomettere al database, sono progettate per essere funzionali, e l'istruzione SQL viene generata tutta insieme e sottomessa al database senza dover scartare nulla, se l'ho sfruttata bene.


Fatta prova con un server ad alto carico e LINQ rallenta notevolmente, rispetto allo stesso codice "vecchia maniera".
Per il momento è stato scartato.

cdimauro
01-04-2008, 09:15
Eh?
Stored procedure da linguaggio?
Vorrai dire stored procedure temporanee, che sono di una lentezza impressionante (fare il count su una tabella con 20000 elementi impiega 250ms contro gli 0ms di una query diretta).

Potresti fornire dei riferimenti, non mi risulta che si possano scrivere e di conseguenza salvare su DB Stored Procedure (se non appunto SP temporanee) in C#.
Forse si riferiva a roba come questa: http://www.postgresql.org/docs/8.3/static/plpython.html

In particolare, con Python: http://www.postgresql.org/docs/8.3/static/plpython-funcs.html

Sulla carta mi sembra che la soluzione dovrebbere abbastanza veloce, in quanto, se non ho capito male (correggetemi perché non ho letto tutto il documento e al momento non ho abbastanza tempo per farlo), il codice Python verrebbe eseguito all'interno del server.

EDIT: anche con FireBird l'adozione di linguaggi diversi da quello built-in è in discussione (e molto probabilmente verrà approvata). Ecco qui http://www.firebirdsql.org/index.php?op=devel&sub=engine&id=roadmap_2008

Release 2.5.0
External (e.g. Java) procedures (*)
(*) Under discussion, can be postponed

gugoXX
01-04-2008, 09:19
Eh?
Stored procedure da linguaggio?
Vorrai dire stored procedure temporanee, che sono di una lentezza impressionante (fare il count su una tabella con 20000 elementi impiega 250ms contro gli 0ms di una query diretta).



Potresti fornire dei riferimenti, non mi risulta che si possano scrivere e di conseguenza salvare su DB Stored Procedure (se non appunto SP temporanee) in C#.



Traffico di rete no, visto che transiterebbero gli stessi dati sia usando una interfaccia nativa sia ADO.NET o qualunque altro wrapper.



Fatta prova con un server ad alto carico e LINQ rallenta notevolmente, rispetto allo stesso codice "vecchia maniera".
Per il momento è stato scartato.


Non so cosa intendi per stored procedure temporanee.
Il metodo che conosco io per farlo si chiama CLR Stored Procedure.
E si possono usare anche per le function.
P.Es. nel mio database qui abbiamo fatto una CLR Stored Function per supplire alla mancanza della GROUP_CONCAT in Sql-Server.
Ovvero una funzione di gruppo che concatena le stringhe presenti nella stessa colonna, ma in righe diverse.

Prova a cercare riferimenti, ce ne sono parecchi in giro.
E prova ad immaginare quel codice scritto in LINQ, e non nel vecchio stile.

Sul LINQ to SQL sto facendo anche io parecchie prove, e sono partito proprio dal vedere cosa viene generato in SQL a seconda delle istruzioni sottomesse.
Sto cecando di capire i limiti e quale sarebbe lo stile giusto di programmazione per far fare all SQL proprio quello che si farebbe normalmente.
E se si fa particolare attenzione devo dire che non sto avendo affatto brutti risultati.

dupa
01-04-2008, 09:31
Non so cosa intendi per stored procedure temporanee.
Il metodo che conosco io per farlo si chiama CLR Stored Procedure.
E si possono usare anche per le function.
P.Es. nel mio database qui abbiamo fatto una CLR Stored Function per supplire alla mancanza della GROUP_CONCAT in Sql-Server.
Ovvero una funzione di gruppo che concatena le stringhe presenti nella stessa colonna, ma in righe diverse.

Prova a cercare riferimenti, ce ne sono parecchi in giro.
E prova ad immaginare quel codice scritto in LINQ, e non nel vecchio stile.

Sul LINQ to SQL sto facendo anche io parecchie prove, e sono partito proprio dal vedere cosa viene generato in SQL a seconda delle istruzioni sottomesse.
Sto cecando di capire i limiti e quale sarebbe lo stile giusto di programmazione per far fare all SQL proprio quello che si farebbe normalmente.
E se si fa particolare attenzione devo dire che non sto avendo affatto brutti risultati.

Ciao sembra interessante sto LINQ, tu hai mai usato Hibernate? sarei curioso di confrontare le due soluzioni, da Javista conosco solo Hibernate/JPA

cdimauro
01-04-2008, 09:33
Per .NET c'è NHibernate. ;)

dupa
01-04-2008, 09:36
Per .NET c'è NHibernate. ;)

sìsì lo so, sono un felice utilizzatore di Hibernate/Java, guardando su wikipedia ho visto che c'è una sorta di LINQ anche per Java, vorrei avere un'idea del confronto tra Hibernate vs LINQ (a occhio mi sa che microsoft ha scopiazzato dalla comunità java)

cdimauro
01-04-2008, 10:11
Dall'invenzione della ruota in poi l'uomo non ha mai smesso di copiare... ;)

dupa
01-04-2008, 10:15
Dall'invenzione della ruota in poi l'uomo non ha mai smesso di copiare... ;)

il problema è chi copia sempre, senza inventare mai :)

cdimauro
01-04-2008, 10:18
Si può copiare migliorando, che è già qualcosa (e fa parte della nostra evoluzione). :)

Comunque difficile trovare qualcuno che copia e basta. Magari tu ne conosci qualcuno, ma a me al momento non viene in mente nessuno. ;)

fek
01-04-2008, 10:23
il problema è chi copia sempre, senza inventare mai :)

Non dire fesserie :)
http://research.microsoft.com/

cdimauro
01-04-2008, 10:28
Perché sei intervenuto Fran? Avevo appena steso la tela per intrappolarlo... :cry:

dupa
01-04-2008, 10:35
Non dire fesserie :)
http://research.microsoft.com/


Be', avere ricercatori, non vuol dire produttore idee intelligenti e innovative.
Anzi, considerando le dimensioni di microsoft, direi che producono ben poche idee rispetto le potenzialità che hanno.

Mi citi 3 invenzioni di casa Microsoft che la concorrenza ha copiato?

fek
01-04-2008, 10:43
Anzi, considerando le dimensioni di microsoft, direi che producono ben poche idee rispetto le potenzialità che hanno.

Opinione tua per altro assolutamente non condivisibile. Sfogliati la pagina di research se sei interessato.
Se il tuo scopo e' trolleggiare invece dillo subito.


Mi citi 3 invenzioni di casa Microsoft che la concorrenza ha copiato?

Ok, il tuo scopo era trolleggiare.

DioBrando
01-04-2008, 10:52
Anche a me sembra un tentativo di evangelizzazione e non nella terminologia inglese. Mi ricorda da vicinissimo l'evangelizzazione degli Apple fanatici :D

pfui :oh:

non mi metto troppo contro solo perchè voglio fare anche io un'esperienza UK :flower: (profittatore mode on :asd: )


a parte gli scherzi, sapete bene che non è così.
Riprendete quei thread ;)

fek
01-04-2008, 10:54
pfui :oh:

non mi metto troppo contro solo perchè voglio fare anche io un'esperienza UK :flower: (profittatore mode on :asd: )

a parte gli scherzi, sapete bene che non è così.
Riprendete quei thread ;)

Allora ti insegno subito come ragionano qui in UK: perception is everything :asd:
Non importa com'e' o come non e', importa come viene percepito, e ti assicuro che venite percepiti al momento come evangelizzatori di un linguaggio ;)

Ho dovuto imparare questa lezioncina a mie spese e te la passo gratuitamente.

DioBrando
01-04-2008, 10:55
E' molto banale quanto da vergognarsi.
Ho scaricato e installato (Anche se non mi sembra abbia installato nulla)
IronPython2.0
Mi aspettavo di avere una integrazione con Visual Studio, un po' come quando si installano i vari linguaggi come C++, VB.net, etc., con la loro bella macro-area e i loro "template" di progetto.
E invece mi e' comparsa solo la command line con
>>>

Ovviamente starei provando IronPython per l'integrazione con .net e tutte le altre facilities come i disegni delle Forms, l'integrazione in soluzioni con altri linguaggi, etc.etc
Anche perche' altrimenti mi sarei limitato a Python normale (CPython?)

C'e' quanto mi stavo aspettando e solo non l'ho trovato?

Il secondo e il terzo metodo che ho postato credo facciano al caso tuo

cdimauro
01-04-2008, 10:55
Allora ti insegno subito come ragionano qui in UK: perception is everything :asd:
Non importa com'e' o come non e', importa come viene percepito, e ti assicuro che venite percepiti al momento come evangelizzatori di un linguaggio ;)

Ho dovuto imparare questa lezioncina a mie spese e te la passo gratuitamente.
Cosa proponi allora? :fiufiu:

DioBrando
01-04-2008, 10:56
Allora ti insegno subito come ragionano qui in UK: perception is everything :asd:
Non importa com'e' o come non e', importa come viene percepito, e ti assicuro che venite percepiti al momento come evangelizzatori di un linguaggio ;)

Ho dovuto imparare questa lezioncina a mie spese e te la passo gratuitamente.

Ma se ho consigliato più volte Java/C# insieme a Python per iniziare :cry:

DioBrando
01-04-2008, 10:57
Dai, a proposito di evangelisti, se avete tempo guardatevi questo
http://www.microsoft.com/emea/msdn/spotlight/sessionh.aspx?videoid=716

Fra l'altro, tra gli italiani c'e' un nutrito gruppo che spinge sul LINQ
I principali autori dei libri e delle presentazioni su LINQ sono proprio italiani.
E questo ci fa onore direi.
A parte il fortissimo accento italiano della presentazione...

Al roadshow hanno parlato proprio di LinQ e di framework 3.5.
Tutto molto interessante.
In ogni caso nella sezione Learning dentro MSDN, c'è una collezione di training video proprio dedicati a LinQ ;)

DioBrando
01-04-2008, 10:59
Ma che dici...l'ho visto solo io :O E solo io ho visto consigliare un martello per svitare una vite ;)

:blah:

al resto non rispondi, quindi dò per scontato che la cosa finisca qui.
Ma non voglio sentire appellativi "strani" in futuro, a meno che tu non sia in grado di dimostrare quello che dici.

DioBrando
01-04-2008, 11:03
Be', avere ricercatori, non vuol dire produttore idee intelligenti e innovative.
Anzi, considerando le dimensioni di microsoft, direi che producono ben poche idee rispetto le potenzialità che hanno.

Mi citi 3 invenzioni di casa Microsoft che la concorrenza ha copiato?

Visto che usi Java te ne cito 3, che la Sun ha deciso di implementare prendendo esempio dalla MS:

- generics
- assembly
- RMI

Ah AJAX che ora fa molto trendy è stato possibile grazie all'oggetto HTTPRequest, inventato nella seconda metà degli anni 90 sempre da MS.

fek
01-04-2008, 11:17
Post PreCog: "Eh ma M$ ha copiato Java per prima :mad:"

DioBrando
01-04-2008, 11:27
Post PreCog: "Eh ma M$ ha copiato Java per prima :mad:"

M$ ha copiato C# da Java e Winzozz Svista da MacOSX (tipo la TimeMachine :asd: ) e Linux.
Abbasso Microshit. :D



Bill sto scherzando :flower: (non vorrei precludermi un futuro lì :D)

cdimauro
01-04-2008, 11:32
Ricordo ancora le grasse risate che mi sono fatto quando Apple per OS X ha copiato il Fast User Switch da Windows XP.

Commento dei trollintosh: "ma in OS X è più fluido e l'effetto è più bello". :asd:

fek
01-04-2008, 11:38
M$ ha copiato C# da Java e Winzozz Svista da MacOSX (tipo la TimeMachine :asd: ) e Linux.
Abbasso Microshit. :D



Bill sto scherzando :flower: (non vorrei precludermi un futuro lì :D)


"Pronto, Steve? Sono Fran, si' quello che fa i giochini, ti ricordi il tipo del quale ti parlavo? DioBrando, si', quello. Sta facendo il troll anti-ms su un forum italiano, straccia il suo CV. Ah, lo usavi gia' come carta igienica, allora nulla. Ossequi. Bacia le mani. Saluti alla mamma. Bella la camicia nuova antisudore, ti smagrisce."

DioBrando
01-04-2008, 11:38
Ricordo ancora le grasse risate che mi sono fatto quando Apple per OS X ha copiato il Fast User Switch da Windows XP.

Commento dei trollintosh: "ma in OS X è più fluido e l'effetto è più bello". :asd:

faccio presente a chi ci dà degli evangelizzatori pseudotroll che Tigershark ha comprato un MecbucPro e che usa MacOSX dalla mattina alla sera. :O


Ciao Danilo :asd:

fek
01-04-2008, 11:41
faccio presente a chi ci dà degli evangelizzatori pseudotroll che Tigershark ha comprato un MecbucPro e che usa MacOSX dalla mattina alla sera. :O


Ciao Danilo :asd:

Voglio un Macbuceir, da quando l'ho visto non posso vivere senza :(
Ma prima devo comprarmi la D300. *click* *click*

DioBrando
01-04-2008, 11:42
"Pronto, Steve? Sono Fran, si' quello che fa i giochini, ti ricordi il tipo del quale ti parlavo? DioBrando, si', quello. Sta facendo il troll anti-ms su un forum italiano, staccia il suo CV. Ah, lo usavi gia' come carta igienica, allora nulla.

nnnnnnooooooooooo (mimica stile Jean-Claude di "sensualità a corte")


Ossequi. Bacia le mani. Saluti alla mamma. Bella la camicia nuova antisudore, ti smagrisce."

:rotfl:

^TiGeRShArK^
01-04-2008, 11:45
faccio presente a chi ci dà degli evangelizzatori pseudotroll che Tigershark ha comprato un MecbucPro e che usa MacOSX dalla mattina alla sera. :O


Ciao Danilo :asd:
e infatti io non sono mai stato un evangelizzatore apple e ancora oggi mi batto per difendere vista nelle varie trollate che leggo in giro :asd:

Cmq il mecbucpro non è per niente male :O

^TiGeRShArK^
01-04-2008, 11:46
Voglio un Macbuceir, da quando l'ho visto non posso vivere senza :(
Ma prima devo comprarmi la D300. *click* *click*

no il Tegame™ no :rotfl:

con quello non potrai apprezzare le cose buone dei mac... :O
quanto meno aspetta il futuro Tegame 2™ :asd:

EDIT: per maggiori info si veda la recensione distruttiva su arstechnica :asd:

dupa
01-04-2008, 11:49
Visto che usi Java te ne cito 3, che la Sun ha deciso di implementare prendendo esempio dalla MS:
- generics



http://en.wikipedia.org/wiki/Java_version_history
J2SE 5.0 (September 30, 2004)

http://en.wikipedia.org/wiki/.NET_Framework#.NET_Framework_2.0
Version Version Number Release Date
2.0 2.0.50727.42 2005-11-07

Vogliamo parlare di C++? :)


- assembly

non l'ho mai usato in Java :(


- RMI

The idea of RPC goes back at least as far as 1976, when it was described in RFC 707. One of the first business uses of RPC was by Xerox under the name "Courier" in 1981. The first popular implementation of RPC on Unix was Sun's RPC (now called ONC RPC), used as the basis for Sun's NFS. ONC RPC is still widely used today on several platforms.

Another early Unix implementation was Apollo Computer's Network Computing System (NCS). NCS later was used as the foundation of DCE/RPC in the OSF's Distributed Computing Environment (DCE). A decade later Microsoft adopted DCE/RPC as the basis of their Microsoft RPC (MSRPC) mechanism, and implemented DCOM atop it. Around the same time (mid-90's), Xerox PARC's ILU, and the Object Management Group's CORBA, offered another RPC paradigm based on distributed objects with an inheritance mechanism.


Ah AJAX che ora fa molto trendy è stato possibile grazie all'oggetto HTTPRequest, inventato nella seconda metà degli anni 90 sempre da MS.

Finalmente qualcosa introdotto da Microsoft, peccato che non ne abbiamo mai capito l'utilità :)

http://www.w3schools.com/ajax/ajax_httprequest.asp

AJAX was made popular in 2005 by Google (with Google Suggest).

Google Suggest is using the XMLHttpRequest object to create a very dynamic web interface: When you start typing in Google's search box, a JavaScript sends the letters off to a server and the server returns a list of suggestions.

DioBrando
01-04-2008, 11:50
Voglio un Macbuceir, da quando l'ho visto non posso vivere senza :(

Sarà bello il MecBucEir però è davvero caro per quel che offre rispetto alla concorrenza IMHO :oink:


Ma prima devo comprarmi la D300. *click* *click*

Devi farmi vedere i progressi della fotografia :p



Per LinQ linko un paio di risorse:
Training Video della serie "How Do I (http://www.asp.net/learn/linq-videos/)
Blog Jesse Liberty (http://silverlight.net/blogs/jesseliberty/archive/2008/03/26/linq-to-sql.aspx) (tenetelo presente se sviluppate applicazioni web e vi piace Silverlight ;)



Buon pranzo a tutti :flower:

fek
01-04-2008, 11:53
Sarà bello il MecBucEir però è davvero caro per quel che offre rispetto alla concorrenza IMHO :oink:


E' bello e come tu sai la scimmia non ragiona, va soddisfatta sempre.


Devi farmi vedere i progressi della fotografia :p

Guarda il mio blog, in alto a sinistra :asd:


Per LinQ linko un paio di risorse:
Training Video della serie "How Do I (http://www.asp.net/learn/linq-videos/)
Blog Jesse Liberty (http://silverlight.net/blogs/jesseliberty/archive/2008/03/26/linq-to-sql.aspx) (tenetelo presente se sviluppate applicazioni web e vi piace Silverlight ;)

Ho giocato un finesettimana intero con Silverlight e ExpressionBlend: sono di-vi-ni. Purtroppo sono anche strapieni di bug, visto che e' una beta. Ma questa roba ha un potenziale mostruoso. Creavo bottoni e bottoncini, finestre finestrelle in EB, smanettavo in C# col codice, supporta anche IronPython, tutto .NET. Strepitoso.

DioBrando
01-04-2008, 13:56
e infatti io non sono mai stato un evangelizzatore apple e ancora oggi mi batto per difendere vista nelle varie trollate che leggo in giro :asd:

Sìsì scherzavo :D


Cmq il mecbucpro non è per niente male :O

Lo voglio anche io :(

http://en.wikipedia.org/wiki/Java_version_history
J2SE 5.0 (September 30, 2004)

http://en.wikipedia.org/wiki/.NET_Framework#.NET_Framework_2.0
Version Version Number Release Date
2.0 2.0.50727.42 2005-11-07

I generics, al di là delle date di uscita delle versioni finali bollivano in pentola (come d'altra parte i concetti che stanno alla base di tutto il framework NET che erroneamente, da chi confonde l'informatica con la religione, fa coincidere con il pensiero "MS ha copiato Sun") ben molto tempo prima.

http://www.artima.com/intv/generics.html


Vogliamo parlare di C++? :)

Se ti riferisci ai template in C++, sono profondamente diversi.
Penso te lo possa spiegare meglio di me fek.
In ogni caso l'articolo di cui sopra penso sia una buona fonte di lettura.


non l'ho mai usato in Java :(


Hai capito che mi riferivo al meccanismo degli assembly in .NET vero?


The idea of RPC goes back at least as far as 1976, when it was described in RFC 707. One of the first business uses of RPC was by Xerox under the name "Courier" in 1981. The first popular implementation of RPC on Unix was Sun's RPC (now called ONC RPC), used as the basis for Sun's NFS. ONC RPC is still widely used today on several platforms.

Another early Unix implementation was Apollo Computer's Network Computing System (NCS). NCS later was used as the foundation of DCE/RPC in the OSF's Distributed Computing Environment (DCE). A decade later Microsoft adopted DCE/RPC as the basis of their Microsoft RPC (MSRPC) mechanism, and implemented DCOM atop it. Around the same time (mid-90's), Xerox PARC's ILU, and the Object Management Group's CORBA, offered another RPC paradigm based on distributed objects with an inheritance mechanism.


L'implementazione presa a modello per le RMI utilizzata nella piattaforma Java è quella MS, non quella Unix-like.


Finalmente qualcosa introdotto da Microsoft, peccato che non ne abbiamo mai capito l'utilità :)

Non ne abbiano volevi dire, perchè noi l'abbiamo capito fin troppo visto l'abuso che si fà di questo ensemble di tecnologie.
Sembra che non si possa parlare di Web 2.0 senza AJAX.


http://www.w3schools.com/ajax/ajax_httprequest.asp

AJAX was made popular in 2005 by Google (with Google Suggest).

Google Suggest is using the XMLHttpRequest object to create a very dynamic web interface: When you start typing in Google's search box, a JavaScript sends the letters off to a server and the server returns a list of suggestions.

E' opinabile il fatto che sia stato quello il primo esempio di successo.
Anche perchè i siti di divulgazione principali sul tema sono precedenti, così come gli utilizzi di AJAX.


Al di là cmq di queste considerazioni, è il discorso da cui sei partito che è di lana caprina.
Fermarsi al "chi copia cosa" è stupido. Dovremmo forse reinventare ogni volta la ruota? A me non interessa chi arriva prima, mi interessa avere una gamma di prodotti validi e che competano tra di loro.
Se poi un'idea sviluppata da X, risulta buona, ben venga l'adozione da parte di Y, Z, Q...
Tanto poi non sarà mai la stessa, l'implementazione, che dipende dall'ambiente e la piattaforma circostanti, sarà giocoforza spesso diversa.


E poi basta con questa storia della MS che copia, ha sfinito. La casa di Redmond spende in R&D l'anno l'equivalente di quanto Apple o altri grandi corporation incassano (parlo di ricavi eh non di utili).

E' bello e come tu sai la scimmia non ragiona, va soddisfatta sempre.

Vabbè almeno quell'1% di DNA che ci distingue dalle scimmie :oink:


Guarda il mio blog, in alto a sinistra :asd:


ok :)


Ho giocato un finesettimana intero con Silverlight e ExpressionBlend: sono di-vi-ni. Purtroppo sono anche strapieni di bug, visto che e' una beta. Ma questa roba ha un potenziale mostruoso. Creavo bottoni e bottoncini, finestre finestrelle in EB, smanettavo in C# col codice, supporta anche IronPython, tutto .NET. Strepitoso.

Concordo è davvero notevole.
Nel "report" che avevo scritto di ritorno dalla tappa del Roadshow era stata una delle annotazioni che avevo fatto.
Seppur siano due figure distinte, è chiaro che c'è un tentativo concreto di far convergere il webdesigner con lo sviluppatore.
Presumo poi che con la versione TeamSystem di VisualStudio, con questo meccanismo di fruizione del medesimo progetto, si integrino anche strumenti propri di sharegrouping e lavoro collaborativo.

Mi hai fatto venire un dubbio...la suite Expression 1.0 però è stata rilasciata da un po'...funziona solo con la 2? :wtf:
In ogni caso è prevista la Final per agosto 2008 mi pare...o cmq nell'arco di quest'anno

fek
01-04-2008, 14:04
Vogliamo parlare di C++? :)

Parliamone, ma solo se sappiamo di che cosa stiamo parlando.
I template in C++ sono puramente compile-time. Il primo a parlare di Generics, ovvero tipi parametrici come first-class-citizen nel framework e controllati a run-time, e' stato Hejlsberg di Microsoft.

Parlare di questo copia quello e' davvero da troll. Il progresso umano esiste solo in termini di nuove scoperte che si basano su scoperte precedenti fin dall'albo dei tempi.