Re[47]: почему в вебе распространены именно динамические язы
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 22.10.10 07:50
Оценка:
Здравствуйте, kochetkov.vladimir, Вы писали:

KV>Здравствуйте, WolfHound, Вы писали:


WH>>Здравствуйте, kochetkov.vladimir, Вы писали:


KV>>>Безопасность информационной системы вообще не зависит от используемого ЯП.

WH>>Мы говорим про safe. Ты говоришь про secure.
WH>>От того и непонимание.

KV>Перечитал еще раз. По-моему, netch80 говорит-таки о security, а не о safety, ибо:


KV>

KV>безопасность как понятие имеет смысл только при выставлении конкретных условий и ограничений, определения опасности и методов защиты от неё


Извини, это была всё-таки тема safety. Пардон за сбивание с толку, но базовые принципы применимы к обоим омонимам. Например, для C++ ты можешь обернуть доступ к объекту в мьютексы, но если кто-то полезет прямой модификацией памяти, никакая обёртка не поможет. И аналогичные ситуации и проблемы можно получить везде, хотя выглядеть будут существенно по-разному (например, для Erlang ты не залезешь в другой процесс, если он того не допустит, но можешь сбить с толку его взаимодействие с твоим процессом или организовать частичный DoS требованием ресурса). Более того, в этом аспекте security и safety сливаются в одно понятие — делать то, что можно (говоря по-бытовому), а различие между ними сокращается до вопроса источника возможной проблемы (внешний или внутренний).

WolfHound ругался на Go, утверждая, что его авторы явно врут про безопасность, хотя ничего для этого не делают. Я попытался объяснить, что такая безопасность, как он хочет, возможна, но чрезмерно ограничительна и расточительна; что есть много других методов, которые этим не страдают; наконец, что требовать безопасности от, например, доступа к глобальным переменным — вообще не имеет смысла для среды такого типа, как Go. Но меня, увы, просто не слышат.
The God is real, unless declared integer.
Re[45]: почему в вебе распространены именно динамические язы
От: vdimas Россия  
Дата: 22.10.10 08:10
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Это позволит похоронить вирусы на корню.


А чем вирус принципиально отличается, скажем, от драйвера?
Re[25]: почему в вебе распространены именно динамические язы
От: Mamut Швеция http://dmitriid.com
Дата: 22.10.10 08:14
Оценка:
V>Ведь что такое "тип"? Это способ разделения сущностей на сорта путем наделения их некими характеристиками (подробности зависят от конкретной системы типов). Типы существуют не забавы и этого спора ради, — это инструмент, который мы можем использовать для контроля корректности взаимодействия сущностей разных сортов, строя т.н. типизированные контракты. Причем, эти контракты будут проверяться автоматически. Т.е. в нашем распоряжении есть инструмент для избавления от таких явных проверок контрактов в рантайм, которые удастся описать с помощью системы типов, присутствующей в выбранном языке.

Я тут уже приводил пример. Есть такая лавка, JanRain. Они предлагают унифицированный логин через OpenID/MySpace/Twitter/Facebook и т.п. После логина пользователя они прислыают его профиль. Вот описание: https://rpxnow.com/docs#profile_data

Из 16 полей только 2 будут присутствовать всегда. Остальные — необязательные. Не говоря уже о том, что два из этих необязательных являются списком из других необязательных полей.

Ну и как, скажите мне, поможет мне статика при работе с этим данными? Да никак. Все выливается в итоге в if post.data contains field_1, if post.data contains field_2 и т.п.

Псевдокод


void process_request(Request req){

    Profile profile = null;

    if(req.contains("profile")){
    
        profile = new Profile(req);
    }

    set_session_profile(req, profile);
}


void set_session_profile(Request req, Profile profile){
    req.session.user.set_name(profile.get("formatted_name"));  // вылетели к чертям в рантайме
}


Говнокод? Безусловно. Такого в природе не бывает? Бывает, и тоннами. Чем здесь поможет статическая типизация? Гарантировать, что на момент компиляции в функцию передаются параметры нужного типа?

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

Чудес не бывает


dmitriid.comGitHubLinkedIn
Re[26]: почему в вебе распространены именно динамические язы
От: hardcase Пират http://nemerle.org
Дата: 22.10.10 08:30
Оценка:
Здравствуйте, Mamut, Вы писали:

M>Из 16 полей только 2 будут присутствовать всегда. Остальные — необязательные. Не говоря уже о том, что два из этих необязательных являются списком из других необязательных полей.


