Комментарии 92
ЛЕО БРОУДИ «СПОСОБ МЫШЛЕНИЯ — ФОРТ ЯЗЫК И ФИЛОСОФИЯ ДЛЯ РЕШЕНИЯ ЗАДАЧ»
P.S. Картинка СЛОВА — SWAP из первой книги Л.Броуди (авторское видение оформления иллюстраций в книге — там ещё много их интересно представленo)
: BOUNDS ( adr n — adr+n adr ) OVER + SWAP ;
Форт, это, фактически, ассемблер для форт-мащины. На дохлых бытовых компах типа Микрошы он позволял писать код более-менее по-человечески делать для себя DSL и так далее.
Но, он заставлял думать о стеке. Мне вообще непонятно зачем он сейчас нужен.
: Stars CREATE , DOES> @ 0 DO ." *" LOOP ;
5 Stars Cognac
Cognac
Ееее я почти с первого раза это написал!
DSL, в котором нужно постоянно, мать его, думать о стеке. Постоянно. Во всех известных мне языках программирования — к которым применимо понятие локальных переменных — можно заводить локальные переменные функции и не думать о том, в каком именно порядке они лягут в итоге на стек. Но только не в Forth.
А ещё в нём есть тяжкое наследие самой первой платформы, для которой он был сделан: есть только 16-битные числа, а числа с большей битностью как бы и есть, но занимают по две ячейки стека. И у набора слов вроде DUP, DROP, SWAP и ROT есть братья-близнецы DUP2, DROP2, SWAP2 и ROT2. Очень удобно, да. /s
Наличие стеков (в классике их два) в Форт позволяет позволяет бесшовно пропускать данные через цепочку слов, не плодить локальные переменные с коротким сроком жизни (для передачи между словами), и, кроме того, немного их кэшировать в рамках стек(а)|(ов)… При этом, уменьшается и листинг программы.
P.S. Хочется добавить каких то механизмов по «автоматическому» управлению и стеками и его синтаксическому оформлению — ничем не возброняется. Кто хотел, тот и ООП в Форт сделал и много чего ещё.
И, да Форт несколько иной язык программирования и кем то «патологически» не понимаемый по возможностям его применения в практике решения разных задач.
Forth хорошо применим для исследовательских задач, и например в робототехнике…
Как пример: Forth for Artificial Intelligence in Robots
или например, как гибкий уровень хранения каких то моделей т.к. оперирует только базовым понятием СЛОВА, а всё остальное наполнение и построение модели на откупе создателя.
Кстати, на привычке понимания привычного синтаксиса классики программирования на классических языках
«многие» «ломаются», при попытке использования Форт, как инструментария. :) Форт просто ни в каких аспектах не ограничивает мышление при программировании какой то задачи. (но кому то это то и сложно осознать)
И, да стек не единственный элемент Forth языка, чтобы его можно было отнести к понятию — Форт-системы.
Банальность, но забивать микроскопом гвозди — ещё та затея не понимая возможностей микроскопа.
Следующий комментарий смогу написать через сутки от публикации этого. :)
Наличие стеков (в классике их два) в Форт позволяет позволяет бесшовно пропускать данные через цепочку слов, не плодить локальные переменные с коротким сроком жизни (для передачи между словами)
Это да. Вот только чтобы в ней разобраться надо понять что делают слова.
word1 word2 word3
Сравните по семантике с
function1 |> finction2 |> function3
или
method1().method2().method3()
или
function3(function2(function1))
P.S. Хочется добавить каких то механизмов по «автоматическому» управлению и стеками и его синтаксическому оформлению — ничем не возбраняется. Кто хотел, тот и ООП в Форт сделал и много чего ещё.
Мне хочется свои задачи решать, а не писать себе язык, потом для него инструменты.
Объекты мапятся на предметную область более прямо чем стек. Стек это отдельная хрень со своим состоянием, которую очень легко испортить.
Сравните
мама.мыла(раму) мама.мыла(стол) и мама ДУП раму мыла стол мыла
Во втором случае надо думать больше, и помнить что именно сейчас лежит в стеке
Во втором случае надо думать больше, и помнить что именно сейчас лежит в стеке
Это не сложнее, чем помнить приоритет операций.
Сложнее, потому, что приоритет один и тот же, а состояние стека в каждый отдельный момент разное.
А еще в случае ошибки не сразу ясно где она.
Принято писать комментарии про порядок параметров слова, но инструменты соответствие количества параметров и типов не проверяют.
В-общем, мне не очень понятно зачем на этом делать что-то, кроме зобби программирования.
Хотя идея красивая
для определения глобальной переменной
глобальной
Мда, просто невиданный прогресс.
В лямбдах либо явные параметры которые то же самое что и переменные с точки зрения явности зависимости либо картинг, причем с поддержкой типов. Причем ide и типы подсказывают и проверяют.
Не надо следить за состоянием чего-то. Ну может в джаваскрипте каком-то но там ошибка будет раньше и чмтаемее
На самом деле основная претензия к ABAP — дедовский синтаксис из кобола (который потехоньку уходит в прошлое с новыми релизами), хотя большинство тех же ФП языков страдают тем же.
Что касается IDE — сейчас все стало значительно лучше, чем было лет 5 назад, т.к. у языка появилась поддержка в эклипсе, который хоть и морально устарел, но на порядок лучше того редактора, который есть в самом SAP.
А так, если не обращать внимание на синтаксис (а со временем такие вещи перестаешь замечать, просто думаешь о функционале), то ABAP — лучший язык для работы с табличными данными как таковыми, что я видел. Действительно очень хорош для своей области, но не без недостатков, конечно.
Можете привести пример удобства работы с табличными данными в ABAP? Что в нем есть, чего нет в языках общего назначения?
Да много чего, на самом деле. Если помнить, что таблица в ABAP — это массив структур, в них есть:
- удобный механизм сортировок (практически как в SQL, даже более функциональный);
- создание индексов для таблиц в приложении, и работа по ключам этих индексов (похоже на SQL, только в рантайме и с указанием конкретного индекса);
- достаточно удобные циклы по таблицам, со встроенными группировками (то есть можно делать цикл в цикле по сложному условию, это встроено в синтаксис);
- специальный тип (mesh) для древовидных структур данных, где каждая нода — таблица, и различные переходы между нодами по условиям и по путям (в цикле или без);
- несколько типов таблиц (простая (индексный доступ), сортированная (доступ по первичному ключу), хешированная (доступ по ключу), + для первых двух можно строить индекс по вторичному ключу);
- механизмы агрегации, упрощающие подсчет агрегатов по всей структуре строки, не по одному полю;
- в целом таблица и структура (строка) — базовые типы в абапе, и на них много чего построено.
- бонус: недавно завезли возможность выполнения SQL над локальными данными силами сервера приложений.
Может звучать не так уж впечатляюще, но для приложений, очень активно использующих данные из БД, это очень и очень полезный функционал. В других языках мне этого часто очень не хватает.
А я вот сильно удивился, когда увидел интерфейс rfc-функции для передачи бинарных данных: таблица с длиной строки 1022 байта. Почему нельзя передать файл целиком, не дробя, я так и не понял.) В самом abap работа с бинариками также происходит? Или есть байтовые массивы или потоки (которые стримы)?
Можно и blob в базе хранить и работать с ним. Другое дело, что с бинарями в абапе крайне редко приходится работать, но инструментарий есть всякий.
Спасибо за ликбез. Выглядит интересно, но действительно ничего экстраординарного. На других платформах данную функцональность можно получить с помощью библиотек. Например, для C# — Linq to Objects, для Python — pandas. Так что не могу согласиться с тем, что ABAP лучший язык для работы с данными.)
Вопрос не в функционале, а то, что это уже встроено в синтаксис. Можно и на си такое же реализовать, но чисто работать с этим будет очень многословно и неудобно. А тут под это уже все заточено из коробки, вот и все.
многословно и неудобно
var users = new List<User>()
{
new User { Name = "Tom", Age = 33 },
new User { Name = "Bob", Age = 30 },
new User { Name = "Tom", Age = 21 },
new User { Name = "Sam", Age = 43 }
};
var sortedUsers = users.OrderBy(u => u.Name);
Можно пример сортировки на abap?
SORT users BY name.
В целом базовый функционал примерно такой же, как в SQL:
SORT itab BY col1 ASCENDING col2 DESCENDING.
Хотите полный функионал — смотрите доки.
Ради примера, вот кусочек более сложной динамической сортировки оттуда же:
SORT itab BY VALUE abap_sortorder_tab(
( name = 'TABLE_LINE'
descending = SWITCH #( direction
WHEN 'UP' THEN ' '
WHEN 'DOWN' THEN 'X'
ELSE THROW cx_illegal_direction( ) )
astext = 'X ' ) ).
Спасибо за доки. Но в любом современном языке будет все также кратко.
Ну вот сейчас пишу на Go, и там такого даже рядом нет :)
Это язык системного уровня, а никак не язык для написания бизнес логики. На нем хорошо сетевые сервисы и ситемные утилиты писать. При всем этом "golang linq" гуглится на раз.
И тем не менее бизнес-логику на нем тоже пишут.
По поводу go-linq — нужно смотреть бенчмарки, есть предположение, что из-за рефлексии он будет очень медленный. Но спасибо, интересное решение.
По вложенному полю не умеет, насколько помню. Но через вариант в конце комментария с примерами можно что-то придумать.
Статически гарантировать нельзя. Можно заведомо построить таблицу с заданным условием (чтобы были только такие или такие поля), но это уже чисто на плечах разработчика (что довольно плохое решение, протому что код в абапе имеет свойство стихийно меняться разными людьми и разными компаниями на протяжении жизни проекта).
А когда выбора нет, то можно либо соглашаться работать либо искать другую работу. Я краем уха слышал, что кто-то где-то пишет на java для sap, но не в моем случае точно. Я в полном смысле к abap'ерам не отношусь. Так, иногда возникает необходимость что-то подправить.
Так я и пытаюсь понять, ради чего люди страдают? Или может наоборот получают удовольствие? Для меня лично программа на abap выглядит как текст на литературном английском: буквы все знакомые, но глазу зацепится не за что.) Хотелось хотя бы сигнатуры методов научиться быстро читать.)
Откройте какой-нибудь опенсорс проект на абапе и почитайте.
Синтаксис мб непривычный для тех, кто на сиподобных сидит, но сам язык по сути от джавы не сильно отличается.
Из-за самого языка никто не страдает, страдают только из-за закрытости инфраструктуры SAP.
опенсорс проект на абапе
У меня шаблоны рвутся.) Где такие найти? И как их запустить?
Дело не в сиподобном синтаксисе. С тем же питоном таких проблем не возникает.
В том и дело, что от abap есть куда дется. Но приходится принимать оттуда задачи с формулировкой "не реализуемо" или "слишком дорого".)
Так где найти открытый проект на abap? Мне чисто порж… посмотреть.)
Да все на абапе реализуемо, как и на любом другом языке. Мы делали тул для автоматизации регрессионного тестирования, который запускал скрипты на питоне с тестами на селениуме, и потом все это забирал обратно в сап и обрабатывал (например).
Дорого — да, потому что абап разработка — это обычно не работа с нуля, а доработка того, что поставляется самим сапом, и какие-то большие велосипеды проще и быстрее выйдет писать тупо вне экосистемы сап и общаться с сапом по сети. Такова специфика.
Опенсорс — это какие-то либы и подобные инструменты. Проекта с "боевым" кодом вы не найдете, потому что это энтерпрайзный код, который ни одна контора не разрешит опенсорсить.
Понятно, что все реализуемо, вопрос каких сил и средств это потребовало? Какая задача решалась непосредственно на abap? Запуск внешнего скрипта и закачка файлов?
Дорого не потому, что доработка, а потому что просто дорого, за любой чих надо платить, либо чихать в другую сторону.)
Думаю, что даже при наличии разрешения за пределами конкретной конторы энтерпрайзный код никому не будет нужен, так как реализует специфику конкретного предприятия.
Но я бы не сказал, что у Форта были на такой задаче какие-то особые преимущества. Писать было так же неудобно, как и на С. Особенно на Windows 95, когда любая серьезная ошибка портила систему и нужно было перезагружаться.
Писать под браузеры при всей из запутанности куда приятнее.
Единственно что не очень было, то что интерфейс нужно было писать вручную на отдельном языке DCL и подключать своеобразно… там три языка нужно было одновременно вроде… После на C# переехал как в новую реальность — всё же не ценим мы удобство и комфорт Visual Studio, как должное воспринимаем…
#даннинг-крюгер
Если уж затронули ABAP и X++, то почему обошли стороной 1С? Как человек, который сталкивался и с абапом и с иксами, могу сказать, что 1с просто самый неудобный из них.
Язык не мертв, используется в текущих вершиях MS Dynamics 365 for Finance and Operations.
Раньше всё было действительно плохо, подсветку синтаксиса нам выдали в 2010-м, а в 2015-м стало можно фигачить прямо в Visual Studio. Правда в 2020-м так и сидим в VS2015 :) но последние релизы уже поддерживают VS2017
Что-то программисты совсем изнежились. И код нечитаем, и язык плохой, и поддержки нет… Проблема не в языке и коде, а проблема в нас, в человеках. Получили как-то С код от заказчика, функция main с кейсом на 5000строк, 19 вложенных свичей и более ста глобальных переменных с именами ал-я a1, a2, tmp1, tmp2, tmp3 и тп. Чтобы что-то сделать надо проинициализировать магическими числами кучу переменных, тогда пара десятков тредов работающих в бекграунде сделают что-нибудь. И ничего травм не было, посмеялись, даже частично заставили работать… и выкинули. :)
Или теже records которые появились только в C#9, в X++ были изначально. Хотя конечно по кол-ву возможных вариантов использования и сложности C# впереди
Наверное все же дело понимании каждого языка:)
Когда работал в одном холдинге — в 2008 году до кризиса программистов под SAP (ABAP, модули не знаю) нанимали, за 250-300к в среднем. В 2008 году!
А сейчас гуглёж выдал вилку 130-200к.
Действительно всё настолько хуже стало или просто узкая тема, с ходу адекватную ЗП не нагуглишь?
В форте стековой машиной создается дополнительная ненужная ментальная нагрузка на программиста. Вы рассматривали использование других скриптовых языков типа lua?
дополнительная ненужная ментальная нагрузка на программист
Несущественная.
… Язык X++. Это внутренний ЯП Microsoft, который они сделали..
Этот язык сделали датские братья Дамгаард из Damgaard Company в 1998.
На мой взгляд — это лучший язык для решения бизнес-задач.
Дело не только в языке, но и в самой платформе. То что на C# или Java придется делать неделями — на ABAP сделаешь за день.
А про «убогость» инструментов разработчика — ну для меня InteliJ IDEA убогий или Eclipse. Тут чистая вкусовщина.
Ну например, как Вам — не нужно писать юнит-тесты на компоненты разработки — платформа проверяет исходный код, интерфейсы, SQL, API для сервисов на соответствие между определением и обработчиком. И не даст такой код запустить автоматически и перенести его на другой сервер.
Или встроенный инструмент CI/CD из коробки — когда можно связать ландшафт разработки в течении 10 минут и начинать проект сразу после startup-meeting.
В общем, я реализую проекты на C# (.net и core 2.x), Java EE (FP) (от 1.8 до 15), C/C++, PHP, ABAP/4 (от 4.7 до S/4), JS/TS (от создания UI-Frameworks до полноценных решений на AngularJS/React) и мне есть с чем сравнивать. Могу сказать следующее — если нужно быстро реализовать бизнес-процесс, группу бизнес-процессов — то при наличии SAP Netweaver AS — я выберу именно эту платформу. Остальные решения — или вынесение UI в DMZ (например на Node.JS+nginx) или библиотеки расширения и интеграции для SAP AS.
Как не странно это и дешевле и быстрее и поддержка лучше и стабильность выше.
А для «модных» разрабов добавлю — наконец связка Kuber+Docker начала приближаться по функциональности к возможностям SAP Application Server.
А для J2EE выберу лучше или Websphere или WildFly )))
Заменить… доехать едут… на программировать программируют в предыдущем абзаце.
Пример 5 выполнение музыкального нажатия клавиш.
\ начало текста
\ Выполнение музыкального нажатия клавиш
\ подключение функций системы для формирования звуковых колебаний, т.е. генерации сигналов.
WINAPI: MessageBeep USER32.DLL ( пищание системного динамика )
WINAPI: Beep KERNEL32.DLL ( ФУНКЦИЯ т-МС F-ГЦ — )
: ZWUK ( Т-мс F-гц — ) Beep DROP;
DECIMAL
: MAIN ( основное слово выполняется постоянно в цикле, а для выхода останов до нажатия клавиши на клавиатуре )
CR S" Для выхода из программы нажать клавишу ПРОБЕЛЛ, для продолжения любую другую " ANSI>OEM TYPE
1 ( K — )
BEGIN
0x10 * 100 SWAP
2DUP.. ZWUK
KEY DUP 0x20 = UNTIL ( ПРОВЕРКА НАЖАТИЯ КЛАВИШИ, ЕСЛИ НАЖАЛИ 1 ТО КОД СОВПАЛ И ВЫХОДИМ )
;
\ подготавливаем переменные и текст программы записываем в исполняемый файл.
0 TO SPF-INIT? ( в переменную записываем код 0 – означает что инициализация выполняется )
' NOOP MAINX! ( в переменную записываем адрес выхода )
' MAIN TO ( в переменную записываем старт программы со слова MAIN )
S" test2.exe" SAVE ( сохраняем файл исполнения с именем test2.exe )
BYE ( выходим из режима редактирования и компиляция, т.е. все бай-бай )
\ текст программы окончен.
Пример 6 при нажатии клавиш перейти и открыть заданные web страницы.
\ начало текста
\ При нажатии клавиш перейти — открыть заданные web страницы
5 CONSTANT SW_SHOW
WINAPI: ShellExecuteA shell32.dll
: START_link_clik_V2 ( An n — PZout — выход да или нет )
\ на входе адр выполнения сайта
DROP
SW_SHOW ( =5 )
0 0 ( An K1 K2 K3 — ) 3 ROLL
( K1 K2 K3 An — )
S" open" DROP 0 ShellExecuteA ( pz- — )
;
: START_S ( An n — )
START_link_clik_V2 ( An n — PZout — выход да или нет ) DROP
;
: ST1 S" www.yandex.ru" START_S ( An n — );
: ST2 S" www.rambler.ru" START_S ( An n — );
: ST3 S" te.sibsutis.ru" START_S ( An n — );
: MAIN ( основное слово выполняется постоянно в цикле, а для выхода останов до нажатия клавиши на клавиатуре )
CR S" Для выхода из программы нажать клавишу ESC, для продолжения любую другую " ANSI>OEM TYPE
CR S" клавиша 1 — перейти на yandex " ANSI>OEM TYPE
CR S" клавиша 2 — перейти на rambler " ANSI>OEM TYPE
CR S" клавиша 3 — перейти сайт кафедры ТЭ СибГУТИ " ANSI>OEM TYPE
CR
0
BEGIN
DUP [CHAR] 1 = IF ST1 THEN
DUP [CHAR] 2 = IF ST2 THEN
DUP [CHAR] 3 = IF ST3 THEN
DROP
KEY DUP 0x1B = UNTIL ( ПРОВЕРКА НАЖАТИЯ КЛАВИШИ, ЕСЛИ НАЖАЛИ 1 ТО КОД СОВПАЛ И ВЫХОДИМ )
;
\ подготавливаем переменные и текст программы записываем в исполняемый файл.
0 TO SPF-INIT? ( в переменную записываем код 0 – означает что инициализация выполняется )
' NOOP MAINX! ( в переменную записываем адрес выхода )
' MAIN TO ( в переменную записываем старт программы со слова MAIN )
S" test2.exe" SAVE ( сохраняем файл исполнения с именем test2.exe )
BYE ( выходим из режима редактирования и компиляция, т.е. все бай-бай )
\ текст программы окончен.
Что за X++? Что за ABAP? Древние языки, про которые интересно слушать, но не дай бог на них писать