LINUX.ORG.RU

Python VS Java

 ,


0

8

Всем привет. Ковыряю backend-сервис на Java, и вот появились такие мысли - зачем в web'e нужен Python, если есть множество фреймворков на тех же Java, C#, Erlang, NodeJS, Golang, Rust... Иным словами - я понимаю зачем в web-development нужны такие языки как Rust/C++ (скорость исполнения, математика), Java и Erlang (большие нагрузки ага), Golang и NodeJS (возможность дёшево сделать асинхронный сервис)... Для быстрого клепания уже *дцать лет как существует Smalltalk/Seaside, подобные же штуки для Perl и TCL.

Для любителей наркомании в конце концов есть Haskell, OCaml, Lisp.

Отсюда резонный вопрос - зачем современному миру web-development Python с его кривой архитектурой, GIL и python-way головного мозга большей части программистов?

З.Ы.: если что, сам ранее занимался разработкой на змеюке (пять лет) под веб. Сам на свои вопросы заданные выше ответа не нашел, о питоне вспоминаю как о страшном сне. Особенно о Django

Ответ на: комментарий от anonymous

Там воркеры есть с некоторых пор, но достаточно костыльно.

Так воркер - это вообще отдельный инстанс v8. С таким же успехом можно запустить две ноды, гонять между ними данные и называть это многопотоком.

crutch_master ★★★★★
()
Ответ на: комментарий от anonymous

Вообще сама нода долбаный изврат

Ну почему сразу добланый. Нормальный такой изврат. С async костылями жить вполне можно.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от Deleted

Жаль тебя расстраивать, но Питон тоже переводит исходники в байт-код, и исходники для запуска скриптов ему не нужны.

Ты путаешь теплое с жестким.

Python может и из сырцов работать, и через байт-код. А корпорастические отрыжки Java/С# запускаются только через заранее скомпилированный байт-код. У них обфускация кода «by design».

Novator ★★★★★
()
Ответ на: комментарий от crutch_master

это - меньшая из проблем в кодинге

Это вовсе не проблема. Это питонская фича(1из), обеспечивающая тому пользователей.

DonkeyHot ★★★★★
()
Ответ на: комментарий от crutch_master

Зачем мне спринг для питона

Должно быть это третья киллерфича.питона.

Проблема кодеров, ... Причём тут ява

На питонах пишут не [только] самые лучшие в мире кодеры, и, почему-то, у них такого не получается. Причём тут кодеры?

В любом случае проблема фреймворкописателей

Это не проблема фреймописателей - у них всё работало. Это проблема пользователей, у которых всегда что-то не так, как у авторов.

DonkeyHot ★★★★★
()
Ответ на: комментарий от DonkeyHot

Это вовсе не проблема. Это питонская фича(1из), обеспечивающая тому пользователей.

В чём фича? В том, что ты не объявляешь private final static? Ты и в яве не обязан объявлять private final static. И класс длинной 40 символов не обязан каждый раз писать. Можешь сделать свой класс var и везде его использовать.
Тут дело в другом. Чтобы перевести json в pojo на яве или пили кучу классов или дёргай .get .has .etc какого-нибудь класса, в который завернули json. Это создаёт некоторые трудности, т.к. ты или вынужден размазывать логику происходящего на кучу классов или делать портянки вместо obj.key = value; Конечно, можно и это позаворачивать и навелосипедить своих объектов. Например мне надо вернуть json {«msg»:«ok»}. На js я просто пишу return {msg:«ok»}. В яве меня есть целый jackson ObjectMapper (om) и я делаю om.createObjectNode().put("msg", "ok").toString() Если нужно {msg:«ok», data : [1,2,3]} то всё еще сложнее:

//надо сделать arrayNode и пихать туда..
ObjectNode ret = om.createObjectNode();
ret.put("msg","ok");
ArrayNode arr = ret.putArray("data");
for (int i = 0; i < 4; i++) arr.put(i);
return ret.toString();
Я могу всё позаворачивать и получить что-то типа
return Obj("msg","ok").array("data").few("1,2,3").str();
Что всё равно будет жирно, но уже терпимее. А соль в том, что можно просто взять js и не выделываться всё это заворачивать, но это для меня, т.к. я пилю микросервисы, они маленькие и мне похрену на чём их писать. А если надо писать именно на яве, то проблемы о которых ты говоришь проблемами не являются. Учишь рефлексию, пишешь обёртки и всё ок. Например, чтобы сделать новый метод микросервиса я просто пишу
@MQCommand
public String myMethod(Integer i, Double d, List<String> st) {
    ...
}
Маленький ява класс парсит json, который хочет дёрнуть myMethod, подсовывает в ява метод параметры, заполняет List и мне ничего не надо проверять на null или корректность.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от DonkeyHot

