TScript - TScript
Разработчики) | Ekky Software |
---|---|
Стабильный выпуск | 1.4 / 1 июля 2012 г.[1] |
Написано в | C ++ |
Операционная система | Windows и Linux |
Тип | Язык сценариев |
Лицензия | Бесплатно (проприетарный) |
Интернет сайт | www |
TScript является объектно-ориентированный встраиваемый язык сценариев за C ++ который поддерживает иерархические переменные переходного типа (TVariable). Его основным критерием проектирования является создание языка сценариев, который может взаимодействовать с C ++, преобразовывать данные и возвращать результат. Это позволяет приложениям C ++ изменять свою функциональность после установки. TScript - это также язык программирования, изобретенный Тобиасом Гласмахерс для учебных целей.[2]
Привет, мир, пример
Базовое "Hello World!" Пример TScript.
CTScript ts;ts.SetParameter(CTScript::SOURCE_STRING,0,ТЕКСТ("главный(){")ТЕКСТ("System :: MessageBox (L\"Привет, мир!\");")ТЕКСТ("}"));ts.ExecuteStaticMethod();
TVariables
Стандартная переменная[3] могут быть сформированы как фиксированные данные, такие как логическое, целое или десятичное, и переменная переменной длины, например строка ASCII, строка широких символов или двоичная строка. Тип данных может использоваться для определения переменной или тип может быть явно объявлен, например, код - переменная myInteger = 0;
создаст переменную с именем myInteger и присвоит ей нулевое значение. Целочисленный тип также может быть объявлен как - Integer myInteger;
и его значение по умолчанию будет установлено на ноль.
TVariable имеют иерархический характер и очень похожи на XML, JavaScript и PHP переменные.
Тип TVariable также является временным, поскольку Integer можно преобразовать в AString, присвоив ему строковое значение или преобразовав переменную в AString. Например, после того, как целочисленная переменная была создана и использована, ее можно переназначить, приравняв ее к AString.
TVariables также можно использовать для хранения массива TVariables. После создания действительной переменной можно использовать нотацию индексации индекса массива для преобразования ее в массив, например, код - список переменных = {0,2,4,6};
создаст массив из четырех элементов. Тип TVariable для list.type будет типом структуры и каждого элемента список [0] .type
будет целым числом.
Класс в TScript похож на массив в том, как TVariable обрабатывает их, но в качестве скриптов массива используют строки. Например, код - Переменная список = {"Понедельник" => истинный, "Вторник" => ложный};
создаст структурированную переменную, где list. Понедельник - истина, а список - ложь. В собственном коде C ++ структурированные элементы TVariable доступны в C ++ с помощью - список ["понедельник"];
или либо list.Monday
или же list ["Понедельник"]
в собственном коде.
Определенные переменные (классы)
Поддерживая иерархические переменные, TScript может хранить как примитивные, так и сложные переменные в одной и той же структуре переменных.[4] Это устраняет любые требования к любому уникальному различию между примитивами и структурированными данными, тем самым делая структуру классов логической группировкой функций, а не типом хранения данных.
TScript реализует концепции наследования и инкапсуляции кода через определенные переменные. Например, следующий фрагмент кода показывает определенные переменные Фу и Бар который поддерживает конструктор.
Переменная Бар{ Целое число минимум, максимум; Бар(){ это.минимум = 1; }}Переменная Фу расширяет Бар{ WString имя; Фу(WString имя){ это.имя = имя; это.Бар(); }}общественный главный(){ Фу фу(L"Идти"); Система::Окно сообщения(фу.Нанизывать());}
Объявления функций
Еще одна поразительная особенность TScript - объявления функций,[5] которые используют выходные параметры скорее, чем возвращаемые значения, и предоставить им синтаксическую поддержку. Стандартная функция во многих процедурных языках после Algol имеет следующий вид:
- [тип возврата] <имя функции>([входная переменная], ...).
В TScript этот шаблон был изменен на форму:
- <имя функции>([входная переменная],... :[выходная переменная],...).
Это изменение сделало две вещи: во-первых, оно разрешило несколько выходных переменных, а во-вторых, оно изменило оператор возврата на функцию обработки ошибок.
Разрешение функциям иметь список входных и выходных переменных, разделенных полуколонкой «:», изменило обычный порядок вызова и использования функции. Это устраняет часть необходимости в использовании ссылочных указателей для возврата нескольких переменных, что является обычным для C / C ++, а использование ссылок в большинстве других языков сценариев фактически предотвращается, что вынуждает использование структуры или массива для возврата нескольких значений.
Вторая примечательная особенность соглашений о вызовах заключается в том, что теперь все функции имеют встроенную цель обработки ошибок, аналогичную пытаться{…}ловить(…){…}
и бросать новый Исключение()
C ++ и Java. В TScript, поскольку все функции возвращают ошибку, оператор return работает аналогично оператору throw. Например, инструкция: - return error = «Есть сообщение об ошибке»; завершит функцию и вернет сообщение об ошибке. В качестве альтернативы пустой оператор; - return; завершит функцию, но не вернет никаких ошибок.
Пример нескольких возвращаемых значений
общественный TextExtent(WString текст : Целое число ширина, Целое число высота){ текст = текст.Фрагмент(L" п"); за(высота = ширина = 0; высота < текст.длина; высота++){ если(ширина < текст[высота].длина) ширина = текст[высота].длина; }}
Сокращенное обозначение
Для удобства TScript предлагает сокращенный вызов функции в ситуации, когда возвращается только одна переменная. Это обозначение заменит случай функция(: Переменная); за Переменная = функция();
. Эта короткая запись не позволяет вызывающему коду перехватывать любые ошибки, и они автоматически возвращаются родительскому вызывающему коду.
Обработка ошибок
Обработка ошибок на многих других языках осуществляется с помощью исключения. TScript использует аналогичный процесс обработки ошибок,[6] хотя немного иначе. TScript имеет глобальную переменную ошибки, аналогичную традиционной errno в C, хотя переменная ошибки в TScript может содержать как код ошибки, так и подробное сообщение об ошибке.
На многих языках, использующих пытаться{...}ловить(...){...}
синтаксис: ошибка возвращается с помощью оператора catch, и это может затруднить выполнение кода в ситуациях, когда некоторые ошибки можно исправить. TScript использует если(...){...} еще{...}
нотация, которая позволяет вызывающему коду фильтровать ошибку, потенциально исправляя ошибку и возвращаясь к нормальной работе, или возвращая ошибку своей собственной вызывающей функции.
Пример возврата и обработки ошибок
функция(){возвращаться ошибка = -1;}общественный главный(){ если(!функция()){ если(ошибка != -1) возвращаться ошибка; } Система::Окно сообщения(L"функция выполнена правильно");}
Связывание во время выполнения
C ++ поддерживает перегрузка функции, что позволяет функциям иметь одно и то же имя, но различаться по входным параметрам. Это вызывает проблему с TScript при поддержке свободный тип переменные, так как невозможно определить тип переменной до тех пор, пока программное обеспечение не будет запущено.
Чтобы противостоять этой проблеме, TScript был написан с возможностью связывания во время выполнения. Это когда конкретная вызываемая функция зависит от типа переменных при вызове функции.
Это необычная тактика, имеющая ряд дополнительных преимуществ. Во-первых, это означает, что нет необходимости объявлять функции перед их использованием, например, в C ++ две функции могут вызывать друг друга, например пустота Фу(){ Бар();}
и пустота Бар(){Бар();}
. В этой ситуации Бар()
необходимо создать прототип, чтобы Фу ()
чтобы назвать это. Связывание времени выполнения TScript означает, что функции могут быть объявлены в любом порядке без необходимости прототипирования. Это может значительно упростить написание кода для менее опытных программистов, позволяя им сосредоточиться на логике программного обеспечения, а не на требованиях языка.
Связывание во время выполнения также позволяет языку поддерживать кодирование во время выполнения с помощью таких методов, как AddMethod и AddDefinedVariable. Это позволяет программам на TScript писать сами. Например, при использовании МЫЛО интерфейс, удаленный WSDL будут закодированы в библиотеке сценариев, позволяя вызывать функции, как если бы они были закодированы во время разработки. Кроме того, также можно написать код, который может обучаться сам, писать новые функции, когда это необходимо.
Динамически подключаемые библиотеки
TScript входит в небольшую группу языков сценариев, которые обеспечивают функциональность динамически загружать и ссылку на существующие общие библиотеки. Java через JNI и VB6 - это два других языка сценариев, которые позволяют писать код, который загружает стороннюю библиотеку и выполняется через ее собственный интерфейс. Это дает TScript возможность использовать множество ранее существовавших функций и кода, написанного на разных языках, и это может быть сделано без каких-либо изменений интерфейса разделяемой библиотеки или компиляции с исходным кодом.
Управление памятью
TScript использует стандартную инкапсуляцию классов C ++ для выделения и освобождения ресурсов памяти. Это означает, что вся выделенная память освобождается, когда содержащая ее переменная уничтожается и работает иначе, чем модель сборки мусора Java или модель подсчета ссылок .СЕТЬ языков.
Ресурсы операционной системы, такие как файлы, сокеты и ключи шифрования, управляются с помощью механизма подсчета ссылок, аналогичного .NET, поэтому они будут освобождены, как только не будет переменных, содержащих их значения.
Проактивная безопасность
Имея возможность загружать существующие общие библиотеки, сценарий может получить доступ ко всем привилегиям, предоставленным пользователю, который его выполняет. Чтобы защититься от вредоносного кода, каждому сценарию необходимо предоставить все ресурсы, помимо выделения основной памяти. Это также включает в себя возможность использовать окна сообщений для запроса пользователю, доступа для чтения и / или записи к любому файлу или каталогу или с помощью подключения к Интернету.
Эта архитектура безопасности разработана, чтобы позволить запускать сценарии аналогично JavaScript позволяя использовать более мощные языки сценариев, такие как PERL.