قائمة التغييرات في D 2.092. الاقتراض

من المترجم. عادة لا أقوم بترجمة مثل هذه المقالات ، لأنني لا أرى أي شيء مثير للاهتمام فيها. هنا ، هناك ابتكاران صغيران ولكنهما أكثر أهمية - دعم الربط المباشر لمكتبات C ++ ونظام "الاقتراض" للملكية والاقتراض من Rust (ابتلاع DFA الثاني ، ظهر الأول في GCC10 قبل يومين فقط ، ويفكر Nim في ذلك أيضًا) مع وصف. في الواقع ، لم أترجم أي قوائم مملة ، والروابط تؤدي إلى الأصل.

الإصدار السابق من القائمة 2.0.91.1 (الإنجليزية)
حيث تم تنزيل

2.092.0 مع 15 تغييرًا مهمًا و 44 إصلاحات وتحسينات للأخطاء. شكرا جزيلا للمساهمين الـ 47 الذين جعلوا هذا الإصدار ممكنا.

التغييرات المترجم


  1. -revert = import و -transition = checkimports رموز تبديل سطر الأوامر التي تمت إزالتها
  2. تمت إضافة دعم الترميز (mangling) لأسماء C ++ GNU ABI
  3. يتم تمييز منشئي ومدمري الوحدات غير الخارجية (D) عفا عليها الزمن
  4. DIP25 الانتهاكات التي تم تحديدها بشكل افتراضي عفا عليها الزمن
  5. الملكية النموذجية ونظام الاقتراض للمؤشرات
  6. وأضاف = معاينة وفي الخيار الذي يحول فئة تخزين في في CONST نطاق
  7. يتم الآن فحص معلمات Printf و scanf للتوافق مع محددات التنسيق
  8. متغير البيئة SOURCE_DATE_EPOCH مدعوم الآن.

تغييرات وقت التشغيل


  1. TypeInfo_Class/TypeInfo_Interface.isBaseOf C#/Java isAssignableFrom
  2. core.memory.pageSize minimumPageSize


  1. Date.isoWeekYear Date.fromISOWeek std.datetime.date
  2. std.xml
  3. std.digest.digest

Dub


  1. Dub lint --report-file

القائمة الكاملة للإصلاحات والتحسينات (الإنجليزية)

