Как программисты справляются с разработкой программного обеспечения низкого уровня на языках высокого уровня?


20

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

Я знаю, как делать основные вещи в Java и C #. Такие вещи, как небольшое приложение Windows Forms или создание универсального класса. Я в основном учился и еще не пытался сделать что-то большое. В любом случае, мне всегда было любопытно, как все происходит "под капотом", я думаю, вы могли бы сказать.

Я знаю, что все сводится к 1 и 0, и что языки ассемблера в основном дают команды шаблонам 1 и 0, но кажется, что есть переход от этого: использовать библиотеку для этой библиотеки для этого. Мне кажется, что все, что может сделать C # без библиотеки, - это арифметика и двоичная логика. Чтобы получить ввод или вывод, вы используете библиотеки и т.д ...

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

Итак, мой вопрос заключается в следующем:

Если кто-то собирался создать виртуальную машину или эмулятор Playstation, или операционную систему, или драйвер, или добавить поддержку mp3 в медиаплеер, или создать собственный тип файла и т. Д ... Как? Я не вижу, как это будет сделано с C # или Java.

Другими словами, если бы я прочитал книгу типа Professional C # от WROX или Programming C # от OReilly, я бы знал, как это сделать? Или вам нужно изучать ассемблер или что-то более низкое, например, C ++?


7
Одна хитрость в понимании того, что происходит «под капотом», заключается в том, чтобы сосредоточиться и использовать абзацы, чтобы упростить чтение и понимание. Пожалуйста, отредактируйте этот вопрос, чтобы его было легче читать.
С.Лотт

1
С учетом вашего интереса вы можете приобрести копию «Чарльза Петцольда»: «Скрытый язык компьютерного оборудования и программного обеспечения». Это хорошее чтение. amazon.com/Code-Language-Computer-Hardware-Software/dp/…
DKnight

@ S.Lott На помощь :-)
Мартин Викман,

@Martin Wickman: Хотя это очень хорошая работа, она помогла @ fender1901 отредактировать или сфокусироваться?
С.Лотт

1
@Martin Wickman: отмена изменений не в этом. Поощрение других учиться на практике - моя точка зрения. Вы ясно уже знаете. @ fender1901 нужно учиться на практике. У меня такой вопрос: "Помогло ли это @fender1901 отредактировать или сфокусировать?" Как вы думаете?
С.Лотт

Ответы:


9

Интересный вопрос! Вы обнаружите, что языки вроде Java и C # на самом деле поддерживают довольно низкоуровневое программирование. Например, посмотрите на некоторые исходные коды ввода / вывода в OpenJDK для Java. Вы увидите, что методы более высокого уровня реализованы с использованием технологий сокетов более низкого уровня, байтовых массивов и битовых комбинаций.

Что касается C # и Java, эти языки компилируются в байт-код, который выполняется на виртуальной машине. На самом деле вы можете с удовольствием просматривать и изучать байт-код (например, видеть, как Java работает с конкатенацией объектов String).

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

Я считаю, что C / C ++ по-прежнему правит рутом в области написания низкоуровневых драйверов и т. Д., Так как вы можете настроить управление памятью и структуры данных на n-ую степень.

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

НТН


Можете ли вы на самом деле программировать с промежуточными языками или они просто для изучения?
fender1901

Вы спрашиваете, можете ли вы написать исходный код 'bytecode'?
Мартейн Вербург

Я думаю. Мне интересно, если вы можете просто начать кодирование с использованием байт-кода или il, как вы бы Java или C #?
fender1901

Java или C #, очень немногие люди занимаются манипулированием байт-кодом, однако большая группа людей смотрит на то, к какому байт-коду относится их конкретный код более высокого уровня
Мартейн Вербург,

4

Большинство «низкоуровневых» программ в основном сводятся к непосредственному взаимодействию с операционной системой. Причина, по которой вам не кажется, что есть «очевидный» способ сделать это, состоит в том, что, вообще говоря, языки более высокого уровня, такие как Java, стремятся к простоте использования и переносимости. Код, который напрямую взаимодействует с операционной системой, как правило, гораздо менее переносим, ​​чем код более высокого уровня, если только он не заключен в абстракцию.

В языках более низкого уровня, таких как C и C ++, API операционной системы доступен напрямую (во многом благодаря тому факту, что большинство операционных систем написаны на C, поэтому они предоставляют API через язык C). Например, в C в системе UNIX вы можете вызвать ioctlфункцию для непосредственного взаимодействия с устройством.

