PascalABC.NET: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[непроверенная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
Добавил ссылки
Нет описания правки
 
(не показано 26 промежуточных версий 11 участников)
Строка 4: Строка 4:
| semantics = [[Императивное программирование|императивная]]
| semantics = [[Императивное программирование|императивная]]
| paradigm = [[Мультипарадигменный язык программирования|мультипарадигменный]]: [[Структурное программирование|структурное]], [[Объектно-ориентированное программирование|объектно-ориентированное]], [[обобщённое программирование|обобщённое]], [[процедурное программирование]], [[функциональное программирование]]
| paradigm = [[Мультипарадигменный язык программирования|мультипарадигменный]]: [[Структурное программирование|структурное]], [[Объектно-ориентированное программирование|объектно-ориентированное]], [[обобщённое программирование|обобщённое]], [[процедурное программирование]], [[функциональное программирование]]
| year = 2002
| year = 2007
| designer = PascalABC.NET Compiler Team
| designer = [[Михалкович, Станислав Станиславович|С. С. Михалкович]], И. В. Бондарев, А. В. Ткачук, С. О. Иванов
| latest_release_version = 3.8.3 сборка 3090
| latest_release_version = 3.10.0 сборка 3546
| latest_release_date = 09.03.2022
| latest_release_date = 21.09.2024
| typing = [[Статическая типизация|статическая]]
| typing = [[Статическая типизация|статическая]]
| implementations = PascalABC.NET, <br />Pascal ABC (поддержка прекращена)
| implementations = PascalABC.NET, <br />Pascal ABC (поддержка прекращена)
Строка 14: Строка 14:
| influenced_by = [[Паскаль (язык программирования)|Паскаль]], [[Delphi (язык программирования)|Delphi]], [[C Sharp|C#]], [[Python]], [[Kotlin]]
| influenced_by = [[Паскаль (язык программирования)|Паскаль]], [[Delphi (язык программирования)|Delphi]], [[C Sharp|C#]], [[Python]], [[Kotlin]]
| influenced =
| influenced =
| website = http://www.pascalabc.net
| website = https://www.pascalabc.net
| платформа = .NET CLR (WinXP и старше), Mono (Linux, MacOS)
| платформа = .NET CLR (WinXP и старше), Mono (Linux, MacOS)
}}
}}
Строка 20: Строка 20:
'''PascalABC.NET''' — язык программирования [[Паскаль (язык программирования)|Паскаль]] нового поколения, включающий классический Паскаль, большинство возможностей языка [[Delphi (язык программирования)|Delphi]], а также ряд собственных расширений. Он реализован на платформе [[.NET Framework|Microsoft.NET]] и содержит все современные языковые средства: внутриблочные описания, автоопределение типа, [[Кортеж (информатика)|кортежи]], срезы, [[Класс (программирование)|классы]], [[перегрузка операторов|перегрузку операций]], [[Интерфейс (объектно-ориентированное программирование)|интерфейсы]], [[Обработка исключений|обработку исключений]], [[обобщённое программирование|обобщенные классы и подпрограммы]], [[Лямбда-выражение|лямбда-выражения]], средства [[Параллельное программирование|параллельного программирования]].
'''PascalABC.NET''' — язык программирования [[Паскаль (язык программирования)|Паскаль]] нового поколения, включающий классический Паскаль, большинство возможностей языка [[Delphi (язык программирования)|Delphi]], а также ряд собственных расширений. Он реализован на платформе [[.NET Framework|Microsoft.NET]] и содержит все современные языковые средства: внутриблочные описания, автоопределение типа, [[Кортеж (информатика)|кортежи]], срезы, [[Класс (программирование)|классы]], [[перегрузка операторов|перегрузку операций]], [[Интерфейс (объектно-ориентированное программирование)|интерфейсы]], [[Обработка исключений|обработку исключений]], [[обобщённое программирование|обобщенные классы и подпрограммы]], [[Лямбда-выражение|лямбда-выражения]], средства [[Параллельное программирование|параллельного программирования]].


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


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


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


== История развития ==
== История развития ==
В 2003 году на факультете математики, механики и компьютерных наук [[Южный федеральный университет|ЮФУ]] была создана учебная среда программирования Pascal ABC. Система представляла собой интегрированную оболочку со встроенным [[интерпретатор]]ом языка программирования Паскаль, близкого к языку Delphi. Несмотря на неполную реализацию языка, она стала удачной заменой устаревшей системе [[Turbo Pascal]] в первоначальном обучении программированию. Как учебную систему её использовали во многих регионах [[Содружество Независимых Государств|СНГ]]. В каталоге Soft@[[Mail.ru]] программа ''Pascal ABC'' в 2006 году признавалась программой недели<ref>[http://soft.mail.ru/program_week_archive.php Программы недели -> программирование] {{webarchive|url=https://web.archive.org/web/20120604235054/http://soft.mail.ru/program_week_archive.php |date=2012-06-04 }}</ref>.
В 2003 году на факультете математики, механики и компьютерных наук [[Южный федеральный университет|ЮФУ]] была создана учебная среда программирования Pascal ABC. Система представляла собой интегрированную оболочку со встроенным [[интерпретатор]]ом языка программирования Паскаль, близкого к языку Delphi. Несмотря на неполную реализацию языка, она стала удачной заменой устаревшей системе [[Turbo Pascal]] в первоначальном обучении программированию. Как учебную систему её использовали во многих регионах [[Содружество Независимых Государств|СНГ]].


{{External media
{{External media
Строка 73: Строка 73:


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

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


== Особенности языка ==
== Особенности языка ==
Строка 93: Строка 95:
* Операция <code>'''new'''</code> для вызова конструктора
* Операция <code>'''new'''</code> для вызова конструктора
* Инициализаторы полей классов и записей
* Инициализаторы полей классов и записей
* Перегрузка операций
* [[Перегрузка операторов|Перегрузка операций]]<ref>{{Cite web |url=http://pascalabc.net/downloads/pabcnethelp/scr/LangGuide/Classes/operoverloading.html |title=Перегрузка операций |access-date=2015-09-18 |archive-date=2016-03-04 |archive-url=https://web.archive.org/web/20160304101614/http://pascalabc.net/downloads/pabcnethelp/scr/LangGuide/Classes/operoverloading.html |deadlink=yes }}</ref>
* Автоклассы
* Автоклассы
* Безымянные классы
* Безымянные классы
Строка 114: Строка 116:
* Распаковка параметров лямбда-выражений <code>\(x,y) -> x + y</code>
* Распаковка параметров лямбда-выражений <code>\(x,y) -> x + y</code>
* Частичная поддержка директив [[OpenMP]]
* Частичная поддержка директив [[OpenMP]]
* Ковариантность параметров обобщенных типов
* Именованные аргументы


=== Особенности языка, связанные с платформой .NET ===
=== Особенности языка, связанные с платформой .NET ===
* Все типы — [[Класс (программирование)|классы]]
* Все типы — наследники класса Object
* Стандартный тип BigInteger
* Стандартный тип BigInteger
* Форматные строки
* Форматные строки
Строка 128: Строка 132:
* Поддержка неуправляемого кода через '''external'''
* Поддержка неуправляемого кода через '''external'''
* Типы <code>type?</code>, допускающие значение <code>nil</code> (синоним <code>Nullable<T></code>)
* Типы <code>type?</code>, допускающие значение <code>nil</code> (синоним <code>Nullable<T></code>)

=== Программирование в функциональном стиле ===
Функции в PascalABC.NET являются [[Объект первого класса|объектами первого класса]] - их можно присваивать переменным, передавать как параметры и возвращать из других функций. Тип функции задается в виде T -> Res, переменной такого типа может быть присвоена [[анонимная функция]]:<syntaxhighlight lang="delphi">
var f: real -> real := x -> x*x;
</syntaxhighlight>Ниже демонстрируется пример [[Композиция функций|суперпозиции]] двух функций:<syntaxhighlight lang="delphi">
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));
</syntaxhighlight>Операция суперпозиции определена над функциями в стандартной библиотеке:<syntaxhighlight lang="delphi">
var f: real -> real := x -> x*x;

Print((f*Cos)(2));
Print((Cos*f)(2));
</syntaxhighlight>В книге "How To Program Effectively In Delphi"<ref>{{Книга|автор=Kevin R. Bond|заглавие=How to Program Effectively in Delphi for AS/A Level Computer Science|год=2021|часть=Chapter 44. Anonymous methods|издательство=Educational Computing Services Ltd|страниц=1200}}</ref> и в одноимённом цикле видео<ref name=":0">{{Cite web|lang=en|url=https://www.youtube.com/watch?v=RBlg-ItyyTA&t=377s|title=How to Program Effectively in Delphi. Lesson 44. Part 1|author=Kevin Bond|access-date=2023-04-04|archive-date=2023-04-04|archive-url=https://web.archive.org/web/20230404133136/https://www.youtube.com/watch?v=RBlg-ItyyTA&t=377s|deadlink=no}}</ref> программист и специалист в области преподавания компьютерных наук доктор Кевин Бонд<ref>{{Cite web|lang=en|url=https://www.educational-computing.com/DelphiBook/KRBsBriefBiography.pdf|title=Brief biography Dr Kevin R Bond|website=Educational Computing Services Ltd|access-date=2023-04-04|archive-date=2023-04-04|archive-url=https://web.archive.org/web/20230404131810/https://www.educational-computing.com/DelphiBook/KRBsBriefBiography.pdf|deadlink=no}}</ref> отмечает мощные функциональные возможности PascalABC.NET, отсутствующие в Delphi. В качестве примера подробно рассматривается<ref name=":0" /><ref>{{Cite web|lang=en|url=https://www.youtube.com/watch?v=OmregYuqLU8&t=1640s|title=Delphi Boot Camp 2022 - Delphi and functional programming using anonymous methods|access-date=2023-04-04|archive-date=2023-04-04|archive-url=https://web.archive.org/web/20230404133135/https://www.youtube.com/watch?v=OmregYuqLU8&t=1640s|deadlink=no}}</ref> [[Частичное применение|частичное применение функции]]:<syntaxhighlight lang="delphi">
var f: real -> real -> real := x -> y -> x + y;

Print(f(2)(3));
</syntaxhighlight>


== Стандартные модули ==
== Стандартные модули ==
Поскольку в PascalABC.NET можно пользоваться всеми библиотеками платформы [[.NET Framework|.NET]], стандартные модули немногочисленны и ориентированы на обучение:
Поскольку в PascalABC.NET можно пользоваться всеми библиотеками платформы [[.NET Framework|.NET]], стандартные модули немногочисленны и ориентированы на обучение:
* Модуль растровой графики '''GraphWPF'''
* Модуль растровой графики '''GraphWPF'''
* Модуль растровой графики '''GraphABC''' ''(устаревший)''
* Модуль растровой графики '''[[GraphABC]]''' ''(для [[Linux]])''
* Модуль 3D графики и анимации '''Graph3D''' ''(на основе свободной библиотеки Helix Toolkit)''
* Модуль 3D графики и анимации '''Graph3D''' ''(на основе свободной библиотеки Helix Toolkit)''
* Модуль векторной графики '''WPFObjects'''
* Модуль векторной графики '''WPFObjects'''
Строка 145: Строка 172:


=== Пример 1. Поменять местами первую и вторую половины массива ===
=== Пример 1. Поменять местами первую и вторую половины массива ===
<source lang="delphi">
<syntaxhighlight lang="delphi">
begin
begin
var a := ArrGen(10, i->2*i+1);
var a := ArrGen(10, i->2*i+1);
Строка 154: Строка 181:
a.Println;
a.Println;
end.
end.
</syntaxhighlight>
</source>


=== Пример 2. 100! ===
=== Пример 2. 100! ===
Строка 242: Строка 269:
== Лицензия ==
== Лицензия ==
''PascalABC.NET'' (начиная с версии 3.0) является свободным программным обеспечением, распространяемым под [http://pascalabc.net/12-stranitsy-na-sajte/38-litsenzionnoe-soglashenie-na-sistemu-programmirovaniya-pascalabc-net лицензией LGPLv3].
''PascalABC.NET'' (начиная с версии 3.0) является свободным программным обеспечением, распространяемым под [http://pascalabc.net/12-stranitsy-na-sajte/38-litsenzionnoe-soglashenie-na-sistemu-programmirovaniya-pascalabc-net лицензией LGPLv3].

== Аудит исходного кода ==
В 2017<ref>{{Cite web|lang=ru-RU|url=https://pvs-studio.ru/ru/blog/posts/csharp/0492/|title=Проверяем проект PascalABC.NET с помощью плагинов для SonarQube: SonarC# и PVS-Studio|website=PVS-Studio|date=2017-03-29|access-date=2023-04-04|archive-date=2023-04-04|archive-url=https://web.archive.org/web/20230404142202/https://pvs-studio.ru/ru/blog/posts/csharp/0492/|deadlink=no}}</ref> и 2022<ref>{{Cite web|lang=ru-RU|url=https://habr.com/ru/companies/pvs-studio/articles/647649/|title=PascalABC.NET, повторная проверка|website=Хабр|date=2022-01-25|access-date=2023-04-04|archive-date=2023-04-04|archive-url=https://web.archive.org/web/20230404143702/https://habr.com/ru/companies/pvs-studio/articles/647649/|deadlink=no}}</ref> годах был проведён независимый аудит [https://github.com/pascalabcnet/pascalabcnet публичного репозитория исходного кода PascalABC.NET] при помощи статического анализатора [[PVS-Studio]]. По результатам проверок сформированы списки потенциально опасных ситуаций в коде, требующих дополнительного анализа со стороны разработчиков. Также отмечено, что общее качество кода можно улучшить. Для этого необходимо устранить дублирования кода, избыточные проверки, а также более аккуратно проводить рефакторинг.


== Примечания ==
== Примечания ==
Строка 247: Строка 277:


== Ссылки ==
== Ссылки ==
* [http://pascalabc.net/ Сайт проекта «Система программирования ''PascalABC.NET''»]
* [https://pascalabc.net/ Сайт проекта «Система программирования ''PascalABC.NET''»]
* [https://github.com/pascalabcnet/pascalabcnet Публичный репозиторий исходного кода языка на Github]
* [http://pascalabc.net/downloads/pabcnethelp/index.htm Описание языка ''PascalABC.NET'']
* [https://pascalabc.net/downloads/pabcnethelp/index.htm Описание языка ''PascalABC.NET'']
* [https://t.me/pascalabc_official Официальный телеграм-канал ''PascalABC.NET'']
* [http://www.ptaskbook.com/ Электронный задачник по программированию ''Programming Taskbook'']
* [http://www.ptaskbook.com/ Электронный задачник по программированию ''Programming Taskbook'']
* [http://forum.mmcs.sfedu.ru/c/pascalabcnet Форум PascalABC.NET]
* [https://forum.mmcs.sfedu.ru/c/pascalabcnet Форум PascalABC.NET]
* [http://progopedia.ru/implementation/pascalabcnet/ Статья ''PascalABC.NET''] в [[Прогопедия|Прогопедии]] — энциклопедии языков программирования{{ref-ru}}
* [https://github.com/pascalabcnet/pascalabcnet PascalABC.Net на GitHub]
* [https://stepik.org/course/91781/promo Курс "PascalABC.NET: современный код"] на Stepik
* [https://stepik.org/course/91781/promo Курс "PascalABC.NET: современный код"] на Stepik



Текущая версия от 14:27, 3 ноября 2024

PascalABC.NET
Семантика императивная
Класс языка мультипарадигменный: структурное, объектно-ориентированное, обобщённое, процедурное программирование, функциональное программирование
Тип исполнения компилятор
Появился в 2007
Автор PascalABC.NET Compiler Team
Расширение файлов .pas
Выпуск 3.10.0 сборка 3546 (21.09.2024)
Система типов статическая
Основные реализации PascalABC.NET,
Pascal ABC (поддержка прекращена)
Испытал влияние Паскаль, Delphi, C#, Python, Kotlin
Лицензия LGPL
Сайт pascalabc.net
Платформа .NET CLR (WinXP и старше), Mono (Linux, MacOS)
Логотип Викисклада Медиафайлы на Викискладе

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

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

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

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

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

[править | править код]

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

Внешние изображения
Внешний вид программы.

В 20052006 годах система была полностью переработана: изменена её архитектура — на полноценный компилятор языка, близкого к 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 легковесной автоматической проверки заданий.

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

[править | править код]

Расширения языка Паскаль

[править | править код]
  • Операторы += -= *= /=
  • Операция ** для возведения в степень
  • Внутриблочные описания переменных
  • Описание переменных в заголовке цикла 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"[1] и в одноимённом цикле видео[2] программист и специалист в области преподавания компьютерных наук доктор Кевин Бонд[3] отмечает мощные функциональные возможности PascalABC.NET, отсутствующие в Delphi. В качестве примера подробно рассматривается[2][4] частичное применение функции:

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)
  • Модуль 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.

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

[править | править код]

В 2017[5] и 2022[6] годах был проведён независимый аудит публичного репозитория исходного кода PascalABC.NET при помощи статического анализатора PVS-Studio. По результатам проверок сформированы списки потенциально опасных ситуаций в коде, требующих дополнительного анализа со стороны разработчиков. Также отмечено, что общее качество кода можно улучшить. Для этого необходимо устранить дублирования кода, избыточные проверки, а также более аккуратно проводить рефакторинг.

Примечания

[править | править код]
  1. Kevin R. Bond. Chapter 44. Anonymous methods // How to Program Effectively in Delphi for AS/A Level Computer Science. — Educational Computing Services Ltd, 2021. — 1200 с.
  2. 1 2 Kevin Bond. How to Program Effectively in Delphi. Lesson 44. Part 1 (англ.). Дата обращения: 4 апреля 2023. Архивировано 4 апреля 2023 года.
  3. Brief biography Dr Kevin R Bond (англ.). Educational Computing Services Ltd. Дата обращения: 4 апреля 2023. Архивировано 4 апреля 2023 года.
  4. Delphi Boot Camp 2022 - Delphi and functional programming using anonymous methods (англ.). Дата обращения: 4 апреля 2023. Архивировано 4 апреля 2023 года.
  5. Проверяем проект PascalABC.NET с помощью плагинов для SonarQube: SonarC# и PVS-Studio. PVS-Studio (29 марта 2017). Дата обращения: 4 апреля 2023. Архивировано 4 апреля 2023 года.
  6. PascalABC.NET, повторная проверка. Хабр (25 января 2022). Дата обращения: 4 апреля 2023. Архивировано 4 апреля 2023 года.

Литература

[править | править код]
  • Михалкович С.С. Учебная система программирования PascalABC // Научно-методическая конференция «Современные информационные технологии в образовании: Южный Федеральный округ» 13—14 мая 2004 / Крукиер Л.А., Муратова Г.В.. — Ростов-на-Дону: ЮГИНФО РГУ, 2004. — С. 156—158. — 252 с. — 200 экз.
  • Михалкович С.С. Учебная система программирования PascalABC: опыт разработки и использования // Вторая международная научно-практическая конференция «Современные информационные технологии и ИТ-образование»: Сборник трудов. — М., 2006. — С. 394—399.
  • Водолазов Н.Н., Михалкович С.С., Ткачук А.В. Опыт разработки учебного языка программирования для платформы .NET // Научно-методическая конференция «Современные информационные технологии в образовании: Южный Федеральный округ» 26—29 апреля 2007 / Крукиер Л.А., Муратова Г.В.. — Ростов-на-Дону: Изд-во «ЦВВР», 2007. — С. 71—73. — 312 с. — 250 экз. — ISBN 978-5-94153-146-2.