LINUX.ORG.RU

Экспериментальная поддержка С++ компилятором LDC

 calypso, ,


0

4

Одной из главных проблем затрудняющих переход программистов С++ на D является отсутствие возможности простой работы с уже написанными библиотеками на С++.

Проект Calypso призван решить эту проблему и дать программистам D возможность прямого взаимодействия с С++ кодом без необходимости создания соответсвующих оберток. Calypso базируется на компиляторе LDC и к настоящему моменту поддерживает: - глобальные переменные - функции - структуры - перечисления - виртуальные вызовы функций - наследование классов и многое другое

В настоящий момент рассматривается возможность о перспективах слияния Calypso с основным компилятором DMD.

>>> Подробности

★★

Проверено: anonymous_incognito ()
Последнее исправление: anonymous_incognito (всего исправлений: 1)

Ответ на: комментарий от Dicebot

Т.е. вы всех этих плюшек-ватрушек с константностью/инвариантностью и thread-local-data by default не получили?

Кроме того, как я понял, в качестве основной библиотеки Tango используется. Она под D2 портировалась или придется переходить на stdlib из D2?

eao197 ★★★★★
()
Ответ на: комментарий от eao197

Т.е. вы всех этих плюшек-ватрушек с константностью/инвариантностью и thread-local-data by default не получили?

Nope. Как раз таки изменения в const и являются самой большой головной болью при портировании.

Кроме того, как я понял, в качестве основной библиотеки Tango используется. Она под D2 портировалась или придется переходить на stdlib из D2?

Есть https://github.com/SiegeLord/Tango-D2 , но я делаю новый порт с нуля, т.к. нам нужен не просто вариант для D2, а специальный вариант, который является легальным D1 и D2 одновременно. Это история слишком длинная для пары комментариев.

Dicebot
()
Ответ на: комментарий от Dicebot

Это история слишком длинная для пары комментариев.

Ну как раз это я могу себе хорошо представить. Лазил когда-то в потроха Tango, так что представление имею.

PS. Мое личное мнение, что D1 перед C++11 имеет в качестве преимущества разве что высокую скорость компиляции. Так что время вполне может показать, что в долгосрочной перспективе выбор D1 отцами-основателями Sociomantic-а окажется не таким уж и удачным.

eao197 ★★★★★
()
Ответ на: комментарий от eao197

высокую скорость компиляции

~$ cat hello.d
import std.stdio;
void main()
{
    writeln("Hello world");
}
~$ time gdc-4.9 hello.d

real    0m0.432s
user    0m0.355s
sys     0m0.076s
~$ time gdc-4.9 hello.d

real    0m0.437s
user    0m0.351s
sys     0m0.085s
~$ cat hello.c
main() {
    puts("Hello world\n");
}
~$ time tcc hello.c

real    0m0.001s
user    0m0.000s
sys     0m0.001s
~$ time tcc hello.c

real    0m0.001s
user    0m0.000s
sys     0m0.002s

Вот это высокая скорость компиляции, а D проигрывает даже С++, если последним грамотно пользоваться.

anonymous
()
Ответ на: комментарий от anonymous

Где тут у вас C++?

Если же под «правильно использованным C++» подразумевается чистый C, то это даже не серьезно.

eao197 ★★★★★
()
Ответ на: комментарий от eao197

Где тут у вас C++?

Пожалуйста:

~$ cat hello.cpp 
#include <iostream>
int main()
{
    std::cout << "Hello world\n";
}
~$ time clang++ hello.cpp

real    0m0.142s
user    0m0.127s
sys     0m0.015s
~$ time clang++ hello.cpp

real    0m0.137s
user    0m0.120s
sys     0m0.016s

Хотя я взял бы тут puts, но специально для вас в примере iostream.

anonymous
()
Ответ на: комментарий от anonymous

Это уже ближе к реальности. Но еще не мешало бы использовать dmd вместо не шибко быстрого gdc. И проект побольше, хотя бы в несколько K строк.