Причём тут кодеры?

Потому что кодеры спринга решили срать стактрейсами. И они тоже не априори лучшие в мире. Ява как язык/платформа не заставляет срать стектрейсами. Я свои обрезал до первого нативного метода и мне норм, я всё вижу, что надо.

Это проблема пользователей

Не «проблема пользователей», а «проблема у пользователей», которую им сделали писаки, у которых проблемы с головами, раз они решили, что такие стектрейсы - это круто.

crutch_master ★★★★★
()
Ответ на: комментарий от DonkeyHot

Должно быть это третья киллерфича.питона.

Что на нём нет таких проектов, когда становится необходим dependency injector? Ну может быть и да. Киллерфича.

crutch_master ★★★★★
()
Ответ на: комментарий от crutch_master

на нём нет таких проектов, когда становится необходим dependency injector

Типа да - когда невозможно придумать, зачем бы это могло понадобиться в таком же виде/с такими же последствиями.

DonkeyHot ★★★★★
()
Ответ на: комментарий от crutch_master

Я свои обрезал ... и мне норм

А я свои и не трогал, и мне норм. Фича, однако.

«проблема у пользователей», которую им сделали

Пользователю от этого легче?

раз они решили, что такие стектрейсы - это круто

Давеча решал проблему «у пользователей, которую им сделали писаки», которые решили, что незачем пугать первых сообщениями об ошибках. Програмище разворачивалось, обнаруживало что-то, говорило «ой!» и сносилось. Это хуже трёхэтажных трейсов. Которые хуже понятных трейсов. Которые хуже адекватного сообщения об ошибке, Которое почти невозможно — слишком дорого предусматривать все варианты пойтинетака.

DonkeyHot ★★★★★
()
Ответ на: комментарий от crutch_master

В чём фича? В том, что ты не объявляешь

Именно. Не [так сильно] разбавляешь «смысл» ритуальными буквами.

я просто пишу

public String myMethod(Integer i, Double d, List<String> st) {
    ...
}

а «я» просто:

def myFunction(i,d,st):
    ...

Что из этого более «просто»? Даже без учёта того, что ты опустил описание класса.

DonkeyHot ★★★★★
()
Последнее исправление: DonkeyHot (всего исправлений: 1)
Ответ на: комментарий от next_time

в с++ ... мне всё понятно

Прошлая ++ная ошибка, которой мне довелось наслаждаться, выглядела как 3 страницы(во всю ширину экрана) букв и <>. Если там ничего сильно не изменилось, предлагаю считать, что либо ты сильно везучий, или я медленно читучий.

DonkeyHot ★★★★★
()
Ответ на: комментарий от DonkeyHot

Что из этого более «просто»? Даже без учёта того, что ты опустил описание класса.

Вообще монописуально, если честно. Не перетрудишься, если объявишь тип переменной. С чем проблемы я написал выше.

Именно. Не [так сильно] разбавляешь «смысл» ритуальными буквами.

Ты не понял. Тебе надо объявить public static final (не важно как). Ты его не объявляешь. Дошло?

crutch_master ★★★★★
()
Ответ на: комментарий от DonkeyHot

слишком дорого предусматривать все варианты пойтинетака.

Так их не надо прям все предусматривать. Сделай просто, чтобы было понятно, от чего всё свалилось, вместо трейса на 1000 строк.

А я свои и не трогал, и мне норм. Фича, однако.

Да, это фича, стоит перейти на питон. Сэкономил целых 5 минут времени бы.

crutch_master ★★★★★
()
Ответ на: комментарий от crutch_master

Не перетрудишься, если объявишь тип переменной

Между неперетруждаться и неутруждаться нормальные лентяи выберут второе.

DonkeyHot ★★★★★
()
Ответ на: комментарий от DonkeyHot

Это не критично совершенно, в стат.типизации есть куча другого гемора кроме этого. Вот питонщикам не нравится, что им говорят про отступы, а сами про объявления, да про скобки.

crutch_master ★★★★★
()
Ответ на: комментарий от DonkeyHot

... на каждой ф-ии, способной проблеваться ... Чего ради? Религия?

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

