Основные типы в perl отличаются друг от друга, чем большинство языков, причем типы являются скалярными, массивами, хешем (но, по-видимому, не подпрограммами, и amp;, которые, я думаю, действительно являются просто скалярными ссылками с синтаксическим сахаром). Самое странное в том, что наиболее распространенные типы данных: int, boolean, char, string, все подпадают под базовый тип данных "scalar". Кажется, что perl решает скорее рассматривать скаляр как строку, логическое или число, основанное на операторе, который его модифицирует, подразумевая, что сам скаляр фактически не определен как "int" или "String" при сохранении.
Это заставляет меня задуматься о том, как эти скаляры хранятся "под капотом", особенно в отношении того, как это влияет на эффективность (да, я знаю, что языки сценариев приносят пользу для гибкости, но они по-прежнему должны быть максимально оптимизированы, проблемы с гибкостью не затрагиваются). Мне гораздо легче хранить номер 65535 (который принимает два байта), а затем строку "65535", которая принимает 6 байтов, так как распознавание того, что $val = 65535 хранит int, позволит мне использовать 1/3 памяти, в больших массивах это может означать меньшее количество кеш-запросов.
Он не ограничивается, конечно, сохранением памяти. Бывают случаи, когда я могу предложить более значительную оптимизацию, если я знаю, какой тип скаляра ожидать. Например, если у меня есть хеш с использованием очень больших целых чисел в качестве ключей, было бы гораздо быстрее найти значение, если я распознаю ключи как int, позволяя просто модулю для создания моего хеш-ключа, тогда, если мне нужно запустить более сложное хэширование логика в строке, которая имеет 3 раза байты.
Итак, мне интересно, как perl обрабатывает эти скаляры под капотом. Сохраняет ли оно каждое значение в виде строки, жертвуя дополнительной памятью и стоимостью процессора постоянной конвертирующей строки для int в случае, когда скаляр всегда используется как int? Или у него есть некоторая логика для вывода типа скаляра, используемого для определения того, как сохранить и манипулировать им?
Изменить:
TJD, связанный с perlguts, который отвечает на половину моего вопроса. Скаляр фактически хранится как строка, int (подписанный, без знака, двойной) или указатель. Я не слишком удивлен, я обычно ожидал, что такое поведение произойдет под капотом, хотя интересно видеть точные типы. Я оставляю этот вопрос открытым, потому что perlguts на самом деле до низкого уровня. Другое, тогда говорящее, что существует 5 типов данных, он не указывает, как perl работает для чередования между ними, то есть как perl решает, какой тип SV использовать, когда скаляр сохраняется, и как он знает, когда/как делать.