Вопросы по переводу программ для ЭВМ (помощь гуманитарию в написании диплома)

Вопросы по программированию, не подходящие в другие разделы.

Модераторы: Naeel Maqsudov, C_O_D_E

Ответить
Ann4
Сообщения: 2
Зарегистрирован: 27 апр 2017, 12:56

27 апр 2017, 13:35

Доброго времени суток!

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

1) Часто ли практике встречается перевод программы с одного языка программирования на другой (т.е. как я понимаю, перевод непосредственно исходного текста с одного языка программирования на другой)? Можно ли назвать получившийся в итоге исходный код дословным переводом или по сути в данном случае остается лишь алгоритм, интерфейс, а код строиться по иному принципу? Совершаются ли такие переводы вручную или просто создаются кросскомпеляторы?

2) Переводятся ли программы с высокоуровневого языка на высокоуровневый (также с низкоуровневого на низкоуровневый)? Если да, то с какой целью? И с высокоуровнего в низкоуровневый?

3) Даже если программа написана на языке высокого уровня, необходимо ли в ней предусматривать какие-то особенности для разных ОС? (я правильно понимаю, что применительно к языкам высокого уровня можно говорить о кроссплатформенности?).

Спасибо за потраченное время на чтение этого сообщения и извините за большое количество вопросов! Очень надеюсь на вашу помощь :)
Аватара пользователя
Сионист
Сообщения: 1077
Зарегистрирован: 31 мар 2014, 06:18

02 май 2017, 11:01

Переводить надо всегда. Вот представьте: я еврей, а Вы, например, русский и иврита не знаете. И я у Вас что то прошу. Но просьбу свою изначально сформулировал на иврите. Вы ж не поймёте. Значит надо перевести. Программа есть указание машине, что и как требуется сделать (не всегда явное, на прологе, например, очень даже неявное), а единственный язык, который она понимает непосредственно - это машинные коды. Но сразу в машинных кодах не пишет ни кто. Поэтому любую программу надо перевести, по-нашему оттранслировать. Трансляция бывает двух видов: компиляция целиком всей программы до фактического начала исполнения и интерпретация отдельных слов в процессе исполнения. Есть ещё джит-компиляция после команды исполнить программу, но всё равно до фактического начала исполнения. Если же речь о переводе на другой язык программирования, непосредственно машине не понятный, то здесь всё сложнее. Представьте себе, что к Вам с просьбой хочет обратиться испанец. Он может или найти переводчика сразу с испанского на русский, или вы оба можете найти двух переводчиков: он с испанского на английский, а Вы с английского на русский. Если ни один переводчик не знает одновременно русского и испанского, то двойной перевод - единственный выход, иначе просто нельзя перевести на целевой язык (на русский). Так вот, есть компиляторы, переводящие на промежуточный язык, в данном примере промежуточный язык - это английский, но у нас это c, язык ассемблера, джава байт-код, или MSL. Программист пишет на языке, который знает, но с которого не так просто найти трансляторы сразу в машинный код всех разновидностей машин, которые это будут исполнять, зато под каждую из целевых платформ есть распространённый транслятор с промежуточного языка, а у программиста есть компилятор на промежуточный язык. Кроме того, компилятор может просто состоять из двух компиляторов или из компилятора и ассемблера ("компилятор" с языка ассемблера называется ассемблер, а не компилятор), это просто такой подход к разработке компиляторов. Но этим даже такой перевод не исчерпывается. Программа могла быть когда то написана на каком то языке программирования, а потом может возникнуть необходимость написать её новую версию. И при разработке новой версии может вдруг оказаться, что те программисты ушли, а новые не достаточно знакомы с исходным языком, чтоб на нём писать что то новое, в лучшем случае они могут перевести уже написанное по книжке. При этом старая версия маленькая, а нового кода требуется разработать раз в 15 больше, чем уже есть. И в процессе перевода они старый язык всё равно не усвоят. Или может быть знать то старый язык они знают, но новый эффективней, а нового кода надо после пятидесятилетнего перерыва в поддержке данной программы написать раз в триста больше. Или вообще нет трансляторов первоначального языка для современных машин, а старые трансляторы не компилируют в доступные для использования промежуточные языки, а то и вовсе сами не могут быть исполнены. Вот это уже встречается реже. Наконец, такой перевод может быть использован в процессе обучения одному из двух языков (с которого переводят, или на который переводят), когда язык программирования изучают те, кто уже знает другой язык программирования и такой вариант Вам, как гуманитарию, должен быть даже понятнее, чем программистам. Но это тоже не часто. Чаще всего перевод не в машинный код - это компиляция на промежуточный язык для последующей трансляции уже в машинные коды целевой машины. Языки низкого уровня - это байт-код, язык ассемблера и машинный код. Любой язык, кроме языка ассемблера, если он предназначен для непосредственной разработки, относится к языкам высокого уровня. В том числе высокоуровневым является c. Джава чаще всего переводится сначала в джава байт-код. c c++ чаще всего переводятся в язык ассемблера. c# всегда переводится на промежуточный язык. Компиляторы для систем *nix семейства всех языков, кроме c, и языков, компилируемых на промежуточные языки, для которых на этих системах есть виртуальные машины, согласно идеологии этих систем должны компилировать на c для последующей компиляции уже в машинные коды целевых машин.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1077
Зарегистрирован: 31 мар 2014, 06:18

