Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Темы - Kemet

Страницы: [1]
1
Общий раздел / Oxford Oberon-2 compiler
« : Апрель 17, 2014, 06:00:27 am »
В местном путеводителе не нашел упоминания, нужно бы внести.
Цитировать
At Oxford, we use Oberon as the second language we teach to our undergraduate students (the first one is Haskell). We chose it because of its cleanliness and simplicity, and because of the availability of books that emphasize clear reasoning about programs. Yes, it seems old-fashioned in some ways, but partly that's because it is closer to the hardware than is now the fashion. And it's hard to find another language with a defining document that comes in under 20 pages.

To support this teaching within our Unix-based software laboratory, I have developed from scratch a portable compiler that translates Oberon-2 into bytecode, which can be either interpreted or dynamically translated into machine code. Dynamic translation uses a portable interface modelled on the one in GNU Lightning, but is so far implemented only on x86 machines. The implementation includes a full garbage collector, and comes with profiling tools and a simple GUI debugger.

This implementation of the Oberon-2 language does not include a version of the Oberon-2 operating system and programming environment; instead, programs are edited with the tools of the host operating system and compiled into executables that run like other programs on the host system.

The compiler is written in Objective Caml, and the runtime system is written in C. It is not necessary to have Objective Caml installed in order to use the binary distributions listed below, but it is needed in order to build the system from the source distribution. The build process also uses some scripts written in Tcl.

The current version of the compiler is release 2.9; another page has links to some (slightly outdated) design documents for the compiler.

Oxford Oberon-2 compiler

2
Сегодня в svn A2 была добавлена поддержка инициализаторов переменных в Активном Обероне. Синтаксис, на текущий момент, такой:
VAR
  i := 1, j := 2, k :=3 : LONGINT;
В отличии от инициализаторов переменных в Модуле-3 (в дополнение к отличию в синтаксисе) - обязательное указание типа переменных.

3
Предлагаю за ненормативную лексику, бессодержательные сообщения, деструктивную деятельность заблокировать сроком на месяц пользователей kkk и DddIzer.
Прошу проголосовать.

4
Общий раздел / Oberon Revision 1.10.2013
« : Октябрь 26, 2013, 01:28:48 pm »
Таки свершилось.
Скачать pdf

5
Общий раздел / Active C#
« : Июль 27, 2013, 05:03:08 pm »
Наткнулся сегодня на очередной проект ETHZ: Active C#.
На странице: Сообщение о языке, Презентация, исходные тексты компилятора и библиотек + бинарники

6
Общий раздел / Elena (язык программирования)
« : Апрель 28, 2013, 11:23:35 am »
Проект - Язык программирования ELENA версия 1.5.6
(C)2005-2010  Алексей Раков

Проект ELENA включает в себя документацию (пока только на английском),
библиотеку классов, примеры, компилятор командной строки, интегрированную среду разработки (IDE).

В настоящий момент поддерживается только платформа Win32-x86 (2000/XP/Vista/7).

За дополнительной информацией обращайтесь на http://elenalang.sourceforge.net/

****************************************************************************
* Некоторые характеристики проекта
****************************************************************************

- Динамический объектно-ориенированный язык программирования
- "Горизонтальное" множественное наследование
- Изменчивое поведение объектов ("shift" технология)
- Поддержка динамических изменений классов по ходу работы программы (мутации)
  ("annex / cast" обработчики)
- Виртуальная машина ELENAVM (в разработке)
- 32-x битный компилятор коммандной строки
- Графическая среда разработки и отладчик
- Поддержка уникода (unicode)
- Исходные коды
- Примеры, включая карточную игру Up'N'Down (в разработке)
- Ряд учебных материалов для начинающих
- Упращенный Ассемблер компилятор

****************************************************************************
* Минимальные требования
****************************************************************************

x86 процессор,
Win32:
 - Win2000/XP/Vista
 - 16 MB оперативной памяти

****************************************************************************
* Лицензия
****************************************************************************

The compiler and executables distributed in this package fall under The Apache
License V2.0e, for more information read the file LICENSE.TXT.

