LINUX.ORG.RU

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

 ,


1

4

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

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

ООП - абсолютно алгоритмический!

Скорее всего, я ошибаюсь, но «алгоритм» – это строго определенная последовательность действий. Действий. И не более того.

При этом алгоритмы отделены от данных. В противном случае не было бы известной работы Н.Вирта «Алгоритмы + структуры данных = программы».

ООП же характеризуется именно что инкапсуляцией, т.е. объединением данных и кода (т.е. алгоритмов) их обрабатывающих.

Т.е. ООП не является алгоритмическим подходом, т.к. там еще и данные участвуют.

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

«ВСЕ ОШИБКИ».

Далее, логика «все ошибки не находит, но некоторые находит и это лучше, чем ничего» в принципе имеет право на жизнь. Однако хотелось бы, чтобы области, где мне компилятор помогает и где он самоустраняется были строго очерчены. Вот, как в русте сделали. Здесь у нас футбольное поле, бегай где хочешь, borrow checker всё проверил. А здесь, видишь знак unsafe — это минное поле, ходи осторожно. У вас же минные и футбольные поля плавно перетекают одно в другое и неудивительно, что везде оторванные ноги валяются.

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

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

Спасибо, братан!!! За еще одно обесценивание.

Вот, как в русте

Легким движением руки спор из «динамик типы vs статик типы» превращается в «C++ vs Rust». Ай молодца :-)

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

Вы можете так сказать и я даже соглашусь, что если контролировать, где какие данные приходят, куда уходят, помнить где я считаю в натуральных числах, а где в кольце вычетов по модулю 42, то всё будет хорошо. Однако, мне казалось, что вся затея со строгой статической типизацией началась, чтобы повысить надёжность кода через снижение когнитивной нагрузки на программиста. А если от меня напротив требуется повышенная внимательность и аккуратность, то мы идём в прямо противоположном направлении.

Кроме того, если мы возьмём выражения

100+200=44
"2"+2=22
2+"2"=4

то совершенно непонятно, почему мы должны считать одни из них ложными, а другие истинными. Мы точно так же можем сказать, что число это не число, строка это не строка, сложение это не сложение, а всё это некие сущности, которые сочетаются по формальным правилам, описанным в спецификации. И если ты не понимаешь, почему "2" + 2 != 2 + "2", то это твои и только твои проблемы, простофиля. В следующий раз будь пособраннее.

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

помнить где я считаю в натуральных числах, а где в кольце вычетов

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

требуется повышенная внимательность и аккуратность

Повышенная по сравнению с программированием на чём? Любом языке с динамической типизацией?

совершенно непонятно, почему мы должны считать одни из них ложными, а другие истинными

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

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

Алгоритм, конечно, это последовательность действий, но с чем, а с данными. Т.о. данные являются неотъемлемой частью любого алгоритма. Более того, вид/тип/характер данных очень сильно влияет на алгоритм.

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

Т.о. данные являются неотъемлемой частью любого алгоритма.

Вы договорились до того, что сортируемые данные являются частью алгоритма сортировки («пузырьком», например).

Алгоритмы работают над данными. Как следствие, для разных типов данных могут быть разные алгоритмы (а могут и не быть). Но сами данные не являются частью алгоритма.

Тогда как в ООП данные (наряду с процедурами) являются частью объектов.

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

Опровергнуть мое воинствующее невежество просто – дайте ссылку на какую-то «программу» для Z1, в которой будет видно применение этого самого prototype-based OOP.

С учётом того, что ты ранее отказывался принимать работы Цузе к рассмотрению, объявив это «конспирологией» и ещё как-то, выглядит как не очень стабильная позиция. Воинствующее невежество состоит именно в этом отказе. Что мешало отнестись к информации нейтрально? Ты впервые столкнулся с тем, что историю пишут победители, а достижения проигравшей стороны замалчиваются? Я вот на днях узнал, что в Японии была/есть ОС, масштабируемая от калькуляторов до компьютеров и чуть ли не Микрософт её купил и сделал то ли винду, то ли ещё что-то. Это вам не линукс, который на калькулятор 80-х не полезет.

Тут просто о чём разговоры идут? О сортах говна, и что общего у этого говна? Страна выпуска - США. И Раст, и Си, и JavaScript повелись оттуда. Если они даже не сами что-то сделали, то они всех заставили этим пользоваться. Даже если в США кому-то удаётся случайно сделать что-то нормальное, типа лиспа или смолтолка, они потом всё равно это превращают в говно или так обмазывают говном, что становится уже неотличимо от говна. И моё художественное чувство оскорблено этим говном.

