stringtranslate.com

Смарт Паскаль

Smart Pascal — это язык программирования Object Pascal , созданный на основе Delphi Web Script, адаптированный для Smart Mobile Studio, коммерческой разработки JavaScript , машинного кода .

Это язык RAD ( быстрой разработки приложений ). Имеет библиотеку классов и компонентов. Компилятор Smart Pascal — это компилятор типа «исходный код», генерирующий независимые от сервера приложения, совместимые с HTML5 . Скомпилированные Smart-приложения могут выполняться в любом современном браузере с поддержкой HTML5 . Скомпилированная программа затем обычно встраивается в элемент контейнера DIV или, альтернативно, занимает весь экран.

Библиотека времени выполнения была специально создана для повышения производительности и сокращения времени вывода на рынок разработки мобильных приложений. Smart Pascal радикально сокращает время разработки JavaScript с лингвистической точки зрения с помощью Object Pascal и настоящего объектно-ориентированного программирования, а также с точки зрения того, как спроектированы классы и система компонентов библиотеки времени выполнения. RTL взаимодействует с объектной моделью документа и средой JavaScript так же, как родной язык взаимодействует с операционной системой; абстрагирование общих знаменателей и автоматизация сложных задач.

Smart Pascal также популярен для программирования микроконтроллеров Espruino и клиент-серверных модулей nodeJS .

Фон

Smart Mobile Studio была разработана норвежцем Джоном Леннартом Осенденом и французом Эриком Гранжем. Технология опубликована компанией-разработчиком программного обеспечения Optimale Systemer. Язык использует популярный механизм сценариев с открытым исходным кодом под названием Delphi Web Script (DWScript) для проверки и анализа синтаксиса. 18 мая 2012 года Optimale Systemer сообщила, что приобрела права на собственный генератор кода, написанный Эриком Грейнджем, сопровождающим Delphi Web Script, у его компании Creative IT, Франция (см. статью: От OP4JS до Smart Mobile Studio).

До работы с Эриком Грейнджем Джон Леннарт Осенден опубликовал несколько предложений, в которых изложил свои мысли по поводу нового компилятора объектного Паскаля; компилятор, ориентированный на Javascript и браузер, а не на процессоры x86 или ARM. Он также представил видео, демонстрирующее ранний прототип компилятора (доступно на YouTube). Первоначально он был встречен резкой критикой со стороны сообщества Delphi и Free Pascal, но нашел поддержку у Эрика Грейнджа, который подтвердил и продемонстрировал, что JavaScript достиг совершеннолетия и теперь может использоваться для создания крупномасштабных серьезных бизнес-приложений. Джон Леннарт написал библиотеку времени выполнения Smart Pascal и интегрированную среду разработки , а Эрик Грейндж усовершенствовал генератор кода и усовершенствовал язык.

Опытный образец

Первый прототип (альфа-сборка) был выпущен 20 декабря 2011 года, и этот дуэт быстро начал привлекать других программистов, интересующихся новой платформой. Проект также получил полное двухстраничное освещение в журнале Blaise Pascal Magazine (выпуск 31), что помогло значительно продвинуть диалект. В результате библиотека времени выполнения и инструменты расширились и теперь включают поддержку передовых технологий, таких как Remobjects SDK и Embarcadero Datasnap, подаренных платформе разработчиком программного обеспечения Андре Мюше. Начиная с версии 2.0 Smart Pascal поддерживает nodeJS , Web Workers и платформу микроконтроллеров Espruino, любезно предоставленную немецким математиком и разработчиком Кристианом Бадде.

В то же время технический автор и архитектор программного обеспечения Примож Габриельчич (автор, среди прочего, книги «Параллельное программирование») решил написать книгу о Smart Pascal: умную книгу, которая для языков программирования часто рассматривается как знак одобрения.

Диалект, известный как Smart Pascal, вырос в результате взаимного сотрудничества между всеми этими людьми.

Смарт против Флэша

