Mango A General Purpose Programming Language My Background Early experience on Apple II University of Illinois – Champaign – Urbana. Bachelor's degree in computer engineering Three years at Neoglyphics: software Three years at Alpha: hardware How Mango Got Started Frustrated with C/C++/Java There had to be a better way Foolishly began designing my own language Foolishness can be a virtue It’s been a seven year voyage The Problem Common computing infrastructure is written in C/C++ C/C++ is inadequate Lack of higher level abstractions Programmers must use low level constructs Results of C/C++ use Unsafe/unstable software Slower development times Higher development costs A lack of alternatives Java, Python, Perl, Pascal, Ada, Modula, C# Not viable replacements Lack C’s virtues in performance and flexibility Dependent on C for core tasks Lack of widespread appeal (clumsy, i.e. Ada?) Not sufficiently different to switch The Solution: Core Goals Provide higher level abstractions Avoid low level constructs when not needed Make programming easier, more enjoyable Retain performance and flexibility Allow unrestricted operations as necessary Avoid overhead Match machine execution model Overall: make a better experience for programmers Overview High level design goals and decisions Feature walk through Future directions Design Goals Design goals Syntax Static Typing vs. Dynamic Typing How Vs. What Large Languages Vs. Small Languages Object Orientation: Yes or No Goal #1: A Good Syntax Syntax is key It’s underrated (focus on semantics) Makes the language easier to learn Makes it accessible to non-programmers Makes the language self-documenting Marketing versus engineering Bad marketing of a good product will fail Bad syntax around good semantics will have a harder time gaining acceptance Static versus Dynamic Typing Dynamic languages are very popular Due to poor implementations of static languages Advantages of static typing Critical for performance Types act as documentation They catch many errors at compile time Types allows overloading of names How versus What CS fantasy to forget how and focus on what How is a hard problem Distinguish features that are theoretically equivalent but practically different Everything can be a list, but it’ll be slow Rich set of primitive and aggregate types Side effects to use memory more effectively Reduce copying Manual memory management GC is not possible for some applications Done right beats a garbage collector Large Vs. Small Languages Small language Secondary features are in a standard library Advantages: easier to learn core features, make a compiler Large language First class treatment of secondary features Allows specialized operations, makes programs more readable Advantage: a smoother user experience Ease of learning is dependent on more than language size You still have to learn library API’s Intangible quality: how the language corresponds to human cognition Open source makes compilers easier to write Open front end acts as the spec Object-Orientation: Yes or No? Stepanov’s criticism programming = data structures + algorithms multi-sorted algebras Object orientation has shown itself useful in certain circumstances Offer OO as an option Leave inheritance behind Inheritance hierarchies are difficult to follow Fragile base class problem requires reanalysis of class behavior Mango walk through Influences Syntax plus some basic examples Module system + incremental compilation (Include requires clause, parameter and options) (platform and foundation files) Naming and overloading Literals (include string format) Primitive Types Memory model (include pointer/reference syntax) Records and Abstracts Procedures, functions, constants (pure functions?) Statements: Control flow Statements: I/O Abstract Data Type (objects) Iterators and iteration operators Mutexes Exception Handling Strings, arrays, buffers Collection Types Global variables/External symbols/Module Constructors Calling convention part of the type system Packet/Device types Development aids Genericity SETL - set operations ALGOL - imperative block structure and syntax C - low level ops, low overhead ML - type inference, type syntax ADA - fine grained control over primitives PYTHON - indentation based syntax JAVA - interfaces C++ - STL, operator overloading, IO syntax CLU - iterators PASCAL - sets (bit masks) PERL - richness of expressibility COBOL - readable syntax SIMULA - objects Syntax Mango’s Syntax Mango looks like pseudo code Indentation based syntax Reduces clutter and typing Allows more code to be shown on the screen Blocks can be enclosed with begin/end delimiters if desired All directives, definitions, statements begin with a keyword Simple style that is easy to remember User’s symbolic names cannot conflict with reserved words This makes the language easy to extend There are no exclusively reserved keywords Legacy of lex? Modules and Naming Modules Module is a set of symbols Each file is a module Module name must correspond to pathname A modules symbols can be public or private Public: symbols are visible to other modules Private: symbols are invisible to other modules Modules may import and include other modules Import: foreign symbols are localized (private) Include: foreign symbols are exported (public) Incremental Compilation Mango supports incremental compilation Module has changed A dependency has changed Major or minor revision? Compares syntax trees Major revision: public change Minor revision: private change Comparing syntax Advantage: Eases implementation Disadvantage: Set of major revisions is obviously larger Naming Naming is not hierarchical, but geometric Symbol names exist within a four-d grid Namespace, keyword, extension, auxiliary Only namespace and keyword are mandatory Each module is part of a namespace Public symbols use declared namespace Private symbols use special namespace “local” Format: namespace::keyword@extension$auxiliary Shallow Overloading Overloading occurs for every imported or included module 4d namespace is collapsed into 1d namespace Utilizing keyword or extension Other partial namespaces as well Symbol can be access using proper name or alias Ensures all overloaded symbols have a unique name As a result, all overloading is superficial or shallow Operator overloading is also supported Memory Model Mango’s Memory Model Value semantics Put stuff on the stack, particularly primitives Key for performance Offers more flexibility Three types of memory Static: Compiled data, global variables Heap items that are never deleted Arbitrary: Heap items that are eventually deleted Local: Items that live on the stack Safe manual memory management Static datums Always safe to use Arbitrary datums Need to be guarded to avoid dangling pointer references Local datums Compiler must enforce restrictions to avoid dangling pointer references Sentries Pointer guards are called sentries Pointers to arbitrary datums are fat One address to the datum on the heap One address to the datum’s sentry Sentries live on the heap too Have a static lifetime (i.e. never deallocated) They are very small ~= 5 bytes Sentry Performance When # sentries is small Good performance on modern hardware Sentries stay in the cache Half of the processor’s time is spent waiting on memory As # sentries increases cache starts to overflow We need to reduce the number of sentries Arenas and Recycling Method #1: Allocate in pools A group of datums share a sentry Allocated arbitrarily, but deallocated at once Method #2: Recycling Use static datums instead When static datums are deleted Initialized to zero Stay on the heap until datum of the same type is requested Incorrect results are possible, catastrophic failures are not The program cannot break the type system Literals Literals Definition A value which is known at compile time Types Immediate values Numeric primitives and text Literal expressions Interpreted during compilation Parameters Values used to configure the compiler Options User supplied values to customize a build Literals can be named Numeric Literals Six types Integer, Decimal, Hex, Address, Binary, Signal Integers and decimals also include complex plane signifiers Can be anonymous Anonymous literals are stored as untyped strings Converted to a real value when type is known There are no constraints on range Can be typed Type is specified with value Converted immediately to the desire type value There are no constraints on range Text Literals Two types Characters and Strings Stored as untyped strings until desired type is known Characters enclosed with the back tick Text string enclosed with the double quote Literals can be inserted into characters and text strings Named literals Parameters Options Character codes Character aliases Literal Expressions Two forms of literal expressions Normal literals: immediate evaluation Macro literals: deferred evaluation Macros are evaluated over arguments Result value is optionally typed Expressions can include Condition construct Conversion construct Local aliasing Parameters and Options Changes cause recompilation of module Part of the public interface of the module Checked when comparing syntax Only options that are used included in dependency analysis Parameters included in dependency analysis Specified by user Have a major impact on compilation Core Types Core Types Primitives Tuples and Unions Addresses, Pointers, References Polymorphic Types Strings, Arrays and Buffers Collections Records and Abstracts Type Qualifiers Pliancy: Immutable, Mutable Reactivity: Volatile, Inert Duration: Local, Static, Arbitrary Memory: IO, Virtual, Physical? Useful for embedded system with multiple memories Undecided: means to access hardware registers directly Primitives Logical Bit (2 State), Boolean (3 State), Signal (4 state) Ordinal Range from 0 to N, where N is user specified Character ASCII, UTF 8, UTF 16, UTF 32, 8 Bit Data Register Binary register, user specified dimensions Signal Signal bus, user specified dimensions Primitives (cont’d) Cardinal Unsigned integer, 1/2/4/8/16/32/64 bits Subrange Signed range, upper/lower bound, default value Integer Signed integer, 8/16/32/64 bits Rational Signed rational, fixed or floating denominator Decimal Fixed point decimal number Whole and fractional component Number Floating point number, specified size Primitives (cont’d) Complex numbers Primitives qualified with units Enumerations Matrices Coordinates Primitive Modifiers Conversion Automatic, manual, none, universal Evaluation None, Fixed, Fluid Approximation Round, Truncate, Conserve Overflow Check, Limit, Wrap Byte Order Big, Little, Host, Network Tuples and Unions Anonymous type products Fields can be labeled Unions Each term of product is overlapped Unsafe Elaborate types decompose into tuples Addresses, Pointers, References Addresses have bitwise resolution Address is 2 product tuple Upper value: byte count Lower value: bit count Addresses still optimal types with byte-wise alignment will drop bit count Pointers Address of type where address is significant References Address of type where type is significant Polymorphic Types Sums Superposition of multiple types Qualified with type tag to ensure safety Handle Anonymous pointer (points to anything) Anything Stores any type value Strings, Arrays, Buffers Arrays Dimension type can be customized Slices of arrays preserve range information Strings Array of items from 1 to x Dimension type can be customized Slices of strings begin at 1 Buffers Fixed length string that wraps around itself Varying start and end positions Dimension type can be customized Collections Entry a node of a linked list a combination of string and pointer Segment List appends new data at the end elements allocated in pages Stack FIFO Can be prioritized Sequence inserts new data elements allocated in pages Queue LIFO Can be prioritized Collections (cont’d) Mask A bit mask Range A numeric range with upper and lower bounds Set A hashed set Doubles as a one-to-one map Table A hashed one-to-many mapping Group A special collected used for comparisons Graph Used for frequency tables Records Three visibility states Public: accessible anywhere Protected: accessible by modules that declare access Private: accessible within the module Two layout types Fixed: in order of declaration Packed: ordered to reduce record size Fields can be qualified to remove them from the build Abstracts Interface to multiple record types Records mapped to abstracts using link directive Gives more flexibility in mapping abstracts Mappings can occur after declaration i.e. library types can still be mapped to abstracts Simplifies remapping of fields Fields can be qualified to remove them from the build Medley: combines abstract with a group of records Abstract Data Types Mango can bind any type to a class Objects: Classes + Record Properties getter/setter methods Parameters Properties that can only be set at instantiation Delegates Multiple dispatch for aspects and aggregates Normal classes do not support inheritence Object Construction Constructor (prelude) Destructor (finale) New style constructor Parameters and properties can be set before the constructor is called Only one constructor per class – no overloading Constructor spans entire object. Variable initialization at declaration Object Interfaces Interfaces (mixins) Separates sub typing concerns from implementation Interfaces are purely abstract. No associated code Uses link directive like record abstracts Bind operator links types to interfaces automatically Aggregates Composition instead of hierarchical inheritance Flattens the hierarchy: easier to understand and maintain Overriding of methods is explicit Compiler can statically check for problems All publicly accessible methods must explicitly exported Built in I/O Devices Mango’s built in I/O devices are typed Six types of I/O devices file: an operating system file text: a line oriented text file stream: an I/O stream port: a connection listener database: a database document: a document (XML) Procedures and Functions Procedures Multiple inputs and output Call by localized reference Compiler makes a duplicate of a value on the stack if necessary Nested procedures Can reference variables within parents scope Return values are held in a named variable Possible to return values with assignment Functions and Constants Real functions Essentially a single expression Extended with two case constructs Condition and conversion Constants Similar format to functions Evaluated only once, result is cached AKA Eiffel once function Clean way to instantiate global variables Procedures and Functions (cont’d) Mango supports function/procedure pointers Both global and local procedures Invokation through expressions or statements Statement invokations automatically infer return types Labeled arguments possible Method Pointers Method pointers combine class state with class method When a method is selected from a class Result is a method pointer Special attribute and receptor pointers Automatically evaluated Method pointers are a supertype of function pointers Will absorb function pointers Expressions Arithmetic Addition, Subtraction, Negation, Identity Multiplication, Division (Truncate) Remainder, Division (Conserve) Apply (Exponent), Absolute Value Shift Left, Shift Right Comparison/Logical Equal, Not Equal Less, Less Equal, Greater, Greater Equal Test, Not, And, Or, Exclusive Or, Reduce Casting Static casting Type is specified Dynamic casting Type is infered Cast is specified with dynamic cast operator Implicit casting From subtype to supertype Class to interface, Function to method, etc Polymorphic types Membership in, not_in String, array, buffer, entry, segment List, stack, queue, sequence Mask, range, set, table, graph is, is_not Evaluates left value with right function Returns boolean like, not_like Tests left value is equivalent to right hand type Selections Selection of record fields/class methods By name By number (access to anonymous fields) Class fields Special attribute operator Dynamic method operator Looks for class that can operate on target type, with named method Array A[x] to index an array Slice operator Before and after some position Within a range ~=, /= for string comparisons Size operator returns size (# elements) Domain operator returns dimensions Production Create and initialize data types Local stack, static heap, dynamic heap Production arguments Where clause Initialize class properties/record fields With clause Class constructor arguments Aggregate members Within/upto Dynamic string/array dimensions From Target arena Sequence Operators Generate sequence Pick: select one value Every: select group values Test sequence Some: one term in set matches All: all terms in set match Compute sequence Product: product of terms Sum: sum of terms General Iteration Form [a of t] in x at h using u over p where z while q a in x at h using u over p where z while q <a,b> in x at h using u over p where z while q Iterations Iterator targets String, array, buffer, entry, segment List, stack, queue, sequence Mask, range, set, table, graph File, text, stream, database, document Iterator construct Statements Statements Overview Sequence of statements Nested block delimitation Begin/end pair Indentation Each statement begins with keyword Possible to group statements under a single keyword Delimited with indentation or begin/end pair Overview (cont’d) Variables can be named anywhere Renaming can occur In current block In nested blocks No goto’s Blocks can be labeled Blocks can be exited Block labels can be used to exit multiple levels Overview: Cont’d Conditional predication For many statements Often with alternate evaluation Basic Blocks Execute: nested block Exit: exit blocks Return: exit procedure and set results Repeat: repeating block Continue: repeat loop Production Declare: declare local variable Allocate: make temporary Deallocated when leaving block Get: declare static type New: declare dynamic type Delete: recycle or delete heap type Trash: delete static heap type Placement Overlay: place a type over another type Create: create a type from string Place: place a type at an address Map: map a device type Open: open an I/O type Close: close an I/O type Assignment Assign: copy value Optional declared result with inferred type Swap: swap two values Let: reference alias of value Refine: update multiple fields of a record Touch: Mark variable as used Nothing: Do nothing Arithmetic Reset: reset value to default Set: set value to 1 Incr: Increment by target, else 1 Decr: Decrement by target, else 1 Magnify: Multiply by target Reduce: Reduce by target Invokations Call: call function with arguments Optional declared result with inferred type Eval: evaluate arguments with function Optional declared result with inferred type Initialize: initialize object with arguments Finalize: finalize object Function: local function Procedure: local procedure Conditional Blocks If: If-then-else Select: Multiple conditions When: Defers compilation During: Conditional debug block Compiler option removes them While: Loop on pre-condition Until: Loop on post-condition Case Constructs Where: case of values Handles multiple matched terms Case values can include ranges and groups Character strings have contents compared Wild cards: Case value can be ignored Convert: covert one value into another Case values can include ranges and groups Character strings have contents compared Specialized Blocks Given: Reduces polymorphic type Handles multiple matched terms\ Wild cards: Case value can be ignored Cast: Cast value, Execute Block Foreach: Iterate and execute block Acquire: Acquire mutex and execute block Collection Operators Add: add item into set Replace: exchange item with another Remove: remove items from set Take: take (arbitrary) item from set Trim: reduce set y by set x Filter: intersect set y by set x Collection Iterators Find: Return item Option to insert and return new item Extract: Remove and return item Fill: Populate collection with iterator Compute: Arithmetic sum over iteration Copy: Copy from one set to another Modify: Update items within collection I/O Write: write terms to I/O device Read: read term from I/O device Strings, Buffers, Lists read series of terms Continue/Stop masks for character devices Print: write to standard out Log: Atomic write to I/O device Accept: accept stream from listener Monitor: monitor group of listeners Error Handling Activate: active exception handler Try: trap exceptions with block Throw: throw exception Require: assertion statement Quit: quit program Raise: rethrow exception Iterators Iterators Procedures to iterate over type Consists of operand and result type Iterator activation: By name By type (operand and/or result) Iteration deactivation Result is <stop> Result type is tagged Iterators (cont’d) Iterator sections State: local state while iterator active Prelude: initialization segment Query: compute result or signal stop Finale: finalization segment Local state is pushed on stack Exceptions Activated Handler Style Exception event code contained in global handler object Handler object pushed onto activation stack On exception, handlers are processed until exception is handled Exception handling is immediate, before stack is unwound Exceptions (cont’d) Four exception flavors: Fatal: Quit program without unwinding stack Severe: Quit program but unwind stack Normal: Unwind stack to last trap Soft: Program can continue Advantages Exception is processed before unwinding No side effects before exception handling Exception code can be pushed into libraries Still possible to localize with arguments passed during activation Reduces clutter No need for try-catch blocks No need for ‘throws’ clauses Global variables Global Variables Variable: global value Dataset: string of values Symbol: external (linked) value External: external (linked) function Global Constructors Global Initialization/Finalization code Executed before and after program Contents: Local state Prelude procedure Finale procedure Priority value sorts contructors Misc Mutexes Formal means of acquiring locks Mutex object + Acquire statement Object selected by name or by type Mutex Components State: local state Prelude: initialization Acquire: acquire lock Retry: reacquire flag Release: release lock Finale: finalization Packets Specialized record Header Payload of variable size Footer Packet type is polymorphic pointer Point to packet of any size Devices Used to define set of hardware registers Record of records Register placement: In sequence At specified offset Package Used to define group of related functions Elements of packages pushed into extended namespace Particularly useful for operators Means of reducing namespace clutter Means of grouping related generic operators Genericity Genericity Builds Builds Assemblies, Platforms, and Prologues Module Suffixes Runtime type identification Requests types that are used Therefore not all types need to be instantiated Future Directions Future Directions Finish the compiler Mango is the first in a family of languages Sharing type system and syntax Targeting a virtual machine Application Language In the spirit of C# or Java Reference semantics i.e. no user defined pointers Automated memory management With user intervention Less complicated type system More accessible language Functional Language Functional/Dataflow semantics Strong focus on doing distributed computations Gateway to bring functional programming to the masses Accessible because of shared syntax and types Record Processing Language Basically a replacement for COBOL “The use of COBOL cripples the mind” “working within the limitations of the original COBOL programming model can make for robust and maintainable code” Overlooked area by language designers Command Language Cross between TCL and LISP Can be used as OS shell Eliza – MIT LL4 conference Classification of Functions into 4 Types: <G> Generator <C> Concentrator <T> Transformer <F> Filter Connected with pipes (aka unix shells) Miscellaneous Standard Development Environment Text Editor, Debugger, Static Analysis, Etc. Programming is about community Programmers Organization Builds community Standards body Funds open source projects Earns revenue by supplying directory services The End Thanks for listening
© Copyright 2024 ExpyDoc