В этой ситуации, если я слышу о том, что что-то сделали раньше американцев в Германии, Франции, России или Японии, да пусть даже в Турции или Китае, я радуюсь. Особенно здорово, когда не в США что-то хорошее придумано, а американцы только лишь украли и присвоили, ну или купили на худой конец. Что, может быть, говно не обязательно к употреблению внутрь. А ты пытаешься у меня отобрать эту радость и накормить говном. В этом корень проблемы с отвержением работ Цузе. С тем же успехом можно отвергать и Эль-76, потому что он советский, или какой-нибудь Окамль или Оберон, потому что он французский, и мы это наблюдаем.

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

И если ты не понимаешь, почему "2" + 2 != 2 + "2"

А зачем это понимать? На С++ - это не валидная конструкция (в смысле такое не будет компилироваться). С другой стороны:

'2' + 2 != 2 + '2' // - это false
// т.е.
'2' + 2 == 2 + '2' // - это true

потому что '2' - это тип char, т.е. целочисленный и имеет право учавствовать в арифметических выражениях.

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

Пример «программы» для Z1 будет?

А то я звиздеть как вы о том, в чем не разбираюсь, не могу. Мне бы по простому: вот код, вот что в нем видно.

Так что, show me the code!

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

Здесь уже не о Z1 идёт разговор, а о твоём отношении к фактам, каковое и есть воинствующее невежество.

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

Вот этим сообщением я отвечаю на твой комментарий, где ты проявил своё воинствующее невежество:

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

Так-то разговаривая о прокладке электропроводки в комнате можно уйти к рассуждениям о вкладе условного Шарля де Кулона. Хотя следовало бы ограничиться моментами появления на рынке пассатижей с изолированными рукоятками.

Теперь ты пытаешься съехать с этого и уже требуешь, чтобы тебе предъявили коды на Zn. Но интернет всё помнит. Ты не хотел ничего про них знать - это и есть воинствующее невежество.

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

Здесь уже не о Z1 идёт разговор, а о твоём отношении к фактам, каковое и есть воинствующее невежество.

Если где-то здесь озвучивался факт, что в программах для механической вычислительной машины Z1 применялся prototype-based OOP, то я этого, проссыте, не заметил.

Если таковой факт есть, то покажите.

Если нет, то все это к вопросам веры о том, что Цузе когда-то о чем-то размышлял и именно из этого (а не из кучи всего, что появилось много позже) появилось prototype-based OOP, причем раньше, чем class-based OOP.

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

Если ты каешься в своём прошлом воинствующем нежелании знать историю, то надо покаяться в явной форме, а не пытаться это сделать проблемой твоих собеседников. Щас тебе прямо все побежали, спотыкаясь, искать коды.

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

Теперь ты пытаешься съехать с этого и уже требуешь, чтобы тебе предъявили коды на Zn. Но интернет всё помнит. Ты не хотел ничего про них знать - это и есть воинствующее невежество.

Ну так опровергните это мое вопиющее невежество!

Покажите таки код.

Это же так просто, Цуге же все придумал.

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

Щас тебе прямо все побежали, спотыкаясь, искать коды.

Ну, вообще-то, когда говорят, что «prototype-based OOP появился раньше class-based OOP», то подразумевается, что это имеет некие объективные подтверждения.

Но их нет.

Есть рассуждения о том, что Цуге о чем-то размышлял. Все.

Значит, это вопрос веры. По вопросам веры (как и по вопросам конспирологии) не ко мне.

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

Твоё нежество не в том, есть ли там этот код или нет - я этих кодов не видел, и знаю только, что эти машины существовали и потом американцы их забрали в качестве трофея и наверняка использовали наработки. Невежество - именно в процитированной фразе и его нельзя опровергнуть, поскольку ты явно объявил, что история из 30-х тебя не интересует. Разные утверждения:

  • «меня не интересует история из 30-х»
  • «дайте мне доказательства, что это было в 30-х»

И ты пытаешься, чтобы за тебя работали. А сначала надо признать, что «меня не интересует история из 30-х» - это воинствующее невежество. Тебе тут @Obezyan долго пытался втолковать и ты его разочаровал. Кто должен пострадать? Я считаю, из вас двоих пострадать должен ты.

den73 ★★★★★
()
Последнее исправление: den73 (всего исправлений: 1)
Ответ на: комментарий от crutch_master
  • обязательная пересборка на один частный случай

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

Зато js будет интерпретироваться на каждой (бля на каждой) машине, где выполняется.

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

Это не вопрос веры. Ты написал совершенно другое: что 1930-е годы и работы Цузе - это было слишком давно, чтобы имело отношение к компьютерам. Ну так Аристотель с его логикой был ещё раньше и на песке чертил или не знаю как там. Тоже не имеет отношения?

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

