LINUX.ORG.RU

Выбор языка программирования

 


0

5

Здравствуйте, коллеги!

Понимаю, что данная тема из разряда holywar, но так уж вышло.

Я более-менее знаю С, С++. Последний мне не нравится.

Поверхностно знаком с Python. Он не плох, только уж слишком тормознутый. Еще в минусы падает, сложная переносимость между устройствами, тут и разноверсица, и возможные сложности с использованием библиотек. Да. Многое решает venv, но это ужасно не удобно.

В общем, со всем можно было бы смириться, кроме тормознутости. До смешного. Сделал в питоне функцию, которая выполняет банальнейшее XOR шифрование, потом то же самое сделал на С и замерил скорость при работе с блоком данных в 100Мб.

Результат убил на повал. Сишный код оказался быстрее более чем в 1000 раз! Это как, вообще? Понятно, что функцию шифрования можно написать на С и подцепить ее в питоновском сприпте, но постепенно оказывается, что нужно что-то еще ускорить на С. И еще что-то. И еще… В результате от питона ни фига не остается.

Вроде, ну если знаешь С и С++, то пиши и радуйся жизни! Но, С++, как я написал выше, мне не нравится. А на чистом С работа со строками - издевательство.

Раз уж я знаю С, то что стоит изучить любой другой язык?

Вот я и решил копнуть Rust и Golang…

Что сказать… Посмотрев немного на Rust у меня остатки волос встали дыбом! Нагородили хрен знает что! У меня создалось впечатление, что Rust это просто набор костылей.

Возможно я не прав, даже скорее всего, но вот на него переползти с С для меня окажется или непосильной задачей, или ооочень сложной.

Golang? С ним вроде попроще. Но снова чувство костылинга. Плюс, зачем-то изголянее с объявлением переменных. Ну нафига тип переменной идет после ее названия? Типа, Golang не С? Впрочем, у Rust то же самое. Ну зачем???

Еще сильно поразило, что в Go и Rust нет нормальной перегрузки функции, типа int wise_func(char * str) и int wise_func(char * str, int len), Как в С++. Ну и функций с параметрами по умолчанию нет ни там, ни там. Алё! Разрабы! Вы ухи объелись?

Вроде, с помощью костылинга можно решить эти проблемы, но, блин, опять костыли!

В общем, поверхностный взгляд на Rust и Go, отбил всякое желание изучения.

Python мне дался очень легко, и можно было бы его простить за некоторые неудобства, но он таакой тормоз! К тому же, я практически все автоматизационные скрипты сначала написал на Python, а потом всех их переписал на BASH.

Да, BASH еще более тормознутый и разбирать свой же скрипт, через месяц после написания, то еще удовольствие, но хотя бы bash скрипты без проблем переносимые!

В общем, я в печали. Хочется некий язык общего назначения что бы он был быстрым и был лишен неудобств старичка С, но, по ходу, нет гармонии в мире IT.



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

Мухи отдельно, котлеты отдельно.

LuaJIT – не язык, а компилятор для Lua. А называть Lua «малоизвестным языком» – это бгг, в геймдеве, например, он более чем известен.

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

В Си такие строки тоже можно сделать, если напишешь для них небольшую библиотеку.

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

ugoday ★★★★★
()

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

А всё потому, что хорошо ускоряется, причём на разных уровнях, например:

  • высокоуровненые ML-фреймворки (tensorflow, pytorch со всякими cuda, да сейчас тысячи их)
  • numpy - вычислительная библиотека общего назначения, предлагающая для вычислений свой класс ndarray
  • numba - ускоряет вычисления на стандартных питоновских классах, выставив волшебную аннотацию: правда есть оговорка, внутри должны только поддерживаемые конструкции (со списком ознакомитесь на сайте)

Выбирайте под свою задачу и проблем со скоростью не будет, всяко проще, чем новый язык поднимать.

tra-ta-ta
()

Ну нафига тип переменной идет после ее названия? Типа, Golang не С? Впрочем, у Rust то же самое. Ну зачем???

Такая практика в языках, где для объявления переменной пишут какое-то ключевое слово (let, var, val, ..). Тип вычисляется компилятором, ну а когда всё же его надо явно указать, выделено мест уже после названия.

tra-ta-ta
()

Но, С++, как я написал выше, мне не нравится

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

alysnix ★★★
()

А на чистом С работа со строками - издевательство

изначально не в ту сторону думаешь. Прежде чем что-то там химичить со строками, в первую очередь убедись - а ты вообще то делаешь? Может, чем парсить нужные данные регулярками, эвристиками и какой-то матерью, их можно откуда-то взять в сыром виде? А если нельзя, то может послать тривиальный пул реквест из пары строчек в нужный проект и сделать так, чтобы стало можно?

Вон как разработчики перфа поступили, когда им захотелось строить флеймграфы. Им ядро выдавало данные в неподходящем формате, а скрипт конвертации жрал гиги, если не десятки гигов оперативки. Вместо того чтобы до талого выжимать из него лишние такты процессора, они фиганули поддержку BPF в нужную подсистему ядра, чтобы им сразу выдавало то, что нужно и так, как нужно. В результате им стали нафиг не нужны никакие скрипты, вывод скармливается напрямую флеймграфу. Вот это я называю «разработка программного обеспечения».

