Я не изучал программирование в университете.
Я не хочу начинать holywar.
В 2016 Google советовал учить Python3 если нужен:
1. Легкий для старта язык.
2. Язык для машинного обучения.
3. Язык для простых 2d игр.
1. Я посмотрел первую лекцию курса Harvard CS50 на сайте JavaRush и понял, что не хочу:
#include <stdio.h>
int main(int argc, const char *argv[]) {
printf("Hello world\n");
return 0;
}
Когда можно так:
print('Monty Python')
JavaScript испугал комбинацией из трех систем: JS/HTML/CSS.
2. Машинное обучение вдохновляло тем, что все статьи и примеры напоминали киберпанк и научную-фантастику.
3. Можно программировать игры? Супер!
Я сделал import this, оценил философию Python и начал читать книгу Майкла Доусона «Программируем на Python». Через три недели после «Hello World!» я написал клон игры Life с GUI интерфейсом. Я полюбил Python и когда начались сложности я думал, что недостаточно знаю и пишу плохие алгоритмы.
Скорость
Я использовал tkinter и рисовал прямоугольники для создания клеток.
Поле 800x640. Размер клетки 10x10.
class Square(object):
def __init__(self, canvas, x, y, size, main):
self.canvas = canvas
self.cel = self.canvas.create_rectangle(x, y, x + size, y + size, fill='#EEEEEE')
self.main = main
self.color_change = True
self.canvas.tag_bind(self.cel, '<ButtonPress-1>', self.paint)
Такое маленькое поле не успевало полностью заполниться. Около 600 клеток быстро обновлялись, но как только, я уменьшил размер клетки до 4 – упала скорость изменения состояний клеток и отклика интерфейса.
Я удалил класс Square и начал рисовать пиксели по изображению. Интерфейс заработал нормально, но после 200 клеток все обновлялось очень медленно. Я нашел проблему в алгоритме. Рисовать клетку из 4 пикселей медленнее, чем из 1 пикселя.
def fill_black(self, x, y, color):
for i in range((-self.cell // 2) - 1, (self.cell // 2) - 1):
for j in range((-self.cell // 2) - 1, (self.cell // 2) - 1):
xx = (x + i) % self.can_width
yy = (y + j) % self.can_height
self.cell_matrix.put(color, (xx, yy))
После исправлений, я получил 600 клеток на нормальной скорости и очень мелкие фигуры на экране. Мне удалось довести скорость до 900 клеток, когда я перестал проверять изображение на «черный пиксель» и стал хранить состояние системы в матрице.
def fill_black(self, coords, color, virt_color):
x, y = coords
self.virt_mat[x][y] = virt_color
self.cell_matrix.put(color, (x, y))
Я установил pygame, перенес алгоритм и получил 9000 клеток на 4 fps. Но ведь игры работают быстрее, а там не только точки на экране.
Я начал подозревать, что дело в языке.
Я попробовал Cython. Система из 30000 клеток заработала на 4 fps.
Я не хотел С, но получил С.
Как запаковать для переносимости на другой компьютер?
С этим я справился с помощью py2app, но так и не понял как это работает.
Стандартная библиотека и сторонние модули
У меня не получилось этого оценить. Я постоянно устанавливал что-то еще и, иногда, модули не хотели работать друг с другом. У меня было три venv для отдельной запаковки приложений с tkinter, tkinter + pillow и pygame. Я смотрел в папку site-packages и не знал, что от чего зависит и зачем оно там лежит. Я не писал свои модули. Я искал готовые.
В общем, через это я прошел и захотелось простоты.
Язык, который можно охватить взглядом.
Я выбрал Lua. Почему-то, я выбрал еще один язык с не совсем привычным синтаксисом :-)
Скорость
Я сделал Life на Lua + Love2d. Я просто использовал функции языка и движка.
function Life:draw()
love.graphics.setCanvas(self.canvas)
love.graphics.clear()
for y=1,self.rows do
for x=1,self.cols do
if self.cells[y][x]==1 then
love.graphics.setColor(self.color)
love.graphics.points(x-1,y-1)
end
end
end
love.graphics.setCanvas()
love.graphics.setColor(set.WHITE)
love.graphics.draw(self.canvas,self.x,self.y)
end
При 111735 живых клетках система работает на 18 fps.
Как запаковать для переносимости на другой компьютер?
Я написал скрипты на Lua + Love2d для запаковки приложений для MacOS и Windows. Да, инструкция есть на сайте, но теперь для меня этот процесс не так «волшебен», как с py2app.
Маленькая стандартная библиотека
Мне не хватало привычных функций Python: map, filter, reduce, range и пришлось сделать функциональную библиотеку. В Lua нет классов, но я почитал как их добавить в язык и лучше понял как работают классы в Python. Только с Lua я полюбил замыкания и генераторы.
Когда я попробовал все функции стандартной библиотеки и треть функций из модулей для взаимодействия с языком С, то у меня сложилось общее представление о языке. Это очень приятное чувство. Lua как-будто, хорошо подходит для начала, но язык не популярен.
Если бы я мог заново выбрать первый язык, то я начинал бы с JavaScript.
Почему?
1. Язык запускается в браузерах.
2. Популярен.
3. Знакомство с web.
4. JavaScript + pixi.js и игра Life заработатает без проблем.
А Python я бы стал изучать вместе с алгоритмами машинного обучения.
Комментарии (12)
LibrarianOok
06.12.2019 09:24Lua как-будто, хорошо подходит для начала, но язык не популярен.
Вот это аргумент! Всем аргументам аргумент! Жаль, близзарды его не слышали.veledzimovich Автор
06.12.2019 11:37Есть еще Roblox. В нем используют Lua для создания скриптов для игр.
Сложно оценить количество активных пользователей/создателей.
Говорят о 10 миллионах активных юзеров в месяц.
Но рейтинг Lua на habr 11.44, а у Python 193.12
Lua – не универсальный инструмент и больше всего используется в разработке игр.LibrarianOok
06.12.2019 12:08Lua – не универсальный инструмент и больше всего используется в разработке игр.
Отнюдь.veledzimovich Автор
06.12.2019 12:16Я знаю про машинное обучение и torch.ch, но есть более популярная версия pytorch.org.
Есть web-фреймворки leafo.net/lapis luvit.io
Используется как встраиваемый язык.
Какие еще области применения?LibrarianOok
06.12.2019 12:53Тащемто любые, поскольку, как правильно отмечено, (но почему-то выводы не сделаны) Lua — встраиваемый язык. Кроме того, используя ffi в luajit можно цеплять сишные либы.
veledzimovich Автор
06.12.2019 13:25Извините, я не правильно употребил слово «не универсальный».
Правильно говорить о преимуществах Lua и эффективности в определенных сферах.
extempl
06.12.2019 10:04Lua как-будто, хорошо подходит для начала, но язык не популярен.
Если бы я мог заново выбрать первый язык, то я начинал бы с JavaScript.У вас между этими строками потерялась пара абзацев на тему почему не Lua.
veledzimovich Автор
06.12.2019 11:35Мне Lua нравится.
Я еще не нашел для себя недостатков, а с чужие слова не хочу повторять.
Sklott
06.12.2019 11:21+2Честно говоря этот рассказ с моей точки зрения выглядит примерно так:
«Никогда не занимался ремонтом. Решил начать знакомство с этой темой с работы мастерком. Но вдруг обнаружил что масторком очень неудобно забивать гвозди. Я уже и грузики приделывал и ручку удлинял, но молоток все равно лучше. Лучше бы я начал работать с пилой.»veledzimovich Автор
06.12.2019 11:33Отличная аналогия.
Вы правы, я столкнулся с проблемой выбора инструмента.
Без опыта «ремонта» не смог отличить мастерок от молотка.
Теперь поступил бы по-другому.
Bringoff
Я не специалист в JavaRush, но мне кажется подозрительным, что в первой лекции курса со словом «Java» в названии приводится Hello Horld на C.
Но вообще понятно, что автор хотел сказать.
veledzimovich Автор
Простите, я не точно выразился. Исправлю на «Я посмотрел первую лекцию курса Harvard CS50 на сайте JavaRush»