LINUX.ORG.RU

Зачем нужна статическая типизация?, или Вы всё врете!

 ,


1

4

В теме "Питонячьи радости " на последних страницах между мной и @rtxtxtrx внезапно разгорелся спор, из которого я понял, что есть еще люди, которые не считают динамическую типизацию (в том виде, в котором она представлена в Питоне, а именно строгая динамическая типизация) серьезным недостатком при работе с большим объемом кода, особенно при рефакторинге. Вообще изначально разговор завязался вокруг назначения type hints введенных в Питон 3: я утверждал, что они нужны для создания семантических связей в коде, которые будут препятствовать внесению деструктивных изменений в код в результате опечатки или иной ошибки кодера (изменил код, в результате которого какое-либо выражение получило некорректное значение, которое тем не менее обладает схожим с корректным значением типовым контрактом, поэтому при запуске код не «упадет» сразу, указав на проблему); оппонент заявил, что они нужны для (само)документации и не более того.
Но потом выяснилось, что и царь-то ненастоящий (читай, статическая типизация). Не нужна она, просто именуй сущности понятно и уповай на строгую типизацию. А если типизация не строгая, то сами виноваты, у нас в Питоне всё ОК.
Поскольку тема большая и вкусная, я предлагаю всем обсудить этот очень важный вопрос в меру скромных сил и познаний каждого желающего. Обсуждение вторичных вопросов, как-то «статическая типизация нужна для генерации эффективного кода», «при динамической типизации тип только один, object» etc. не предусмотрено — спорим только о том, дает ли статическая типизация выигрыш, если надо перекраивать несметные тыщи kloc. Если есть вообще о чем спорить 😅.

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

Школьная аксиоматика утверждается как единственная.

С какой стати? Где в учебнике геометрии указывается, что изучаемая система – единственная?!

аксиома не истинное утверждение

Как раз и истинное, т.е. принимаемое как истинное. В математике аксиома и постулат синонимы, в физике аксиом нет вообще, а под постулатами понимают ФАКТЫ, незыблемость которых нельзя доказать, исходя из физической теории, но для которых экспериментальное опровержение не найдено.

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

Никакое знание не даёт власть. Гуманитарии лишь умеют нравиться электорату

Никакого противоречия тут конечно же нет.

Две Мировые войны. Столетнюю войну, Тридцатилетнюю войну, войну Алой и Белой Розы

Забыли ещё войну ящеров с русами упомянуть. Мир устроен не так, как вам нравится. Но это не проблема мира.

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

Никакое знание не даёт власть. Гуманитарии лишь умеют нравиться электорату, который в среднем вообще никакого знания не имеет.

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

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

Я металлофизик по образованию. Только не надо меня про дэвэподэтэ спрашивать, пожалуйста.

ugoday ★★★★★
()

полиморфизм как случай вычисляемого goto c возвратом

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

вы правы делители нуля не изучаются в В(ысших)[Технических]У(чебных)Заведениях

алгебра кольца с делителями нуля в классических Университетах на математических(+мех|мех.мат) факулях

есть прикольная сказка Профессия (А.Азимова)

есть закон Старжона и его частный случай

90% гумов производят гумно лиш

так и техи те ещё демиурги

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

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

а не ибо общеочевидно верно

как раз таки «5 постулат» очевидно не вполне «общеощевидно верен» при всей практической верности

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

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

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

сообщают как о «то что не ставится под сомнения ибо так»

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

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

алгебра кольца с делителями нуля

Вы не улавливаете разницу даже в русском языке? ДЕЛИТЕЛЬ нуля и деление НА нуль?! Делитель нуля – это такой элемент (очень нетривиальных множеств), при умножении которого на ненулевой элемент получаем нуль.

Вот только укажу, что обратная операция опять НЕ определена, т.е. при делении нуля на его делитель частное не определено однозначно, т.е. в тех же кольцах по модулю это будет (примитивно) много чисел, составляющих класс эквивалентности по модулю.

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

Пусть эпсилон , nyet эпсилон слишком мало, пусть икс это

