LINUX.ORG.RU

Андрей Александреску, The Case for D

 , ,


0

0

Перевод статьи The Case for D, выполненный сообществом сайта http://dprogramming.ru/d/

Мы, программисты, — странный народ. Достатчно взглянуть на то, как мы выбираем любимые языки и придерживаемся этих предпочтений в дальнейшем. Ожидаемая реакция программиста, заметившего на полке книжного магазинаиздание “Язык программирования XYZ” — “Даю себе ровно 30 секунд, чтобы найти в нём что-нибудь, что мне не понравится”. Изучение языка программирования требует времени и усилий, а результаты появляются не сразу. Попытка избежать этого — проявление инстинкта выживания. Ставки высоки, вложения рискованны, так что лучше уметь принимать быстрое решение “против”.

Изучение нового языка программирования может представлять интерес только в том случае, если язык удовлетворяет принципам, которые программист высоко ценит. Любое несовпадение создаёт у программиста впечатление небрежного и небезопасного или же навязчивого и нудного языка. Язык не может одновременно устраивать всех и каждого, он должен аккуратно выбирать основные координаты, позиционируя себя среди языков программирования.

>>> Перевод (pdf)

★★★★★

Проверено: maxcom ()
Ответ на: комментарий от hk

> а ты никогда не задумывался что люди по типу Александреску которые в своей жизни токо книги писали и учили других как что делать теперь думаю куда девать все эти знания

но реально, кроме книг ничего толкового он не написал

Loki, ZeroBugs. Кстати, вряд ли многие из отметившихся в треде смогут что-то, сопоставимое с Loki по сложности, написать.

Ну и неудивительно, что D вам после этого начал «видиться».

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

> доколе еще будут процветать авторы, с ослиным упорством не замечающие прекрасный и мощный язык PHP? этот даже javascript и perl упомянул, хотя уж что может быть примитивнее и косячнее

«А ещё он мой любимый прекрасный и мощный Пролог не упомянул! Доколе?» (ц)

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

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

Когда ты поймешь, что я сказал то же самое, ты начнешь выздоравливать.

От чего?

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

>не, Александреску конечно не глупый дядка (еще раз повторюсь)

но реально, кроме книг ничего толкового он не написал

Он между прочим в RealNetworks работал и занимался там отнюдь не написанием книг.

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

простейшие: подсчитать факториал целой константы во время компиляции

и?

template <unsigned n>
struct factorial{ enum{ value = n * factorial<n-1>::value }; };

template <>
struct factorial<0>{ enum{ value = 1 }; };

int main() {
	int x = factorial<7>::value;
}
HexGhost
()
Ответ на: комментарий от hk

[quote] повторюсь еще раз язык D - мне видиться как смесь C++ и C#/java зачем такое извращение? [/quote]

наверно затем чтоб взять от этих языков лучшее, нет? C++ как бы тоже не на пустом месте возник. говорить что С++ хороший и переносимый язык - явно лукавить. О какой переносимости может идти речь если в стандарте языка нет ни сетевых библиотек, ни даже тредов. Т.е. платформено-зависимый слой тем или иным образом уже попадает в разрабатываемую программу (ну приходится завязываться какую либо на кроссплатформенную библиотеку, со всеми ее плюсами и минусами).

В С++ дофига вещей которые сложились исторически и которые никто не будет менять только для того чтоб сохранить совместимость с уже имеющимся кодом. Герб Саттер, являвшийся долгое время секретарем коммитета по стандартизации С++, неоднократно указывает на вещи являющиеся стандартом языка, использования которых лучше избегать.

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

> простейшие: подсчитать факториал целой константы во время компиляции

и?

да все знают как это сделать. вопрос в том что адекватно это решение поставленной задаче или нет. наглядно ли оно, т.е. отражает ли код сущность того что он делает?

очевидно же, что тот же код на D выглядит более естественно:

template Factorial(ulong n)
{
    static if(n <= 1)
        const Factorial = 1;
    else
        const Factorial = n * Factorial!(n - 1);
}
Zay4egg
()
Ответ на: комментарий от scaldov

> директ это COM, чистый Си.

каким боком COMовость доказывает сишность? даже скорее наоборот, раз это COM, то это VC++ со всей мишурой в виде MIDL, ATL и тогдалие. скомпилен директ как минимум плюсовым компилятором, на что укажет сигнатура в бинарниках в той же IDA. конечно, есть и нзкоуровневые модули у директа, написанные на си и ассемблере, но тем не менее.

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

>Матчасть: В VC++ свой stl

А в гцц «чужой»? Я в курсе что они разные, и как раз на это и намекаю - в разных реализациях один и тот же hash_map. Тот тест я уже приводил на лоре можно наверное найти по поиску. Есть подозрение что всё дело в том, что const std::string не так умен что бы кэшировать своё hash - значение, которое вычисляется за линеёную сложность. Что и давала у меня проседание на большой таблице так сильно.

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

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

Когда ты поймешь, что я сказал то же самое, ты начнешь выздоравливать.

От чего?

От узкопрофессиональных фобий. Си++-фобии, прежде всего.

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

> мораль такова:

Текстовые препроцессоры не нужны.

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

template Factorial...

Использование:

auto i =  Factorial!(10);

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

>От узкопрофессиональных фобий. Си++-фобии, прежде всего.

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

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

>> “Даю себе ровно 30 секунд, чтобы найти в нём что-нибудь, что мне не понравится”

> char*, <>.


Это про C++?

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

>Есть подозрение что всё дело в том, что const std::string не так умен что бы кэшировать своё hash - значение, которое вычисляется за линеёную сложность. Что и давала у меня проседание на большой таблице так сильно.

Простите, но это очень похоже на бред. hash вычисляется от самой строки, и в зависимости от сложности самой хэш функции никак не зависить от количества строк в таблице. Для вставки и удаления, и поиска строки в таблице достаточно вычислить хеш ровно 1 раз - для того что вставляем, того что удаляем или того что ищем.

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

> А нет у меня С++-фобии. Есть четкое видение того что все изначальные замыслы Строуструпа потерпели провал и сейчас куча человековремени тратится на то чтобы из обломков неполетевшей ракеты соорудить что-то практичеки полезное типа тех же спецификаций проектирования, как это попытался сделать Александреску например.

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

gena2x ★★★
()
Ответ на: комментарий от Zay4egg
template Factorial(ulong n)
{
    static if(n <= 1)
        const Factorial = 1;
    else
        const Factorial = n * Factorial!(n - 1);
}

Если template зачем ulong? что будет когда n переполнится?

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

>> выяснить, есть ли у данного класса член с данным именем

use key_sequence_for_finding_substring (f.ex. C-F) in your favorite editor, Luke... truly yours, Capt.

ты даже не понял о чем идет речь

допустим, что у нас есть 1-й шаблон, который вызывает 2-й шаблон, который вызывает 3-й шаблон, который работает, только если у класса есть данный член с данным именем (фактически, ограниченно юзаем структурное равенство типов)

если мы не встроим такую проверку в 1-й шаблон, то получим странцы 2 непонятной ругани компилятора

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

>>Да ну, сделай wc -l программ в любом дистрибутиве и потом расскажи что побеждает.

Самому не стыдно за такую «аргументацию»?

С чего бы?

Оффтопик побеждает «стопудова» (при несколько другом запросе).

Это какие запросы там можно сделать? - там вообще обычный пользователь не знает на чём написано поделие которым он пользуется. Тормозит и отжирает кучу памяти - 'компьютер надо новый купить', а то что там C# с чем-то кривым.

Уверен что в виндовс 80% системы написано на с и c++. Ещё вспомни firefox, openoffice.

