PDA

Επιστροφή στο Forum : Μαθηματικα και Προγραμματισμος



Σελίδες : 1 2 3 4 [5]

kennyyy
17-07-08, 03:59
Πάνε μια βόλτα σε όλες τις ελληνικές εταιρίες πληροφορικής, διάλεξε όποια θές, DIS, LOGIC, Singular, Unisoft(Altec) κλπ, και πιάσε αυτούς που δουλεύουν με SQL. Ακόμα χειρότερα πάνε μια βόλτα στους dealers τους που στήνουν και υποτίθεται υποστηρίζουν τα προιόντα τους. Θα πάθεις την πλάκα σου. Μιλάω απο πείρα. Στους 100 ζήτημα οι 2,3 να ξέρουν τι κάνουν... Και το παράδειγμα ήταν απλοικό επίτηδες για ακριβώς αυτόν τον λόγο. Οτι κάτι τόσο απλό (ίσως) και πολύ σύνηθες αντιμετωπίζεται χωρίς γνώση, και όπου γίνεται χρήση πχ nested sets γίνεται με τύπου copy paste όπου ταιριάζει χωρίς κατανόηση γιατι γίνεται έτσι.
Nαι η αλήθεια είναι ότι έχω ακούσει ιστορίες τρόμου με τους (πανάκριβους) dealers...
Αυτοί 1.δεν είχαν ποτέ την ανάλογη εκπαίδευση και κυρίως και πιο σημαντικό...
2.δεν είναι σωστοί επαγγελματίες αν πάνε να αντιμετωπίσουν ένα τέτοιο πρόβλημα χωρίς κατανόηση.
Και ένα καλό link να δούμε που βαδίζουμε:
http://www.indiangeek.net/wp-content/uploads/Programmer%20competency%20matrix.htm
αν και σε μερικά διαφωνώ κάθετα (π.χ. dvcs vs centralized) αλλά αυτό είναι θέμα άλλου νήματος :)


Λάθος, έχει.
Έχεις συγκεκριμένο αριθμό καταχωρητών. Όταν έχεις ένα βρόχο που χρειάζεται να κάνεις τέτοιες αντιμεταθέσεις (πχ σε sorting συναρτήσεις) με πάρα πολλές επαναλήψεις, μια μέθοδος βελτίωσης είναι να πάρεις τον βρόχο και να τον ξεδιπλώσεις (πχ εκεί που έκανε 1000 επαναλήψεις της μια εντολ´ξς να κάνει 250 των τεσσάρων, 125 των 8 κτλ) έτσι ώστε γλιτώνεις εντολές που έχουν να κάνουν με τον έλεγχο του βρόχου και που όσο περισσότερες εντολές να βάλεις μέσα, τόσο μεγαλύτερη βελτίωση έχεις. Τώρα αν έχεις πχ 12 καταχωρητές που μπορείς να χρησιμοποιήσεις, σε κάθε επανάληψη με την περίπτωση των 3 μεταβλητών θα μπορούσες να κάνεις το πολύ 4 αντιμεταθέσεις (12 εντολές ανα επανάληψη, άρα γλιτώνεις 3 εντολές διακλάδωσης) , ενώ με αυτή με τους 2 θα μπορούσες 6 (18 εντολές ανα επανάληψη, άρα γλιτώνεις 5) με τον ίδιο αριθμό εντολών.
Ναι, μόνο που οι σοβαροί compilers το κάνουν μόνοι τους. Μόνο στα embedded συναντάς ακόμα τέτοια πράγματα, εν έτει 2008..
Στο παράδειγμα με το multicore, στη γενική περίπτωση (υπολογισμούς νέφους μάλλον θα το μετέφραζα!) δεν ξέρεις/δε μπορεί να σε ενδιαφέρει πόσα core έχεις, για αυτό ο παραλληλισμός γίνεται αλλιώς στα σύγχρονα συστήματα. Εκπαιδευτικά έχεις δίκιο όμως :)

simeon.mattes
17-07-08, 07:52
Δείχνει τον ίδιο κώδικα σε multithreaded μορφή. Όταν μιλάμε για πιο οικονομικό κώδικα, δεν έχει σχέση αυτό;

Ναι, εντάξει...Απλά αρχικά δεν είχα καταλάβει τι είχε γράψει ο Eruyome(MMXGN). Γι' αυτό μπερδεύτηκα. Έψαχνα να βρω τι σχέση έχουν τα add με τα xor και το multithreading.

Eruyome(MMXGN)
17-07-08, 09:32
Ναι, μόνο που οι σοβαροί compilers το κάνουν μόνοι τους. Μόνο στα embedded συναντάς ακόμα τέτοια πράγματα, εν έτει 2008..


Μα γι αυτό έγραψα και 2 φορές πριν:



Βέβαια για τις περισσότερες αυτές τεχνικές αναλαμβάνει ο compiler, οπότε δεν χρειάζεται να κάτσεις να το σκεφτείς ιδιαίτερα.





Στο παράδειγμα με το multicore, στη γενική περίπτωση (υπολογισμούς νέφους μάλλον θα το μετέφραζα!) δεν ξέρεις/δε μπορεί να σε ενδιαφέρει πόσα core έχεις, για αυτό ο παραλληλισμός γίνεται αλλιώς στα σύγχρονα συστήματα. Εκπαιδευτικά έχεις δίκιο όμως :)

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

Εκπαιδευτικά μιλάω βασικά, καθώς το σπουδάζω ακόμα :p