crutch_master ★★★★★
()
Ответ на: комментарий от DonkeyHot

Чего ради? Религия?

Инфраструктура, производительность. Я так-то и на ноде мог всё тоже написать с меньшим потом.

crutch_master ★★★★★
()
Ответ на: комментарий от crutch_master

Это не критично совершенно

Конечно. Просто удобно. Большинство предпочитает «удобное» «некритичному».

питонщикам не нравится, что им говорят про отступы, а сами про ... скобки

Наоборот, нравится. Замена скобок отсупами удобна. IMO питон ещё недостаточно далеко пошёл, я бы ещё поустранял. Впрочем, это вопрос вкуса, в отличии от:

объявления

Хаскель, вон, почти обходится без. Т.е. они - религия и ненужно.

DonkeyHot ★★★★★
()
Ответ на: комментарий от crutch_master

Инфраструктура, производительность

Напоминаю: это было обсуждение стектрейсов. Оно никак не относится к упомянотому в цитате. Разве что ты очень неканонически их употребляешь.

DonkeyHot ★★★★★
()
Последнее исправление: DonkeyHot (всего исправлений: 1)

Потому что железо стоит дешевле погроммистов и тестировщиков.

slaykovsky ★★★
()
Ответ на: комментарий от crutch_master

На одной единственной функции, которая обрабатывает все мои исключения

Это довольно загадочное утверждение. Ты имеешь в виду(псевдокод)

def main:
  try: do_everything()
  except: hide_the_reason_and_die()
или
try: do_something()
except: one_func_fits_all_errors_handler()

DonkeyHot ★★★★★
()
Ответ на: комментарий от DonkeyHot

Т.е. они - религия и ненужно.

Что сразу религия и ненужно. Так-то удобнее сразу знать, с чем имеешь дело, чем не знать и чекать всё на инт.

Конечно. Просто удобно.

Кстати, насчёт удобно. Откуда я знаю в питоне/жс что мне пришло в функцию? Может говно какое-то. Надо делать чекер и где-то что-то объявлять. В яве у себя я уже знаю, что мне надо, а в жс, например, я нихрена не знаю и мне надо что-то придумывать, чтобы не пихать везде parseInt.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от DonkeyHot

Напоминаю: это было обсуждение стектрейсов.

Стектрейсы - это вообще херня. На яве не пишут не из-за стектрейсов.

crutch_master ★★★★★
()
Ответ на: комментарий от DonkeyHot

Неправильно, в питоне все - объекты. Функция получается, если объекту просто добавить метод __call__

In [1]: def a():
   ...:     pass
   ...:

In [2]: isinstance(a, object)
Out[2]: True

In [3]: a.__call__
Out[3]: <method-wrapper '__call__' of function object at 0x1027a4158>

In [4]: isinstance(True, object)
Out[4]: True

In [5]: isinstance(1, object)
Out[5]: True

Shtsh ★★★★
()
Ответ на: комментарий от Shtsh

А выполнением кода там можно рулить прямо в рантайме? Выловить, например, значения всех локальных переменных функции.

crutch_master ★★★★★
()
Ответ на: комментарий от DonkeyHot

характерно для stl и boost, для всяких Qt всё выглядит по-другому, впрочем, stl-ные ошибки тоже нормально читаются, несмотря на 3 страницы - как правило, ошибка по первой верхней строке становится ясна

next_time ★★★★★
()
Ответ на: комментарий от Shtsh

Функция получается, если объекту просто добавить метод __call__

Или получается вызывабельный объект, который от функции отличается ... всем, кроме того, что с ним () делает?

DonkeyHot ★★★★★
()
Ответ на: комментарий от crutch_master

удобнее сразу знать, с чем имеешь дело

Не удобнее, а спокойнее. Это уже килерфича статически типизированных языков. «Для людей со слабой памятью.»

Откуда я знаю в питоне/жс что мне пришло в функцию

Ровно то, что клиенту захотелось передать. Он же ближе к задаче — ему лучше видно, и он всегда прав. А когда он не прав - просто не лови исключений и это уже будет не твоя проблема.

DonkeyHot ★★★★★
()
Ответ на: комментарий от DonkeyHot

Не удобнее, а спокойнее.

При чём тут спокойнее и слабая память? Я знаю, что в Integer будет или 32 битное целое или null. С динам.типизацией там может быть всё, что угодно и я обязан чекать, если не знаю откуда оно пришло и что там может быть перед тем, как что-то делать.