Smart Pascal IDE имеет некоторое сходство с Adobe Flash в том, что вы, по сути, создаете объектно-ориентированные , высокоскоростные, модульные приложения, предназначенные для работы в HTML-документе. Графические возможности библиотеки времени выполнения Smart более чем соответствуют задаче воспроизведения некоторых функций, которыми славится Adobe Flash, но Smart Pascal в конечном итоге представляет собой набор инструментов для создания мобильных приложений HTML5. Smart IDE очень мало обеспечивает визуальную автоматизацию. Smart Pascal просто не был предназначен для создания мультимедийных файлов и остается четкой платформой разработки HTML5 для программистов Object Pascal. Кривая обучения Smart Pascal значительно выше, чем Adobe ActionScript . Паскаль — это язык, в основном используемый инженерами.

Приложения Visual Smart Pascal основаны на формах. Отдельные окна могут быть заполнены элементами управления, и к ним можно подключить события кода, чтобы реагировать на действия пользователя. Smart Mobile Studio поставляется с визуальным дизайнером форм и редактором свойств, но этот дизайнер представляет собой просто вспомогательное средство для обычных пользовательских интерфейсов и не поддерживает визуальные эффекты.

На уровне архитектуры библиотека времени выполнения Smart Pascal имеет полную поддержку расширенных графических выражений, включая динамически создаваемые стили CSS3 , « анимацию », синхронизацию перерисовки дисплея, 2D- и 3D-спрайты на базе графического процессора и WebGL . Можно было бы сказать, что Smart Pascal — это «что-то вроде Flash», но на этом параллель заканчивается. Лингвистически и концептуально эти программные методологии совершенно разные. Они были созданы для разных целей, хотя могут достигать примерно одинаковых результатов. Smart Pascal имеет одно преимущество перед Flash: приложения HTML5 не имеют зависимостей. Программа Smart Pascal не зависит от плагинов, расширений браузера или сторонних библиотек. Но Flash в конечном итоге стал более совершенным, что отражает более чем десятилетие непрерывной эволюции и мультимедийного совершенства.

Доступ к базе данных

Библиотека времени выполнения Smart Pascal поддерживает все существующие ядра баз данных браузера. Доступ к ним осуществляется через классы, а не через компоненты, что противоречит традиционному подходу Object Pascal к данным. На момент написания статьи поддерживаются следующие движки:

Smart IDE также импортирует и обеспечивает доступ к Embarcadero DataSnap, платформе удаленного доступа к данным, популярной в Delphi и C++ builder . Использование этих библиотек импорта позволяет приложениям Smart Pascal читать, записывать и обновлять удаленные наборы данных. Сам Smart Pascal написан на Embarcadero Delphi .

Библиотека времени выполнения включает классы для RemObjects SDK , платформы удаленного вызова процедур по принципу Microsoft RPC . JSON RPC и WebSockets также являются частью библиотеки классов.

Лингвистические различия

Smart Pascal имеет несколько отличий, которые четко отделяют диалект от стандартного Object Pascal:

Выражения свойств

В Object Pascal свойство — это открытое значение, которое может быть связано либо с полем класса, либо с методом члена класса. Это традиционный способ раскрытия свойства значения, при котором потребитель свойства абстрагируется от логики чтения и записи. Потребитель не знает, связано ли свойство явно с полем или методом записи.

Smart Pascal полностью поддерживает старую парадигму, но вводит технику, называемую «выражения свойств». По сути, это позволяет вам программировать логику чтения и записи как часть объявлений свойств. Это совершенно неслыханно в традиционном Object Pascal, но распространено в других языках, таких как C# и Objective-C .

В классическом Object Pascal вы могли бы написать что-то вроде этого:

Тип TMyObject = Класс ( .. ) частный FSubObj : TNameData ; защищенная функция getFirstName : String ; процедура setFirstName ( значение : String ) ; опубликованное свойство FirstName : чтение строки getFirstName запись setFirstName ; конец ;                функция TMyObject . getFirstName : Строка ; начать результат := FSubObj . Имя ; конец ;  процедура TMyObject . setFirstName ( значение : String ) ; начать FSubObj . Имя := Значение ; конец ;  

Используя Smart Pascal с выражениями свойств, вы можете опустить заглушки getFirstName() и setFirstName() и реализовать логику как часть самого объявления свойства:

Свойство FirstName : чтение строки ( FSubObject.FirstName ) запись ( FSubObject.FirstName ) ;         

Выражения свойств особенно удобны для классов с дочерними объектами. Если класс предоставляет подобъекты (списки объектов), до появления дженериков вам приходилось писать много одного и того же кода снова и снова, заключая уже существующий код в объект списка, что для сложных иерархий классов снижает скорость выполнения из-за ненужного раздувания. . Ситуация изменилась к лучшему с появлением дженериков, но вам по-прежнему приходится изолировать логику чтения и записи в отдельных членах класса. В Smart Pascal это элегантно достигается с помощью массивов:

TMyClass = частный класс FList : массив TElement ;публичная собственность Items [ i : Integer ] : TElement read ( FList [ i ]) write ( FList [ i ]) ; по умолчанию ; Свойство Count : Целочисленное чтение ( FList.Length ) ;конец ;                          

Этот прием значительно упрощает преобразование чисел, которое в некоторых случаях можно выполнить прямо в объявлении:

TMyAngle = запись частного FAngle : Float ; общедоступное свойство Радианы : Float read FAngle write FAngle ; свойство Degrees : Float read ( RadToDeg ( FAngle )) write ( FAngle := DegToRad ( Value )) ; конец ;                        

Операции с массивами

Операции с массивами были добавлены в синтаксис Smart Pascal для лучшей адаптации к JavaScript. Поскольку в JavaScript нет концепции указателей или прямого доступа к памяти, все попытки работать со списками, связанными списками и т. д. традиционным способом приведут к значительному снижению скорости. Таким образом, там, где вы в Delphi или Free Pascal выделяете экземпляр TList или TObjectList, Smart Pascal обеспечивает лучшую производительность и идентичную функциональность, используя обычные массивы. Все массивы поддерживают полный набор операций, независимо от типа данных, для вставки, удаления, сортировки и других манипуляций с содержимым.

Где в ванильном Object Pascal вы могли бы написать:

Процедура TMyObject . AddItem ( aValue : Integer ) ; вар mLen : Целое число ; Начало mLen := длина ( FMyArray ) ; setLength ( FMyArray , mLen + 1 ) ; FMyArray [ mLen ] := Vaue ; конец ;       

Smart Pascal имеет эту функциональность «встроенной» для всех массивов, если типы данных совпадают. Когда вы объединяете это с выражениями свойств, результатом является мощный альтернативный способ достижения того же с меньшими ресурсами и большей скоростью, чем обобщенные методы или традиционный Object Pascal:

FMMyArray . добавить ( значение ) ;

На момент написания этой статьи над всеми типами массивов можно было выполнять следующие операции:

Методы Peek(), Pop(), Push() обычно используются с объектами стека FILO (первый вошел, последний вышел) и FIFO (первый вошел, первый вышел). Smart Pascal не нуждается в таких классах, как TObjectlist, TList, TStringlist и TStack (они предоставляются библиотекой времени выполнения для поддержки устаревших версий только с библиотекой визуальных компонентов Delphi).

Анонимные методы

Подобно выражениям свойств и операциям с массивами, анонимные методы были представлены в Smart Pascal как средство улучшения совместимости с JavaScript. И Delphi, и Free Pascal поддерживают анонимные методы, но Smart Pascal имеет одно преимущество перед этими собственными компиляторами. В родном Паскале (компиляторах, создающих исполняемый машинный код) есть процедуры классов и обычные процедуры. Единственная разница между этими двумя заключается в том, что если вы хотите сослаться на первый (метод класса), вы должны добавить к объявлению постфикс «of object». Этот способ ссылки на метод класса обычно используется для объявлений событий.

В обычном Object Pascal событие объявляется следующим образом:

Тип TMyEventType = процедура ( отправитель : TObject ; константное значение : целое число ) объекта ;      

Если вы опустите постфикс «объекта», ссылку можно будет использовать только для процедур и функций на уровне модуля. Компилятор не позволяет вам ссылаться на метод объекта без четкого определения «объекта».

