LINUX.ORG.RU

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

 


0

2

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

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

Первая созданная тема: 13.09.2000 10:25:51
Здесь, хотя и в рантайме, статически проверяются типы!

basp ()

написано довольно мутно и невнятно, да и лень читать все эти матаны.

Она сугубо условна.

Сам ты условный. Читай дальше до просветления.

nanoolinux ★★★★ ()

И для многих динамических языков есть автоматических рефакторинг в IDE?

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

Да это терминология, но по сути, ведь это так? Существует время T(x), когда исполнитель проверяет типы подпрограммы expr, также как компилятор со стат. типами проверяет всю программу?

anonimous ()

Если это так

Но это не так.

поскольку мы имеем зафиксированные на уровне компилятора/интерпретатора типы

Ну ты даешь! Конечно типы есть в любом случае. Фишка в том что при статической типизации ошибки вылезут до запуска программы.

no-such-file ★★★★★ ()
Ответ на: комментарий от no-such-file

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

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

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

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

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

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

Но вообще-то типы ненужны с такими-то контрактами.

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

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

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

Да, все это так, но не всегда требуется эффективность, а типы преподносятся сейчас, как основа основ. Мода?

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

(что неудивительно, поскольку я нуб в программировании)

Возьмем некий примитивный «evaluator» лиспоподобного языка.

Нуб, тем не менее берет для примера лишпик. Какой тонкий троллинг.

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

я думал, что разница не ограничивается удобством отладки

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

no-such-file ★★★★★ ()
Ответ на: комментарий от nanoolinux

В эрланге типов нет вообще например.

в штанах у тебя типов нет. А в Erlang есть строгая типизация и, опционально, статическая проверка (typespec, да).

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

Ну дык, я и хочу уяснить для себя, в чем ПРИНЦИПИАЛЬНОЕ!!! различие?

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

Ну дык, я и хочу уяснить для себя, в чем ПРИНЦИПИАЛЬНОЕ!!! различие?

тебе же сказали, что в статическом анализе во время компиляции.

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

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

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

Потому что при статической типизации, в известных мне языках программирования, тип объекта находит прямое отражение в машинном коде программы

Это наверное касается только тех языков, которые компилируются непосредственно в маш код? И в любом случае это не имеет значения для программиста языка высокого уровня, или я не прав?

anonimous ()

Статическая типизация позволяет не запускать нерабочие программы. Динамическая поприветствует тебя стектрейсом через сутки работы. А принципиальной разницы, конечно, нет.

anonymous ()

Вангую унылый цацкель/лишп тред с повторением уже обсосаных тем

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

Статическая типизация позволяет не запускать нерабочие программы. Динамическая поприветствует тебя стектрейсом через сутки работы. А принципиальной разницы, конечно, нет.

OK, что и требовалось доказать.

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

Статическая типизация позволяет не запускать нерабочие программы

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

vertexua ★★★☆☆ ()

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

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

типы преподносятся сейчас, как основа основ. Мода?

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

no-such-file ★★★★★ ()
Ответ на: комментарий от maggotroot

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

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

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

а типы преподносятся сейчас, как основа основ. Мода?

На ЛОРе нужно изобрести баны разделов, что б не постили тупняк в Development.

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

А хотелось бы увидеть ошибку за время, стремящееся к 0.

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

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

anonimous ()

процессору вообще без разницы в основном

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

А в Erlang есть строгая типизация

Наверное имелись в виду гварды и/или case или что?

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

Да, все это так, но не всегда требуется эффективность, а типы преподносятся сейчас, как основа основ. Мода?

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

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

насколько я понимаю(предполагаю), слабая - это просто приведение типов?

anonimous ()

ты перлов квазимодо в соседнем треде начитался, да?

anonymous ()

Вся разница лишь в том, что проверка происходит для участка программы (expr), а не для всего куска.

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

arturpub ★★ ()

Уж сколько раз твердили миру…

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

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

Разница между статически и «динамически» типизированными ЯП условна. Все ЯП типизированы (статически). Просто в первых делается упор на ограничение нежелательного поведения программы, а во вторых — на защиту исполнителя от заведомо ошибочных действий. Например, компилятор Haskell, если увидит попытку сложить метры с килограммами, просто ничего не скомпилирует; Ruby с радостью возьмётся исполнять такую программу, но во время работы вместо суммы выдаст эксепшон.

Есть еще третий класс исполнителей ЯП, которые не только позволяют складывать дилды с гвоздями, но и с радостью берутся насиловать этими дилдами всё, что им ни прикажут. Лично я бы запретил С, С++ и PHP на законодательном уровне именно по этой причине, и оставил бы только Haskell и Ruby.

Lavir_the_Whiolet ()
Ответ на: Уж сколько раз твердили миру… от Lavir_the_Whiolet

Даже бестиповое лямбда-исчисление типизировано (статически), просто его система типов состоит из одного единственного типа

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

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

Однако в бестиповом лямбда-исчислении все-же неявно присутствует как минимум 3 базовых типа: л-абстракция, аппликация и S-выражение, или как его там. Можно выделить и еще один тип: некорректная (синтаксически) запись.

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

Если система типов состоит из одного типа - это и есть отсутствие типов.

Нет, если система типов состоит из одного типа — это есть система с одним типом.

Ваш К. О.

P. S. ЯП без типов вообще, очевидно, не существует.

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

Лямбда-абстракция и аппликация. Только это не типы, а синтаксические конструкции. Классическая семантика простых лямбда-выражений включает в себя один тип: «лямбда-хрень».

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

Вот это новости. Можно подробней? Еще пару недель в Erlang были типы.

tff ()

Либо ты невероятно толстый тролль, либо действительно полный нуб. Если второе, то настоятельно советую почитать «все эти матаны»

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