PascalABC.NET официальный канал
1.84K subscribers
625 photos
2 videos
9 files
429 links
Официальный канал языка и системы программирования PascalABC.NET
Download Telegram
🎓 С Днём знаний!

Поздравляем всех подписчиков канала PascalABC․NET с началом нового учебного года! К 1 сентября у PascalABC․NET сразу несколько важных обновлений.

Новый сайт pascalabc.net.
Современный дизайн, новая структура и удобный доступ к материалам о системе, документации и обучении.

Заходите, смотрите и делитесь впечатлениями в комментариях!

PascalABC․NET 4.0.

● В новой версии появилась собственная библиотека ML PascalABC․NET для машинного обучения — без внешних зависимостей. Теперь задачи анализа данных и классического машинного обучения можно решать средствами самого PascalABC․NET.
● Ещё одно важное обновление — компилятор для .NET 10.0.

С 1 сентября! Успешного и интересного учебного года!
❤21🔥4👍1
🎓 ML PascalABC․NET — машинное обучение без внешних зависимостей

Одно из главных нововведений PascalABC.NET 4.0 — новая библиотека ML PascalABC․NET.

Это уже не набор отдельных учебных алгоритмов, а целостная библиотека для анализа данных и классического машинного обучения.

В ней есть всё необходимое для полного ML-процесса:
● работа с табличными данными (DataFrame), статистика и визуализация
● подготовка признаков: пропуски, кодирование категорий, масштабирование
● классификация и регрессия: Logistic Regression, kNN, Decision Tree, Random Forest, Gradient Boosting
● кластеризация: KMeans и DBSCAN
● метрики, разбиение выборок и кросс-валидация
● ML-конвейеры для объединения подготовки данных и моделей
● встроенные датасеты для обучения и экспериментов

API библиотеки построен вокруг привычной современной схемы Fit / Transform / Predict. По организации работы и удобству программирования ML PascalABC.NET следует подходам scikit-learn, оставаясь при этом нативной библиотекой PascalABC․NET.

И принципиальный момент — никаких внешних зависимостей. DataFrame, линейная алгебра, модели, препроцессинг, метрики и валидация реализованы непосредственно в экосистеме PascalABC․NET.

Мы подготовили отдельный сайт с документацией, обучающими материалами и примерами:
ML PascalABC.NET — документация и обучение

Если вы хотите познакомиться с машинным обучением на PascalABC․NET, теперь для этого есть полноценная среда — от загрузки и подготовки данных до обучения модели и оценки её качества.
🔥16❤‍🔥1👍1
🚀 Предварительная версия PascalABC․NET 4.0.1 уже доступна

На странице скачивания PascalABC․NET появился новый раздел — «Предварительная версия». Сейчас в нём доступна PascalABC․NET 4.0.1 Beta. Именно эта версия будет постепенно накапливать новые возможности и последние исправления.

По мере готовности она станет основной версией PascalABC․NET, а пока её можно использовать для знакомства с нововведениями и тестирования.

Сейчас доступны:
— StandardPack 4.0.1 Beta
— консольный компилятор 4.0.1 Beta для .NET 10
— список изменений в 4.0.1

Скачать предварительную версию:
https://pascalabc.net/ssyilki-dlya-skachivaniya/
❤9👍1
PascalABC․NET + VS Code + .NET 10

В PascalABC․NET 4.0 появился официальный плагин для Visual Studio Code.

https://pascalabc.net/vscode/

Он поддерживает:
◉ компиляцию и запуск программ;
◉ IntelliSense;
◉ диагностику ошибок;
◉ подсказки типов и параметров;
◉ .NET Framework 4.8 и .NET 10.

С .NET 10 PascalABC․NET можно использовать в VS Code на Windows, Linux и macOS.

На скриншоте — PascalABC․NET в VS Code с работающим IntelliSense и запуском программы под .NET 10.
👍13🔥7❤‍🔥3❤3
Расширение PascalABC.NET для VS Code на Mac — работает! 🍎

Доступна версия 0.5.1 расширения PascalABC.NET для Visual Studio Code.

На macOS уже работают:
✅ запуск программ
✅ подсветка синтаксиса
✅ IntelliSense — автодополнение и информация о символах

