Δημοσιεύτηκε: 04 Δεκ 2011, 02:07
από migf1
Δημιουργία συναρτήσεων στο run-time δεν είναι trivial να γίνει σε plain C γιατί σε πλήρη αντίθεση με τη Perl, το run-time της C είναι low-level, δεν πατάει δηλαδή (και άρα δεν προϋποθέτει) πάνω σε κάποιο έτοιμο interpreter, framework, virtual machine, κλπ... πατάει απευθείας στο λειτουργικό με το ένα πόδι και απευθείας στο hardware με το άλλο. Οπότε είναι εξ΄ορισμού άστοχο να συγκρίνουμε το run-time της C με το run-time της Perl.

Μπορεί όμως να γίνει, φτιάχνοντας κι ενσωματώνοντας για παράδειγμα έναν minimal C-intepreter (ή χρησιμοποιώντας κάποιον έτοιμο) χρησιμοποιώντας τον ως minimal HL run-time environment για να δημιουργήσεις και συναρτήσεις και ότι θέλεις.

Ότι δηλαδή είναι η Perl, η Python, η Java, η C# και όλες οι μη directly compiled γλώσσες (interpreted/scripting). Παρεμπιπτόντως, γνωρίζεις φαντάζομαι πως (και) η Perl σε C είναι γραμμένη (και natively είναι procedural, άσχετα αν υποστηρίζει (αν και ολίγον άναρχα) πολλά είδη προγραμματισμού... δλδ και functional και oop ).

Για αυτό και σε προηγούμενα posts μου ανέφερα και frameworks και API's μαζί με τα libraries. Φυσικά μέσω των pointers μπορείς να διαχειριστείς στο run-time τιμές, abstract data objects, κλπ και στη C, απλά οι δείκτες σε συναρτήσεις έχουν συνειδητά επιλεγεί να μπορούν μεν να χρησιμοποιηθούν ως rvalues dereferenced, όχι όμως ως lvalues.... όσες φορές και να τους κάνεις dereference κάνουν αυτόματα drop-back σε referenced, γιατί ουσιαστικά δείχνουν απευθείας σε διεύθυνση που περιέχει κώδικα, στο DATA segment της raw μνήμης και όχι σε κάποιο ενδιάμεσο controlled περιβάλλον (αυτό ισχύει μονάχα για τους δείκτες συναρτήσεων, στους υπόλοιπους δείκτες κάνεις ότι θέλεις).

Μπορείς φυσικά να χρησιμοποιήσεις C++ αντί για C, που έχει στναταρισμένα περισσότερα εργαλεία, αλλά κι εκεί είναι challenging για τους ίδιους πάνω-κάτω λόγους ( btw στην επερχόμενη αναθεώρησή της η C++ θα υποστηρίζει lambda functions).

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

Πάντως μπορείς να πάρεις παραπλήσια αποτελεσματικότητα (και μάλιστα πολύ πιο optimized σε πόρους και ταχύτητα) χρησιμοποιώντας το global namespace της C ή της C++ ... επίσης, η D είναι μια φανταστική directly compiled γλώσσα, με φοβερές δυνατότητες κι επιδόσεις, η οποία όμως δυστυχώς βρίσκεται στο περιθώριο.