PascalABC.NET — язык программирования Паскаль нового поколения, включающий классический Паскаль, большинство возможностей языка Delphi, а также ряд собственных расширений. Он реализован на платформе Microsoft.NET и содержит все современные языковые средства: внутриблочные описания, автоопределение типа, кортежи, срезы, классы, перегрузку операций, интерфейсы, обработку исключений, обобщенные классы и подпрограммы, лямбда-выражения, средства параллельного программирования.

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

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

PascalABC.NET — это также простая и мощная интегрированная среда разработки, поддерживающая технологию IntelliSense, содержащая средства автоформатирования, встроенный отладчик и встроенный дизайнер форм, функционирующая на Windows и Linux Кроме того, консольный компилятор PascalABC.NET функционирует на MacOS под Mono.

История развития В 2003 году на факультете математики, механики и компьютерных наук ЮФУ была создана учебная среда программирования Pascal ABC. Система представляла собой интегрированную оболочку со встроенным интерпретатором языка программирования Паскаль, близкого к языку Delphi. Несмотря на неполную реализацию языка, она стала удачной заменой устаревшей системе Turbo Pascal в первоначальном обучении программированию. Как учебную систему её использовали во многих регионах СНГ.

В 2005—2006 годах система была полностью переработана: изменена её архитектура — на полноценный компилятор языка, близкого к Delphi, с расширениями, связанными с платформой .NET. Новая система получила название PascalABC.NET. В июне 2009 года появилась первая стабильная версия PascalABC.NET 1.2.

В сентябре 2009 г. появилась веб-среда разработки WDE, не требующая установки PascalABC.NET на локальный компьютер и позволяющая запускать программы на PascalABC.NET непосредственно из окна браузера. Веб-среда разработки была закрыта в октябре 2017 года.

В августе 2011 г. осуществлен переход на .NET 4.0 (версия 1.8).

В феврале 2013 г. вышла версия PascalABC.NET 2.0 с дизайнером форм и поддержкой проектов.

15 мая 2013 г. вышла версия 2.1 с английской локализацией интерфейса и сообщений об ошибках.

15 февраля 2014 г. вышла версия PascalABC.NET 2.2. Многократно ускорено обращение к символам строки на запись.

28 августа 2015 г. вышла версия PascalABC.NET 3.0. PascalABC.NET стал свободным и распространяется под лицензией LGPLv3.

12 февраля 2016 г. вышла версия PascalABC.NET 3.1. Появились кортежи и срезы, значительно обновлена стандартная библиотека.

29 августа 2016 г. вышла версия PascalABC.NET 3.2. Появились операторы yield и yield sequence, обновлена стандартная библиотека.

30 августа 2017 г. вышла версия PascalABC.NET 3.3. Появились стандартные модули GraphWPF и Graph3D (для Windows Vista и выше), упрощенный цикл loop, операция безопасного среза, кортежное присваивание, поддержка Nullable-типов. Добавлена украинская локализация интерфейса и сообщений об ошибках.

11 февраля 2018 г. вышла версия PascalABC.NET 3.3.5. Добавлен стандартный модуль NumLibABC (учебная библиотека численных методов), реализованы форматные строки и операция возведения в степень. В полную версию дистрибутива (для Windows Vista и выше) интегрирована .NET 4.7.1, для Windows XP оставлен дистрибутив с .NET 4.0.

25 мая 2018 г. вышла версия PascalABC.NET 3.4. Реализовано некоторое подмножество Pattern Matching, расширенный оператор is.

1 сентября 2018 г. вышла версия PascalABC.NET 3.4.2. Реализованы расширенные свойства, расширенные индексные свойства и автосвойства, добавлен модуль WPFObjects как замена устаревшему ABCObjects.

25 мая 2019 г. вышла версия PascalABC.NET 3.5. В Pattern Matching добавлена возможность сопоставления со списками, кортежами и константами.

16 января 2020 г. вышла версия PascalABC.NET 3.6.0. Реализована операция .., возвращающая IntRange или CharRange в зависимости от контекста, а также условная операция: var min := if a < b then a else b;

