ТОП-10 самых легких для изучения языков программирования
Когда речь заходит о выборе карьеры разработчика или добавлении к списку ваших навыков нового языка, следует учитывать, что некоторые языки являются более легкими в изучении, чем другие. Эта подборка основывается на исследовании отношения девелоперов к языкам, проведенном WPEngine.
WP Engine опросил 909 разработчиков в США. Наибольший процент из них (14%), что не удивительно, родом из Калифорнии. Большое количество программистов проживает в таких штатах как Флорида, Нью-Йорк и Техас. Около 70% всех опрошенных программистов были мужчинами, 30% — женщинами.
Перед вами 10 самых легких для изучения языков программирования с указанием процента проголосовавших за них разработчиков (согласно данным Wp Engine).
HTML (13,3%)
Этот язык победил в двух номинациях: он был назван самым легким для изучения и таким, с которым софортнее всего работать. Созданный в 1990 году, этот язык разметки является первейшим инструментом для создания стандартных веб-страниц и приложений для любого браузера.
Python (9%)
Python известен своей высокой читабельностью и простым синтаксисом, что делает его легким для изучения. “Благодаря логичности и простоте Python легок в использовании и доступен, особенно для кодеров-новичков”, – говорится в исследовании. Созданный в 1989 году и увидевший свет в 1994, Python используется вот уже 25 лет.
Javascript (6,2%)
Javascript имеет открытый код и использует комбинацию функций из языков C, C++ и Java. Это позволяет программистам выбирать язык, который подойдет им лучше всего. Javascript также находится в верху списка языков, которые программеры считают самыми креативными.
PHP (4,9%)
PHP – язык сценариев. Имеет открытый код и относится к языкам общего назначения. PHP особенно подходит для веб-расширений и может быть встроен в HTML.
Java (4,6%)
Это язык программирования общего назначения, специально предназначенный для максимального уменьшения зависимостей в реализации. Создан в 1991 году. Java также был назван наиболее благодатным и универсальным языком.
R (4,4%)
R это язык программирования с открытым кодом для статистических вычислений и работы с графикой. Он поддерживается организацией “Организацией статистических вычислений R”.
Shell (4,4%)
Скрипт shell это компьютерная программа, созданная для запуска командной оболочкой Unix. Обычно используется для манипуляций, исполнения программ и вывода текста.
Ruby (4,1%)
Ruby это динамический язык программирования с открытым исходным кодом. Делает главный акцент на простоте. Также занимает высокие позиции в списке наиболее креативных языков.
Erlang (3,8%)
Erlang это многопоточный функциональный язык программирования общего назначения. Используется для разработки параллельных и распределенных систем.
Go (3,6%)
Go, язык программирования с открытым кодом, разработанный Google. Весьма полезен при создании веб-приложений с минимумом фреймворков, веб-серверов и API. Go app также легко запускать на облачной платформе Google. Этот язык был отмечен также как наиболее интуитивный.
Lua: маленький язык, который смог
Lua — это, пожалуй, мой любимый «маленький язык», с низкой когнитивной нагрузкой и простотой в изучении и использовании. Он встроен во многое ПО, такое как Redis, NGINX через OpenResty и Wireshark (прим. перевод.: и многие другие). Он также используется в качестве скриптового языка в таких играх, как World of Warcraft и Roblox через Luau (прим. перевод.: и многих других). Этот пост — краткое признание в любви языку с некоторыми примерами того, почему он мне так нравится.
Простота
В Lua относительно немного фич и относительно мало синтаксиса. К примеру, в языке всего 8 типов:
- nil
- boolean
- number
- string
- userdata (для представления С-шных структур данных или блоков памяти в куче)
- function
- thread (для корутин)
- table (ассоциативный массив и, по совместительству, единственная встроенная структура данных)
Нет нужды беспокоиться о float , int , usize . Нет нужды беспокоиться о различиях в массивах, словарях и структурах. Даже классы тут это просто таблицы ( table ) с указанными мета-таблицами ( metatables , прим. перев.: думайте о прототипах, как в JavaScript). Такая простота во всём делает Lua лёгким в освоении и использовании, обеспечивая при этом достаточную мощь для выполнения большинства необходимых задач.
Давайте реализуем простой бинарный поиск по массиву на Lua:
-- однострочные комментарии начинаются с двух тире function binary_search(array, value) local low = 1 local high = #array -- # это оператор взятия длины while low value then high = mid - 1 else return mid end end return nil end res = binary_search(, 6) print(res)
Всё это должно быть относительно знакомо, даже если вы никогда раньше не сталкивались с Lua. Единственное, что может показаться непривычным, это ключевое слово local , которое используется для объявления переменных (прим. перев.: и не только). По умолчанию все они глобальны, так что local используется для объявления локальной переменной относительно текущей области видимости.
Транспиляция
Lua является великолепной целью для транспиляции, благодаря его простоте и лёгкости взаимодействия с C. Поэтому, Lua — отличный выбор для предметно-ориентированных языков (DSL-ей), таких как Terra, MoonScript и Fennel.
В качестве краткого примера, вот тот же бинарный поиск написанный в MoonScript и Fennel соответственно:
binary_search = (array, value) -> low = 1 high = #array while low value high = mid - 1 else return mid return nil print binary_search , 6
(fn binary-search [array value] (var low 1) (var high (length array)) (var ret nil) (while ( mid-value value) (set high (- mid 1)) (do (set ret mid) (set low high)))) ; no early returns in Fennel ret) (local res (binary-search [2 4 6 8 9] 6)) (print res)
Встраиваемость
Но истинная сила языка заключается в том, что вы можете внедрить его практически куда угодно — Lua реализован как библиотека для программы-хоста, типа Redis. Традиционно, это была программа на C, но теперь существуют многие реализации виртуальной машины Lua в разных языках, таких как Javascript (с Fengari) или Go (c GopherLua). Однако, одной из самых популярных реализаций является скриптовый язык Luau для игры Roblox.
Возможно, одно из моих любимых применений Lua — это HAProxy, возвращающий нас во времена Apache + mod_php скриптинга. Давайте настроим конфигурацию HAProxy, которая будет отвечать на запросы по определённому пути случайным предсказанием:
local function fortune(applet) local responses = < < quote = "The only people who never fail are those who never try.", author = "Ilka Chase" >, < quote = "The mind that is anxious about future events is miserable.", author = "Seneca" >, < quote = "A leader is a dealer in hope.", author = "Napoleon Bonaparte" >, < quote = "Do not wait to strike until the iron is hot; but make it hot by striking.", author = "William B. Sprague" >, < quote = "You have power over your mind - not outside events. Realize this, and you will find strength.", author = "Marcus Aurelius" >> local response = responses[math.random(#responses)] local resp = string.format([[ %s
--%s
]], response.quote, response.author) applet:set_status(200) applet:add_header("content-length", string.len(resp)) applet:add_header("content-type", "text/html") applet:start_response() applet:send(resp) end core.register_service("fortune", "http", fortune)
global lua-load fortune.lua defaults retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s frontend fe_main bind :8080 mode http http-request use-service lua.fortune if < path /fortune >
$ curl localhost:8080/fortune Do not wait to strike until the iron is hot; but make it hot by striking.
--William B. Sprague
Зачем вообще так делать? Легко вообразить ситуацию, в которой нужна небольшая логика приложения поверх веб-сервера, но вы не хотите писать полноценной веб-приложение под эту задачу. Или же вы хотите расширить функционал существующих приложений, например, добавить небольшой запрос (endpoint) для проверки статуса (healthcheck) Redis-сервера:
-- это сторонний форк redis-lua с поддержкой TLS: local redis = require("redis-tls") local settings = < host = "127.0.0.1", port = 6379, database = 14, password = nil, >local utils = < create_client = function(params) local client = redis.connect(params.host, params.port, 1, false) if params.password then client:auth(params.password) end return client end, >local function redis_health(applet) -- pcall как try/catch, принимает функцию и аргументы, -- и возвращает true/false и результат выполнения функции local ok, client = pcall(utils.create_client, settings) if not ok then local string_resp = '\n' applet:set_status(500) applet:add_header("content-length", string.len(string_resp)) applet:add_header("content-type", "application/json") applet:start_response() applet:send(string_resp) return end local resp = client:ping() local string_resp = string.format('\n', resp) applet:set_status(200) applet:add_header("content-length", string.len(string_resp)) applet:add_header("content-type", "application/json") applet:start_response() applet:send(string_resp) end core.register_service("redis_health", "http", redis_health)
global lua-load redis.lua frontend fe_main bind :8080 mode http http-request use-service lua.redis_health if < path /redis_health >
$ curl 127.0.0.1:8080/redis_health
Redis-сервер работает и доступен:
$ curl 127.0.0.1:8080/redis_health
Можно пойти дальше и использовать register_action и register_fetches (см. доки) для перехвата информации о запросе, его изменения или добавления дополнительных возможностей аутентификации поверх ПО без встроенной системы аутентификации.
Сообщество
Оно не особо велико, но в нём ведётся множество отличных разработок, а многие библиотеки доступны через простой пакетный менеджер LuaRocks. От библиотек для быстрого парсинга и кодировки JSON до дополнений к стандартной библиотеке (прим. перевод.: или даже добавления программируемых компьютеров в Minecraft) — для каждого найдётся что-то своё.
Отдельного упоминания заслуживает Лиф Коркоран (Leaf Corcoran), написавший Lapis — фантастический небольшой веб-фреймворк для дистрибутива OpenResty, на котором работает сайт LuaRocks.
Прим. перевод.: В отличие от некоторых сообществ, в Lua нет ни мелких, ни больших скандалов или интриг (см. Rust 👀: ^1, ^2, ^3)
Заключение
Есть ли какой-то вывод? Lua очень хорош, вы можете освоить его за выходные и начать использовать его для написания слоёв авторизации в HAProxy, аддонов для World of Warcraft, игр в рамках Roblox, скриптов для вашего оконного менеджера, работы с сетями или просто небольших библиотек, которые делают вас чуточку счастливее.
Прим. перевод.: и не забывайте про игровые движки — Love2D, Defold и интеграция с Raylib.
От себя я бы рекомендовал посмотреть на Fennel, упомянутый выше в переводе. Это LISP, который транспилируется в Lua — вы получаете скорость, простоту и доступность Lua c гибкостью LISP-синтаксиса и макросов.
А для тех, кто только начинает свой путь в программировании, у меня есть промокод HABR23. Где применить не скажу, а то реклама 🙂
Кстати, я веду Телеграм-канал для заинтересованных в обучении и осмыслении всего в IT, присоединяйтесь, если ещё не!