Пример кода
// based on http://cboard.cprogramming.com/cplusplus-programming/30001-determinant-calculation.html prelude sample

// --- default namespaces ---
#define std'dictionary'*.
#define std'basic'*.
#define std'patterns'*.
#define std'math'matrix'*.
#define ext'io'*.
#define ext'patterns'*.

// --- namespace shortcuts ---
#define factory'* = std'basic'factory'*.

// --- private subjects ---
#subject matrix_name, determinant.

// --- factory ---
#symbol NewMatrix : Args =
    NewInitializedArray &&m:(Args m) &n:(Args n) &factory'init_action: anItem =>
        [
            ^ (console << "Enter " << Args matrix_name << "[" << anItem m + 1 << "," << anItem n + 1 << "]=" >> Real).
        ].

// --- matrix role ---

#role EMatrix
{
    #method + aMatrix
    [
        #var aCount := self count.
       
        ^ NewInitializedArray &&m:aCount &n:aCount &factory'init_action: anItem =>
            (self @ anItem m @ anItem n + aMatrix @ anItem m @ anItem n).
    ]
   
    #method - aMatrix
    [
        #var aCount := self count.
       
        ^ NewInitializedArray &&m:aCount &n:aCount &factory'init_action: anItem =>
            (self @ anItem m @ anItem n - aMatrix @ anItem m @ anItem n).
    ]
   
    #method * aMatrix
    [
        #var aCount := self count.

        #var aResult := NewInitializedArray &&m:aCount &n:aCount &factory'pattern:(real::0).
                   
        loop &&for:0 &till:aCount run: i =>
        [
            loop &&for:i &till:aCount run: j =>
            [
                loop &&for:j &till:aCount run: k =>
                [
                    aResult@i@j += (self@i@k * aMatrix@k@j).
                ].
            ].
        ].
       
        ^aResult.
    ]

    #method determinant
    [
        #var aCount := self count.
       
        // create matrix copy
        #var a := NewInitializedArray &&m:aCount &n:aCount &factory'init_action:anItem => (real::(self @ anItem m @ anItem n)).

        #var deter := real << 1.

        #if loop &&for:0 &till:aCount run: k =>
            [
                #if (a@k@k == 0.0r)?
                [               
                    control ifnot:(0.0r == Summing::Real::0 start:(loop &&for:k &till:aCount)).
               
                    loop &&for:k &till:aCount run: j =>
                    [
                        loop &&for:k &till:aCount run: i =>
                        [
                            #var temp := real::(a@j@i).
                            a@j@i << a@k@i.
                            a@k@i << temp.
                        ].
                    ].
                   
                    deter *= -1.
                ].
                deter *= a@k@k.
               
                loop &&for:(k + 1) &till:aCount run: i =>
                [
                    loop &&for:(k + 1) &till:aCount run: j =>
                    [
                        a@i@j -= (a@i@k * a@k@j / a@k@k).
                    ].
                ].
            ]
        [
            ^ deter.
        ]
        | [
            ^ 0.0r.
        ].
    ]

    #method literal_writer'save : aWriter
    [
        Scan::self run: aRow =>
        [
            Scan::aRow run:ListSaving::aWriter.
           
            aWriter << "%n".
        ].
       
        ^ aWriter.
    ]
}

#symbol IdentityMatrix : anOrder
    = NewInitializedArray
            &&m:anOrder
           
            &n:anOrder
           
            &factory'init_action:aCell =>
            [
                ^ Control if:(aCell m == aCell n) back:real::1 | back:real::0.
            ].

// ---- Program ---