Разные утверждения: «меня не интересует история из 30-х»

А додуматься до того, что «меня не интересует история из 30-х» именно потому, что ООП появилось в 60-х, не судьба? Мозгов не хватает?

Но, если потом вы взялись обвинять меня в невежестве, значит вы знаете то, чего не знаю я. Значит ООП таки появилось в 30-х и это можно подтвердить.

Можно?

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

Ты написал:

100+200=44
"2"+2=22
2+"2"=4

Проверяю код:

let a = 100 + 200
let b = "2" + 2
let c = 2 + "2"

console.log(a, typeof(a), b, typeof(b), c, typeof(c));

На Google Chrome Version 119.0.6045.202 (Official Build) (64-bit) вывод такой:

300 'number' '22' 'string' '22' 'string'

И судя по тому, что ты ошибся в понимании того, к какому типу будет произведено приведение, то скорее всего и многие js разработчики тоже где-то наступают на подобные грабли. Ну кроме @crutch_master конечно, он такой херни в жизни не напишет, но он же не анскилл какой-нибудь.

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

Я знаю, что ты объявил в явном виде незаинтересованность в истории понятий. Это оно и есть. Для этого совершенно не нужно ничего знать про Цузе. В 60-х ООП только кто-то придумал так назвать и разрекламировал. Было ли оно раньше или нет - это вопрос, который можно изучать, а можно не изучать. Ты решил не изучать и начал нападать на того, кто изучал. «Воинствующее» именно из-за нападок. Я не изучал, но не потому, а просто как-то не сложилось. И так понятно, что современное программирование хромое на все лапы.

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

Если бы не нападал, а просто не интересовался, то это «убеждённое невежество». Если не интересовался как я, т.к. важнее результат, а не процесс - это «прагматичное невежество». Но это невежество в любом случае. Перескок от вопроса «это всё не важно» к вопросу «а покажите мне, что это правда» - это явный отход от позиции невежества, что можно приветствовать. Но нужно и покаяться, объявив что-то из серии «да, я был воинствующем невеждой, а теперь исправился и мне стало интересно, было ли у Цузе ООП или нет»

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

Ты написал совершенно другое: что 1930-е годы и работы Цузе - это было слишком давно, чтобы имело отношение к компьютерам.

И обосновал это так:

А я вам намекаю, что пока не появились ЭВМ и люди не набили кучу шишек создавая программы для них, пока не появилась потребность в ЯП, пока не пришли к выводу, что должны быть ЯП высокого уровня, пока не убедились в том, что программы должны быть модульными, а инкапсуляция – это не пустой звук, ООП как такового не было. В практическом смысле этого слова.

Более того, я спрашивал, а почему бы нам не опуститься в историю до Бэббиджа и Лавлейс, ведь они так же сделали вклад в развитие вычислительной техники и программирования. Без их работы того самого prototype-based OOP не появилось бы спустя 100 лет.

Посему еще раз подчеркну: что излишний уход в глубину истории к каким-то (возможно, мифическим) истокам – это лишнее теоретизирование когда речь о сугубо практических вопросах.

Simula67 появилась в 1960-х и дала возможность применять class-based OOP на практике обычным программистам. Причем они как раз понимали, что используют ООП и чем ООП отличается от других подходов.

Self появился в 1980-х и дал возможность примерять prototype-based OOP на практике обычным программистам. Причем они как раз понимали каким ООП пользуются и чем этот ООП отличается от других видов ООП.

Это объективная реальность, которую можно проследить по артефактам (хотя бы по примерам кода в Wikipedia).

Апелляция к размышлениям Цуге на этом фоне, для меня, выглядит как верование.

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

Было ли оно раньше или нет - это вопрос, который можно изучать, а можно не изучать. Ты решил не изучать и начал нападать на того, кто изучал.

Я в свое время прочитал много разного про историю ЯП, и ООП в частности.

Так что «решил не изучать» – это вы, как обычно, позвиздели о том, чего не знаете.

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

Ой. Тссссссс. Ну да, все правильно, арифметика указателей.

Тупанул. Я быстро в ide проверил в текущем проекте. А там стоит флаг: -Wstring-plus-int

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

Ну вообще-то в C++ «2» – это не строка :)

PS. Хотя что в C++ строка – это вообще большой вопрос. Не все согласны с тем, что строка – это только std::basic_string.

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

Апелляция к размышлениям Цуге на этом фоне, для меня, выглядит как верование.

А к размышлениям Аристотеля?

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

А к размышлениям Аристотеля?

Да хоть к роли перехода к прямохождению у предков человека. Без этого, кстати говоря, мы так же не имели бы того самого prototype-based OOP.

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