Хоть бы на вакансии какие глянул...

Вакансии в России что-ли, где 50% контор из списка на 'вакансиях' организованы по принципу армейской казармы 'я начальник ты дурак', 'мы тут дрова рубим, 1 кубометр в день', и в которых текучка кадров под 50%? В России своего мнения не имеют, как в мире будет так и у нас. А вакансий с Линуксом довольно мало, и там редко java и совсем нет C#.

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

Ну вы и примеры приводите. Разработчики велосипеда отказались от D потому, что, видите ли извращенская схема «D + C++» плохо работает. В доках по D ясно же написано: чтобы сделать полную совместимость с плюсами, нужен компилятор плюсов в компиляторе D. Вопрос: зачем извращаться? Что такого есть в C++, чего нет в D, и без чего жить нельзя?

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

> Можно, но убеди для начала в полезности данных фич (да и не заявлялись они в возможностях языка).

хе-хе, тебе надо записать возможность compile-time вычисления факториала в стандарт? иди, познакомся как оно делается, в интернете полно примеров.

речь идет о том, что приходится знать эти идиомы, и говорить на языке весьма избыточном и странном

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

> Разработчики велосипеда отказались от D потому, что, видите ли извращенская схема "D + C++" плохо работает.

Три причины (для Ъ):
1. Никто (из wannabe контрибьюторов) не хотел "учить" D.
2. Никто не хотел устанавливать компилер D.
3. Поддержка интерфейса C++/D для Ogre3D требовала много времени.

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

> 1. Никто (из wannabe контрибьюторов) не хотел «учить» D.

разница между D и C++ примерно такая же, как между C# и Java

да, C#, но не настолько, чтобы на него уйти с явы

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

>> Можно, но убеди для начала в полезности данных фич (да и не заявлялись они в возможностях языка).

хе-хе, тебе надо записать возможность compile-time вычисления факториала в стандарт?

Я понимаю, что нечего ответить, но зачем сразу в троллинг впадать.

иди, познакомся как оно делается, в интернете полно примеров.

Ага сейчас, все брошу и пойду смотреть как одни суперкодеры получают факториал от констант, а другие суперкодеры переделывают компиляторы, что бы дебилизм первых сильно в глаза не бросался )))

речь идет о том, что приходится знать эти идиомы, и говорить на языке весьма избыточном и странном

А где я радовался что приходится «говорить на языке весьма избыточном и странном», на чей-то другой вопрос отвечаешь?

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

Если template зачем ulong? что будет когда n переполнится?

сразу оговорюсь, я не пишу на D, ибо пишу на том, на чем хочет заказчик. ну во-первых переполнится не n, а результат. во-вторых, полагаю, что по скольку это вычисляется в процессе компиляции, компилятор это переполнение и найдет.

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

дада, 0x великий и ужасный (точнее теперь уже наверно 1x). и какие из нововведений C++0x вы считаете наиболее полезными и поднимающими С++ на недосягаемые ранее высоты?

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

> разница между D и C++ примерно такая же, как между C# и Java

> да, C#, но не настолько, чтобы на него уйти с явы


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

Вот причина №3 - вполне серьёзная и с этим ничего не поделаешь.

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

>Ага сейчас, все брошу и пойду смотреть как одни суперкодеры получают факториал от констант

Ну если одна константа получается вычислениями относительно другой константы, то почему бы ее не рассчитать в момент компиляции? На перформанс тут насрать по большому счету, цель в том что если одна константа изменилась то чтобы все зависимые от нее изменились автоматически. Про compile-time вычисления на константах еще Кнут знал в начале 70-х - там у него в ассемблере MIX начальные значения переменных и размеры и смещения буферов для промежуточных вычислений выводились аналитически из минимума базовых констант.

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

>и какие из нововведений C++0x вы считаете наиболее полезными и поднимающими С++ на недосягаемые ранее высоты?