7 мая 2020 г. вышла версия PascalABC.NET 3.6.3. Реализована операция доступа по индексу с конца a[^1] для массивов, списков и строк. Реализована возможность использовать срезы в левой части оператора присваивания: a[:2] := a[3:5]. Значительно ускорен перенаправленный ввод

8 августа 2020 г. вышла версия PascalABC.NET 3.7. Реализованы распаковка последовательности в переменные, массивы-значения в виде |1,3,5,7,9|, запись программ без внешнего begin-end с использованием ## (## Print(2*2))

7 марта 2021 г. вышла версия PascalABC.NET 3.8. Реализованы расширенный оператор foreach (foreach var (x,y) in a), литералы для BigInteger в виде 1bi, срезы многомерных массивов в виде m[:,:], m[^1,:], лямбда-выражения с распаковкой параметров (s.Where(\(name,age) -> age >= 18)).

24 августа 2021 г. вышла версия PascalABC.NET 3.8.1. Реализован атрибут [Cache] для кеширования результатов функции, полноценная директива {$zerobasedstrings}, стандартный модуль PlotWPF.

9 марта 2022 г. вышла версия PascalABC.NET 3.8.3. Реализованы конструкции for var i:=1 to 6 step 2 do и foreach var x in a index i do

10 июля 2023 г. вышла версия PascalABC.NET 3.9.0. Реализована ковариантность параметров обобщенных типов, именованные аргументы. Реализована Linux-версия IDE. Добавлен стандартный модуль LightPT легковесной автоматической проверки заданий.

26 августа 2024 г. вышла версия PascalABC.NET 3.10.0. Реализованы многострочные строковые литералы, операция to для пары Ключ-Значение.

12 марта 2025 г. вышла версия PascalABC.NET 3.10.3. По умолчанию синтаксис [1,2,3] теперь закреплен за массивами. Для множеств теперь явно надо указывать тип. Введен новый тип faststring, ускоряющий многие операции со строками. Реализован метод Coords для вывода простых графических примитивов с возможностью масштабирования. Значительно ускорены встроенные множества set of T.

Особенности языка

Расширения языка Паскаль Операторы += -= *= /= Операция ** для возведения в степень Внутриблочные описания переменных Описание переменных в заголовке цикла for Инициализация переменной при описании (var n: integer := 10;) Автоопределение типа переменной при инициализации (var x := 1;) Цикл foreach Упрощенный цикл loop Подпрограммы с переменным числом параметров Множества set на базе произвольных типов (set of integer) case по строкам Методы в записях Возможность определять методы как внутри, так и вне интерфейса класса или записи Наряду со стандартным, упрощённый синтаксис модулей Операция new для вызова конструктора Инициализаторы полей классов и записей Перегрузка операций Автоклассы Безымянные классы Лямбда-выражения Тип функции в стиле T->T Тип кортежа в стиле (T1,T2) Тип последовательности sequence of T Кортежное присваивание (a,b) := (b,a) Срезы a[from:to:step] и безопасные срезы a?[from:to:step] для массивов, списков и строк Многомерные срезы a[:,:10] Операторы yield и yield sequence для генерации последовательностей Оператор match ... with сопоставления с образцом Расширенная операция is Расширенные свойства, автосвойства Интерполяция строк Индексация с конца: a[^1] := 777; Диапазоны .. и цикл по диапазону: foreach var i in 1..10 do Print(i); Цикл for с шагом: for var i:=1 to 10 step 2 do Print(i); Цикл foreach с индексом: foreach var x in Arr(1,3,5) index i do Println(i,x); Распаковка параметров лямбда-выражений \(x,y) -> x + y Частичная поддержка директив OpenMP Ковариантность параметров обобщенных типов Именованные аргументы

Особенности языка, связанные с платформой .NET Все типы — наследники класса Object Стандартный тип BigInteger Форматные строки Многомерные динамические массивы Интерфейсы .NET Подключение пространств имен .NET в разделе uses Обобщённые классы, интерфейсы, подпрограммы и процедурные переменные Автоматическая сборка мусора для объектов Атрибуты Методы расширения Поддержка неуправляемого кода через external Типы type?, допускающие значение nil (синоним Nullable<T>)

