E - объектно-ориентированный, процедурный, высокоуровневый язык программирования, во многом схожий с языками Си++, Ада, Лисп и другими. Являясь языком общего назначения, в своей реализации на Ammy, основной упор сделан на разработку приложений.
Скорость компиляции более 20000 строк в минуту на "голой" A500, включаемый ассемблер и линковщик интегрированы в компилятор, большой набор встроенных функций, великолепная концепция модулей, реализованная во вложениях v39, гибкая система типов, наследование, методы, обработка прерываний (в контексте компилятора), выделение регистров, быстрая работа с памятью, унификация, Лисп-ячейки, средства разработки графического интерфейса, (макро-) препроцессор, гибкий и мощный отладчик на уровне исходника, легкая линковка библиотек и многое другое...
Если говорить проще - среди высокоуровневых языков на Ammy, альтернативы E, по возможностям (см. ниже), по скорости компиляции (виииуууу...), по простоте, нет и не будет, если конечно язык будет развиваться! Дело доходит до комизма, автор в прилагаемой документации утверждал, что компилятор AmigaЕ не поддерживает многомерные массивы, и тут же выходит модуль от преданного пользователя компилятора, для обхода этого недоразумения!
Это показывает уровень гибкости языка... Требования к железу минимальны - голой A1200 с винтом хватит по уши! Любой проект будет Вам по плечу! Е вобрал в себя все лучшее, что было в языках программирования. Смотрите сами: Вывод "Hello, World!" в CLI-окно 1000 раз, дана соответствующая информация о компиляторе, длине полученного кода и скорости выполнения...
| Language | Size (bytes) | Ticks | GCC 2.7.2 | 58,804 | 687 | G77 Fortran | 47,992 | 1,158 | Fortran2C & GCC 2.7.2 | 40,744 | 1,123 | ACE 2.40 (Phx) | 28,832 | 684 | SAS C 6.56 (7.01) | 17,104 | 717 | Maxon/Hisoft Basic 3.0 | 16,076 | 750 | Turbo Modula-2 | 10,324 | 714 | GFA-Basic 3.51 | 9,284 | 656 | StormCPP 2.0 | 6,772 | 668 | MaxonPASCAL 3.0 | 4,628 | 720 | Oberon-A | 4,360 | 770 | HighSpeed Pascal 1.2 | 4,120 | 713 | BB2 2.1 | 4,084 | 720 | vbcc 0.6a | 3,912 | 731 | PCQ Pascal 2.0 (A68kN) | 2,964 | 727 | PCQ Pascal 2.0 (Phx) | 2,540 | 727 | PCQ Pascal 1.2d (Phx) | 2,520 | 723 | BB2 (optimized version) | 2,328 | 699 | Cyclone 0.92 | 1,612 | 715 | MaxonC++ 3.1 | 856 | 689 | AmigaE 3.3a | 704 | 706 |
По материалaм гайда "Comparison of programming languages" by Frank Reibold. Как Вы сами можете видеть по размеру генерируемого кода, компилятор AmigaЕ - абсолютный рекордсмен, да и по скорости не на последнем месте!
Для того, чтобы подогреть Ваш интерес, далее по тексту будет дано описание редактора ЕЕ (версия 0.9.2 beta), и его настроек (крайне простых), чтобы Вы могли во всеоружии начать программировать на E! ;-)
И еще несколько примеров на растерзание!
Как обычно - Hello World и еще несколько, посложнее!
Главное меню редактора
Project (работа над проектами)
Clear |
очистить текущий проект |
| Open... | загрузить исходник в редактор |
| Open New... | открыть новое окно и сделать запрос на загрузку файла |
| New Window | просто открыть новое окно |
| Save | сохранить текущий проект |
| Save As... | сохранить текущий проект под другим именем |
| Quit | закрыть текущий проект |
| Quit All... | закрыть редактор |
Edit (редактирование проекта)
| Cut | вырезать в буфер обмена |
| Copy | копировать в буфер обмена |
| Paste | вставить из буфера обмена |
| Dupe Line | продублировать строку |
| Mark Block | выделить блок |
| Comment | сделать комментарием выделенный блок или строку под курсором |
| Uncomment | операция обратная Comment |
| To Upper | перевести выделенный блок в верхний регистр |
| To Lower | перевести выделенный блок в нижний регистр |
| Undo | отмена последней операции (откат) |
Find (операции поиска)
| Find Selected | взять выделенную область в качестве аргумента и найти следующее совпадение |
| Find Forward... | искать в направлении вперёд |
| Find Backward... | искать в направлении назад |
| Find Next | найти следующее совпадение |
| Find Prev | найти предыдущее совпадение |
| Replace Forward... | заменить в направлении вперёд |
| Replace Backward... | заменить в направлении назад |
| Replace Next | заменить следующее совпадение |
| Replace Prev | заменить предыдущее совпадение |
| Replace All | заменить всё |
| Case Sensetive | переключатель определяющий имеет ли значение регистр букв |
Settings (установки)
| Insert Mode | вкл./выкл. режим вставки |
| Save Before Compiling | вкл./выкл. сохранение проекта перед компиляцией |
| Backup Project | вкл./выкл. cоздание резервной копии с добавлением расширения .bak |
| Report Unreferenced | вкл./выкл. вывод сообщения об объявленных, но неиспользованных в программе переменных |
| Fast File Loading | вкл./выкл. быструю загрузку файлов (требуется больше памяти) |
| No Fold When Loading | отключение закладок при загрузке. В этом случае, если после загрузки проект будет сохранен, все закладки будут потеряны! |
| Default Pub Screen | вкл./выкл. "общий" экран для редактора EE |
| Shanghai Pub Screen | вкл./выкл. открытие всех окон на экране редактора EE |
| Free-form Cursor | вкл./выкл. режим построчного редактирования |
| Justify New Line | вкл./выкл. "умный" отступ при создании новой строки |
| Trim End Of Line | вкл./выкл. "обрезание" концов строк |
| Indent Width... | установка ширины отступа |
| Tab Width... | установка ширины табуляции (имеет значение только при загрузке файла) |
| Fold Extra Lines... | установка числа пустых строк для закладки при обработке операторов ENDPROC и ENDOBJECT |
| Select Font... | установка пользовательского шрифта для текста |
| Edit Prefs... | вызвать редактор настроек (EE Configuration Tool) |
| Load Prefs... | загрузить настройки |
| Macros | определение
макросов |
| Edit Command | определение команд |
Tools (инструментарий)
| Goto Line... | переход на указанную строку |
| Next Window | переход на следующее окно |
| Previous Window | переход на предыдущее окно |
| Switch To Window | переход на указанное окно выбираемое из списка |
| Tall Window | развернуть окно на весь экран |
| Fold/Unfold | установить/снять закладку |
| Complete | взять помеченный блок в качестве аргумента для поиска подходящего окончания и замены блоком из файла окончаний. |
| Compile | компиляция текущего проекта |
| Compile And Run | компиляция и исполнение полученной программы |
| Goto Last Error | переход на последнюю обнаруженную ошибку |
| Show Editor Info | вывести служебную информацию о редакторе EE |
| Collect Garbage | очистить кэш редактора EE |
| Execute | исполнение одной из пяти вспомогательных команд. |
Settings/Edit Prefs.../Commands... (определение вспомогательных команд)

