D sebagai ditingkatkan C

Walter Bright adalah "diktator seumur hidup yang baik hati" dari bahasa pemrograman D dan pendiri Digital Mars . Dia memiliki lebih dari belasan tahun pengalaman dalam mengembangkan compiler dan interpreter untuk beberapa bahasa, termasuk Zortech C ++, compiler C ++ native pertama. Dia juga pencipta Kekaisaran , inspirasi utama untuk Peradaban Sid Meier.



Seri C yang lebih baik


Bahasa D dirancang dari awal untuk dengan mudah dan langsung mengakses C dan, pada tingkat yang lebih rendah, C ++. Berkat ini, perpustakaan C yang tak terhitung jumlahnya, perpustakaan C standar dan tentu saja API sistem, yang biasanya dibangun di atas C API, tersedia di dalamnya.



Tapi C bukan hanya tentang perpustakaan. Banyak program besar dan tak ternilai ditulis dalam C, seperti sistem operasi Linux dan sebagian besar program untuknya. Meskipun program D dapat mengakses perpustakaan C, hal sebaliknya tidak benar. Program C tidak dapat mengakses kode D. Tidak mungkin (atau setidaknya sangat sulit) untuk mengkompilasi banyak file D dan menghubungkannya ke dalam program C. Masalahnya adalah bahwa file D yang dikompilasi dapat mengakses sesuatu yang hanya ada di waktu proses D, dan menambahkannya ke tautan biasanya tidak praktis (waktu prosesnya cukup banyak).



Juga, kode D tidak bisa ada dalam program jika D tidak mengontrol fungsi main(), karena ini adalah bagaimana runtime D. Oleh karena itu, perpustakaan D tidak dapat diakses oleh program C, dan program chimera (campuran C dan D) menjadi tidak praktis. Anda tidak bisa begitu saja "mencoba" D dengan menambahkan modul D ke modul program C yang ada.



Ini sampai Better C.



Semua ini sudah terjadi, idenya bukanlah hal baru. Bjarne Stroustrup pada tahun 1988 menulis sebuah artikel berjudul A Better C . Kompiler C ++ awalnya dapat mengkompilasi kode C hampir tidak berubah, dan C ++ dapat mulai memanfaatkan kekuatan C ++ di mana dan kapan hal itu masuk akal - tanpa mengorbankan pekerjaan C ++ yang ada. Itu adalah strategi brilian untuk kesuksesan awal 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.



Atas nama saya sendiri, saya dapat mengatakan bahwa sejak opsi tersebut muncul -betterC, saya mulai menerjemahkan banyak program lama saya, tetapi masih menggunakan program ke D - satu fungsi pada satu waktu. Dengan mengerjakan satu fungsi pada satu waktu dan menjalankan serangkaian pengujian setelah setiap perubahan, saya menjaga program tetap berjalan setiap saat. Jika ada yang rusak, saya hanya perlu menguji satu fungsi untuk menemukan penyebabnya. Saya tidak terlalu tertarik untuk terus mempertahankan program C saya, dan dengan munculnya Better C, tidak ada lagi alasan untuk itu.




All Articles