Он с недосягаемых высот ещё и не спускался. А новшевства лишь добавляют комфорту и производительности.

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

> Простите, но это очень похоже на бред. hash вычисляется от самой строки

Товарищ в чем-то прав. Посыл в том, что в яве значение хеш-функции для строки кешируется. Это возможно, потому что имеем immutable значение. Плюсовая же строка mutable и отчасти defective by design...

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

> hash вычисляется от самой строки

Это понятно. Я и имел ввиду от строки. Я о том, что (возможно) он в случаи коллизий когда строки сравнивает не пользуется кэшированным хешем что бы их быстро сравнить на равенство, а сравнивает сразу напрямую за линейную сложность. Но, я не гарантирую это, детально, почему оно так тормозит, я не вникал.

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

>Это понятно. Я и имел ввиду от строки. Я о том, что (возможно) он в случаи коллизий когда строки сравнивает не пользуется кэшированным хешем что бы их быстро сравнить на равенство, а сравнивает сразу напрямую за линейную сложность. Но, я не гарантирую это, детально, почему оно так тормозит, я не вникал.

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

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

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

Хех. А ты знаешь, что многие, вполне справедливо, не хотят писать на языке, который они вроде бы знают, а хотят писать на языке, который знают в совершенстве?

____________________________

Что же касается лично меня, то мне Д интересен как пример дизайна языка, и я планирую изучить его поглубже, включая обсуждаемые/планируемые фичи.

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

> Посыл в том, что в яве значение хеш-функции для строки кешируется. Это возможно, потому что имеем immutable значение. Плюсовая же строка mutable и отчасти defective by design...

Ни понимаю. В C++ immutable это const. Можно поподробнее разъяснить, что где кэшируется?

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

>> Ага сейчас, все брошу и пойду смотреть как одни суперкодеры получают факториал от констант

Ну если одна константа получается вычислениями относительно другой константы, то почему бы ее не рассчитать в момент компиляции?

Я собственно против идеи ничего не имею. Я недоволен другим. Когда какой-то перец, которому гипотетически может стать влом пересчитать константы если вдруг возникнет такая необходимость, начинает писать для этого дела либу листа на три. И после героической отладки довольный собой выкладывает это дело в интернет. Другой чел нифига непоняв дао этого поделия, начинает начинает приводить его как аргумент в споре доказывая ущербность языка на котором это писалось )))

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

И что? Пошли этого последнего по адресу и не мучайся. Это интернет, нет нужды переспорить всех.

Алсо, кодогерецию перлом/лиспом/чем угодно никто не отменял.

legolegs ★★★★★
()

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

Не согласен что Александревски только теоретик, видел успешное использование «списка типов».

Сам иногда посматриваю в сторону функциональных языков из-за их «встроенного» параллелизма и возможности горячего(без перезагрузки) обновления.

Как же я смеялся, будучи молодым, когда узнал что ПО для промышленности пишется на Лиспе. Как много лет спустя понимал неправоту, читая докуметацию по Эрлангу.

Но функциональный язык труден для обычного среднего программиста(как я). Поэтому и большой риск для бизнесмена делать проект на ФЯ. Где найдет замену, если я заболею?

В этом смысле, если верить рекламе и комментариям, язык Д вроде бы и похож на «кормильца» С++ и есть ФЯ составляющая, которая так нравится параллельному железу.

Хотелось бы в будущем все-таки от своих N ядер получать ускорение в N раз и больше, а не оправдания от железячников и программистов, что это типа математически невозможно.:-)

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

Ни понимаю. В C++ immutable это const. Можно поподробнее разъяснить, что где кэшируется?

immutable /= const. Похоже ты не знаком с функциональными языками. А кешируется результат функции hashCode():

    // java.lang.String

    public int hashCode() {
        int h = hash;
        if (h == 0) {
            int off = offset;
            char val[] = value;
            int len = count;

            for (int i = 0; i < len; i++) {
                h = 31*h + val[off++];
            }
            hash = h;
        }
        return h;
    }
