TScript
Разработчик(и) | Экки Программное обеспечение |
---|---|
Стабильная версия | 1,4
/ 1 июля 2012 г. [1] |
Написано в | С++ |
Операционная система | Винда и Линукс |
Тип | Язык сценариев |
Лицензия | Бесплатный (собственный) |
Веб-сайт | www |
TScript — это объектно-ориентированный встраиваемый язык сценариев для C++ , который поддерживает иерархические временные типизированные переменные (TVariable). Его основным критерием разработки является создание языка сценариев, который может взаимодействовать с C++, преобразовывая данные и возвращая результат. Это позволяет приложениям C++ изменять свою функциональность после установки.
Привет, мир, пример
[ редактировать ]Базовый «Привет, мир!» Пример TScript.
CTScript ts;
ts.SetParameter(CTScript::SOURCE_STRING,0,TEXT("main(){")
TEXT(" System::MessageBox(L\"Hello World!\");")
TEXT("}"));
ts.ExecuteStaticMethod();
ТВ-переменные
[ редактировать ]Стандартная переменная [2] могут быть сформированы как фиксированные данные, такие как логические, целые или десятичные числа, и переменная переменной длины, такая как строка ASCII, строка широких символов или двоичная строка. Тип данных может использоваться для определения переменной или тип может быть явно объявлен, например, код - variable myInteger = 0;
создаст переменную с именем myInteger и присвоит ей нулевое значение. Целочисленный тип также может быть объявлен как - Integer myInteger;
и его значение по умолчанию будет установлено на ноль.
TVariable имеют иерархическую природу и очень похожи на переменные XML , JavaScript и PHP .
Тип TVariable также является временным, поскольку Integer можно преобразовать в AString, присвоив ему строковое значение или приведя переменную к AString. Например, после создания и использования целочисленной переменной ее можно переназначить, приравняв ее к AString.
TVariables также можно использовать для хранения массива TVariables. После создания допустимой переменной можно использовать нотацию индекса индекса массива для преобразования ее в массив, например, код - variable list = {0,2,4,6};
создаст массив из четырех элементов. Тип TVariable для list.type будет типом структуры и каждого элемента list[0].type
будет целое число.
Классы в TScript похожи на массивы в том, как их обрабатывает TVariable, но в качестве сценариев массива используются строки. Например, код - variable list = {"Monday" => true, "Tuesday" => false};
создаст структурированную переменную, где list. Понедельник — правда, а список. Вторник — ложь. В собственном коде C++ структурированные элементы TVariable доступны в C++ с помощью: list["Monday"];
или любым другим способом list.Monday
или list["Monday"]
в собственном коде.
Определенные переменные (классы)
[ редактировать ]Поддерживая иерархические переменные, TScript может хранить как примитивные, так и комплексные переменные в одной и той же структуре переменных. [3] Это устраняет любые требования к каким-либо уникальным различиям между примитивами и структурированными данными, что делает структуру класса логической группировкой функций, а не типом хранения данных.
TScript реализует концепции наследования и инкапсуляции кода через определенные переменные. Например, в следующем фрагменте кода показаны определенные переменные. Фу и Панель , поддерживающая конструктор.
variable Bar{
Integer minimum, maximum;
Bar(){
this.minimum = 1;
}
}
variable Foo extends Bar{
WString name;
Foo(WString name){
this.name = name;
this.Bar();
}
}
public main(){
Foo foo(L"Goo");
System::MessageBox(foo.ToString());
}
Объявления функций
[ редактировать ]Еще одна поразительная особенность TScript — объявления функций. [4] которые используют выходные параметры , а не возвращаемые значения , и обеспечивают для них синтаксическую поддержку. Стандартная функция во многих процедурных языках, вслед за Алголом, имеет вид:
- [ тип возвращаемого значения ] < имя функции >([ входная переменная ], ...) .
В TScript этот шаблон был изменен на следующий вид:
- < имя функции >([ входная переменная ],... :[ выходная переменная ],...) .
Это изменение привело к двум вещам: во-первых, оно позволяет использовать несколько выходных переменных, а во-вторых, оно изменило оператор return на функцию обработки ошибок.
Разрешение функциям иметь список входных и выходных переменных, разделенных полустолбцом «:», изменило обычный порядок вызова и использования функций. Это устраняет часть необходимости использования указателей на ссылки для возврата нескольких переменных, что часто встречается в C/C++, а использование ссылок в большинстве других языков сценариев фактически предотвращается, что вынуждает использовать структуру или массив для возврата нескольких значений.
Вторая примечательная особенность соглашений о вызовах заключается в том, что теперь все функции имеют встроенную функцию обработки ошибок, аналогичную try{…}catch(…){…}
и throw new Exception()
C++ и Java. В TScript, поскольку все функции возвращают ошибку, оператор return работает аналогично оператору throw. Например, оператор:- return error = «Есть сообщение об ошибке»; завершит функцию и вернет сообщение об ошибке. В качестве альтернативы пустой оператор;- return; завершит функцию, но не вернет никаких ошибок.
Пример нескольких возвращаемых значений
[ редактировать ]public TextExtent(WString text : Integer width, Integer height){
text = text.Fragment(L"\n");
for(height = width = 0; height < text.length; height++){
if(width < text[height].length) width = text[height].length;
}
}
Сокращенное обозначение
[ редактировать ]Для удобства TScript предлагает сокращенный вызов функции в ситуации, когда возвращается только одна переменная. Это обозначение заменит случай function(: variable); for variable = function();
. Эта короткая запись предотвращает обнаружение каких-либо ошибок вызывающим кодом, и они автоматически возвращаются в родительский вызывающий код.
Обработка ошибок
[ редактировать ]Обработка ошибок во многих других языках осуществляется с помощью исключений . TScript использует аналогичный процесс обработки ошибок. [5] хотя немного другое. TScript имеет глобальную переменную ошибки, похожую на традиционную errno в C, хотя переменная ошибки в TScript может содержать как код ошибки, так и подробное сообщение об ошибке.
Во многих языках, в которых используется try{...}catch(...){...}
синтаксиса ошибка возвращается через оператор catch, и это может затруднить выполнение кода в ситуациях, когда некоторые ошибки можно исправить. TScript использует if(...){...} else{...}
нотация, которая позволяет вызывающему коду фильтровать ошибку, потенциально восстанавливаться после ошибки и возвращаться к нормальной работе или возвращать ошибку в собственную вызывающую функцию.
Пример ошибок возврата и обработки
[ редактировать ]function(){return error = -1;}
public main(){
if(!function()){
if(error != -1) return error;
}
System::MessageBox(L"function executed correctly");
}
Связывание во время выполнения
[ редактировать ]C++ поддерживает перегрузку функций , что позволяет функциям иметь одно и то же имя, но различаться по входным параметрам. Это вызывает проблемы TScript при поддержке переменных произвольного типа , поскольку невозможно определить тип переменной до тех пор, пока программное обеспечение не будет запущено.
Чтобы решить эту проблему, TScript был написан с возможностью связывания во время выполнения. Это когда конкретная вызываемая функция зависит от типа переменных, когда функция вызывается.
Это необычная тактика, имеющая некоторые дополнительные преимущества. Во-первых, это означает, что нет необходимости объявлять функции перед их использованием, например, в C++ две функции могут вызывать друг друга, например void Foo(){ Bar();}
и void Bar(){Bar();}
. В этой ситуации Bar()
необходимо создать прототип, чтобы Foo()
чтобы позвонить ему. Связывание TScript во время выполнения означает, что функции могут быть объявлены в любом порядке без необходимости создания прототипа. Это может значительно облегчить написание кода менее опытным программистам, позволяя им сосредоточиться на логике программного обеспечения, а не на требованиях языка.
Связывание во время выполнения также позволяет языку поддерживать кодирование во время выполнения с помощью таких методов, как ДобавитьМетод и ДобавитьОпределеннуюПеременную . Это позволяет программам TScript писать самим. Например, при использовании интерфейса SOAP удаленный WSDL будет закодирован в библиотеку сценариев, что позволит вызывать функции внутри так, как если бы они были закодированы во время разработки. Кроме того, также можно писать код, который может обучаться сам, создавая новые функции, когда это необходимо.
Динамическое связывание библиотек
[ редактировать ]TScript входит в небольшую группу языков сценариев, которые обеспечивают функциональность динамической загрузки и связывания с существующими общими библиотеками. Java через JNI и VB6 — это два других языка сценариев, которые позволяют писать код, который будет загружать стороннюю библиотеку и выполняться через ее собственный интерфейс. Это дает TScript возможность использовать множество уже существующих функций и кода, написанного на разных языках, и это можно сделать без необходимости изменять интерфейс общей библиотеки или компилировать ее с исходным кодом.
Управление памятью
[ редактировать ]TScript использует стандартную инкапсуляцию классов C++ для выделения и отмены выделения ресурсов памяти. Это означает, что вся выделенная память освобождается, когда содержащая ее переменная уничтожается и работает иначе, чем модель сборки мусора в Java или модель подсчета ссылок в языках .NET .
Ресурсы операционной системы, такие как файлы, сокеты и ключи шифрования, управляются с помощью механизма подсчета ссылок, аналогичного .NET, поэтому они будут освобождены, как только не останется переменных, содержащих их значения.
Проактивная безопасность
[ редактировать ]Благодаря возможности загружать существующие общие библиотеки скрипт может получить доступ ко всем привилегиям, предоставленным пользователю, который его выполняет. Для защиты от вредоносного кода каждому сценарию необходимо предоставить все ресурсы, выходящие за рамки базового выделения памяти. Это также включает в себя возможность использовать окна сообщений для приглашения пользователя, доступа для чтения и/или записи к любому файлу или каталогу или использования подключения к Интернету.
Эта архитектура безопасности предназначена для запуска сценариев аналогично JavaScript , одновременно обеспечивая возможность использования более мощных языков сценариев, таких как Perl .