В Smart Pascal такого различия нет. В диалекте Смарт нет слова «объекта»; анонимные методы могут применяться в более широком масштабе, чем в собственном Object Pascal, включая объектные события и обработчики обратных вызовов.

В Smart Pascal приведенный ниже пример абсолютно корректен и компилируется без проблем:

Конструктор TMyPanel . Создать ( AOwner : TW3Component ) ; Начать унаследованное создание ( AOwner ) ; FiPhoneHeader := TW3HeaderControl . Создать ( самостоятельный ) ; Заголовок FiPhone . Кнопка назад . onClick := Процедура ( отправитель : TObject ) Begin w3_callback ( procedure () Begin Showmessage ( «Вы нажали кнопку «Назад» 2 секунды назад» ) ; end , 2000 ) ; конец ; конец ;                 

Анонимные занятия

В традиционном Object Pascal все классы наследуются от корневого типа TObject. То же самое относится и к Delphi Web Script, из которого произошел Smart Pascal. Чтобы иметь возможность лучше импортировать классы, написанные на Javascript (что чрезвычайно важно для обеспечения полной поддержки DOM (объектной модели документа) и всего спектра модулей JavaScript), необходимо было изменить зависимость от TObject как корня всех типов классов.

Эрик Грейндж представил анонимные классы в Smart Pascal, начиная с версии 1.0, а это означало, что Smart Pascal теперь мог напрямую импортировать и использовать внешние классы. Это позволяет пользователю просто определить класс как внешний, и таким образом можно создавать и использовать классы, написанные на JavaScript, соответствующие интерфейсу, наряду с классами, написанными на Pascal. Это достигается за счет того, что объекты могут быть укоренены из ничего (т. е. без предопределенной логики и поведения конструктора).

 JCustomEventInit = внешний класс 'CustomEventInit' ( JEventInit ) подробно : конец варианта ;          JEventTarget = класс внешней процедуры 'EventTarget' addEventListener ( aType : String ; обратный вызов : JEventListener ; захват : Boolean = false ) ; процедура RemoveEventListener ( aType : String ; обратный вызов : JEventListener ; захват : Boolean = false ) ; функция диспетчеризацииEvent ( событие : JEvent ) : Boolean ; конец ;                                   

Анонимные классы также можно использовать как облегченные объекты (без ключевого слова external), более похожие на записи (пользовательские типы данных на других языках), поскольку они не включают управление жизненным циклом, предоставляемое TObject.

Частичные занятия

Частичные классы пока еще являются функцией, которая не вошла в стандарт Object Pascal. По сути, это означает, что полное объявление и реализация класса или типа записи могут быть распределены по нескольким исходным файлам. Вы также можете предварительно скомпилировать одну часть, оставив другую часть открытой для реализации другими. Так обстоит дело, например, с Mono C# под iOS, где ожидается, что предварительно скомпилированный контроллер приложения будет завершен пользователем платформы.

Частичные классы — очень полезная функция при осторожном развертывании. Это особенно удобно для больших иерархий классов, ориентированных на разные модели. В зависимости от модели, установленной программистом, реализация определенных функций различается в зависимости от включенных исходных файлов.

Smart Pascal поддерживает два формата объявления частичных классов. Синтаксис RemObjects Oxygene Pascal, а также более интуитивный вариант «type mytype = частичного класса (тип-предок)». Частичные классы используются во всей библиотеке времени выполнения Smart Pascal:

 TW3CustomControl = частичный класс ( TW3MovableControl ) частный FAngle : Float ; FScrollInfo : TW3ScrollInfo ; FClassNames : TW3CSSClassStyleNames ; ФФонт : TW3ControlFont ; ... ...              

Лямбды

Lambdas — чрезвычайно удобная функция, которая, как частичные и анонимные классы, еще не является частью классического объектного паскаля. Синтаксис Smart Pascal поддерживает несколько типов лямбда-выражений, что очень удобно при написании асинхронного кода.

Например, следующее замыкание:

вар повторитель := TW3EventRepeater . Создать ( функция ( Отправитель : TObject ) : логическое начало Результат : = MyFunction ; конец , 5000 ) ;             