#symbol Program =>
[
    'program'output << "Choose an option%n".
    'program'output << "[1] - Sum Matrix%n[2] - Subtract Matrix%n[3] - Multiply Matrix%n[4] - Matrix Determinant%n".
    'program'output << "[5] - Identity Matrix%nYour choice: ".
    #var aChoice := 'program'input >> integer.

    'program'output << "Enter the order of matrix: ".
    #var N := 'program'input >> integer.

    #if aChoice == 1?
    [
        #var aMatrixA := NewMatrix &&m:N &n:N &matrix_name:"A".
        'program'output << "%n".
        #var aMatrixB := NewMatrix &&m:N &n:N &matrix_name:"B".
       
        #var aSum := aMatrixA~ematrix + aMatrixB.
        'program'output << __wrap(ematrix, aSum).
    ]
    | == 2?
    [
        #var aMatrixA := NewMatrix &&m:N &n:N &matrix_name:"A".
        'program'output << "%n".
        #var aMatrixB := NewMatrix &&m:N &n:N &matrix_name:"B".
        'program'output << "%n".
       
        #var aDiff := aMatrixA~ematrix - aMatrixB.
        'program'output << __wrap(ematrix, aDiff).
    ]
    | == 3?
    [
        #var aMatrixA := NewMatrix &&m:N &n:N &matrix_name:"A".
        'program'output << "%n".
        #var aMatrixB := NewMatrix &&m:N &n:N &matrix_name:"B".
        'program'output << "%n".
       
        #var aMul := aMatrixA~ematrix * aMatrixB.       
        'program'output << __wrap(ematrix, aMul).
    ]
    | == 4?
    [
        #var aMatrixA := NewMatrix &&m:N &n:N &matrix_name:"A".
        #var aDeterminant := aMatrixA~ematrix determinant.
       
        'program'output << "%n%n" << aDeterminant.
    ]
    | == 5?
    [
        #var identity := IdentityMatrix::N.
       
        'program'output << __wrap(ematrix, identity).
    ].
    'program'input get.
].

7
Общий раздел / sanos
« : Апрель 16, 2013, 06:33:34 pm »
Копаясь в исходниках А2 нашел ссылку на интересный проект: Операционная система sanos

Даёшь компилятор Оберона akron1 для sanos!

8
В Активном Обероне куча нововведений, которые отсутствуют в официальной документации А2, да и имеющаяся давным давно устарела и вообще её там с гулькин нос.
Совершенно случайно сегодня наткнулся на документы, которые проливают свет на суть вопросов, связанных с этим самым математическим расширением:

F. Friedrich, J. Gutknecht, O. Morozov, P. Hunziker. A Mathematical Programming Language Extension for Multilinear Algebra. Proc. Kolloqium über Programmiersprachen und Grundlagen der Programmierung, Timmendorfer Strand 2007.

F. Friedrich, J. Gutknecht. Array-Structured Object Types for Mathematical Programming. Proc. Joint Modular Language Conference, Oxford 2006.


9
В ходе обсуждений в конференции мы с valexey пришли к выводу, что не плохо-бы иметь компилятор Оберона под MSP430.Архитектурно в нём много заимствований из PDP-11 (правда существенно упрощенного), с которым мы( в смысле моя контора) плотно работаем. К тому же как-то на досуге я реализовал Обероон-07 под PDP-11 (ну почти Оберон-07).
Здесь есть некоторые потенциальные проблемы: Процессоры 16-ти разрядные, не во всех есть не только модуль плавающей точки, но  и даже банальный умножитель.
Т.е. "искаропки" микроконтроллеры не поддерживают умножение/деление целых чисел и вещественные числа отсутствуют как класс.

Никаких специальных команд или средств для организации ввода/вывода(портов) нет, т.к. регистры устройств отображаются в адресное пространство.

В PDP-11 в верхние 8к(у некоторых 4к) адресов зарезервированы под регистры устройств. В MSP430 регистры устройств находятся в нижних адресах, а в верхних адресах находятся вектора прерываний и флэшпамять в которой хранится сама программа.
Т.е. к регистрам можно обратиться как обычной ячейке памяти. В Обероне, обращение к переменной по определенном адресу вызовет обращение к определенному регистру, без всяких SYSTEM.PUT/GET/IN/OUT. что лично для меня существенно упрощает работу с внешними устройствами.