излишний уход в глубину истории к каким-то (возможно, мифическим) истокам

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

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

Аааа. Ну это я знаю. Но я все равно считаю это строкой, что не противоречит утверждению о том, что это const char[2]

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

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

Любой человек с мозгами и общем представлении о бритве Оккама.

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

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

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

Но я все равно считаю это строкой

Ну вот я к тому, что в C++ нет консенсуса о том, что считать строкой.

Поскольку строковый литерал, по сути, массив. А к массиву применяются определенные правила. Так, имя массива – есть указатель на первый элемент. А раз это указатель, то к указателю применимы некоторые действия, типа сложения с целочисленным скаляром, проверка на равенство/неравенство.

Но это именно что к указателю, а не к содержимому.

Тогда как под строкой в языке высокого уровня все-таки принято понимать что-то другое.

Однако, поскольку в C++ сильно историческое наследие (до C++98 в языке std::basic_string не было) и наследие чистого Си, то многие продолжают считать строковые литералы и строки в стиле Си строками.

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

В твоих книжках по истории ЯП было что-то про Цузе? А про компьютер Колосс, который был 50 лет засекречен? Я правильно понимаю, что «всё засекреченное - это конспирология»? Если да, то это хуже, чем воинствующее невежество, это воинствующая глупость уже.

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

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

Просто приведенный вами пример работает на большом числе разнотипных данных, но все-таки, ограниченном.

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

Ну т.е. я так понял, что это ты себя назначил на роль решателя, это раз

Тут все просто: я спросил, мне ответили и я позволил себе принять решение удовлетворил ли ответ мне меня или не удовлетворил.

Проссыте, забыл спросить у вас разрешения.

В следующий раз забуду спросить у вас точно так же.

Во-вторых, всё же определение твоей позиции как «воинствующее невежество» остаётся. «не читал, но осуждаю» - вот твоё отношение к работам Цузе.

Я не устану повторять, что ситуация простая.

Если я невежа и утверждаю, что черных лебедей не существует, то доказать мое невежество очень просто: достаточно кинуть ссылку на фото с черным лебедем.

Если я невежа и утверждаю, что prototype-based OOP появилось много позже работ Цуге над Z1, то доказать мое невежество очень просто…

Ну да опять заходим на N-й круг.

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

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

Да, я еще и вектор std::string-ов не отсортирую пузырьком, ну никак.

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

Да, ты воинствующий невежда, но не можешь это признать. Я тоже энный раз повторяю: невежество не в том, чтобы не знать про работы Цузе, а в том, что ты изначально отрицал их значимость по той глупейшей причине, что они были слишком давно и в машинах были реле. Притом, что работы Аристотеля лежат в основе современных компьютеров и это ты вряд ли будешь отрицать, если речь зайдёт о логике. Поэтому, ни давность, ни реле никакого отношения к делу не имеют. А что имеет? Да ничего. Работы Цузе - это важный этап в возникновении компьютеров, просто так не повезло им, что они были при фашистах, поэтому они подверглись цензуре, как Грета Тунберг в одной стране после её последних заявлений. Её просто вычеркнули из учебников. Ты не спрашивал доказательства, ты говорил, что туда вообще не надо смотреть. Это разные вещи. Но просто гордыня тебе не велит покаяться в том, что ты накосячил, и поэтому ты пытаешься проигнорировать этот факт.

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

А еще само условие, которым вы собираетесь сравнивать данные, что бы решить, что больше, а что меньше – тоже является данными к алгоритму сортировки пузырьком.

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

Ну вот я к тому, что в C++ нет консенсуса о том, что считать строкой.

А не задавались вопросом «почему» до сих пор нет? Не интересно узнать?

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

Неправда. Легко проверяется при помощи sizeof.

Из того, что sizeof правильно вычисляет размер массива фиксированного размера (да еще и чей размер известен компилятору) не следует отрицание того, что имя массива при этом является еще и указателем на первый элемент этого массива.

Ну вот такие массивы были унаследованы из Си.

https://godbolt.org/z/bx4KnzEhG

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

Еще многие путают «адрес» и «указатель» в программе.

Адрес – это номер байта в памяти, доступной процессору.

Указатель – это переменная в памяти, хранящая адрес.

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

Ты не спрашивал доказательства, ты говорил, что туда вообще не надо смотреть.

Я и повторяю это снова и снова. Работы Цуге появились до того, как программирование возникло в привычном для нас виде. Этого для меня достаточно для того, чтобы не рассматривать его как «изобретателя» prototype-based OOP (или вдохновителя идеи этого самого prototype-based OOP).

Но, повторю еще раз: меня же легко опровергнуть. Ведь легко же. Правда же?

eao197 ★★★★★
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)