Пример определения вспомогательных
команд
Settings/Edit Prefs.../Compiler... (определение настроек компилятора)
Пример определения настроек компилятора
Settings/Edit Prefs.../Global Settings... (глобальные установки среды редактора EE)



Settings/Edit Prefs.../Key Assignments... (присвоение "горячих" клавиш)

Settings/Edit Prefs.../Menu Command Hotkeys... - переопределение "горячих" клавиш в системе меню редактора.
Settings/Macros/Begin Recording... - начать определение макроса.
Settings/Macros/End Recording - закончить определение макроса.
Settings/Macros/Cancel Macro - прервать определение макроса.
Settings/Macros/Delete... - удалить существующий макрос.
Settings/Macros/Save... - сохранить определённые макросы.
Settings/Macros/Load... - загрузить определения макросов.
Settings/Macros/Clear... - очистить список определённых макросов.
Settings/Edit Command/1... - определение первой вспомогательной команды.
Settings/Edit Command/2... - определение второй вспомогательной команды.
Settings/Edit Command/3... - определение третьей вспомогательной команды.
Settings/Edit Command/4... - определение четвёртой вспомогательной команды.
Settings/Edit Command/4... - определение пятой вспомогательной команды.
Settings/Edit Command/Compiler... - определение строки вызова компилятора и его аргументов.
Закладки служат для улучшения удобочитаемости Ваших программ, путём сворачивания программных блоков. Это очень удобно при объектно-ориентированном и процедурном подходах в программировании. Для определения закладок (fold) служит опция "Fold/Unfold" из меню "Tools" ("RAmiga+h", по умолчанию). Если вы хотите пользоваться закладками, убедитесь сначала в том, что опция "No Fold When Loading" из меню "Settimgs" не активирована. В противном случае определяемые закладки не будут запоминаться в сохраняемых проектах.
Существует два способа определения границ закладки:
Механизм действия закладок:
Если текущая строка начинается с оператора "OBJECT" или "EXPORT OBJECT", текст свертывается до первого встреченного оператора "ENDOBJECT" или до конца текста;
Если текущая строка начинается с оператора "PROC" или "EXPORT PROC", текст свертывается до первого встреченного оператора "ENDPROC", или до конца текста;
Текст Вашей программы может сворачиваться с текущей строки до первого встреченного оператора "->endfold" или до конца текста.
Обратите внимание на точность написания оператора "конца закладки!"
Установленная закладка выглядит как строка с парой символов ">>" в начале. Закладка не может быть скопирована, она может быть только перенесена (Cut & Paste). Вложенность закладок никак не ограничена. Сама закладка будет храниться в виде комментария, в конце файла содержащего исходный текст Вашей программы - следовательно, не будет мешать при просмотре исходника другими средствами. В случае повреждения этой информации, используйте опцию "No Fold When Loading" из меню "Settings" - это позволит редактору EE нормально загрузить исходник.
Автодополнение (complete) - удобная функция позволяющая Вам не тратить время на ввод программных блоков, наиболее часто используемых в Ваших программах. Для вызова автодополнения используется опция "Complete" из меню "Tools" ("RAmiga+/", по умолчанию). При этом происходит поиск окончания для выделенного блока текста в файле окончаний. В случае, когда окончание для выделенного блока текста было найдено - происходит замена этого блока на блок найденный в файле окончаний. В противном случае, текст Вашей программы останется неизменным.
Например: Вы выделили строку "rand" в Вашей программе, нажали комбинацию клавиш "RAmiga+/" и эта строка дополнилась до: "randnum:=Rnd(max)" - присвоение переменной randnum случайного значения. Удобно использовать автодополнение для завершения путей к ресурсам, библиотекам и т.д. подключаемым в Ваших программах. Вы можете и сами придумать подходящие применения для этой функции.
Файл окончаний (CompletionFiles) хранится в директории "prefs" и может быть отредактирован в любом имеющемся у Вас текстовом редакторе (включая EE).
/* Самый занудный пример */
PROC main()
WriteF('Hello, World!\n')
ENDPROC
/* Получение аргументов из командной строки. Здесь, arg - специально * зарезервированная для этих целей переменная языка E. */ PROC main() WriteF( IF arg[]=0 THEN 'No Args!\n' ELSE 'You wrote: \s\n', arg ) ENDPROC
/* Отображение окна на общий экран (по умолчанию - экран Workbench) */
MODULE 'intuition/intuition' -> Нам понадобится модуль intuition.m
ENUM ERR_NONE, ERR_WIN, ERR_KICK, ERR_PUB -> Определяем константы путём перечисления
RAISE ERR_WIN IF OpenWindowTagList()=NIL, -> "Лов" исключений: окно не
ERR_PUB IF LockPubScreen()=NIL -> открылось или сорвался захват...
/* Открываем простое окно и ждём когда пользователь захочет его закрыть. */
PROC main() HANDLE -> Процедура содержит обработчик исключений
DEF test_window=NIL, test_screen=NIL -> Объявление переменных для структур
IF KickVersion(37)=FALSE THEN ERR_KICK -> Генерируем ошибку для старых кикстартов
test_screen := LockPubScreen('Workbench') -> Захват стандартного экрана
test_screen := OpenWindowTagList(NIL, -> Открытие окна
[WA_LEFT, 0, WA_TOP, 11,
WA_WIDTH, 640, WA_HEIGHT, 30,
WA_DRAGBAR, TRUE,
WA_CLOSEGADGET, TRUE,
WA_SMARTREFRESH, TRUE,
WA_CAREREFRESH, TRUE,
WA_DEPTHGADGET, TRUE,
WA_IDCMP, IDCMP_CLOSEWINDOW,
WA_TITLE, 'Window Title',
WA_PUBSCREEN, test_screen,
NIL])
UnlockPubScreen(NIL, test_screen) -> Отдаём системе захваченный экран
test_screen := NIL -> Обнуляем указатель
handle_window_events(test_window) -> Ожидание системного события
EXCEPT DO
IF test_window THEN CloseWindow(test_window)
IF test_screen THEN UnlockPubScreen(NIL, test_screen)
SELECT exception -> Вывод сообщений об ошибках
CASE ERR_KICK; WriteF('Error: Needs Kickstart V37+\n')
CASE ERR_PUB; WriteF('Error: Could not lock public screen\n')
CASE ERR_WIN; WriteF('Error: Failed to open window\n')
ENDSELECT
ENDPROC
/* Процедура ожидания события */
PROC handle_window_events(win)
REPEAT
UNTIL WaitIMessage(win)=IDCMP_CLOSEWINDOW
ENDPROC
MindEngine; Copyright 2003