Информация об изменениях

Сообщение Re[17]: Язык ДРАКОН — новая идея в программировании от 08.05.2021 23:21

Изменено 08.05.2021 23:22 AleksandrN

Re[17]: Язык ДРАКОН — новая идея в программировании
Здравствуйте, Владимир Паронджанов, Вы писали:

ВП>На Хабре опубликована моя статья по языку ДРАКОН:

ВП>https://habr.com/ru/post/537294/

ВП>

Умеет ли человечество писать алгоритмы? Безошибочные алгоритмы и язык ДРАКОН



Человечество вообще ничего не умеет делать без ошибок. Ошибаются все.

В комментариях к статье на Хабре было много просьб привести доказательства утверждений, приведённых в статье, но это не было сделано.
Много эмоций по поводу аварии Боинга 737 MAX, но не приведено доказательств, что на Драконе нельзя сделать ту-же самую ошибку, которые допустили разработчики Боинга.

Много говорится про алгоритмы, но ничего не говорится ни про типы данных, ни про структуры данных.
Для гибридных языков объявление переменных делается средствами языка, который в паре с Драконом применяется.
А были ли попытки сделать язык, предназначенный для использования в Драконе?

Для примеров схем не приводится тот же самый алгоритм в псевдокоде, что бы сравнить схему и псевдокод и показать преимущество схемы.
набросайте, например, псевдокод для схемы покраски забора https://hsto.org/webt/4o/jo/nv/4ojonvww3gylmlj6hc0rkcwxfp4.png

Первое сообщение в этой теме сделано в 2012 году и за это время только 3 редактора появилось. Но в них и близко нет возможностей современных IDE, например — перехода к объявлению функции и поиска мест, где она используется. Так и не сделан контроль версий.

Рассмотрим простой пример из редактора — сравнение строк (взят первый попавшийся пример).
  В экран не влезает


Это не способствует удобству работы и уменьшению числа ошибок.

В сгенерированном коде struct String объявлена как
struct String
{
    char* Buffer;
    int Length;
};


Но где эта структура в схеме задаётся?

В статье и комментариях много говорится про то, что goto это плохо, но посмотрим на
  код, сгенерированный по схеме
int String_Compare(
    const struct String* left,
    const struct String* right
) {
    // item 237
    int i;
    int leftChar, rightChar;
    int result = 200;

    // item 229
    if (left == 0) {
        /* item 230 */
        printf("String_Compare: left is null.\n");
        abort();
    } else {
    }

    // item 233
    if (right == 0) {
        /* item 234 */
        printf("String_Compare: right is null.\n");
        abort();
    } else {
    }

    // item 665
    if (left == right) {
        /* item 666 */
        result = 0;
        goto item_677;
    } else {
        /* item 238 */
        i = 0;
    }

    item_239 :
    if ((i < left->Length) && (i < right->Length)) {
        /* item 244 */
        leftChar = left->Buffer[i];
        rightChar = right->Buffer[i];
    } else {
        /* item 259 */
        goto item_253;
    }

    // item 245
    if (leftChar < rightChar) {
        goto item_249;
    } else {
    }

    // item 246
    if (leftChar > rightChar) {
        /* item 248 */
        result = 1;
        goto item_677;
    } else {
        /* item 251 */
        i++;
        goto item_239;
    }

    item_253 :
    if (left->Length < right->Length) {
    } else {
        goto item_254;
    } 

    item_249 :
    result = -1;
    goto item_677;

    item_254 :
    if (left->Length > right->Length) {
        /* item 256 */
        result = 1;
    } else {
        /* item 257 */
        result = 0;
    }

    item_677 :
    return result;

}


В этом коде goto применяется. Противоречние со статьёй.


А теперь, сравним с кодом, написанным традиционным способом
int String_Compare(
    const struct String* left,
    const struct String* right
)
{
    int result = 0;
    for ( int i = 0; i < left->Length && i < right->Length && !result; i++)
        result = left->Buffer[ i ] - right->Buffer[ i ];
        
    if ( !result )
        result = left->Length - right->Length;

    // Что бы возвращаемый результат был в том же виде, что и сгенерированная функция.        
    if ( result < 0 )
        result = -1;
    else if ( result > 0 )
        result = 1;
        
    return result;
}


