Обзор нового языка программирования Pkl от Apple
Apple представила Pkl (Pickle) — открытый язык программирования, предназначенный для определения конфигурации и продвигающий модель configuration as code.
Pkl был запущен 1 февраля 2024 года в версии 0.25. Apple опубликовала гайд, в котором рассказала о ключевых особенностях и преимуществах языка.
Pkl позиционируется как безопасный, простой и приятный в использовании язык конфигурации. Поддержка Pkl уже реализована для Java, Kotlin, Swift и Go, в перспективе список пополнят другие популярные языки и платформы.
Pkl может применяться как для генерации статических файлов конфигурации в форматах JSON, XML и YAML. Документация по языку размещена на GitHub. Язык доступен для macOS, Linux, Alpine Linux и JVM.
Теперь давайте рассмотрим подробнее.
Как можно юзать Apple Pkl?
Apple Pkl можно использовать в различных сценариях, где требуется конфигурация, например:
Настройки приложения: Вы можете использовать Apple Pkl для определения настроек вашего приложения, таких как логирование, база данных, аутентификация и т.д. Например, вот как можно определить конфигурацию для логов в Apple Pkl:
(def logging
(dict
:level "INFO"
:format "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
:handlers (list
(dict
:type "file"
:filename "app.log"
:mode "a"
)
(dict
:type "console"
)
)
)
)pki
Пользовательские предпочтения:
Вы можете использовать Apple Pkl для определения своих пользовательских предпочтений, таких как темы, ярлыки, плагины и т. д. Например, вот как можно задать темную тему в Apple Pkl:
(def theme
(dict
:name "dark"
:background "#282c34"
:foreground "#abb2bf"
:cursor "#528bff"
:selection "#3e4452"
:colors (list
"#282c34" "#e06c75" "#98c379" "#e5c07b"
"#61afef" "#c678dd" "#56b6c2" "#abb2bf"
"#545862" "#be5046" "#7c9f4b" "#d19a66"
"#4078f2" "#a626a4" "#0184bc" "#5c6370"
)
)
)
Анализ данных
Вы можете юзать Apple Pkl для определения параметров анализа данных, таких как источники, фильтры, преобразования, data analysis pipeline и т. д. Например, вот как можно определить конвейер анализа данных в Apple Pkl:
(def pipeline
(list
(dict
:type "source"
:name "sales"
:format "csv"
:path "data/sales.csv"
)
(dict
:type "filter"
:name "region"
:value "Europe"
)
(dict
:type "transform"
:name "profit"
:function (lambda (row) (- (get row "revenue") (get row "cost")))
)
(dict
:type "visualize"
:name "bar"
:x "product"
:y "profit"
:title "Profit by Product in Europe"
)
)
)
Как Apple Pkl может взаимодействовать с другими языками?
Apple Pkl может взаимодействовать с другими языками двумя способами: embedding и code generation.
Embedding
Apple Pkl может быть встроен в качестве библиотеки в Java, Kotlin, Swift, Go и другие языки. Вы можете встраивать Apple Pkl в свои приложения для настройки во время выполнения и получать доступ к значениям Pkl из основного языка. Apple Pkl предоставляет библиотеки для Python, Kotlin и Lisp, которые позволяют загружать, разбирать, оценивать и манипулировать Pkl файлами и выражениями. Например, вот как можно загрузить файл Pkl и получить доступ к его значениям из Java и Golang:
import com.apple.pkl.Pkl;
import com.apple.pkl.PklConfig;
import com.apple.pkl.PklException;
// Load a Pkl file
PklConfig config = Pkl.load("config.pkl");
// Access a Pkl value
String host = config.getString("host");
// Modify a Pkl value
config.set("port", 8080);
// Save the modified Pkl file
Pkl.dump(config, "config.pkl");
import (
"context"
"github.com/apple/pkl-go"
)
// Load a Pkl file
config, err := pkl.LoadFromPath(context.Background(), "config.pkl")
if err != nil {
panic(err)
}
// Access a Pkl value
host := config.GetString("host")
// Modify a Pkl value
config.Set("port", 8080)
// Save the modified Pkl file
err = pkl.Dump(config, "config.pkl")
if err != nil {
panic(err)
}
Генерация кода
Вы можете использовать Apple Pkl для генерации кода для вашего целевого языка и использовать сгенерированный код в качестве статической конфигурации. Apple Pkl поддерживает генерацию кода для Java, Kotlin, Swift и Go и может генерировать классы, перечисления, константы и аннотации на основе значений Pkl. Например, вот как можно создать класс Java из файла Pkl:
# Define a Pkl value
(def person
(dict
:name "Alice"
:age 25
:gender "female"
)
)
# Generate a Java class
(pkl-codegen-java person "Person")
Сгенеренный Java class будет выглядеть следующим образом:
public class Person {
public static final String name = "Alice";
public static final int age = 25;
public static final String gender = "female";
}
Так же интересный видео обзор на pkl можно глянуть тут: