Автор Тема: Опыт с D.  (Прочитано 8792 раз)

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Опыт с D.
« : Ноябрь 28, 2011, 07:56:20 am »
Может кому любопытно будет:

Я тут пытаюсь использовать D. Воткнулся в отсутствие нормальной
модульности (хотя она декларирована).

В частности - там нет разделения на спецификацию и реализацию модуля.
Что в некоторых случаях жутко не удобно.

То есть с этим там хуже чем в С++ (там хотя бы это более-менее
прилично эмулируется). В D с этим вообще никак.

Кроме того типы из private секции модуля и класса/структуры радостно
утекают во вне, то есть их можно использовать извне.

Примерчик:

// Implementation
module test;

public {
   void foo() {foo_helper();}

   struct Boo
   {
   public:
       void boo() {S ss; foo_helper();}
   private:
       struct S {};
   }
}

private {
   struct HelperStruct {};
   void foo_helper() {HelperStruct s;}
}

Specification (generated by dmd -H test.d -c) -- test.di file
// D import file generated from 'test.d'
module test;
public
{
   void foo() {foo_helper();}

   struct Boo
   {
       public
       {
           void boo() {S ss; foo_helper();}
           private struct S{}
       }
   }
}

private
{
   struct HelperStruct{}
   void foo_helper(){HelperStruct s;}
}

Usage:
import test;

void main() {
   foo();          // ok
   Boo b;          // ok
   b.boo();        // ok
   Boo.S ss;       // ok (wtf?)
   HelperStruct s; // ok (wtf?!)
}
Видим что сгенереная для модуля спецификация выглядит просто как
копи-паста реализации модуля. В С++ же это будет выглядеть так:

// test.hpp file
#ifndef _test_hpp_
#define _test_hpp_

void foo();

struct Boo
{
public:
    void boo();
private:
    struct S {};
};

#endif

// file test.cpp
#include "test.hpp"

struct HelperStruct {}; // private struct for this module only

static void foo_helper() {HelperStruct s;}

void foo() { foo_helper(); }

void Boo::boo() { S ss; foo_helper(); } // method implementation in
implementation side, not in specification!

// file main.cpp
#include "test.hpp"

int main() {
    foo();          // ok
    Boo b;          // ok
    b.boo();        // ok
    Boo::S ss;      // error: struct Boo::S is private
    HelperStruct s; // error: HelperStruct was not declared in this scope
    return 0;
}

В общем, я ожидал от D в плане модульности бОльшего... Посмотрим что
на это ответит Брайт и Александреску, ибо такая ситуация прямо
противоречит тому, что писал Александреска в своей статье case for D:

"D has a true module system that supports separate compilation and
generates and uses module summaries (highbrowspeak for "header files")
automatically from source, so you don't need to worry about
maintaining redundant files separately, unless you really wish to, in
which case you can. Yep, that stops that nag right in mid-sentence."
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Опыт с D.
« Ответ #1 : Ноябрь 28, 2011, 08:05:51 pm »
Да нет здесь какой-то проблемы с модульностью. Как себя должны вести приватные типы - не очевидно. В том же C++, насколько я помню, это не сразу устаканилось (разные компиляторы по разному понимали приватные  типы).

P.S. Да, можно сказать, что приватные типы никаким образом не должны присутствовать в интерфейсе модуля. Очевидно в такой постановке есть проблемы на практике. Поэтому, как всегда, пошли на компромисс.

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Опыт с D.
« Ответ #2 : Ноябрь 29, 2011, 02:06:00 pm »
Да нет здесь какой-то проблемы с модульностью. Как себя должны вести приватные типы - не очевидно. В том же C++, насколько я помню, это не сразу устаканилось (разные компиляторы по разному понимали приватные  типы).
Это очевидно протеворечит спеке на язык. Алсо это признали таки да, багом компилятора.

Между прочим, если это не править, то например радостно отваливается техника opaque pointers. То есть скрытых, локальных, приватных типов нет вообще.