Достаточно создать сериализатор, понимающий тип option[T]:

[XmlElement("Profile")]
class Profile
{
  [XmlElement("A")]
  public RequiredField1 : string { get; set; }

  [XmlElement("B")]
  public RequiredField2 : int { get; set; }

  [XmlElement("X")]
  public OptionalField1 : option[string] { get; set; }

  [XmlElement("Y")]
  public OptionalField2 : option[int] { get; set; }
}


При доступе к опциональным полям компилятор заставит обрабатывать случаи отсутствия в них значения.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[17]: почему в вебе распространены именно динамические язы
От: vdimas Россия  
Дата: 22.10.10 08:39
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

VD>>Так что как не крути это еще одна попытка выдать сказки за чудесную действительность.

VD>>Я уже устал повторять. Чудес не бывает. Скрипты дико медленны и могу использоваться только как клей для компонентов созданных на более быстрых средствах разрабоки. Компиляция скриптов конечно может несколько их ускорить, но в общем случае это ускорение не будет очень значительным в следствии динамической природы самих язков.

ВВ>Ты хочешь сказать, что если динамический язык компилируется, а не интерпретируется, то это не дает значительного ускорения?


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

Надо признать, что довольно шустро в динамике работают условные ветвления и циклы, фактически как в нейтиве, ибо ложь обычно представлена как null или как ссылка на некий заведомо известный атом #false, т.е., в зависимости от способа организации того самого промежуточного представления, можнонивелировать лишние затраты на эти популярные операции. Особенно циклы, если он поддержаны языком, а не реализованы на бестиповом while. Но вот с числовыми вычислениями — просто беда. Ну и не надо забывать про агрессивный инлайнинг что у того же С++, что у современных JIT.
Re[18]: почему в вебе распространены именно динамические язы
От: Воронков Василий Россия  
Дата: 22.10.10 09:03
Оценка:
Здравствуйте, vdimas, Вы писали:

ВВ>>Ты хочешь сказать, что если динамический язык компилируется, а не интерпретируется, то это не дает значительного ускорения?

V>Они и так все компилируются сначала во внутреннее представление.

Ну во-первых, не все. Если только "внутренним представлением" вы не называете AST. Потом — ну зачем придираться к словам? Понятно же, что я имею в виду.

V>Важно, как происходят простейшие операции. Например, простое сложение, вместо вызова операции сложения двух регистров проца, динамически проверяет типы, приводит их к одному, потом уже выполняет операцию сложения. И не забываем, что в динамике у нас все лежит только на куче, даже простые целые числа. Вот эти две — основные причины тормозов.


Вторая причина попросту невалидна. Нет никакого эксклюзивного требования у динамики хранить все только на куче, можно спокойно хранить примитивы на стеке. Первая проблема может быть устранена компилятором.
Re[27]: почему в вебе распространены именно динамические язы
От: Mamut Швеция http://dmitriid.com
Дата: 22.10.10 09:54
Оценка:
M>>Из 16 полей только 2 будут присутствовать всегда. Остальные — необязательные. Не говоря уже о том, что два из этих необязательных являются списком из других необязательных полей.

H>Достаточно создать сериализатор, понимающий тип option[T]:


H>
H>[XmlElement("Profile")]
H>class Profile
H>{
H>  [XmlElement("A")]
H>  public RequiredField1 : string { get; set; }

H>  [XmlElement("B")]
H>  public RequiredField2 : int { get; set; }

H>  [XmlElement("X")]
H>  public OptionalField1 : option[string] { get; set; }

H>  [XmlElement("Y")]
H>  public OptionalField2 : option[int] { get; set; }
H>}
H>


H>При доступе к опциональным полям компилятор заставит обрабатывать случаи отсутствия в них значения.


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

Возможности статики по гарантированию чего-либо сильно преувеличены в этом топике


dmitriid.comGitHubLinkedIn
Re[28]: почему в вебе распространены именно динамические язы
От: Klapaucius  
Дата: 22.10.10 10:15
Оценка: +2
Здравствуйте, Mamut, Вы писали:

M>А причем тут компилятор к рантайму?


При том, что компилятор не даст вызвать метод объекта, находящегося в Maybe, а если динамически типизированный язык не позволяет написать Nothing().FooBar(), то какой же он динамический?

M> Это во-первых. Во-вторых, точно так же можно сделать и в динамике