Prim.per.U paw me ، لأنه من المستحيل إعداد المحتويات الصحيحة للروابط في الصفحة إلى الكشف ، كما هو الحال في الأصل ، آسف = (

التغييرات المترجم


  1. مفاتيح التبديل الموجودة بسطر الأوامر -revert = import and -transition = checkimports تم حذفها.

    لم تفعل هذه المفاتيح شيئًا ، وتم اعتبارها قديمة لبعض الوقت. لن يتعرف عليها المترجم بعد الآن.
  2. () C++ GNU ABI

    GNU ABI C++11 GCC 5.1. D C++, DMD UDA ( ) gnuAbiTag, core.attribute object ( ). ABI , , ++ . , std::string C++11 (DMD -extern-std={c++11,c++14,c++17}).

    :

    extern(C++):
    @gnuAbiTag("tagOnStruct")
    struct MyStruct {}
    @gnuAbiTag("Multiple", "Tags", "On", "Function")
    MyStruct func();

    gnuAbiTag. ( ). UDA -extern-std=c++11. (-extern-std=c++98) UDA . UDA extern(C++) .
  3. , extern(D) .

    ( ) , extern(D), . , , / , , 479, 479, .

    , , .
  4. DIP25 .

    DIP25 2.067.0, , -preview=dip25. , , DIP1000.

    , , -preview=dip25, -preview=dip25. ( ).

    DIP25 , @ safe . , ref , return , .

    struct Foo
    {
        int x;
        // returning `this.x` escapes a reference to parameter `this`, perhaps annotate with `return`
        ref int method() /* return */ { return this.x; }
    }
    // returning `v` escapes a reference to parameter `v`, perhaps annotate with `return`
    ref int identity(/* return */ ref int v) { return v; }

    return . DIP25 .
  5. -preview=in in scope const.

    const scope, in . , in (. inout ) .

    -preview=in, :

    void fun(in int x);
    void fun(const int x);

    -preview=in, :

    void fun(in int x);
    void fun(scope const int x);
  6. printf scanf

    C99 7.19.6.1 printf 7.19.6.2 scanf.

    printf , . , .

    scanf .

    :

    1. ,
    2. ,
    3. — , s
    4. C99

    -, .

    .

    , printf/scanf, :

    printf("%k\n", value);  // error: non-Standard format k
    const format = "%k\n";
    printf(format.ptr, value);  // no error

    — . ,

    string s;
    printf("%.*s\n", s.length, s.ptr);
    printf("%d\n", s.sizeof);
    ulong u;
    scanf("%lld%*c\n", &u);

    :

    string s;
    printf("%.*s\n", cast(int) s.length, s.ptr);
    printf("%zd\n", s.sizeof);
    ulong u;
    scanf("%llu%*c\n", &u);

    printf scanf pragma(printf) printf pragma(scanf) scanf.

    , :

    1. extern (C ) extern (C++)
    2. const(char)*
    3. … -v , va_list ( «v» printf scanf)
    .

    «v»- .
  7. SOURCE_DATE_EPOCH

    SOURCE_DATE_EPOCH. UNIX ( 1970-01-01 00:00:00), . DMD __DATE__, __TIME__ __TIMESTAMP__ .



يضمن نظام الملكية / الاقتراض (المعروف أيضًا باسم OB) للمؤشرات أن المؤشرات غير المشار إليها تشير إلى كائن ذاكرة صالح.

نطاق نظام OB النموذج


هذا هو نموذج أولي لنظام OB ، تم تكييفه لـ D. مبدئيًا ، فهو مخصص فقط للمؤشرات ، وليس للمصفوفات الديناميكية أو مراجع الفئات أو المراجع أو حقول المؤشر في المجاميع. إن إضافة دعم من هذا النوع سيعقد التنفيذ ، ولكنه لا يغير جوهره ، لذلك ، تم تأجيله إلى وقت لاحق. يمكن لكائنات RAII إدارة ذاكرتها بأمان ، بحيث لا يتم تغطيتها بواسطة OB. بغض النظر عن الطريقة ، سواء كان المؤشر يخصص ذاكرة باستخدام GC أو بعض المخصصات الأخرى ، فهذا ليس مهمًا لـ OB ، فهي لا تختلف ويتم معالجتها بنفس الطريقة.

نظام OB نشط فقط في الوظائف المشروحة باستخدام السمة @ live. يتم تطبيقه بعد المعالجة الدلالية فقط كشيك لانتهاك قواعد المواد العضوية. لم يتم إضافة بناء الجملة الجديد. لا يتم إجراء تغييرات على التعليمات البرمجية التي تم إنشاؤها. إذا @ الحية وظائف الاتصال وظائف أخرى من @ العيش ، ومن المتوقع أن هذه الوظائف دعا ستكون @ live- اجهة متوافقة، على الرغم من أنها لم تختبر. إذا استدعت الدوال غير @ @ الدوال الحية ، فمن المتوقع أن تتبع الوسيطات التي تم تمريرها اصطلاحات @ الحية .

يكتشف نظام OB الأخطاء:

  • مؤشرات إلغاء الإشارة الموجودة في حالة غير صالحة
  • أكثر من مؤشر نشط إلى كائن ذاكرة متحور.

لن تكشف عن محاولات للإشارة إلى مؤشر فارغ أو ، ربما ، مؤشر فارغ. هذا لا يعمل ، حيث لا توجد حاليًا طريقة للتعليق على نوع كمؤشر غير قابل للإلغاء.

المبدأ الأساسي ل OB


يتبع تصميم OB المبدأ التالي:

لكل كائن ذاكرة ، يمكن أن يوجد مؤشر تحوير واحد بالضبط له ، أو عدة مؤشرات غير متحولة (للقراءة فقط).

التصميم


يسمى مؤشر متحور واحد "مالك" كائن الذاكرة. يمتلك بشكل عابر كائن ذاكرة وجميع الكائنات في الذاكرة التي يمكن الوصول إليها منه (أي الرسم البياني للكائنات). نظرًا لأنه المؤشر الوحيد لكائن الذاكرة هذا ، يمكنه إدارة الذاكرة بأمان (تغيير شكلها وتخصيصها وتحريرها وتغيير حجمها) دون ضرب التربة تحت أقدام أي مؤشرات أخرى (تحور أم لا) قد تكون عليها (الرسم البياني تشير الذاكرة).

إذا كانت هناك العديد من المؤشرات على رسم بياني لكائنات الذاكرة للقراءة فقط ، فيمكنها القراءة بأمان من دون القلق بشأن التغييرات المفاجئة في الرسم البياني للكائنات في الذاكرة.

تتعلق بقية تفاصيل التكنولوجيا بكيفية أن تصبح المؤشرات للقراءة فقط وباطلة ، وكيفية الحفاظ على المبدأ الأساسي ل OB.

المؤشرات المتعقبة
فقط المؤشرات التي تم التصريح عنها في الدالة @ الحية على هذا النحو ، يتم تتبع معلمات الدالة ، أو المتغيرات المحلية. لا يتم تتبع المتغيرات من الوظائف الأخرى ، حتى @ مباشرة ، لأن تحليل التفاعلات مع الوظائف الأخرى يعتمد تمامًا فقط على توقيع هذه الوظيفة ، وليس على الداخلية. لا يتم تعقب المعلمات الثابتة .

حالات
المؤشر كل مؤشر في إحدى الحالات التالية:

غير معرّف
المؤشر في حالة غير صالحة. يعد الإشارة إلى مثل هذا المؤشر خطأ.
المالك
المالك هو المؤشر الوحيد للرسم البياني للكائنات في الذاكرة. عادة ما يكون المؤشر - لا يمتلك المالك سمة نطاق . إذا تمت تهيئة المؤشر مع سمة النطاق بتعبير غير مشتق من المؤشر المتتبع ، فإنه يصبح المالك.
إذا تم تعيين مؤشر المالك لمؤشر آخر - المالك ، ينتقل الأول إلى حالة غير محددة.
اقترضت، استعارت
المؤشر المقترض هو مؤشر يصبح مؤقتًا المؤشر الوحيد للرسم البياني لكائنات الذاكرة. يمر إلى هذه الحالة من خلال التعيين من المؤشر - المالك ، بينما يمر المالك في حالة المقترض حتى يكتمل استخدام المؤشر المستعير.
يجب أن يحتوي المؤشر المستعير على سمة نطاق وأن يكون مؤشرًا لكائن قابل للتغيير.
للقراءة
فقط يتم تعيين فهرس للقراءة فقط من قبل المالك. طالما ظل مؤشر "للقراءة فقط" على قيد الحياة ، فلا يزال من الممكن تعيين مؤشرات "للقراءة فقط" فقط من هذا المالك. يجب أن يحتوي المؤشر للقراءة فقط على سمة نطاق ، كما يجب ألا يكون مؤشرًا لكائن قابل للتغيير.

مدى الحياة

تبدأ مدة عمر مؤشر "تم الاقتراض" أو "للقراءة فقط" من لحظة إلغاء الإشارة إليه أولاً (وليس من اللحظة التي تتم فيها تهيئة القيمة أو تعيينها) وتنتهي عند إلغاء الإشارة إلى القيمة في آخر مرة.

ومن المعروف أيضا مدى الحياة غير المعجمية .

انتقالات الحالة للمؤشرات

يغير المؤشر حالته عند تنفيذ إحدى هذه العمليات:

  • تم تخصيص ذاكرة لها (على سبيل المثال ، متغير محلي على المكدس) ، والذي يضع المؤشر في حالة غير محددة
  • التهيئة (تعتبر مهمة)
  • الواجب - يغير المصدر والهدف الحالة حسب الحالة التي هم فيها ، وكذلك على أنواعها وفئات التخزين
  • out ( ), , .
  • ref , , .
  • , .
  • - ()
  • , , .
  • , ,
  • , ,
  • ,


كونه نموذجًا أوليًا ، هناك العديد من الجوانب التي لم يتم أخذها في الاعتبار حتى الآن ، ولن تكون حتى يظهر النموذج الأولي أن هذا حل عملي.

أخطاء

نتوقع الكثير من الأخطاء. يرجى الإبلاغ عنها لبقزيلا ووضع علامة عليها بالكلمة الرئيسية "ob". ليست هناك حاجة للإبلاغ عن قيود أخرى مدرجة بالفعل هنا.

لا يتم تعقب مراجع الفئات والمصفوفات النقابية.
من المفترض أن يتم التحكم فيها بواسطة GC.

الاقتراض والقراءة من غير

المالكين يتم رصد المالكين للتأكد من عدم وجود تسربات ، ولكن ليس مؤشرات أخرى. يعتبر المقترضون مالكين إذا لم تتم تهيئتهم بمؤشر.

@live void uhoh()
{
    scope p = malloc();  // p is considered an Owner
    scope const pc = malloc(); // pc is not considered an Owner
} // dangling pointer pc is not detected on exit

يبدو أنه ليس من المنطقي وضع علامة على مؤشرات مثل النطاق ، ربما يمكن إصلاح ذلك عن طريق التعامل مع هذا على أنه خطأ.

تتم قراءة / كتابة المؤشرات بواسطة الدوال المتداخلة
.

@live void ohno()
{
    auto p = malloc();

    void sneaky() { free(p); }

    sneaky();
    free(p);  // double free not detected
}

استثناءات

يفترض التحليل أن الاستثناءات لا القيت.

@live void leaky()
{
    auto p = malloc();
    pitcher();  // throws exception, p leaks
    free(p);
}

أحد الحلول هو استخدام النطاق (الخروج) :

@live void waterTight()
{
    auto p = malloc();
    scope(exit) free(p);
    pitcher();
}

إما استخدام كائنات RAII أو استدعاء وظائف nothrow فقط.

المعلمات كسول

لا تؤخذ في الاعتبار.

التعقيد التربيعي

يوضح التحليل التعقيد التربيعي ، حاول إبقاء الوظائف الحية @ صغيرة.

مزج مجموعات

ذاكرة مختلفة دمج مجموعات ذاكرة مختلفة:

void* xmalloc(size_t);
void xfree(void*);

void* ymalloc(size_t);
void yfree(void*);

auto p = xmalloc(20);
yfree(p);  // should call xfree() instead

لم يتم الكشف عن.

يمكن التحايل على ذلك باستخدام تجمعات محددة لنوع معين:

U* umalloc();
void ufree(U*);

V* vmalloc();
void vfree(V*);

auto p = umalloc();
vfree(p);  // type mismatch

وربما لا تسمح بالتحويلات الضمنية لإلغاء * في الوظائف المباشرة @ .

وسيطات دالة متغيرة تعتبر

وسائط دالة متغيرة (على سبيل المثال ، printf) مستهلكة. في حين أن هذا آمن ، إلا أنه لا يبدو عمليًا للغاية وسيتطلب على الأرجح مراجعة.

تغييرات وقت التشغيل


  1. TypeInfo_Class/TypeInfo_Interface.isBaseOf C#/Java isAssignableFrom.

    TypeInfo_Class.isBaseOf true, , , , . isBaseOf, isAssignableFrom, , opAssign D — . TypeInfo_Interface.isBaseOf , TypeInfo_Class, TypeInfo_Interface.
  2. core.memory.pageSize minimumPageSize.

    pageSize .

    import core.memory : pageSize;
    ubyte[] buffer = new ubyte[pageSize];

    minimumPageSize .

    , . , . pageSize, .

    , , , : ubyte[minimumPageSize].

    import core.memory : minimumPageSize;
    ubyte[minimumPageSize] buffer;



  1. Date.isoWeekYear Date.fromISOWeek std.datetime.date

    ISO 8601 , Date and DateTime.

    ISO , . Date.fromISOWeek(2020, 11, DayOfWeek.mon) Date(2020, 3, 9).

    ISO , () .isoWeekYear Date ISO. , .isoWeekAndYear , .
  2. std.xml .

    std.xml . , , UndeaD. xml dub- dxml.
  3. std.digest.digest .

    2.076.1 . std.digest .

    std.digest.digest 2.101.

Dub


  1. .

    Posix , .dub. dub (, .swap.file.d), . , dub . , dub.

    , .
  2. Dub lint --report-file.

    Dub lint --report-file: dub lint --report-file report.json

All Articles