LINUX.ORG.RU
ФорумTalks

И опять статическая vs динамическая типизация

 ,


0

4

Главный разработчик Ceylon рассуждает о прелестях статической типизации.

http://ceylon-lang.org/blog/2013/11/25/types-and-expressiveness/

TL;DR: парадокс в том, что вроде бы более свободная и менее ограничивающая динамическая типизация накладывает на разработчика API более строгие требования по документированию кода. Чтобы читатели кода не догадывались, как могут повести себя функции, что они принимают и что возвращают, разработчик должен всегда следить за актуальностью информации, которая в статических языках частично прошита на уровне системы типов и автоматически обновляется при рефакторинге.

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

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

Nagwal ★★★★
()

Только статическая типизация, только хардкор.

CYB3R ★★★★★
()

Да дело не только в документации, а в обслуживании кода в целом. Динамическая типизация ограничивает развитие любого проекта до некоторых пределов. Чем больше такой проект, тем больше всплывает проблем из-за динамически-типизированного взаимодействия разных компонент проекта. Потом, 90% времени начинает уходить на обслуживание кода (в т.ч. документирование даже для самого себя), и времени на развитие проекта почти не остаётся. В случае интернет-сервиса, со временем растёт и нагрузка из-за роста пользователей сервиса, а динамическая типизация — это лишние тормоза, и придётся заниматься ещё и оптимизацией быдлокода или платить лишние деньги за виртуалки.

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

shahid ★★★★★
()
Последнее исправление: shahid (всего исправлений: 1)

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

aidaho ★★★★★
()

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

Недавно видел венную диаграму о количестве знакомых с теорией типов в холиворах о типизации, если кто-нибудь найдёт киньте ссылку.

zinfandel ★★
()

Капитан нервно курит в сторонке.

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

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

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

Недавно видел венную диаграму о количестве знакомых с теорией типов в холиворах о типизации, если кто-нибудь найдёт киньте ссылку.

http://ro-che.info/ccc/images/typing.png

ilammy ★★★
()

Ящитаю, корень срача «статическая типизация vs динамическая» в том, что разработчики популярных статически типизированных языков были слишком недальновидны, чтобы включить в язык поддержку динамической типизации (или облегчить её «сладкую» реализацию), и слишком упороты мантрой «динамическая типизация имеет оверхед → она медленнее статической → она тормозит → она не нужна: лучше день потерять, затем за пять минут долететь».

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

Ящитаю

Ну разработчики GHC включили. Причем, в нерелизнутом 7.8 нет даже возможности вручную определять инстансы тайпкласса Typeable, только через ключевое слово deriving...

И что, тебе от этого легче?

Macil ★★★★★
()

Я вообще не понимаю зачем нужна динамическая типизация. Хоть один кейс с профитом кто-то покажет?

Kroz ★★★★★
()

Что до динамической против статической — это, всё же, холивор и дело вкуса.

Вот к чему с возрастом приходит любовь — это к строгой типизации. Реально помогает ловить кучу ошибок. В PHP, порой, не хватает :)

KRoN73 ★★★★★
()

Ну да. Отсутствие законов приводит к тому, что каждый вынужден устанавливать законы сам, сам доводить их до окружающих, и сам их энфорсить. А что, что-то непонятно?

Miguel ★★★★★
()

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

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

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

А что именно из статически типизированого использовать, что бы не платить лишнего? Жаба, например, у меня в этом плане вызывает сомнения.

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

Уел. Пыхи с питонами сейчас на любом shared-хостинге, а вот для Жабы нужен уже как минимум VPS. Либо специализированный Java-хостинг.

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

Я вообще не понимаю зачем нужна динамическая типизация.

Она не «зачем», а «почему». Потому что динамически типизированный язык разработать на порядок проще.

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

динамическая типизация имеет оверхед → она медленнее статической → она тормозит → она не нужна: лучше день потерять, затем за пять минут долететь

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

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

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

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

это вам, сударь, в c#, если уж так хочется

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

Потому что динамически типизированный язык разработать на порядок проще.

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

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

Потому что динамически типизированный язык разработать на порядок проще.

Не думаю

Тем не менее, это так.

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

Переменной? Размер указателя.

Угадывать каждый раз, это строка или пора ее преобразовать в число...

Зачем угадывать?

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

Зависит от размеров проекта. Если что-то крупное и посещаемое, то scala/java будет жрать меньше, чем все пыхи-питоны и т.д. даже после оптимизаций. Если хоумпага, то «привычные решения» будут кушать меньше RAM, и при этом работать.

shahid ★★★★★
()

парадокс в том, что вроде бы более свободная и менее ограничивающая динамическая типизация накладывает на разработчика API более строгие требования по документированию кода. Чтобы читатели кода не догадывались, как могут повести себя функции, что они принимают и что возвращают, разработчик должен всегда следить за актуальностью информации, которая в статических языках частично прошита на уровне системы типов и автоматически обновляется при рефакторинге.

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

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

динамическая типизация имеет оверхед → она медленнее статической → она тормозит

Внезапно: это правда. Проблема совсем не в ЯП, используя «самый самый статический ЯП», можно сделать класс, который имеет метку «тип», и эта метка будет диспетчерезовать содержимое (да хоть просто дублированием). Получится так любимая «динамическая типизация».

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