С.м. выше. Как сделать в динамике, чтобы нельзя было написать Nothing().FooBar()?

M> В-третьих, в указанной мною ситуации это вообще побоку, потому что если profile не будет, то программа вылетит в рантайме.


В каком смысле побоку?

M> Ну и в четвертых наличие статической типизации почему-то никак не помогло мне во втором примере


Во втором примере статическая типизация не используется.
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[28]: почему в вебе распространены именно динамические язы
От: hardcase Пират http://nemerle.org
Дата: 22.10.10 10:37
Оценка:
Здравствуйте, Mamut, Вы писали:

M>А причем тут компилятор к рантайму?


Потому что профиль наш строго типизирован и мы знаем какие поля могут принимать значение "нету".

M>Во-вторых, точно так же можно сделать и в динамике


Проверять на null?

M>В-третьих, в указанной мною ситуации это вообще побоку, потому что если profile не будет, то программа вылетит в рантайме.


Каков программист — такова и программа.

M>Ну и в четвертых наличие статической типизации почему-то никак не помогло мне во втором примере


Нам на этапе компиляции известны все поля, которые могут не содержать значение, таким образом мы объявляем их тип как option[T], где T — фактический тип поля. Правильно написанный десериализатор изготовит нам соответствующим образом проинициализированный объект.

Параметрический тип option[T] может принимать два значения: Some(t) и None(), где t — экземпляр типа T.
К фактическому значению некоторого поля мы можем добраться только тогда, когда это поле содержит значение Some(t), таким образом, каждый раз обращаясь к полю нам придется обрабатывать два случая: значение в поле есть (Some) и значения в нем нет (None). И то, что мы всегда в программе обрабатываем эти два случая проконтролирует компилятор.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[29]: почему в вебе распространены именно динамические язы
От: Mamut Швеция http://dmitriid.com
Дата: 22.10.10 10:37
Оценка:
M>>А причем тут компилятор к рантайму?

K>При том, что компилятор не даст вызвать метод объекта, находящегося в Maybe, а если динамически типизированный язык не позволяет написать Nothing().FooBar(), то какой же он динамический?


Ага. Это в теории. И, судя по Maybe, в хаскеле. Стоп. А откуда компилятор внезапно узнает, что там Maybe? Можно пример кода? Желательно, конечно не на Хаскеле, а на чем-то более приземленном, например на Java. Но на Хаскелле тоже сойдет.

M>> Это во-первых. Во-вторых, точно так же можно сделать и в динамике

K>С.м. выше. Как сделать в динамике, чтобы нельзя было написать Nothing().FooBar()?

Точно так же как в статике Потому что даже в статике компилятор (анализатор? неонка?) не уверен, будет там null или нет.

Ловкость рук и никакого мошенничества (использую уже готовые типы из программы, но суть ясна). Язык — Java. IDE — JetBrains IDEA

Ошибка есть:


Икомпилятор выдает


Ошибка нет:


Компилятор выдает compiled successfully.

Но это же статика! Как такое может быть?




M>> В-третьих, в указанной мною ситуации это вообще побоку, потому что если profile не будет, то программа вылетит в рантайме.

K>В каком смысле побоку?

В прямом. Компилятор не отловит этой ошибки. Или так — теоретически быть может в каком-то языке он ее отловит.



M>> Ну и в четвертых наличие статической типизации почему-то никак не помогло мне во втором примере


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


С чего это вдруг? Все типы указаны, компилятор молчит Тут уже не один человек бъет себя пяткой в грудь и говорит, что компилятор от такого страхует


dmitriid.comGitHubLinkedIn
Re[29]: почему в вебе распространены именно динамические язы
От: Mamut Швеция http://dmitriid.com
Дата: 22.10.10 10:41
Оценка: -1
M>>А причем тут компилятор к рантайму?
H>Потому что профиль наш строго типизирован и мы знаем какие поля могут принимать значение "нету".

M>>Во-вторых, точно так же можно сделать и в динамике

H>Проверять на null?

Оставляю эо как домашнее задание.


M>>В-третьих, в указанной мною ситуации это вообще побоку, потому что если profile не будет, то программа вылетит в рантайме.

H>Каков программист — такова и программа.


Это к вопросу не относится вообще никак. Имеем, что имеем. Тут мне рассказывают про чуда, а чуд как-то не получается.


M>>Ну и в четвертых наличие статической типизации почему-то никак не помогло мне во втором примере