Программирование в функциональном стиле Функции в PascalABC.NET являются объектами первого класса - их можно присваивать переменным, передавать как параметры и возвращать из других функций. Тип функции задается в виде T -> Res, переменной такого типа может быть присвоена анонимная функция:var f: real -> real := x -> x*x;Ниже демонстрируется пример суперпозиции двух функций:function Super<T,T1,T2>(f: T1 -> T2; g: T -> T1): T -> T2 := x -> f(g(x));

var f: real -> real := x -> x*x; var fg := Super(f,Sin); var gf := Super(Sin,f);

Print(fg(2)); Print(gf(2));Операция суперпозиции определена над функциями в стандартной библиотеке:var f: real -> real := x -> x*x;

Print((f*Cos)(2)); Print((Cos*f)(2));В книге "How To Program Effectively In Delphi" и в одноимённом цикле видео программист и специалист в области преподавания компьютерных наук доктор Кевин Бонд отмечает мощные функциональные возможности PascalABC.NET, отсутствующие в Delphi. В качестве примера подробно рассматривается частичное применение функции:var f: real -> real -> real := x -> y -> x + y;

Print(f(2)(3));

Стандартные модули Поскольку в PascalABC.NET можно пользоваться всеми библиотеками платформы .NET, стандартные модули немногочисленны и ориентированы на обучение: Модуль растровой графики GraphWPF Модуль растровой графики GraphABC (для Linux) Модуль 3D графики и анимации Graph3D (на основе свободной библиотеки Helix Toolkit) Модуль векторной графики WPFObjects Модуль векторной графики ABCObjects (устаревший) Модуль FormsABC для создания графических интерфейсов (на базе технологии Windows Forms) Модуль WPF для создания графических интерфейсов (на базе технологии WPF) Модуль NumLibABC (библиотека численных методов) Модуль PlotWPF для визуализации данных Модули исполнителей Робот и Чертёжник (школьная информатика) Модуль электронного задачника Programming Taskbook

Примеры программ

Пример 1. Поменять местами первую и вторую половины массива begin var a := ArrGen(10, i->2*i+1); a.Println; Assert(a.Length mod 2 = 0); var n := a.Length div 2; a := a[n:] + a[:n]; a.Println; end.

Пример 2. 100! begin var P := 1bi; for var i := 1 to 100 do P := P * i; Println(P); end.

Пример 3. Вывести все числа Фибоначчи, меньшие 1000 begin SeqWhile(1, 1, (x, y) -> x + y, x -> x < 1000).Print; end.

Пример 4. Нахождение наибольшего общего делителя двух чисел begin var (a, b) := ReadInteger2; while b <> 0 do (a, b) := (b, a mod b); var НОД := Abs(a); НОД.Print; end.

Пример 5. Частотный словарь слов в файле begin var D := new Dictionary<string, integer>; foreach var s in ReadLines('words.txt') do foreach var word in s.ToWords do D[word] := D.Get(word) + 1; D.PrintLines; end.

Пример 5а. Частотный словарь слов в файле. Решение в функциональном стиле begin ReadLines('words.txt').SelectMany(s -> s.ToWords).GroupBy(v -> v).ToDictionary(x -> x.Key, x -> x.Count).PrintLines; end.

Пример 6. Максимальные значения в столбцах матрицы

begin var (M, N) := (4, 5); var A := MatrRandom(M, N); A.Println; A.Cols.Select(col -> col.Max).Println; end.

Пример 7. Параллельное умножение матриц с использованием директив OpenMP procedure Mult(a, b, c: array [,] of real; n: integer); begin {$omp parallel for} for var i := 0 to n - 1 do for var j := 0 to n - 1 do begin var cc := 0.0; for var l := 0 to n - 1 do cc += a[i, l] * b[l, j]; c[i, j] := cc; end; end;

const N = 1000;

begin var A := MatrRandomReal(N, N, 1, 1.1); var B := MatrRandomReal(N, N, 1, 1.1); var C := new real[N, N]; Mult(A, B, C, N); Writeln(MillisecondsDelta / 1000); end.

Лицензия PascalABC.NET (начиная с версии 3.0) является свободным программным обеспечением, распространяемым под лицензией LGPLv3.

Аудит исходного кода