вуз и университет синонимичны но не алиасы

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

Whom do I pay to have this annoying clueless asshole shot?
OH MY GOD, I really can’t take any more.

However, I have always been taught, and have always believed that "goto"s are inherently evil. They are the creators of spaghetti code

No, you’ve been brainwashed by CS people who thought that Niklaus Wirth actually knew what he was talking about. He didn’t. He doesn’t have a frigging clue.

Помянем.

token_polyak ★★★★★
()
Последнее исправление: token_polyak (всего исправлений: 4)
Ответ на: комментарий от monk

Ну как сказать… в школе корень из отрицательного числа брать нельзя, на 0 делить нельзя, а в вузе внезапно доопределяем всё до нужного. Потом внезапно оказывается, что количество измерений у пространства может быть бесконечно, элементами могут быть функции и при этом у векторов в этом пространстве может быть скалярное произведение.

В ВУЗе, если специальность нематематическая, обычно не изучают алгебру некоммутативных колец, например.

И что, теперь будешь бегать как ошпаренный и кричать «Ай яй яй нам все врали. Операции могут быть некоммутативны!!!!111. А ещё я там делители нуля видел!!111»

Psilocybe ★★★★
()

Срач развели а ответ прост.

Зачем нужна статическая типизация?

Типизация нужна , чтобы пердотвращать нежелательное поведение в программе. Статическая - чтобы это нежелательное поведение выявлять на этапе компиляции.

Собственно всё.

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

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

Осталось добавить /thread, и всё на этом. Спасибо, поставили точки над «i».

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

Типизация нужна , чтобы пердотвращать нежелательное поведение в программе.

Для этого есть тестирование. Типизация это больше про структурирование программы. Type checking просто бонус, не более того. Но некоторые развели вокруг этого религию.

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

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

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

Да, согласен. Программисты вообще любят дурью маяться. Особенно те, что выбились в начальники. Хорошо, что у нас тут опенсорс. Можно без тестов писать и даже без типов, и левой пяткой.

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

Для этого есть тестирование. Типизация это больше про структурирование программы.

Советую Вам обратиться к первооснова и наконецто изучить материал.

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

А казалось бы. Где-где а в ui оно смотрелось еще более менее вменяемо.

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

Срач развели а ответ прост.

Да это всё понятно. Но срача давно хорошего не было, хотелось срач.
А ты вообще не участвовал, только клованов ставил, фу таким быть.

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

Что-то где-то в жизни явно пошло не так, если введение всех этих флагов undo_a, undo_b, undo_c воспринимается лучше, чем простой goto

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

С флагами не приходится при чтении смотреть, куда идёт переход.

А воспринимается лучше то, к чему привык. Если в детстве писал на ассемблере, то логичнее goto. Более того, даже цикл n+1/2 и выход из вложенных циклов в таком случае пишется с goto.

Если же «никому и в голову не приходит строить управление на основе goto», то, очевидно, что из вложенных циклов надо выходить через return, из цикла с половиной через break, а освобождение ресурсов писать через флаги (если их мало) или через стек (единообразно).

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

Желание выходить из вложенных циклов часто свидетельствует о неверной композиции кода по методам и смешивании слоёв абстракций. А если это желание соседствует с тем, чтобы выходить не через return, а через goto или многоуровневый break (в языках, где он есть), то неверная композиция кода имеет место почти наверняка.

В отличие от случая, рассмотренного в указанном email.

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

Желание выходить из вложенных циклов часто свидетельствует о неверной композиции кода по методам и смешивании слоёв абстракций.

Какая должна быть правильная композиция кода для поиска значения в многомерном массиве?

monk ★★★★★
()

Блин, мужики, вам уже дохрена лет, статическая vs динамическая типизация облизана со всех сторон в научных работах, посмотрите там что пишут, а то вы тут как бабки базарные, лучше бы работу работали

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

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

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

:) при поиске в многомерном массиве не обязательны вложенные циклы

достаточно одного и функции отображения счётчика цикла в координаты элемента

и ФСЁ никаких вложенных циклов :)

зы. для си-массивов просто скан :)

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