Ровно то, что клиенту захотелось передать.

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

crutch_master ★★★★★
()
Ответ на: комментарий от crutch_master

При чём тут ... слабая память.

Это была старая шутка про пользу статической типизации.

Я знаю, что в Integer будет или 32 битное целое или null

это не про удобство, это про самкомпилероуверенность.

я обязан чекать

Нет. «Ты» обязан вести себя предсказуемо, если тебя вызвали правильно. Вызывать тебя правильно - «их» задача(если хотят получить предсказуемое). Если это ты на обоих сторонах баррикады - см. выше про память.

DonkeyHot ★★★★★
()
Ответ на: комментарий от DonkeyHot

это не про удобство, это про компилероуверенность.

Компилируемость тут не причём, там может быть хоть Object, хоть void*, но тогда бы мне пришлось чекать, что пришло этот Object каждый раз. Собственно, так и было изначально я принимал только String'и и парсил их прям там.

Нет. «Ты» обязан вести себя предсказуемо, если тебя вызвали правильно.

Вот смотришь потом в такой код и понятия не имеешь, как правильно вызвать, пока не перекопаешь все исходники.

crutch_master ★★★★★
()
Ответ на: комментарий от crutch_master

Вот смотришь потом в такой код и понятия не имеешь, как правильно вызвать, пока не перекопаешь все исходники.

Использовать код, к которому нет ни док, ни примечаний? Да лучше с метлой в руках.....

yyk ★★★★★
()
Ответ на: комментарий от yyk

Использовать код, к которому нет ни док, ни примечаний?

Доки если и были бы, то не актуальные, а примечания типа

//Делаем a равным b
a = b;
малополезны.
Да и если не чекать типы, можно сделать такую херню, которую не сразу заметишь и код будет то работать то нет или падать, но где-то в другом месте.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от slovazap

Это даже хуже чем GIL, потому что с GIL можно таки IO писать на потоках если хочется.

В ноде весь IO из коробки на тред-пуле. О чем ты говоришь?

mimico
()
Ответ на: комментарий от crutch_master

С таким же успехом можно запустить две ноды, гонять между ними данные и называть это многопотоком.

Нет, нельзя с таким же успехом. Данные между воркерами могут передаваться без копирования (передача владения) это во-первых. Во-вторых могут использовать SharedBuffer.

А в твоих двух экземплярах ноды, ты постоянно будешь копировать данные.

mimico
()
Ответ на: комментарий от crutch_master

Компилируемость тут не причём, ... пришлось чекать

При том, что он за тебя что-то проверит, и ты можешь расслабиться.

смотришь потом в такой код и понятия не имеешь, как правильно вызвать

Никто же и не говорил, что в питонах всё лучше. Впрочем, в имя аргумента инфу засунуть даже проще, чем в объявление типа, т.ч. это существенно только при строительстве вавилонских башен упоротыми гольферами, .

DonkeyHot ★★★★★
()
Ответ на: комментарий от crutch_master

С таким же успехом можно запустить две ноды, гонять между ними данные и называть это многопотоком.

Как пример твоего заблуждения вот пруф. Код на TS (компилруемый разумеется в итоге js и исполняемый на той же ноде) использует для распараллеривания воркеры-потоки.

Код написанный на ванильном js и исполняемый той же нодой, использует воркеры-процессы.

https://benchmarksgame-team.pages.debian.net/benchmarksgame/faster/typescript...

mimico
()
Ответ на: комментарий от crutch_master

И правда. Спасибо! Для общего развития очень полезная инфа, но надеюсь она мне не пригодится)

Уже не помню даже где подцепил это заблуждение.

chuemir
()
Ответ на: комментарий от ggrn

99% статьи автор повторяет мантру про время программиста дороже времени оборудования. Разумно, но не интересно.

Затем он щеголяет сомнительным

This is mainly due to the fact that python comes with “batteries included” and has many 3rd party libraries

Как будто у других языков не так.

и графиком, с отсылкой на некий первоисточник «How long it takes to write a string processing application in various languages.» (Prechelt and Garret) Что, чего и почему вдруг авторы решили, что их методика показательна - непонятно.

Это всё что-ли? Аргументам конец?

next_time ★★★★★
()
Ответ на: комментарий от next_time

Как будто у других языков не так.

Да.

Что, чего и почему вдруг авторы решили, что их методика показательна - непонятно.

Так возьми и прочитай. Какие тебе ещё пруфы, если ты их не читаешь?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.