Как известно, в Оберонах отсутствует поддержка беззнаковых целых, что не дает возможности нормально работать с верхней половиной адресов (при использовании типа INTEGER).
Нужно подумать, как работать с внешними устройствами и как обращаться к памяти за пределами 32К. Использовать для этого какой-нибудь REAL не получится по причине его отсутсвия как класса, а софтверная эмуляция вызовет существенный оферхед. Может есть смысл ввести тип ADDRESS как это сделали в Активном Обероне?

Тип SET в Обероне 32-х разрядный, а INTEGER в этой реализации 16-ти разрядный, т.е. во первых прямого взаимного отображения не получится, и для реализации 32-х разрядного SET'а на 16-ти разрядных машинах опять потребуется дополнительные телодвижения, снижающие эффективностьт. Может есть смысл сделать SET тоже 16-ти разрядным.

Вобщем, если у кого-то есть мысли, идеи, предложения и решения на этот счет, хотелось бы увидеть.
А может вообще, нафик он нужен, Оберон-07 под MSP430?  :D

10
Общий раздел / Операционная система SPIN
« : Декабрь 14, 2012, 02:45:40 pm »
Нашел в своё время на просторах интернета. Написана на Модуле-3.
Оффсайт полумертвый, сама ось давно умерла. Есть много интересного, несомненный плюс - наличие хорошей документации "искаропки".
Залил на GitHub, планирую позаниматься ею. Может еще кого заинтересует

11
Искал себе для экспериментов дешевый планшетник на Intel Atom и наткнулся на сабдж, заказал. Вдруг братья-китайцы всё-таки выполнят заказ )

12
По просьбе камрадов попробую описать отличия от оберонов и ответить на вопросы по поводу языка Сириус и компилятора.
Учитывая, что я не Вирт, строгого и понятного изложения не получится.
Что качается самого компилятора, то планируется сделать его общедоступным и открыть исходники, но это будет не раньше осени и только после удаления ряда зависимостей. в паблик пойдёт только компилятор с рантаймом и несколько пакетов, всё остальное, включая среду разработки раскрывать мы не имеем права, а то нас закроют )))
Поддерживаются бакэнды для i386, ARM, Alpha, VAX-11, PDP-11, PPC, AVR32. В паблике будет только i386 и, возможно, ARM и AVR.

Сразу необходимо отметить, что язык и компилятор постоянно развиваются и за 7 лет эксплуатации претерпели значительные изменения.
Никаких оснований для полной совместимости с Оберонами у нас не было и нет, но стандартный Оберон-2 компилируется.
Из отличий - наличие делегатов, специальный объектный тип OBJECT, специальный строковой тип STRING, типы CHAR, WIDECHAR, LONGCHAR,
ключи или модификаторы, которые могут менять поведение некоторых механизмов в блоке, синтаксис и семантика IMPORT заимствована из OO2C, есть SYSTEM.DISPOSE, защищаемые переменные, оператор TYPECAST для приведения типов, модификатор [SAFE/UNSAFE] обеспечивает безопасное или любое приведение типов (по умолчанию безопасное - safe). Синтаксис его соответствует одноветочному WITH со списком приведения:
TYPECAST a:T1, b:T2 DO ... END;
WITH - многоветочный, описан в другой ветке.
Подобный механизм (typecast) очень сильно облегчил нам работу, т.к. в таком блоке нет необходимости в принудительном трехэтажном кастовании при каждом обращении к переменной расширенного типа.

Следующее отличие - возможность уточнения типов аргументов и результата у методов расширенного типа (уточнение должно расширять тип), также в наследниках допустимо уточнение абстрактных типов RECORD и OBJECT, т.е. корректны определения:

R0 = RECORD END;
R1 = RECORD (R0) END;

O0 = OBJECT
  PROCEDURE P(a:OBJECT, CONST b:RECORD): OBJECT;
END O0;

O1 = OBJECT (O0)
    PROCEDURE P(a:O1, CONST b:R0): O1; //здесь может быть любое уточнение для абстрактных OBJECT и RECORD
END O1;

O2 = OBJECT (O1)
    PROCEDURE P(a:O2, CONST b:R1): O2; //здесь уже может быть уточнение только расширения типа
END O2;

Страницы: [1]