Pascal ABC.NET

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

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

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

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

История развития

В 2003 году на факультете математики, механики и компьютерных наук ЮФУ была создана учебная среда программирования Pascal ABC. Система представляла собой интегрированную оболочку со встроенным интерпретатором языка программирования Паскаль, близкого к языку Delphi. Несмотря на неполную реализацию языка, она стала удачной заменой устаревшей системе Turbo Pascal в первоначальном обучении программированию. Как учебную систему её использовали во многих регионах СНГ. В каталоге Soft@Mail.ru программа Pascal ABC в 2006 году признавалась программой недели[1].
Images.png Внешние изображения
Image-silk.png Внешний вид программы.

В 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]. Значительно ускорен перенаправленный ввод
Особенности языка
Расширения языка Паскаль

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

Особенности языка, связанные с платформой .NET

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

Стандартные модули

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

Модуль растровой графики GraphWPF
Модуль растровой графики GraphABC (устаревший)
Модуль 3D графики и анимации Graph3D (на основе свободной библиотеки Helix Toolkit)
Модуль векторной графики WPFObjects
Модуль векторной графики ABCObjects (устаревший)
Модуль FormsABC для создания графических интерфейсов (на базе технологии Windows Forms)
Модуль NumLibABC (библиотека численных методов)
Модули исполнителей Робот и Чертёжник (школьная информатика)
Модуль электронного задачника 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: BigInteger := 1;
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;
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.

Поделитесь своим мнением или задайте вопрос