279 lines
26 KiB
HTML
279 lines
26 KiB
HTML
<html>
|
||
|
||
<head>
|
||
<object type="application/x-oleobject" classid="clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e">
|
||
</object>
|
||
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
|
||
<title></title>
|
||
<link rel="StyleSheet" href="../default.css">
|
||
</head>
|
||
|
||
<body>
|
||
<OBJECT id=exam type="application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11" style="position:absolute; top:-100; left:-100;">
|
||
<param name="Command" value="TCard">
|
||
<param name="Text" value="">
|
||
</OBJECT>
|
||
|
||
<H1>Коротко о главном</H1>
|
||
<p>Данный текст содержит краткий <b>обзор </b>
|
||
<b>особенностей</b> PascalABC.NET. </p>
|
||
<ul>
|
||
<li>PascalABC.NET – легковесная и мощная среда разработки программ с
|
||
подробной справочной системой, средствами подсказки по коду,
|
||
автоформатированием, встроенным отладчиком и встроенным дизайнером форм.
|
||
Интегрированная среда разработки PascalABC.NET ориентирована на создание
|
||
проектов малой и средней сложности, а также на обучение современному
|
||
программированию. </li>
|
||
<li>PascalABC.NET – мощный и современный язык
|
||
программирования. По предоставляемым возможностям он превосходит язык Delphi
|
||
и содержит практически все возможности языка C#.</li>
|
||
<li>PascalABC.NET опирается на платформу Microsoft .NET - её языковые
|
||
возможности и библиотеки, что делает его гибким, эффективным, постоянно
|
||
развивающимся. Кроме того, можно легко сочетать <span lang="ru">библиотеки</span>, разработанные на PascalABC.NET
|
||
и других .NET-языках.</li>
|
||
<li>Компилятор PascalABC.NET генерирует код, выполняющийся так же быстро,
|
||
как и код на C#, и несколько медленнее, чем код на
|
||
C++ и Delphi.</li>
|
||
<li>PascalABC.NET является представителем линейки современных языков Паскаль
|
||
вместе с Delphi и Oxygene.</li>
|
||
<li>Мнение, что язык Паскаль устарел и утрачивает свои
|
||
позиции, основано на представлении о старом Паскале и старых средах
|
||
программирования (например, <span lang="en-us">Free Pascal </span>с его
|
||
несовременной консольной оболочкой). К сожалению, масса отечественной учебной литературы
|
||
<span lang="ru">с упорством,
|
||
достойным лучшего применения, </span>ориентируется на <span lang="ru">отживший
|
||
</span>Turbo Pascal<span lang="ru"> с древней
|
||
консольной оболочкой, бедной графической библиотекой и устаревшими
|
||
средствами объектно-ориентированного программирования, развивая у
|
||
обучающихся стойкое отвращение к языку Паскаль вообще.</span></li>
|
||
<li>PascalABC.NET расширен современными языковыми
|
||
возможностями для легкого, компактного и понятного програмирования.</li>
|
||
<li>PascalABC.NET – достаточно зрелая среда. Ее прототип – учебная система
|
||
Pascal ABC – появилась в 2002 году. PascalABC.NET – развивающаяся среда. Ведутся разработки новых языковых возможностей, новых библиотек.</li>
|
||
</ul>
|
||
<p>Далее приводится <b>ряд программ с короткими комментариями</b>, раскрывающих
|
||
возможности и особенности языка PascalABC.NET. </p>
|
||
<p>Тексты программ располагаются в рабочей папке (по умолчанию
|
||
C:\PABCWork.NET) в подпапке Samples\!MainFeatures.</p>
|
||
<p>Для запуска программ данное окно должно быть открыто через
|
||
пункт меню "Помощь/Коротко о главном" так, чтобы оно не
|
||
полностью закрывало окно оболочки <b>PascalABC.NET</b>.</p>
|
||
<p><b>Основное</b></p>
|
||
<ol>
|
||
<li><a href="JavaScript:exam.TCard(201,0)"><b>AssignExt.pas.</b></a> Данный
|
||
пример иллюстрирует использование расширенных операторов присваивания += -=
|
||
*= /= для целых и вещественных. Оператор /= для целых, разумеется,
|
||
запрещен. </li>
|
||
<li><a href="JavaScript:exam.TCard(202,0)"><b>BlockVar.pas.</b></a> Переменные могут описываться внутри блока
|
||
begin-end
|
||
и инициализироваться при описании. Это крайне удобно для промежуточных
|
||
переменных, а в PascalABC.NET в силу особенностей
|
||
реализации еще и ускоряет доступ к переменным процентов на 30.</li>
|
||
<li><a href="JavaScript:exam.TCard(203,0)"><b>AutoVars.pas.</b></a> Если переменная инициализируется при описании, то ее тип
|
||
можно не указывать: он определяется по типу правой части (автоопределение типа). Переменную - параметр цикла for
|
||
можно описывать прямо в заголовке цикла, сочетая это с автоопределением типа.</li>
|
||
<li><b><a href="JavaScript:exam.TCard(204,0)">SimpleNewFeatures.pas</a>.</b> Пример, объединяющий
|
||
возможности из предыдущих трех примеров.</li>
|
||
<li><b><a href="JavaScript:exam.TCard(205,0)">WriteAll.pas</a>.</b> Процедура write
|
||
выводит любой тип.
|
||
В частности, она выводит все элементы множества. Если тип ей неизвестен, то она
|
||
выводит имя типа. </li>
|
||
<li><b><a href="JavaScript:exam.TCard(206,0)">WriteFormat.pas</a>.</b> Стандартная процедура WriteFormat
|
||
позволяет осуществлять форматированный вывод. Вид форматной строки заимствуется
|
||
из .NET.</li>
|
||
<li><b><a href="JavaScript:exam.TCard(207,0)">StandardTypes.pas</a>.</b> В этой программе приведены все стандартные целые и
|
||
вещественные типы. Программа выводит их размеры.</li>
|
||
<li><b><a href="JavaScript:exam.TCard(208,0)">RandomDiap.pas</a>.</b> К функциям генерации случайных чисел добавилась
|
||
Random(a,b), возвращающая случайное целое в диапазоне
|
||
[a,b].
|
||
Процедуру Randomize в начале программы вызывать не надо.</li>
|
||
<li><b><a href="JavaScript:exam.TCard(209,0)">RealExtNums.pas</a>.</b> Действия с вещественными значениями не могут в .NET
|
||
привести к переполнению. При некорректных операциях (деление на 0,
|
||
переполнение или взятие логарифма отрицательного числа) мы получим либо
|
||
значение "бесконечность", либо значение "NaN" (не число).</li>
|
||
<li><b><a href="JavaScript:exam.TCard(210,0)">Foreach.pas</a>.</b> Оператор
|
||
foreach предназначен для цикла по
|
||
контейнерам, таким как массивы, множества и контейнеры стандартной
|
||
библиотеки (например, List<T>). Элементы контейнера
|
||
доступны только на чтение.</li>
|
||
<li><b><a href="JavaScript:exam.TCard(211,0)">Amp.pas</a>.</b> Ключевые слова могут использоваться в качестве имен, в
|
||
этом случае перед ними следует ставить значок &
|
||
снятия атрибута ключевого слова. Кроме того, ключевые слова могут
|
||
использоваться в качестве полей. Например, &Type
|
||
или System.Type.</li>
|
||
</ol>
|
||
<p><b>Типы</b></p>
|
||
<ol start=12>
|
||
<li><b><a href="JavaScript:exam.TCard(212,0)">CharFunc.pas</a>.</b> Символы Char хранят Unicode и поэтому занимают 2 байта.
|
||
Функции Ord и Chr работают именно с Unicode. Для совместимости функции
|
||
OrdAnsi и ChrAnsi работают в однобайтовой кодировке Windows.</li>
|
||
<li><b><a href="JavaScript:exam.TCard(213,0)">StringTypes.pas</a>.</b> Строки string
|
||
занимают память переменной длины и проецируются на .NET-тип System.String. Однако, в отличие от
|
||
NET-строк они изменяемы и индексируются с 1. Для
|
||
работы со строками фиксированной длины следует использовать тип
|
||
string[n] или shortstring=string[255].
|
||
В частности, типизированные файлы допустимы только для коротких строк.</li>
|
||
<li><b><a href="JavaScript:exam.TCard(214,0)">StringMethods.pas</a>.</b> Строки string имеют ряд
|
||
методов как .NET-классы. В этих методах
|
||
предполагается, что строки индексируются с нуля. </li>
|
||
<li><b><a href="JavaScript:exam.TCard(215,0)">StringInteger.pas</a>.</b> Все типы - классы. Простые типы тоже. Поэтому преобразование строки в целое и вещественное
|
||
проще выполнять с помощью статических методов
|
||
Parse соответствующего класса (например,
|
||
integer.Parse(s)). Преобразование целого или вещественного в строку
|
||
удобнее выполнять с помощью экземплярного метода ToString
|
||
(например, r.ToString). </li>
|
||
<li><b><a href="JavaScript:exam.TCard(216,0)">Enum.pas</a>.</b> Перечислимый тип позволяет обращаться к его константам
|
||
не только непосредственно, но и используя запись вида ИмяТипа.ИмяКонстанты.
|
||
Нелишне отметить, что все перечислимые типы - производные от System.Enum.</li>
|
||
<li><b><a href="JavaScript:exam.TCard(217,0)">Sets.pas</a>.</b> Множества могут иметь произвольный базовый тип. Внутри
|
||
множество хранится как хеш-таблица, однако при выводе множества в процедуре
|
||
write его элементы упорядочиваются.</li>
|
||
<li><b><a href="JavaScript:exam.TCard(218,0)">DynArray.pas</a>.</b> Динамические массивы array of
|
||
T представляют собой ссылки. Память под них должна выделяться либо
|
||
вызовом стандартной процедуры
|
||
SetLength, либо использованием инициализатора вида
|
||
new T[n]. Процедура SetLength
|
||
сохраняет старое содержимое массива. Динамические массивы являются классом, производным от
|
||
класса System.Array, имеющего достаточно
|
||
богатый интерфейс. Следует упомянуть прежде всего статические методы
|
||
&Array.Sort и &Array.Resize.</li>
|
||
<li><b><a href="JavaScript:exam.TCard(219,0)">InitRecords.pas</a>.</b> В записях допустимы инициализаторы полей.
|
||
Поля записи инициализируются при создании переменной-записи.</li>
|
||
<li><b><a href="JavaScript:exam.TCard(220,0)">UntypedFile.pas</a>.</b> Бестиповые файлы file изменены по сравнению с Delphi.
|
||
Отсутствуют процедуры BlockRead и
|
||
BlockWrite, но в бестиповой файл можно
|
||
непосредственно записывать данные разных типов. Лишь бы считывание
|
||
производилось в том же порядке.</li>
|
||
<li><b><a href="JavaScript:exam.TCard(221,0)">PointerToRef.pas</a>.</b> Имеют место некоторые ограничения для указателей на управляемую память.
|
||
Так, указатель не может прямо или косвенно указывать на объект класса,
|
||
память для которого выделена вызовом конструктора.</li>
|
||
<li><b><a href="JavaScript:exam.TCard(222,0)">Pointers.pas</a> и <a href="JavaScript:exam.TCard(22201,0)">References.pas</a>.</b> Указатели утрачивают свои позиции. Вместо них мы
|
||
рекомендуем активно использовать ссылки.</li>
|
||
<li><b><a href="JavaScript:exam.TCard(223,0)">StructTypeEquiv.pas</a>.</b> В отличие от Delphi,
|
||
для некоторых типов имеет место структурная, а не именная эквивалентность
|
||
типов. Так, структурная эквивалентность имеет место для динамических
|
||
массивов, указателей, множеств и процедурных типов.
|
||
</li>
|
||
</ol>
|
||
<p><b>Подпрограммы</b></p>
|
||
<ol start=24>
|
||
<li><b><a href="JavaScript:exam.TCard(224,0)">FuncParams.pas</a>.</b> Подпрограммы с переменным числом параметров делаются
|
||
легко добавлением ключевого слова params
|
||
перед параметром - динамическим массивом. Такой параметр должен быть
|
||
последним в списке.</li>
|
||
<li><b><a href="JavaScript:exam.TCard(225,0)">Overload.pas</a>.</b> Перегрузка имен подпрограмм осуществляется без ключевого
|
||
слова overload.</li>
|
||
<li><b><a href="JavaScript:exam.TCard(226,0)">ProcVars.pas</a>.</b> Процедурные переменные могут "накапливать" действия при
|
||
помощи оператора +=. Эти действия можно отключать при помощи
|
||
оператора -=. Процедурные переменные могут инициализироваться не только
|
||
обычными подпрограммами, но и статическими и экземплярными методами класса.</li>
|
||
<li><b><a href="JavaScript:exam.TCard(227,0)">SwapT.pas</a>.</b> Обобщенные подпрограммы имеют простой синтаксис и
|
||
используются сразу наряду с обычными: procedure
|
||
Swap<T>(var x,y: T);</li>
|
||
</ol>
|
||
<p><b>Модули</b></p>
|
||
<ol start=28>
|
||
<li><b><a href="JavaScript:exam.TCard(228,0)">SystemUnitTest.pas</a>.</b> Системный модуль имеет название PABCSystem, а не System, как в
|
||
Delphi, и подключается неявно первым в списке
|
||
uses. Причина такого именования состоит в том, что
|
||
важнейшее пространство имен .NET имеет имя
|
||
System. Системный модуль
|
||
объединяет многие подпрограммы модулей System,
|
||
Math и Utils языка
|
||
Delphi. Данная программа иллюстрирует пересечение имен во модуле
|
||
PABCSystem и пространстве имен
|
||
System.</li>
|
||
<li><b><a href="JavaScript:exam.TCard(229,0)">MainProgram.pas</a> и
|
||
<a href="JavaScript:exam.TCard(22901,0)">MyUnit.pas</a>.</b> Модуль может иметь упрощенный синтаксис (без
|
||
деления на раздел интерфейса и раздел реализации), что удобно для начального
|
||
обучения. В этом случае все описанные имена попадают в раздел интерфейса
|
||
модуля.</li>
|
||
<li><b><a href="JavaScript:exam.TCard(230,0)">SystemUnitTest.pas</a>.</b> Для использования пространств имен .NET
|
||
применяется тот же синтаксис, что и при подключении модулей:
|
||
пространства имен .NET указываются в списке uses.
|
||
Порядок поиска имен такой же, как и в Delphi -
|
||
справа налево в списке uses, модуль
|
||
PABCSystem просматривается последним.</li>
|
||
<li><b><a href="JavaScript:exam.TCard(231,0)">Main.pas</a> и
|
||
<a href="JavaScript:exam.TCard(23101,0)">MyDll.pas</a>.</b> В PascalABC.NET легко создать и использовать
|
||
dll. Библиотека dll по-существу представляет собой
|
||
модуль, где вместо ключевого слова unit
|
||
используется слово library. Для подключения
|
||
dll к другой программе используется директива
|
||
компилятора reference. </li>
|
||
<li><b><a href="JavaScript:exam.TCard(232,0)">CallCS.pas</a>.</b> PascalABC.NET -
|
||
полноценный .NET-язык, легко совмещаемый с другими
|
||
.NET-языками. В данном примере показывается, как в программе
|
||
на PascalABC.NET вызвать функцию из dll, созданной на
|
||
C#.</li>
|
||
<li><b><a href="JavaScript:exam.TCard(233,0)">CallNative.pas</a>.</b> PascalABC.NET позволяет легко вызывать функции
|
||
из обычных dll. </li>
|
||
</ol>
|
||
<p><b>Стандартные графические библиотеки</b></p>
|
||
<ol start=34>
|
||
<li><b><a href="JavaScript:exam.TCard(234,0)">GraphABCTest.pas</a>.</b> Графическая библиотека
|
||
GraphABC заточена под легкое обучение программированию графики. Она
|
||
скрывает большинство сложностей программирования графики: сама осуществляет
|
||
перерисовку графического окна в нужный момент и заботится о синхронизации
|
||
рисования в нескольких обработчиках. Кроме того, графические примитивы -
|
||
процедурные, а значит, не надо создавать многочисленные классы, как в
|
||
NET. И еще можно писать графические команды сразу
|
||
после begin основной программы, то есть использовать графику в
|
||
несобытийных приложениях.</li>
|
||
<li><b><a href="JavaScript:exam.TCard(235,0)">MouseEvents.pas</a>.</b> Для графических приложений можно
|
||
использовать простейшие события мыши и клавиатуры, реализованные как
|
||
глобальные процедурные переменные.</li>
|
||
<li><b><a href="JavaScript:exam.TCard(236,0)">ABC.pas</a>.</b> Библиотека векторных графических объектов ABCObjects используется нами
|
||
для раннего обучения школьников основам объектно-ориентированного
|
||
программирования. Однако, ее вполне можно использовать для написания
|
||
несложных графических обучающе-игровых приложений.</li>
|
||
</ol>
|
||
<p><b>Классы</b></p>
|
||
<ol start=37>
|
||
<li><b><a href="JavaScript:exam.TCard(237,0)">AllFromObject.pas</a>.</b> Все классы - наследники Object, все типы - классы.
|
||
У каждой переменной можно узнать тип, вызвав метод
|
||
GetType. Операция typeof для типа возвращает System.Type.</li>
|
||
<li><b><a href="JavaScript:exam.TCard(238,0)">WriteRecord.pas</a>.</b> Переопределив метод ToString в классе или
|
||
записи, мы получаем возможность выводить их значения в процедуре
|
||
writeln</li>
|
||
<li><b><a href="JavaScript:exam.TCard(239,0)">ClassConstructor.pas</a>.</b> Для статических методов и полей используется ключевое
|
||
слово class. Статические конструкторы используются для нетривиальной
|
||
инициализации статических полей.</li>
|
||
<li><b><a href="JavaScript:exam.TCard(240,0)">PersonInternal.pas</a>.</b> Новый синтаксис конструкторов использует ключевое слово
|
||
new и является предпочтительным. По этой
|
||
причине все конструкторы, определенные в старом стиле, должны иметь имя
|
||
Create. Описание методов может производиться непосредственно внутри классов и записей
|
||
(как в C++, C# и
|
||
Java)</li>
|
||
<li><b><a href="JavaScript:exam.TCard(241,0)">Records.pas</a>.</b> Методы и конструкторы в записях можно использовать так же, как и в
|
||
классах. От записей нельзя наследовать и записи нельзя наследовать.</li>
|
||
<li><b><a href="JavaScript:exam.TCard(242,0)">Boxing.pas</a>.</b> При присваивании размерного типа объекту типа Object происходит упаковка. Для
|
||
распаковки следует использовать явное приведение типа.</li>
|
||
<li><b><a href="JavaScript:exam.TCard(243,0)">GarbageCollection.pas</a>.</b> Деструкторы отсутствуют. Автоматическая сборка мусора
|
||
для возврата памяти, распределенной объектной переменной, требует, чтобы на
|
||
эту память никто более не ссылался, прямо или косвенно. Поэтому для
|
||
освобождения памяти обычно достаточно присвоить объектной переменной nil.
|
||
</li>
|
||
<li><b><a href="JavaScript:exam.TCard(244,0)">OperatorOverloading.pas</a>.</b> Как и в C++ и C#, в PascalABC.NET можно перегружать
|
||
знаки операций для записей и классов.</li>
|
||
<li><b><a href="JavaScript:exam.TCard(245,0)">Interf.pas</a>.</b> Интерфейсы
|
||
семантически совпадают с интерфейсами в C# и Java. Сложная
|
||
реализация интерфейсов Delphi на основе
|
||
COM отвергнута.</li>
|
||
<li><b><a href="JavaScript:exam.TCard(246,0)">Stack.pas</a>.</b> Обобщенные классы (generics)
|
||
позволяют создавать классы, параметризованные одним или несколькими типами.</li>
|
||
<li><b><a href="JavaScript:exam.TCard(247,0)">Where.pas</a>.</b> Можно задавать ограничения на типы параметров обобщенных классов.
|
||
Ограничения бывают трех сортов: наличие у типа-параметра конструктора по
|
||
умолчанию, наследование его от конкретного класса или реализация интерфейса.</li>
|
||
</ol>
|
||
<p><b>Стандартная </b><b>библиотека .NET</b></p>
|
||
<ol start=48>
|
||
<li><b><a href="JavaScript:exam.TCard(248,0)">DateTime.pas</a>.</b> Данный пример иллюстрирует применение класса DateTime из стандартной библиотеки
|
||
.NET.</li>
|
||
<li><b><a href="JavaScript:exam.TCard(249,0)">LinkedList.pas</a>.</b> Данный пример иллюстрирует использование контейнерных
|
||
классов из стандартной библиотеки .NET.</li>
|
||
<li><b><a href="JavaScript:exam.TCard(250,0)">WinFormWithButton.pas</a>.</b> Данный пример иллюстрирует создание оконного приложения.</li>
|
||
</ol>
|
||
</body>
|
||
|
||
</html> |