eao197 ★★★★★
()
Ответ на: комментарий от eao197

Но еще не мешало бы использовать dmd вместо не шибко быстрого gdc

Будет быстрее, но медленее чем С++, проверял.

И проект побольше, хотя бы в несколько K строк.

Взял один из своих проектов, библиотека на 99 .cpp файлов, среднее время компиляции 80ms на один файл. И смысл сравнивать с D, где один только hello world компилируется 220ms с "-c"?. И да - в этой библиотеке используется С++11 во все поля, в том числе variadic templates, хоть и без фанатизма.

anonymous
()
Ответ на: комментарий от anonymous

Будет быстрее, но медленее чем С++, проверял.

Как все поменялось, однако. В последний раз серьезно пользовался D где-то в 2007, тогда это был D1. Небольшие утилитки на D1+Tango посредством dmd компилировались гораздо быстрее, чем C++/STL посредством VC++2003/2005.

eao197 ★★★★★
()
Ответ на: комментарий от tailgunner

...на хелловорлде

И не только, проблемы со скоростью компиляции бывают только у тех, кто пихает все в хедер, все include тоже туда добавляет и обмазывается шаблонами с ног до головы. Тогда ес-но все упирается в тяжелый выхлоп препроцессора и разбор этих самых шаблонов. Если делать все с толком, с pch и параллелить сборку - скорость компиляции вообще не беспокоит. Если в С++17 добавят модули, то будет еще лучше. Ну и, если говорить про данное сравнение, тут не С++ быстрый, а D очень медленный. Причем с ростом объема кода скорость компиляции очень быстро падает:

~$ cat hello.d
// Computes average line length for standard input.
import std.stdio;

void main()
{
    ulong lines = 0;
    double sumLength = 0;
    foreach (line; stdin.byLine())
    {
        ++lines;
        sumLength += line.length;
    }
    writeln("Average line length: ",
        lines ? sumLength / lines : 0);
}
~$ time gdc-4.9 hello.d

real    0m0.588s
user    0m0.514s
sys     0m0.074s
~$ time gdc-4.9 hello.d

real    0m0.587s
user    0m0.521s
sys     0m0.066s
anonymous
()
Ответ на: комментарий от anonymous

Если делать все с толком, с pch и параллелить сборку - скорость компиляции вообще не беспокоит.

А если еще и все исходники, включая заголовочные файлы стандартной библиотеки, на SSD лежат, то вааще... :)

eao197 ★★★★★
()
Последнее исправление: eao197 (всего исправлений: 1)
Ответ на: комментарий от anonymous

Это снова хелловорлд.

обмазывается шаблонами с ног до головы. Тогда ес-но все упирается в тяжелый выхлоп препроцессора и разбор этих самых шаблонов. Если делать все с толком, с pch

Ну то есть выбрать облегченное подмножество языка и вручную приблизить С++ к D.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Это снова хелловорлд.

Ес-но, а разницу с скорости ты не заметил? И да - это все еще хелловорлд.

anonymous
()
Ответ на: комментарий от eao197

А если еще и все исходники, включая заголовочные файлы стандартной библиотеки, на SSD лежат, то вааще... :)

Без разницы, т.к. все один раз подымается в RAM и диск больше не дергается. А временные файлы у меня в tmpfs.

anonymous
()
Ответ на: комментарий от eao197

Походу там все замерло пару лет назад.

А Tango почти никто и не использует сейчас, стандартная библиотека лучше. Там только обновление под новые версии компилятора.

Насчёт скорости компиляции - это верно только для DMD, а в сравнении используется GDC. Тот очень медленный, причём большинство времени выжирает GCC backend.

Dicebot
()
Ответ на: комментарий от Dicebot

А Tango почти никто и не использует сейчас, стандартная библиотека лучше.

Да, масштабы переезда с D1 на D2 в вашем случае внушають :)