Скачать расширение можно здесь:
https://pascalabc.net/vscode/
❤8👏3👍1
RayTracer, поправленный ИИ

Давний пример, публиковался здесь.
Попросил ИИ его ускорить. Ускорил в 10 раз

https://gist.github.com/miks1965/592a9ee7a812cafa89dde0440b8ee9a3

Сейчас эта сцена рендерится за 0.3 сек.

Чтож, спасибо, Claude!
🔥12❤2👍1
Спаниели или бульдоги? 🐶

Поговорим о машинном обучении в PascalABC.NET и о том, почему это круто.

Возьмём простую учебную задачу. У нас есть вес и высота собак двух пород. Обучим логистическую регрессию и посмотрим, как она разделит бульдогов и спаниелей.
uses MLABC, PlotML;

begin
var df := DataFrame.FromCsv('dogs.csv');

var X := df.ToMatrix(['Вес', 'ВысотаВХолке']);
var target := df.EncodeTarget('Порода');

var model := new LogisticRegression;
model.Fit(X, target.Labels);

Plot.Points(
df['Вес'].FloatValues,
df['ВысотаВХолке'].FloatValues,
target.Labels,
classNames := target.ClassNames
);

var (A, B, C) := model.DecisionBoundary.Coefficients;
Plot.Line(A, B, C);

Plot.SetLabels(
'Разделяющая прямая для двух пород',
'Вес, кг',
'Высота в холке, см'
);
end.

Несколько строк — и перед нами настоящий алгоритм машинного обучения: загрузка данных, подготовка признаков, обучение модели и визуализация найденной границы между классами.

И всё это — на PascalABC.NET.

Для обучения это особенно интересно: можно сначала разобраться, что такое признаки, классы, обучение модели и разделяющая граница, а уже потом переходить к более сложным моделям и инструментам.
❤4👍1
Трехмерная движущаяся 3D-сцена

По мотивам
https://habr.com/ru/articles/815653/?ysclid=mufywzozbj234491077

Ну не 256 байт а 860

##
uses GraphABC;

SetWindowSize(396,240);
LockDrawing;
var t := 9.0;

repeat
t += 1;
for var i := 5999 downto 0 do
begin
var a := i mod 99/50-1;
var s := 1-i/4000;
var b := s;
var x := t;
var y := 1.0;
var z := 1;
var d := 1.0;

while z<99 do
begin
z += 1;
var h := 0;
if (z>32) and (x.Trunc mod 99>27) then
h := (x.Trunc div 9 xor z div 8)*8 mod 46;

if y>=6-h then
begin
s := (x.Trunc and y.Trunc and z) mod 3/z;
if d<1 then break;
a := 1;
b := 1;
d := z/99
end;

x += a;
y -= b
end;

var c := (255*(d*z/99-s)).Round.Clamp(0,255);
Brush.Color := RGB(c,c,c);
FillRectangle(i mod 99*4,i div 99*4,
i mod 99*4+4,i div 99*4+4)
end;
Redraw
until False


Но всё равно интересно )
🔥9👍2❤1
.NET 10 в PascalABC.NET: Span<T>

Переход PascalABC.NET на .NET 10 открывает доступ ко многим современным возможностям платформы. Начинаем показывать их на небольших примерах.

Одна из них — Span<T>: тип для эффективной работы с непрерывным участком памяти без копирования данных.
begin
var a := [10,20,30,40,50];
var s := new System.Span<integer>(a,1,3);

s[1] := 333;

a.Println
end.

Результат:
10 20 333 40 50

Span<integer> s представляет три элемента массива a, начиная с индекса 1:
20 30 40

При изменении s[1] меняется непосредственно соответствующий элемент исходного массива.
То есть Span<T> позволяет работать с частью массива без создания нового массива и копирования элементов.

Это особенно полезно там, где важны производительность и минимизация лишних выделений памяти.

Продолжим знакомство с возможностями современного .NET в следующих постах.

#NET10
👍8🏆6🔥2
🔹 PascalABC.NET + .NET 10: очередь с приоритетами

Продолжаем знакомиться с возможностями современного .NET, которые становятся доступны в PascalABC.NET после перехода на .NET 10.

Сегодня — PriorityQueue<TElement,TPriority> из System.Collections.Generic.