simeon.mattes
17-07-08, 09:37
a, b = b, a (http://love-python.blogspot.com/2008/02/swap-values-python-way.html)

Τώρα το είδα...άντε βρε...έχει τέτοιο notation sugar η Python;

Eruyome(MMXGN)
17-07-08, 10:01
Τώρα το είδα...άντε βρε...έχει τέτοιο notation sugar η Python;

H python γενικά δεν μπαίνει ανάμεσα σε σένα και σε αυτό που θες να κάνεις. Μπορείς να γράφεις προγράμματα σχεδόν κατευθίαν σε ψευδοκώδικα :P (δεν είναι τυχαίο που θα δείς πολλές πηγές - πχ wikipedia - να έχουν σαν ψευδοκώδικα, κώδικα python )

alexisazen
17-07-08, 10:18
Τώρα το είδα...άντε βρε...έχει τέτοιο notation sugar η Python;


http://oreilly.com/catalog/9780596001674/toc.html Πρώτο παράδειγμα, εξηγεί και γιατί. (στην ουσία είναι ένα tuple)

simeon.mattes
17-07-08, 11:01
http://oreilly.com/catalog/9780596001674/toc.html Πρώτο παράδειγμα, εξηγεί και γιατί. (στην ουσία είναι ένα tuple)

Πράγματι...Ωραίο βιβλίο για να ξεκινήσει κανείς python! Όταν έκανα κάτι sctipt-άκια για pyhton είχα ξεκινήσει από το dive into python. Φαντάζομαι η rubby τι θα κάνει που είναι πιο πρόσφατη γλώσσα

xhaos
17-07-08, 11:13
οκ, αλλη ερωτηση:
σε C πως κανουμε μια συναρτηση να τυπωσει τον εαυτο της......


;):p

anon
17-07-08, 12:25
Και ένα καλό link να δούμε που βαδίζουμε:
http://www.indiangeek.net/wp-content/uploads/Programmer%20competency%20matrix.htm
αν και σε μερικά διαφωνώ κάθετα (π.χ. dvcs vs centralized) αλλά αυτό είναι θέμα άλλου νήματος

Πολύ καλό και πολύ ενδιαφέρον. Και εγώ προσωπικά ισως να διαφωνώ με κάποια, πχ γνωρίζω ότι σπουδαιοι top developers δεν χρησιμοποιούν IDE, και μάλιστα πολλοί εξ'αυτών ούτε καν Emacs (και derivatives). Ενω χρησιμοποιούν κατα κόρον άλλα command line tools, και άλλα meta tools φτιαγμένα απο τους ίδιους ειδικά για την περίπτωση (και το Git έτσι ξεκίνησε μέχρι αποκτήσει το απαραίτητο momentum). Στο προγραμματισμό θα έβαζα οπωσδήποτε το recursion, μιας και απο προσωπική εμπειρία στο μεταπτυχιακό, ήταν ένα τμήμα που οι περισσότεροι δεν μπορούσαν να το "χωνέψουν" και να το κάνουν κτήμα τους, όχι απλά να το καταλάβουν, αλλά να το χρησιμοποιούν όποτε χρειάζεται ως εργαλείο για πιο καλό κώδικα.

simeon.mattes
17-07-08, 14:02
Στο προγραμματισμό θα έβαζα οπωσδήποτε το recursion, μιας και απο προσωπική εμπειρία στο μεταπτυχιακό, ήταν ένα τμήμα που οι περισσότεροι δεν μπορούσαν να το "χωνέψουν" και να το κάνουν κτήμα τους, όχι απλά να το καταλάβουν, αλλά να το χρησιμοποιούν όποτε χρειάζεται ως εργαλείο για πιο καλό κώδικα.

Ένα καλός και αποδοτικός τρόπος για να μάθει κανείς recursion είναι μέσα από συναρτησιακές γλώσσες. Κατά τα άλλο στις υπόλοιπες είναι λίγο ψιλο-ανούσιο και πολλές φορές προβληματικό.

simeon.mattes
17-07-08, 21:24
οκ, αλλη ερωτηση:
σε C πως κανουμε μια συναρτηση να τυπωσει τον εαυτο της......


;):p

Τι εννοείς να τυπώνει τον εαυτό της;

bxenos
18-07-08, 00:11
Στο προγραμματισμό θα έβαζα οπωσδήποτε το recursion, μιας και απο προσωπική εμπειρία στο μεταπτυχιακό, ήταν ένα τμήμα που οι περισσότεροι δεν μπορούσαν να το "χωνέψουν" και να το κάνουν κτήμα τους, όχι απλά να το καταλάβουν, αλλά να το χρησιμοποιούν όποτε χρειάζεται ως εργαλείο για πιο καλό κώδικα.

:oneup:συμφωνω οτι ειναι ενα απο τα πιο μπελαλιδικα θεματα...

μια που το αναφερει και ο τιτλος του thread και τεθηκε το θεμα με τα recursions να ριξω και εγω την αποψη μου:
τα μαθηματικα τα θεωρω απαραιτητα στα εξεις:
α) κατανοηση recursion (με την εμπειρια απο σειρές και ακολουθιες και επαγωγικη μεθοδο)
β) σωστο ορισμο πραξεις και συνθηκων (δηλαδη οχι παρανομαστες 0, οχι overflow κτλ)

xhaos
18-07-08, 12:46
Τι εννοείς να τυπώνει τον εαυτό της;

μια συναρτηση πχ

printmyself(){
bla bla bla

}

Η οποια θα τυπωνει ολοκληρο τον εαυτο της μια φορα (οχι μονο το περιεχομενο της)
δηλαδη θα εχει σαν εξοδο το:

printmyself(){
bla bla bla

}

simeon.mattes
18-07-08, 14:21
μια συναρτηση πχ

printmyself(){
bla bla bla

}

Η οποια θα τυπωνει ολοκληρο τον εαυτο της μια φορα (οχι μονο το περιεχομενο της)
δηλαδη θα εχει σαν εξοδο το:

printmyself()
bla bla bla

}

Αυτό είναι πολύ εύκολο να γίνει στη Haskell....Τώρα στη C ...Αν καταλαβαίνω καλά να γράφεις


print (function)

και να σου τυπώνει ανάλογα σε ποια συνάρτηση αναφέρεσαι το όνομα και το περιεχόμενό της

π.χ.


int add (int a,int b)
{
return (a+b);
}

printf("%d",add(2,5)); // έξοδος: 7
printf("%s",print(add));
/* έξοδος:
int add (int a,int b)
{
return (a+b);
}
*/

bxenos
18-07-08, 19:51
μια συναρτηση πχ

printmyself(){
bla bla bla

}
Η οποια θα τυπωνει ολοκληρο τον εαυτο της μια φορα (οχι μονο το περιεχομενο της)
δηλαδη θα εχει σαν εξοδο το:

printmyself(){
bla bla bla

}

και η λυση ακολουθει:


#include <stdio.h>

//αυτος ειναι ο κωδικας που υποχρεωνει τις συναρτησεις που οριζονται μεσω της
//Func_Def να τυπωνουν τον εαυτο τους
#define Func_Def(function_name,function_body) \
function_name { \
fprintf(stderr,"%s\n",#function_name ); \
fprintf(stderr,"%s\n",#function_body ); \
function_body; \
}

//εδω οριζω μια χαζοσυναρτηση για παραδειγμα
Func_Def( \
void foo(void), \
{ \
printf("I am a function"); \
} \
);

//να και η main μου
void main(void){
foo(); //ας καλεσω την συναρτηση για να μας αναφερθει...
}


Οταν θελω να ορισω συναρτηση αντι να γραψω

void foo(void) {
printf("i am a function");
}

χρησιμοποιω το

Func_def(void foo(void), { printf("I am a function\n";});ή πιο κομψα γραμμενο σε πολλες γραμμες οπως το εχω στο μπλοκ κωδικα παραπανω...

οποτε αν καλεσεις foo() σε οποιοδηποτε σημειο, θα τυπωσει ολα της τα ...εσωψυχα....

θα δοκιμασω να ανεωβασω screen shots στο εμομενο μηνυμα

bxenos
18-07-08, 19:56
τυπωμα προγραμματος στην κονσολα:
http://www.adslgr.com/forum/attachment.php?attachmentid=40597&stc=1&d=1216400047

μεταγλωττιση/συνδεση (compile/link με microsoft dev studio 97)
αλλα δεν θεωρω προβλημα τους ansi, διοτι το '#' που χρησιμοποιω ειναι well defined στο ansi
http://www.adslgr.com/forum/attachment.php?attachmentid=40598&stc=1&d=1216400047

εκτελεση προγραμματος
http://www.adslgr.com/forum/attachment.php?attachmentid=40599&stc=1&d=1216400047

Φυσικα υπαρχει και η λυση να φτιαξεις μια συναρτηση που να διαβαζει το .lst αρχειο ή το .c/.cxx/.cpp αρχειο και να τυπωνει το περιεχομενο απο εκει, αλλα εγω προτιμω τις λυσεις με λιγοτερο γραψιμο και περισσοτερη σκεψη.

Τωρα ποσοι καταλαβαν τι εγινε παραπανω δεν το ξερω.
Αν εχετε απορειες ενημερωστε με.

simeon.mattes
18-07-08, 20:05
Να κάνω μία ερώτηση, ίσως λόγω αφέλειας...Η χρησιμότητά του ποια είναι;

anon
18-07-08, 20:16
debugging... ή για να μας την πεί ότι δεν το κάνει η C. Ουσιαστικά θα μπορούσε κάποιος να πεί εαν μπορούσε να γράψει κώδικα που να μεταβάλει τον εαυτό του, αλλά αυτό ειναι βασικά σε interpreted γλώσσες, όχι το πεδίο που βασικα παίζει η C. Δηλαδή να μπορεί το ίδιο το πρόγραμμα να αποτυπώσει τον κώδικα μιας function, και να μπορεί να το μεταβάλει δυναμικά και να κάνει use την νέα function. Μπέρδεμα; Ναι, εκτός εαν ξέρεις τι κάνεις. Πάντως αυτομεταβαλλόμενος κώδικας είναι πολύ πιο εύκολα buggy, δύσκολα κατανοητός απο άλλους και πιο δύσκολα γίνεται debugged.

bxenos
18-07-08, 20:38
Να κάνω μία ερώτηση, ίσως λόγω αφέλειας...Η χρησιμότητά του ποια είναι; εμενα ρωτας ή το xhaos;
το ζητησε ο xhaos και το εγραψα...


debugging... ή για να μας την πεί ότι δεν το κάνει η C.
...
εαν μπορούσε να γράψει κώδικα που να μεταβάλει τον εαυτό του, αλλά αυτό ειναι βασικά σε interpreted γλώσσες, όχι το πεδίο που βασικα παίζει η C.
βασικα, καποιος το ζητησε, ηταν μικρο σαν λυση, το εγραψα, δεν την ειπα σε κανεναν.
Οσο για τον μεταβλητο κωδικα, γινεται αλλα θα πρεπει να εχεις ετοιμο μεταγλωτισμενο κωδικα
ή να γραψεις τον δικο σου C interpreter/compiler ( ξερεις το yacc; )
Αυτο χρησιμοποιειται σε 2 περιπτωσεις:
α)κλειδωματα (haspaκια και τετοια)
β)μικροεπεξεργαστες, οπου καποιος εχει φτιαξει μια prom(ROM που προγραμματιζετε μια και μονο φορα) και
την συμπληρωνει ή μεταβαλει μερος μιας συναρτησης δυναμικα ή σε programmer. Χωρις να βγαλει το τσιπακι απο τη θεση του και χωρις να το πεταξει. Τωρα με τις flash μνημες, σπανια γινετε αυτο, αλλα ξαναπερναμε το firmware.

α...μην ξεχναμε τους πολυμορφικους ιους...

simeon.mattes
19-07-08, 12:03
εμενα ρωτας ή το xhaos;
το ζητησε ο xhaos και το εγραψα...


Όποιος να' ναι. Δεν έχω πρόβλημα. Βέβαια είναι εντυπωσιακό που γίνονται τέτοια στη C. Βέβαια και άλλα πολλά, αλλά που δύσκολα βλέπει κανείς κάθε μέρα

bxenos
19-07-08, 15:57
Γιατι το ζητησε ο xchaos; :hmm: χμμμ δεν το ξερω.

Τωρα γιατι το εγραψα εγω;
ειχε πλακα :cool: , μου θυμισε επιπλεον την σχολη μου (πριν αρκετα χρονια), οταν καποιοι καθηγητες βαζαν πονηρα προβληματακια.

Τωρα αν βοηθησω καποιον νεο ή παλιο προγραμματιστη να δει την C με αλλη σκοπια :idea:δεν το γνωριζω. Και δεν συμφωνω καθολου με ογκωδη βιβλια του τυπου C για αρχαριους/dummies/idiots που κυκλοφορουν και σε καθοδηγουν με τι τροπο να δουλεψεις.

η C ειναι μια λητη γλωσσα αλλα συχνα τοσο αγνωστη. πολλες φορες βλεπω ακομα και εμπειρους προγραμματιστες να γραφουν κωδικα σαν να δουλευουν σε basic.
εχει βαθια φωλιασμενες μεσα της αναδρομικες δομες, ξεκινωντας απο τον preprocessor της ακομα, που ειναι τρομερο εργαλειο.

π.χ. δες το #define που εγραψα. Παιρνει 2 παραμετρους, η μια ειναι το declaration της συναρτησης και η αλλη το Implementation (ολοκληρο το μπλοκ της συναρτησης δηλαδη).

simeon.mattes
19-07-08, 16:30
η C ειναι μια λητη γλωσσα αλλα συχνα τοσο αγνωστη. πολλες φορες βλεπω ακομα και εμπειρους προγραμματιστες να γραφουν κωδικα σαν να δουλευουν σε basic.
εχει βαθια φωλιασμενες μεσα της αναδρομικες δομες, ξεκινωντας απο τον preprocessor της ακομα, που ειναι τρομερο εργαλειο.

π.χ. δες το #define που εγραψα. Παιρνει 2 παραμετρους, η μια ειναι το declaration της συναρτησης και η αλλη το Implementation (ολοκληρο το μπλοκ της συναρτησης δηλαδη).

H C δεν είναι γλώσσα για τον μέσο προγραμματιστή γιατί είναι πολύ εύκολο να κάνει τραγικά λάθη και 2ον δεν συμφέρει οικονομικά στη συντήρηση της...εκτός βέβαια και αν ξέρει να φτιάχνει λειτουργικά συστήματα :p

Πράγματι...Αυτό το φώλιασμα στον preprocessor πρώτη φορά το βλέπω...βέβαια δεν είμαι και κανένας τρομερός...αλλά είναι πράγματι ενδιαφέρον. Βέβαια ακόμα δεν καταλαβαίνω τη χρησιμότητα της εκτύπωση του περιεχομένου της συνάρτησης.:hmm:

Ίσως βγούμε λίγο εκτός θέματος αλλά ήθελα λίγο αν γίνεται να αναλύσεις τον κώδικα. Όταν καλώ την foo() τι ακριβώς γίνεται και γιατί; Οι Func_Def, function_name, function_body είναι δεσμευμένες λέξεις;

bxenos
20-07-08, 07:27
H C δεν είναι γλώσσα για τον μέσο προγραμματιστή συμφωνω..., διοτι ο τιτλος προγραμματιστης εχει χαλασει, οποιος μπορει να κανει μια μασκα/διαλογο σε visual basic λεγεται πια προγραμματιστης. Οποιος θελει να μαθει προγραμματισμο, μπορει να μαθει οποιαδηποτε γλωσσα, αρκει να εχει θεληση. Οποιος θελει να εχει απλα τον τιτλο προγραμματιστης, οχι.
δεν συμφέρει οικονομικά στη συντήρηση της...
δηλαδη;;;; τι διαφορα εχει στην συντηρηση απο αλλες γλωσσες;
Παντως η C++ βοηθα πολυ τον αρχαριο να μην κανει "τρομερα" λάθη

Βέβαια ακόμα δεν καταλαβαίνω τη χρησιμότητα της εκτύπωση του περιεχομένου της συνάρτησης
ουτε και εγω

Όταν καλώ την foo() τι ακριβώς γίνεται και γιατί; Οι Func_Def, function_name, function_body είναι δεσμευμένες λέξεις;

οχι τα func_definition/name,body δεν ειναι δεμευτικα. απλα επεξειγηματικα.

π.χ. ας το ονομασω a_func:


#define a_func(n,b)\
n {\
printf("%s \n",#n);\
printf("%s \n",#b);\
b;\
}


εστω η συναρτηση max:


int max(int a,int b){
if(a<b)
return b;
return a;
}


θα την γραψω:


//αρχη "κλησης" της a_func
a_func(
//εδω ξεκινα η αρχη παραμετρου n της a_func
int max(int a,int b)
//τελος παραμετρου n της a_func
,
//εδω ξεκινα η αρχη παραμετρου b της a_func
{
if (a<b)
return b;
return a;
}
//τελος παραμετρου b της a_func
)
//τελος κλησης της a_func


τι θα κανει ο preprocessor οταν θα παει να μεταφρασει τον τελευταιο κωδικα που εγραψα παραπανω;

θα παραγει τον εξεις κωδικα:


int max(int a,int b) //αυτο το εγραψα στην max
{//αυτο το εβαλε η a_func
printf("%s \n","int max(int a,int b)");//αυτο το εβαλε η a_func
printf("%s \n"," { if (a<b) return b; return a; }");//αυτο το εβαλε η a_func
{//αυτο το εγραψα στην max
if (a<b) //αυτο το εγραψα στην max
return b;//αυτο το εγραψα στην max
return a;//αυτο το εγραψα στην max
}//αυτο το εγραψα στην max
}//αυτο το εβαλε η a_func

δηλαδη στην συναρτηση max, θα προσθεσει τις δυο εντολες printf στην αρχη και θα ενφολιασει το block της συναρτησης στο block με τα δυο printf. δεν θα πειραξει τιποτε αλλο.

να θυμισω οτι η εντολη
#b στον preprocessor βαζει διπλα εισαγωγικα στο περιεχομενο της b.
αν
b ειναι κδφηγ κξδφηγδκξ

#b γινεται "κδφηγ κξδφηγδκξ"
και
αν
b ειναι 3.14

#b γινεται "3.14"

να θυμισω επισεις οτι το συμβολο
\
χρησιμοποιειται οταν θελω περισσοτερες απο μια γραμμες να ερμηνευθουν απο τον preprocessor σαν μια.
δηλαδη ενα #define πρεπει να πιανει μια γραμμη, αν θελω να εχει και δευτερη, πρεπει στο τελος της πρωτης να βαλω την αναποδη καθετο. Αν θελω και τριτη, στο τελος της δευτερης πρεπει να βαλω αναποδη καθετο κτλ.

να ενα snapshot απο linux του προγραμματος
http://www.adslgr.com/forum/attachment.php?attachmentid=40737&stc=1&d=1216530930
να και το snapshot απο την εξοδο του preprocessor στο linux
http://www.adslgr.com/forum/attachment.php?attachmentid=40736&stc=1&d=1216530373

Ελπιζω να εγινα κατανοητος

anon
20-07-08, 10:53
Aυτό που ίσως δεν καταλαβαίνουν κάποιοι είναι ότι με την define στην C ουσιαστικά περνάς μέσα στο executable σταθερές τιμές. Στην συγκεκριμένη περίπτωση, ολόκληρο το string που είναι η συγκεκριμένη fuction. Φυσικά όταν μέσα στον κώδικά σου χρησιμοποιήσεις κάποια define, αυτή αναλύεται εκεί, σαν να γίνεται copy / paste περνώντας απο τον compiler οπότε ουσιαστικά με αυτό τον τρόπο γίνεται εκτελέσιμη. Ετσι υπάρχει μέσα στο εκτελέσιμο δυο φορές, μια ως εκτελέσιμος κώδικας όπως έχει γίνει απο τον compiler και μια ως string μέσα στον source κώδικα. Συμφωνώ ότι η C ειναι μια πάρα πολύ ισχυρή γλώσσα, γιαυτούς που ξέρουν να την δουλεύουν όμως.

simeon.mattes
20-07-08, 12:24
H C δεν είναι γλώσσα για τον μέσο προγραμματιστή συμφωνω..., διοτι ο τιτλος προγραμματιστης εχει χαλασει, οποιος μπορει να κανει μια μασκα/διαλογο σε visual basic λεγεται πια προγραμματιστης. Οποιος θελει να μαθει προγραμματισμο, μπορει να μαθει οποιαδηποτε γλωσσα, αρκει να εχει θεληση. Οποιος θελει να εχει απλα τον τιτλο προγραμματιστης, οχι.
δεν συμφέρει οικονομικά στη συντήρηση της...
δηλαδη;;;; τι διαφορα εχει στην συντηρηση απο αλλες γλωσσες;
Παντως η C++ βοηθα πολυ τον αρχαριο να μην κανει "τρομερα" λάθη



Καλά έχω ψιλοχαζέψει...Θα κάτσω να το μελετήσω διότι με μία μόνο ανάγνωση υπάρχουν αρκετές απορίες...Πάντως ευχαριστώ :oneup:

Όταν λέω για συντήρηση εννοώ στο να διορθώνει κάποιος και να πειράζει κώδικα...Η C++ είναι C...επομένως δεν την βάζω στο παιχνίδι...Η μόνη γλώσσα που έχω δει που είναι ιδιαίτερα αποδοτική στο να μην γίνονται σφάλματα είναι η Haskell, Erlang, ML...Κυρίως όμως οι δύο πρώτες. Το κόστος; Η ταχύτητα βέβαια. Πράγματι ένα πρόγραμμα γραμμένο σε C μπορεί να κάνει 1 λεπτό και το αντίστοιχο σε Haskell 2-3 λεπτά. Όμως ο χρόνος προγραμματισμού στη Haskell μπορεί να είναι υπό τριπλάσιος ή και και πολύ λιγότερος από αυτό της C και αυτό επειδή σαν αγνές συναρτησιακές γλώσσες δε σου επιτρέπουν να πειράζεις πράγματα απαγορευμένα...όπως μνήμης, registers κλπ

Haskell (http://www.haskell.org/haskellwiki/Introduction)
Video (http://www.haskell.org/haskellwiki/Video_presentations)

Με αυτές τις γλώσσες, σαν περιγραφικές που είναι, εστιάζεις στο πρόβλημά σου και όχι στον τρόπο υλοποίησης. Βέβαια δεν είναι ούτε xml, html, sql...Είναι κάτι παραπάνω και κάτι λιγότερο από τις προστακτικές γλώσσες όπως C, Java, C++...

bxenos
20-07-08, 13:43
Aυτό που ίσως δεν καταλαβαίνουν κάποιοι είναι ότι με την define στην C ουσιαστικά περνάς μέσα στο executable σταθερές τιμές. δεν εχεις δικιο, περνας και κωδικα

στο να περνας σταθερες τιμες θα αρκουσε η const ή η define οπως την περιγραφουν στα βιβλια για αρχαριους.
Εδω παραγει και κωδικα. Εχει μεν φτιαξει τις σταθερες χωρις να χρειαστει να τις ξαναγραψω, αλλα προσθετει και εντολες για την εκτυπωση τους. Ουσιαστικα ξαναφτιαχνει την συναρτηση με διαφανο για τον προγραμματιστη τροπο.

κωδικας γινεται και στο απλο παραδειγμα:

#define max(a,b) (a<b?a:b) που συνηθως φτανουν καποια βιβλία αλλα μέχρι εκεί

και για να το πω αλλιως, η C πριν αρκετα χρονια ειχε προβλεψει την αναγκη για inline συναρτησεις είτε για λογους ταχύτητας είτε για λογους απλοποίησης γραψιματος (για να μειωθει το copy/paste - υποθετω οτι και οι σχεδιαστες της και οι χρηστες της ειμαστε λιγο τεμπελιδες στο γραψιμο κωδικα).



Όταν λέω για συντήρηση εννοώ στο να διορθώνει κάποιος και να πειράζει κώδικα...Η C++ είναι C...επομένως δεν την βάζω στο παιχνίδι...
η C++ ειναι μια αντικειμενοστραφης γλωσσα που δεν εχει σκοπο να σε αφησει να πειραζεις (οχι οτι θα δυσκολευτεις πολυ αν το θελησεις) αλλα εχει αυξησει πολυ τον βαθμο προστασιας του προγραμματιστη. Με τα αντικειμενα δουλευουν πια ολοι οι προγραμματιστες γιατι προσφερουν πολυ μεγαλη ευκολια συντηρησης. Να σου πω ενα παραδειγμα. Αν εχω ενα αντικειμενο με ονομα window, απο αυτο προκυπτουν πιο εξελιγμενα αντικειμενα, οπως EDITBOX, COMBOBOX,...DIALOG,FRAMEWINDOW. Αν θελω να φυγω απο προγραμματισμο σε ενα περιβαλλον και να παω σε αλλο (πχ απο windows-sdk σε kde), δεν θα ξαναγραψωτον κωδικα απο την αρχη αλλα θα επανατοποθετησω το αντικειμενο παραθυρο στο νεο περιβαλλον και τα υπολοιπα θα ακολουθησουν. αρα η C++ βολευει στην συντηρηση (περισσοτερο απο τη C)


Η μόνη γλώσσα που έχω δει που είναι ιδιαίτερα αποδοτική στο να μην γίνονται σφάλματα είναι η Haskell, Erlang, ML...Κυρίως όμως οι δύο πρώτες.
Δεν τις γνωριζω, δεν μπορω να απαντησω. Μολις τελειωσω κατι χρονοβορες εργασιες που εχω λεω να ψαξω την python και θα κοιταξω και αυτες που ανεφερες

και αυτό επειδή σαν αγνές συναρτησιακές γλώσσες δε σου επιτρέπουν να πειράζεις πράγματα απαγορευμένα...όπως μνήμης, registers κλπ

στις εφαρμογες δεν χρειαζεται να το κανεις αυτο (να πειραζεις), προσωπικα τετοια "παιχνιδια" χρησιμποιουσα
α) οταν οι καρτες γραφικων ηταν μονοχρωμες hercules και δεν υπηρχε καποιο τυποποιημενο συστημα γρηγορης προσβασης στην οθονη,
β) στα κλειδωματα (οπως σωστα ειπε και ο anon για αυτομετβαλλομενο κωδικα
γ) στους μικροεπεξεργαστες (αυτοματισμους) οπου δεν υπαρχει pc αλλα ενα τσιπακι με μερικα περιφερειακα.
και υποθετω και στα λειτουργικα συστηματα οταν ασχολουμαστε με τον πυρηνα θα χρειαζεται



have fun both of you:rowwing:

simeon.mattes
20-07-08, 14:21
Όταν λέω για συντήρηση εννοώ στο να διορθώνει κάποιος και να πειράζει κώδικα...Η C++ είναι C...επομένως δεν την βάζω στο παιχνίδι...
η C++ ειναι μια αντικειμενοστραφης γλωσσα που δεν εχει σκοπο να σε αφησει να πειραζεις (οχι οτι θα δυσκολευτεις πολυ αν το θελησεις) αλλα εχει αυξησει πολυ τον βαθμο προστασιας του προγραμματιστη. Με τα αντικειμενα δουλευουν πια ολοι οι προγραμματιστες γιατι προσφερουν πολυ μεγαλη ευκολια συντηρησης. Να σου πω ενα παραδειγμα. Αν εχω ενα αντικειμενο με ονομα window, απο αυτο προκυπτουν πιο εξελιγμενα αντικειμενα, οπως EDITBOX, COMBOBOX,...DIALOG,FRAMEWINDOW. Αν θελω να φυγω απο προγραμματισμο σε ενα περιβαλλον και να παω σε αλλο (πχ απο windows-sdk σε kde), δεν θα ξαναγραψωτον κωδικα απο την αρχη αλλα θα επανατοποθετησω το αντικειμενο παραθυρο στο νεο περιβαλλον και τα υπολοιπα θα ακολουθησουν. αρα η C++ βολευει στην συντηρηση (περισσοτερο απο τη C)


Η μόνη γλώσσα που έχω δει που είναι ιδιαίτερα αποδοτική στο να μην γίνονται σφάλματα είναι η Haskell, Erlang, ML...Κυρίως όμως οι δύο πρώτες.
Δεν τις γνωριζω, δεν μπορω να απαντησω. Μολις τελειωσω κατι χρονοβορες εργασιες που εχω λεω να ψαξω την python και θα κοιταξω και αυτες που ανεφερες

Η C++ είναι συνέχεια της C...τώρα αν έχεις τη δυνατότητα να χρησιμοποιείς και αντικειμενοστραφή προγραμματισμό αυτό είναι άλλο θέμα. Ναι πράγματι σε βοηθάει αλλά δε σου απαγορεύει...Οι γλώσσες που ανέφερα όπως Haskell, απλά σου απαγορεύουν. Ένα πολύ παράδειγμα είναι ότι δεν επιτρέπει references, κοινός δείκτες, global μεταβλητές. Τώρα και η Java τα ίδια δεν κάνει....Όμως είναι κάτι παραπάνω από Java.

Θα αναφέρω μόνο ένα μικρό παράδειγμα
C, C++, Java (πάρτε ό,τι θέλετε το ίδιο είναι)


boolean bl;

int add(int a, int b)
{
if (bl==true)
bl=false;
return (a+b);
else
bl=true;
return (a)
}

main()
{
printf("%d",add(2,3)); //5
printf("%d",add(2,3)); //2
}

Είναι πραγματικά παλαβό :p. Να μην ξέρεις ότι κάτι, που λέγεται καταχρηστικά συνάρτηση, να μη βγάζει το ίδιο αποτέλεσμα όποτε και αν την καλέσεις....Στο παράδειγμα που ανέφερα υπάρχει side effect, δηλ παρεμβολή από τον έξω κόσμο (έξω από τη "συνάρτηση") από μια global μεταβλητή, την bl. Στη Haskell, Erlang (ML δυστηχώς γίνεται αλλά σε ταλαιπωρεί για να το κάνεις) που να χτυπιέσαι δεν γίνεται γιατί πολύ απλά δεν επιτρέπει side effects...δηλ. δεν επιτρέπει επικοινωνία με τον έξω κόσμο.

Τώρα η επικοινωνία με πληκτρολόγιο, οθόνη, random συναρτήσεις κλπ πως γίνεται....Με κάτι που τα ονομάζει monads, κάτι αντίστοιχο με τα streams που έχει η java αλλά πιο αποδοτικά.

bxenos
20-07-08, 14:48
εριξα μια ματια στην haskell στην ιστοσελιδα που ειπες και ειδα την πρωτη παραπλανητικη διαφημιση:

αναφερει


3.1 Quicksort in Haskell

qsort [] = []
qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter (>= x) xs)

3.2 Quicksort in C

void qsort(int a[], int lo, int hi) {
{
int h, l, p, t;

if (lo < hi) {
l = lo;
h = hi;
p = a[hi];

do {
while ((l < h) && (a[l] <= p))
l = l+1;
while ((h > l) && (a[h] >= p))
h = h-1;
if (l < h) {
t = a[l];
a[l] = a[h];
a[h] = t;
}
} while (l < h);

t = a[l];
a[l] = a[hi];
a[hi] = t;

qsort( a, lo, l-1 );
qsort( a, l+1, hi );
}
}



δηλαδη μας λεει οτι αν καποιος πρεπει να κανει ενα quick sort στην haskell θα το γραψει σε δυο γραμμες ενω σε C σε πεντακοσιες.
Ποιο ειναι το ψεμα, οπως εχει η haskell ετοιμη εντολη qsort ετσι εχει και η C

ακολουθει ο κωδικας σε C (στην βιβλιοθηκη stdlib.h


#include <stdlib.h>
int cmp(int a,int b) {
return a - b;
}
qsort(a,0,N,cmp);



Θα αναφέρω μόνο ένα μικρό παράδειγμα
C, C++, Java (πάρτε ό,τι θέλετε το ίδιο είναι)

Είναι πραγματικά παλαβό :p. Να μην ξέρεις ότι κάτι, που λέγεται καταχρηστικά συνάρτηση, να μη βγάζει το ίδιο αποτέλεσμα όποτε και αν την καλέσεις....

αμα θελεις να κανεις λαθος, μπορεις να το κανεις σε οποιοδηποτε γλωσσα.:lol:

simeon.mattes
20-07-08, 15:08
εριξα μια ματια στην haskell στην ιστοσελιδα που ειπες και ειδα την πρωτη παραπλανητικη διαφημιση:

αναφερει


δηλαδη μας λεει οτι αν καποιος πρεπει να κανει ενα quick sort στην haskell θα το γραψει σε δυο γραμμες ενω σε C σε πεντακοσιες.
Ποιο ειναι το ψεμα, οπως εχει η haskell ετοιμη εντολη qsort ετσι εχει και η C


Θα αναφέρω μόνο ένα μικρό παράδειγμα
C, C++, Java (πάρτε ό,τι θέλετε το ίδιο είναι)

Είναι πραγματικά παλαβό . Να μην ξέρεις ότι κάτι, που λέγεται καταχρηστικά συνάρτηση, να μη βγάζει το ίδιο αποτέλεσμα όποτε και αν την καλέσεις....

αμα θελεις να κανεις λαθος, μπορεις να το κανεις σε οποιοδηποτε γλωσσα.



Όχι βρε...H quicksort δεν είναι ενσωματωμένη στη γλώσσα. Αλλά ακόμα και αν είναι σε καμία βιβλιοθήκη αυτός είναι ο κώδικας για να κάνεις quicksort. Γίνεται σε 2 γραμμές. Απλά γίνεται αναδρομικά. Δεν υπάρχει for loops, δεικτες κλπ


Ναι έχεις δίκιο. Αν θες να κάνεις λάθος γίνεται παντού. Απλά σε αυτές που ανέφερα γίνεται πιο δύσκολα.

bxenos
20-07-08, 15:52
Όχι βρε...H quicksort δεν είναι ενσωματωμένη στη γλώσσα.
μαλιστα.... ενδιαφερον. και απο οτι ειδα εχει και compiler.
οσο για το θεμα ταχυτητας που ανεφερες οπως ειμαι βεβαιος οτι γνωριζεις δεν επηρεαζει το συντριπτικα μεγαλο ποσοστο των εφαρμογων, το οποιο δεν ενδιαφερονται για ταχυτητα.
εκει που εχει σημασια η ταχυτητα, εχουμε και αυτο...:whip: το εργαλειο.

simeon.mattes
20-07-08, 16:29
μαλιστα.... ενδιαφερον. και απο οτι ειδα εχει και compiler.
οσο για το θεμα ταχυτητας που ανεφερες οπως ειμαι βεβαιος οτι γνωριζεις δεν επηρεαζει το συντριπτικα μεγαλο ποσοστο των εφαρμογων, το οποιο δεν ενδιαφερονται για ταχυτητα.
εκει που εχει σημασια η ταχυτητα, εχουμε και αυτο...:whip: το εργαλειο.

Ακριβώς...Γι' αυτό μίλησα για θέμα συντήρησης. Αυτή και η erlang είναι οι μοναδικές γλώσσες που έχω δει που παρέχουν τόση μεγάλη ευκολία γραψίματος, αξιοπιστίας με λίγο κόπο και χρόνο. Και ειδικά για τις περισσότερες εφαρμογές μπορούν να αντικαταστήσουν όλες τις γνωστές προστακτικές γλώσσες. Βέβαια το κακό είναι ότι δεν χρησιμοποιούνται γιατί οι περισσότεροι ακούνε συναρτησιακό προγραμματισμό και τρέχουν :p. Το καλό τουλάχιστον με τη Haskell είναι ότι έχει σαν σκοπό να είναι προσιτή σε όλους και γι' αυτό έχει notation sugar για όλα τα γούστα...Θες να σκέφτεσαι σαν μαθηματικός, σαν προγραμματιστής κλπ? Ο,τι θες. Οι μόνες εταιρείες που ξέρω πως τη χρησιμοποιούν είναι στις USA, και αυτές μετρημένες στα δάκτυλα, και σε πολύ καλά πανεπιστήμια σαν πρώτη γλώσσας εκμάθησης. Το παράξενο δε είναι ότι έχει ξεκινήσει από 1988 αν θυμάμαι καλά με πρώτο εμπροικό compiler το 1998...Βέβαια λίγοι την ξέρουν.


Και κάτι επιπλέον...Είναι το μοναδικό site που έχει forum με τόσο καλή υποστήριξη. Έχω κάνει τρελές ερωτήσεις και έχω πάρει τεκμηριωμένη και σοβαρή απάντηση και βέβαια τα πάντα είναι δωρεάν! Μπορείς να το δοκιμάσεις.

Haskell-cafe (http://www.haskell.org/mailman/listinfo/haskell-cafe)

anon
21-07-08, 12:49
Eγω προσωπικά προτιμώ την C γιατί στα χέρια ενός ικανού προγραμματιστή μπορείς να κάνεις πράγματα που δεν μπορείς σε άλλες γλώσσες ή πολύ δύσκολα, μιας και όλες οι πολύ "προηγμένες" γλώσσες, ουσιαστικά έχουν περιορισμούς για να "προστατέψουν" τον προγραμματιστή. Μπορεί οι προηγμένες γλώσσες να αυτοματοποιούν κάποιες διαδικασίες υποτίθεται ρουτίνας, αλλά με μεγάλο κόστος. Πχ garbage collection κάνεις και στην C, χειροκίνητα. Ειναι κακό αυτό; Ισως επειδή βάζεις κώδικα δικό σου, και στα χέρια ενός όχι και τόσο ικανού προγραμματιστή, μπορείς να έχεις memory leaks. Απο την άλλη έχεις προβλέψιμη συμπεριφορά, και ανταπόκριση, και όχι όποτε του καπνίσει του GC να αρχίζει να μαζεύει. Μάλιστα θυμαμαι μια καλούτσικη βιβλιοθήκη που ήταν άρθρο στο DrDobbsJournal για malloc που έκανε και defrag στα τμήματα μνήμης που έπιανες ώστε να μην ξοδεύεις άσκοπα μνήμη.....

Τώρα όσον αφορά γλώσσες που μπορείς να γράψεις συμπαγή και πολύ συνοπτικό κώδικα, εντάξει υπάρχουν πολλές. Πχ στα πρώτα χρόνια μου στο πανεπιστήμιο είχα ασχοληθεί και με APL. OK, μπορούσες σε μια γραμμή να κάνεις ότι σε άλλες γλώσσες σε 100, αλλά δεν νομίζω ότι αυτό μόνο αρκεί
(Για όσους θέλουν να φρικάρουν με APL δείτε εδώ (http://www.users.cloud9.net/~bradmcc/APL.html))

@simmeon.mattes Νομίζω erlang πρέπει να χρησιμοποιούν εταιρίες κινητής.

Thuglife
21-07-08, 13:08
Η γλώσσα για πραγματικούς προγραμματιστές είναι μία (http://en.wikipedia.org/wiki/Brainfuck).

anon
21-07-08, 13:24
Thanks thuglife! Η απόλυτη γλώσσσα!!!! και τα μυαλά στα κάγκελα... :p :p :p :p

Thuglife
21-07-08, 13:28
Hello World

++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.

:lol:

bxenos
21-07-08, 14:30
Hello World

++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.

:lol:
o παραπανω κωδικας σε δεκαεξαδικο (ειπα να το κανω σε δυαδικο αλλα θα μακρενε πολυ...)


2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 5b 3e 2b 2b 2b 2b 2b
2b 2b 3e 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 3e 2b 2b 2b
3e 2b 3c 3c 3c 3c 2d 5d 3e 2b 2b 2e 3e 2b 2e 2b 2b
2b 2b 2b 2b 2b 2e 2e 2b 2b 2b 2e 3e 2b 2b 2e 3c 3c
2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2e 3e
2e 2b 2b 2b 2e 2d 2d 2d 2d 2d 2d 2e 2d 2d 2d 2d 2d
2d 2d 2d 2e 3e 2b 2e 3e 2e 00
:offtopic:http://www.avsite.gr/vb/attachment.php?attachmentid=14919&d=1216591297

xhaos
21-07-08, 21:02
βασικα ο λογος που το ανεφερα ηταν για να καταλαβει το παιδι τι "καμενο" πραγμα ειναι οι προγραμματιστες. δεν το λεω για να θυξω κανενα, και εγω τετοιος ειμαι:)

simeon.mattes
24-07-08, 08:15
Τώρα όσον αφορά γλώσσες που μπορείς να γράψεις συμπαγή και πολύ συνοπτικό κώδικα, εντάξει υπάρχουν πολλές. Πχ στα πρώτα χρόνια μου στο πανεπιστήμιο είχα ασχοληθεί και με APL. OK, μπορούσες σε μια γραμμή να κάνεις ότι σε άλλες γλώσσες σε 100, αλλά δεν νομίζω ότι αυτό μόνο αρκεί
(Για όσους θέλουν να φρικάρουν με APL δείτε εδώ (http://www.users.cloud9.net/~bradmcc/APL.html))

@simmeon.mattes Νομίζω erlang πρέπει να χρησιμοποιούν εταιρίες κινητής.

Ναι η erlang είναι δημιούργημα της ericson. Βέβαια έχω ακούσει από πολλούς ότι γι' αυτό χρησιμοποιείται στην κινητή τηλεφωνία. Όμως γιατί συναρτησιακό προγραμματισμό και όχι κάτι άλλο;

Όσον αφορά για την APL, απ' ότι είδα είναι array programming language και αν καταλαβαίνω καλά μοιάζει πολύ σε λογική με Matlab. Βέβαια κάποια παραδείγματα που κοίταξα η σημειογραφία που χρησιμοποιεί είναι για μαθηματικούς. (αν κάνω λάθος διόρθωσέ με :p). Όπως όμως είπα και προηγούμενος η Haskell είναι για όλα τα γούστα. Μαθηματικούς ή μη. Ο συναρτησιακός προγραμματισμός βοηθάει κάποιον να αποκτήσει πιο ελεύθερο και sophisticated τρόπο σκέψης επίλυσης προβλημάτων.

Συμφωνώ επίσης αυτό που λες για τη C. Αλλά αμφιβάλλω αν στους 100 προγραμματιστές οι 5 ξέρουν ουσιαστικά να προγραμματίζουν σε C

The King
01-10-13, 12:35
Από τα πιο ενδιαφέροντα threads για εμένα, το οποίο βρήκα τυχαία θαμμένο προχθές.

Θα συμφωνήσω απόλυτα με την πιο ώριμη και σωστά τεκμηριωμένη άποψη (http://www.adslgr.com/forum/threads/191825-%CE%9C%CE%B1%CE%B8%CE%B7%CE%BC%CE%B1%CF%84%CE%B9%CE%BA%CE%B1-%CE%BA%CE%B1%CE%B9-%CE%A0%CF%81%CE%BF%CE%B3%CF%81%CE%B1%CE%BC%CE%BC%CE%B1%CF%84%CE%B9%CF%83%CE%BC%CE%BF%CF%82?p=2189055#post2189055) του @anon, ιδίως στις 3 τελευταίες παραγράφους.

..ουσιαστικά κάνω bump μετά από 5 χρόνια :)

@ ADSLgr.com All rights reserved.