P.S. Да, можно сказать, что приватные типы никаким образом не должны присутствовать в интерфейсе модуля. Очевидно в такой постановке есть проблемы на практике. Поэтому, как всегда, пошли на компромисс.
И какие же тут есть очевидные проблемы? Мы ведь про типы говорим, а не про поля класса. Забудь на минуточку про то что существуют классы и объекты, а также методы. Вот у тебя есть модуль.  Внутри и только внутри модуля требуется для пары фунций общий тип, который ни коем образом не должен торчать из модуля. Сейчас это сделать не возможно. А вот в С/С++ -- можно и с успехом делается. То есть ДАЖЕ в C/C++. Я не говорю уже про Аду или там модулу.

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

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Опыт с D.
« Ответ #3 : Ноябрь 29, 2011, 05:23:58 pm »
P.S. Да, можно сказать, что приватные типы никаким образом не должны присутствовать в интерфейсе модуля. Очевидно в такой постановке есть проблемы на практике. Поэтому, как всегда, пошли на компромисс.
И какие же тут есть очевидные проблемы?

Например. Есть модуль с f1() и f2(). Я хочу вернуть из f1() "херню", которую (потом) принимает только f2(). За пределами "модуля" "херня" смысла не имеет, ее смысл - связать вызововы f1 -> f2. Внутри "херни" я хочу иметь нужные потроха для работы f2(). И конечно я не хочу, чтоб кто-то эти потроха видел, кроме модуля. Как ты представляешь (можно гипотетически или в применении к D) простое/ эффективное/выразительное решение. В частности - какой тип будет иметь"херня"?

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Опыт с D.
« Ответ #4 : Ноябрь 29, 2011, 07:58:48 pm »
P.S. Да, можно сказать, что приватные типы никаким образом не должны присутствовать в интерфейсе модуля. Очевидно в такой постановке есть проблемы на практике. Поэтому, как всегда, пошли на компромисс.
И какие же тут есть очевидные проблемы?

Например. Есть модуль с f1() и f2(). Я хочу вернуть из f1() "херню", которую (потом) принимает только f2(). За пределами "модуля" "херня" смысла не имеет, ее смысл - связать вызововы f1 -> f2. Внутри "херни" я хочу иметь нужные потроха для работы f2(). И конечно я не хочу, чтоб кто-то эти потроха видел, кроме модуля. Как ты представляешь (можно гипотетически или в применении к D) простое/ эффективное/выразительное решение. В частности - какой тип будет иметь"херня"?

Это явный случай opaque pointer'a: http://en.wikipedia.org/wiki/Opaque_pointer
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Опыт с D.
« Ответ #5 : Ноябрь 29, 2011, 08:55:44 pm »
Это явный случай opaque pointer'a: http://en.wikipedia.org/wiki/Opaque_pointer

opaque pointer - одно из возможных решений. Причем не самое эффективное. Да и к простоте есть претензии. Ближе всего к эффективно/просто/наглядно подошел... внимание... Да, оберон! :) Там это будет запись с неэкспортированными полями. На плюсах можно замутить структуру с приватными полями - но это уже не так кошерно, потому что придется френдов прописывать (причем тут же в хедере). Ну и, конечно, всегда остаются различные вариации с поинтером.
« Последнее редактирование: Ноябрь 29, 2011, 09:00:13 pm от vlad »

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Опыт с D.
« Ответ #6 : Ноябрь 29, 2011, 08:59:10 pm »
Хотя стоит оговориться, что поскольку в обероне нормально возвращать записи нельзя, то там это будет выглядеть гхм... несколько многословно. Впрочем оберонщикам не привыкать.

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Опыт с D.
« Ответ #7 : Ноябрь 29, 2011, 11:34:24 pm »
opaque pointer - одно из возможных решений. Причем не самое эффективное. Да и к простоте есть претензии. Ближе всего к эффективно/просто/наглядно подошел... внимание... Да, оберон! :) Там это будет запись с неэкспортированными полями. На плюсах можно замутить структуру с приватными полями - но это уже не так кошерно, потому что придется френдов прописывать (причем тут же в хедере). Ну и, конечно, всегда остаются различные вариации с поинтером.
В D (после того как пофиксят багу с приватом) это будет публичная структура с приватными полями. Френдов прописывать не надо будет - приват там не скрывает приватное от тех кто объявлен в том же модуле.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

DIzer

  • Гость
Re: Опыт с D.
« Ответ #8 : Декабрь 09, 2011, 12:04:35 pm »
to Valexey- ну и какое впечатление  от языка? чисто технически обучать ему проще чем С++ и почему?

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Опыт с D.
« Ответ #9 : Декабрь 09, 2011, 08:03:57 pm »
to Valexey- ну и какое впечатление  от языка? чисто технически обучать ему проще чем С++ и почему?
Когда допилят, будет проще. А то сейчас может быть ситуация, когда ты говоришь студенту, что вот тут будет вот так. Он пишет программу, проверяет, а компилятор выдает нечто другое.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

