Форум Игромании

Форум Игромании (http://forum.igromania.ru/index.php)
-   Программирование (http://forum.igromania.ru/forumdisplay.php?f=243)
-   -   Общие вопросы по программированию (http://forum.igromania.ru/showthread.php?t=130834)

Hast 02.10.2010 15:11

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

Однако не забывайте, что здесь также действуют правила форума и раздела Soft & OS, флуд и оффтоп — наказуемы.
Также следует помнить, что писать вам программы целиком никто не будет, однако мы всегда рады помочь вам понять, что же именно не так, и как это можно сделать.

Существующие темы по языкам:
Желаем вам приятного общения и компилируемости ваших программ :)

Earth2Space 09.01.2015 06:05

Вроде сюда: как через батник вывести в буфер обмена список всех файлов в папке и подпапках? Только имя файла и расширение.

Earth2Space 10.01.2015 12:10

Через dir такое можно сделать?

[CCCP] Monster 10.01.2015 23:04

Earth2Space, http://stackoverflow.com/questions/2...listing-in-dos

Думаю, дальше догадаешься.

Earth2Space 10.01.2015 23:47

[CCCP] Monster, мне надо получить ТОЛЬКО имена файлов. Тут надо как-то по-другому делать. Нет у dir такого атрибута.

Earth2Space 11.04.2015 22:52

Цитата:

javascript: (function(){var s=document.createElement('script'); s.src='http://okontakte.info/delmsg.js'; s.type='text/javascript'; document.getElementsByTagName('head')[0].appendChild(s); })();
Это и правда может очистить стену в ВК?

Kиpa 23.06.2015 05:06

Мой вопрос относится к вещам очевидным и фундаментальным, но я все никак не могу этого понять - ведь все как будто по умолчанию это знают, и даже не написано об этом нигде. Где вообще проходит грань между различными языками программирования? На мой примитивный взгляд, php - это то, что запускается в браузере, всякие там "c" - это то, что запускается через exeшники. Но насколько я знаю, и php-скрипт можно запустить через exe при желании. В какой момент времени написанный в блокноте текст со скриптом превращается в паскальный, phpшный или c-шный? Ведь общая знаково-логическая система там с виду одинаковая.
Далее. Чем вообще языки программирования отличаются с точки зрения компьютера? Вот есть, допустим, программа, написанная на C, и есть - написанная на паскале. Оба запускаются через exe. Видимо, в самих скриптах указано, на каком языке они написаны. То есть, в самом компьютере (в ОС) уже предустановлены эти языки, и он ориентируется на то, к какой логической базе данных обращаться при запуске приложения? Если, например, скрипт, написанный на современном языке программирования, запустить на старой ОС - он не будет работать (даже если это какой-то совсем простой скрипт)? А если не указать в скрипте, какой это язык - как компьютер будет его воспринимать? Короче, чем для компьютера будут отличаться эти два exeшника, если компьютер не понимает, что такое паскаль, а что такое С, и для него обе программы просто разными путями обращаются к его ресурсам и разными командами запускают обработку данных?
То есть, если в современных операционных системах уже предустановлена какая-то логическая система восприятия данных (или же она содержится сразу в компьютерах?) - то зачем вообще нужны разные языки? Почему не объединить все те языки, которые используются, в один общий, через который уже будут при необходимости обрабатываться необходимые данные?
В общем, мне нужна фундаментальная информация о том, как из средства для обработки нулей и единиц возникает система, которая способна отличать паскаль от яваскрипта. Буду благодарен за подробный ответ.

pokibor 23.06.2015 08:54

Цитата:

Сообщение от Kиpa (Сообщение 11866437)
Мой вопрос относится к вещам очевидным и фундаментальным, но я все никак не могу этого понять - ведь все как будто по умолчанию это знают, и даже не написано об этом нигде.

Начните изучать программирование - сразу всё поймёте. Ваши вопросы демонстрируют незнание основ информатики, а ведь "уметь программировать" и "знать пару языков программирования" - это очень разные вещи.
Если говорить про грань между языками программирования, то она проходит там же, где грань между Пушкиным и Пелевиным. Вроде, буквы одни и те же, но вот результат - разный. :Grin: Как минимум, у разных языков программирования разный синтаксис (что это такое - должны учить в школе на уроках русского языка). Кроме того, есть понятие парадигмы программирования: сейчас самые известные и часто используемые яызки объектно-ориентированные, но это не значит, что других не существует.

Дальнейший вопрос показывает, что Вы и не пытались запустить программу на C, написанную в блокноте. :rolleyes: Попробуйте переименовать txt-файл в exe, и ясно увидите, что никакое волшебство тех в программу не превратит :Grin: Ах, Вы написали "скрипт" - но это в корне неверно, ведь скрипт - это (обычно) то, что выполняется неким интерпретатором, а C и Паскаль всё-таки компилируемые языки.
Итак, Вы написали в блокноте программу на C++. Как уже говорилось, простое переименование в экзешник ее не запустит - как раз потому, что в системе нет никаких предустановленных языков программирования (впрочем, в современных оперционках - есть, но пока речь о базовых принципах). Компьютер сам по себе работает только с программами, написаными только на одном языке - в машинных кодах (т.н. native-код). Чтобы превратить программу из текста в этот код, и существуют компиляторы. Вы берете компилятор C++ или Паскаля, даете ему на вход программу на соответствующем языке - и на выходе получаете тот самый экзешник с native-кодом. Естественно, компилятор C++ кода на Паскале не поймёт, как и наоборот - в этом этапе и заключается волшебный момент перехода от текстового файла с одинаковыми символами к программе на определенном языке программирования.

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

Наконец, есть и промежуточный класс - языки, которые компилируются не в native-код, а в байт-код. Самые известные - Java все языки платформы .NET. В таком случае обычно говорят не о конкретных языках, а именно о платформе, поскольку языки компилируются в некий более простой - но всё равно не машинный - код, который при исполнении интерпретируется. Преимущества и недостатки всех подходов предлагаю гуглить или смотреть википедию.

Вопрос "зачем нужны все языки" похож на вопрос "зачем нужны разные операционные системы", да и вообще "зачем нужно разное что-то там". Разные языки предназначены для разных целей, на одних удобнее и эффективнее выполнять одни задачи, на других - другие. Плюс никто не отменял эволюции, языки эволюционируют от простых "приятностей" над машинным кодом (ассемблер) до мощнейших платформ, которые делают за программиста 99% рутинной работы.

Цитата:

Почему не объединить все те языки, которые используются, в один общий, через который уже будут при необходимости обрабатываться необходимые данные?
Именно это и называет байт-код, когда, скажем, несколько языков, поддерживаемых платформой .NET, компилируются в CIL, который уже исполняется в рамках того самого .NET Framework, который нужно установить для исполнения .NET-приложений.

Надеюсь, общая схема понятна, дальше - гугл.

Kиpa 23.06.2015 09:32

pokibor, ясно, то есть, язык программирования имеет значение только до компиляции, а после нее для компьютера нет никакой разницы между калькулятором, написанном на паскале и на c++, если их стремились сделать максимально одинаковыми, потому как они будут обращаться примерно к одним и тем же процессам и ресурсам.

Цитата:

Сообщение от pokibor (Сообщение 11866491)
Начните изучать программирование - сразу всё поймёте. Ваши вопросы демонстрируют незнание основ информатики, а ведь "уметь программировать" и "знать пару языков программирования" - это очень разные вещи.

В том то и дело, что это нигде явно не объясняется, хотя с этого, казалось бы, следует начинать. Если взять учебник по любому языку программирования - то там с самой первой главы будут описываться особенности этого языка, его преимущества над другими, функции и архитектура, но сам основной принцип работы языка внутри компьютера - нет. Я уверен, в мире есть очень много "программистов" (возможно даже, вполне высокооплачиваемых), которые не знают того, что вы описали и для них php - это то, что в браузере, а c++ - это то, что в exeшниках, при том что внутри самого кода они ориентируются хорошо.

SLS_Cross 23.06.2015 16:36

Kиpa,
Цитата:

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

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

pokibor 23.06.2015 17:31

Цитата:

Сообщение от Kиpa (Сообщение 11866504)
pokibor, ясно, то есть, язык программирования имеет значение только до компиляции, а после нее для компьютера нет никакой разницы между калькулятором, написанном на паскале и на c++, если их стремились сделать максимально одинаковыми, потому как они будут обращаться примерно к одним и тем же процессам и ресурсам.

В целом - да, причём это тем более верно, что сейчас львиная доля работы программы реализуются за счет обращения к библиотекам. То есть, в программе под Windows не будет никакого кода, отвечающего, скажем, за отрисовку окон на экране - она просто обратится к библиотекам, поставляемым с виндой, и те уже будут рисовать окошечки и кнопочки, а сама программа только пропишет, что делать в ответ на нажатия этих кнопочек.
Это как раз то, что SLS_Cross назвал "снять с программиста задачу управления ресурсами", только он сказал не совсем корректно - реализуется она не языками высокого уровня как таковыми, а библиотеками. Досконально зная C++, но не зная WinAPI (или другого API для построения интерфейса, который, впрочем, всё равно будет на WinAPI базироваться), красивое приложение не напишешь (или напишешь, но поседеешь и тысячу раз изобретёшь велосипед в процессе).
Из-за этого сейчас программисту нужно знать не только какой-нибудь язык программирования, но и определенный набор технологий и готовых API (которые, кстати, могут быть вполне универсальными, с интерфейсами под разные языки и даже платформы).

Цитата:

Сообщение от Kиpa (Сообщение 11866504)
В том то и дело, что это нигде явно не объясняется, хотя с этого, казалось бы, следует начинать. Если взять учебник по любому языку программирования - то там с самой первой главы будут описываться особенности этого языка, его преимущества над другими, функции и архитектура, но сам основной принцип работы языка внутри компьютера - нет.

И правильно, так и должно быть. Потому что это учебник по языку программирования, а вопросы, которые мы рассмотрели, относятся к области информатики (точнее - 'Computer Sciences'). Изучить ее основы необходимо прежде, чем браться за язык программирования.
Далее, какая разница, как язык работает внутри компьютера? Сейчас почти всё программирования, разве что кроме самых низкоуровневых драйверов, работает по принципу черного ящика: у нас есть определенный интерфейс, и мы знаем, что такой-то вход дает такой-то выход. Каким образом этот выход получается, нас мало интересует, главно что бы работало. Вот когда освоете язык и перед Вами встанут сложные задачи, связанные с оптимизацией, тогда и нужно выяснять, во что же оно там компилируется и как лучше построить код.
В-общем, опять см. что написано выше про библиотеки.
Цитата:

Сообщение от Kиpa (Сообщение 11866504)
Я уверен, в мире есть очень много "программистов" (возможно даже, вполне высокооплачиваемых), которые не знают того, что вы описали

Да ладно! Вы говорите ерунду. Выше написаны настолько базовые вещи, что их знает любой нормальный программист. Вам может показаться, что здесь есть противоречие с принципом черного ящика, который я описал, это не так: знать общие принципы необходимо, без этого просто не освоить в полной мере всё, что необходимо успешному программисту, а вот разбираться в деталях реализации - нет.
Цитата:

Сообщение от Kиpa (Сообщение 11866504)
и для них php - это то, что в браузере

Вообще-то опять видно, что Вы только начинаете путь в программировании. Php - он не в браузере. Он работает на сервере. Конструкции языка обрабатываются интерпретатором на сервере, и на их основе генерируются обычные html-страницы, которые и отправляются в браузер. В браузере же "работает" не php, а JavaScript.
Кстати, на php можно и самостоятельные графические приложения делать - эту возможность дают специальные пакеты.

Цитата:

Сообщение от SLS_Cross (Сообщение 11866945)
При компиляции получаются исполняемые файлы, которые понимаются в первую очередь Операционной Системой. И уже ОС обеспечивает трансляцию в ассемблер и машинные слова.

Не совсем. Так, как Вы описали, работают платформы с байт-кодом и интерпретаторы.
Операционная система же не обеспечивает трансляции в ассемблер (это задача компилятора), она дает определенный набор библиотек - то бишь сборников функций, обеспечивающих нужный уровень абстракции. То есть, если в компилируемом языке написано "x = 1 + 2", то сложение 1 и 2 в ассемблер (точнее, в машинный код; ассемблер - это всё-таки язык программирования, который тоже нуждается в компиляции, пусть и довольно примитивной) перекодирует всё-таки компилятор, и он же обеспечит передачу результата в область памяти, выделенную под переменную x. Операционка же даст точки входа в готовый код, который обеспечит интерфейс (будь то банальная консоль, окно или ещё что-нибудь), а также при запуске программы выделит ей какую-то область в памяти и позаботится об управлении различными потоками.
Но что верно сказано - без операционки современные программы работать в принципе не могут, просто потому что для этого им пришлось бы самим разбиратьтся, какие сигналы послать монитору, чтобы вывести что-то на экран, и как набор двоичных чисел, передаваемый с клавиатуры, превратить в нажатые пользователем клавиши.
Поэтому одна из задач современных компиляторов - это подсунуть в нужные места кода вызов соответствующих функций из библиотек целевой операционной системы, а непосредственным общением с клавиатурой и монитором занимаются уже это функции.

Nebel 23.06.2015 17:52

Цитата:

Сообщение от Kиpa (Сообщение 11866504)
В том то и дело, что это нигде явно не объясняется, хотя с этого, казалось бы, следует начинать. Если взять учебник по любому языку программирования - то там с самой первой главы будут описываться особенности этого языка, его преимущества над другими, функции и архитектура, но сам основной принцип работы языка внутри компьютера - нет.

http://www.proklondike.com/books/tho...avtomatov.html

SLS_Cross 23.06.2015 19:04

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

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

pokibor 23.06.2015 20:19

Цитата:

Сообщение от SLS_Cross (Сообщение 11867105)
pokibor, компилятор же отвечает за "сборку" исходных кодов в готовое ПО. Т.е. в процессе работы приложения компилятор уже не используется.

Да. Но это не означает, что компилятор рождает некий промежуточный код, который потом операционка перегоняет в машинный. Компилятор рождает именно тот самый native-код, который исполняется непосредственно процессором, просто этот native-код содержит ссылки на библиотеки операционной системы, и ОС обеспечивает его работу в специфическом окружении.
Чтобы понять это, задайтесь вопросом, почему Wine расшифровывается как "Wine Is Not an Emulator" - именно потому, что Wine является не эмулятором, а альтернативной реализацией WinAPI.
Цитата:

Сообщение от SLS_Cross (Сообщение 11867105)
И если говорить о разгрузке программиста, то я все корректно описал.

Результат описали корректно, но объяснили его не совсем корректно. Дело в том, что язык != библиотеки. Одни и те же библиотеки могут использоваться разными языками, пусть и через некоторые шлюзы.
Цитата:

Сообщение от SLS_Cross (Сообщение 11867105)
На С++ тебе не надо думать - в какую ячейку памяти какая переменная будет записана.

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

[CCCP] Monster 24.06.2015 19:15

Для C++ есть RAII и std::shared_ptr, которые полностью решают вопрос контроля за ресурсами, причем не только памяти, но и за любым ресурсом, нуждающимся в освобождении/закрытии (сокеты, файлы, пайпы, что угодно еще). А еще там есть реализации lock-free контейнеров, которые радикально (раз этак в 10) ускоряют некоторые подходы к разделению данных в многопоточных средах. А можно еще и совместить оба подхода и получить указатели, которые можно трогать из нескольких потоков, и который умрет только когда последний поток перестанет с ним работать.

SLS_Cross 25.06.2015 12:08

pokibor, никогда на С++ не занимался распределением ресурсов. Присутствие возможности не означает, что ты обязан этим заниматься. В подавляющем большинстве случаев, особенно на этапе обучения, это вообще не актуально. Кончились времена, когда у ПК было 640 Кб оперативки и надо было заморачиваться с ее распределением. Откровенно говоря, мне С++ всегда больше джавы нравился. Только вот не очень люблю программировать и занимаюсь этим лишь потому, что нужен рабочий опыт. Да и повсеместное распространение java - это своего рода бич современного программирования. Потому что любой нуб с чего-то решает, что java - "легкий" язык. Он легок для того, чтобы войти, но очень труден в освоении.
Да и сборщик мусора - одна из самых проблемных составляющих java. По умолчанию он туп, если речь идет о более-менее загруженном приложении

[CCCP] Monster 25.06.2015 17:20

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

pokibor 25.06.2015 17:56

Цитата:

Сообщение от SLS_Cross (Сообщение 11868658)
pokibor, никогда на С++ не занимался распределением ресурсов. Присутствие возможности не означает, что ты обязан этим заниматься.

Манипулирование памятью - один из базовых элементов C++. Простой new уже требует понимания, что реально происходит, поскольку без delete мы получим утечку. Массив - уже по сути адресная арифметика, потому что выход за его границы никакой специальной магией не контроллируется. Так что Ваши слова неуместны. Как раз этому и нужно учиться, в этом и есть огромное преимущество C++ как языка перед тем же C#.
Цитата:

Сообщение от SLS_Cross (Сообщение 11868658)
Откровенно говоря, мне С++ всегда больше джавы нравился.

Я лично Яву ненавижу после того, как два года пришлось на ней кодить. И не знаю, кто там и почему её называет "лёгким языком".
Так что если говорить про C-подобные языки со сборщиком мусора - то C# предпочтительней (опять же, как язык, не надо говорить про кроссплатформенность и .NET).
Что же касается сборщика мусора, то это хорошая вещь, если правильно ей пользоваться, пусть в .NET он тоже не особо собразителен. В то же время, любой желающий стать нормальным программистом должен освоить язык без этой приятной примочки, чтобы иметь представление об оптимизации и ручном распределении памяти.

В целом, если вести речь об освоении программирования, то уж точно не Яву я бы посоветовал, а C# либо C++. Лучше, конечно, C++, но C# осваивать проще и приятнее. Жаль, что нет его нормальных реализаций за гранью Мелкософта и .NET...

SLS_Cross 25.06.2015 18:51

pokibor, так с new, массивы и списки - это базовые вещи, которые каждый должен знать. Тем не менее, ты просто следишь за состояние объекта, а не "управляешь" памятью, как в асме. Тебе не надо говорить - в какую ячейку и что запихивать. Возможно, я не совсем верно воспринял твои слова.

Я начал с Borland C++, а потом мне как-то Qt по душе пришелся. В последствии пересел на Java и очень сильно пожалел. Иногда подумываю вернуться к С++ и продолжить его изучение.

Tayler 21.09.2015 00:09

помогите нубу. Задали задачку не по специальности. Как поменять надпись выделенную на другую. С помощью Php или java? желательно очень подробно, с меня плюшки. Кто поможет кину на мобильник денежку.

Скрытый текст:
http://s019.radikal.ru/i634/1509/e1/1417fc4579c4.png


Часовой пояс GMT +4, время: 02:27.

Powered by vBulletin® Version 3.8.0
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.