Какво е Pony?
Можете да мислите за Pony като комбинация от Rust (език за програмиране, предназначен за производителност и безопасност, особено за безопасно едновременно управление и управление на паметта) и Erlang (език за програмиране, използван за кодиране на WhatsApp). Той има забележителни функции:
- Защитен от неправилна работа с типове (Type-safe)
- Защитен от различни софтуерни грешки и уязвимости в сигурността при работа с достъп до паметта (Memory-safe)
- Защитен е от изключения( Exception-safe – състоянието на кода, който работи правилно, когато се генерира изключение)
- Защитен от Data race (това е често срещан проблем при многопоточното програмиране. Той възниква, когато множество задачи имат достъп до споделен ресурс без достатъчно защити, което води до недефинирано или непредвидимо поведение)
- Защитен от „мъртва хватка“ ( Deadlock) – ситуация, при която набор от процеси са блокирани, защото всеки процес чака друг ресурс да се изпълни.
Освен това, Pony е компилиран по собствен код и се предлага с BSD лиценз с две клаузи.
Защо Pony?
Писането на бързи, безопасни, ефективни, конкурентни програми не е лесно с повечето от съществуващите инструменти. „Бързо, ефективно и много едновременно“ е постижима цел, но добавете „безопасно“ и нещата стават много по-трудни. Тук идва решението – Pony, което направи тази задача лесно постижима.
Конкурентно програмиране
Pony улеснява конкурентното програмиране (представлява едновременното изпълнение на множество процеси през определен период от време). Част от начина, по който го прави, е чрез предоставяне на убедена (opinionated) история за едновременност. В Pony цялата едновременност или конкурентност се осъществява чрез модела на актьора.
Моделът на актьора е най-известен чрез имплементациите в Erlang и Akka. Моделът на актьора съществува от 70-те години на миналия век и детайлите варират значително от изпълнение до изпълнение. Това, което не се различава е, че всички изчисления се изпълняват от участници, които комуникират чрез асинхронни съобщения.
Мислете за модела на актьора по следния начин: обектите в обектно-ориентираното програмиране са състояние + синхронни методи, а актьорите са състояние + асинхронни методи.
Когато актьорът получи съобщение, той изпълнява съответния метод. Този метод може да работи върху състояние, което е достъпно само от този актьор. Моделът на актьора ни позволява да използваме променливо състояние по безопасен за едновременност начин. Всеки актьор е еднопоточен. Два метода в рамките на актьор никога не се изпълняват едновременно. Това означава, че в рамките на даден актьор актуализациите на данни не могат да причинят data race или други проблеми, обикновено свързани с нишки и променливи състояния.
Бързо и ефективно
Pony “актьорите” са планирани с ефективен work stealing scheduler (техника на динамично планиране, при която на процесор, който е завършил своите задачи, е позволено да открадне задача от друг процесор с излишни задачи) Има един планировчик на Pony за всеки наличен процесор. Нишките се отнасят до най-високото ниво на код, изпълняван от процесор, така че с много нишки вашият процесор може да се справи с няколко задачи едновременно. Моделът на thread per core (една нишка на процесор) е част от опита на Pony да работи съвместно с процесора, за да работи възможно най-ефективно. Времето за изпълнение на Pony се опитва да бъде възможно най-удобно за кеша на процесора. Колкото по-малко вашият код разбива кеша, толкова по-добре ще работи. Pony има за цел да помогне на вашия код да работи добре с кешът на процесора.
В програмирането, събиране на боклука (garbage collection) е форма на автоматично управление на паметта. Специален процес, наречен боклук колектор (Garbage колектор), периодично освобождава памет чрез премахване на обекти, които вече не са в приложения на търсенето. Спрете света (Stop the world) е решаваща фаза ,в някои алгоритми за събиране на боклук, за проследяване на паметта. Той спира изпълнението на програмата, за да сканира корените на паметта и да добави бариери за запис.
Времето за изпълнение на Pony включва купчинa за всеки актьор (heaps per actor), така че по време на събирането на боклука няма стъпка „да спрем света“.
Това означава, че вашата програма винаги извършва някаква работа. В резултат на това програмите на Pony завършват с много постоянна производителност и предвидими закъснения.
Безопасно
Типовата система Pony въвежда нова концепция: референтни възможности, които правят безопасността на данните част от типовата система (тип логическа система, включваща набор от правила, които присвояват свойство, наречено тип, на всеки „термин“ (дума, фраза или друг набор от символи) . Типът на всяка променлива в Pony включва информация за това как данните могат да се споделят между участниците. Компилаторът Pony използва информацията, за да провери по време на компилиране, дали вашият код е защитен от “date race” и „мъртва хватка (Deadlock)”.
Ако това звучи малко като Rust, то не е случайно. Възможностите за справка на Pony и инструментът Borrow checker на Rust осигуряват безопасност на данните; те просто подхождат към него по различни начини и имат различни компромиси.
Подходящ ли е Pony за вас?
Трудно е да решите дали да използвате нов език за програмиране. Трябва да претеглите уместността на инструмента спрямо неговата незрялост в сравнение с други решения. И така за какво е подходящ Pony?
Pony може да е правилното решение, ако трябва да решите труден проблем с едновременното изпълнение на задачи в кодирането. Конкурентното програмиране е причината за съществуване на Pony. Ако можете да постигнете това, което искате в еднонишков скрипт на Python, вероятно нямате нужда от Pony. Ако имате проблем с конкурентното програмиране, трябва да помислите за Pony и неговата мощна типова система защитена от data race.
С този език за програмиране ще получите компилатор, който ще ви попречи да въвеждате грешки, свързани с конкурентността и времето за изпълнение, което ще ви даде отлични резултати на производителност.