02 май 2017, 11:24

Особенности для разных ОС ни как не связаны с уровнем языка. Любая программа обязательно обращается к ОС. Для того, чтоб загрузить файл, создать создать окно, или поток, или что нибудь ввести или вывести в любой нормальной ОС приходится обращаться к ОС. И обращения эти не могут быть одинаковыми, потому что в разных ОС для этих целей предназначены разные API (правила межпрограммного общения, в частности правила взаимодействия с ОС называются API). Для того же, чтоб избавить программу от таких особенностей, она должна взаимодействовать с ОС через посредника - фреймвок. Тогда программа обращается не к ОС, а к фреймвоку, а уже вариант фреймвока для целевой ОС обращается к ОС. Некоторые языки сразу навязывают определённые фреймвоки, тогда ни каких зависимых от ОС особенностей быть не может, но будут аналогичные особенности, зависимые от версии фреймвока (хотя фреймвок имеет несколько вариантов для разных ОС с общим API со стороны исполняемых на нём программ, но на каждой ОС фреймвок имеет несколько версий с несколько отличающимся API и каждая из этих версий имеет варианты для нескольких ОС уже с общим в пределах версии фреймвока и независимым от ОС API). В результате зависимость, изгнанная в дверь, влезает через окно. Другие языки ничего не навязывают, но могут позволять использовать фреймвоки. Некоторые ОС-зависимые особенности заворачиваются (по-нашему инкапсулируютя) в классы без использования фреймвока. Это в первую очередь текстовый и файловый ввод/вывод. Но только на объектно-ориентированных языках. Тогда посредник включается в саму программу и не требует ни какого API. Вот только на мнопоточных ОС он в этом случае не может взять на себя сразу всё. А часто не берёт на себя и графику, зато в этом случае имеет очень стабильный синтаксис.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1077
Зарегистрирован: 31 мар 2014, 06:18

02 май 2017, 11:38

Совершаются ли такие переводы вручную или просто создаются кросскомпеляторы?
Кроскомпиляторы - это совсем другое. Вот представьте себе: пишите Вы программу для телефона, но компилировать её собираетесь на настольном компьютере, при этом процессор настольного компьютера не совместим с процессором телефона на уровне машинных кодов. И вот для этого то Вам и нужен кроскомпилятор. Кроскомпилятор есть компилятор, компилирующий программы для машин одной платформы, но сам исполняющийся на машине другой платформы. А перевод на язык того же уровня - это не крос, просто целевой с точки зрения компилятора язык оказывается промежуточным с точки зрения всего процесса трансляции, но это как раз обычная компиляция. Переводят и вручную, и трансляторами. С высокого уровня на низкий почти всегда трансляторами. Но я иногда и вручную переводил в байт-код спектрумовского бейсика (на спектруме бейсик "на лету" транслируется в байт-код, а он уже интерпретируется). С высокого на высокий в зависимости от цели перевода. Если это такая стратегия обеспечения переносимости (как в *nix), то компилятором. А если для того, чтоб продолжить разработку на другом языке, то ИМХО вручную. И уж точно вручную, если это происходит в процессе изучения энного по счёту (но не первого) языка.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1077
Зарегистрирован: 31 мар 2014, 06:18

02 май 2017, 11:42

Кстати, ни один ответ не очевиден. Просто любой программист должен был изучить часть ответов до того, как программистом станет. Но изучить в готовом виде. А с переводом с высокого уровня на высокий для изучения языка или для продолжения разработки на другом языке обычно надо столкнуться самому, чтоб о нём узнать. В случае перевода для изучения языка сам способ изучения языка путём "натаскивания" на переводы очевиден разве что гуманитарию, так как в основном применяется при изучении не родных языков общения, а в случае перевода для продолжения разработки не очевидно для постороннего само существование задачи такого перевода.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1077
Зарегистрирован: 31 мар 2014, 06:18

02 май 2017, 12:24

Изначально кроскомпиляторы предназначены для того, чтоб на машинах существующих платформ компилировать программы, необходимые для существования создаваемых новых аппаратных платформ. Соответственно разработка кроскомпилятора - второй после разработки процессора процессора этап разработки новой аппаратной платформы. А третий - разработка первой для новой платформы операционной системы, и того, что на этой платформе должно быть вместо BIOS. Для их компиляции кроскомпилятор как раз и используется. Если предполагается разработка приложений на самих машинах новой платформы, то ещё разрабатывается первый для неё обычный компилятор и может быть ещё среда разработки и после компиляции их релиза кроскомпилятор может сразу выйти из употребления и быть даже деинсталирован со всех машин, на которые был установлен.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Ann4
Сообщения: 2
Зарегистрирован: 27 апр 2017, 12:56

03 май 2017, 13:07

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

Спасибо Вам огромное за столь подробные ответы и потраченное время на их написание! Многое мне стало гораздо более понятным.

У меня только возник один вопрос: а нельзя ли использовать перевод вручную в противоправных целях: к примеру программист потратил долгое время на разработку алгоритма программы, построение архитектуры программы. Но другой, заполучив ее исходный код, переписал его вручную на иной язык (интерфейс также изменил). Ведь в праве охраняются именно исходный код, интерфейс, а не сам алгоритм, принципы построения программы. В итоге второй программист достаточно простым путем добился получения прав на программу, хотя потратил время уже только на написание кода.
Ответить