DIzer

  • Гость
Re: Опыт с D.
« Ответ #10 : Декабрь 10, 2011, 08:41:28 am »
to Valexey- ну и какое впечатление  от языка? чисто технически обучать ему проще чем С++ и почему?
Когда допилят, будет проще. А то сейчас может быть ситуация, когда ты говоришь студенту, что вот тут будет вот так. Он пишет программу, проверяет, а компилятор выдает нечто другое.
так что допилят -  1. компилятор (кстати какой юзали?),  2. стандартные библиотеки, 3.  язык программирования, 3. иде? или всего понемногу(если последнее , то можно оценить в процентах сколько конкретно от каждого пункта по -вашему не хватает для нормальной работы)?

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Опыт с D.
« Ответ #11 : Декабрь 10, 2011, 11:48:44 am »
Когда допилят, будет проще. А то сейчас может быть ситуация, когда ты говоришь студенту, что вот тут будет вот так. Он пишет программу, проверяет, а компилятор выдает нечто другое.
так что допилят -  1. компилятор (кстати какой юзали?),  2. стандартные библиотеки, 3.  язык программирования, 3. иде? или всего понемногу(если последнее , то можно оценить в процентах сколько конкретно от каждого пункта по -вашему не хватает для нормальной работы)?

В основном компилятор. Использовал dmd последний. Но это без разницы на самом деле, ведь фронтенд и у gdc и у ldc тот же самый (ну, иногда отстает на 1-2 версии).

Стандартна либа неплоха. Документация к ней тоже. Проблем с поиском и использованием нужного было много меньше чем в том же ББ.

IDE мне не нужно.  Ну, то есть я использовал Sublime (http://www.sublimetext.com/), иногда nano. Мне вполне хватает. Вообще при изучении нового языка обычно предпочитаю щупать его без специализированной IDE.

Но в принципе есть на базе eclipse IDE для D. Народ пользуется и развивает. Но лично я не щупал.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

DIzer

  • Гость
Re: Опыт с D.
« Ответ #12 : Декабрь 10, 2011, 02:30:28 pm »
Когда допилят, будет проще. А то сейчас может быть ситуация, когда ты говоришь студенту, что вот тут будет вот так. Он пишет программу, проверяет, а компилятор выдает нечто другое.
так что допилят -  1. компилятор (кстати какой юзали?),  2. стандартные библиотеки, 3.  язык программирования, 3. иде? или всего понемногу(если последнее , то можно оценить в процентах сколько конкретно от каждого пункта по -вашему не хватает для нормальной работы)?

В основном компилятор. Использовал dmd последний. Но это без разницы на самом деле, ведь фронтенд и у gdc и у ldc тот же самый (ну, иногда отстает на 1-2 версии).

Стандартна либа неплоха. Документация к ней тоже. Проблем с поиском и использованием нужного было много меньше чем в том же ББ.

IDE мне не нужно.  Ну, то есть я использовал Sublime (http://www.sublimetext.com/), иногда nano. Мне вполне хватает. Вообще при изучении нового языка обычно предпочитаю щупать его без специализированной IDE.

Но в принципе есть на базе eclipse IDE для D. Народ пользуется и развивает. Но лично я не щупал.
Спасибо... Правильное следствие - ребята из Digital Mars не смогли допилить за 4 года  D ( с момента выпуска официальной "стабильной" версии) - в том смысле, что лаги вылазят у новичков при "шапочном" знакомстве , или юзалась альфа?
« Последнее редактирование: Декабрь 10, 2011, 02:36:21 pm от DIzer »

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Опыт с D.
« Ответ #13 : Декабрь 10, 2011, 03:40:43 pm »
Спасибо... Правильное следствие - ребята из Digital Mars не смогли допилить за 4 года  D ( с момента выпуска официальной "стабильной" версии) - в том смысле, что лаги вылазят у новичков при "шапочном" знакомстве , или юзалась альфа?
Есть нюанс - есть D1 и есть D2. Стабильный - D1. Я писал на D2. Это другой язык, хоть и похожий на D1. Он не совместим обратно (в общем случае) с D1. D2 еще не допилили, но именно он мне интересен.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Опыт с D.
« Ответ #14 : Декабрь 10, 2011, 08:04:11 pm »
Кстати, в следующем релизе либо через релиз D2 научится 64битам под MacOs X. То есть примерно в феврале-марте.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"