من المترجم. عادة لا أقوم بترجمة مثل هذه المقالات ، لأنني لا أرى أي شيء مثير للاهتمام فيها. هنا ، هناك ابتكاران صغيران ولكنهما أكثر أهمية - دعم الربط المباشر لمكتبات C ++ ونظام "الاقتراض" للملكية والاقتراض من Rust (ابتلاع DFA الثاني ، ظهر الأول في GCC10 قبل يومين فقط ، ويفكر Nim في ذلك أيضًا) مع وصف. في الواقع ، لم أترجم أي قوائم مملة ، والروابط تؤدي إلى الأصل.الإصدار السابق من القائمة 2.0.91.1 (الإنجليزية)حيث تم تنزيل2.092.0 مع 15 تغييرًا مهمًا و 44 إصلاحات وتحسينات للأخطاء. شكرا جزيلا للمساهمين الـ 47 الذين جعلوا هذا الإصدار ممكنا.التغييرات المترجم
- -revert = import و -transition = checkimports رموز تبديل سطر الأوامر التي تمت إزالتها
- تمت إضافة دعم الترميز (mangling) لأسماء C ++ GNU ABI
- يتم تمييز منشئي ومدمري الوحدات غير الخارجية (D) عفا عليها الزمن
- DIP25 الانتهاكات التي تم تحديدها بشكل افتراضي عفا عليها الزمن
- الملكية النموذجية ونظام الاقتراض للمؤشرات
- وأضاف = معاينة وفي الخيار الذي يحول فئة تخزين في في CONST نطاق
- يتم الآن فحص معلمات Printf و scanf للتوافق مع محددات التنسيق
- متغير البيئة SOURCE_DATE_EPOCH مدعوم الآن.
تغييرات وقت التشغيل
- TypeInfo_Class/TypeInfo_Interface.isBaseOf C#/Java isAssignableFrom
- core.memory.pageSize minimumPageSize
- Date.isoWeekYear Date.fromISOWeek std.datetime.date
- std.xml
- std.digest.digest
Dub
- Dub lint --report-file
القائمة الكاملة للإصلاحات والتحسينات (الإنجليزية)Prim.per.U paw me ، لأنه من المستحيل إعداد المحتويات الصحيحة للروابط في الصفحة إلى الكشف ، كما هو الحال في الأصل ، آسف = (التغييرات المترجم
- مفاتيح التبديل الموجودة بسطر الأوامر -revert = import and -transition = checkimports تم حذفها.
لم تفعل هذه المفاتيح شيئًا ، وتم اعتبارها قديمة لبعض الوقت. لن يتعرف عليها المترجم بعد الآن. - () 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++) . - , extern(D) .
( ) , extern(D), . , , / , , 479, 479, .
, , . - DIP25 .
DIP25 2.067.0, , -preview=dip25. , , DIP1000.
, , -preview=dip25, -preview=dip25. ( ).
DIP25 , @ safe . , ref , return , .
struct Foo
{
int x;
ref int method() { return this.x; }
}
ref int identity( ref int v) { return v; }
return . DIP25 . - -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);
- printf scanf
C99 7.19.6.1 printf 7.19.6.2 scanf.
printf , . , .
scanf .
:
- ,
- ,
- — , s
- C99
-, .
.
, printf/scanf, :
printf("%k\n", value);
const format = "%k\n";
printf(format.ptr, value);
— . ,
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.
, :
- extern (C ) extern (C++)
- const(char)*
- … -v , va_list ( «v» printf scanf)
.
«v»- .
- 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();
scope const pc = malloc();
}
يبدو أنه ليس من المنطقي وضع علامة على مؤشرات مثل النطاق ، ربما يمكن إصلاح ذلك عن طريق التعامل مع هذا على أنه خطأ.تتم قراءة / كتابة المؤشرات بواسطة الدوال المتداخلة.@live void ohno()
{
auto p = malloc();
void sneaky() { free(p); }
sneaky();
free(p);
}
استثناءاتيفترض التحليل أن الاستثناءات لا القيت.@live void leaky()
{
auto p = malloc();
pitcher();
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);
لم يتم الكشف عن.يمكن التحايل على ذلك باستخدام تجمعات محددة لنوع معين:U* umalloc();
void ufree(U*);
V* vmalloc();
void vfree(V*);
auto p = umalloc();
vfree(p);
وربما لا تسمح بالتحويلات الضمنية لإلغاء * في الوظائف المباشرة @ .وسيطات دالة متغيرة تعتبروسائط دالة متغيرة (على سبيل المثال ، printf) مستهلكة. في حين أن هذا آمن ، إلا أنه لا يبدو عمليًا للغاية وسيتطلب على الأرجح مراجعة.تغييرات وقت التشغيل
- TypeInfo_Class/TypeInfo_Interface.isBaseOf C#/Java isAssignableFrom.
TypeInfo_Class.isBaseOf true, , , , . isBaseOf, isAssignableFrom, , opAssign D — . TypeInfo_Interface.isBaseOf , TypeInfo_Class, TypeInfo_Interface. - 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;
- 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 , . - std.xml .
std.xml . , , UndeaD. xml dub- dxml. - std.digest.digest .
2.076.1 . std.digest .
std.digest.digest 2.101.
Dub
- .
Posix , .dub. dub (, .swap.file.d), . , dub . , dub.
, . - Dub lint --report-file.
Dub lint --report-file: dub lint --report-file report.json