Ни удобства, ни лучшего понимания, ни уменьшения вероятности ошибок, при использовании Дракона, я не вижу.
Если Вы видите, почему за много лет нет продвижения в создании удобных инструментов и примеров крупных работ?
Re[17]: Язык ДРАКОН — новая идея в программировании
Здравствуйте, Владимир Паронджанов, Вы писали:

ВП>На Хабре опубликована моя статья по языку ДРАКОН:

ВП>https://habr.com/ru/post/537294/

ВП>

Умеет ли человечество писать алгоритмы? Безошибочные алгоритмы и язык ДРАКОН



Человечество вообще ничего не умеет делать без ошибок. Ошибаются все.

В комментариях к статье на Хабре было много просьб привести доказательства утверждений, приведённых в статье, но это не было сделано.
Много эмоций по поводу аварии Боинга 737 MAX, но не приведено доказательств, что на Драконе нельзя сделать ту-же самую ошибку, которые допустили разработчики Боинга.

Много говорится про алгоритмы, но ничего не говорится ни про типы данных, ни про структуры данных.
Для гибридных языков объявление переменных делается средствами языка, который в паре с Драконом применяется.
А были ли попытки сделать язык, предназначенный для использования в Драконе?

Для примеров схем не приводится тот же самый алгоритм в псевдокоде, что бы сравнить схему и псевдокод и показать преимущество схемы.
набросайте, например, псевдокод для схемы покраски забора https://hsto.org/webt/4o/jo/nv/4ojonvww3gylmlj6hc0rkcwxfp4.png

Первое сообщение в этой теме сделано в 2012 году и за это время только 3 редактора появилось. Но в них и близко нет возможностей современных IDE, например — перехода к объявлению функции и поиска мест, где она используется. Так и не сделан контроль версий.

Рассмотрим простой пример из редактора — сравнение строк (взят первый попавшийся пример).
  В экран не влезает


Это не способствует удобству работы и уменьшению числа ошибок.

В сгенерированном коде struct String объявлена как
struct String
{
    char* Buffer;
    int Length;
};


Но где эта структура в схеме задаётся?

В статье и комментариях много говорится про то, что goto это плохо, но посмотрим на
  код, сгенерированный по схеме
int String_Compare(
    const struct String* left,
    const struct String* right
) {
    // item 237
    int i;
    int leftChar, rightChar;
    int result = 200;

    // item 229
    if (left == 0) {
        /* item 230 */
        printf("String_Compare: left is null.\n");
        abort();
    } else {
    }

    // item 233
    if (right == 0) {
        /* item 234 */
        printf("String_Compare: right is null.\n");
        abort();
    } else {
    }

    // item 665
    if (left == right) {
        /* item 666 */
        result = 0;
        goto item_677;
    } else {
        /* item 238 */
        i = 0;
    }

    item_239 :
    if ((i < left->Length) && (i < right->Length)) {
        /* item 244 */
        leftChar = left->Buffer[i];
        rightChar = right->Buffer[i];
    } else {
        /* item 259 */
        goto item_253;
    }

    // item 245
    if (leftChar < rightChar) {
        goto item_249;
    } else {
    }

    // item 246
    if (leftChar > rightChar) {
        /* item 248 */
        result = 1;
        goto item_677;
    } else {
        /* item 251 */
        i++;
        goto item_239;
    }

    item_253 :
    if (left->Length < right->Length) {
    } else {
        goto item_254;
    } 

    item_249 :
    result = -1;
    goto item_677;

    item_254 :
    if (left->Length > right->Length) {
        /* item 256 */
        result = 1;
    } else {
        /* item 257 */
        result = 0;
    }

    item_677 :
    return result;

}


В этом коде goto применяется. Противоречние со статьёй.


А теперь, сравним с кодом, написанным традиционным способом
int String_Compare(
    const struct String* left,
    const struct String* right
)
{
    int result = 0;
    for ( int i = 0; i < left->Length && i < right->Length && !result; i++)
        result = left->Buffer[ i ] - right->Buffer[ i ];
        
    if ( !result )
        result = left->Length - right->Length;

    // Что бы возвращаемый результат был в том же виде, что и у сгенерированной функции.
    if ( result < 0 )
        result = -1;
    else if ( result > 0 )
        result = 1;
        
    return result;
}


Ни удобства, ни лучшего понимания, ни уменьшения вероятности ошибок, при использовании Дракона, я не вижу.
Если Вы видите, почему за много лет нет продвижения в создании удобных инструментов и примеров крупных работ?