Як програмісти мають справу з розробкою програмного забезпечення низького рівня на мовах високого рівня?


20

Я дещо новачок у програмуванні, і найкращим чином я можу задати це питання на прикладі.

Я знаю, як робити основні речі на Java та C #. Такі речі, як маленьке вікно, формують додаток або роблять загальний клас. Я в основному вчився і ще не намагався зробити щось велике. У всякому разі, мені завжди було цікаво, як все робиться "під капотом", я думаю, ви могли б сказати.

Я знаю, що все зводиться до 1 і 0, і що мови монтажу в основному дають команди для шаблонів 1s і 0s, але, схоже, є такий стрибок звідти до: використовуйте для цього бібліотеку. Мені здається, що всі C # можуть обійтися без бібліотеки - це арифметична та бінарна логіка. Щоб отримати вхід або вихід, ви використовуєте бібліотеки тощо.

Я знаю, що це питання, мабуть, деяким здається очевидним, і я знаю, що мені є чому навчитися, але я навіть не знаю, з чого почати таке питання. Дякую.

Отже, моє запитання таке:

Якщо хтось збирався зробити віртуальну машину чи емулятор Playstation, або операційну систему, або драйвер, або додати підтримку mp3 до медіаплеєра, або створити власний тип файлу тощо ... Як? Я не бачу способу, як це можна було б зробити з C # або Java.

Іншими словами, якщо я читаю книгу на кшталт Professional C # від WROX або програмування C # від OReilly, я б знав, як це робити? Або вам доведеться вивчати мову складання чи щось більш низький рівень, як C ++?


7
Один фокус для розуміння того, що відбувається "під кришкою", - це зосередитись та використовувати абзаци, щоб зробити речі легкими для читання та розуміння. Будь ласка , змініть це питання буде легше читати.
S.Lott

1
Зважаючи на ваш інтерес, ви можете взяти копію коду Чарльза Петцольда: прихована мова комп'ютерного обладнання та програмного забезпечення. Це добре читати. amazon.com/Code-Language-Computer-Hardware-Software/dp/…
DKnight

@ S.Lott На допомогу :-)
Мартін Вікман

@Martin Wickman: Хоча дуже приємна робота, чи допомогла @ fender1901 редагувати чи фокусувати?
S.Lott

1
@Martin Wickman: Скасувати зміни - справа не в цьому. Заохочення інших вчитися, роблячи це - моя думка. Ви, очевидно, вже знаєте. @ fender1901 потрібно вчитися робити. Моє запитання таке: "чи допомогло це @ fender1901 відредагувати чи зосередити увагу?" Що ти думаєш?
S.Lott

Відповіді:


9

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

Що стосується C # та Java, то ці мови складаються у байт-код, який виконується на віртуальній машині. Насправді ви можете з задоволенням переглядати та вчитися за допомогою байт-коду (наприклад, бачити, як Java має справу з об'єднанням об'єктів String).

Якщо середовище, в якому ви розвиваєтесь, не має жодної з цих вищих машин вищого рівня (часто через простору та продуктивності), тоді вам потрібно використовувати мову "нижчого рівня".

Я вважаю, що C / C ++ все ще керує скороченням в області написання драйверів низького рівня тощо, оскільки ви можете налаштувати управління пам'яттю та структурою даних до n-го ступеня.

Асамблея досить спеціалізована в наші дні, добре пройти хоча б швидкий курс, щоб оцінити, що відбувається на цьому рівні. Коли ви пишете якусь збірку для зворотного заповнення реєстру під час випорожнення, ви починаєте цінувати види довжин, до яких повинен пройти кожен рівень мови програмування.

HTH


Чи можете ви насправді програмувати з проміжними мовами або вони просто там, щоб вивчити?
fender1901

Ви запитуєте, чи можете ви написати вихідний код "байт-коду"?
Мартійн Вербург

Я думаю. Мені цікаво, чи можна просто почати кодування за допомогою байт-коду чи іл так, як ви б Java або c #?
fender1901

