Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708

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

15.01.2020, 20:25. Показов 3791. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Статическая и динамическая типизация

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

<Примеры программ на статических языках программирования C++, C#, Perl, Ruby>

Динамические языки не заставляют Вас определять тип переменных перед тем, как их использовать.
Утиная типизация: «Если это выглядит как утка и крякает как утка, значит это утка».

>>> "Если это выглядит как утка и крякает как утка значит это утка"
'Если это выглядит как утка и крякает как утка значит это утка'
>>> x = 5
>>> y = "5"
>>> type(5)
<class 'int'>
>>> type(y)
<class 'str'>
>>>

Значение 5 — целое число, без объявления типа переменной.
Динамические языки не компилируются (переводят код в понятный компьютеру код) программой, а интерпретируются.

И вот здесь мой вопрос, как я понимаю код (инструкции) в python компилируется в байт-код, а затем PVM (виртуальной машиной) данный байт-код интерпретируется для нас с вами, ну если утрировано (там много всяких нюансов). Но не в этом суть. Меня интересует в чем принципиальное отличие этапа компиляции статическим языком процессору компьютера от момента интерпретирования PVM (виртуальной машиной) в python. PVM наверно также обращается к процессору компьютера, и так же транслирует или переводит какой-то код? А? Гуру помогите новобранцу?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.01.2020, 20:25
Ответы с готовыми решениями:

Динамическая типизация в классах
Здравствуйте, возник такой вопрос: class A(): def __init__(self): self.var_a = 'a' class B(): def __init_(self):...

Динамическая/статическая типизация, интерпретация/компиляция и функциональные языки - плюсы и минусы
Вынесено из темы https://www.cyberforum.ru/holywars/thread1357389.html В самой необходимости этим заниматься. Если честно, из...

Статическая и динамическая память
Правда ли это: 1. что и статические, и динамические переменные при запуске программы попадают в одну и ту же часть виртуальной памяти —...

16
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
15.01.2020, 21:14
Цитата Сообщение от AlexMarkov Посмотреть сообщение
принципиальное отличие
Скомпилированный машинный код исполняется настоящим процессором.
Скомпилированный байткод исполняется виртуальным процессором.
Цитата Сообщение от AlexMarkov Посмотреть сообщение
PVM наверно также обращается к процессору компьютера, и так же транслирует
Байткод PVM интерпретатор(вирт. машина) должен оттранслировать в машинный - и только тогда процессором (железным) будет выполнена та шняга (print("hello world")), которую мы понаписали...
1
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
15.01.2020, 21:26  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
Скомпилированный машинный код исполняется настоящим процессором.
Разновидностей процессоров много, получается в статических языках при кодировании необходимо учитывать и виды процессора? Можете привести пример на C++, C#, Perl, Ruby, Java?
Цитата Сообщение от Garry Galler Посмотреть сообщение
и только тогда процессором (железным) будет выполнена та шняга (print("hello world")), которую мы понаписали...
Действия интерпретатора с железным, дело уже самих разработчиков python я так понимаю? Или питонисту так же необходимо знать данный момент при системном программировании. Например как быть с аргументами командной строки? Они каким-то образом связаны с интерпретатором?
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
15.01.2020, 21:47
Цитата Сообщение от AlexMarkov Посмотреть сообщение
Разновидностей процессоров много,
Значения имеют не разновидности процов, а наборы инструкциий процессоров (MMX\SSE\SSE2\SSSE3\SSE4 и т.д.).
Впрочем, при кодировании даже на С++ это далеко не всегда нужно программисту (вот если кодить на асме - тут, наверняка, понадобится)

Тем более, это не нужно пишущему на Python.
Цитата Сообщение от AlexMarkov Посмотреть сообщение
Например как быть с аргументами командной строки?
Цитата Сообщение от AlexMarkov Посмотреть сообщение
Они каким-то образом связаны с интерпретатором?
Не понял вопроса.
1
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
15.01.2020, 22:19  [ТС]
Командные строки служат для запуска программ на Python из командной оболочки системы в следующем формате:
python [параметр*]
[ файл_сценария | -c команда | -m модуль | -] [arg*]
В этом формате python обозначает интерпретатор языка Python, исполняемый как по полностью указанному пути к каталогу, так и по слову python, зарезервированному в командной оболочке системы (например, в переменной окружения PATH). Параметры командной строки (параметр), определяющие режим работы интерпретатора Python, обычно указываются перед именем исполняемой программы, тогда как аргументы (arg), требующиеся для выполнения программы, - после ее имени.

Я еще не совсем разобрался с этим вопросом, поэтому сформулировать вопрос мне пока будет затруднительно. Предварительно, командная оболочка просто обращается к интерпретатору и ни как не связана с внутренними процессами происходящими между интерпретатором и процессором или я что-то не понимаю? И что понимается все таки под аргументами?

Добавлено через 14 минут
Garry Galler,
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
15.01.2020, 23:48
Лучший ответ Сообщение было отмечено AlexMarkov как решение

Решение

Цитата Сообщение от AlexMarkov Посмотреть сообщение
Примеры программ на статических языках программирования C++, C#, Perl, Ruby
А что в этом списке делают Perl и Ruby?

Цитата Сообщение от AlexMarkov Посмотреть сообщение
командная оболочка просто обращается к интерпретатору
Оболочка пишет все что вводит пользователь в стандартный вывод - stdout. А интерпретатор может читать эти данные из stdin - стандартного ввода.
Конрентно про передачу параметров - смотрим модуль sys: https://python-scripts.com/module-sys.
Подробнее - гуглим.
Цитата Сообщение от AlexMarkov Посмотреть сообщение
И что понимается все таки под аргументами?
Параметры, которые передаются срикпту. Скрипт точно также как и функция может иметь параметры (вспоминаем элементарные батники и %1 %2 %3 и т.д.).
1
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
16.01.2020, 00:07  [ТС]
C Perl и Ruby я ошибся, ссылочка в тему спасибо!
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
16.01.2020, 05:16
Цитата Сообщение от AlexMarkov Посмотреть сообщение
Разновидностей процессоров много, получается в статических языках при кодировании необходимо учитывать и виды процессора?
Это называется архитектура процессора. x86, x86-64, arv, armv7, spark… Ну да, иногда приходится учитывать особенности архитектуры. Самые очевидные:
* порядок байтов
C
1
2
3
//конвертирует 32-битную беззнаковую величину
//из локального порядка байтов в сетевой
uint32_t htonl(uint32_t hostlong);
* размер примитивных числовых типов. Например, int может занимать в памяти как 2 байта, так и 4 или даже 8.

Цитата Сообщение от AlexMarkov Посмотреть сообщение
PVM наверно также обращается к процессору компьютера, и так же транслирует или переводит какой-то код?
Скажем так: интерпретатор питона запущен на процессоре и просто работает. Питоновский код в машинный код не переводится.
1
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
16.01.2020, 11:00  [ТС]
Я понял, а как в Python обстоят дела с объектами?

Как я понимаю в python все объект. Информация о типе так же является классом, т.е. таким же объектом.

Тип

Ещё одно свойство объекта — тип.

Под «типом» объекта обычно подразумевается класс объекта.

>>> x = "The Duck"
>>> id(x)
60633200
>>> type(x)
<class 'str'>
>>>

Если вы хотите использовать объект для перебора элементов, мы помещаем его в цикл for. Вы не проверяете, чем является объект.

>>> for duck in 1,2,3,4,5:
print(duck)
1
2
3
4
5
>>>

Если операция завершится неудачей — нормально, это всего лишь говорит о том, что Вы предоставили неправильный тип.

Что переводится в байт код? ID, имя переменной, информация о типе и сам объект? И как все таки обстоят дела с типом, если тип также класс объекта, то какого объекта? Что является последним объектом в этой цепочке? В данном примере <class 'str'> (тип строка) что из себя представляет?
0
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
16.01.2020, 11:32  [ТС]
Garry Galler, Рыжий Лис,???
0
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
16.01.2020, 11:39
AlexMarkov, в байт-код переводится питоновский код. Это можно заключить даже из названия термина
С типом дела обстоят хорошо. Он имеет тип type. "Какого объекта" - спрашивать неверно. "Какого класса" - можно.
1
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
16.01.2020, 11:47
В байт-коде очень много информации. На практике можно легко декомпилировать приложение.

Пример:
Python
1
my_dict = { 'a':1 }
Code
1
2
3
4
5
6
7
  4           0 BUILD_MAP                1
              3 LOAD_CONST               0 (1)
              6 LOAD_CONST               1 ('a')
              9 STORE_MAP
             10 STORE_NAME               0 (my_dict)
             13 LOAD_CONST               2 (None)
             16 RETURN_VALUE
