суббота, 12 декабря 2009 г.

[comp.prog.flame] Samsung Bada – маразматическая C++ платформа

Не так давно Samsung анонсировал собственную платформу для разработки приложений для мобильных устройств – Bada. Основным языком разработки для нее является C++. Но какой C++? C++ без исключений, без умных указателей, без использования RAII, без STL. И это в XXI-ом веке! Маразм крепчал, однако.

С подачи одного из разработчиков Poco я пролистал презентацию по платформе Bada. Желание смотреть на Bada пропадает после двух первых примеров: использования двухфазной инициализации объектов и кодов возврата+макросов вместо исключений.

Объекты в Bada нужно инициализировать посредством явного вызова метода Construct:

class TwoPhaseClass {
  public:
    TwoPhaseClass(void) : p1(null), p2(null) { }
    ~TwoPhaseClass(void) { delete p1; delete p2; }
    
    result Construct(void) {
      SimpleClass* p1 = new SimpleClass();
      SimpleClass* p2 = new SimpleClass(); // Out-of-memory error.
    }

  private:
    SimpleClass* p1;
    SimpleClass* p2;
};

void MyClass::SomeFunction() {
    // Calls the constructor which does not throw an exception.
  TwoPhaseClass a;
    // Calls the Construct() method which allocates two SimpleClass objects.
    // Destructor is called because ‘a’ itself is fully constructed.
  result r = a.Construct();
  ...
}

Какая религия им запретила использовать для p1 и p2 класс std::auto_ptr – не понятно.

А вот работа без исключений еще прикольнее:

result r = E_SUCCESS;
...
// Case 1: The method returns a result.
r = list.Construct(...);
if (r != E_SUCCESS) // identical to 'if (IsFailed(r))'
{
  // Process the error condition.
}
// Case 2: The method sets the result in the method body or returns null.
pObj= list.GetAt(...);
if (GetLastResult() != E_SUCCESS) // or 'if (pObj== null)'
{
  // Process the error condition.
}
// Case 3
r = pObj2->Construct(..);
TryCatch(r == E_SUCCESS, , "[%s] Service could not be initialized.",
  GetErrorMessage(r));
...
CATCH:
  delete pObj1;
  delete pObj2;
  return;

Здесь следует обратить внимание на TryCatch и CATCH – это как раз то, что предлагается вместо нормальных C++ исключений. А следующий пример демонстрирует всю мощь и силу корейской программистской науки:

result r = E_SUCCESS;
...
// Case 1: Use a `goto CATCH'.
r = pList->Construct(...);
TryCatch(r == E_SUCCESS, delete pList, "[%s] Propagated.", GetErrorMessage(r));
...
CATCH:
  SetLastResult(r);
  return null;

// Case 2: Return a result.
  r = list.Construct(...);
  TryReturn(r == E_SUCCESS, r, "[%s] Propagated.", GetErrorMessage(r);

// Case 3: Return null.
  r = list.Construct(...);
  TryReturn(r == E_SUCCESS, null, "[%s] Propagated.", GetErrorMessage(r);

// Case 4: Convert an error condition into another error condition.
  r = list.indexOf(...);
  TryReturn(r == E_SUCCESS, E_INVALID_ARG, "[E_INVALID_ARG] converted from '%s'.",
    GetErrorMessage(r));

Ну что тут скажешь… Опыт разработчиков первых версий Symbian им явно не указ. Наличие большого количества C++ных библиотек и приложений, написанных на “нормальном” C++ с исключениями, STL и даже с Boost-ом – тем более.

Особо умиляет мотивация отказа от исключений – мол очень высокий run-time overhead. Трындец, просто. Во времена, когда у смартфонов устанавливаются гигагерцные процессоры и гигабайты памяти, накладные расходы на обработку C++ исключений кто-то рассматривает всерьез? Афигеть. Мы, в свое время, на 386-х и 486-х как-то умудрялись и C++ исключения использовать, и умные указатели, и даже STL. И все это на 40MHz процессорах с 4Mb памяти на борту. В общем, чего-то я не понимаю :-/

Желающие могут пролистать презентацию до конца. Там еще много забавного. Например, собственные контейнеры. Но по мне вывод однозначен – в топку такую платформу.

PS. А ведь, по слухам, Samsung собирается провести конкурс среди разработчиков с призовым фондом в несколько миллионов долларов ($2.7M призовой фонд и $300K главный приз). Редиски, блин. Их бы энергию, да в мирных целях.

Отправить комментарий