Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Έχει ανέβει εγχειρίδιο σε 8 τεύχη μέχρι τώρα...και συνεχίζεται η συγγραφή.

Από την κεντρική σελίδα του blog επιλέγουμε εγχειρίδιο και βλέπουμε την κεντρική του σελίδα με συνδέσεις για τα τεύχη του, απλές σελίδες html. Υπάρχει αναφορά θεμάτων για κάθε τεύχος.

Αν υπάρχουν παρατηρήσεις, σχόλια, ας τα δούμε εδώ.

  • Απαντ. 308
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοσ. (επεξεργασμένο)

Η Μ2000 είναι γλώσσα προγραμματισμού και έχει υλοποιηθεί ο μεταφραστής της με την Visual Basic 6.(ξεκίνησε το 1999 με την Visual Basic 5).

 

Δεν έμεινα στον σχεδιασμό άλλα έκανα υλοποίηση. Νομίζω ότι μια γλώσσα χωρίς υλοποίηση δεν είναι παρά ψευδογλώσσα.

 

Ό διερμηνευτής της Μ2000 είναι εκτελέσιμο αρχείο που χρησιμοποιεί το dll της VB6. Δεν το παρέχω μαζί γιατί μέχρι τα Windows 10 παρέχεται από το λειτουργικό. Δεν τρέχει η VB6 αλλά κώδικας που έχει γίνει γλώσσα μηχανής (η VB6 έχει και ένα τρόπο να φτιάχνει p-code αλλά εδώ είναι γλώσσα μηχανής).

 

Εφόσον ο κώδικας δίνεται, ως κώδικας που μπορεί να τρέξει και στο IDE, μπορούμε να πούμε με βεβαιότητα ότι ο μεταφραστής της Μ2000 είναι μια εφαρμογή γραμμένη σε Vb6.

 

Η απάντηση στο ερώτημά σου δεν μπορεί να δοθεί γιατί το διαζευκτικό ήτα που βάζεις υπονοεί δυο πράγματα ξεχωριστά πράγμα που δεν συμβαίνει, τουναντίον εδώ έχουμε και τα δύο και μια γλώσσα προγραμματισμού και μια εφαρμογή σε VB6.

 

Και επειδή ο κώδικας είναι ανοικτός για διάβασμα. ..μπορεί κανείς να δει πολλά πράγματα. Για παράδειγμα πως υλοποιώ τα δικά της widgets, τον επεξεργαστή κειμένου (έχει η Μ2000 τον κώδικα μέσα για όλα).  Μέχρι και sprites υπάρχουν με δυνατότητα μεγέθυνσης/περιστροφής!

 

Η γλώσσα εκτός από τα βασικά έχει εντολές για γραφικά, εικόνες, βάσεις δεδομένων και πολυμέσων.

Ο μεταφραστής είναι ένα exe αρχείο και συνοδεύεται από ένα mdb που έχει την βοήθεια. Στο zip που κατεβάζουμε έχει όλο το κώδικα σε text αρχεία (είναι σε ANSI ελληνικό). Το εκτελέσιμο τρέχει με ελληνικά χωρίς να έχει ανάγκη να αλλάξουμε την γλώσσα για υποστήριξη μη Unicode προγραμμάτων. Κανονικά όσοι έχουν γράψει προγράμματα σε VB6 δεν έχουν πετύχει το απόλυτο, να έχουν unicode υποστήριξη, επειδή το locale  ID κατά τη δημιουργία γράφεται στο exe, και να θέλει κανείς μπορώ να εξηγήσω τι βάρος δημιουργεί αυτό. Με έσωσε η ιδέα να χρησιμοποιήσω δικά μου παράθυρα! Έφτιαξα ένα βασικό Listbox και αυτό γίνεται τα πάντα με subclassing - μου το έδειξε αυτό ένας Γερμανός- χωρίς χρήση windproc, απλά είναι προχωρημένο θέμα της vb6 και αν δεν στο δείξουν δεν το βρίσκεις ποτέ.

 

Για την VB6, και πόσο θα αντέξει ακόμα!

