LINUX.ORG.RU

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

 


0

2

Долго не мог понять разницу между статической и динамической типизацией, (что неудивительно, поскольку я нуб в программировании), все что я читал об этом, написано довольно мутно и невнятно, да и лень читать все эти матаны. Однако сегодня меня посетила крамольная мысль: никакой принципиальной разницы собственно и нет! Она сугубо условна. Вот что я имею в виду:

Возьмем некий примитивный «evaluator» лиспоподобного языка. (define eval (lambda(expr) (cond ((number? expr) expr)) (T (do-staf expr))) Здесь, хотя и в рантайме, статически проверяются типы! Вся разница лишь в том, что проверка происходит для участка программы (expr), а не для всего куска. Если это так, весь шум статическая vs динамическая яйцавыеденного не стоит, поскольку мы имеем зафиксированные на уровне компилятора/интерпретатора типы. Поправьте меня пожалуйста, если я не прав (по сути).



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

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

советую почитать «все эти матаны»

Нет, спасибо, я уже все для себя понял.

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

Да, по ходу, до меня начинает доходить, что гибкость ограничивает не статическая типизация, а «избыточная» типизация, а static/dynamic здесь вообще побоку. Впрочем статическая типизация все равно напрягает, если требует декларацию типов при каждом движении.

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

Я подозреваю, что если мы реализуем лямбда исчисление на машине, все равно не обойтись без 2 базовых типов на уровне интерпретатора. (define eval (lambda(expr) (cond ((application? expr) (applay (first expr) (second expr)) (abstraction? expr) expr) expr...))) что-то в этом роде... Как же иначе?

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

Можно подробней?

TaPL

Еще пару недель в Erlang были типы

Языки с динамической типизацией — это языки с одним алгебраическим типом:

data Value = Atom of ... | List of ... | Binary of и т.д.

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

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

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

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

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

А если обшибка проявляется только в какой-то определённой ветке исполнения? Статическая типизация сразу об этом скажет.

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

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

А если обшибка проявляется только в какой-то определённой ветке исполнения? Статическая типизация сразу об этом скажет.

Вероятно, только если ошибка связана непосредственно с типами? Это что-то сродни синтаксическому анализу. Стоит ли овчинка выделки.

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

(\x.t) и (t_1 t_2) термы, а не типы. Базовый тип нужен поскольку тип (->) не насыщен ((->) :: * -> * -> *) и его не нельзя приписать терму, термы могут иметь только насыщенный тип.

fmap
()

опционально статическая с гибкой системой типов

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

Это очень страшно. Не хотел бы я влезать в эту лабуду. Лучше пойду посмотрю сериал «Просто Мария», он намноло проще.

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

По крайней мере поинтереснее.

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

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

Ну да.

Стоит ли овчинка выделки.

Тут, как уже сказал, мнения расходятся. На мой взгляд, стоит.

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

Пару лет назад я обнаружил один закон: все языки программирования, созданные человечеством до сегодняшнего дня — ГОГНО. Разница лишь в степени несоответствия его текущей задаче и обшей уродливости дизайна.

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

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

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

Бертран, ты ли это? Может Курт? Не узнаю в гриме. В общем, начало XXго века было где-то лет 100 назад.

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

Может Курт?

Если имеется в виду Гедель, то я бы не сказал что он дро..ил на типы столь усердно как современные математики и хаскель-фан-boys. скорее наоборот.

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

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

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

будто с тех пор было найдено приемлемое решение проблемы...

Что имеется в виду под «приемлемым решением». Если я не ошибаюсь, старина Курт, как раз доказал, что данная проблема неразрешима

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

Я не математик и даже не computer scientist, поэтому могу ошибаться, но вроде бы HoTT — это что-то относительно современное. Вот это http://thedeemon.livejournal.com/65083.html вроде рилейтед, но я не читал, потому что ниасилил.

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

Вот это http://thedeemon.livejournal.com/65083.html
Никто не скажет, что выражение 9*2 входит в множество натуральных чисел, а вот в тип натуральных оно входит.

Дошел до этого места и перестал читать: операция над числами имеет тот же тип что и числа!??

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

Дошел до этого места и перестал читать: операция над числами имеет тот же тип что и числа!??

Да. Возможно, вы путаете

mul : Nat -> Nat -> Nat

и

mul 9 2 : Nat

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

Да. Возможно, вы путаете

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

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

Здравый смысл пострадал, если бы mul 9 2 принадлежало множеству натуральных чисел. А так всё верно, тип — не множество.

O02eg ★★★★★
()

Есть типы как множества значений, связанных с идентификаторами (тип переменной, тип функции), и есть типы как множества самих значений (целые числа, строки и т. п.).

Статическая/динамическая типизация — это про первый случай. Строгая/слабая — про второй.

ilammy ★★★
()

Очередной «Бобёр vs Осёл». Какой смысл в этих тредах?

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

Здравый смысл пострадал, если бы mul 9 2 принадлежало множеству натуральных чисел. А так всё верно, тип — не множество.

Хорошо, давайте рассуждать так: у меня есть книги на полке и я могу взять книгу с полки. Вопрос: могу ли я взять с полки «Взятие книги с полки»? Я, к примеру не вижу препятствий, ведь типы одинаковые. А Вы?

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

Вопрос: могу ли я взять с полки «Взятие книги с полки»? Я, к примеру не вижу препятствий, ведь типы одинаковые. А Вы?

Взятие книги с полки не принадлежит множеству книг на полке.

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

Взятие книги с полки не принадлежит множеству книг на полке.

Да, но все это «один и тот же тип»: книги и операции с книгами(числа и операции над числами).

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

Кажется до меня доперло. То что хаскелисты называют типами, является по сути, объектами. К примеру, объект может иметь метод mul и переменую a(1). Эти свойства инкапсулированы, и получаем в итоге объект под названием «type_integer». Затем мы можем определить инструменты для доступа к этим данным извне и получим «монады».

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

ну смотри: есть у нас книги и есть полки. Пусть книги мы можем складывать(ну отрывать одну сторону обложки и склеивать). А Полки у нас могут быть как книжными, так и не очень. Дабы было проще и понятней, перейдем от книг и полок к целым числам с определенной для них операцией сложения и массивам.

Ну и вот, если на пальцах, весь этот ваш матан как будет выглядеть?

Int
Array[Int]
add:Int->Int->Int
append:Int->Array[Int]

Вот это все будет одному типу принадлежать, или разным? И если разным, то какому типу будет принадлежать append? Ч

RedPossum ★★★★★
()
Ответ на: комментарий от O02eg
1)one:X->X
2)two:X->Y
3)three:X->Y->X
4)four:X->Y->X->Y
5)five:X->Y->X->X->X->X->Foo

Eсли я правильно тебя понимаю, то тип, это последнее в цепочке, то есть для приведенных выше операций типами будут: 1) X 2) Y 3) X 4) Y 5) Foo ?

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

или типами будет вся цепочка?

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

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

Я кой чего слышал и про карринг и про прочие кошерные вещи.

Так вот, ну и утверджение из того жж поста о том что Int и Int->Int имеют один тип, это как?

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

Во втором же абзаце, говорит что один тип у них. Так что такое тип? Множество значений+множество операций над ним?

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

«Обоснование начал математики» — это несколько иное, нежели очередной новый язык для изречения тавтологий.

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

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

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

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

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

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

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

Получается, что все эти теории типов etc, это просто промывание мозгов

Algebraic data types, type derivation

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