Счастливая история о новом Delphi

Михаил Перов


Наверное, многие уже определили свое отношение к платформе .NET. Кто-то давно и успешно ее использует, а кто-то до сих пор пишет под Win32 и переходить планирует только на Win64. Поэтому вдвойне интереснее узнать о появлении на рынке средств разработки ПО нового качественного продукта фирмы Embarcadero, способного внести сумятицу в умы кодировщиков.

Delphi Prism -- воплощенная в нормальной среде романтическая идея разработчиков из Borland. Примечательно, что подобного хода конем скорее всего никто от владельцев Delphi уже не ожидал.

[img0001.bmp Начало установки]

Тем более приятно узнать, что новый инструмент умеет практически то же самое, что и MS Visual Studio 2008, и вдобавок обладает доведенным до ума продвинутым синтаксисом языка из ветви Object Pascal, включающим в себя классический язык Delphi. А самое главное, этот инструмент актуален!

[img0002.bmp Окно приветствия в программе MS Visual Studio 2008]


С 27 октября 2008 г., когда компания Embarcadero Technologies анонсировала новый продукт Delphi Prism (http://www.codegear.com/products/delphi/prism), прошло уже некоторое время, и теперь можно скачивать пробные версии этой среды разработки.

Новорожденный Delphi Prism -- это прежде всего хорошо проверенный и отточенный MS Visual Studio и лишь потом Delphi. Логика истории Delphi.NET всегда подсказывала именно такую абсолютную интеграцию языка Delphi c идеальной средой разработки для Windows. Специалисты из RemObjects Software (http://www.remobjects.com/) вовремя поняли проблемы Delphi VCL.NET и Delphi for WinForms, что позволило создать Oxygene/Chrome -- интегрируемый с MS Visual Studio компилятор языка, очень похожего на Delphi, но имеющего важное отличие: его релизы успевали поддерживать современную версию платформы .NET. А потому эту новую технологию вполне можно было считать современным промышленным стандартом языка Object Pascal для платформы .NET и MONO.

Если со средой (т.е. с внешними атрибутами производственного процесса написания кода) все понятно, то с самим языком надо будет еще разбираться и, видимо, долго привыкать к нему. Delphi Prism скорее напоминает Delphi for WinForms, чем Delphi VCL,, ведь концепция полной интеграции с технологиями Microsoft предполагала расставание с такой родной и ясной иерархией VCL. Но это не значит, что для VCL настал конец. В пакете Delphi остались все обычные средства для сборки платформенных программ. Просто сейчас разработчик, использующий синтаксис Delphi, может иметь реальный выбор средств с учетом нескольких -- перспектив: программы, среды разработки, платформы разработки и разработчика.

Конечно, подавляющая часть изменений в языковой конструкции связана с платформой .NET (http://prismwiki.codegear.com/en/Language).

Если сравнить языковые конструкции уже знакомых Delphi.NET и Delphi Prism, то главным различием будет использование строго-объектного подхода. На сайте http://prismwiki.codegear.com показаны различия обычного Delphi дляWin32 и Delphi Prism. Но правильнее было бы сравнивать новую среду с Delphi for .NET. Так, в Prism нельзя описывать члены программы вне пространств имен, и при попытке описать после implementation функцию, не являющуюся членом класса ConsoleApp, можно получить сообщение об ошибке:


Error     1     (PE46) Global members not allowed

Данный факт полезно взять на заметку тем, кто будет адаптировать для Prism проекты, написанные на Delphi. С точки зрения идеологии .NET такая особенность языка -- норма, но для классического Object Pascal она является нововведением.

Сравнение простейших консольных программ для трех языков.

Delphi for .NET (Delphi 2006)

Microsoft Visual C# 2008

Embarcadero Delphi Prism 3.0

Консольная программа


program Project1;

{$APPTYPE CONSOLE}

begin

 

Console.WriteLine('Hello World.');

Console.ReadLine;

 

end.

using System;

namespace ConsoleApplication1

{

    class Program

    {

        static void Main(string[] args)

        {

       

Console.WriteLine("Hello World.");

Console.ReadLine();

       

        }

    }

}

namespace ConsoleApplication1;

interface

type

  ConsoleApp = class

  public

    class method Main;

  end;

implementation

 

class method ConsoleApp.Main;

begin

 

  Console.WriteLine('Hello World.');

  Console.ReadLine;

end;

end.

 

Оконное приложение (описания класса окна)

unit Unit1;

 

interface

 

uses

  Windows, Messages, SysUtils, Variants, Classes,

  Graphics, Controls, Forms,

  Dialogs;

 

type

  TForm1 = class(TForm)

  private

    { Private declarations }

  public

    { Public declarations }

  end;

 

var

  Form1: TForm1;

 

implementation

 

{$R *.nfm}

 

end.

namespace WindowsFormsApplication1

{

    partial class Form1

    {

        private System.ComponentModel.IContainer components = null;

 

        protected override void Dispose(bool disposing)

        {

            if (disposing && (components != null))

            {

                components.Dispose();

            }

            base.Dispose(disposing);

        }

        //Не показан метод InitializeComponent()

    }

}

namespace WindowsApplication1;

 

interface

 

uses

  System.Drawing,

  System.Collections,

  System.Collections.Generic,

  System.Linq,

  System.Windows.Forms,

  System.ComponentModel;

 

type

  MainForm = partial class(System.Windows.Forms.Form)

  private

      method MainForm_Load(sender: System.Object; e: System.EventArgs);

  protected

    method Dispose(disposing: Boolean); override;

  public

    constructor;

  end;

 

implementation

 

//Не показаны реализации конструктора и деструктора

 

end.


После сравнения текстов программ на ум приходит следующая мысль: уровень языковой абстракции, принятый в Delphi Prism, заметно ниже, чем в обычном Delphi.VCL.NET. Это не совсем привычно, однако что-то подсказывает, что только такой подход может позволить всегда держать инструментарий на гребне новых идей, предлагаемых Microsoft. Похожая реализация уже имела место в Delphi.NET for WinForms (Borland Delphi 2006), но описание причин, по которым данная ветвь была зарублена, остается за рамками данной статьи. Достаточно вспомнить, что выходы версий этого продукта катастрофически отставали от актуальной версии .NET.

Писать вместо слов procedure и function слово method совсем не обязательно. Очевидно, что первоначально такое несоответствие было введено создателями Oxygene, чтобы добавить явное отличие от Delphi. Это теперь, конечно, неважно, ведь моду на правила будут задавать новые пользователи программы Delphi Prism.

Стоит отдать должное разработчикам технологии Oxygene, положенной в основу Delphi Prism, -- для соответствующей новой версии компилятора Oxygene 3.0 были сделаны значительные доработки. Это хорошо видно при сравнении его функций с возможностями Oxygene 2.0. Продукт получился действительно новый и современный со всех точек зрения, что давно стало редкостью для решений под маркой Delphi.


namespace WindowsApplication1;

interface

uses

  System.Drawing,

  System.Windows.Forms,

  System.ComponentModel;

type

  MainForm = partial class(System.Windows.Forms.Form)

  private

      procedure MainForm_Load(sender: System.Object; e: System.EventArgs);

      procedure button1_Click(sender: System.Object; e: System.EventArgs);

  protected

    method Dispose(disposing: Boolean); override;

  public

    constructor;

  end;

 

implementation

 

{$REGION Construction and Disposition}

{$ENDREGION}

 

procedure MainForm.button1_Click(sender: System.Object; e: System.EventArgs);

begin

   MessageBox.Show('Привет');

end;

end.

 

С точки зрения промышленного использования среда идеально подходит для профессионалов, которые будут писать код для .NET. А с точки зрения академического языка Pascal времен Николаса Вирта или даже языка Object Pascal времен Delphi 2, сейчас мы имеем новое мощное средство программирования, вполне сопоставимое по функциональности с C#,Java или PHP.

Delphi Prism вдобавок к поддержке .NET 3.5 получил все современные ее возможности: коллекции, анонимные методы и делегаты, Windows Presentation Foundation (WPF), Windows Communication Foundation (WCF), LINQ, а также многое из того, что не было в свое время «поднято» из платформы .NET в Borland Delphi for WinForms.


namespace ConsoleApplication1;

//Выводим список поддиректорий для временной директории

interface

uses

  System.Linq,

  System.IO;

type

  ConsoleApp = class public class method Main; end;

implementation

class method ConsoleApp.Main;

 begin

  for each thedir in

  Directory.GetDirectories(Path.GetTempPath)

         do begin

 

           Console.WriteLine(thedir);

 

          end;

         Console.ReadLine;

 end;

end.

 

Если для пользователей Oxygene 2.0 почти ничего не меняется, то для «дельфистов» открывается новый мир со своими правилами. Уже сейчас ясно, что проекты, написанные под VCL, не получится перевести на Prism. Значит, больше шансов или у новых проектов, или у проектов, для которых визуальная (клиентская) составляющая занимает незначительную долю и в которых не было задействовано специфических для Delphi технологий.

[img0003.bmp Выбор провайдеров данных в Delphi Prism в режиме дизайна]

Вместе с .NET 3.5 и Visual Studio 2008 пользователи Delphi.NET получают все программные интерфейсы и утилиты, имеющиеся , например, в распоряжении приверженцев языка C#.

Кроме того, сделаны специальные добавления, призванные подчеркнуть преемственность сред программирования: реализована поддержка технологии DataSnap, присутствуют элементы неоднозначного в отношении стабильности интерфейса для базы данных dbExpress. Также есть поддержка обеих встроенных СУБД (Blackfish SQL и InterBase); разработчики из года в год тащат их за собой в светлое будущее без особых изменений.

 

[img0004.bmp Настройка соединения с базой в Delphi Prism в режиме дизайна]


Страшно подумать, что только могут сказать преподаватели информатики вот о таком синтаксисе языка…

//В Delphi Prism пишу что хочу!


type MyObject=class

   protected

    fMyProperty:String;

   public

      property MyProperty: String read '.NET35'

          protected write fMyProperty;

   end;

 

function MainForm.Test1: String;

begin

    var MyArray: Array of String;

  using f := new Form do begin

      

     f.ShowDialog;

 

     case f type of

      

       Form:  Exit 'Form';

       int32: Exit 'int';

 

     end;

  end;

 

  var k:=10;

 

   loop begin inc(k); if k>100 then breakend;

 

  Exit 'ok';

 

end;

 

В угоду экстремальному программированию были брошены в топку истории многие ограничения, касающиеся в первую очередь явного определения типов данных и общей структуры исходного текста. Но теперь уже никто точно не скажет, что Delphi ориентирован исключительно на студентов.

//Читаем одну из страниц сайта www.ops.ru (полный текст программы)

namespace ConsoleApplication1;

interface

uses

System.Net,System.IO,System.Text;

type

  ConsoleApp = class  public class method Main; end;

 

Implementation

 

class method ConsoleApp.Main;

begin

  var reader:StreamReader:=new StreamReader(((

          WebRequest.Create('http://www.osp.ru/pcworld/')

                                               ).GetResponse()

                                             ).GetResponseStream);

  

   Console.WriteLine(reader.ReadToEnd);

   Console.ReadLine;

end;

end.

Именно в Delphi Prism будет хорошо виден стиль программиста, которому дана уже немалая свобода. В то же время появление нового средства разработки для большинства «дельфистов» осложнено естественным отсутствием учебной и справочной литературы в том объеме, при каком можно было бы начинать серьезные разработки. Например, автору не удалось найти в директории демонстрационных проектов ни одного, содержащего элементы параллельных вычислений.

 

Очень интересный вопрос: кому все это надо? И действительно, можно ли сейчас представить, как аналитик приходит к начальнику и сообщает, что для нового проекта всем разработчикам нужен именно Delphi Prism? Сложно дать ответ. Наверное, все зависит от конкретной ситуации. Но совершенно определенно можно сказать, что Delphi Prism -- это как раз то, чего не хватает опытному «дельфисту», который желает писать коммерческие решения под .NET, используя структуру BeginEnd, а не изредка вспоминать, что он когда-то хотел начинать учить C#... В конце концов очень часто безразлично, на каком языке пишется программа, а важно то, кто именно ее пишет. И Delphi Prism -- несомненно, тот случай, когда в одном месте в одно и то же время могут сойтись современная мощная среда программирования и серьезный программист.


О ценах

Среда Delphi Prism -- часть CodeGear RAD Studio. На одном из сайтов указана цена всего продукта CodeGear RAD Studio 2009 Professional (электронная версия) -- 45 534 руб. По имеющейся информации, обновление до Delphi 2009 (Delphi 2009 for Win32 Professional Upgrade ESD) будет стоить 12 100 руб. Недешево, но надежды на то, что вскоре появится отдельная версия, например Turbo Delphi Prism, пока нет.


Вместо заключения


[img0005.bmp Диалог перевода проекта из Oxygene 2.0 (Chrome) в Delphi Prism]

Delphi Prism открывает наконец полноценное направление в программировании для «паскальщиков», делая компилятор Oxygene единственным современным средством создания приложения для .NET на языке семейства Object Pascal.

Новому средству разработки повезло во всех отношениях: стабильная мощнейшая среда программирования MS Visual Studio и давно существующие любители языка Delphi. Оба эти фактора могут положительно сказаться на судьбе продукта.