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)

попробуй luajit
заодно померяй, во сколько раз медленнее сишки –

local bit = require("bit")
function repeat_key(key, length)
    if #key >= length then
        return key:sub(1, length)
    end

    times = math.floor(length / #key)
    remain = length % #key

    result = ''

    for i = 1, times do
        result = result .. key
    end

    if remain > 0 then
        result = result .. key:sub(1, remain)
    end

    return result
end

function xor(message, key)
    rkey = repeat_key(key, #message)

    result = ''

    for i = 1, #message do
        k_char = rkey:sub(i, i)
        m_char = message:sub(i, i)

        k_byte = k_char:byte()
        m_byte = m_char:byte()

--        xor_byte = m_byte ~ k_byte
        xor_byte = bit.bxor(m_byte, k_byte)

        xor_char = string.char(xor_byte)

        result = result .. xor_char
    end

    return result
end

return xor
#!/usr/bin/env luajit

local xor = require 'xor'
local str = 'test string'
local key = 'key'

io.write(xor(str,key))
ann_eesti
()
Последнее исправление: ann_eesti (всего исправлений: 1)

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

удаляйте

anonymous
()

питон тормознутый в двух случаях:

  • когда кто-то написал об этом на форуме.

только уж слишком тормознутый

но он таакой тормоз

  • когда я специально написал бенчмарк и сравнил насколько медленее чем го он перемножает между собой миллион элементов массива.

уже 100500 раз это обсуждалось.

сначала написал на Python, а потом всех их переписал на BASH

какая лють.

flant ★★★★
()
Ответ на: комментарий от flant
когда я специально написал бенчмарк и сравнил насколько медленее чем го он перемножает между собой миллион элементов массива.

уже 100500 раз это обсуждалось.

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

Только цикл, обращение к памяти и XOR двух байт. XOR, насколько я помню по assembler, одна из самых быстрых операций процессора.

На чем тогда тормозит Python? На цикле? Ну извините… Это основная конструкция в любом ЯП. Если она работает медленно, то извините. Лес - там!

Если медленное обращение к памяти, то тоже самое о лесе и направлении.

Я понимаю, что Python со встроенным сборщиком мусора, но, блин, я специально написал на Python так, что бы выделение и освобождение памяти происходило один раз за вызов функции. И разница по скорости в 1000+ раз - это явный перебор.

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

попробуй luajit заодно померяй, во сколько раз медленнее сишки –

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

Беда в том, что даже рассматривать данный язык - бесперспективно.

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

Я уволюсь и что? Где, как и сколько по времени будут искать нужного специалиста, еще и знающего luajit?

HighMan
() автор топика
Ответ на: комментарий от guyvernk
Benchmarking C
Benchmark 1: ./c/code 40
  Time (mean ± σ):     518.8 ms ±   3.0 ms    [User: 506.8 ms, System: 3.4 ms]
  Range (min … max):   516.0 ms … 521.9 ms    3 runs

Benchmarking CPP
Benchmark 1: ./cpp/code 40
  Time (mean ± σ):     520.7 ms ±   8.2 ms    [User: 511.3 ms, System: 3.4 ms]
  Range (min … max):   514.1 ms … 529.9 ms    3 runs
anonymous
()

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

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

Вкатывайся в JS.

JS - узкоспециализированный язык. Пусть его насильственно расширили костылями, он не стал широкопрофильным.

Я работал в одной фирме, так там была толпа РНРшников. Ну они на этом РНР пилили подо все задачи.

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

Те мудрецы на РНР запилили сервисы, которые работают неприрывно.

Ни что не настораживает?

В PHP нет сборщика мусора! Он не предназначен для длительной работы скрипта. РНР постоянно по чуть-чуть выделяет память, но ее не освобождает! И через какое-то время, out of memory.

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

А если скрипт крутится длительное время, то он сожрет всю память.

Я не хочу сказать, что у JS те же проблемы. Просто этот «язык» первоначально запилили под frontend. Потом уже начали его костылить и расширять.

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

Это не неудобства Си, это недоработки в твоём образовании. Исправь их.

Вот это я понимаю!

Коротко и по делу.

Сразу понимаешь, что посоветовал Великий Гуру.

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

Cи такой анахронизм, что придется переучиваться на что-то нормальное рано или поздно. Смотрите в сторону Zig и Odin. Rust это своя вселенная. Ну и конечно рекомендую почитать, почему принято то или иное решение в языке и синтаксисе. Еще в питоне можно отдельные функции компилировать в жит с помощью numba или jax. А еще есть Julia, которая является динамическим языком, но все компилит в жит.

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

В PHP нет сборщика мусора!

Уже давно есть

Я не хочу сказать, что у JS те же проблемы.

Это было мудрое решение)

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

А для каких целей вам нужен новый ЯП?

Для самых широких. Он вечноработающих сервисов до простенькой автоматизации.

Я понимаю, что для автоматизации хорошо подходят bash & Python, но у Python сложности с переносимостью, а у bash код получается очень плохо читаемым. Мне сложно разбираться даже в своем ранее написанном коде.

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

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

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

Cи такой анахронизм, что придется переучиваться на что-то нормальное рано или поздно.

Анахронизм. Согласен.

Однако, этот анахронизм еще нас с вами переживет.

К тому же, найти худо-бедно админа с худо-бедно знанием С, намного проще чем со знаем Rust, Go & etc.

По большому счету, C & bash script закрывает все хотелки, только…

Bash код, даже свой собственный, сложно читаемый.

Си слишком долог и сложен в разработке.

Кстати, на заре моего освоения С, я читал, что не следует злоупотреблять дефинишенами, особенно сложными. Они ведут к трудности восприятия кода.

Блин, согласен с каждым словом! Вот только почему-то ни кто этой рекомендации не следует!

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

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

Значит ты СИЛЬНО соврал что знаешь С. Так как архитектурный дизайн Rust’a ты бы сразу понял, будь нормальным СИшником. А так ты бездарь и неуч. Не занимайся программированием.

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

Значит ты СИЛЬНО соврал что знаешь С. Так как архитектурный дизайн Rust’a ты бы сразу понял, будь нормальным СИшником. А так ты бездарь и неуч. Не занимайся программированием.

Еще один Великий Гуру нашелся…

Могу дать совет, всем желающим, как на профильных форумах пользоваться уважением и прослыть великим специалистом:

  1. Ни какой вежливости! Только хамство! Так лаконичнее и информативнее.

  2. На любой вопрос нужно отвечать коротко и по существу. RTFM - лучший ответ.

  3. Если, по какой-то причине RTFM не совсем подходит, то: «В Гугле забанили?»

Пользуясь этими тремя несложными правилами вы гарантированно обретете репутацию Великого Специалиста!

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

Для самых широких.

ИМХО, такой подход очень плохой, лучше использовать несколько разных языков, каждый под свои задачи.

Говорят, что связка Си + Tcl довольно приятная, но с последним я пока только познакомился, поэтому особо ничего не могу сказать. Python вроде за собой тащит полный интерпретатор Tcl.

Если прям швейцарский ножик, то мб Haskell какой-нибудь.

Или какой-нибудь Lisp.

Или вообще ДРАКОН. :)))

