StaDyn (programming Language)
   HOME

TheInfoList



OR:

StaDyn is an
object-oriented Object-oriented programming (OOP) is a programming paradigm based on the concept of '' objects''. Objects can contain data (called fields, attributes or properties) and have actions they can perform (called procedures or methods and impleme ...
general-purpose programming language for the .NET platform that supports both static and dynamic typing in the same programming language. The StaDyn compiler gathers type information for the dynamically typed code. That type information is used to detect type errors at compilation time and to perform significant optimizations. For that purpose, it provides type reconstruction (inference), flow-sensitive types, union and intersection types, constraint-based typing, alias analysis and method specialization. Its first prototype appeared in 2007, as a modification of C# 3.0. Type inference was supported by including var as a new type, unlike C#, which only offers var to define initialized local variables. Flow-sensitive types of var references are inferred by the compiler, providing type-safe duck typing. When a more lenient approach is required by the programmer, the dynamictype could be used instead of var. Although type inference is still performed, dynamic references behave closer to those in dynamic languages. StaDyn is designed by Francisco Ortin from the
University of Oviedo The University of Oviedo (, Asturian: ''Universidá d'Uviéu'') is a public university in Asturias (Spain). It is the only university in the region. It has three campus and research centres, located in Oviedo, Gijón and Mieres. History Th ...
. The language has been implemented by different members of the Computational Reflection research group, including Miguel Garcia, Jose Baltasar García Perez-Schofield and Jose Quiroga, besides Francisco Ortin. The name StaDyn is a portmanteau of static and dynamic, denoting its aim to provide the benefits of both static and dynamic typing.


Code samples


Variables with different types

Just like dynamic languages, variables may hold different types in the same scope: using System; class Program The age variable is first inferred as string, so it is safe to get its Length property. Then, it holds an integer, so age++ is a valid expression. The compiler detects an error in the last line, since Length is no longer provided by age. The generated code does not use a single Object variable to represent age, but two different variables whose types are string and int. This is achieved with a modification of the algorithm to compute the
SSA form In compiler design, static single assignment form (often abbreviated as SSA form or simply SSA) is a type of intermediate representation (IR) where each variable is assigned exactly once. SSA is used in most high-quality optimizing compilers for ...
. This makes the generated code to be more efficient, since runtime type conversions are not required.


Flow-sensitive types

var and dynamic variables can hold flow-sensitive types: using System; class Program It is safe to get the Message property from exception because both ApplicationException and SystemException provide that property. Otherwise, a compiler error is shown. In this way, StaDyn provides a type-safe static duck-typing system. In the following program: using System; class Program The Message property is not provided by String, so a compiler error is shown for exception.Message. However, if we declare exception as dynamic, the previous program is accepted by the compiler. dynamic is more lenient than var, following the flavor of dynamic languages. However, static type checking is still performed. This is shown in the last line of code, where the compiler shows an error for exception.Unknown even if exception is declared as dynamic. This is because neither of the three possible types (ApplicationException, SystemException and String) supports the Unknown message. Although dynamic and var types can be used explicitly to obtain safer or more lenient type checking, the dynamism of single var references can also be modified with command-line options, XML configuration files and a plugin for Visual Studio.


Type inference of fields

var and dynamic types can be used as object fields: class Wrapper class Test The Wrapper class can wrap any type. Each time we call the set method, the type of attribute is inferred as the type of the argument. Each object has a potentially different type of attribute, so its type is stored for every single instance rather than for the whole class. In this way, the two lines indicated in the code above report compilation errors. A type-based alias analysis algorithm is implemented to support this behavior.


Constraint-based types

Let's analyze the following method: public static var upper(var parameter) The type of parameter and the function return value are inferred by the compiler. To that aim, a constraint is added to the type of the upper method: the argument must provide a ToUpper method with no parameters. At each invocation, the constraint will be checked. Additionally, the return type of upper will be inferred as the return type of the corresponding ToUpper method implemented by the argument. The programmer may use either var or dynamic to declare parameter, changing the way type checking is performed upon method invocation. Let's assume that the argument passed to upper holds a flow-sensitive type (e.g., the ApplicationException, SystemException or String exception variable in the code above). With var, ''all'' the possible types of the argument must provide ToUpper; with dynamic, ''at least one'' type must provide ToUpper.


Runtime performance

The type information gathered by StaDyn is used to perform significant optimizations in the generated code: the number of type inspections and type casts are reduced, reflection is avoided, frequent types are cached, and methods with constraints are specialized. The point of all the optimizations is to reduce the number of type-checking operations performed at runtime, which is the main performance penalty of most dynamic languages. Many of those type checks are undertaken earlier by the StaDyn compiler. A detailed evaluation of the runtime performance of StaDyn is detailed in.


See also

*
OCaml OCaml ( , formerly Objective Caml) is a General-purpose programming language, general-purpose, High-level programming language, high-level, Comparison of multi-paradigm programming languages, multi-paradigm programming language which extends the ...
*
StrongTalk In computing, Strongtalk is a Smalltalk environment with optional static typing support. Strongtalk can make some compile time checks, and offer ''stronger'' type safety guarantees; this is the source of its name. It is non-commercial, though it ...
* Boo


References


External links


Official website

GitHub repository

Computational Reflection research group
{{Common Language Infrastructure Programming languages .NET programming languages Class-based programming languages Free and open source compilers Object-oriented programming languages Programming languages created in 2007 Software using the MIT license Statically typed programming languages Dynamically typed programming languages 2007 software Spanish inventions