Scala erp: В поисках идеальной ERP системы. Сильные и слабые стороны iScala — О системах планирования ресурсов предприятия Scala, iScala
В поисках идеальной ERP системы. Сильные и слабые стороны iScala — О системах планирования ресурсов предприятия Scala, iScala
Вчера разговаривал с потенциальным клиентом. Один из вопросов был: «а какие у iScala сильные и слабые стороны?». Трудный вопрос. Не потому, что он трудный сам по себе, а потому что не может быть просто сильных или слабых сторон у любой системы, сильные или слабые стороны могут быть только в сравнении с чем-то другим, с какой-то другой системой. В России всегда всё сравнивают с системой, название которой состоит из одной цифры и одной буквы (не хочу произносить это вслух). У неё более миллиона инсталляций и по распространённости ничто не может с ней сравниться. Но я не являюсь специалистом по этой программе, хоть и имею некоторое представление, а потому попытаюсь порассуждать о сильных и слабых сторонах iScala исходя из собственных представлений о том, что есть хорошо и что есть «не очень». Разумеется, это мой личный субъективный взгляд.
Начнём с того, что каждый видит идеальную систему по-своему. Как вам вот такой взгляд (попытка всё разместить на одном экране)?
Наверное для этой системы идеальной клавиатурой будет вот такая:
А если серьёзно, то это образец худших практик в области программирования и дизайна программ. Хотя кому-то, возможно, очень нравится 🙂
Сильные стороны:
Самой сильной стороной iScala, на мой взгляд, является то, что это параметрически настраиваемая система. Что это такое достаточно подробно описано в моей статье «Путь в тупик» или «Так ли дёшева самописная интегрированная система управления предприятием?»
Если кратко, то параметрически настраиваемые – это системы настраиваемые с помощью параметров. Эти параметры могут быть «Глобальными» или относиться к одному отдельно взятому филиалу и/или отдельному финансовому году. Параметры могут быть независимыми или взаимозависимыми, когда действие одного параметра может менять действие другого параметра. Количество этих параметров в зависимости от используемой функциональности может измеряться сотнями и даже тысячами, а их настройка должна выполняться самыми опытными сотрудниками и/или консультантами по внедрению системы, простой пользователь не должен уметь это делать.
В противоположность первым, программируемые системы подстраиваются под требования бизнеса не посредством правильного ответа на вопрос-параметр, а «дописыванием» программного кода
Теперь чуть подробнее о параметрически настраиваемых системах:
Плюсы: Универсальность: Наличие поддержки со стороны поставщика программного продукта, возможность пользования услугами службы поддержки «Горячая линия», масштабируемость, лёгкость обновлений версий, небольшое время, которое должен затратить «внешний» консультант, чтобы разобраться, как именно должна работать Ваша система.
Минусы: Недостаток гибкости: Если нельзя сделать «в лоб», приходится придумывать обходные пути. Из-за необходимости системы при работе проверять большое количество параметров, быстродействие может быть ниже, чем у «программируемой» системы.
Примечание: На мой взгляд, плюсы такого подхода намного существеннее минусов
Что даёт такой подход? А даёт он очень важную вещь: Универсальность. Настроив систему под свои нужды с помощью набора параметров, Вы можете быть уверены в том, что, обратившись по телефону к консультанту «Горячей линии», он должен Вам помочь. А установка новой версии параметрически настраиваемой системы не приводит к необходимости полностью переписывать всё то, что было «нажито непосильным трудом» (программистов).
Разумеется, всегда имеется и оборотная сторона медали: меньшая гибкость
В современных версиях iScala имеется большой спектр дополнительных возможностей увеличить эту гибкость: механизм интеграции с другими системами или внутри самой iScala, называемый Epicor Service Connect, который может работать с участием или без участия пользователя, возможность использовать встроенный язык программирования VBA (в редких случаях, когда без этого совсем никак не обойтись), так называемые «быстрые поиски» и другое.
Второе важное преимущество iScala — открытость к лучшим технологиям: использование всех возможностей сервера баз данных Microsoft SQL Server, включая лучшее, на мой взгляд, средство построения отчётности MS SQL Server Reporting Services. Если в российских бухгалтерских программах часто используются собственные форматы хранения информации, а для построения отчётов нужно пользоваться «внутренними» инструментами, как и для их просмотра обязательно нужно «входить» в систему, то при создании отчётов на базе информации из iScala можно пользоваться широко распространёнными инструментами, а для просмотра отчётов не обязательно быть пользователем системы. Так, например, в компании ООО «СоюзБалтКомплект», где я работал директором по ИТ с 2004 по 2009 годы пользователями iScala были около 75 человек, тогда как отчёты кроме этих 75 пользователей могли просматривать еще около 150 человек, которые даже не знали, как выглядит iScala. Отчёты можно запускать по расписанию и получать по электронной почте.
Третье преимущество — протоколирование изменений и невозможность бесследно удалить введённые документы и проводки
В частности, если вы ввели счёт-фактуру покупателю (и/или оправили бухгалтерскую проводку в Главную Книгу), то вы не можете её удалить, только ввести исправительный счёт-фактуру (или проводку). Возможно, бухгалтера, привыкшие всё «подчищать», так, чтобы «не оставалось никаких следов», скажут, что это не преимущество, а недостаток, но я с этим не соглашусь, т.к. возможность скрывать сделанные изменения часто приводит к злоупотреблениям и/или хищениям.
Четвёртое — сквозное движение информации и распределение обязанностей. Информация в системе движется от одного человека к другому. Начинает вводить один человек, например, сотрудник отдела сбыта, на ее основе продолжает работу другой человек, например, сотрудник производственного отдела, далее подхватывает третий, сотрудник отдела снабжения. Затем — кладовщик, принимая материалы на склад, далее — бухгалтер, вводя счета-фактуры на закупленные материалы и транспортные расходы с привязкой к конкретной закупке и т.п. И снова — производство, сбыт и т.д. И каждый из них должен обеспечить определенную степень подробности, необходимую тем, кто является получателем информации, будь то сотрудник, стоящий следующим в цепочке ее движения, или руководитель, ее конечный получатель, а система с помощью сделанных настроек делает так, что по результатам работы кладовщика, который понятия не имеет о бухгалтерских счетах, создаются правильные бухгалтерские проводки по складу. В последних версиях iScala появились мобильные приложения, которые позволяют сотрудникам склада использовать смартфон и встроенную в него фотокамеру, чтобы сканировать штрих-коды и совершать действия в системе не отходя от полки с товаром. А руководитель может утвердить заявку на закупку со своего смартфона прямо из салона автомобиля.
А ещё iScala работает на 30 языках во многих странах мира 🙂
Слабые стороны, разве может их не быть?
Самая серьезная слабая сторона — отсутствие достаточного количества потенциальных сотрудников со знанием iScala. В России все бухгалтера умеют работать с программой (не будем называть её название) и ничтожно малое их количество умеют работать с iScala.
Кроме этого по мнению пользователей: «такая дорогая программа, в неё ещё и данные нужно вводить?!!!» 🙂 Да, в iScala нужно вводить данные (за исключением данных, поступающих с помощью механизма Epicor Service Connect), в неё не встроен искусственный интеллект. А пользователь вносящий данные должен быть адекватным и понимать, что он делает, а не просто махать сканером штрих-кодов «направо и налево». Новому сотруднику желательно пройти внутреннее обучение в рамках процедур вступления в должность.
Компаниям, использующим iScala, желательно иметь собственного администратора системы. Это не обязательно, но крайне желательно.
Она не умеет варить кофе и делать бутерброды 🙂
В индивидуальных случаях у некоторых пользователей может быть аллергия на отдельные компоненты системы из-за предвзятого отношения и нежелания принимать всё, что выглядит иначе, чем он привык 🙂
ERP на СКАЛА-Р – тестируем производительность связки SAP и Oracle Database / Хабр
Небольшое вступление
Мы в IBS хотели выйти на Хабр еще с тех времен, когда компьютеры выглядели как на этой картинке. Но постоянно чего-то не хватало: то, времени, то экспертов, то интересных сюжетов. Наконец-то все совпало и мы запускаем свой блог – в основном о внутрянке нашей тестовой лаборатории (IBS InterLab), где разрабатываются ит-инфраструктурные решения и тестируются технологии для клиентов, плюс немного по другим направлениям корпоративных ИТ. Писать будем редко, во всяком случае этим летом, но постараемся выдавать максимально полезный материал. Спасибо.
Поехали
Сегодня, наверное, практически весь крупный бизнес так или иначе работает с ERP или другими тяжелыми бизнес-приложениями. Естественно, со временем возникает необходимость переезда на виртуальные машины. Решать эту задачу с наскока – дело опасное, так как по ходу всегда вылезает целый мешок сюрпризов, каждый из которых вполне может обернуться полным провалом проекта. Чтобы такого не случалось, команда IBS InterLab занимается тестированием различных технологий под задачи клиента, и в рамках таких исследований нам удалось получить результаты, которые могут оказаться интересными и полезными.
С чего все началось?
Под задачи одного из заказчиков мы делали сравнительное тестирование производительности тандемов SAP + Oracle Database и SAP + HANA. Мы преследовали несколько целей: выяснить особенности поведения новой для российского рынка СУБД HANA и посмотреть возможности работы сертифицированного под HANA вычислительного комплекса от Huawei (об этом мы еще обязательно расскажем отдельно).
Однако жизнь – штука динамичная, и очень скоро (по меркам вселенной, да и НТП тоже) «на горизонте» появился разработанный в IBS универсальный конвергентный комплекс СКАЛА-Р. И хотя отработать специальные сложные тесты мы не успевали (но обязательно сделаем это в ближайшее время), оценить его реальные возможности при работе в боевых условиях, просто чесались руки. Важно было не просто проверить «работает/не работает» – в том, что работает, мы на 100% были уверены.
Хотелось сравнить производительность с каким-то известным продуктом. Поэтому приняли решение продолжить тестирование связки SAP + Oracle на нашей платформе, чтобы сравнивать с уже произведенным ранее тестом связки на VMWare.
Вводные данные
Тестовый комплекс, использовавшийся ранее, был реализован в облаке, что только увеличивало зуд в наших руках, поскольку несколько упрощало сравнение. Итак, в облаке СКАЛА-Р была создана идентичная виртуальная машина, отличавшаяся только тем, что если предыдущая была реализована с использованием другого гипервизора, то в данном тестировании применялся гипервизор от компании Parallels. К этой виртуальной машине был подключен LUN, собранный на дисковом массиве с использованием ПО Raidix. И именно с последним, а точнее с его масштабированием, у нас возникли определенные сложности: требовалось соотнести производительность дисковых подсистем – использовавшейся ранее и входящей в состав СКАЛА-Р.
Данную задачу мы решили путем сравнения прямых измерений производительности в IOPs. Получилось, что в первоначальном тесте реальная производительность виртуальной дисковой подсистемы составляла 1500 IOPs, а измеренная производительность выделенной LUN в СКАЛА-Р составила 1900 IOPs по IOMeter, что практически достигало теоретических 1998 IOPs, рассчитанных с помощью калькулятора. При этом для полноты картины нельзя не отметить, что результата 1900 IOPs нам удалось достичь только после существенного увеличения размера тестовых данных, так как на маленьких объемах слишком ударно работал кэш дискового массива, и мы получали запредельные 37100 IOPs.
Вот примерно с таким пониманием соотношения аппаратных ресурсов мы и приступили к тестированию. Но опять же, нельзя не отметить, что СУБД в тестах использовалась небольшая (немного меньше 1 Гб), что предопределило активное влияние кэша на результаты тестов.
Процесс испытаний
В ходе тестирования были выполнены прогоны трех десятков различного рода запросов, реализованных как через программу, написанную на ABAP, так и через стандартный функционал SAP R/3.
- Первая группа тестов. Здесь мы использовали 2-3 таблицы с большим количеством записей и полей в них (около 100), из которых делались выборки нескольких направлений. При этом критерии фильтрации подбирались таким образом, чтобы в несколько раз изменять количество возвращаемых записей для разных тестов:
- Выборка отдельных полей базы данных (строки 1 и 3). Выбиралось 3 поля, дальше условиями фильтрации обеспечивалось возвращение большого объема записей (несколько сот тысяч) или малого.
- Выборка всех полей записи (строки 2 и 4) из той же таблицы. Условия фильтрации оставались аналогичными.
- Выборка всех полей записи (строки 5-7, 13, 15, 17) из той же таблицы. Фильтрация осуществлялась по ключевому и не ключевому полям.
- Выборка одного поля записи (строки 8-12, 14, 16, 18) из той же таблицы. Фильтрация осуществлялась так же – по ключевому и не ключевому полям.
- Вторая группа тестов. В этом случае для строк 19-21 использовались запросы агрегированного типа, то есть подразумевающие выполнение агрегационных операций: по полю «величина проводки» при группировке записей по балансовым единицам и валюте проводки подсчитывалась сумма. Данная задача была включена в программу тестирования, поскольку HANA позиционируется как система, оптимизированная для аналитических приложений (а именно, для выполнения агрегационных запросов).
- Третья группа тестов. Следующий раунд испытаний включал выполнение выборок без фильтрации (строки 22-25), которые осуществлялись с использованием встроенного в SAP инструмента (просмотр содержимого таблицы – транзакция SE16), позволяющего просматривать содержимое таблиц. При этом устанавливалось максимальное для этой утилиты ограничение по количеству возвращаемых записей – 50 000.
- Четвертая группа тестов. Последними выполнялись синтетические тесты, являющиеся частью стандартной функциональности SAP R/3 (строки 26-29) и экстракторы данных собственной разработки для системы аналитической отчетности SAP BW (строки 30-34), обеспечивающие импорт данных из R/3 в BW. Экстракторы брали данные по заданным критериям: в основном периоды, за которые надо выбирать документы.
Каждый тест выполнялся по два раза, чтобы оценить уровни работы кэша. По их результатам стало очевидно, что при первой операции все данные считываются с системы хранения данных, а при втором выполнении работу оптимизируют механизмы кэширования. При этом, чтобы исключить влияние кэша сервера Oracle, перед проведением теста нового типа мы его обнуляли.
А теперь то, для чего все затевалось, – результаты тестов. По идее, никаких специальных пояснений к ним не требуется, поскольку все наглядно представлено в таблицах. Но если у вас появятся какие-либо вопросы, вы всегда можете задать их в комментариях, а мы оперативно и развернуто ответим. Итак, смотрим.
Подводим итоги
Так как на абсолютную научную точность мы не претендовали, то и выводы будем делать в достаточно свободной форме:
- Во-первых, весьма четко видно, как работает программный кэш Oracle: достаточно единственного прогона, чтобы время на выполнение операции существенно сократилось. Это можно отнести к преимуществам Oracle.
- Во-вторых, примерно одинаковым оказывается количество времени, затраченное на выполнение каждого первого теста, и практически эквивалентным – соотношение производительности дисковых подсистем (1500IOPs/1900IOPs). При этом нельзя не отметить, что при последующем выполнении однотипных тестов на СКАЛА-Р результаты улучшаются, что объясняется включением в работу кэша дискового массива, который в прошлых тестах, видимо, немного филонил.
- В-третьих, будем максимально беспристрастными и объективными, но все же при этом отметим, что наша СКАЛА-Р очень неплохо справилась с задачей поддержки ERP. Нами получены вполне адекватные результаты на платформе, обладающей конкурентным функционалом, но с заметно меньшей стоимостью по сравнению с привычными решениями на гипервизорах и дисковых массивах от известных производителей. При том, что для чистоты эксперимента было принято решение проводить тест на настройках «по умолчанию».
Если вам есть, что добавить, спросить, возразить или, так сказать, внести в нашу «книгу жалоб и предложений», будем рады продолжить дискуссию в комментариях.
Над постом работали эксперты: Александр Сашурин и Александр Игнатьев при деятельном соучастии Андрея Сунгурова.
Спасибо им.
Команда IBS Interlab.
Scala дополнит свои ERP-системы CRM-решениями, предлагаемыми Microsoft Business Solutions
Scala приступает к разработке iScala CRM с тем, чтобы предлагать новый продукт как часть своей разносторонней ERP-системыМосква, 22 июля 2003 года. Представительство компании Scala Business Solutions, всемирно известного разработчика и поставщика программного обеспечения по управлению бизнесом класса ERP-II для местных и международных компаний, распространило сегодня информацию о подписании нового соглашения о расширения ПО, предлагаемого подразделением Microsoft Business Solutions CRM (Microsoft CRM), и его интеграции с разносторонней ERP-системой iScala®. Ожидается, что соглашение будет подписано в сентябре. Обе компании будут совместно разрабатывать CRM-решение Microsoft для включения его в коммерческую версию компании Scala – iScala CRM, нового продукта, который Scala будет предлагать своим международным и локальным клиентам как часть разносторонней ERP-системы в качестве интегрированного решения для предприятий. В iScala CRM функциональные возможности ERP-системы Scala будут дополнены новыми функциями, удовлетворяющими требованиям клиентов, ведущих свой бизнес более, чем в 140 странах мира. Среди этих функций, такие как возможность работы с разными валютами, международный расчет налогов (НДС), а также управление интеллектуальными ресурсами предприятия.Продукт iScala CRM будет предлагаться как часть разносторонней ERP-системы iScala, который также может быть интегрирован с другими ERP-системами. Это позволит обеспечить более простую интеграцию и усовершенствовать архитектуру web-сервисов на платформе iScala. Дата выпуска iScala CRM будет объявлена позднее в этом году.iScala CRM позволит компании Scala удовлетворить растущий спрос ее клиентов на расширение состава бизнес-функций. Scala рассчитывает, что новое предложение заинтересует многих из уже существующих клиентов; сначала оно будет предложено на главных европейских рынках, а также в России и Китае – рынках, на которых позиции Scala традиционно сильны. Scala рассчитывает, что к 2005 году iScala CRM даст до 20% дополнительной прибыли к годовому доходу. Компания Scala рассматривает возможности расширения своих рынков, рассчитывая на компании, которые хотели бы получить подобное интегрированное решение, но откладывали его приобретение из-за высокой цены других предложений. Кроме того, этот новой продукт позволит компании Scala предлагать iScala CRM на некоторых вертикальных рынках, для которых iScala имеет особенно развитые возможности, например, таких как строительное оборудование, фармацевтическая и пищевая промышленность, производство напитков.“Мы считаем, что iScala CRM отлично подходит для европейских компаний среднего размера, а также для филиалов крупных предприятий, которым необходимо оптимальное по стоимости интегрированное решение, — говорит Андреас Кеми (Andreas Kemi), временный CEO Scala Business Solutions. — Это еще больше укрепит отношения между Scala и Microsoft, и мы рады расширению нашего сотрудничества с Microsoft и укреплению наших позиций на рынке.”“Программное обеспечение, которое мы разрабатываем, работает только на платформе Microsoft,— сказал Кеми. — Выбор Microsoft в качестве партнера для разработки CRM-решения стал для нас логичным продолжением наших отношений.” Кеми добавил, что стабильность корпорации Microsoft, ее глобальное присутствие и коллаборативный (интегрированный) подход к совместной разработке стали ключевыми факторами при выборе в качестве партнера именно Microsoft, а не какого-либо другого поставщика CRM-решений. В качестве подготовки к продвижению на рынке Scala создала специальную группу в рамках всей компании, включая такие направления как разработка продуктов, менеджмент, продажи, маркетинг и ресурсы поддержки. Возглавляемая Наташей Стольной, директором по продукту iScala CRM, эта группа будет тесно сотрудничать с командой Microsoft CRM, а также с ключевыми заказчиками Scala на всех стадиях – с самого начала до выпуска коммерческих релизов продуктов. “Новый этап отношений со Scala и ее обширная база клиентов позволят нам расширить рынок CRM-решений Microsoft,— сказал Тэчер (David Thacher), генеральный менеджер по CRM-решениям, Microsoft Business Solutions. — Обширный опыт компании Scala в области решений для бизнеса прекрасно сочетается с нашими наработками, и мы рады, что теперь она сможет расширить наши CRM-решения и поставлять их пользователям ERP-систем по всему миру.” Укрепление отношений с Microsoft позволит компании Scala выполнить свою задачу, суть которой – поставка ERP и CRM-решений клиентам, независимо от того, где те ведут свой бизнес. В настоящее время Scala поставляет свое программное обеспечение и услуги более, чем в 140 стран и более, чем на 30 языках. Разрабатывая iScala CRM, Scala планирует сфокусировать свои ресурсы по исследованиям и разработкам на функциональных возможностях для ведения бизнеса. “Мы верим, что это правильный подход; чем выше функциональные возможности ERP-системы, тем проще осуществляется интеграция и достигается связность, — сказал Kemi. “Это предложение предоставляет нам прекрасные возможности расширения рынка, что даст новые преимущества как нам, так и Microsoft.” О компании Scala Business SolutionsКомпания Scala Business Solutions создает разностороннее (Collaborative) программное обеспечение для планирования ресурсов предприятий (ERP), в котором интегрированы технологии Интернет с традиционными возможностями систем ERP, что позволяет упростить ведение глобального бизнеса. Благодаря ПО Scala, глобальные компании могут полностью интегрировать все свои ERP-системы по всему миру, будь то дочерние компании, подразделения или головные офисы, а также включить в эту объединенную систему своих партнеров и поставщиков. Разностороннее программное обеспечение Scala ERP позволяет глобальным компаниям удовлетворить требования, предъявляемые к передовым системам э-бизнеса, а также использовать стандартный ERP-продукт для управления традиционными бизнес-процессами. Это позволяет добиться ощутимых преимуществ от использования электронной торговли, создания частного или глобального торгового портала или оптимизации цепочки поставок.Используя офисы в Европе, Северной Америке и на Дальнем Востоке, а также сеть своих партнеров и дилеров, Scala поставляет программное обеспечение и услуги в более чем 100 странах, предлагая свое ПО в более чем 30 языковых версиях.Компания Scala представлена на амстердамской фондовой бирже Euronext (symbol: SCALA). Доход компании в 2002 составил $73.4 миллиона.Для получения дополнительной информации, включая пресс-релизы, сведения для инвесторов и информацию о продуктах, посетите сайт компании Scala по адресу http://www.scala.net.© 2003 Scala Business Solutions, NV. Авторские права защищены. Логотип Scala, названия Scala® и iScala® являются зарегистрированными торговыми марками. Иные торговые марки или зарегистрированные торговые марки являются собственностью их владельцев.Для получения более подробной информации обращайтесь к Марии Третьяковой, координатору по маркетингу компании Scala:Тел: (095) 799-5666E-mail: [email protected]
Релиз опубликован: 2003-07-22
Данный материал является частной записью члена сообщества Club.CNews.
Редакция CNews не несет ответственности за его содержание.
Впервые в мире Scala выпускает специализированную разностороннюю ERP-платформу
ПРЕСС-РЕЛИЗ
Компания Scala Business Solutions готова фундаментально изменить бизнесс-процессы, благодаря подлинному сотрудничеству в реальном времени
Москва, 11 июня 2002 г. Российское представительство компании Scala Business Solutions, всемирно известного разработчика и поставщика программного обеспечения по управлению бизнесом, финансами, производством для местных и международных компаний, провело сегодня пресс-конференцию, на которой объявило о коммерческом запуске единственной доступной сегодня специализированной разносторонней ERP-системы. Два с половиной года назад компания приступила к переработке своего программного обеспечения для планирования ресурсов предприятия и созданию новой платформы, специально предназначенной для эффективного взаимодействия в реальном времени. Теперь Scala объединила в одном стандартном программном пакете все необходимые функциональные возможности. Это означает, что предприятие может плодотворно сотрудничать со своими филиалами, клиентами, партнерами и поставщиками.
Важность данного события подчеркивал тот факт, на что пресс-конференции присутствовали ведущие менеджеры компании Scala Business Solutions — Майк Бардетт (Mike Burdett), СЕО компании Scala, и Сергей Шведов, Вице-президент Центра исследований и разработок Scala“Коммерческий запуск специализированной разносторонней ERP-системы знаменует эволюционный переход от линейки наших основных продуктов к платформе будущего – iScala, — говорит Майк Бардетт (Mike Burdett), СЕО компании Scala. — Мы создали новую платформу, и теперь предлагаем пока единственную на рынке специализированную систему, которая, в том числе, позволит автоматизировать бизнесс-процессы между компаниями. Другие производители просто приклеивают ярлыки так называемых разносторонних возможностей к своим старым продуктам, что есть ни что иное, как новое название стандартных возможностей е-бизнеса. Scala выигрывает конкурентную борьбу, благодаря своим рентабельным платформам для разносторонних ERP-систем, готовым к развертыванию по всему миру, и это результат нашего нового подхода к разработке продуктов, принятого нами два с половиной года назад. То, чего мы достигли сейчас, положительно и на долгое время повлияет на сложность и скорость ведения глобального бизнеса.”Г-н Бардетт добавил, что успешные стандартные ERP-продукты Scala будут по-прежнему продаваться и поддерживаться. “Наши клиенты, которые хотят перейти от Scala 5.1 к iScala 2.1 смогут воспользоваться преимуществами стандартного апгрейда и набором средств для конверсии, что сделает такой переход относительно простым,” — сказал он.Нужды рынкаПакет ERP-программ iScala – это не просто продукт, это стиль работы. Майк Бардетт отметил, что такой стиль работы играет важную роль в современных тенденциях, направленных на консолидацию производства. “За последнее время на рынке произошло много изменений, которые мы считаем благоприятными, — сказал он. — Благодаря нашему новому продукту и нашей уникальной позиции на рынке, что подтверждается нашими клиентами, Scala обладает всеми возможностями для того, чтобы с успехом предоставлять клиентам все, что им нужно для упрощения ведения бизнеса.” С введением подлинного сотрудничества новая технология сократит расходы на координацию бизнеса – это то, чего достигла Scala с выпуском iScala 2.1. Компании получат четкое видение всей цепочки поставок, что поможет покончить с избыточными складскими помещениями и недозагруженным транспортом. iScala создана для того, чтобы сделать подлинное сотрудничество реальностью простым и понятным путем. ПродуктiScala 2.1 включает два продукта – iScala Business Server и iScala Enterprise Server. iScala Business Server — это продукт начального уровня, предназначенный для небольших предприятий, которым требуются все возможности планирования ресурсов предприятия для автоматизации бизнес-процессов, распространяемые на все приложения, а также системы заказчиков и поставщиков. iScala Enterprise Server обеспечивает масштабируемость, а также централизацию бизнес-процессов крупных компаний. Кроме того, есть еще iScala Developer – среда разработки, позволяющая модифицировать базовый продукт iScala для удовлетворения специфических требований заказчика. Новая архитектура также означает, что iScala готова к поддержке web-сервиса, и доступ к ней может быть осуществлен с любого устройства. “Многие другие поставщики утверждают, что они поставляют ERP-системы, которые могут быть подключены к другим приложениям и даже поддерживать web-сервисы, — отмечает Сергей Шведов, старший вице-президент Центра исследований и разработок Scala. — Но в реальности они просто «обертывают» Интернет-технологиями традиционные ERP-системы. Такой подход имеет много ограничений и не рассчитан на длительную эксплуатацию. Вам постоянно придется переписывать программное обеспечение, чтобы соответствовать требованиям мира, объединенного в Сеть. Соответствие этим требованиям – это и есть именно то, чего мы достигли с помощью iScala 2.1.”На протяжении последних двух с половиной лет Scala тесно сотрудничала со своими клиентами, чтобы создать разностороннюю ERP-систему, которая позволит стандартизовать бизнес-процессы во всех компаниях, входящих в цепочку поставок, обеспечит надежную базу для создания корпоративных порталов и будет готова к интеграции с другим программным обеспечением, например, таким как SAP. «Мы убеждены, что достигли нашей главной цели – создание истинно глобального продукта – продукта, который обладает прекрасными функциональными возможностями для ведения бизнеса более, чем в 140 странах, и в стандартном коммерческом исполнении поддерживает 24 языковые версии и многие международные и местные стандарты ведения бухгалтерского учета, используемые по всему миру, — сказал Сергей Шведов. — iScala – это платформа для будущего, когда филиалы, подразделения, поставщики, клиенты и партнеры смогут подключаться к системе из любой точки нашей «бесшовной» матрицы.»О компании Scala Business SolutionsКомпания Scala Business Solutions создает разностороннее (Collaborative) программное обеспечение для планирования ресурсов предприятий (ERP), в котором интегрированы технологии Интернет с традиционными возможностями систем ERP, что позволяет упростить ведение глобального бизнеса. Благодаря ПО Scala, глобальные компании могут полностью интегрировать все свои ERP-системы по всему миру, будь то дочерние компании, подразделения или головные офисы, а также включить в эту объединенную систему своих партнеров и поставщиков. Разностороннее программное обеспечение Scala ERP позволяет глобальным компаниям удовлетворить требования, предъявляемые к передовым системам э-бизнеса, а также использовать стандартный ERP-продукт для управления традиционными бизнес-процессами. Это позволяет добиться ощутимых преимуществ от использования электронной торговли, создания частного или глобального торгового портала или оптимизации цепочки поставок.Используя офисы в Европе, Северной Америке и на Дальнем Востоке, а также сеть своих партнеров и дилеров, Scala поставляет программное обеспечение и услуги в более чем 100 странах, предлагая свое ПО в более чем 30 языковых версиях.Компания Scala представлена на амстердамской фондовой бирже Euronext (symbol: SCALA). Доход компании в 2001 составил $70.6 миллиона.Для получения дополнительной информации, включая пресс-релизы, сведения для инвесторов и информацию о продуктах, посетите сайт компании Scala по адресу http://www.scala.net.© 2002 Scala Business Solutions, NV. Авторские права защищены. Название Scala® является зарегистрированной торговой маркой. Иные торговые марки или зарегистрированные торговые марки являются собственностью их владельцев.Для получения более подробной информации обращайтесь к Марии Третьяковой, координатору по маркетингу компании Scala:Тел: (095) 799-5666E-mail: [email protected]
Релиз опубликован: 2002-06-11
Данный материал является частной записью члена сообщества Club.CNews.
Редакция CNews не несет ответственности за его содержание.
Scala. Введение / Хабр
Привет хабралюди.
Не так давно я заинтересовался одним из многочисленных ныне языков под JVM — Scala. Причин тому много, основная — всё нарастающее со временем чувство неудобства при работе с cpp-подобными языками. Взгляд мой попеременно падал на Ruby, Groovy, Python, но все они оставляли впечатление инструментов, не совсем подходящих для моего обычного круга рабочих задач (Python-таки хорош, но у нетипизированных языков есть свои ограничения). Scala же, напротив, показалась вполне годным языком. Так как поиск по хабру никаких статей о ней не выловил (было несколько, но мягко говоря не вводных), я решил написать маленький обзор и поделиться им с массами.
Немного философии языка в вольном изложении
Какие основные цели преследовали создатели языка? Согласно моим мироощущениям они такие:
Во-первых, совместимость. Среди своих задач разработчики ставили поддержание совместимости с Java-языком и тысячами примеров говнокода разработок на ней для решения самых разнообразных задач.
Во-вторых, интенсивное насыщение языка функциональными фичами, которые, в основном, (но далеко не полностью) составляют его отличия от Java.
В-третьих, облегчение нашего с вами труда. Действительно, компилятор Scala понимает программиста с полуслова, писать код специально, чтобы втолковывать ему, что я не верблюд, мне не довелось пока.
В-четвёртых, поддержка и стимулирование написания модульных, слабосвязанных программных компонентов в сочетании с широкими возможностями адаптации уже существующих. Цели не то, чтобы совсем противоположные, но порождающие известные трудности для одновременного достижения. Что ж, посмотрим что получится.
В-пятых, это поддержка параллелизма. К сожалению у меня руки и голова до этой области не дошли (надеюсь пока), но акцент на этом моменте делается постоянно на всех ресурсах по языку.
Для экспериментов с языком достаточно поставить соответствующий плагин на любимую IDE отсюда.
Итак, давайте посмотрим на сам язык…
Общие идеи языка, примеры синтаксиса
Самое, пожалуй, важное, — это «унифицированная модель объектов». Этот термин расшифровывается авторами так: «каждое значение — объект, каждая операция — вызов метода». Это, конечно, не «всё — объект», но сущностей в сравнении с Java убыло, а чем меньше сущностей — тем легче жизнь 🙂 В прикладном плане это означает, что числа и символы сделались неизменяемым объектами, обитающими в общей куче, все операции приобретают ссылочную семантику. Например, код 5 + 5
вполне валиден, и породит новый объект в куче, который оперативненько оприходует сборщик мусора (на самом деле, я тихо надеюсь, что компилятор поймёт глубину замысла и порождать он ничего не будет 🙂 ).
После столь возвышенного введения можно глянуть на решение классической задачи:
object Main {
def main(args:Array[String]) :Unit = {
print("Hello, " + args(0) + "!")
}
}
В нём мы видим следующее:
- Можно объявлять отдельные объекты. Ничего необычного в этом нет, подобная возможность имеется, например в Groovy. Ведут себя такие объекты так же как написанные на Java реализации шаблона Singelton.
- Объявление фукции выглядит непривычно, но вполне читабельно: [ключевое слово def] [имя]([список параметров]):[возвращаемый тип] = [блок кода].
- В качестве типа, не несущего информационной нагрузки, выступает тип Unit. Он вполне аналогичен void в C-подобных языках.
- Объявление параметра функции (а на самом деле и локальной переменной тоже) выглядит как [имя]:[тип].
- Для параметризации типа используется не привычные нам
<>
, а казалось бы, навсегда закреплённые за масивами[]
. - Для обращения к элементам массива(экое непотребство) используются
()
. - Имеется какие-то встроенные функции, доступные в коде по умолчанию без всяких дополнительных импортов.
В дополнение, давайте взглянем на ещё один короткий пример:
println( ("Hello, " + args(0) + "!").toUpperCase )
println( "Hello, " + args(0) + "!" toUpperCase )
Как из него следует, использование оператора .
совершенно не необходимо. Синтаксис языка вполне допускает использование вместо него пробела (также аргументы метода можно писать без скобок и запятых сразу после имени метода). И как мы видим, это оказывается вполне полезно: в первой строке высокоприоритетный оператор .
заставляет нас писать ненужные, засоряющие код скобки, во второй получается более краткая и наглядная форма записи.
В качестве подспорья разработчику Scala поддерживает также интерактивный режим. То есть, можно запустить интерпретатор и по одной вводить комманды. Интерпретатор, встроенный в IDE, как-то нерегулярно работает, его отдельный вариант есть в репозитариях Убунты, думаю у остальных дистрибутивов тоже всё хорошо, счастливым обладателям Windows как всегда придётся помучаться 🙂 Интерпретатор запускается самым необычным способом:$ scala
Welcome to Scala version 2.7.3final (Java HotSpot(TM) Server VM, Java 1.6.0_16).
Type in expressions to have them evaluated.
Type :help for more information.
scala>
Совсем маленький пример:scala> 1 to 10
res0: Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
Тут мы видим пример вызова метода с параметром. Если кто не догадался, у объекта класса Int
1 вызывается метод to
с параметром того же типа 10, результат — диапазон значений.
Попробуем-ка мы теперь написать ещё одну функцию. Пусть она нам считает сумму чисел в заданном диапазоне, итак:scala> def sum(a: Int, b: Int): Int = {
| var result = 0
| for (i <- a to b) result += i
| result
| }
sum: (Int,Int)Int
scala> sum(1, 5)
res3: Int = 15
Здесь видны ещё три важных момента:
- При помощи ключевого слова var мы можем объявлять локальные переменные
- Результатом вычисления блока является последнее выражение в нём
- В нашем распоряжении имеется цикл for, который может выполнять вычисления для значений в заданном диапазоне (на самом деле для объектов в любом объекте — контейнере)
Операции над функциями
Что же мы такого можем с ними тут делать? Да что угодно =) Функции являются полноценными объектами программы. Их можно хранить как свойства объектов, передавать как параметры и возвращаемые значения и собственно создавать во время выполнения. Данные свойства позволяют строить так называемые функции высокого порядка, оперирующие себе подобными.
Для иллюстрации рассмотрим ставший классическим пример вычисления суммы:scala> def sum(f: Int => Int, a: Int, b: Int): Int =
| if (a > b) 0 else f(a) + sum(f, a + 1, b) sum: ((Int) => Int,Int,Int)Int
В данном примере определяется функция sum, представляющая знакомый, надеюсь, всем оператор суммы. Параметры имеют следующий смысл:
f — функция преобразования целого числа из пределов суммирования в элемент суммы. Обратите внимание на объявление типа параметра: знак =>
означает, что параметр — функция, типы принимаемых значений перечисляются слева от него в круглых скобках (если параметр один, как в данном примере, их допустимо опустить), тип возвращаемого результата справа.
Работает она тривиально: вычисляет значение функции в нижней границе диапазона и складывает его с результатом вычисления себя самой в диапазоне на 1 меньшем.
Также в этом примере видна ещё одна особенность языка — if
является выражением, имеющим значение (кстати, использованный ранее for
— тоже выражение, его результат типа Unit
). Если условие истина, то его результат первый вариант, иначе — второй.
a и b — пределы суммирования.
Ещё пара функций id
и square
, они равны своему параметру и его квадрату соответственно.scala> def id(x: Int): Int = x
id: (Int)Int
scala> def square(x: Int): Int = x * x
square: (Int)Int
Тут надо сделать ещё одно лирическое отступление: функции в Scala имеют декларативный стиль объявления. Они описывают не как получить результат, а чему он равен. Но если требуется организовать последовательные вычисления в теле функции, нет проблем — у нас есть блоки.
Теперь можно воспользоваться тем, что мы написали ранее.scala> sum(id, 1, 5)
res1: Int = 15
scala> sum(square, 1, 5)
res2: Int = 55
Здесь происходит кульминация этой части — мы берём и передаём функцию в другую функцию. Никаких интерфейсов, анонимных классов, делегатов: вот оно — маленькое счастье.
Я здесь намеренно не стал приводить примеры вложенных и анонимных функций, карринга. Всё это Scala умеет, но всё нельзя включить в небольшой обзор. Думаю приведёный пример достаточен для понимания важности и, главное, — удобства функций высокого порядка как инструмента программирования. Напоследок могу посоветовать почитать эту главу замечательной книги по программированию.
Особенности классов
Давайте опишем несложный класс. Пусть это будет комлексное число. Создадим следующий код:
class Complex(r: Double, i: Double) {
def real = r
def image = i
def magnitude = Math.sqrt(r*r + i*i)
def angle = Math.atan2(i, r)
def + (that: Complex) = new Complex(this.real + that.real, this.image + that.image)
override def toString = real+" + i*"+image+" | "+magnitude+"*e^(i*"+angle+"))"
}object Main {
def main(args:Array[String]) :Unit = {
val first = new Complex(1, 5)
val second = new Complex(2, 4)
val sum = first + second
println(first)
println(second)
println(sum)
}
}
Во-первых, клас объявлен с какими-то параметрами. Как несложно догадаться по продолжению, это параметры конструктора, которые доступны всё время жизни объекта.
Во-вторых, в классе объявлено несколько методов — селекторов. Одно семейство для декартового представления и одно для полярного. Как видим оба они используют параметры конструктора.
В-третьих, в классе объявлен оператор сложения. Объявлен он как обычный метод, принимает также Complex
и возвращает его же.
Ну и наконец, для этого класса переопределена, без сомнения, знакомая всем Java-программистам функция toString
. Важно отметить что на переопределение методов в Scala всегда необходимо явно указывать при помощи ключевого слова override
.
Несмотря на огромную практическую ценность данный класс обладает рядом недостатков, а именно:
- Занимает неоправданно много для своей функциональности места на экране
- Не умеет сравнивать себя с себе подобными
Что же, попробуем исправить недочёты, средствами этого прекрасного языка.
class Complex(val real: Double, val image: Double) extends Ordered[Complex] {
def magnitude = Math.sqrt(real*real + image*image)
def angle = Math.atan2(image, real)
def + (that: Complex) = new Complex(this.real + that.real, this.image + that.image)
def compare(that: Complex): Int = this.magnitude compare that.magnitude
override def toString = real+" + i*"+image+" | "+magnitude+"*e^(i*"+angle+"))"
}object Main {
def main(args:Array[String]) :Unit = {
val first = new Complex(1, 5)
val second = new Complex(2, 4)
if (first > second )
println("First greater")
if (first < second )
println("Second greater")
if (first == second )
println("They're equal")
}
}
Итак, что появилось нового:
- У параметров конструктора появилось ключевое слово val и исчезли соответствующие селекторы. Да, всё вполне очевидно, это разрешение компилятору создать селекторы для них автоматически.
- Добавилось наследование от незнакомого нам класса (а точнее trait’а) Ordered. Да не простого, а параметризованного нашим классом. Как следует из названия, он должен помочь нам с упорядочиванием наших экземпляров.
- Появился метод compare, который сравнивает два комплексных числа посредством сравнения их модулей.
- В тестовом методе появились использования операторов >, <, ==. Их мы явно не определяли.
Пришло время сказать несколько слов об идее trait’а. Это особый тип класса, который не может иметь конструкторов, но может иметь любые методы и аттрибуты. Обычно они устанавливают некоторый протокол для взаимодействия со своими возможными наследниками. Используя этот протокол они могут получить необходимую информацию от потомка и реализовать в нём некоторое поведение. Соответственно, любой класс (или объект) может наследоваться от произвольного количества trait’ов(и лишь от одного class’а). Например Ordered
объявляет абстрактный метод compare
и на его основании дополняет класс-наследник операторами и т.д. Здесь надо заметить, что по-хорошему стоит переопределить предоставленный нам оператор ==, так как он даёт истину и для неодинаковых объектов, да и методы equals с hashCode также стоит переопределять в таких случаях.
«Всё это хорошо» — скажет бывалый боец аутсорсерного рынка, «но что делать если требуется банальный domain-класс, с богомерзкими модификаторами атрибутов?».
Решение у нас, естественно, есть 🙂
class User {
private[this] var _name: String = ""
def name = _name toUpperCase
def name_=(name: String) = {
_name = if (name != null) name else ""
}
}
- Во-первых, этот класс использует уже знакомое нам ключевое слово
var
в своём теле, да не просто а с диковинным модификаторомprivate[this]
. Значение этого ключевого слова в теле класса абсолютно аналогично таковому в внутри блока(и даже, скажу по секрету, в конструктор его тоже можно запихать) и делает из имени после него изменяемый аттрибут класса. Диковинный модификатор заявляет, что переменная должна быть доступна только данному объекту. Можно было написать, например,private[User]
и она стала бы доступна другим, нам подобным, объектам, или указать имя пакета (что-то это мне напоминает). - Далее объявлена функция возвращающая наше поле в верхнем регистре.
- И в заключение, странная функция
name_=
, получающая строку в виде параметра, проверяющая что она неnull
и записывающая её в наше поле.
Чтобы понять, как это всё использовать давайте взглянем на результат выполнения следующего кода(для краткости я не стал включать сюда описание объекта и main-метода):
val user = new User("Scala!!!")
println(user.name)
user.name = "M. Odersky"
println(user.name)
SCALA!!!
M. ODERSKY
Внимание, вывод: метод с именем <что-то>_= вызывается при использовании конструкции <объект>.<что-то> = <что-то другое>. Насколько я знаю в Scala это второй хак (первый — преобразование ()
в вызов метода apply
), как Гвидо завещал c неявным преобразованием использования оператора в вызов метода.
Pattern-matching
Начать придётся немного издалека. В Scala есть так называеммые сase classes(естественно и objects тоже). Они объявляются с ключевым словом case
, после чего компилятор берёт на себя смелость сделать следующее:
- Создать функцию-конструктор с именем, совпадающим с класом.
- Имплементировать в классе toString, equals, hashCode на основе аргументов конструктора.
- Создать селекторы для всех аргументов конструктора.
Вся эта магия открывает нам путь к использованию метода match
. Давайте взглянем на пример:
abstract class User
case class KnownUser(val name: String) extends User
case class AnonymousUser() extends User
object Test {
val users = List(KnownUser("Mark"), AnonymousUser(), KnownUser("Phil"))
def register(user: User): Unit = user match {
case KnownUser(name) => println("User " + name + " registered")
case AnonymousUser() => println("Anonymous user can't be registered")
}
def main(args: Array[String]) =
users.foreach( register )
}
Итак, общая картина кода: есть абстрактный класс пользователя, есть два его казуальных потомка: известный и анонимный пользователи. Мы хотим зарегистрировать некий список пользователей на (здесь включаем фантазию) встречу. Для чего и используем pattern-matching, который позволяет нам определить разное поведение метода для разных типов объектов и обеспечивает выборку данных из этих объектов.
После столь жизненного примера можно немного теории о работе метода match
. Для каждого выражения case он выполняет проверку на совпадения типа с классом шаблона и соответствия параметров конструктора шаблону. Шаблон в общем случае может включать в себя:
- Конструкторы других case-классов. Тут всё вполне рекурсивно, глубина вложенности шаблона
ограничивается безумием программистане ограничивается. - Переменные шаблона. Они становятся доступны в теле функции вычисления результата.
- Символы
_
обозначающие любое, неинтересующее нас значение. - Литералы языка. Например
1
или"Hello"
.
Таким образом мы получаем инструмент, позволяющий описать получение некоторого значения из объекта на основе его структуры (класса) и/или хранимых в нём данных.
Люди знакомые с базовыми принципами ООП конечно сразу заметят, что проблема эта вполне решается использованием виртуальных функций (более того предлагаемый подход является не лучшей практикой). Однако их использование несёт в себе две трудности: во-первых усложняет поддержку кода при большом числе таких функций (нам ведь захочется регистрировать пользователей и на события, и в группы, и в блоги и т.п., что для каждого случая создавать виртуальный метод?), во-вторых не решает проблемы с тем, что объекты одного типа могут принципиально иметь разную структуру и не иметь возможности предоставлять некоторые данные.
На вторую проблему хочется обратить особое внимание. Как выглядил бы приведённый выше код в Java? Один класс, если пользователь анонимный выставляем в имени null
и проверяем каждый раз (эстеты вроде меня заводят методы типа isAnonymous
, состоящие из сравнения поля с тем же null
). Проблемы налицо — неявно и небезопасно. Таких примеров великое множество, когда разные вариации структуры объектов объединяются в один класс, а неиспользуемые в конкретном случае забиваются null
‘ами, или того хуже придумывается значение по умолчанию. Scala позволяет явно описывать вариации структуры объектов, и предоставляет удобный механизм для работы с этими вариациями.
В заключение, пара мыслей насчёт того, когда данная техника может быть эффективно применена как замена виртуальным функциям:
- У нас много функций. Да если у нас пара сотен операций, используемых по паре раз, зависящих от структуры и содержания объектов, система на основе case classes — pattern matching будет явно лучше поддерживаема.
- У нас мало классов. match из пары выриантов всегда хорошо читаем.
- У нас есть значительные вариации структуры объектов, которые однако надо хранить и обрабатывать единообразно.
Для всех пунктов действуют и обратные утвердения, например использование pattern matching для десятка классов не кажется мне хорошей идеей.
Вывод типов
Думаю, вы уже заметили, что в коде я указывал типы только при объявлении классов и методов. В блоках кода я их практически всегда опускал. Дело в том, что если программист не указывает тип явно, Scala пытается определить его из контекста. Например при инициализации значения константы в определении def s = "Scala"
компилятор определит тип константы как строку. Всё это также работает на обобщённых типах, например фрагмент выше val users = List(KnownUser("Mark"), AnonymousUser(), KnownUser("Phil"))
, создаёт константу типа List[User]
, автоматически поднимаясь до подходящего уровня в иерархии наследования и используя его для параметризации типа-контейнера. На практике это означает, что можно значительно сэкономить на подобных объявлениях (для развлечения напишите делающий то же самое код на Java или C# 🙂 ).
Заключение
Мда… К началу поста уже и скролить долго. Явно пора заканчивать. А сказать хотелось бы ещё про многое: про интереснейший механизм описания обобщённых классов, про неявные преобразования и то, что они на самом деле явные, ленивую инициализацию констант.
Мне и самому ещё только предстоит изучить модель многопоточности и своеобразный набор примитивов для её реаизации, разобраться с языковой поддержкой xml, поиграться с DSL-строением, посмотреть на их флагманский проект — Lift…
Однако всё равно осмелюсь сделать пару выводов:
- Scala является весьма лаконичным и выразительным языком
- Она предоставляет мощный инструментарий для создания простых и красивых программ
Вот и всё. Критика приветствуется.
Напоследок вопрос к массам: интересна ли данная тема, стоит ли писать продолжение?
UPD: поправил грамматику, спасибо всем оказавшим в этом помощь. Особенно ganqqwerty за массовые разборки с запятыми.
_________
All source code was highlighted with Source Code Highlighter.
Текст подготовлен в ХабраРедакторе
Введение | Scala Documentation
Добро пожаловать к обзору
Здесь вы увидите вводное описание наиболее часто используемых возможностей Scala.
Этот обзор предназначен для новичков в изучении языка.
Это лишь небольшая экскурсия, а не полный курс освоения языка. Для глубокого погружения рекомендуем почитать книги или воспользоваться курсами
на других ресурсах.
Что такое Scala?
Scala — это современный мультипарадигмальный язык программирования, разработанный для выражения общих концепций программирования в простой, удобной и типобезопасной манере. Элегантно объединяя особенности объектно-ориентированных и функциональных языков.
Scala объектно ориентированный
Scala — это чистый объектно-ориентированный язык в том смысле, что каждое значение — это объект. Типы и поведение объектов описаны в классах и трейтах(характеристиках объектов). Классы расширяются за счет механизма наследования и гибкого смешивания классов, который используется для замены множественного наследования.
Scala функциональный
Scala также является функциональным языком в том смысле, что каждая функция — это значение. Scala предоставляет легкий синтаксис для определения анонимных функций, поддерживает функции высшего порядка, поддерживает вложенные функции, а также каррирование. Scala имеют встроенную поддержку алгебраических типов данных, которые используются в большинстве функциональных языках программирования (эта поддержка базируется на механизме сопоставления с примером, где в качестве примера выступают классы образцы ). Объекты предоставляют удобный способ группировки функций, не входящих в класс.
Вдобавок к этому, концепция сопоставления с примером логично переносится на обработку XML-данных используя в качестве примера регулярные выражения, при поддержке функционала объектов экстракторов. Для еще большего удобства обработки данных представлена схема формирования запросов с использованием for-выражения. Такие возможности делают Scala идеальным решением для разработки приложений по типу веб-сервисов.
Scala статически типизированный
Scala оснащен выразительной системой типов, которая обеспечивает безопасное и гармоничное использование абстракций. В частности, система типов поддерживает:
Выведение типов означает, что разработчику не обязательно добавлять в код избыточную информацию о типах.
Такой функционал обеспечивает основу для безопасного переиспользования абстракций и типобезопасного развития программного обеспечения.
Scala расширяемый
Зачастую разработка приложений для очень специфичных областей требует специфичных для этих областей языковых возможностей, либо отдельных специализированных языков программирования. Вместо этого Scala предлагает уникальные механизмы, для легкой модификации и расширения самого языка.
Во многих случаях такое можно сделать без использования средств мета-программирования, таких как макросы. Например:
- Неявные классы позволяют добавлять новые методы к уже существующим.
- Интерполяция строк позволяет добавлять обработку строк (расширяется разработчиком с помощью интерполяторов).
Scala совместимый
Scala полностью совместим с популярной средой Java Runtime Environment (JRE). Взаимодействие с основным объектно-ориентированным языком программирования Java происходит максимально гладко. Новые функции Java, такие как SAM, лямбды, аннотации и дженерики, имеют прямые аналоги в Scala.
Те функции Scala, которые не имеют аналогов в Java, такие как параметры по умолчанию и именованные параметры, компилируются как можно ближе к Java. Scala имеет такую же компиляционную модель (отдельная компиляция, динамическая загрузка классов), как у Java, что позволяет получить доступ к тысячам уже существующих высококачественных библиотек.
Наслаждайтесь туром!
Для продолжения знакомства предлагаю перейти на следующую страницу нашего тура.
Основы | Scala Documentation
На этой странице мы расскажем об основах Scala.
Попробовать Scala в браузере.
Вы можете запустить Scala в браузере с помощью ScalaFiddle.
- Зайдите на https://scalafiddle.io.
- Вставьте
println("Hello, world!")
в левую панель. - Нажмите кнопку “Run”. Вывод отобразится в правой панели.
Это простой способ поэкспериментировать со Scala кодом без всяких настроек.
Большинство примеров кода в этой документации также интегрированы с ScalaFiddle,
поэтому вы можете поэкспериментировать с ними, просто нажав кнопку Run.
Выражения
Выражения — это вычислимые утверждения.
Вы можете выводить результаты выражений, используя println
.
println(1) // 1
println(1 + 1) // 2
println("Hello!") // Hello!
println("Hello," + " world!") // Hello, world!
Значения
Результаты выражений можно присваивать именам с помощью ключевого слова val
.
val x = 1 + 1
println(x) // 2
Названные результаты, такие как x
в примере, называются значениями.
Вызов значения не приводит к его повторному вычислению.
Значения не изменяемы и не могут быть переназначены.
x = 3 // Не компилируется.
Типы значений могут быть выведены автоматически, но можно и явно указать тип, как показано ниже:
Обратите внимание, что объявление типа Int
происходит после идентификатора x
, следующим за :
.
Переменные
Переменные похожи на значения константы, за исключением того, что их можно присваивать заново. Вы можете объявить переменную с помощью ключевого слова var
.
var x = 1 + 1
x = 3 // Компилируется потому что "x" объявлен с ключевым словом "var".
println(x * x) // 9
Как и в случае со значениями, вы можете явно указать тип, если захотите:
Блоки
Вы можете комбинировать выражения, окружая их {}
. Мы называем это блоком.
Результат последнего выражения в блоке будет результатом всего блока в целом.
println({
val x = 1 + 1
x + 1
}) // 3
Функции
Функции — это выражения, которые принимают параметры.
Вы можете определить анонимную функцию (т.е. без имени), которая возвращает переданное число, прибавив к нему единицу:
Слева от =>
находится список параметров. Справа — выражение, связанное с параметрами.
Вы также можете назвать функции.
val addOne = (x: Int) => x + 1
println(addOne(1)) // 2
Функции могут принимать множество параметров.
val add = (x: Int, y: Int) => x + y
println(add(1, 2)) // 3
Или вообще не принимать никаких параметров.
val getTheAnswer = () => 42
println(getTheAnswer()) // 42
Методы
Методы выглядят и ведут себя очень похоже на функции, но между ними есть несколько принципиальных различий.
Методы задаются ключевым словом def
. За def
следует имя, список параметров, возвращаемый тип и тело.
def add(x: Int, y: Int): Int = x + y
println(add(1, 2)) // 3
Обратите внимание, как объявлен возвращаемый тип сразу после списка параметров и двоеточия : Int
.
Методы могут принимать несколько списков параметров.
def addThenMultiply(x: Int, y: Int)(multiplier: Int): Int = (x + y) * multiplier
println(addThenMultiply(1, 2)(3)) // 9
Или вообще ни одного списка параметров.
def name: String = System.getProperty("user.name")
println("Hello, " + name + "!")
Есть некоторые отличия от функций, но пока что их можно рассматривать как нечто похожее.
Методы также могут иметь многострочные выражения.
def getSquareString(input: Double): String = {
val square = input * input
square.toString
}
println(getSquareString(2.5)) // 6.25
Последнее выражение в теле становится возвращаемым значением метода (у Scala есть ключевое слово return
, но оно практически не используется).
Классы
Вы можете объявлять классы используя ключевое слово class
, за которым следует его имя и параметры конструктора.
class Greeter(prefix: String, suffix: String) {
def greet(name: String): Unit =
println(prefix + name + suffix)
}
Возвращаемый тип метода greet
это Unit
, используется тогда, когда не имеет смысла что-либо возвращать. Аналогично void
в Java и C. Поскольку каждое выражение Scala должно иметь какое-то значение, то при отсутствии возвращающегося значения возвращается экземпляр типа Unit. Явным образом его можно задать как ()
, он не несет какой-либо информации.
Вы можете создать экземпляр класса, используя ключевое слово new
.
val greeter = new Greeter("Hello, ", "!")
greeter.greet("Scala developer") // Hello, Scala developer!
Позже мы рассмотрим классы подробнее.
Классы-образцы (Case Class)
В Scala есть специальный тип класса, который называется классом-образцом (case class). По умолчанию такие классы неизменны и сравниваются по значению из конструктора. Вы можете объявлять классы-образцы с помощью ключевых слов case class
.
case class Point(x: Int, y: Int)
Можно создавать экземпляры класса-образца без использования ключевого слова new
.
val point = Point(1, 2)
val anotherPoint = Point(1, 2)
val yetAnotherPoint = Point(2, 2)
Они сравниваются по значению.
if (point == anotherPoint) {
println(point + " and " + anotherPoint + " are the same.")
} else {
println(point + " and " + anotherPoint + " are different.")
} // Point(1,2) и Point(1,2) одни и те же.
if (point == yetAnotherPoint) {
println(point + " and " + yetAnotherPoint + " are the same.")
} else {
println(point + " and " + yetAnotherPoint + " are different.")
} // Point(1,2) и Point(2,2) разные.
Есть еще много деталей, которые мы бы хотели рассказать про классы-образцы; мы уверены, что вы влюбитесь в них! Обязательно рассмотрим их позже.
Объекты
Объекты задаются и существуют в единственном экземпляре. Вы можете думать о них как об одиночках (синглтонах) своего собственного класса.
Вы можете задать объекты при помощи ключевого слова object
.
object IdFactory {
private var counter = 0
def create(): Int = {
counter += 1
counter
}
}
Вы можете сразу получить доступ к объекту, ссылаясь на его имя.
val newId: Int = IdFactory.create()
println(newId) // 1
val newerId: Int = IdFactory.create()
println(newerId) // 2
Позже мы рассмотрим объекты подробнее.
Трейты
Трейты — как типы описывают характеристики классов, в нем могут объявляться определенные поля и методы. Трейты можно комбинировать.
Объявить трейт можно с помощью ключевого слова trait
.
trait Greeter {
def greet(name: String): Unit
}
Трейты также могут иметь реализации методов и полей, которые предполагается использовать умолчанию.
trait Greeter {
def greet(name: String): Unit =
println("Hello, " + name + "!")
}
Вы можете наследовать свойства трейтов, используя ключевое слово extends
и переопределять реализацию с помощью ключевого слова override
.
class DefaultGreeter extends Greeter
class CustomizableGreeter(prefix: String, postfix: String) extends Greeter {
override def greet(name: String): Unit = {
println(prefix + name + postfix)
}
}
val greeter = new DefaultGreeter()
greeter.greet("Scala developer") // Hello, Scala developer!
val customGreeter = new CustomizableGreeter("How are you, ", "?")
customGreeter.greet("Scala developer") // How are you, Scala developer?
Здесь DefaultGreeter
наследуется только от одного трейта, но можно наследоваться от нескольких.
Позже мы рассмотрим трейты подробнее.
Главный метод
Главный метод является отправной точкой в программе.
Для Виртуальной Машины Java требуется, чтобы главный метод назывался main
и принимал один аргумент, массив строк.
Используя объект, можно задать главный метод следующим образом:
object Main {
def main(args: Array[String]): Unit =
println("Hello, Scala developer!")
}
iScala ERP
iScala — это ERP-система
Продукт был создан в 1978 году. До 2002 года система называлась Scala, затем название изменилось на iScala.
Система позволяет вести учет и управление ресурсами компаний. iScala содержит множество модулей и подмодулей, которые отвечают за определенные бизнес-процессы, включая:
- Финансовые модули
- Модуль Главной книги, GL
Мелкие денежные средства, Банк, проведенная финансовая операция, Планирование движения денежных средств, Консолидация финансовых операций и трансформация бухгалтерского учета, распределения - Модуль книги закупок, PL
Расчеты с поставщиками — счета-фактуры и платежи поставщикам - Модуль книги продаж, SL
Расчеты с клиентами — счета-фактуры и платежи от клиентов - Управление основными средствами, AM
Управление основными и нематериальными активами и расчет износа и амортизации, интеграция с модулем управления запасами - Прямое выставление счетов, DI
Этот модуль предназначен для компаний, у которых нет модулей логистики и складских запасов
- Модуль Главной книги, GL
- Складские и логистические модули
- Модуль управления закупками, ПК
Заявки на закупку и потребление, Заказы на закупку, поставка запасов, распределение накладных и дополнительных затрат по партиям - Модуль управления запасами, SC
Склады и ячейки, товарные позиции, контроль качества, управление партиями, складские операции, создание финансовых операций, планирование пополнения запасов - Модуль управления заказами на продажу, ИЛИ
Предложения, заказы на продажу, комплектование, снятие запасов, выставление счетов
- Модуль управления закупками, ПК
- Модуль управления услугами, SM
Обслуживание проданных товаров (вторичный рынок) за дополнительную плату и по гарантии, в сервисном центре и на местах, обслуживание собственного оборудования, планирование ресурсов, выдача товаров на склад и признание расходов на техническое обслуживание и ремонт, расчет затрат , выставление счета) - Модуль управления проектами, PR
Управление проектами, выставление счетов, признание доходов и расходов по проектам, накопление расходов и доходов из других модулей - Manufacturing Production Control, MPC
Основной график производства, ведомость материалов, маршруты, календарное планирование (MRP-II), планирование потребности в запасах (MRP-I), диспетчеризация работ, производственная отчетность, учет затрат, схемы толлинга, Work-In -Обработка транзакций - Модуль расчета заработной платы, PA
Расчет заработной платы по разным периодам, гибкий учет затрат по сотрудникам, расчет по моделям и алгоритмам, Расписания, отчетность
iScala имеет собственную систему промежуточного программного обеспечения (Epicor Service Connect), которая позволяет обмениваться данными с внешними системами, такими как фронт-офисное программное обеспечение отелей, веб-службы курсов обмена валют, WMS (системы управления складом), EDI (системы электронного обмена документами) и т. Д.
В основном iScala настраивается параметрически.Также iScala включает в себя встроенный язык программирования VBA (Visual Basic для приложений), который позволяет исправлять и улучшать бизнес-логику и экранные формы.
Также iScala интегрирована с другими системами:
- iScala использует SSRS (Microsoft SQL Reporting Services) и Crystal Reports для создания отчетов,
- AFR (Advanced Financial Reporter) используется для подготовки финансовых отчетов,
- Epicor Financial Planner для финансового планирования и прогнозирования,
- Microsoft CRM (Управление взаимоотношениями с клиентами),
- Forecast Pro, система планирования и прогнозирования запасов,
- iScala Collect, система управления складом, в том числе производственными складами
.Программное обеспечение для цифровых вывесок
| Масштабируемый, гибкий
Scala Designer специально разработан для создания контента цифровых вывесок, совместимого с брендом, интерактивного и оптимизированного для цифрового отображения. Воспользуйтесь нашими существующими и простыми в использовании шаблонами в качестве отправной точки или создайте собственный контент, соответствующий вашей кампании и сообщению бренда. Scala Designer поддерживает и включает широкий спектр медиаформатов для изображений, графики, видео, flash и звука. Добавляйте RSS-каналы, социальные сети или другой сторонний контент, используя сотни встроенных эффектов и переходов, а также нашу библиотеку клипартов, стоковых изображений, шаблонов, фонов и стоковых видео с помощью Scala Designer.
Программное обеспечение для цифровых вывесок
Scala позволяет командам маркетологов и разработчиков создавать полностью персонализированные цифровые вывески на основе фирменного стиля компании. Предоставление динамических визуальных эффектов вашим гостям помогает повысить вовлеченность, повысить коэффициент конверсии и повысить узнаваемость бренда.
Благодаря способности человеческого мозга обрабатывать визуальные данные в 60 000 раз быстрее, чем обычный текст, создание индивидуальных цифровых вывесок может улучшить репутацию бренда и привлечь внимание. Привлекательные образы могут оживить ваш бренд и повлиять даже на самую уклончивую аудиторию.
Программное обеспечение
Scala Designer для цифровых вывесок было создано, чтобы помочь маркетологам-новичкам, опытным и опытным маркетологам создавать качественные профессиональные цифровые вывески на всех уровнях. Интуитивно понятный интерфейс позволяет легко комбинировать такие элементы, как текст, изображения, графику, видео, звук и анимацию, для получения максимально увлекательного контента.
Scala Designer также выполняет преобразование файлов или повторный рендеринг, легко объединяя несколько мультимедийных форматов для изображений, видео, аудио, потоковой передачи и HTML. Этот аспект программного обеспечения дает маркетологам больший контроль над конечным качеством воспроизведения, поскольку файл отображается в реальном времени, а исходные данные остаются неизменными.
Расширенные функции, включенные в программное обеспечение цифровых вывесок Scala Designer, включают языковую поддержку, настройку дизайна и возможности сканирования. Такой удобный интерфейс упрощает настройку дизайна — вставляйте плавные переходы, масштабируйте контент в соответствии с портретным или ландшафтным стилем и добавляйте интерактивные кнопки. Текст, управляемый данными, также может сканироваться с контролируемой скоростью.
.
Язык программирования Scala
БЛОГ
Scala 3 — версия
от сообщества
Вторник, 15 сентября 2020 г.
После 8 лет исследований, экспериментов, испытаний, обсуждений и многочисленных вкладов ученых и сотрудников сообщества, проект Dotty наконец завершится осенью 2020 года, превратившись в Scala 3. В этом блоге рассказывается о том, что нужно для координации Scala 3 высвободить усилия и пригласить вас помочь нам добиться успеха!
Текущая ситуация?
Мы координируем около 52 проектов с участием менее 20 человек, разбросанных по нескольким организациям, и до реализации осталось четыре месяца.
Категории алмазного сырья в рамках этих 52 проектов:
- Особенности языка
- Инструменты
- Миграция
- Производительность
- Документация
Дорожные карты и обновления проектов публикуются в дискуссиях авторов в разделе «Проекты выпуска Scala 3»; все больше публикуются время от времени. Присоединяйтесь к форуму, чтобы поделиться своими мыслями, идеями и узнать больше о каждом проекте.
Кто причастен к выпуску?
Проф.Мартин Одерски и его исследовательская лаборатория (LAMP) находятся в авангарде и движущей силе разработки релизов Dotty и Scala 3. Примечание: это команда из 8 человек, которые работают не только над Дотти, но и над своими исследованиями, а также над обучением.
- Центр
Scala, языковая основа Scala, недавно выступил в качестве основного координирующего органа для усилий по выпуску Scala 3 и выделил значительные ресурсы для разработки, обучения, коммуникации и управления проектами.Примечание. Команда Scala Center состоит из 9 человек, 5 из которых присоединились (совсем) недавно.
Компании Консультативного совета Scala Center поддерживают выпуск Scala 3 различными способами и возможностями. Все они поделились своими советами и призвали Scala Center принять участие, а некоторые из них (например, Lightbend, VirtusLab, Lunatech, 47 Degrees) предоставили дополнительные инженерные ресурсы и повседневную логистику.
VirtusLab поддерживает усилия, связанные с реализацией Scala3Doc и Metals (IDE поддерживает Dotty через LSP).Они также недавно участвовали в компиляторе (перенос изменений бэкэнда Scala 2 в Dotty на данный момент) и разработке и сопровождении Scala Native (путь к поддержке первого Scala 2.12 и, в конечном итоге, Dotty). VirtusLab продолжит свое участие в Metals / Dotty до самого выпуска Dotty, а затем в обозримом будущем.
Typelevel координирует свои действия со своей экосистемой, чтобы стремиться к полностью совместимым с исходным кодом, нативным для Dotty выпускам всех связанных основных проектов в рамках их текущей основной (двоично-совместимой) линии.Теоретически любые последующие приложения, полностью входящие в экосистему Typelevel, должны иметь возможность обновляться до Scala 3 так же легко, как обновляться с 2.12 до 2.13. Кроме того, Cats Effect нацелена на конец года для выпуска версии 3.0 (капитальный пересмотр его основной семантики). Этот выпуск сам по себе тесно координируется ниже по течению, а это означает, что многие проекты в экосистеме Typelevel будут выпускать два основных выпуска, совместимых со Scala 3, примерно в конце года: один для Cats Effect 2 (исходный код совместим с текущим 2.13 версий) и один для Cats Effect 3 (который также будет иметь сборки 2.12 и 2.13).
Многие другие организации и отдельные участники, вкладывающие свое свободное время, которым мы все невероятно благодарны — ваш энтузиазм и любовь к Scala очень вдохновляют!
Где следить за развитием?
(или: достоверные источники)
Scala-lang.org
Twitter: @scala_lang и @odersky
Обсуждение авторов
Scala Center и члены команды LAMP
Чего ожидать?
Мы сталкиваемся с глобальной неопределенностью во всех сферах нашей жизни, поэтому устанавливать ожидания было бы, мягко говоря, неразумно.Однако мы намерены подготовить релиз-кандидата Scala 3 до конца 2020 года. Каждый вклад, доброе слово, приветствие приветствуются сейчас как никогда — и мы заранее благодарим вас за терпение!
Что я могу сделать сегодня?
Вы уже можете взглянуть на Руководство по миграции и, возможно, попробовать его или добавить / поделиться своим опытом. Если вас интересует какой-либо из проектов, представленных на форуме участников, свяжитесь с руководителем проекта и спросите его / ее / их, как лучше всего использовать свое время / опыт.
.
Загрузить | Язык программирования Scala
1
Сначала убедитесь, что у вас установлен Java 8 JDK (или Java 11 JDK).
Для проверки откройте терминал и наберите:
java -version
(убедитесь, что у вас версия 1.8 или 11.)
(Если он у вас не установлен, загрузите Java из Oracle Java 8, Oracle Java 11 или AdoptOpenJDK 8/11. Для получения подробной информации о совместимости Scala / Java см. Совместимость JDK.
2
Затем установите Scala:
… либо установив IDE, например IntelliJ, либо sbt, инструмент сборки Scala.
или
Лучше всего, если вы предпочитаете полнофункциональную среду IDE (рекомендуется для начинающих)
Скачать intellij
По сравнению с другими языками программирования установка Scala несколько необычна.Scala необычен, потому что он обычно устанавливается для каждого из ваших проектов Scala, а не для всей системы. Оба приведенных выше варианта управляют (через sbt) конкретной версией Scala для каждого создаваемого вами проекта Scala.
Но также можно «установить» Scala множеством других способов; например, возьмите двоичные файлы Scala и используйте Scala из командной строки или используйте Scala в своем браузере!
Информация о версии
Обзор важных изменений см. В примечаниях к выпуску GitHub.
(Или обратитесь к нашему архиву старых заметок о выпуске.)
Другие выпуски
Вы можете найти ссылки на предыдущие версии или последнюю разрабатываемую версию ниже.
Чтобы увидеть подробный список изменений для каждой версии Scala, обратитесь к журналу изменений.
Обратите внимание, что различные основные выпуски Scala (например, Scala 2.11.x и Scala 2.12.x) не совместимы друг с другом на двоичном уровне.
Другие ресурсы
Вы можете найти ссылки для загрузки установщика для других операционных систем, а также документацию и архивы исходного кода для Scala 2.13.3 ниже.
Лицензия
Дистрибутив Scala выпускается под лицензией Apache License, версия 2.0.
.