лучше день потерять, затем за пять минут долететь

ползать каждый день по 40 минут лучше?

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

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

byte *var = malloc(сколько_надо);

ИЧСХ, в твоём говнопайтоне именно так и выделяется. С учётом кода, который запоминает, где-ты срал, что-бы потом за тобой говно убирать, когда ты всё засрёшь настолько, что срать будет не где. Да, GC называется.

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

Если что-то крупное и посещаемое, то scala/java будет жрать меньше,

Можешь привести пример посещяемого на яве с применой оценкой порядка не вдаваясь в такие крайности как гугл и твиттер?

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

нет ни одной нормальной IDE

4.2, есть пишарм и идея.

классы напичканы словом «self»

А в этом-то что не так? Просто более явно разграничены локальные переменные и поля класса.

Нередко даже не понятно, какие функции какие типы возвращают

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

vurdalak ★★★★★
()

Единственная реальная причина появления динамически типизированных языков - лень и недальновидность авторов. Эволюционно динамические языки - тупиковая ветвь, хоть они и обречены рождаться вновь и вновь просто потому что их делать проще, а делать языки люди любят.
Сегодня, когда есть языки с нормальной статической системой типов, никаких реальных преимуществ у динамической больше нет.

http://thedeemon.livejournal.com/54732.html

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

это вам, сударь, в c#, если уж так хочется

Я про популярные языки. В Шарпе dynamic появился всего в 2009 году. А остальные языки? А до 2009 года? Ведь презрение к динамической типизации сложилось раньше. Я про это и говорю.

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

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

Проблема в том, что когда она таки нужна, часто приходится делать слишком много реверансов перед языком, чтобы убедить его тайпчекер, что «да, блин, здесь динамическая типизация». Надо писать все эти меточки, таскать руками типы и прочее, а не как в PHP: написал и забыл, типы сами проверятся и обломаются. Потому люди считают, что она не нужна в принципе: ведь мало того, что в PHP она тормозит, так ещё и в Мой-Любимый-Язык она выглядит как говно — однозначно не нужна!

ilammy ★★★
()

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

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

так не надо было, вестимо. Не понятно зачем оно в шарпе(скриптовые язычки писать да для asp.net mvc?).

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

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

Переменной? Размер указателя.

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

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

говнопайтоне именно так и выделяется
где-ты срал
говно убирать
всё засрёшь настолько
срать будет не где

У тебя где-то здесь комплекс.

P, S. На питоне не пишу.

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

И каждый раз при изменении типа ты будешь переаллоцировать память?

Никаких «изменений типа» не случается - тип приписан к значению и не меняется. При изменении значения переменной «переаллокации» тоже не случается.

И во имя чего это нужно?

Если ты решил выяснить, зачем нужна динамическая типизация, то ответ выше. Два ответа.

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

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

Месье до сих пор пишет однострочники?

Pavval ★★★★★
()

парадокс в том, что вроде бы более свободная и менее ограничивающая динамическая типизация накладывает на разработчика API...

на разработчика API

Я чего-то не понимаю, или когда дело доходит до реализации API, используется типизация того языка, под который пишется компонент.

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

У тебя где-то здесь комплекс.

типа того. Скорее когнитивный диссонанс.

Смотри: на языках с ДТ можно писать грамотный и сопровождаемый код. Но пишут почему-то только унылое говно, которое прочитать не может даже аффтор.

Тебе не кажется это в высшей степени странным?

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

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

выделенное я и называю — говнокод.

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

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

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

int f(int x)
{
  char s[256];
  sprintf(s, "%d", x);
  return strcmp(s, "-17") == -1 ? 0 : 1;
}
проблема тут даже не в тормозах, чёрт с ними, CPU быстрые. Проблема в том, что такой говнокод может в любой момент навернуться из-за Over9000 причин.

А в ЯП с ДТ такое возможно, т.к. компилятор не поддерживает либастрал, и не знает, какой у тебя тут тип. Ты написал просто if($x < $y)....

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

Видел я важу джаву. В качестве вебсферы. Так вот я хочу сказать, что при таких количествах памяти и мегагерц, что она требовала, любой пых/перл/питон просто со скоростью света летать будет.

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

Видел я важу джаву. В качестве вебсферы.

Вебсфера монстрик даже для жабы и брать ее в качестве примера нт смысла.

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

+1. Большая часть претензий к монструозности серверной Жабы проистекает от стрельбы из пушки по воробьям. Берут самый навороченный сервер со всеми технологиями, а потом жалуются, что их проект в десять строчек тормозит. В то время как для их целей вполне хватило бы какого-нибудь не то что Tomcat, а даже Jetty.

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

Vala. На нём веб-фреймворки есть. Ambition, например.

Она, во-первых, известна в узких кругах. Во-вторых, если мне изменяет память, компилируется трансляцией в С-шный исходник, что черевато С-шными же проблемами с сегфолтами. Изначально она пилилась для десктопа, где это не особо критично, но в вебе это печально.

На нём веб-фреймворки есть.

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

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

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

А Go не чреват сегфолтами? Не использовала Go, так что не могу сказать. Но теоретически такие проблемы возможны во всех неуправляемых языках, не?

reserved
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.