Δεν υπάρχει περίπτωση να μην τρέχουν προγράμματα  σε VB6 γιατί πουλιόταν για να φτιάχνονται components, δομικά στοιχεία για πελάτες προγραμματιστές. Οπότε αν έχουμε περίπτωση που θα σταματήσει η υποστήριξη,  δηλαδή δεν θα τρέχει το βασικό dll, τότε κάποιοι θα μείνουν ξεκρέμαστοι. Αυτοί όμως δεν έκαναν συμφωνία με την Microsoft αλλά με τους κατασκευαστές.των δομικών στοιχείων. Έτσι η Microsoft δεν μπορεί να πάει ενάντια στους κατασκευαστές. Απλά με το καιρό και με άλλες τεχνολογίες θα τους στρέψει προς καλύτερες πλατφόρμες. Όμως ακόμα και σήμερα δεν υπάρχει ρουτίνα του λειτουργικού που να μην μπορεί να έχει πρόσβαση η VB6. Αυτή είναι η αλήθεια!

Δείτε στο vbforums, πόσα άτομα κάθε μέρα μπαίνουν στις Net γλώσσες και πόσοι στην Vb6, σαφώς είναι οι διπλάσιοι στην Net πλατφόρμα, αλλά αν δεις τα νούμερα σωστά  2 και 1 μας κάνουν 2/3 και 1/3 ή 66% και 33%. Ένας στους τρεις ασχολείται με VB6........ακόμα!
 

Επεξ/σία από M2000
Δημοσ.

...

Δείτε στο vbforums, πόσα άτομα κάθε μέρα μπαίνουν στις Net γλώσσες και πόσοι στην Vb6, σαφώς είναι οι διπλάσιοι στην Net πλατφόρμα, αλλά αν δεις τα νούμερα σωστά  2 και 1 μας κάνουν 2/3 και 1/3 ή 66% και 33%. Ένας στους τρεις ασχολείται με VB6........ακόμα!

 

Μόνο μια σημείωση σε αυτό. Ότι σύμφωνα με τους υπολογισμούς σου ένας από τους τρεις που ασχολούνται με VB, ασχολείται με VB6.

  • Like 1
Δημοσ.

Παραθέτω ένα πρόγραμμα σε M2000, στα αγγλικά, όπου με χρήση αντικειμένων φτιάχνουμε FIFO και LIFO, για οποιοδήποτε αντικείμενο σε έναν δυναμικό χώρο. Τα αντικείμενα όταν μπαίνουν στην λίστα (οποιαδήποτε από τις δύο) αποκτούν επιπλέον ιδιότητες. Μπορούμε να φτιάξουμε όσες λίστες θέλουμε στο χώρο που μας δίνει το αντικείμενο της κλάσης Mem() (έχω τον ορισμό της στο τέλος).

 

 

 

\\ Example of using Mem() to build
\\ Language M2000 ver 8 rev 154
\\ use of public and private in class/group definitions
\\ Stacks, FIFO and LIFO
\\ We provide a class AnyName wihout pnext
\\ and inside Mem() we add This property
\\ We use PushFirst and PushLast methods
Form 80,40
Gosub MyClass
Class AnyName {
      name$
      Module AnyName {
            Read .name$    
      }
}
A=Mem(100)
Print "A FIFO, First In First Out"
A1=A.Null()
A2=A.Null()
Stack New {
      Data "First","Second","Third", "Forth","Fifth"
      While Not Empty {
            A.PushFirst &A1,&A2, AnyName(letter$)
      }
      ShowList(A1)
}
Print "A LIFO, Last In First Out"
A3=A.Null()
Stack New {
      Data "First","Second","Third", "Forth","Fifth"
      While Not Empty {
            A.PushLast &A3, AnyName(letter$)
      }
      ShowList(A3)
}
Print "Change one item ********************"
bb=A.CopyObj(A3)
Print bb.name$
bb.name$=bb.name$+"!"
A.CopyBack A3, BB
Print A.Property$(A3,"name$")
Print "Swap 1st with 3rd using external copies***"
x=A3 : For i=1 to 2 : x=A.Pnext(x) : Next i
Dim aa(2)
aa(0)=A.CopyObj(A3)
aa(1)=A.CopyObj(x)
Swap aa(0),aa(1)  \\fast using pointers
\\ CopyBack preserve link pointer if found
A.CopyBack A3, aa(0)
A.CopyBack x, aa(1)
Dim aa() \\ erase
Print "Show List - Swap 1 with 3rd **"
ShowList(A3)
\\ using object method
A.SwapLinked A3, x
Print "Show List - Right Order ***"
ShowList(A3)
Print "Show List - Delete Second from Last***"
A.DeleteLinked A3   \\ delete second
ShowList(A3)
Print "Show List - Delete Last ***"
For A {
      \\ newA3 is a temporary variable
      newA3=.Pnext(A3)
      .MFree A3
      A3=newA3
}
ShowList(A3)
End
Sub ShowList(Root)
      local x=Root
      While x<>A.Null() {
            Print A.Property$(x,"name$")
            x=A.Pnext(x)
      } 
      Print "Press any key"
      a$=key$
