Как стать автором
Обновить

Комментарии 27

мои глаза… BEGIN END. Люди с таким чувством прекрасного не могут создать хороший язык программирования. Извините, но нет.


Почему на блок надо уделять так много внимания читателя и писателя? А если у функции 30 блоков, это 60 КАПСОМ НАПИСАННЫХ СЛОВ? Ужас.

Что-то несколько выше уровня восприятия токенов языка программирования создает это ощущение полноты и правильности. Если вам будет любопытно, то рекомендую посмотреть перевод лекции Роберта Гризмера «Эволюция языка программирования Go»: www.youtube.com/watch?v=ZbtB1Aqc41A Он очень точно выводит некоторые проблемы, которые стоят перед разработчиками языков программирования.
Привыкаешь к этому быстро. Как к скобкам Лиспа.
Недавно поинтересовавшись областью мат расчетов (собственно, после перевода статьи про ядра матрицы), мне понравилась Julia.

Итак, почему Julia, а не Оберон (или еще какой язык)?
  1. В Обероне нет нормальной обработки ошибок. Вообще. Только коды возврата
  2. В Джулии автовывод типов и компактный синтаксис (и никаких BEGIN'ов!)
  3. Оберон-07 однопоточный, а Julia поддерживает потоки без усложнения кода, кластеры, и CUDA — не требуя писать на CUDA-C. Да и вообще LLVM-JIT-бекенд быстр (хотя V8 используемая OberonJS тоже очень хороша)
  4. В Джулии встроены типы для мат.вычислений — многомерные матрицы в тч разреженные, рациональные дроби, расчеты с единицами измерений, перегружаемые операторы для читаемости этого всего, а также сериализация данных в HDF5
  5. Мультиметоды, дженерики, упрощенная работа с памятью, тьюплы, лямбды, менеджер пакетов. Современный язык
  6. Плагин для VSCode с REPL и визуализацией
  7. Графики — 3 разных типа, в т.ч 3D-Веб можно увидеть тут на живом графике z=Sin(x)*Cos(y)


Включиться в работу на Джулии, прочитав базовый туториал, можно примерно за день. Тут Оберон в простоте тоже сильно не выигрывает.
Насколько я помню, у Джулии всё же не вывод типов, а динамическая типизация с опциональной аннотацией типов.
Спасибо за конструктивный отзыв. Похоже, что Julia — перспективный язык, стоит попробовать.

Поясню, что в проекте транслятор загружается в браузер к клиенту. Минимализм Оберона позволил сделать очень «легкий» транслятор, так что во время сборки программы пользователя не происходит обращений к серверу вовсе.

С обработкой ошибок во время выполнения, соглашусь, что в Обероне нет языковых средств для обработки исключений. Это накладывает определённые ограничения на архитектуру проектов, и подобные проверки обычно реализуются явным образом. Также обработка исключений ложится на плечи среды поддержки выполнения. Как в микроконтроллерах есть такая система, которая позволяет после перезапуска программы проанализировать, что произошло: wiki.oberon.org/ob/o7/debug Так и в Блэкбоксе (промышленной open-source среде IDE для Оберона), есть возможность заменить стандартный TRAP диалог системой обработки исключений для продакшн версии программы. В проекте, который я описываю, пока никакой системы обработки исключений не предусмотрено, так что в случае срабатывания исключения (АВОСТ, выход за границу массива и т.п.), программа просто останавливается и сообщает об ошибке. Может быть для образовательных задач — это правильный выбор. Буду анализировать отзывы.
Поясню, что в проекте транслятор загружается в браузер к клиенту. Минимализм Оберона позволил сделать очень «легкий» транслятор, так что во время сборки программы пользователя не происходит обращений к серверу вовсе.
Да, здесь Джулиа легко натаскивает множество пакетов на несколько гигабайт. Но где иначе брать библиотеки? Более менее серьезные задачи без библиотек не напишешь.

Обработка ошибок это не только исключения, это могут быть scope guards, ADT, возврат tuple в конце концов (это наверное допустимо и в Обероне — возврат record).
Впрочем, я натыкался на документ (в вашем же сообществе) и про исключения в Обероне, но вот практической реализации не видел.

Система с Trap вполне допустима, но применяется на практике только в ПЛК (в т.ч.Сименс, Роквелл). Приведенный же пример уступает даже типичному стектрейсу в современных ЯП.

Кстати, про параллельное программирование — возможно, получится в OberonJS реализовать Активности через асинки.
Про серьезные задачи вопрос времени, конечно. Можно и без гигабайтных библиотек.
Вот скажем есть модель, демонстрирующая решения уравнения Шрёдингера.
visual.sfu-kras.ru/ready/264
Да, некоторое время понадобилось, чтобы разобраться с алгоритмами поиска собственных значений и собственных векторов. Я взял реализацию QL-алгоритма из open-source библиотеки Lib для Блэкбокса. А метод прогонки написал сам по книге Калиткина. Зато это была работа в стиле настоящего open source, когда ты берешь кусочек чужого кода, а не чужие библиотеки.
Второй пример, работа с матрицами: visual.sfu-kras.ru/model/95
Алгоритм приведения матрицы к треугольному виду и решения системы методом Гаусса очень простой. Да, надо знать основы математики на уровне первого курса вуза, но опять же это меньше 20 строчек кода.
Про обработку исключений с сделал небольшой пример в Блэкбоксе, как это реализуемо.
forum.oberoncore.ru/viewtopic.php?f=134&t=6536&p=113147#p113147
Средства есть, но будут ли пользоваться. Всё же режим с ранним отловом ошибок и явной проверкой предусловий — более честный что-ли… надо применять лучше парадигму контрактного программирования, чем парадигму отлова исключений выполнения.
антивирусы часто дают ложно-положительные срабатывания

звучит голословненько.
возможно вы не там берёте примеры кода )

Если делать проекты в популярных IDE, то наверное вы реже сталкиваетесь с такой проблемой. Динамическая загрузка модулей в системе Блэкбокс для эвристических алгоритмов выглядит несколько подозрительно, поэтому была серия проблем такого рода для моих приложений. Мы решали вопрос путём загрузки в специальные формы на сайтах антивирусов. Еще цифровой сертификат также решает проблему отчасти, снижая вероятность ложно-положительных срабатываний. Так или иначе — когда код в браузере, распространять приложение намного легче :)
Проблема встречается, если использовать малораспространенные компиляторы. Бывает, даже на хелловорлд ругается, видимо стартап код не нравится.
Звездочка * обозначает экспорт процедуры за пределы области видимости модуля.

О нет только не звёздочка, давайте напишем public или exported, использование лексического шума не очень, тем более что у читающего по диагонали появится подозрение что это как-то связано с указателями.

Ну хоть не регистром первой буквы идентификатора :-)
Стоило уточнить, что это был не сарказм, а так сделано в Go
Звёздочка действительно семантически пересекается с указателями из мира Си языков, есть такой момент. Тут я не мог диктовать какие-то изменения синтаксиса, так как решил взять как есть язык Оберон из академической среды без изменений. Влад Фольц работает наз своим экспериментальным языком Eberon github.com/vladfolts/oberonjs/wiki/Eberon
Там есть ряд полезных изменений, однако звёздочка оставлена как есть.
Спасибо за упоминание Оберона!
«BEGIN END им глаза режут, а public или exported нет»
По поводу антивирусов, подтверждаю. Простой генератор не повторяющихся комбинаций чисел на МОДУЛА 2 (XDS), трактовался антивирусам как «заражённый».
Раз уж мы в хабе «Open source», то стоит отметить, что с недавнего времени XDS версии 2.6 опубликована в открытых исходных кодах под лицензией Apache License 2.0 github.com/excelsior-oss/xds-2.60
XDS ­­— это отечественный оптимизирующий компилятор для Оберона-2 и Модулы-2. Скорее всего я не ошибусь, если скажу, что некоторые коды для спутников связи ГЛОНАСС написаны с применением этого компилятора.
Я очень рад, что наше c Владом начинание кому-то пригодилось :-) Реально демки очень интересные и наглядные. Мне больше всего вот эта понравилась: visual.sfu-kras.ru/ready/241 Аж подзалип немного.
Выглядит странно, так как первый вариант суть верный. И у меня отлично компилируется. А такая ошибка компиляции появляется именно после удаления «Init.»

После удаления "Init." ошибка пропадает.
Ошибка проявляется когда Init. присутствует.

Can not reproduce.

У меня это не воспроизводится. То есть все компилируется нормально без каких-либо фиксов исходника (когда модуль заканчивается на «End Init.»), что логично, так как грамматика Оборона требует именно этого. А вот с фиксом, когда удаляем Init., выскакивает именно обозначенная выше ошибка.

Было бы здорово увидеть в каком случае (браузер и проч) это воспроизводится. И иметь steps to reproduce.

У меня успешная компиляция проходит так: идем на вот эту страничку visual.sfu-kras.ru/model/241 тыкаем Compile. Работает Safari, FF, Chrome

Выполняю всё так же, перехожу на страницу:
https://visual.sfu-kras.ru/model/241
нажимаю compile и получаю ошибку.
Chrome Версия 87.0.4280.88 (Официальная сборка), (64 бит)

А если попробовать в режиме инкогнито?

Спасибо, в инкогнито отрабатывает правильно.

Видимо нужно почистить кэш/куки браузера.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории