Но в них есть структуры вроде variant, способные хранить в себе разные типы и идентифицировать их в рантайме (хранится id типа и сами данные).
А ведь для динамической типизации даже это не обязательно.
Как же сделать, чтоб работало такое?
let age = json["age"]; // object
age = age.toInt(); // int
age = age + 1;
Дело в том, что age - это просто ссылка на некий массив байт. Которому вообще пофиг, что внутри себя хранить. А где там в этой области этот operator +, какой-нибудь метод или какое-нибудь поле, прекрасно знает компилятор. И он не может не знать, что это именно int, ведь шагом ранее он сам туда положил int, так что эта ситуация ничем не отличается от случая, как если бы age изначально был int.
Так почему же тогда мало динамически типизированных компилируемых языков?
Другие языки программирования и технологии
Почему так мало динамически типизированных компилируемых языков?
Потому что:
• Изначально, исторически так сложилось - раньше программинг был труднее (он был ближе к железу, кода приходилось писать много, машинное время было ограниченным). Не имея постоянного доступа к ЭВМ, программеры работали частично на бумаге, по распечаткам кода и отладочного вывода. Тогда, статическая типизация помогала ускорять разработку, и избегать человеческих ошибок из-за высокой сложности работы.
• Впоследствии, когда появились персональные компы, а программирование стало в разы легче, в этой сфере деятельности появилось много людей с умственными способностями ниже входного порога - и статическая типизация превратилась из помощника для инженеров, в "строгую мамочку" для особей неспособных удержать в маленьком умишке скопированный / ими же созданный алгоритм с фигурирующими в нем данными. Инструмент разработки стал инструментом популяризации.
Чисто технически, тип данных - это характеристика исключительно для человека, компу она не нужна. По отношению к алгоритму, это метаданные для препроцессора/анализатора кода: когда код противоречит метаданным, предполагается расхождение с алгоритмом, и бросается ошибка. Статическая типизация, соответственно, это просто механизм контроля, который бьет нерадивого программиста по тупой башке, когда тот противоречит сам себе.
Почему же эта концептуальная приблуда не только существует по сей день, но и постоянно укрепляет позиции? Потому что люди, в большинстве своем, не годятся в программисты - а модная сейчас либералистия в своей фальшивой морали убеждает, что всем полагается иметь равные права и возможности. Не только программинг становится идиот-френдли, а все вокруг, абсолютно все становится таким. Таковы культурно-социальные требования нашего времени.
• Изначально, исторически так сложилось - раньше программинг был труднее (он был ближе к железу, кода приходилось писать много, машинное время было ограниченным). Не имея постоянного доступа к ЭВМ, программеры работали частично на бумаге, по распечаткам кода и отладочного вывода. Тогда, статическая типизация помогала ускорять разработку, и избегать человеческих ошибок из-за высокой сложности работы.
• Впоследствии, когда появились персональные компы, а программирование стало в разы легче, в этой сфере деятельности появилось много людей с умственными способностями ниже входного порога - и статическая типизация превратилась из помощника для инженеров, в "строгую мамочку" для особей неспособных удержать в маленьком умишке скопированный / ими же созданный алгоритм с фигурирующими в нем данными. Инструмент разработки стал инструментом популяризации.
Чисто технически, тип данных - это характеристика исключительно для человека, компу она не нужна. По отношению к алгоритму, это метаданные для препроцессора/анализатора кода: когда код противоречит метаданным, предполагается расхождение с алгоритмом, и бросается ошибка. Статическая типизация, соответственно, это просто механизм контроля, который бьет нерадивого программиста по тупой башке, когда тот противоречит сам себе.
Почему же эта концептуальная приблуда не только существует по сей день, но и постоянно укрепляет позиции? Потому что люди, в большинстве своем, не годятся в программисты - а модная сейчас либералистия в своей фальшивой морали убеждает, что всем полагается иметь равные права и возможности. Не только программинг становится идиот-френдли, а все вокруг, абсолютно все становится таким. Таковы культурно-социальные требования нашего времени.
В функциональных языках вполне себе используется: функциональный язык - это отсутствие побочных эффектов, что и позволяет произвести автоматический https://ru.wikipedia.org/wiki/Вывод_типов.
Но ООП чуть меньше, чем полностью, построено на побочных эффектах, потому автоматический вывод типов возможен только в самых примитивных случаях, один из которых ты и продемонстрировал. В большинстве же случаев компилятор императивного языка не имеет достаточной информации, чтобы однозначно судить о типе динамической переменной в данном месте программы. Потому в рантайм такого "компилируемого" императивного языка придётся тащить огромный кусок интерпретатора, занимающийся реализацией динамической типизации.
Да, "структуры вроде variant" в некоторых статических языках есть. Но это медленно и требует дополнительных телодвижений от разработчика - направленных на то, чтобы такая эмуляция динамической типизации не сказывалась на надёжности кода.
Но ООП чуть меньше, чем полностью, построено на побочных эффектах, потому автоматический вывод типов возможен только в самых примитивных случаях, один из которых ты и продемонстрировал. В большинстве же случаев компилятор императивного языка не имеет достаточной информации, чтобы однозначно судить о типе динамической переменной в данном месте программы. Потому в рантайм такого "компилируемого" императивного языка придётся тащить огромный кусок интерпретатора, занимающийся реализацией динамической типизации.
Да, "структуры вроде variant" в некоторых статических языках есть. Но это медленно и требует дополнительных телодвижений от разработчика - направленных на то, чтобы такая эмуляция динамической типизации не сказывалась на надёжности кода.
Гена Желязков
Приведи пример случая, где компилятор не может определить тип сам.
Потому что не выдерживают конкуренцию.
Динамическая типизация после компиляции очень дорого обходится. За то в случае интерпретатора почти ничего не стоит.
Динамическая типизация после компиляции очень дорого обходится. За то в случае интерпретатора почти ничего не стоит.
Похожие вопросы
- Чем отличается компилируемый язык программирования от интерпретируемого? Чем отличается компиляция от интерпретации???
- Почему некоторые личности утверждают, что первым языком программирования должен быть basic или pascal?
- Почему она зацикливается? не пойму =(( помогите =(( язык с++
- А почему некоторые программисты учат только один язык и больше ничего и знать не хотят? ;)
- Почему россияне не могут создать свой язык программирования?
- Почему в наши дни знания 1 языка п. не достаточно?
- Как перестать стесняться от НЕ строго типизированных языков?
- Почему нету единого языка программирования чей компилятор компилирует код на любой выбранный язык?
- Почему все учат интерпритиуемые языки программирования, когда компилируемые намного быстрее?
- Почему нельзя программировать и компилировать в cmd (командная строка) ведь как-то написали ос без компилятора?
А прикольная идея, кстати. Создать язык для блондинок. Вроде никто пока не реализовал.
А о багах, которые породит отсутствие статической типизации, тут уж речь не идёт. Этот контингент и так делает их кучу
Почему ты так считаешь? Ведь без "родительского контроля", идиот будет постоянно допускать ошибки (всплывающие только в рантайме), и его время разработки будет так же постоянно увеличиваться: "тут починил - там отвалилось".
>> Также, не нужны let, const, var.
В целом да. Константы, как и статическая типизация, могут быть полезны для автооптимизации - но она вполне реализуется и предиктивными подходами.
>> Создать язык для блондинок. Вроде никто пока не реализовал.
Rust (⊙ヮ⊙)
>> А о багах, которые породит отсутствие статической типизации, тут уж речь не идёт.
Тогда о чем речь? Все-таки, статическая типизация в основном именно для раннего отлова багов применяется. То бишь, на этапе выдавливания кода из биологического организма.