LINUX.ORG.RU

Выбор языка

 


0

2

С++ - самый расширяемый язык, потому как статические библиотеки стороних API (*.a и *.lib) пишутся в первую очередь для него. Но C++ - слишком сложный, лично у меня ступор вызывают callback-функции и указательные типы.

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


лично у меня ступор вызывают callback-функции и указательные типы тогда никакой, слесарем на завод или даже дворником/сторожем. Как бы это базовые и безумно простые штуки. Если с ними проблемы, то ни о каких Python-ах и C# даже задумываться не стоит. Т.к. не будет понимания и базовых структур данных и временной сложности тех или иных алгоритмов в базовых библиотеках языка, а как следствие лучше бы твоих программ свет никогда не видел. В мире и так полно говна, не привноси его ещё больше, лучше займись его уборкой.

anonymous
()

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

А изучать лучше не C++ а C (без плюсов), в нём меньше ненужного (это не про указатели и не про колбеки, они как раз нужные).

firkax ★★★★★
()

Что выбрать для изучения, Java может быть

у меня ступор вызывают callback-функции

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

Java может быть или в ней так же сложно

да там свои приколы. Взять голую Джаву и начать на ней что-то вменяемое ваять, ну такое. Джава, это фреймворки. Попробуйте почитать туториал по Spring, и я вам гарантирую, у вас мозг опухнет на третьей минуте. Не потому что язык какой-то супер сложный, а потому что профессиональные иструменты делают для профессионалов, у которых уже есть представление, зачем это надо и как это применять.

Вам может показаться, что самое сложное в разработке ПО, это «выучить язык программирования». Это не так. Язык это мелочи. Есть очень много всякой дряни помимо языковых конструкций, которую надо знать, чтобы программа заработала. Например, если вы пишете веб-приложение, вам надо понимать, как этот веб вообще работает, знать протоколы, их версии, всякие хитрости для защиты от взлома и прочее - нюансов миллион. Лямбды вам игрушкой покажутся.

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

Я против Java хоть я и сам кодер на ней.

JVM позволяет вообще не думать про какую-то там ОС, и чем «опытнее» ты становишься тем меньше хочется лезть в платформенно специфичные вещи.
Если человеку хочется зарабатывать деньги то Java это вариант, как и Node, или RoR :) А если все таки есть желание спускаться вниз к системному программированию, но хороших навыков кодинга пока нет то лучше взять go, там и сткрутуры и указатели, и обработка ошибок как в системных языках. Плюс можно будет найти работу, а потом решить куда двигаться дальше.

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

Если указатели у тебя вызывают проблемы то ни о чём кроме учебных >языков речи не идёт. И хотя языки без указателей есть, но (если >это не совсем скриптота бесполезная типа баша) во всех них есть >какие-то их аналоги, более или менее явные. Так что указатели >понимать надо.

Со скриптотой всё просто, я с PHP начал, а у него синтаксис С-подобный, поэтому когда выбирал компилируемый язык, то выбор поначалу пал на C++.

С указателями в принципе понятно. Чтобы передать некий объект в качестве параметра функции, нужно при вызове функции передать ей указатель на этот объект. Вот например есть строки как и в любом языке, строку можно описать как указатель на первый символ, то есть char*, а можно описать и как объекты string либо wstring, а ещё сторонние библиотеки могут иметь собственные указательные типы для работы со строками. Мне было бы удобнее писать просто string, а тонкости чтобы додумывал компилятор.

А вот с callback-функциями вообще не понятно как их писать и как вообще прийти к их пониманию, вот допустим хочу я поработать с библиотекой sqlite3, там такая функция есть:

int sqlite3_exec(sqlite3*, const char *sql, int (*callback)(void*,int,char**,char**), void *, char **errmsg);

где 3-й параметр - callback-функция, обрабатывающая результат SQL-запроса, допустим мне нужно, чтобы результат выводился в переменную, ну и всё - тупик.

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

то есть char*, а можно описать и как объекты string либо wstring, а ещё сторонние библиотеки могут иметь собственные указательные типы для работы со строками. Мне было бы удобнее писать просто string, а тонкости чтобы додумывал компилятор.

Учи С без плюсов, там есть char* а всего остального нет. Компилятор ничего не додумывает и это хорошо.

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

У тебя не с колбеком проблема а с областями видимости. Да, колбек локальные переменные вызывающей функции напрямую не видит. Но ты можешь дать ему указатель на них (тут первый void*) через него к ним обращаться. Если тебе нужно больше одной переменной - можно засунуть их в структуру, или ещё как -то придумать как одним указателем местоположение двух переменных сообщить. Да, всё вручную - в этом и преимущество Си перед всеми остальными, что вся логика написана в явном виде и ты её видишь и можешь менять если хочешь.

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

Вам может показаться, что самое сложное в разработке ПО, это >«выучить язык программирования». Это не так. Язык это мелочи.

Что значит расширяемый язык? Причём тут статические библиотеки?

Я не раз эту фразу от матёрых программистов слышал, что «язык это лишь инструмент». Ну то есть опытный программист может быть волен в выборе инструмента? А если программисту нужно поработать с некой библиотекой с гитхаба, а она для C++, это означает, что он может использовать только C++ или всё равно есть выбор?

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

А если программисту нужно поработать с некой библиотекой с гитхаба а она для C++

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

За примерно двадцать лет в профессии, мне ни разу не приходилось ничем подобным заниматься.

FishHook
()

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

но на C :-) библиотеки используют конверсии C и весь плюсовый манглинг идёт нах.. традиция такая :-) ввиду явного неуспеха плюсовики придумали хидер-онли библиотеки и так-же наелись кексов. Пытаются в модули

более кратко: современный С++ вещь в себе. Если пишешь на С++ то пишешь исключительно для С++. Хочешь библиотеки ? даже упомянутый Go и то лучше

MKuznetsov ★★★★★
()

тебя не пугают дорожные указатели и адреса домов на улицах?

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

alysnix ★★★
()

Невозможно понять компьютеры без ASM и C. Это база любого программиста, после этого поймёшь все остальные языки.

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

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

C++ - быстрая и сложная мразь, которая используется там, где скорости Java недостаточно. Для веба используется только в Yandex и больше нигде.

Остальные языки все специализированные, каждый так или иначе придётся изучить:

Python - уё#ищный язык 90х готов, используется для веба, скриптов, ИИ, на хайпе из-за ИИ, самый медленный язык из популярных.

C# - выродок родившийся в офисе Microsoft от скрещивания PHP, Java и подза#упного творога Билла Гейтса.

PHP - язык для веба созданный не программистом, простой, удобный, считается устаревшим, хотя 80% сайтов всё-ещё работают на нём. Ненавидим тру программистами.

JS и всякие тайпскрипты - язык только для веба, как лучшей, так и худшей его части.

GO, Rust - не лезь сюда, спец языки, работу не найдёшь

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

C++ - быстрая и сложная мразь, которая используется там, где скорости Java недостаточно.

а Java - медленная и сложная мразь. Используется там, где достаточно ее медленности, несмотря на сложность.

alysnix ★★★
()

счас вообще-то кризис. те, кто знает с++, чувствуют себя неплохо, ибо они познали дзен, и сидят на высоких ветках, обращенных к солнцу.

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

alysnix ★★★
()

Указатели попали в С++ из C, в C они пришли из ASM. Указатели станут понятны сразу после изучения ASM и основ железа, в железе для них есть прямая аналогия.

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

А вот с callback-функциями вообще не понятно как их писать

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

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

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

Стоит файл вотчер сделать и уже всё

Напомню, что в той теме ты взял кривой код со SO из вопроса 10-летнкй давности и набрасывал, что он не работает. Универсальный переносимый вариант тебе дали в первом же комментарии.

anonymous
()

Паскаль -> ассамблер -> си. Считай освоил 90% языков. Исключение c++, rust, всякие брейнфаки. Там и выбирай потом.

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

Со скриптотой всё просто, я с PHP начал,

Тогда посмотри например https://www.php.net/manual/en/event.set.php
Принцип работы с callback такой же как у sqlite3_exec.

а у него синтаксис С-подобный, поэтому когда выбирал компилируемый язык, то выбор поначалу пал на C++.

С++ это весьма древняя штука (куча стандартов начиная от с++98 и до с++23), полноценное изучение которого займет ХЗ сколько времени. Т.е. ты можешь попытаться освоить какое-то подмножество, типа c++98 (как уже советовали выше), но вопрос, насколько это целесообразно. И судя по вопросам, ты сейчас изучаешь скорее С, а не С++. Что в принципе правильно, С по объему изучения кратно меньше С++. Но тоже древний (читай, имеет всякие странные по сегодняшним меркам синтаксические особенности, типа “Clockwise/Spiral Rule”).

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

даже упомянутый Go и то лучше

Насколько мне известно в Go не поддерживается подключение нескольких библиотек на Go к приложению на других языках, т.к. будет конфликт go runtime.

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

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

Ну про функцию это уже несколько другой уровень постижения. Начать лучше с того, что указатель это адрес, который (внезапно) указывает на некие данные в памяти. В самом понятии указателя ничего сложного нет, просто они требуют внимательности в работе. Обращаясь к указателю, надо иметь гарантию, что он указывает на то, что надо. Если он нулевой, это нормально, это легко проверяется. Хуже, если он указывал на некий объект, а область памяти этого объекта уже освободили. Для того, чтобы всё это как-то разрулить, одни люди придумывают концепцию владения, другие – умные указатели и др.

Но это, в общем, уже детали. Начать надо с того, что указатель – это просто адрес. (Тут да, ассемблер наиболее наглядный язык получается, и мне тяжеловато представить, как это выглядит с точки зрения человека, начинавшего с PHP…)

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

Тогда посмотри например >https://www.php.net/manual/en/event.set.php Принцип работы с callback такой же как у sqlite3_exec.

Я не то чтобы не понимаю callback-функции, я не понимаю как пишутся callback-функции. Вот есть вызывающая функция, ей передаётся точка входа в callback-функцию и некие данные. Перед тем как попробовать поупражняться с sqlite3, я попробовал libcurl, там при вызове curl_easy_perform() также вызов callback-функции происходит, решение на другом форуме подсказали. Но в обоих случаях мы понимаем, что передаваемые данные - это строка, то есть если как у меня нужно вывести результат в переменную, то напрашивается решение в код callback-функции просто прописать присваивание строки строке, однако так работать не будет.

В PHP event я ещё не использовал, работал с curl, json, sqlite3. Да, мой способ изучения C++ в том, что я пытаюсь на нём переписать свои программы из PHP. А в PHP порог вхождения очень низкий, я из учебника первые 3 раздела прочитал, потом сразу же на документацию из php.net перешёл, чтобы понять как с базой sqllite работать мне понадобилось полчаса. Для web PHP не использую, использую его как скриптовый язык для задач типа «прочитать строки, распарсить и записать другие строки».

И судя по вопросам, ты сейчас изучаешь скорее С, а не С++.

Я изучаю C++ одновременно по нескольким учебникам, в основном Прата, но некоторые моменты перечитываю у Липпмана, Дэвиса и Васильева.

хреново что она для C++, обычно их для C пишут, чтоб биндинг >было проще делать. Хотя и для C++ можно, просто чуть более >муторно.

Точно, ошибся я. Это код в примерах на C++, а сами библиотеки получается на C, потому что файлы заголовков *.h, а не *.hpp. А линковщик для обоих языков один и тот же получается?

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

вот допустим хочу я поработать с библиотекой sqlite3

Ты берешь Сишный интерфейс к Sqlite. Бери С++шный. Их полно, например, https://github.com/SqliteModernCpp/sqlite_modern_cpp

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

Потому что в Си колбэки это только указатель на функцию без данных. Данные надо передавать отдельно (на что там есть 4й параметр void*). В С++ колбэки обычно типа std::function<…>, в котором и функция и данные передаются вместе.

Вообще, почитай хорошую книжку про С++ сначала. Видно, что ты полез в воду, только научившись плавать собачкой. Так ты далеко не проплывешь.

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

Но это, в общем, уже детали. Начать надо с того, что указатель – >это просто адрес. (Тут да, ассемблер наиболее наглядный язык >получается, и мне тяжеловато представить, как это выглядит с >точки зрения человека, начинавшего с PHP…)

Я не говорил, что я начал с PHP, я говорил, что изучал PHP до C++ и PHP стал для меня языком, в котором впервые удалось выполнять не учебные задачи, а вполне себе реальные. А так первое знакомство с программированием началось в колледже на Pascal, это было в самом начале 00-х, тогда курс программирования для студентов начинался с программирования под DOS. Колледж я не закончил, но самостоятельно к изучению программирования много раз пытался вернуться, и Assembler для DOS изучал и «Уроки Iczelion’а» читать пытался и по куче языков учебники себе покупал, C++ то же начинал раз 4 или 5, потом бросал, кучу раз говорил себе, что программирование - это не моё, но после успеха в PHP понял, что я не безнадёжен и сейчас снова пытаюсь.

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

Я не то чтобы не понимаю callback-функции, я не понимаю как пишутся callback-функции.

callback-функция обычно передается не одна, а в паре со ссылкой на доп. объект, который будет передан, как один из аргументов при вызове callback. Для PHP Event::Set

 cb
    The event callback. See Event callbacks .
arg
    Custom data associated with the event. It will be passed to the callback when the event becomes active.
Для sqlite3_exec
  int (*callback)(void*,int,char**,char**),  /* Callback function */
  void *,                                    /* 1st argument to callback */
Вот через этот аргумент можно передать указатель на переменную или класс/контейнер/буфер (С++) или массив/объект (PHP).

В PHP event я ещё не использовал, работал с curl, json, sqlite3.

ну так реши задачу с callback сначала в рамках PHP.

Точно, ошибся я. Это код в примерах на C++, а сами библиотеки получается на C, потому что файлы заголовков *.h, а не *.hpp. А линковщик для обоих языков один и тот же получается?

это к peregrine вопрос.

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

выбирай учебное пособие по с++.

Челу надо осваивать программирование, структуры данных и алгоритмы, а не стопицот ужимок и прыжков разных стандартов с++. Тем более что Столяров касается и ООП и С++, а так же есть задачник по пособию. Что для начинающего будет за глаза.

выбирай учебное пособие по с++.

Из годного я нащупал только такое https://www.youtube.com/playlist?list=PL3BR09unfgciJ1_K_E914nohpiOiHnpsK

И есть курс по С для начинающих, но совсем начинающие этого дядиньку вряд ли освоят.

Ygor ★★★★★
()