End Sub
MyClass:
Class Global Mem {
Private:
      Dim d()
      noUsed=-1
      topfree=0
      Items, Count, AddMore=100     
      Group Null { Null }
      Function IsNull {
            =Valid(.d(Number).Null)
      }
Public:
      Function Pnext {
            Read where
            if .isNull(where) Then "Error pointer is Null"
            =.d(where).pnext
      }
      Module PushLast {
      If not Match("SG") Then Error "Bad Parameters"
            Read &First
            Push 1 ' For malloc
            Shift 2 ' so we get Group first
            \\ we call Malloc module using parameters in stack
            Call .Malloc
            Read Last             
            If First=.Null() Else {
                  .d(Last).pnext<=First
            }
            First=Last          
      }
      Module PushFirst {
            If not Match("SSG") Then Error "Bad Parameters"
            Read &Root, &Last
            Push 1 ' For malloc
            Shift 2 ' so we get Group first
            \\ we call Malloc module using parameters in stack
            Call .Malloc
            Read First
            If Root=.Null() Then {
                        Root=First
                        Last=First
                  } Else {
                        .d(Last).pnext<=First
                        Last=First
                  }
      }
      Function Null {
            =-1
      }
      Module AddMore {
            Read K
            If K<=0 Then Exit
            Try ok {
            Dim .d(K+.items)
            }
            If ok Then .Items+=K
      }
      Module Mem {
            Read .Items
            If Match("G") Then Read N
            N=.Null   \\ This is a Union If N is a Group
            Dim .d(.Items)=N
      }
      Function Malloc { 
            If Not Match("G") Then Error "No Group Found"
            Call .Malloc
            =Number
      }
      Module Malloc {
            If .noUsed=-1 Then {
                  If .topfree<.Items Then {  
                        Try ok {
                            .AddMore .AddMore
                            ok2=true
                        }
                        If valid(ok2 and ok) Else  Error "Memory Full"
                  }
                  Read .d(.topfree)
                  Gosub CheckCommand(.topfree)
                  Push .topfree
                  .topfree++
                  .count++
            } Else {
                  temp=.d(.noUsed).Null
                  Read .d(.noUsed)
                  Gosub CheckCommand(.noUsed)
                  Push .noUsed
                  .noUsed<=temp
                  .count++
            }       
            Sub CheckCommand(X)
                  If Match("N") Then {
                        If Number=1 Then {  \\ use Interface
                              For .d(X) {
                                    Group kk { pNext=-1}
                                    This=kk
                              }
                        }
                  }
            End Sub
      }
      Module Mfree {
            Read mf
            If .IsNull(mf) Then Error "Invalid Pointer"
            old=.noUsed
           .noUsed<=mf
           .d(mf)=.Null
           .d(mf).Null<=old
           .count--
      }
      Function Property {
            Read A, A$
            A$=".d(A)."+A$  \ M2000 has string pointers
            If .IsNull(A) Then  Error "Invalid Pointer "+str$(A)
            =Eval(A$)
            If Match("N") Then A$.=Number
      }
      Function Property$ {
            Read A, A$
            A$=".d(A)."+A$
            If .IsNull(A) Then  Error "Invalid Pointer"
            =Eval$(A$.)  \\ look . after A$
            \\ A$. is Not A$ is a pointer To 
            If Match("S") Then A$. = letter$
      }
      Function CopyObj {
            Read A
            If .IsNull(A) Then  Error "Invalid Pointer"
            =.d(A)
      }
      Module CopyBack {
            Read A
            If .IsNull(A) Then  Error "Invalid Pointer"
            If valid(.d(A).pnext) Then {
                  k=.d(A).pnext
                  Read .d(A)
                  If valid(.d(A).pnext) Else {
                        For .d(A) { 
                              Group kk { pnext }
                              This=kk
                        }
                  }
                  .d(A).pnext<=k
            } Else {
                  Read .d(A)
            }
      }
      Module SwapFast {
      Read A, B
            If .IsNull(A) Then Error "Invalid Pointer A"
            If .IsNull( Then Error "Invalid Pointer B"
            Swap .d(A), .d(
      }
      Module SwapLinked {
            Read A, B
            \\ no error checking if we don΄t have linked list
            If .IsNull(A) Then Error "Invalid Pointer A"
            If .IsNull( Then Error "Invalid Pointer B"
            ka=.d(A).pnext : kb=.d(.pnext
            Swap .d(A), .d(
            .d(A).pnext<=ka : .d(.pnext<=kb
      }
      Module DeleteLinked {
            Read A
            \\ no error checking if we don΄t have linked list
            If .IsNull(A) Then Error "Invalid Pointer"
            B=.d(A).pnext 
            If .IsNull( Then Exit  \\deleted
            .d(A).pnext<=.d(.pnext      
            .MFree B
      }
}
Return 

 

 

Δημοσ.

Ανέβασα το τεύχος 12 του εγχειριδίου της Μ2000. Αφορά τη παράλληλη επεξεργασία/ροή (είναι το πρώτο μέρος, θα ακολουθήσουν και άλλα).

Δημοσ.

Σήμερα εγκατέστησα τη Μ2000 σε Windows 10 laptop, για ένα μαθητή Τετάρτης δημοτικού. Βρήκαμε ότι έχει τρεις φωνές στο συνθέτη φωνής!

Print Speech

μας έδωσε 3

Print Speech$(0)

Print Speech$(1)

Print Speech$(2)

μας έδωσε τα ονόματα στη κάθε φωνή και με τις παρακάτω εντολές δοκιμάσαμε το αποτέλεσμα

Speech "Hello Makis", 0

Speech "Hello Makis", 1

Speech "Hello Makis", 2

 

Το 2 είναι γυναικία φωνή, τα 0 και 1 ακούγονται ίδια.

Η Μ2000 έχει με το δείκτη ! αλλαγή σε παιδική φωνή και με το # κάνει spelling

Speech "Hello Makis" !, 2

Speech "Hello Makis" #, 2

 

Με κάτι τέτοια ξεκινούν να προγραμματίζουν!

  • Like 1
Δημοσ.

Αναθεώρηση 163,

Έκανα τον Αυλό να στέλνει Unicode στοιχεία σε άλλα προγράμματα Μ2000. Διαβάστε το τεύχος 13, λέει πως δουλεύει η ιδέα του εξυπηρετητή-πελάτη με χρήση Αυλού.

Δημοσ.

Ανέβασα το Τεύχος 14 του εγχειριδίου, έχει ένα παράδειγμα με δυο προγράμματα, τον εξυπηρετητή και τον πελάτη. Όταν τρέχει ο εξυπηρετητής (για το παράδειγμα το κάνει) ξεκινάει δυο πελάτες και στο καθένα γράφουμε κάτι και το στέλνουμε στον εξυπηρετητή, αυτό του βάζει αριθμό πρωτοκόλλου (!!!) και το στέλνει ένα οκ με τον αριθμό.

Μπορούμε να σταματήσουμε οποιοδήποτε από τα τρία προγράμματα, χωρίς να βγούμε από το κάθε ξεχωριστό περιβάλλον και να δοκιμάσουμε τι γίνεται όταν δεν υπάρχει επικοινωνία. Μετά μπορούμε να ξεκινήσουμε πάλι και συνεχίζουν από εκεί που έμειναν!

Ο εξυπηρετητής φτιάχνει έναν αυλό για να δέχεται δεδομένα και οι πελάτες το ίδιο, από έναν δικό τους. Στην εκκίνηση ο πελάτης ξεκινάει με τρεις τιμές στο σωρό τιμών, η μία είναι ο αυλός του εξυπηρετητή. Όταν στέλνει σε αυτόν ο πελάτης του κοινοποιεί το κωδικό του, απ΄όπου βγαίνει ο δικός του αυλός, άρα μπορεί να στείλει σε αυτόν την απάντηση που θέλει ο εξυπηρετητής.

Οι αυλοί δουλεύουν με νήματα στο περιθώριο. Τα προγράμματα δουλεύουν με νήματα επίσης.

Παρόλο που η 148 αναθεώρηση δεν έχει unicode την μεταφορά μέσω αυλού, τα προγράμματα δουλεύουν.

Και στα δύο προγράμματα έχει προστεθεί λογική για περίπτωση που δεν μπορούν να φύγουν τα δεδομένα (οπότε γίνεται εκ νέου δοκιμή, και υπάρχει και χρόνος "timeout". Αυτό τον υλοποίησα με το σύστημα που μετράει το φορτίο (σε δεδομένες εντολές το πόσο χρόνο κάνει να τις εκτελέσει, profiler/timecount ή Αναλυτής/φόρτος) και βγαίνει ένας double όπου το ακέραιο μέρος είναι χιλιοστά δευτερολέπτου.

π.χ. 

Α=0

Αναλυτής

Α=Α+1

Τύπωσε Φόρτος

Ο αριθμός που θα δώσει έχει να κάνει με το φορτίο του υπολογιστή τη δεδομένη στιγμή. Όσο περισσότερα προγράμματα ανοίγουμε αυτό το νούμερο μεγαλώνει. Μπορεί κανείς όμως να το χρησιμοποιήσει σαν μετρητή!

 

Δημοσ.

Σημαντική αναθεώρηση 167.

Από την 1η έκδοση της Μ2000, ο διερμηνευτής άλλαζε το διαχωριστικό δεκάδων και χιλιάδων, σε εμβέλεια χρήστη. Αυτό όμως γίνονταν για όλες τις εφαρμογές για το συγκεκριμένο χρήστη των Windows.

 

Το παράξενο είναι ότι η αλλαγή γίνονταν μόνιμα παρόλο που το m2000.exe δεν έτρεχε με δικαιώματα διαχειριστή.

Από την 167 αναθεώρηση, της έκδοσης 8, ο διερμηνευτής δουλεύει χωρίς να πειράζει τις ρυθμίσεις αυτές.

Αν θέλουμε μπορούμε να εμφανίζουμε αριθμούς με το σύμβολο υποδιαστολής που ορίζεται στις ρυθμίσεις γλώσσας. Στα ελληνικά είναι το κόμμα.

Γία εισαγωγή αριθμλών με δεκαδικά πάντα το σύμβολο διαχωρισμού είναι η τελεία. Στο κείμενο προγράμματος οι αριθμοί μπαίνουν με τελεία και μετά τα δεκαδικά. Ακόμα και η γραφή των αριθμών σε αρχείο τύπου csv

που έχει η Μ2000 γίνεται με τελεία, αφού εκεί ο διαχωρισμός στοιχείων γίνεται με κόμμα.

Αν αποφασίσουμε να φαίνεται το κόμμα αντί η τελεία, αυτό θα γίνεται όχι μόνο στην Τύπωσε/Print, αλλά και στη μετατροπή αριθμού σε αλφαριθμητικού, αν χρησιμοποιηθεί κάποια ειδική μορφή πχ ##.###

Δημοσ.

Ξεκίνησα μια σειρά τευχών του εγχειριδίου για τη μεταβλητή τύπου έγγραφο!

Δημοσ.

Η τελευταια αναθεώρηση (για την ώρα) 176 έχει και τα Γεγονότα συμπεριλάβει. Μπορεί κανείς να φτιάχνει αντικείμενα Γεγονός (Event) και να ορίζει ποιες συναρτήσεις θα καλει όταν το καλέσουμε. Μπορεί κανείς να βάζει ή να βγάζει συναρτήσεις, ή να το κάνει να μην "ακούει". Απλά δουλεύει σύγχρονα, δηλαδή αν έχει να στείλει κάτι θα το στείλει, δεν περιμένει. Επειδή όμως η Μ2000 έχει νήματα μπορούμε να στείλουμε τα δεδομένα σε ένα νήμα και αυτό να τα επεξεργαστεί άλλη στιγμή.

Ακόμα το ψάχνω το θέμα, δεν είναι εύκολο!

Επισκέπτης
Αυτό το θέμα είναι πλέον κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...