можно записать с помощью лямбды:

вар повторитель := TW3EventRepeater . Создать ( лямбда => MyFunction , 5000 ) ;      

Лямбда-выражения (т.е. замыкания «процедурного» типа) могут быть записаны следующим образом:

 но ОК . OnClick := лямбда -приложение . HideModal ( мрОК ) ; конец ;    

Переменные класса

Переменные класса по сути означают, что вы можете определить переменную (или несколько переменных) в классе, которую можно изменить независимо от конструкции экземпляра. Это удобный метод установки условий перед созданием объекта из прототипа класса.

 TMyClass = Класс ( TObject ) Public var driverMode : Integer ; Конец ;       ТМойКласс . DriverMode := 1200 ;

Поддержка ограниченных наборов

В языке Паскаль множество — это совокупность элементов одного типа. Синтаксис Smart Pascal в настоящее время поддерживает только наборы перечислений с оператором «in» и методами «include(aSet, aValue)» или «exclude(aSet, aValue)».

тип TMySet = набор ( msFirst , msSecond , msThird ) ;     вар MySet : TMySet ; начать // заполнить набор двумя состояниями MySet := [ msFirst , msThird ] ; если msFirst в MySet, то writeln ( 'First' ) ; исключить ( MySet , msFirst ) ; если msFirst в MySet, то writeln ( 'Never Shown' ) ; конец ;                   

Отсутствие дженериков

Smart Pascal не поддерживает дженерики . Исходный синтаксис Delphi Web Script, созданный Smart Pascal, был совместим с Delphi 7. Хотя кодовая база и язык DWScript значительно изменились за последние шесть лет, дженерики представляют собой монументальное изменение, которое может потребовать полного переписывания всего синтаксического анализатора и Технология AST («абстрактное символическое дерево» в компиляторной науке).

Отсутствие дженериков компенсируется двумя особенностями языка:

Ограниченный RTTI

Информация о типах времени выполнения частично поддерживается DWScript, включая возможность перечисления свойств и членов классов. RTTI реализуется компилятором Smart Pascal JavaScript, если в параметрах компилятора проекта определено «Выдавать информацию RTTI». В настоящее время частью этой информации являются только опубликованные свойства.

После активации следующий класс:

тип TBase = опубликованный класс Поле : Integer = 1 ; конец ;          

выдаст следующий объект JavaScript RTTI:

var $RTTI = [ { T : { ID : TBase }, A : { ClassType : RTTIPropertyAttribute , N : «Поле» , T : { ID : Number }, C : 3 , G : function ( s ) { return s . Поле }, S : функция ( s , v ) { s . Поле = v } } } ];                              

Затем вы можете получить доступ к этой информации из кода, как описано в этой статье.

Консенсус

Smart Pascal часто рассматривается как мощная странность [1] в мире объектного Паскаля. Несмотря на то, что язык поддерживает почти все функции синтаксиса, определенные Embarcadero Delphi , он часто ломает или расширяет синтаксис, чтобы представить радикальные, но эффективные решения, которые делают его более полезным для асинхронного программирования. По существу, он продвигает концепции, заимствованные как из JavaScript , так и из Objective-C , смешанные с элементами из C++ , C# и Smalltalk . Результатом является гибкая и динамичная версия Object Pascal, которая значительно упрощает разработку HTML5 JavaScript без использования сервера.

Каким бы мощным ни был диалект, многие традиционные программисты Object Pascal считают Smart гибридным языком, при этом общее возражение состоит в том, что Smart продвигает функции, несколько чуждые устоявшимся принципам Object Pascal. Умные сторонники утверждают, что этот новый диалект необходим для современной разработки программного обеспечения и что это именно то, что нужно Object Pascal для развития и адаптации, указывая на обобщения как на недавнее изменение парадигмы. Таким образом, сторонники утверждают, что новый язык не представляет угрозы давно сложившемуся синтаксису, но обогащает его проверенными методами более современных языков.

Рекомендации

  1. ^ «Смарт Паскаль». smartpascal.github.io . Проверено 17 февраля 2023 г.

Источники

Внешние ссылки