Lua: общий (и личный) взгляд на язык

Впервые я поиграл с Lua примерно в 2013 году под влиянием друга, который какое-то время программировал на этом языке и рассказал мне о нем хорошие вещи. В то время у меня уже был несколько лет опыта программирования, и я имел контакт с разными языковыми парадигмами, на разных уровнях знаний, таких как Python, Ruby, JavaScript, Shell, C # и Java.

С того времени и по сей день я много программировал на Lua, и в какой-то момент он стал моим любимым языком для разработки в нерабочее время. Помимо небольших приложений, которые я делал по выходным, в свободное время я занимался разработкой http-сервера с открытым исходным кодом, полностью написанного на языке Lua, под названием Pegasus.lua.

У меня нет самых обычных навыков в сообществе разработчиков Lua. Я в первую очередь веб-программист, и в основном я использую Lua в качестве встроенного языка сценариев в приложениях C / C ++. Это внимание сообщества связано с тем, что Lua является языком высокого уровня с очень быстрым и легким интерпретатором (интерпретатор Lua имеет менее 200 КБ!), В отличие от других динамических языков, таких как Python и Ruby.

Что больше всего привлекло мое внимание в языке Lua, так это его простота. Обладая чрезвычайно дружелюбным синтаксисом и очень компактным ядром, Lua - это язык, который могут выучить за несколько минут те, у кого уже есть опыт программирования (особенно с интерпретируемыми языками). На практике я считаю Lua самым простым из тех, что я изучил, во многом из-за несложного синтаксиса Lua, а также из-за моего многолетнего опыта работы с JavaScript (да, Lua очень похож на JavaScript, но в его достоинствах! ).

Ниже я перечисляю сильные и слабые стороны Lua, которые я заметил к тому времени, когда начал использовать этот язык:

Сильные стороны:

  • Lua имеет ровно восемь типов: nil, string, number, function, boolean, thread, userdata и table (где обитает величайшая магия языка).
  • Как и в Self, JavaScript и Io, в Lua вы не реализуете объектную ориентацию через классы, а используете прототипы.
  • Metatable - отличная идея! Хотя вначале меня это сбивало с толку, концепция Metatable - это нечто чрезвычайно мощное в Lua. Это явный способ сделать перегрузку оператора, а также расширить возможности объектов (таблиц).
  • Функции в Lua первоклассные (также похоже на JavaScript). Это означает, что Lua позволяет программисту передавать функцию в качестве параметра, объявлять ее в переменной, сохранять в структуре данных, вся мощь JavaScript для управления функцией также находится в Lua. Эта гибкость для работы с функциями в Lua - это функция, которая мне очень нравится.
  • Поддержка закрытий.
  • Вы экспортируете модули, используя только return. Хорошо, это всего лишь деталь, но с тех пор, как я впервые увидел это в синтаксисе Lua, я нашел это чем-то чрезвычайно естественным.
  • Поддержка Коротины.
  • Интерпретатор Lua очень быстр по сравнению с другими динамическими языками, такими как PHP, Python, Ruby и даже Node.js.
  • Простая реализация методов метапрограммирования (хорошо, это динамический язык…).
  • Хотя Lua имеет ограниченное количество основных функций, он позволяет программисту очень просто расширять возможности языка.
    - Хотите ли вы иметь свойства в ваших прототипах? Хорошо, вы можете вставить эту функцию в язык:
    http://lua-users.org/wiki/ObjectProperties
    - Я программист на Python и люблю декораторы. Нет проблем, добавьте эту функцию в Lua:
    http://lua-users.org/wiki/DecoratorsAndDocstrings
  • LuaJIT на данный момент является одним из самых быстрых JIT для динамических языков.

Слабые точки:

  • В ядре языка отсутствует инструмент отладки. Я знаю многих программистов, которые не используют инструменты отладки, но мне особенно не хватает этого, и я не всегда думаю, что отлаживать мои коды с помощью печати.
  • В Lua нет классических функций обработки ошибок, таких как попытаться, поймать и наконец. Верно, что вы можете манипулировать результатами ошибок с помощью функции pcall, что, на мой взгляд, неестественно. Каждый раз, когда мне нужно обрабатывать ошибки и манипулировать ими, я использовал это решение:
    https://gist.github.com/cwarden/1207556
  • Lua не поддерживает тройное условие. С моей точки зрения, это не очень важная функция языка, но я признаюсь, что в конечном итоге я упускаю ее, когда мне нужно сделать небольшую проверку, которая будет, например, сохранена в переменной. Как и другие функции, тройное условие также можно расширить, создав функцию, которая делает его:
    «http://stackoverflow.com/questions/5525817/inline-conditions-in-lua-ab-yes -нет"
  • В сообществе не хватает библиотек для решения проблем, типичных для мира программирования. Возможно, это может быть даже характерной чертой сообщества (разработка небольших решений внутри более крупных проектов и отказ от выпуска этих решений в виде открытых исходных кодов) или сигналом того, что язык не очень популярен. У меня уже были трудности, например, с поиском надежной библиотеки для синтаксического анализа XML (я только что нашел отличную библиотеку XML, но она пока не пользуется популярностью).

Пункты, которые я выделяю как слабые в языке, также понятны для языка, который заботится о том, чтобы иметь легкого переводчика. Сильная сторона Lua, которая перекрывает слабые, заключается в том, что язык предлагает ресурсы для расширения его основных функций очень несложным способом.

Lua, как и любой другой инструмент программирования, не «серебряная пуля». Например, я определенно не считаю его идеальным инструментом для использования в ядре веб-приложений. Это не из-за каких-либо ограничений языка, а из-за отсутствия зрелых проектов для решения общих проблем в веб-среде - доступа к базе данных, инструмента кеширования, MVC и т. Д. Для решения этих проблем сообщества, такие как Python и Ruby, имеют очень зрелые библиотеки. и фреймворки и протестированы во всем мире.

Однако, будучи языком высокого уровня и имея один из самых быстрых интерпретаторов среди динамических языков, Lua является отличным вариантом для большого списка приложений, в которых производительность языка является проблемой (в чатах, играх, приложениях, которые должны запускаться во встроенных устройствах с ограниченным объемом памяти).