Холден-Рид, Кристен
- 1 year ago
- 0
- 0
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
22 января 2024 г. вышла версия PascalABC.NET 3.9.0 (3419). Добавлена работа с IP адресами, ускорена функция Replace, улучшены GraphWPF и TurtleWPF, CartesianPower вместо Cartesian.
+= -= *= /=
**
для возведения в степень
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
uses
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 , стандартные модули немногочисленны и ориентированы на обучение:
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.
begin
var P := 1bi;
for var i := 1 to 100 do
P := P * i;
Println(P);
end.
begin
SeqWhile(1, 1, (x, y) -> x + y, x -> x < 1000).Print;
end.
begin
var (a, b) := ReadInteger2;
while b <> 0 do
(a, b) := (b, a mod b);
var НОД := Abs(a);
НОД.Print;
end.
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.
begin
ReadLines('words.txt').SelectMany(s -> s.ToWords).GroupBy(v -> v).ToDictionary(x -> x.Key, x -> x.Count).PrintLines;
end.
begin
var (M, N) := (4, 5);
var A := MatrRandom(M, N);
A.Println;
A.Cols.Select(col -> col.Max).Println;
end.
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) является свободным программным обеспечением, распространяемым под .
В 2017 и 2022 годах был проведён независимый аудит при помощи статического анализатора PVS-Studio . По результатам проверок сформированы списки потенциально опасных ситуаций в коде, требующих дополнительного анализа со стороны разработчиков. Также отмечено, что общее качество кода можно улучшить. Для этого необходимо устранить дублирования кода, избыточные проверки, а также более аккуратно проводить рефакторинг.