Lrrr ★★★★★
()
Последнее исправление: Lrrr (всего исправлений: 1)
  • Java: схожий синтаксис, мощное ООП, приемлемая производительность, кроссплатформа.
  • C#: примерно то же самое, что и Java, но кроссплатформа похуже.

Некоторые байки гласят, что крестовики чаще всего перетекают на эти два.

У меня создалось впечатление, что Rust это просто набор костылей

Golang? С ним вроде попроще. Но снова чувство костылинга.

Дело всегда не в языке, а в нейропластичности. Когда она высокая — просто осваиваешь новую нишу, впитываешь её особенности как губка. У каждого ЯП ведь свои особенности, свои костыли и сильные стороны. Когда нейропластичность так себе, каждый новый инструмент вызывает боль и страдания. Поэтому нужно искать похожие. Ну или страдать.

Zig можно потыкать. Но ООП у него на порядки слабее, чем у первых двух. Есть ещё Crystal, Nim, Haxe, Hare.

Что насчёт JavaScript / TypeScript (Node, Bun)?

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

InterVi ★★★★★
()

Golang? С ним вроде попроще. Но снова чувство костылинга. Плюс, зачем-то изголянее с объявлением переменных. Ну нафига тип переменной идет после ее названия? Типа, Golang не С? Впрочем, у Rust то же самое. Ну зачем???

Наследие функциональных языков, к которым особенно близок тот же Rust. Там все, наоборот, плюются от сишного стиля писать тип перед названием переменной. С одной стороны, сила привычки, а с другой, наверное, есть какое-то здравое объяснение тоже. Как минимум, сложные вложенные типы много-много легче записывать, когда тип пишется в конце, а в функциональщине типы гораздо значимее, чем в императивных языках.

Еще сильно поразило, что в Go и Rust нет нормальной перегрузки функции, типа int wise_func(char * str) и int wise_func(char * str, int len), Как в С++. Ну и функций с параметрами по умолчанию нет ни там, ни там. Алё! Разрабы! Вы ухи объелись?

Опять же наследие функциональных языков, где перегрузка очень сильно мешает выводу типов (привет, Скала!). Кроме Скалы такое безобразие в виде перегрузки есть еще в F#, хотя, к счастью, в последнем перегрузка поддерживается лишь частично на уровне ООП.

Тут тебе, возможно, Ада зайдет, как посоветовали выше. В этой Аде даже ООП сделано через перегрузку (ужас-ужас, ну, да ладно - у всех вкусы разные).

Что сказать… Посмотрев немного на Rust у меня остатки волос встали дыбом! Нагородили хрен знает что! У меня создалось впечатление, что Rust это просто набор костылей.

Так-то, в Rust все обосновано и выглядит разумно, но чтобы это понять нужен иной бэкграунд. Людям с опытом в функциональных языках Rust довольно-таки легко дается, и даже очень многим из них нравится. Когда нет опыта в ФП, то люди часто действительно не понимают, зачем Rust сделан таким…

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

anonymous
()

Сделал в питоне функцию, которая выполняет банальнейшее XOR шифрование, потом то же самое сделал на С и замерил скорость при работе с блоком данных в 100Мб Сишный код оказался быстрее более чем в 1000 раз!

попробуй использовать numpy, результаты будут сопоставимы с С.

В результате от питона ни фига не остается

и от питона остается практически всё.

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

руст разве функциональный??? функциональщины нет без ленивых вычислений, замыканий, сборки мусора. то есть без этого функциональщина вообще не нужна.

руст вроде чисто императивный жеж.

alysnix ★★★
()

карочи хочешь писать для аппаратуры, и системщины всякой - это си.

хочешь писать все что угодно и эффективно - это си++

хочешь вебщины - это javascript/typescript

хочешь энтерпрайза(то есть всякие бизнес приложения, продажи, клиенты, купил/продал, дебет/кредит) это java, на худой конец - с#.

хочешь прослыть фриком - руст.

все остальное можно пока не рассматривать.

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

а писать просто софт на питоне - это беспредел.

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

Основная идея функциональщины - это представление программы как вычисления функции, которая бы в свою очередь являлась композицией более простых функций. Чтобы всем этим управлять, используют чистоту и часто ссылочную прозрачность. Первая является необходимым условием последней, а последняя является обязательным условием для ленивости.

И здесь нужна иммутабельность по умолчанию, что есть в расте. В расте много чаще встретишь чистую функцию, чем в тех же плюсах. И композиция функций там тоже частый гость - возьмите тот же интерфейс фьюч через комбинаторы, который был единственным до введения синтаксиса async-await. И это, кстати, пример монадического интерфейса, реализованного на языке раст.

Я же не говорю, что раст функциональный. Я говорю, что он имеет тесные связи с функциональными языками.

Ну, и уже устали повторять, что характеристики (traits) в раст - это такая адаптированная версия классов типов. Классы типов как бы не совсем ФП, но исторически возникли именно там, а именно в хаскеле.

Что касается замыканий, то они, вон, даже в C++ есть, а уже более далекого от ФП языка еще поискать надо!

Сборка мусора не относится к основной идее ФП, но так получилось, что ФП много проще реализовать, имея сборщик мусора. Да и некоторые вещи действительно завязаны на GC, но не все, всякие там трюки с мемоизацией, скажем.

Раст пытается усидеть сразу на двух стульях. Он и императивный, безусловно, но и идей, взятых из функциональных языков, в нем выше крыши. Чистым функциональным его, конечно, назвать нельзя, но и дальним родственником - тоже.

anonymous
()

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

amm ★★
()

Результат убил на повал. Сишный код оказался быстрее более чем в 1000 раз! Это как, вообще? Понятно, что функцию шифрования можно написать на С и подцепить ее в питоновском сприпте…

А так во сколько? Ну, чтоб погадать где не оптимальность.

anonymous
()

Не годен. Ты сумел грубо ошибиться в заголовке темы, а чтоб программировать надо быть внимательным и аккуратным, чего у тебя нет. Ну а если бы ты был годен, то C#. Довольно быстрый и строки там адекватные.

peregrine ★★★★★
()

Ну нафига тип переменной идет после ее названия?

Это намного удобнее, когда ты делаешь разбор кода компилятором при сильной типизации.

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

Эм, луа ещё как живёт, я исплевался с ним, потому как ненавижу его концепцию что всё есть таблица (я привык к другим таблицам чем там). На луа почти все моды и логика игр делаются. Потому как на крестах писать что-то кроме низкоуровневого движка очень не хочется.

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

Нет в нем лаконичности

Лютое 4.2

О, там уже можно не писать

if err != nil {
    return nil, err
}

каждую вторую строку?

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

Сборка мусора не относится к основной идее ФП, но так получилось, что ФП много проще реализовать, имея сборщик мусора.

в ФП память вообще отсутствует как понятие. константные обьекты возникают по щучьему велению, и исчезают во тьме неизвестности, по хотению реализации.

нету там «памяти», и все тут.

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

руст разве функциональный

Околофункциональный, первая версия компилятора была написана на OCaml и очень много из него заимствовало.

функциональщины нет без ленивых вычислений

Хакеля нет без ленивых вычислений, а функцианальщина без них вполне обходится, то же ML семейство например (Standard ML, Ocaml, F#).

замыканий,

Это плюс паттерн матчинг, иммутабельность по умолчанию, урезанную модульность из Ocaml, типы классов (в виде трейтов) из хаскеля вполне перенял.

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

С одной стороны, сила привычки, а с другой, наверное, есть какое-то здравое объяснение тоже

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

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

Даже Лойнуса затрахали эти ваши nul-terminated strings. Абсолютно парашная идея с самого начала.

Му-ха-ха! ;-DDDDD Для зайки слишком СЛОЖНААА!!! :) Интересно тебе мамка вилкой дёт пользоваться или опасается?! :)

Как говорится А на заборе вона чего написано! А там дрова лежат!(С)

struct seq_buf { char *buffer;

Спроси у папки что это значит :)

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

Это плюс паттерн матчинг, иммутабельность по умолчанию, урезанную модульность из Ocaml, типы классов (в виде трейтов) из хаскеля вполне перенял.

паттерн матчинг… это просто синт сахар для if …elsif… elsif.

«иммутабельность по умолчанию», это просто форма соглашения, в чем тут принципиальная новизна?

типы классов… это небось эвфемизм интерфейсов, не?

а модульности - сто лет в обед и без OCаml

alysnix ★★★
()

Я хз, по-моему с++ хватает для всего, на нём можно писать даже то, для чего часто используют большие сложные скрипты на баше или питоне

anonymous
()

Еще сильно поразило, что в Go и Rust нет нормальной перегрузки функции, типа int wise_func(char * str) и int wise_func(char * str, int len), Как в С++. Ну и функций с параметрами по умолчанию нет ни там, ни там.

В C этого тоже нет, надо костылить. Не проще ли использовать С++ с любимым подмножеством фич? И учить ничего не придется…

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

типа хелловорд?

Типа вебсервиса.

ну напиши на нем приложеньице для копеечного микроконтроллера
а он соберет бинарник под какой-нить stm32?

Ты хоть сам понимаешь какой бред пишешь?

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

Я не занимаюсь программированием контроллеров, поэтому не могу сказать, как с этим обстоят дела в мире dotnet, но гуглится такая штука https://github.com/nanoframework/nanoFramework.Hardware.Stm32. И все равно не понятно, откуда в теме микроконтроллеры всплыли :)

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

вот отсюда. тут утверждается что шарп - «самый универсальный».

Выбор языка программирования (комментарий)

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

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

Чувак, ты прикопался к слову, но ты не знаешь значение этого слова.
Универсальный означает подходящий для большинства задач, а сишечка или не знаю за что ты там топишь, подходит только для низкого уровня, остальное писать на таких языках это извращение.

arax ★★
()

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

Особенно позабавил наезд на Go :) А он как раз подходит, более чем.

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

Универсальный означает подходящий для большинства задач

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

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

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

arax ★★
()