Обычная очередь работает по принципу «первым пришёл — первым вышел». В очереди с приоритетами порядок определяется не временем добавления, а приоритетом элемента.
uses System.Collections.Generic;

begin
var q := new PriorityQueue<string,integer>;

q.Enqueue('low',10);
q.Enqueue('high',1);
q.Enqueue('middle',5);

while q.Count > 0 do
Println(q.Dequeue);
end.

Результат:
high
middle
low


У PriorityQueue каждый элемент хранится вместе со своим приоритетом. При вызове Dequeue первым извлекается элемент с наименьшим значением приоритета.
Поэтому здесь сначала извлекается 'high' с приоритетом 1, затем 'middle' с приоритетом 5 и только потом 'low' с приоритетом 10.
Очереди с приоритетами используются во многих алгоритмах: например, при поиске кратчайших путей, планировании задач и обработке событий.

И всё это — стандартная библиотека современного .NET.
👍9🔥1
PascalABC.NET + .NET 10: FrozenDictionary

Продолжаем знакомиться с возможностями современного .NET.
FrozenDictionary<TKey,TValue> — специальный словарь для сценария:
создали один раз → читаем очень много раз.
uses System.Collections.Frozen;

begin
var d := Dict(
'one' to 1,
'two' to 2,
'three' to 3
);

var fd := FrozenDictionary.ToFrozenDictionary(d);

Println(fd['two']);
end.

После создания FrozenDictionary уже нельзя изменять: добавлять и удалять элементы не получится.

Зато .NET может оптимизировать его внутреннюю структуру именно под быстрый поиск.

В характерных сценариях чтение из FrozenDictionary может работать примерно в 2 раза быстрее, чем из обычного Dictionary.

Но есть обратная сторона: создание такого словаря может быть примерно в 10 раз медленнее.

Поэтому FrozenDictionary имеет смысл не тогда, когда словарь постоянно меняется, а когда:
🔹данные формируются один раз;
🔹затем почти не меняются;
🔹поиск выполняется тысячи, миллионы и больше раз.

Типичные примеры — таблицы соответствий, конфигурация, справочники, маршрутизация, метаданные, кеши неизменяемых данных.

То есть идея простая:
Dictionary — универсальный словарь.
FrozenDictionary — словарь, оптимизированный для очень частого чтения.
👍8🔥2
🔹 PascalABC.NET + .NET 10: FrozenSet

Продолжаем знакомство с «замороженными» коллекциями .NET.

После FrozenDictionary — его родственник FrozenSet<T>.
uses System.Collections.Frozen;

begin
var s := HSet('Pascal','C#','Python');
var fs: FrozenSet<string> := s.ToFrozenSet();

Println(fs.Contains('Pascal'));
end.

FrozenSet похож на обычный HashSet, но после создания его содержимое уже нельзя изменять.
Зачем такое ограничение?

Чтобы .NET мог один раз проанализировать элементы множества и подобрать внутреннюю структуру, оптимизированную для последующих поисков.

В зависимости от данных Contains у FrozenSet может работать примерно в 2–6 раз быстрее, чем у обычного HashSet.

Но за это приходится платить при создании: построение FrozenSet может быть в несколько раз медленнее — в отдельных тестах примерно в 8–9 раз.

Поэтому FrozenSet рассчитан на тот же сценарий:
создали один раз → проверяем наличие элементов очень много раз.

Например:
• набор ключевых слов;
• разрешённые или запрещённые значения;
• расширения файлов;
• имена команд;
• коды и идентификаторы;
• любые справочные множества, которые после запуска программы не меняются.

HashSet — если множество нужно изменять.
FrozenSet — если его нужно один раз сформировать и затем очень быстро выполнять Contains.
❤6👍2
PascalABC.NET + .NET 10: SearchValues

Продолжаем знакомиться с возможностями современного .NET.

Метод IndexOfAny существовал и раньше. Новая идея здесь — SearchValues<T>.

Он позволяет один раз подготовить и оптимизировать набор значений, а затем использовать его во множестве поисков.
uses System.Buffers;

begin
var chars := SearchValues.Create(
'abcdefghijklmnopqrstuvwxyz0123456789'.ToCharArray
);

var texts := [
'***PascalABC.NET',
'---compiler',
'...12345',
'___algorithm'
];