H>Нам на этапе компиляции известны все поля, которые могут не содержать значение, таким образом мы объявляем их тип как option[T], где T — фактический тип поля. Правильно написанный десериализатор изготовит нам соответствующим образом проинициализированный объект.


H>Параметрический тип option[T] может принимать два значения: Some(t) и None(), где t — экземпляр типа T.

H>К фактическому значению некоторого поля мы можем добраться только тогда, когда это поле содержит значение Some(t), таким образом, каждый раз обращаясь к полю нам придется обрабатывать два случая: значение в поле есть (Some) и значения в нем нет (None). И то, что мы всегда в программе обрабатываем эти два случая проконтролирует компилятор.


В примере не доступ к полям с null. Там попытка вызвать метод у null.


dmitriid.comGitHubLinkedIn
Re[30]: почему в вебе распространены именно динамические язы
От: hardcase Пират http://nemerle.org
Дата: 22.10.10 10:42
Оценка:
Здравствуйте, Mamut, Вы писали:

M>С чего это вдруг? Все типы указаны, компилятор молчит Тут уже не один человек бъет себя пяткой в грудь и говорит, что компилятор от такого страхует


О NotNull контрактах не так давно говорилось — системы типов JVM и CLR не поддерживают not-nullable ссылочных типов.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[31]: почему в вебе распространены именно динамические язы
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 22.10.10 10:47
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Здравствуйте, Mamut, Вы писали:


M>>С чего это вдруг? Все типы указаны, компилятор молчит Тут уже не один человек бъет себя пяткой в грудь и говорит, что компилятор от такого страхует


H>О NotNull контрактах не так давно говорилось — системы типов JVM и CLR не поддерживают not-nullable ссылочных типов.


Ну это совершенно не влияет на языки, которые работают на этих машинах.
В F#, например, есть not-nullable типы.
Re[31]: почему в вебе распространены именно динамические язы
От: Mamut Швеция http://dmitriid.com
Дата: 22.10.10 10:50
Оценка:
M>>С чего это вдруг? Все типы указаны, компилятор молчит Тут уже не один человек бъет себя пяткой в грудь и говорит, что компилятор от такого страхует

H>О NotNull контрактах не так давно говорилось — системы типов JVM и CLR не поддерживают not-nullable ссылочных типов.


В итоге, что имеем в сухом остатке?

Изначальное заявление: Нам нужна статика.

В процессе допытывания выясняется, последовательно:
— Нет, нам нужна статика с хорошей системой типов.
— Нет, нам нужна статика с системой типов, поддерживающей все, что угодно — constraints, dependent types, контракты и т.п.
— Нет, нам нужна статика с системой типов, поддерживающей все, что угодно — constraints, dependent types, контракты и т.п., и желательно чтобы это был или Haskell или Nemerle.

И вот только тогда мы, быть может, сможем показать на практике те чудеса, которые мы вам обещали под эгидой «статика круче всегда!»



В общем, это то, о чем говорил netch80, когда говорил о своих критериях тут: http://rsdn.ru/forum/philosophy/4006147.1.aspx
Автор: netch80
Дата: 21.10.10
(со слов «Во-первых, о существующих средствах и текущих задачах»). И то как раз то, из-за чего тут разведено столько флейма. Нам обещают чудеса статики, но на практике этих чудес или не видно или видно только с кучей ограничений (типа «системы типов JVM и CLR не поддерживают not-nullable ссылочных типов»)


dmitriid.comGitHubLinkedIn
Re[32]: почему в вебе распространены именно динамические язы
От: hardcase Пират http://nemerle.org
Дата: 22.10.10 10:52
Оценка:
Здравствуйте, gandjustas, Вы писали:

H>>О NotNull контрактах не так давно говорилось — системы типов JVM и CLR не поддерживают not-nullable ссылочных типов.


G>Ну это совершенно не влияет на языки, которые работают на этих машинах.


Вообще-то влияет. Ка бы эта опция была — она была бы во всех языках на этих платформах, а сейчас же её достаточно проблематично реализовывать.

G>В F#, например, есть not-nullable типы.


Спс. Проясню этот вопрос.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[33]: почему в вебе распространены именно динамические язы
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 22.10.10 10:56
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Здравствуйте, gandjustas, Вы писали:


H>>>О NotNull контрактах не так давно говорилось — системы типов JVM и CLR не поддерживают not-nullable ссылочных типов.


G>>Ну это совершенно не влияет на языки, которые работают на этих машинах.

