د مثل تحسن ج

والتر برايت هو "الدكتاتور الخير مدى الحياة" للغة البرمجة D ومؤسس Digital Mars . لديه عقود من الخبرة في تطوير المترجمين والمترجمين الفوريين لعدة لغات ، بما في ذلك Zortech C ++ ، أول مترجم أصلي لـ C ++. وهو أيضًا منشئ الإمبراطورية ، الملهم الرئيسي لحضارة سيد ماير.



أفضل سلسلة سي


تم تصميم لغة D منذ البداية للوصول بسهولة ومباشرة إلى C وبدرجة أقل C ++. بفضل هذا ، يتوفر عدد لا يحصى من مكتبات C ومكتبة C القياسية وبالطبع واجهات برمجة التطبيقات للنظام ، والتي يتم بناؤها عادةً على C API.



لكن لغة C ليست مجرد مكتبات. تتم كتابة العديد من البرامج الكبيرة والقيمة بلغة C ، مثل نظام التشغيل Linux ومعظم البرامج الخاصة به. بينما يمكن لبرامج D الوصول إلى مكتبات C ، فإن العكس ليس صحيحًا. لا يمكن لبرامج C الوصول إلى رمز D. فمن المستحيل (أو على الأقل من الصعب جدًا) تجميع عدة ملفات D وربطها ببرنامج C. المشكلة هي أن ملفات D المترجمة يمكنها الوصول إلى شيء موجود فقط في وقت التشغيل D ، وإضافته إلى الارتباط عادةً ما يكون غير عملي (وقت التشغيل ضخم جدًا).



أيضًا ، لا يمكن أن يوجد رمز D في برنامج إذا لم يتحكم D في الوظيفة main()، لأن هذه هي الطريقة التي يبدأ بها وقت تشغيل D. لذلك ، يتعذر الوصول إلى مكتبات D لبرامج C ، وتصبح برامج chimera (مزيج من C و D) غير عملية. لا يمكنك "تجربة" D فقط عن طريق إضافة وحدات D إلى وحدات برنامج C الموجودة.



كان هذا حتى فيلم Better C.



كل هذا حدث بالفعل ، والفكرة ليست جديدة. كتب بيارن ستروستروب في عام 1988 مقالا بعنوان A لأفضل لC . استطاع مترجم C ++ المبكر تجميع كود C دون تغيير تقريبًا ، ويمكنه البدء في استخدام ميزات C ++ حيثما ومتى كان ذلك منطقيًا - دون التضحية بعمل C ++ الحالي. لقد كانت استراتيجية رائعة لضمان نجاح C ++ مبكرًا.



Kotlin, . Kotlin Java, Java-, Java Kotlin. Kotlin — « Java», .



D C



D C. C, , C ( , ..). D — D, , . -betterC.



D D? , . . , C. , C D.





, , — , . , C: malloc .



C++ COM  , D — , .



, typeid, , RAII . , , .



Better C RAII . (. .)

assert , C D.



( , . Better C).





, Better C C?



C , . , : , , , , , , , (Compile Time Function Execution, CTFE), , (Design by Introspection, DbI).





:



#include <stdio.h>

int main(int argc, char** argv) {
    printf("hello world\n");
    return 0;
}


:



_main:
push EAX
mov [ESP],offset FLAT:_DATA
call near ptr _printf
xor EAX,EAX
pop ECX
ret


— 23 068 .



D:



import core.stdc.stdio;

extern (C) int main(int argc, char** argv) {
    printf("hello world\n");
    return 0;
}


: 23 068 . , C, D , . ( D 194 ). , D C .



Hello World — . - : :



#include <stdio.h>

/* Eratosthenes Sieve prime number calculation. */

#define true    1
#define false   0
#define size    8190
#define sizepl  8191

char flags[sizepl];

int main() {
    int i, prime, k, count, iter;

    printf ("10 iterations\n");
    for (iter = 1; iter <= 10; iter++) {
        count = 0;
        for (i = 0; i <= size; i++)
            flags[i] = true;
        for (i = 0; i <= size; i++) {
            if (flags[i]) {
                prime = i + i + 3;
                k = i + prime;
                while (k <= size) {
                    flags[k] = false;
                    k += prime;
                }
                count += 1;
            }
        }
    }
    printf ("\n%d primes", count);
    return 0;
}


Better C:



import core.stdc.stdio;

extern (C):

__gshared bool[8191] flags;

int main() {
    int count;

    printf("10 iterations\n");
    foreach (iter; 1 .. 11) {
        count = 0;
        flags[] = true;
        foreach (i; 0 .. flags.length) {
            if (flags[i]) {
                const prime = i + i + 3;
                auto k = i + prime;
                while (k < flags.length) {
                    flags[k] = false;
                    k += prime;
                }
                count += 1;
            }
        }
    }
    printf("%d primes\n", count);
    return 0;
}


, - :



  • extern(C) C.
  • D (thread-local storage, TLS). C . __gshared.
  • foreach — .
  • const , prime .
  • iter, i, prime k , .
  • flags flags.length, - .


, : flags . - ! .



Better C, , C. , D , , goto.



بالأصالة عن نفسي ، يمكنني القول أنه منذ ظهور الخيار -betterC، بدأت في ترجمة العديد من برامجي القديمة ، ولكن لا تزال مستخدمة إلى D - وظيفة واحدة في كل مرة. من خلال العمل بوظيفة واحدة في كل مرة وإجراء مجموعة من الاختبارات بعد كل تغيير ، أحافظ على تشغيل البرنامج في جميع الأوقات. إذا حدث عطل ما ، فأنا بحاجة فقط لاختبار وظيفة واحدة لمعرفة السبب. لست مهتمًا جدًا بمواصلة دعم برامج C الخاصة بي ، ومع ظهور Better C ، لم يعد هناك أي سبب لذلك.




All Articles