dave ★★★★★
()
Ответ на: комментарий от gena2x

>То есть ты предлагаешь хранить два хеша - один для hash_table, другой для для сравнения строк

Просто вспомни как устроена хештаблица. Там вначале используется _усечённое хешзначение_. А пототом идёт линейный поиск в котором можно использовть _неусечённое_, исходное хеш значение.

Профилируют этот код пусть те, кто остался на плюсах ;)

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

Вы привели хэш функцию. Она не интересна в контексте этого вопроса. Я правду не знаю что такое immutable и заглянул в wikiпедию чтобы понять что это. там написано что это понятие соответствет понятию const в c++, с некоторыми незначительными ограничениями.

In C++, a const-correct implementation of Cart would allow the user to declare new instances of the class as either const (immutable) or mutable, as desired, by providing two different versions of the getItems() method. (Notice that in C++ it is not necessary — and in fact impossible — to provide a specialized constructor for const instances.)

С другой стороны мне непонятно как immutable относится к хэш-таблицам.

Какая конкретно хэш-функция используется тоже совершенно не важно в контексте вопросов, хотя именно в этом может быть банальная причина разного времени выполнения hash_map-ов. Кстати, hasp_map судя по всему давно depricated в g++, может там что-то серьезно кривое, но разбираться не ко времени.

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

> Просто вспомни как устроена хештаблица. Там вначале используется _усечённое хешзначение_. А пототом идёт линейный поиск в котором можно использовть _неусечённое_, исходное хеш значение.

ДА НУ???

Профилируют этот код пусть те, кто остался на плюсах ;)

Понятненько.

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

> Просто вспомни как устроена хештаблица. Там вначале используется _усечённое хешзначение_. А пототом идёт линейный поиск в котором можно использовть _неусечённое_, исходное хеш значение.

ладно, по смеялись и хватит. На самом деле, вначале используется _значение хэш функции_ затем идёт _поиск по дереву_ в котором используется _исходное НЕ ХЭШ_ значение.

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

> повторюсь еще раз язык D - мне видиться как смесь C++ и C#/java зачем такое извращение?

мне - нужно. потому что я получил комбинацию нормальной скорости и удобства в универсальном языке программирования.

но и обратное (радоваться тому что он делает новый язык потому что есть С++ сложный (!) для освоения) не меньший, а может ещё больший, моветон

грызть кактус только потому что он тру - по-моему глупо. если есть 2 языка, приводящие к одинаковым программам, глупо идти более сложным путём. свой проект я переписал с D на С++ просто потому что не хотел объяснять каждому, кто его будет использовать, что такое D и почему его нужно установить на их систему. (причина аналогичная уже была выше). Но. на D я откатал алгоритм и было очевидно, что большого профита, кроме указанного, от перехода на С++ я не получил.

А С++ таки не прост для нормального освоения. Ну это если на нём работать, а не Hello World делать.

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

>На самом деле, вначале используется _значение хэш функции_

Блин. Таблица имеет размер не 2^32 элементов, а меньше, так что значение хеш функции усекается.

затем идёт _поиск по дереву_ в котором используется _исходное НЕ ХЭШ_ значение

Используются обычные линейные списки.

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

Угомонись уже. Если бы ты вчитался в проведённый код, то понял бы, что в жабке класс строка содержит в себе мембер «хеш», который вычисляется при первом обращении к нему.

Естественно, в стандартной библиотеки это неприемлемо из за принципа «не платишь за то, что не используешь», ведь под хеш нужна память, его надо сбрасывать при изменении строки и т.д. В жабе всем наплевать, она всё равно жрёт кучу памяти и тормозит.

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

>lol, первый кандидат в программисты на D!

Это вы о ком?

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

Дак именно об этом я говорю. 'Нафига хешировать строки'.

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