DedSec Project

d — συγκεντρωτικός οδηγός — DedSec Project

d — συγκεντρωτικός οδηγός D Βασική ιδέα Η D είναι compiled systems γλώσσα με static typing, templates, ranges και διάφορες μεθόδους memory management. Μικρό εκπαιδευτικό απόσπασμα Άσκηση…

D

Βασική ιδέα

Η D είναι compiled systems γλώσσα με static typing, templates, ranges και διάφορες μεθόδους memory management.

Μικρό εκπαιδευτικό απόσπασμα

import std.stdio;
void main() { writeln(2 + 3); }

Άσκηση βασισμένη στη συγκεκριμένη συμπεριφορά

Εντόπισε το entry point, πρόσθεσε range operation και σύγκρινε allocations σε profiler.

Διάγνωση και όρια

Οι GC και @nogc περιορισμοί απαιτούν ρητό σχεδιασμό· μην ισχυρίζεσαι μηδενικά allocations χωρίς μέτρηση.

Κάνε την άσκηση με πραγματικά δοκιμαστικά δεδομένα και με έκδοση D που ταιριάζει στον κώδικα. Σημείωσε μία αρχική πρόβλεψη και την πραγματική έξοδο. Για περίπλοκο ή μη διαθέσιμο runtime, παρουσίασε τη στατική ανάλυση ως τέτοια, όχι ως επιτυχημένη εκτέλεση. Δοκίμασε ξεχωριστά την κανονική περίπτωση και μία οριακή τιμή, χωρίς πραγματικά προσωπικά ή παραγωγικά δεδομένα.

D — Αναλυτικός οδηγός εξάσκησης

Πραγματικό αρχικό δείγμα

import std.stdio;
string greet(string name) { return "Hello, " ~ name ~ "!"; }
void main() { writeln(greet("Ada")); }

Περιβάλλον: dmd hello.d -of=hello && ./hello.. Επιβεβαίωσε ότι έχεις το σωστό compiler, host ή simulator πριν θεωρήσεις την έξοδο αξιόπιστη. Για scripts με πρόσβαση σε προσωπικά αρχεία ή ρυθμίσεις, χρησιμοποίησε προσωρινά και read-only δεδομένα.

Συγκεκριμένος στόχος υλοποίησης

Φτιάξε dynamic array, χρησιμοποίησε std.algorithm filter/map και εξέτασε allocation. Σύγκρινε @safe με @system σε μικρή function.

Κρίσιμο λάθος που πρέπει να αναγνωρίζεις

Η D συνδυάζει GC και manual memory· το @safe/@system αλλάζει επιτρεπόμενες πράξεις.

D — Διαδρομή ουσιαστικής εξάσκησης

Τι μοιράζονται τα slices

Ένας dynamic array στην D έχει length και δείχνει σε στοιχεία. Η δημιουργία slice δεν σημαίνει ότι αντιγράφεις αυτόματα όλα τα δεδομένα. Αν δύο views δείχνουν στα ίδια στοιχεία, η μεταβολή μέσω του ενός μπορεί να γίνει ορατή μέσω του άλλου.

import std.stdio;
void main() {
    int[] values = [10, 20, 30];
    int[] firstTwo = values[0 .. 2];
    firstTwo[0] = 99;
    writeln(values[0]);       // 99
    writeln(firstTwo.length); // 2
}

Η αναμενόμενη πρώτη εκτύπωση είναι 99 και η δεύτερη 2. Το firstTwo[2] βρίσκεται εκτός του slice, παρότι υπάρχει τρίτο στοιχείο στο αρχικό values. Το όριο ορίζεται από τη συγκεκριμένη όψη και όχι από το συνολικό storage.

Δημιουργία ανεξάρτητου αντιγράφου

Χρησιμοποίησε .dup για να κατασκευάσεις νέο array με αντιγραφή στοιχείων και άλλαξε την πρώτη του τιμή. Η αλλαγή δεν πρέπει να αγγίζει το values. Πρόσεξε τη διάκριση: η αντιγραφή του array μπορεί να είναι επιφανειακή αν τα ίδια τα στοιχεία είναι references σε άλλα μεταβλητά αντικείμενα.

Cleanup με scope guards

Η D διαθέτει scope(exit), το οποίο εκτελείται κατά την έξοδο από το τρέχον scope. Σε δοκιμαστική συνάρτηση γράψε scope(exit) writeln("cleanup"), δημιούργησε προσωρινή κατάσταση και προκάλεσε exception για να δεις πότε τρέχει το cleanup. Σημείωσε πως η στρατηγική διαχείρισης αρχείων ή δικτύου απαιτεί να γνωρίζεις ακριβώς ποιος κατέχει τον πόρο.

Μην παραβλέπεις compiler flags

Οι runtime bounds checks μπορούν να εξαρτώνται από έκδοση εργαλείου και build mode. Μην εξάγεις καθολικό συμπέρασμα ότι ένα πρόγραμμα είναι ασφαλές επειδή έτρεξε μία φορά χωρίς εμφανές σφάλμα. Χρησιμοποίησε controlled exception tests και έλεγξε την τεκμηρίωση του compiler.

Τεστ αποδοχής

Εκτέλεσε κενό slice, slice ακριβώς δύο στοιχείων, ένα εσκεμμένο invalid index και αλλαγή σε duplicated array. Παράδωσε DMD/LDC/GDC έκδοση, flags, πραγματικό output, και εξήγηση ownership. Διατήρησε το αποτυχημένο case χωριστό από τη φυσιολογική διαδρομή δοκιμών.