foreach var text in texts do
begin
var p := text.AsSpan.IndexOfAny(chars);
Println(text,p);
end;
end.

Здесь набор букв и цифр создаётся только один раз:
var chars := SearchValues.Create(...);

А затем тот же SearchValues используется для поиска в разных строках.

Внутри .NET может выбрать для такого набора специальное представление и использовать оптимизированные алгоритмы, включая SIMD-векторизацию.

Поэтому SearchValues особенно полезен, когда:
• один и тот же набор символов используется много раз;
• набор достаточно большой;
• нужно быстро обрабатывать большие объёмы текста.

Например, при разборе текста, лексическом анализе, поиске разделителей, проверке допустимых символов и обработке протоколов.

Идея простая:
обычный IndexOfAny — нашли один раз;
SearchValues — один раз подготовили набор → много раз быстро ищем.
❤9
🔹 Куда развивается PascalABC.NET

PascalABC.NET продолжает активно развиваться — и речь уже не только о новых конструкциях языка.

Сейчас основные направления связаны с переходом на современную платформу .NET и развитием всей инфраструктуры системы программирования:
— компилятор для .NET 10;
— расширение PascalABC.NET для Visual Studio Code;
— новый SDK PascalABC.NET;
— поддержка NuGet-пакетов;
— режимы работы с одним файлом, проектом и рабочим пространством;
— развитие библиотек и совместимости с современной .NET.

Часть этих задач уже реализована, часть находится в работе, а некоторые направления только исследуются.

Основные планы собраны на отдельной странице:

👉 Roadmap PascalABC.NET
https://pascalabc.net/roadmap/
❤9🔥1
Функции над функциями с помощью лямбда-выражений

Прошло меньше полутора месяцев с начала программирования на первом курсе направления ФИИТ — а мы уже можем писать такие вещи.

Возьмём полином четвёртой степени с двумя максимумами и определим оператор численного дифференцирования:
uses PlotWPF;

function D(f: real -> real; h: real := 1e-5): real -> real :=
x -> (f(x + h) - f(x - h)) / (2 * h);

function D2(f: real -> real): real -> real :=
D(D(f));

begin
var f: real -> real := x -> -x*x*x*x/4 + 2*x*x;

var c := new LineGraphWPF(-3,3,f);
c.AddLineGraph(-3,3,D(f));
c.AddLineGraph(-3,3,D2(f));

c.Graph[0].Color := Colors.Red;
c.Graph[1].Color := Colors.Green; // f'
c.Graph[2].Color := Colors.Blue; // f''
end.

На графике:
🔴 f — исходная функция
🟢 D(f) — первая производная
🔵 D2(f) — вторая производная

Самое интересное здесь — даже не графики, а две строчки:
function D(f: real -> real; h: real := 1e-5): real -> real :=
x -> (f(x + h) - f(x - h)) / (2 * h);

function D2(f: real -> real): real -> real :=
D(D(f));

D получает функцию и возвращает функцию.

А вторая производная определяется почти как в математике:
D2(f) = D(D(f))

Это возможно потому, что в PascalABC.NET процедуры и функции — объекты первого класса: их можно передавать в другие функции, хранить в переменных и возвращать как результат.

И лямбда-выражения позволяют записывать всё это очень компактно.
👍4🔥2
PascalABC.NET + .NET 10: DateOnly и TimeOnly

Продолжаем знакомиться с типами современного .NET.

Раньше для работы с датой или временем часто приходилось использовать DateTime, даже если нужна была только дата без времени или только время без даты.

Для этого в .NET есть отдельные типы:
DateOnly — только дата;
TimeOnly — только время суток.
begin
var d := new System.DateOnly(2026,9,24);

Println(d);
Println(d.AddDays(100));
end.

Результат, например при русской локали:
24.09.2026
02.01.2027

DateOnly хранит только год, месяц и день.
Это удобно для дат рождения, календарных дат, сроков, расписаний — везде, где часы, минуты и часовой пояс вообще не нужны.
begin
var t := new System.TimeOnly(14,30);

Println(t);
Println(t.AddHours(2.5));
end.

Результат:
14:30
17:00

TimeOnly хранит только время суток — часы, минуты, секунды и более точные доли секунды.

Например, его удобно использовать для времени начала занятия, открытия магазина, отправления поезда или ежедневного расписания.

