Некоторое время я программировал на Scala, и мне это нравится, но меня раздражает время, необходимое для компиляции программ. Это кажется мелочью, но с Java я мог бы внести небольшие изменения в свою программу, щелкнуть кнопку запуска в netbeans и BOOM, он работает, и со временем компиляция в scala, похоже, занимает много времени. Я слышал, что для многих крупных проектов язык сценариев становится очень важным из-за времени, необходимого для компиляции, - потребности, которую я не замечал, когда использовал Java.
Но я пришел с Java, которая, как я понимаю, быстрее, чем любой другой компилируемый язык, и работает быстро по причинам, по которым я перешел на Scala (это очень простой язык).
Поэтому я хотел спросить, могу ли я сделать компиляцию Scala быстрее и будет ли когда-либо масштабироваться так же быстро, как javac.
источник
Ответы:
Компилятор Scala более сложен, чем компилятор Java, обеспечивая вывод типов, неявное преобразование и гораздо более мощную систему типов. Эти функции не предоставляются бесплатно, поэтому я не ожидал, что scalac когда-либо будет так же быстр, как javac. Это отражает компромисс между программистом, выполняющим работу, и компилятором, выполняющим работу.
Тем не менее, время компиляции уже заметно улучшилось при переходе от Scala 2.7 к Scala 2.8, и я ожидаю, что улучшения продолжатся сейчас, когда пыль осела на 2.8. На этой странице описаны некоторые из текущих усилий и идей по повышению производительности компилятора Scala.
Мартин Одерский дает гораздо более подробный ответ.
источник
Есть два аспекта (недостатка) скорости компилятора Scala.
Увеличение накладных расходов на запуск
Сам Scalac состоит из МНОГО классов, которые нужно загрузить и jit-скомпилировать.
Scalac должен искать в пути к классам все корневые пакеты и файлы. В зависимости от размера вашего пути к классам это может занять от одной до трех дополнительных секунд.
В целом, ожидаемые накладные расходы на запуск scalac составят 4-8 секунд, и больше, если вы запустите его в первый раз, так что кеши дисков не будут заполнены.
Ответ Scala на накладные расходы при запуске - либо использовать fsc, либо выполнять непрерывную сборку с помощью sbt. IntelliJ необходимо настроить для использования любого из этих вариантов, иначе его накладные расходы даже для небольших файлов будут неоправданно большими.
Более низкая скорость компиляции. Scalac обрабатывает от 500 до 1000 строк в секунду. Javac справляется примерно в 10 раз больше. На это есть несколько причин.
Вывод типа стоит дорого, особенно если он включает неявный поиск.
Scalac дважды выполняет проверку типов; один раз по правилам Scala и второй раз после стирания по правилам Java.
Помимо проверки типов, для перехода от Scala к Java требуется около 15 шагов преобразования, которые требуют времени.
Scala обычно генерирует намного больше классов для заданного размера файла, чем Java, в частности, если функциональные идиомы широко используются. Генерация байт-кода и написание класса требует времени.
С другой стороны, программа Scala на 1000 строк может соответствовать программе Java на 2-3 КБ, поэтому некоторая более низкая скорость при подсчете строк в секунду должна уравновешиваться большей функциональностью на строку.
Мы работаем над улучшением скорости (например, путем параллельной генерации файлов классов), но чудес в этом плане ожидать не приходится. Scalac никогда не будет таким быстрым, как javac. Я считаю, что решение будет заключаться в серверах компиляции, таких как fsc, в сочетании с хорошим анализом зависимостей, чтобы перекомпилировать только минимальный набор файлов. Мы тоже над этим работаем.
источник
Вы должны знать, что компиляция Scala занимает как минимум на порядок больше времени, чем компиляция Java. Причины этого следующие:
XY.scala
файла не обязательно должен содержать вызываемый классXY
и может содержать несколько классов верхнего уровня). Поэтому компилятору может потребоваться поиск в дополнительных исходных файлах, чтобы найти данный идентификатор класса / признака / объекта.javac
требует больших вычислительных ресурсов и работы, которую не нужно делать вообщеscalac
включает в себя 8-битный симулятор полностью вооруженной и работающей боевой станции, которую можно просмотреть с помощью волшебной комбинации клавиш CTRL-ALT-F12 на этапе компиляции GenICode .источник
int a<T>(T a) {}
а затемa(pls_infer_my_type)
. james-iry.blogspot.com/2009/04/…Лучший способ сделать Scala - использовать IDEA и SBT. Настройте элементарный проект SBT (что он сделает за вас, если хотите) и запустите его в режиме автоматической компиляции (команда
~compile
), и когда вы сохраните проект, SBT перекомпилирует его.Вы также можете использовать подключаемый модуль SBT для IDEA и прикрепить действие SBT к каждой из ваших конфигураций запуска. Плагин SBT также предоставляет интерактивную консоль SBT в IDEA.
В любом случае (внешний запуск SBT или подключаемый модуль SBT) SBT продолжает работать, и, таким образом, все классы, используемые при построении вашего проекта, «разогреваются» и JIT-редактируются, а накладные расходы при запуске устраняются. Кроме того, SBT компилирует только те исходные файлы, которые в этом нуждаются. На сегодняшний день это наиболее эффективный способ создания программ Scala.
источник
Последние версии Scala-IDE (Eclipse) намного лучше справляются с управлением инкрементной компиляцией.
См. « Какая лучшая система сборки Scala? » Для получения дополнительной информации.
Другое решение - интегрировать fsc - быстрый автономный компилятор для языка Scala 2 - (как показано в этом сообщении в блоге ) в качестве конструктора в вашей среде IDE.
Но не непосредственно в Eclipse, как упоминает Дэниел Спивак в комментариях:
Наконец, как Джексон Дэвис напоминает мне в комментариях:
sbt (Simple build Tool) также включает в себя своего рода «инкрементную» компиляцию (через запускаемое выполнение ), хотя она и не идеальна , а улучшенная инкрементная компиляция находится в разработке для предстоящей версии 0.9 sbt.
источник
Используйте fsc - это быстрый компилятор Scala, который работает как фоновая задача и не требует постоянной загрузки. Он может повторно использовать предыдущий экземпляр компилятора.
Я не уверен, поддерживает ли плагин Scala Netbeans fsc (об этом говорится в документации), но я не мог заставить его работать. Попробуйте ночные сборки плагина.
источник
Вы можете использовать плагин JRebel, который бесплатен для Scala. Таким образом, вы можете как бы «разработать в отладчике», и JRebel всегда будет перезагружать измененный класс на месте.
Я где-то читал заявление самого Мартина Одерски, в котором он говорит, что поиск имплицитов (компилятор должен убедиться, что существует не более одного неявного неявного преобразования для одного и того же преобразования, чтобы исключить двусмысленность) может занять компилятор. Так что, возможно, стоит осторожно обращаться с неявными последствиями.
Если это не обязательно должна быть 100% Scala, но есть что-то подобное, вы можете попробовать Kotlin .
- Оливер
источник
Я уверен, что это будет отвергнуто, но чрезвычайно быстрая отдача не всегда способствует повышению качества или производительности.
Найдите время, чтобы подумать более тщательно и выполнить меньше микроциклов разработки. Хороший код Scala плотнее и важнее (т. Е. Лишен случайных деталей и сложности). Это требует больше размышлений и времени (по крайней мере, сначала). Вы можете успешно развиваться с меньшим количеством циклов кода / тестирования / отладки, которые по отдельности немного длиннее, но при этом повышают вашу продуктивность и качество вашей работы.
Вкратце: ищите оптимальную схему работы, лучше подходящую для Scala.
источник