
Введение
Эта статья призвана помочь и тем, кто уже давно использует Julia, и тем, кто только начинает её изучать. Благо совсем скоро начнётся Зимняя школа Julia, где можно будет познакомиться с этим по-настоящему замечательным языком.
Мой путь к написанию этой статьи лежал через погружение в работу с массивами, векторами и матрицами в Engee – среде расчётов и моделирования, в которой Julia является основным языком. И в сообществе которой лежит код этой статьи.
Синтаксис, похожий на Python и MATLAB, позволял мне спокойно работать над инженерными проектами, совмещая скрипты и визуальное моделирование. Но мне было сложно понять, почему вектор-столбец
v = [1
2
3]- вектор размера (3,), а вектор-строка m = [1 2 3] - матрица размера (1,3).
И зная о том, что Julia - это крайне эффективный для вычислений язык, я допускал классические ошибки:
a = collect(1:10)
for i in a
...
endВедь в MATLAB это было реализовано именно так (в нём range - это массив):

По прочтении этой статьи вы поймёте, почему не стоит использовать collect там, где это не нужно.
Но потом мне стало интересно, как же range, занимая всего 48 байт, обладает всем функционалом массива в виде индексации, сортировки и пр:
sizeof([2:0.5:100;]) # 1546 байт
sizeof(2:0.5:100) # 48 байтИ, погрузившись в документацию, благо она переведена на русский, я пошёл искать ответы на то, почему Julia так здорово работает с range.

В итоге «искал медь», а нашёл золото. Оказывается, система типов в Julia действительно очень интересная.
Было бы странно переписывать документацию на Хабр, поэтому
эта статья призвана собрать в одном месте и в общих чертах (но с неочевидными иногда особенностями) описать систему типов и их предназначение в Julia.
А также получить ответы на вопросы, поставленные выше.
Типы в Julia
Что мне так нравится в Julia, так это её реальное и удобное в изучении совмещение низкого и высокого уровня – от указания того, сколько бит будет занимать ваш тип, до теории типов в виде пересечения, низшего и высшего типов и многого другого.
Несмотря на то, что в документации и многих других статьях про типы пошли по более «идеоматическому» пути, сразу рассказывая про абстрактные типы, я предлагаю пойти по более классическому, «С-подобному» пути, и идти снизу-вверх.
Но перед погружением соберём в одном месте сразу все определения, рассчитывая на то, что читатель знаком с хотя бы некоторыми примерами, которые указаны после символа