Главное преимущество этих типов — точная модель данных.

Если программе нужна только дата, используем DateOnly.
Если нужно только время — TimeOnly.
Если нужны и дата, и время вместе — DateTime.

Меньше лишней информации — меньше возможностей случайно ошибиться в логике программы.
❤5👍1
Media is too big
VIEW IN TELEGRAM
Как написать сортировку вставками в PascalABC.NET 4.0 😎

Эй, PascalABC.NET, напиши-ка сортировку вставками для читателей нашего канала :)

И смотри не подсказывай!

Tab, Tab, Tab, Enter, Tab, F9.

Спасибо! 🚀
😁4🔥2
NuGet в PascalABC.NET. Часть 1: SQLite без сервера

В PascalABC.NET с компилятором .NET 10 теперь можно подключать библиотеки из NuGet прямо в тексте программы — без ручного скачивания DLL и настройки ссылок на библиотеки.

Начнём с SQLite — полноценной базы данных, которой не нужен отдельный сервер.

Программа выведет 42. Причём вычисление выполнит не PascalABC.NET, а настоящий движок SQLite! В этом примере база данных существует только в оперативной памяти.

Как это работает?
Директива {$package Microsoft.Data.Sqlite 10.0.13} указывает имя и версию NuGet-пакета. При первой компиляции PascalABC.NET автоматически загрузит пакет вместе с необходимыми зависимостями. Всё сохраняется в общем кеше NuGet, поэтому повторно скачивать те же библиотеки не потребуется.

Где это работает?
В оболочке PascalABC.NET с компилятором .NET 10 и в расширении PascalABC.NET для VS Code при использовании того же компилятора. В режиме .NET Framework директива {$package} не поддерживается.

Это первая публикация серии о NuGet. Дальше покажем, как находить интересные пакеты и использовать их в PascalABC.NET — от работы с датами до численных расчётов и машинного обучения.
{$package Microsoft.Data.Sqlite 10.0.13}
uses Microsoft.Data.Sqlite;

begin
var connection := new SqliteConnection('Data Source=:memory:');
connection.Open;

var command := connection.CreateCommand;
command.CommandText := 'select 40 + 2';
Println(command.ExecuteScalar);

command.Dispose;
connection.Dispose;
end.
👍4🔥4
PascalABC.NET на .NET 10: Avalonia + ScottPlot

Ещё один пример работы с NuGet-пакетами в новой версии PascalABC.NET на платформе .NET 10.

В программе используются две крупные библиотеки:
Avalonia — современный кроссплатформенный фреймворк для создания графических приложений под Windows, Linux и macOS.
ScottPlot — высокопроизводительная библиотека научной визуализации для .NET. Позволяет строить интерактивные графики, диаграммы, гистограммы, тепловые карты и визуализировать большие массивы данных.

Особенность примера — сложная система транзитивных зависимостей, в том числе нативных библиотек для графического рендеринга.

Программа создаёт полноценное оконное приложение Avalonia со встроенным компонентом ScottPlot и строит график зависимости y = x².

Этот пример демонстрирует не просто подключение NuGet-пакетов, а совместную работу крупных библиотек .NET со сложными управляемыми и нативными зависимостями в PascalABC.NET на .NET 10.

Полный код программы на PascalABC.NET:
{$package Avalonia.Desktop 12.1.4}
{$package ScottPlot.Avalonia 5.1.59}

uses Avalonia, Avalonia.Controls, ScottPlot.Avalonia;

procedure AppMain(app: Application; args: array of string);
begin
var x := [1.0,2.0,3.0,4.0,5.0];
var y := [1.0,4.0,9.0,16.0,25.0];

var p := new AvaPlot;
p.Plot.Add.Scatter(x,y);

var w := new Window;
w.Title := 'ScottPlot + PascalABC.NET';
w.Width := 1000;
w.Height := 650;
w.Content := p;

w.Show;
app.Run(w);
end;

begin
AppBuilder.Configure&<Application>
.UsePlatformDetect
.Start(AppMain,new string[0]);
end.
👍3
Ошибки в ML для неверных имен столбцов

В DataFrameABC при указании неверного имени столбца теперь предлагается вероятное близкое имя - как в production - коде.
👍8