thedeemon: (Default)
[personal profile] thedeemon
Поразжигал немного в комментах у ребе Б. рознь к социальной группе "ленивые авторы языков". Чтобы не излагать свою позицию каждый раз заново, сохраню сюда.

Знаете, некоторые печальные даты надолго остаются в памяти людей: 11 сентября, 17 августа, 1917-й год, 1941-й. К ним стоит добавить 1995-й - год появления JavaScript, PHP, Ruby, ну и Java тоже. Кому-то захотелось по-быстрому добавить динамизма в веб-странички, и он за пару недель наговнякал интерпретатор, встроив его в браузер Netscape. Кому-то захотелось оживить свою домашнюю страничку, добавить счетчик посетителей, еще что-то, и он на коленке сделал такой вот изменятель страничек на стороне сервера. О больших проектах тогда никто не думал, personal home page назывался тот изменятель. А когда делаешь интерпретатор, проще всего сделать его на динамической типизации. Это банально очень просто. О системе типов вообще можно не задумываться, не говоря уже об их выводе. К сожалению, на фоне тогдашнего мейнстрима (Си, ранние плюсы, что там еще было?) эти скриптовые языки выглядели очень выигрышно, писать мелкие куски кода на них было намного проще. Что такое нормальная система типов тогда мало кто знал: хаскель был еще в пеленках, ML'и традиционно не выходили из университетов. Так что люди эти скрипты подхватили, стали добавлять все новые функции. Менять систему типов стало поздно. В итоге выросло то, что выросло. С тех пор одна масса людей занята тем, чтобы делать все более сложные интерпретаторы, которые бы не так тормозили, другая масса придумывает 121-й способ добавить в JS типы, а третья на динамических языках пишет и плачет в бложиках о том, как грустно им делается. И проблема не только и не столько в скорости, сколько в maintainability кода и усилиях на необходимые тестирование и отладку при росте проектов.

Единственная реальная причина появления динамически типизированных языков - лень и недальновидность авторов. Эволюционно динамические языки - тупиковая ветвь, хоть они и обречены рождаться вновь и вновь просто потому что их делать проще, а делать языки люди любят. Сегодняшняя популярность некоторых из них - случайность, исторический казус, следствие контраста между этими языками и мейнстримом начала 90-х. То, что много идиотов используют идиотские языки, говорит лишь о том, что идиотов много. Сегодня, когда есть языки с нормальной статической системой типов, никаких реальных преимуществ у динамической больше нет. Только я имею в виду действительно нормальные статически типизированные языки - как минимум с параметрическим и ad hoc полиморфизмами, с выводом типов. Не Си с джавой. Хаскель, окамл, скала - такого уровня. У этих конкретных языков могут быть свои проблемы, часто инфраструктурные, но речь сейчас не о них, речь о динамической vs. статической типизации в целом.

Date: 2012-10-11 12:33 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Так это конечно разные типы. У них даже область допустимых значений совершенно разная. Достаточно поле с Foreign Key объявить - и вот вам новый кошернейший зависимый тип.

Date: 2012-10-11 12:43 pm (UTC)
From: [identity profile] geekyfox.livejournal.com
я с большим и неподдельным интересом посмотрю на то, как вы будете проверять foreign key в компайл-тайме

Date: 2012-10-11 12:50 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Зависимые типы ВНЕЗАПНО. И компиляция с выводом типов при старте программы с подключением к БД.

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

Date: 2012-10-11 01:14 pm (UTC)
From: [identity profile] geekyfox.livejournal.com
то есть заводить новые счета в процессе работы программы мы больше не можем?

Date: 2012-10-11 01:25 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Можем. Если при этом конфликта типов не возникнет.

Date: 2012-10-11 01:28 pm (UTC)
From: [identity profile] geekyfox.livejournal.com
и чем тогда всё это глубокомыслие отличается от старой-доброй обработки ошибки на commit transaction?

Date: 2012-10-11 01:30 pm (UTC)
From: [identity profile] zamotivator.livejournal.com
Тем, что проверяется при запуске, и завести счёт не удовлетворяющий типа физически невозможно.
Опечатки типа приведённой вами с назначениеПлатежа будут невозможны - не соберётся.

Date: 2012-10-11 01:45 pm (UTC)
From: [identity profile] geekyfox.livejournal.com
ещё раз. как в компайл-тайме что-то валидировать по foreign key записи, которая на момент компайл-тайма в базе отсутствует?

Date: 2012-10-11 01:48 pm (UTC)
From: [identity profile] zamotivator.livejournal.com
Пусть есть таблица А и таблица Б

create table Б(..., А_АЙДИ FOREIGN KEY A(АЙДИ))

Где-то в коде вы присваиваете полю А_АЙДИ значение.
Если вы опечатались - вместо А:АЙДИ вы можете присовить БАЛАНС или Б:АЙДИ

Система типов гарантирует вам, что присвоится только А:АЙЛДИ и никакой другой тип данных

Date: 2012-10-11 01:51 pm (UTC)
From: [identity profile] geekyfox.livejournal.com
а не, ну ок, если вы готовы в своих проектах делать отдельно String-который-плательщик и отдельно String-который-назначение платежа - то вперёд и с песней.

причём тут foreign key я так и ниасилил, ну да ладно.

Date: 2012-10-11 01:54 pm (UTC)
From: [identity profile] zamotivator.livejournal.com
Да, это правильно, чтобы эти строки имели разные типы данных
Ну, классический пример из С++ - температура и давление
Оба типа double, но присваивать их друг другу нельзя

Profile

thedeemon: (Default)
Dmitry Popov

December 2025

S M T W T F S
 12 3456
789101112 13
14151617181920
21222324252627
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 30th, 2026 08:45 pm
Powered by Dreamwidth Studios