H>Вообще-то влияет.
Вообще никак не влияет, это вопрос системы типов (компилятора, а не рантайма), компилятор может просто не предусматривать null значений. Или не допускать присваивания null для notnullable типов.
Re[30]: почему в вебе распространены именно динамические язы
От: Klapaucius  
Дата: 22.10.10 11:13
Оценка: +1
Здравствуйте, Mamut, Вы писали:

K>>При том, что компилятор не даст вызвать метод объекта, находящегося в Maybe, а если динамически типизированный язык не позволяет написать Nothing().FooBar(), то какой же он динамический?


M>Ага. Это в теории.


Это если сделать допущение, что сейчас 1958-ой год, но сейчас 2010.

M>И, судя по Maybe, в хаскеле.


Особенно судя по словам "вызвать метод объекта".

M>Стоп. А откуда компилятор внезапно узнает, что там Maybe? Можно пример кода? Желательно, конечно не на Хаскеле, а на чем-то более приземленном, например на Java.


Пример на C# (Maybe придется написать самому (8 строчек) или скачать готовую)
from profile in GetProfile()
from result in ProcessRequest(profile)
select result;

Значение этого выражения Just(результат реквеста), если все прошло нормально или Nothing()
ProcessRequest(GetProfile());

Не скомпилируется.
Чудес бывает.

M>Точно так же как в статике Потому что даже в статике компилятор (анализатор? неонка?) не уверен, будет там null или нет.


Если у нас в языке есть null, то это означает, что то, имеем мы тип T или тип Maybe<T> определяется динамически. К статической типизации null никакого отношения не имеет.

K>>В каком смысле побоку?

M>В прямом. Компилятор не отловит этой ошибки. Или так — теоретически быть может в каком-то языке он ее отловит.

На практике отловит в целом ряде языков.

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

M>С чего это вдруг? Все типы указаны, компилятор молчит

Компилятор молчит, потому что программиcт заткнул ему рот явной декларацией отключения статической типизации. В коде она выделенна жирным шрифтом:
GremlinScriptEngine engine = (GremlinScriptEngine)f.getScriptEngine();
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[31]: почему в вебе распространены именно динамические язы
От: Mamut Швеция http://dmitriid.com
Дата: 22.10.10 11:15
Оценка:
K>>>При том, что компилятор не даст вызвать метод объекта, находящегося в Maybe, а если динамически типизированный язык не позволяет написать Nothing().FooBar(), то какой же он динамический?

M>>Ага. Это в теории.


K>Это если сделать допущение, что сейчас 1958-ой год, но сейчас 2010.


Все поскипано. Ответ тут: http://rsdn.ru/forum/philosophy/4008594.aspx
Автор: Mamut
Дата: 22.10.10


dmitriid.comGitHubLinkedIn
Re[34]: почему в вебе распространены именно динамические язы
От: hardcase Пират http://nemerle.org
Дата: 22.10.10 11:19
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Вообще никак не влияет, это вопрос системы типов (компилятора, а не рантайма), компилятор может просто не предусматривать null значений. Или не допускать присваивания null для notnullable типов.


А вопрос получения подобного типа извне? Очевидное решение с автоматической проверкой на null кажется мне несколько непроизводительным.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[32]: почему в вебе распространены именно динамические язы
От: Klapaucius  
Дата: 22.10.10 11:25
Оценка: 1 (1) +2
Здравствуйте, Mamut, Вы писали:

M>Все поскипано.


Отличный подход к дискуссии, спасибо.

M>Ответ тут: http://rsdn.ru/forum/philosophy/4008594.aspx
Автор: Mamut
Дата: 22.10.10


>Изначальное заявление: Нам нужна статика.


Верно.

>В процессе допытывания выясняется, последовательно:

>— Нет, нам нужна статика с хорошей системой типов.

Не так. "Даже статика с посредственной системой типов — уже лучше чем динамика, но нам нужна статика с хорошей системой типов"

>— Нет, нам нужна статика с системой типов, поддерживающей все, что угодно — constraints, dependent types, контракты и т.п.


Это было бы еще лучше, но почему "нет"? — с какой стати отказываться от предыдущих пунктов? Все логично — чем лучше система типов — тем лучше. Совершеннейший трюизм.

>— Нет, нам нужна статика с системой типов, поддерживающей все, что угодно — constraints, dependent types, контракты и т.п., и желательно чтобы это был или >Haskell или Nemerle.


Зависимых типов нет ни в Haskell, ни в Nemerle.
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.