В настоящее время у системных программистов практически нет выбора какой язык использовать. По хорошему все варианты сводятся или к чистому Си или к Rust, хотя как показывает опыт далеко не всем нравится его синтаксис.
Благодаря усилиями команды разработчиков языка у D теперь появилось совместимое с чистым Си подмножество обладающее не только привычным для любого программиста Си синтаксисом, но и значительно расширяющее функционал языка. Новое подмножество называется «betterC». Это подмножество позволяет перевести написание Си приложение на новый уровень.
Вот краткий список того, что позволяет режим betterC программисту:
1. Отсутствие препроцессора
2. Более высокая скорость компиляции
3. Полноценная модульность
3.1 Поддержка различных видов импорта (статический импорт, частичный импорт, ренейминг при импорте и тд)
4. В момент компиляции возможна: генерация кода, интроспекция, проверка различных условий
4.1 Ветвление на этапе компиляции через static if
и static foreach
4.2 возможны работа блоков вида version(linux) { ... }
5. Шаблоны
6. Аналог borrow checking из Rust через scope pointers (scope T*)
, scope slices (scope T[])
и scope references (scope ref T)
7. Поддержка модификаторов доступа const
и immutable
подробнее
8. TLS по умолчанию
9. Поддержка контрактного программирования
10. Удобные массивы с поддержкой слайсинга
11. Ускорение работы с массивами за счет SIMD
12. Удобные unit-тесты
13. Встроенный профайлер
14. User-defined атрибуты
15. Встроенный и очень удобный генератор документации
16. Привычный каждому программисту Си синтаксис
17. Поддержка Unicode
18. Лучшая чем у C memory safety
19. Замыкания
20. Многое другое.
Давайте теперь рассмотрим примеры.
Следующий код на C:
#include <stdio.h>
int main(int argc, char** argv) {
printf("hello worldn");
return 0;
}
Будет скомпилирован в:
_main:
push EAX
mov [ESP],offset FLAT:_DATA
call near ptr _printf
xor EAX,EAX
pop ECX
ret
Размер на выходе: 23,068 bytes.
Теперь тоже самое на D в режиме betterC:
import core.stdc.stdio;
extern (C) int main(int argc, char** argv) {
printf("hello worldn");
return 0;
}
Размер на выходе: 23,068 bytes.
Не плохо правда ли? Тот же самый код без режиме betterC будет весить 194Kb.
Более сложный пример:
C версия:
#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 iterationsn");
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;
}
BetterC версия на D:
import core.stdc.stdio;
extern (C): // указываем что надо использовать соглашение о вызове в стиле C
__gshared bool[8191] flags;
int main() {
int count;
printf("10 iterationsn");
foreach (iter; 1 .. 11) {
count = 0;
flags[] = true;
foreach (i; 0 .. flags.length) {
if (flags[i]) {
const prime = i + i + 3; // const - значение никогда не будет меняться после инициализации
auto k = i + prime;
while (k < flags.length) {
flags[k] = false;
k += prime;
}
count += 1;
}
}
}
printf("%d primesn", count);
return 0;
}
Получилось куда более читабельно и коротко.
Для инициализации пустого проекта вызовите: dub init
Для включения данного режима в dub.sdl необходимо добавить строку:
dflags "-betterC"
Для dub.json строка будет:
"dflags" : ["betterC"],
Требуется версия компилятора dmd 2.076 и старше.
Для начинающих программистов опубликована первая версия русского учебника по языку D.
Так же вышло новое расширение с поддержкой языка для Visual Code.
Автор: beduin01