1
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
16.01.2020, 12:03  [ТС]
dondublon,
Цитата Сообщение от dondublon Посмотреть сообщение
"Какого объекта" - спрашивать неверно. "Какого класса" - можно.
>>> x=5
>>> type(x)
<class 'int'>
>>> type(type(x))
<class 'type'>
>>>
Это немного на объект повыше или мне это знать не обязательно.

Рыжий Лис, а можно пример декомпиляции более сложного словаря, а то так не совсем понятно и способ декомпилирования?
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
16.01.2020, 12:20
https://docs.python.org/3/library/dis.html

Добавлено через 2 минуты
Python
1
2
3
4
5
import dis 
 
code = compile('d = {"a":1,"b":2,"c":3}', '<string>', 'exec')
for i in  dis.Bytecode(code):
    print(i)
Добавлено через 3 минуты
Python
1
2
print(code.co_code)
# b'i\x03\x00d\x00\x00d\x01\x006d\x02\x00d\x03\x006d\x04\x00d\x05\x006Z\x00\x00d\x06\x00S'
1
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
16.01.2020, 12:26
Это немного на объект повыше или мне это знать не обязательно.
Я зависаю от таких запросов, сорри.
0
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
16.01.2020, 12:36  [ТС]
Рыжий Лис, спасибо за пример но тут в документации есть одна фраза:

Детали реализации CPython: Байт-код - это деталь реализации интерпретатора CPython. Нет никаких гарантий, что байт-код не будет добавлен, удален или изменен между версиями Python. Использование этого модуля не должно рассматриваться для работы с виртуальными машинами Python или версиями Python.

Вот что у меня получилось

Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=1, argrepr='1', offset=0, starts_line=1, is_jump_target=False)
Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=2, argrepr='2', offset=2, starts_line=None, is_jump_target=False)
Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval=3, argrepr='3', offset=4, starts_line=None, is_jump_target=False)
Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval=('a', 'b', 'c'), argrepr="('a', 'b', 'c')", offset=6, starts_line=None, is_jump_target=False)
Instruction(opname='BUILD_CONST_KEY_MAP' , opcode=156, arg=3, argval=3, argrepr='', offset=8, starts_line=None, is_jump_target=False)
Instruction(opname='STORE_NAME', opcode=90, arg=0, argval='d', argrepr='d', offset=10, starts_line=None, is_jump_target=False)
Instruction(opname='LOAD_CONST', opcode=100, arg=4, argval=None, argrepr='None', offset=12, starts_line=None, is_jump_target=False)
Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=14, starts_line=None, is_jump_target=False)

Скорее похоже на запись инструкций, чем на предоставленном выше примере.
Ну все равно спасибо, в образовательных целях самое то.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
16.01.2020, 13:58
Кстати, на стековерфлоу есть хороший тред для понимания того как устроена питоновская вирт. машина исполнения и чем она отличается от Java VM. https://stacko_verflow.com/que... r-parlance
(пробел убрать, без него форум блокирует ссылку на этот ресурс)

Каждая операция, выполняемая на виртуальной машине, в конечном итоге должна затрагивать реальное оборудование. Виртуальные машины содержат предварительно скомпилированные подпрограммы, которые являются достаточно общими для выполнения любой комбинации логических операций. Виртуальная машина, возможно, не генерирует новые машинные инструкции, но она, безусловно, выполняет свои собственные подпрограммы снова и снова в произвольно сложных последовательностях. Виртуальная машина Java, виртуальная машина Python и все другие виртуальные машины общего назначения одинаковы в том смысле, что их можно заставить выполнять любую логику, о которой вы только мечтаете, но они различаются в зависимости от того, какие задачи они выполняют. взять на себя, и какие задачи они оставляют программисту
.
Относительно Python - непосредственно машинные инструкции генерит такая реалиазция Python как pypy (точнее его JIT компилятор), классический же CPython использует предварительные скомпилированные машинные инструкции.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.01.2020, 13:58
Помогаю со студенческими работами здесь

Статическая и динамическая память
Нужны две программки, одна с динамической памятью работает, другая со статической. Вот задание: Ввести массивы А и В. В массив С...

Статическая/динамическая компоновка
Привет,есть несколько вопросов 1)Хотел свой Qt MVS статическим сделать но где то вычитал что WebKit'а не будет при статике,а мне он как...

Статическая и динамическая компановка
В каких случаях следует предпочесть статическую компановку библиотек? ..вот такой общий вопрос возник.. google как-то на него плохо...

Статическая или динамическая библиотека
Хочу создать свои функции? Какие библиотеки лучше использовать?

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru