Amiga E

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 11:48, 2 июня 2016.
Amiga E
Парадигма процедурный, объектно-ориентирваннный
Спроектировано Wouter van Oortmerssen
Первый   появившийся 1993
Печать дисциплины слабая, динамическая
OS AmigaOS, Windows
Портал: Amiga E

Amiga E( или E)— объектно-ориентированный язык программирования, созданный Уотером ван Оортмерссеном (дат. Wouter van Oortmerssen) для ПК Amiga. В дальнейшем Уотер ван Оортмерссен применил концепцию Amiga E при создании Sheep для среды AmigaDE и CryScript (также известный как DOG), использованный в разработке Far Cry.

Amiga E содержит в себя черты множества самых разнообразных языков программирования, но в фундаментальных вопросах следует идеологии Си. Отличительные особенности языка - это быстрая компиляция, объектно-ориентированное программирование, развитая система модулей, гибкая система типов, поддержка обработки исключений и удобочитаемые исходные коды.

История

1993: Первый публичный релиз коммерческого компилятора Amiga E.

1997: Последняя версия коммерческого компилятора Amiga E от автора (3.3a).

1999: Выпущен сторонний компилятор с языка Amiga E не имеющий ограничений.

1999: Исходные коды компилятора Amiga E написанного на ассемблере m68k выпущены под лицензией GPL.

1999: Выпущена первая версия компилятора CreativE основанного на исходном коде компилятора Amiga E.

1999: Выпущена первая версия компилятора PowerD транслирующего расширенный код Amiga E в Си, с последующей компиляцией в GCC. (0.01)

2000: Выпущена первая версия компилятора YAEC (сокращение от англ. Yet Another E Compiler - ещё один компилятор E). (1.0)

2001: Выпущена финальная версия компилятора CreativE (2.12.3)

2002: Выпущена финальная версия компилятора YAEC (2.5d).

2002: Выпущена первая версия компилятора ECX написанного на самом Amiga E. (1.0)

2003: Выпущена финальная версия компилятора PowerD. (0.20)

2008: Выпущен первый публичный релиз компилятора PortablE транслирующего код Amiga E в Си. (r1)

2009: Выпущен первый публичный релиз компилятора PortablE для ОС Windows. (r4)

Основы языка

Типы данных

В языке E отсутствует жёсткая система типов. Единственным не составным типом является 32 битный LONG. Особой разновидностью LONG является тип PTR. Объявить переменную можно следующим образом:

    DEF <var>[:<type>]

Простые типы CHAR (8бит) и INT (16бит) не мог использоваться для простых переменных. Однако они применяются при создании массивов, задании типов указателей, объявления объектов.

Для создания массива нужно указать его длину (в элементах):

DEF <var><[size]>:ARRAY [OF <type>]

Строки похожи на массивы, но основное отличие в том, что их изменение может происходить только с использованием стандартных функция языка E, а так же в том, что они хранят информацию о текущей и максимальной длине. Строковые функции меняют их безопасным образом: размер строки не превысит размер выделенной области памяти.

Список состоит из переменных типа LONG и может менять размер подобно строкам.

Объекты:

    OBJECT <objname> [OF <objname>]
    [PUBLIC|PRIVATE]
        <membername> [ : <type> ]           /* Любое количество таких строк */
    ENDOBJECT

OF реализует наследование объекта. PRIVATE и PUBLIC задают области объекта с различным уровнем доступа.

Список поддерживаемых форматов данных:

  • деситичное (1)
  • шестнадцатиричное ($F1)
  • двоичное (%011)
  • вещественное (1.0)
  • символ ("a")
  • строка ('bla')
  • список ([1,2,3]) и типизированный список
  • ячейка lisp (<a|b>)

Операторы

  • математические (+ - * /)
  • сравнение (= <> > < >= <=)
  • логические и побитовые (AND OR)
  • унарные (SIZEOF ` ^ {} ++ -- -)

++ и -- увеличивают и уменьшают переменную SIZEOF возвращает размер объекта {} возвращает адрес переменной ^ доступ к переменной по адресу ` блокирует вычисление выражения

  • структурный (.) - доступ к полям объекта
  • доступ к элементу массива по индексу([])
  • оператор плавающей точки (!) - производит конвертацию между float и integer
  • оператор присваивания (:=)
  • оператор последовательности (BUT) - позволяет написать два выражения там, где возможно только одно. Возвращает значение второго выражения.
  • динамическое выделение памяти (NEW)
  • унификация (<=>) - пытается связать переменные в правой части с значениями так, чтобы выражения были равны.
  • типизация указателя (::) - меняет тип указателя

Как правило выражения записываются каждое на своей строке. Но несколько из них можно объединить, разделяя их ";". Так же можно разширить выражение на несколько строк, при помощи ",".

Метки - глобальные идентификаторы к которым приписано':'. Оператор JUMP <label> продолжит выполнение с метки <label>.

Условный оператор:

    IF <exp>
        <statements>
    [ ELSEIF <exp>           /* elseifs может повторятся несколько раз*/
        <statements> ]
    [ ELSE ]
        <statements>
    ENDIF

Оператор цикла For:

FOR <var> := <exp> TO <exp> STEP <step> DO <statement>

или:

    FOR <var> := <exp> TO <exp> STEP <step>
        <statements>
    ENDFOR</nowiki>

Оператор цикла While:

WHILE <exp> DO <statement>

или:

    WHILE <exp>
        <statements>
    ENDWHILE

Оператор цикла Repeat:

    REPEAT
        <statements>
    UNTIL <exp></nowiki>

Бесконечный оператор цикла Loop:

    <nowiki> LOOP
        <statements>
    ENDLOOP

<syntaxhighlight lang:="AmigaE">  

Оператор выбора

<syntaxhighlight lang=bnf>
    SELECT <var>
    CASE <exp>
        <statements>
    [ CASE <exp>
        <statements> ]   /* таких блоков может быть сколько угодно */
    [ DEFAULT
        <statements> ]
    ENDSELECT

Операторы инкремента и декремента

     INC <var>
     DEC <var>

Пустой оператор - вычисление выражения без возврата результата

    VOID <exp>

Освобождение памяти

    END <var>

Процедуры

Чтобы собрать опеаторы в свою функцию используется PROC.

    PROC <label> ( <args> , ... ) [OF <object>]
        <statements>
    ENDPROC <returnvalue>, ...

или:

     PROC <label> ( <args> , ... ) [OF <object>] IS <returnvalue>, ...

[OF <object>] указывает на принадлежность процедуры объекту.

Примеры

Hello world

     PROC main()
        WriteF('Hello, World!\n')
    ENDPROC

Ханойские башни

    
    PROC move(n, from, to, via)
        IF n > 0
            move(n-1, from, via, to)
            WriteF('Move disk from pole \d to pole \d\n', from, to)
            move(n-1, via, to, from)
        ENDIF
    ENDPROC    PROC main()
        move(4, 1,2,3)
    ENDPROC

Использование объектов

    OBJECT a_class
        varA, varP
    ENDOBJECT    -> конструктор
    PROC init() OF a_class
        self.varP := 10
    self.varA := 2
    ENDPROC    -> деструктор
    PROC end() OF a_class
        -> пусто
    ENDPROC    -> бесполезный getter
    PROC getP() OF a_class IS self.varP    PROC main()
        DEF obj : PTR TO a_class
        NEW obj.init()
        WriteF('\d\n', obj.varA)   
        WriteF('\d\n', obj.varP) 
        WriteF('\d\n', obj.getP())
        END obj
    ENDPROC

Ссылки