Jullyfish
()

Странно что ты пересмотрел все извращения, но не обратил внимание на .net/c#.
Это как раз и есть:

язык общего назначения что бы он был быстрым и был лишен неудобств старичка С

arax ★★
()

Поверхностно знаком с Python. Он не плох, только уж слишком тормознутый.

mojo

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

Не легко тебе живется.

В общем, я в печали.

c3

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

Я понимаю, что для автоматизации хорошо подходят bash & Python, но у Python сложности с переносимостью, а у bash код получается очень плохо читаемым. Мне сложно разбираться даже в своем ранее написанном коде.

bash - не подходит никак. И ты сам же сразу расписал почему. python подходит, да, но Си лучше.

вот только с текстовыми данными в нем работать очень коряво и сложно.

Да ну. Всё там норм. Попытки изобразить из строки цельный объект данных (как ты видимо хочешь) неизбежно приводят к оверхедам и неоптимальным алгоритмам, в Си так не принято.

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

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

Поэтому самый жирный открытый проект на Си – ведро люнекса – ровно так и делает:

struct seq_buf {
        char                    *buffer;
        size_t                  size;
        size_t                  len;
};

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

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

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

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

Не занимайся подменой понятий. seq_buf это не строка. И подобные структуры я и сам часто использую, но отказа от asciiz-строк они не подразумевают. Это разные штуки для разных областей применения.

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

А вот нет.

program prog;

var
  Test: string;
  c: char;
  j: integer = 0;
begin
  SetLength(Test, 100000);
  Test := StringOfChar('X', 100000);
  for c in Test do
    Inc(j);
  WriteLn(j);
end.

$ ./main 
255

Там или нужна директива {H+} или использовать AnsiString.

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

Не занимайся подменой понятий. seq_buf это не строка.

seq_buf в ядре используется для строк.

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

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

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

Основная область применения нул-терминированных строк – заставлять сишников обсираться на ровном месте и ловить сегфолты. Больше смысла в этом выкидыше прогаммистской мысли нет.

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