Ну а как впечатления от ключевых возможностей D2 по сравнению с D1 в реальной работе? За время портирования старых наработок на D2 сложилось какое-то мнение? Та же костантность и инвариантность данных на практике помогает или мешает?

eao197 ★★★★★
()
Ответ на: комментарий от Dicebot

Насчёт скорости компиляции - это верно только для DMD

Разница не такая уж и большая:

~$ cat hello.d
import std.stdio;

void main()
{
    ulong lines = 0;
    double sumLength = 0;
    foreach (line; stdin.byLine())
    {
        ++lines;
        sumLength += line.length;
    }
    writeln("Average line length: ",
        lines ? sumLength / lines : 0);
}
~$ time dmd ./hello.d

real    0m0.468s
user    0m0.407s
sys     0m0.061s
~$ time dmd ./hello.d

real    0m0.461s
user    0m0.404s
sys     0m0.057s
anonymous
()
Ответ на: комментарий от eao197

Ну а как впечатления от ключевых возможностей D2 по сравнению с D1 в реальной работе? За время портирования старых наработок на D2 сложилось какое-то мнение? Та же костантность и инвариантность данных на практике помогает или мешает?

Изначально мы не собираемся использовать никаких особенностей, появившихся в D2, по крайней мере пока не будет уверенности, что у существующего кода не появилось регрессий в производительности и потреблении памяти.

Самые желанные вещи в D2 связаны не с языком, а инструментами и инфраструктурой - DScanner, dfix, dub, Mono-D, LDC. Из фич самого языка будут очень полезны User-Defined Attributes и __traits.

Инвариантность очень трудно добавлять post-factum, это должно быть на этапе проектирование системы. Если портировать уже работающий код, это сплошная головная боль (т.к. строковые литералы имеют тип immutable(char)[] в D2 и просто char[] в D1)

PS. Мое личное мнение, что D1 перед C++11 имеет в качестве преимущества разве что высокую скорость компиляции

До работы в Sociomantic я около 5 лет кормился как раз разработкой на C++. Обратно нет ни малейшего желания, ни C++11, ни C++14 ситуацию не улучшили. Требования к компетенции программистов для эффективной разработки на плюсах делают применение этого языка роскошью - возможно, но очень дорого.

Dicebot
()
Ответ на: комментарий от Dicebot

Вообще касательно скорости компиляции - проблема не в том, как быстро обрабатывается один модуль, а взрыв времени компиляции в C++ с ростом количества include. Когда добавят модули сравнение будет иметь больший смысл, пока же для реальных проектов это сравнения вида 10 секунд (DMD) vs 10 минут (GCC).

Dicebot
()
Ответ на: комментарий от Dicebot

проблема не в том, как быстро обрабатывается один модуль, а взрыв времени компиляции в C++ с ростом количества include.

я выше уже писал про это

пока же для реальных проектов это сравнения вида 10 секунд (DMD) vs 10 минут (GCC).

когда на D будут достойные прикладные проекты - приходи, сравним

anonymous
()
Ответ на: комментарий от Dicebot

3 программиста (сами основатели)

сами основатели

инженеры, да.

anonymous
()
Ответ на: комментарий от Dicebot

у вас ещё нормальная история, какое-то осмысленное решение с взвешиванием за и против. мне кажется чаще происходит история другая: кому-то интересно попробовать новый язык, заодно в нём подразобраться. выбирается какая-то экзотика которая the next big thing, потом уходят конечно же, тоже типичное поведение. в результате либо нет людей которых можно нанять потому что слишком экзотично (хаскель какой-нибудь), либо квалификация этих людей оставляет желать лучшего (C#). попробуйте найти инженера который вам на C# напишет что-то рилтайм. он же вам скажет, что базу данных надо правильную подобрать, какое количество аллокаций, о чём вы вообще говорите. и так везде, не только в рилтайм.

и с++ вам тоже оказался нужен

нанимать людей с опытом C/C++ и легко переучивать

вот и получается, что по большому счёту без си и с++ никак не обойтись

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.