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