Конечно, языки более высокого уровня, такие как Java и C #, также должны общаться с операционной системой. Каждый раз, когда вы открываете файл или читаете данные из сетевого сокета, вы взаимодействуете с ОС. Просто Java и C # обертывают системные вызовы ОС низкого уровня в абстракции более высокого уровня, как Socketобъект. Этот высокоуровневый подход имеет то преимущество, что один и тот же код Java будет работать на разных платформах. Принимая во внимание, что способ, которым вы открываете сокет в C в UNIX, совершенно отличается от того, как вы делаете это в Windows.

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


2

Хорошая новость в том, что это можно сделать с помощью Java или C #. Единственная проблема, которую вам нужно знать, это как . По сути, вам нужно знать эти приятные мелочи об аппаратной архитектуре (не обязательно ПК, но Playstation, если это то, что вы хотите эмулировать). И я боюсь, что вам нужно углубиться, как Ассемблер и Машинный язык.
Все ALU, регистры, MMU и прочее можно абстрагировать и эмулировать на языке высокого уровня. Вы даже можете вызвать низкоуровневые функции для получения поддержки оборудования (например, узнать о PInvoke и JNA).

Однако, поскольку вы новичок, я бы не рекомендовал начинать с такой огромной задачи. Я бы посоветовал вам изучить C / C ++, немного о Linux (или другой Unix-подобной ОС, т.е. FreeBSD), компьютерной архитектуре, а затем об ассемблере ... Это может занять несколько лет, так что ...
Что вам действительно нужно, так это мотивация и терпение.


2

То, что я сделал, выучил язык высокого уровня (Java), а затем стало больше интересоваться языками низкого уровня и оборудованием. В своем наиболее примитивном состоянии компьютер - это электроника. 1 и 0 - просто цифры для электрических зарядов (вкл и выкл). Как только я начал понимать логику, лежащую в основе процессоров, и то, что находится внутри арифметического логического устройства, все стало на свои места.
Я думаю, что вы должны начать учебус такими вещами, как логическая логика (AND, OR, XOR и т. д.), затем начните проектировать маленькие ALU и смотреть, как память и регистры играют на вещах. После этого выучите немного ассемблера, и вы поймете, как работает компиляция. Очень скоро языки высокого уровня покажутся скучными! :) Просто шучу. Это прекрасно, как все становится на свои места, и это должно быть приятно учиться. Как только вы начнете идти по пути любопытства, вы сразу же все поймете.


2

Хотя вы можете делать низкоуровневые вещи с помощью C # или Java (или большинства других языков), большинство людей этого не делают. Поэтому любая достаточно популярная книга, которую вы берете на себя, не учитывает низкоуровневые вещи. Они, скорее всего, охватывают языковые функции, которые вам нужны, но не применяют их так, как вам интересно. Точно так же книги о низкоуровневых вещах, вероятно, будут на C, возможно, с небольшим ассемблером.

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

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


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

@ fender1901: Это может быть проблемой. Ядро Linux делает некоторые вещи, которые могут показаться странными для тех, кто не понимает, что делают операционные системы. Эмулятор из упомянутых вами вещей, вероятно, будет проще всего понять, и существуют простые эмуляторы, часто для ранних микрокомпьютеров.
Дэвид Торнли

1

Вы должны выяснить, возможно ли выполнять низкоуровневую функцию с используемой платформой / языком или нет:

  • хранение байта в переменной,
  • чтение / запись файлов байтами,
  • настройка массива байтов, доступ к элементам,
  • использовать истинные процедурные функции, ООП,
  • доступ к экрану, клавиатуре, розеткам.

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


-2

На вопрос есть несколько ответов: 1. Java и C # являются языками высокого уровня, которые они разработаны для разработки приложений в существующей операционной системе, которая управляет памятью (это также позволяет создавать гибридные программы, которые могут работать в разных системах). 2. Области, где требуется низкоуровневое программирование, это разработка ОС, разработка драйверов, разработка игр AAA и т. Д. Обычно низкоуровневое программирование не выполняется в Java или C #, оно выполняется с использованием C / C ++ и языка ассемблера.

Только с этими двумя пунктами мы можем сказать, что низкоуровневое программирование выполняется отдельно и нет необходимости в низкоуровневом программировании в высокоуровневом программировании. Части, где требуется низкое программирование, такие как ввод / вывод, выполняются интерпретатором, который сам написан на языке низкого уровня (например, JVM Java написана на C).

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


Похоже, в этом нет ничего существенного по сравнению с высказанными и объясненными в предыдущих 6 ответах, которые были опубликованы несколько лет назад
коммент
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.