достаточно одного и функции отображения счётчика

Тогда уж и указатель (способ указывать) по какому измерению мы многомерный массив перебираем.

P.S. После чего может оказаться, что выход из вложенного цикла по goto — не такая уж и страшная идея.

P.P.S. А прыжок goto в тело вложенного цикла — страшная. Собственно, с ней и боролись, а безобидный прыжок из цикла под раздачу попал.

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

Для поиска в массивах придумали циклы с постусловием, использовать для этого циклы со счётчиком ///свидетельствует о неверной композиции кода (С).

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

Так всё равно же вложенные циклы получаются. А @qulinxao3 предлагает вообще от них отойти.

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

А прыжок goto в тело вложенного цикла — страшная.

first = 1;
do
{
   if (first)
     first = 0;
   else
   {
      block1a();
      block1b();
      block1c();
      ...
   }
   block2a();
   block2b();
   block2c();
   ...
} while(cond)

с goto выглядело симпатичней:

goto start;
loop:
   block1a();
   block1b();
   block1c();
   ...
start:
   block2a();
   block2b();
   block2c();
   ...
if(!cond) goto loop;
monk ★★★★★
()
Ответ на: комментарий от mister_VA

счётчик по факту нумератор который прекращается либо по условию либо по исчерпанию области значений(координата элементы)

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

дык эта

мощьность счётного n-мерного равномощьно одномерному - вопрос чиста в порядке обхода (по классике: «сверху вниз наискосок»)

фсё в руках функции нумерации элементов данного массивища

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

счётчик по факту нумератор который прекращается либо по условию либо по исчерпанию области значений

У нас разное понимание «счётчик цикла». То, что в Си можно в for впихнуть условие, не означает, что в других ЯП это возможно.

Вообще не важно, говорим мы конкретно про for или имеем ввиду просто цикл со счётчиком, устроенный любыми операторами, хоть if – goto, смысл моего сообщения в том, что при поиске некоего конкретного значения в массиве нет необходимости изначально задавать просмотр всего массива, дабы потом заморачиваться выпрыгиванием из штанов цикла по goto или break.

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

мощьность счётного n-мерного равномощьно одномерному

Это всё замечательно, но если на практике выбор следующего члена массива будет осуществляться с помощью жопной арифметики на индексах, то там гарантированно случатся ошибки (от которых никая статическая типизация не спасёт (такие дела)). Напротив если в функции для выбора направления обхода можно будет явно и просто указать «ищем по строчкам/по колонокам/по i-тому индексу», то жизнь станет гораздо лучше.

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

А как должно выглядеть not_first_run()?

int not_first_run()
{
   static int not_first = 0;
   int result = not_first;
   not_first = 1;
   return result;
}

?

А если этот цикл потом ещё раз вызовут? С флагом надёжнее, так что это тот же первый вариант.

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

С флагом надёжнее, так что это тот же первый вариант.

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

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

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

Только с сигнатурой if(not_first_run()) совсем не очевидно, как потом этот флаг сбрасывать и наличие побочного эффекта. А когда if(first_run) first_run = 0; else, то всё очевидно и на поверхности.

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

Я вот такую технику применяю. И никаких goto нет и освободить переменную не забудешь. FreeAndNULL() можно и по ходу обработки вызывать, если уж очень хочется, а не только в конце.

void FreeAndNULL(void **Ptr);

int function(const char *param)
{
    int retval = 1;
    char *var1 = fcn_that_returns_dynamically_allocated_string(param);

    if (var1 != NULL) // Эта проверка, кстати, уже лишняя.
    {
        if (isValid(var1))
            retval = some_function(var1);
        else
        if (isGood(var1))
            retval = 0;
    }
    else
       retval = 0;

    FreeAndNULL((void**)&var1);
    return retval;
}

void FreeAndNULL(void **Ptr)
{
    if (Ptr == NULL)
        return;
    if ((*Ptr) != NULL)
        free(*Ptr);
    (*Ptr) = NULL;
}
Vic
()
Последнее исправление: Vic (всего исправлений: 2)
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)