Java або C #, мало хто працює над маніпулюванням байт-кодом, проте більший набір людей дивиться, на який байт-код зводиться їх конкретний код вищого рівня
Martijn Verburg,

4

Більшість "низькорівневих" програмувань в основному означає пряме взаємодія з Операційною системою. Причина, яка вам не здається, що існує "очевидний" спосіб цього, полягає в тому, що, як правило, мови вищого рівня, такі як Java, прагнуть до зручності використання та портативності. Код, який безпосередньо взаємодіє з Операційною системою, як правило, набагато менш портативний, ніж код вищого рівня, якщо він не загорнутий у абстракцію.

На мовах нижчого рівня, таких як C і C ++, API операційної системи є безпосередньо доступним (багато в чому через те, що більшість операційних систем написані на C, тому вони відкривають API через мову С). Наприклад, в 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), архітектуру комп’ютера, а потім про Assembler ... Це може зайняти кілька років, тому ...
Що вам справді потрібно мотивація та терпіння.


2

Те, що я робив, що вивчив мову високого рівня (Java), потім зацікавився, як і ви, мовами та технікою низького рівня. У своєму найпримітивнішому стані комп'ютер - електроніка. 1 і 0 - це лише цифри електричних зарядів (увімкнено і вимкнено). Як тільки я почав розуміти логіку процесорів і те, що знаходиться в Арифметичній логічній одиниці, речі дійсно стали на свої місця.
Я думаю, ви повинні почати навчанняз такими речами, як булева логіка (AND, OR, XOR тощо), тоді почніть розробляти невеликі ALU та дивитись, як пам'ять і регістри грають у речі. Після цього вивчіть мову монтажу, а потім зрозумієте, як працює компіляція. Досить скоро мови високого рівня здадуться нудними! :) Жартую. Це прекрасно, як все стає на свої місця, і слід приємно вчитися. Як тільки ви почнете слідувати дорозі цікавості, ви підберете речі в найкоротші терміни.


2

Хоча ви можете робити речі низького рівня за допомогою C # або Java (або більшості інших мов), більшість людей це не робить. Тому будь-яка досить популярна книга, яку ви забрали на будь-яку, не залишить речей низького рівня. Вони, ймовірно, покриють потрібні вам мовні функції, але не застосовуватимуть їх так, як вам цікаво. Аналогічно, книги, що містять матеріали низького рівня, ймовірно, будуть на мові С, мабуть, трохи мови асемблери.

Навчання C самостійно не буде важким для програміста на C #, окрім маніпуляції з покажчиком, хоча навчитися виконувати справи в ньому займе більше часу. Оскільки C є менш виразною мовою, ніж C #, деякі речі, які ви вмієте ефективно робити в C #, доведеться робити набагато іншим, а часто незграбним, способом на C.

Що вам слід шукати далі, - це книги про речі нижчого рівня, які ви хочете вивчити. Наприклад, є книги на ядрі Linux, але програмування на рівні ядра буде важко зрозуміти без передумови, тому, можливо, ви хочете спочатку вивчити основи операційної системи.


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

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

1

Ви повинні з’ясувати, чи можна виконувати функцію низького рівня за допомогою використовуваної платформи / мови чи ні:

  • зберігання байта в змінну,
  • читання / запис файлів у байтах,
  • налаштування масиву байтів, доступу до елементів,
  • використовувати справжні процедурні функції, OOP,
  • доступ до екрана, клавіатури, розеток.

Гм, звучить, що вибір мови має бути випадковим.


-2

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

Тільки за допомогою цих двох пунктів ми можемо сказати, що програмування на низькому рівні виконується окремо і немає необхідності в програмуванні низького рівня у програмуванні високого рівня. Частини, в яких потрібне низьке програмування, наприклад введення / виведення, здійснюється інтерпретатором, який сам написаний мовою низького рівня (наприклад, JVM java написаний на С).

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


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