Jak programiści radzą sobie z programowaniem niskiego poziomu w językach wysokiego poziomu?

20

Jestem nieco nowy w programowaniu i najlepszym sposobem, w jaki mogę zadać to pytanie, jest przykład.

Wiem, jak robić podstawowe rzeczy w Javie i C #. Rzeczy takie jak mała aplikacja do tworzenia okien lub tworzenie ogólnej klasy. Zasadniczo się uczyłem i jeszcze nie próbowałem robić nic wielkiego. W każdym razie zawsze byłem ciekawy, jak to się robi „pod maską”. Chyba można powiedzieć.

Wiem, że wszystko sprowadza się do zera i zera, a języki asemblera w zasadzie dają polecenia wzorcom z jedynkami i zerami, ale wygląda na to, że jest od tego skok do: użyj do tego biblioteki. Wydaje mi się, że wszystko, co C # może zrobić bez biblioteki, jest logiką arytmetyczną i binarną. Aby uzyskać dane wejściowe lub wyjściowe, korzystasz z bibliotek itp.

Wiem, że to pytanie prawdopodobnie wydaje się niektórym oczywiste i wiem, że muszę się wiele nauczyć, ale nawet nie wiem od czego zacząć od takiego pytania. Dziękuję Ci.

Więc moje pytanie brzmi:

Jeśli ktoś zamierza stworzyć maszynę wirtualną lub emulator Playstation, system operacyjny lub sterownik, albo dodać obsługę mp3 do odtwarzacza multimediów, albo utworzyć własny typ pliku itp. Jak? Nie widzę sposobu, w jaki można to zrobić za pomocą C # lub Java.

Innymi słowy, jeśli przeczytam książkę typu Professional C # firmy WROX lub Programowanie C # firmy OReilly, czy będę wiedział, jak to zrobić? A może musisz nauczyć się języka asemblera lub czegoś bardziej niskiego poziomu, takiego jak C ++?

błotnik 1901
źródło
7
Jednym ze sposobów na zrozumienie tego, co dzieje się „pod maską”, jest skupienie się i użycie akapitów, aby ułatwić czytanie i zrozumienie. Proszę edytować to pytanie być łatwiejsze do odczytania.
S.Lott,
1
Biorąc pod uwagę Twoje zainteresowanie, możesz chcieć odebrać kopię Kodeksu Charlesa Petzolda: Ukryty język sprzętu i oprogramowania komputerowego. To dobra lektura. amazon.com/Code-Language-Computer-Hardware-Software/dp/…
DKnight
@ S.Lott Na ratunek :-)
Martin Wickman
@Martin Wickman: Chociaż bardzo dobra praca pomogła @ fender1901 w edycji lub skupieniu?
S.Lott,
1
@Martin Wickman: Cofanie zmian nie jest celem. Chodzi mi o zachęcanie innych do nauki poprzez działanie. Wyraźnie już wiesz. @ fender1901 musi się uczyć, robiąc. Moje pytanie brzmi: „czy pomogło @ fender1901 w edycji lub skupieniu?” Co myślisz?
S.Lott,

Odpowiedzi:

9

Interesujące pytanie! Przekonasz się, że języki takie jak Java i C # w rzeczywistości obsługują programowanie na dość niskim poziomie. Na przykład spójrz na niektóre kody źródłowe we / wy w OpenJDK dla Java. Zobaczysz, że metody wyższego poziomu są implementowane za pomocą technologii gniazd niższego poziomu, tablic bajtów i kręcenia bitów.

Jeśli chodzi o C # i Javę, te języki kompilują się do kodu bajtowego, który jest uruchamiany na maszynie wirtualnej. W rzeczywistości możesz dość przyjemnie przeglądać i uczyć się z kodu bajtowego (np. Zobacz, jak Java radzi sobie z konkatenacją obiektów String).

Jeśli środowisko, w którym się rozwijasz, nie obsługuje jednej z tych maszyn wirtualnych wyższego poziomu (często ze względu na wymagania dotyczące miejsca i wydajności), musisz użyć języka „niższego poziomu”.

Uważam, że C / C ++ nadal rządzi gniazdem w obszarze pisania sterowników niskiego poziomu itp., Ponieważ możesz ulepszyć zarządzanie pamięcią i struktury danych do n-tego stopnia.

Montaż jest obecnie dość wyspecjalizowany, dobrze jest wziąć przynajmniej krótki kurs, aby docenić to, co dzieje się na tym poziomie. Kiedy piszesz część asemblera, aby wypełnić rejestr podczas opróżniania, zaczynasz doceniać rodzaje długości, do których musi przejść każda warstwa języka programowania.

HTH

Martijn Verburg
źródło
Czy potrafisz programować w językach pośrednich, czy są one tylko po to, aby je sprawdzić?
fender1901
Czy pytasz, czy możesz napisać kod źródłowy „bytecode”?
Martijn Verburg
Myślę. Zastanawiam się, czy możesz po prostu zacząć kodować za pomocą kodu bajtowego lub il tak jak java lub c #?
fender1901
Java lub C #, bardzo niewiele osób manipuluje kodem bajtowym, jednak większy zestaw ludzi patrzy na to, jaki kod bajtowy sprowadza ich konkretny kod wyższego poziomu
Martijn Verburg
4

Większość programowania „niskiego poziomu” zasadniczo polega na bezpośredniej współpracy z systemem operacyjnym. Powodem, dla którego nie wydaje ci się, że istnieje „oczywisty” sposób, jest to, że ogólnie rzecz biorąc, języki wyższego poziomu, takie jak Java, dążą do łatwości użycia i przenośności. Kod, który bezpośrednio łączy się z systemem operacyjnym, jest na ogół znacznie mniej przenośny niż kod wyższego poziomu, chyba że jest zawinięty w abstrakcję.

W językach niższego poziomu, takich jak C i C ++, interfejs API systemu operacyjnego jest bezpośrednio dostępny (głównie ze względu na fakt, że większość systemów operacyjnych jest napisanych w języku C, więc udostępniają interfejs API w języku C). Na przykład w C w systemie UNIX można wywołać tę ioctlfunkcję, aby bezpośrednio połączyć się z urządzeniem.

Oczywiście języki wyższego poziomu, takie jak Java i C #, również muszą rozmawiać z systemem operacyjnym. Za każdym razem, gdy otwierasz plik lub czytasz z gniazda sieciowego, łączysz się z systemem operacyjnym. Po prostu Java i C # otaczają wywołania systemowe niskiego poziomu w abstrakcjach wyższego poziomu, jak Socketobiekt. Takie podejście wyższego poziomu ma tę zaletę, że ten sam kod Java będzie działał na różnych platformach. Podczas gdy sposób otwierania gniazda w C w systemie UNIX różni się od sposobu, w jaki robiłbyś to w systemie Windows.

Ogólnie rzecz biorąc, im wyższy poziom języka, tym mniejsza kontrola nad tym, jak program współpracuje z systemem operacyjnym. To powiedziawszy, wiele rzeczy, o których wspominasz, jest możliwych do zrobienia w języku wyższego poziomu. Na przykład nie ma powodu, dla którego nie można napisać maszyny wirtualnej w Javie lub C #.

Charles Salvia
źródło
2

Dobrą wiadomością jest to, że można to zrobić za pomocą Java lub C #. Jedyny problem, który musisz wiedzieć, to jak . Zasadniczo musisz wiedzieć o tych miłych drobiazgach na temat architektury sprzętu (niekoniecznie komputer, ale Playstation, jeśli chcesz to naśladować). I obawiam się, że musisz zagłębić się, jak asembler i język maszynowy.
Wszystkie ALU, rejestry, MMU i inne elementy można wyodrębnić i emulować za pomocą języka wysokiego poziomu. Możesz nawet wywoływać funkcje niskiego poziomu w celu uzyskania wsparcia sprzętowego (dowiedz się na przykład o PInvoke i JNA).

Ponieważ jednak jesteś początkujący, nie polecałbym zacząć od tak ogromnego zadania. Sugerowałbym, abyś nauczył się C / C ++, trochę o Linuksie (lub innym systemie uniksopodobnym, tj. FreeBSD), architekturze komputerowej, a potem asemblerze ... Może to potrwać kilka lat, więc ...
Naprawdę potrzebujesz motywacja i cierpliwość.

Paweł Dyda
źródło
2

To, co zrobiłem, czego nauczyłem się języka wysokiego poziomu (Java), zainteresowało cię, tak jak ty, o językach niskiego poziomu i sprzęcie. W najbardziej prymitywnym stanie komputer to elektronika. 1 i 0 to tylko liczby dla ładunków elektrycznych (włączanie i wyłączanie). Kiedy zacząłem rozumieć logikę procesorów i to, co jest w arytmetycznej jednostce logicznej, rzeczy naprawdę się ułożyły.
Myślę, że powinieneś rozpocząć studiaz logiką boolowską (AND, OR, XOR itp.), a następnie zacznij projektować małe ALU i przyjrzyj się, jak pamięć i rejestry odgrywają rolę. Następnie naucz się języka asemblera, a potem zrozumiesz, jak działa kompilacja. Już wkrótce języki na wysokim poziomie będą wydawały się nudne! :) Żartuję. To piękne, jak wszystko układa się na swoim miejscu i nauka powinna być przyjemna. Gdy zaczniesz podążać ścieżką ciekawości, szybko to odbierzesz.

Trevor Arjeski
źródło
2

Chociaż możesz robić rzeczy na niskim poziomie za pomocą C # lub Java (lub większości innych języków), większość ludzi tego nie robi. W związku z tym każda dość popularna książka, którą wybierzesz, pozostawi rzeczy na niskim poziomie. Prawdopodobnie będą obejmować funkcje językowe, których potrzebujesz, ale nie zastosują ich tak, jak jesteś ciekawy. Podobnie, książki na tematy niskiego poziomu będą prawdopodobnie w języku C, z być może trochę językiem asemblera.

Nauka samego C nie będzie trudna dla programisty C #, oprócz manipulacji wskaźnikiem, chociaż nauka robienia w nim zajmie więcej czasu. Ponieważ C jest mniej ekspresyjnym językiem niż C #, niektóre rzeczy, które wiesz, jak skutecznie robić w C #, będą musiały być wykonane w znacznie innym, i często niezdarniejszym, języku C.

Następnie powinieneś szukać książek na niższym poziomie, których chcesz się nauczyć. Na przykład w jądrze Linuksa znajdują się książki, ale programowanie na poziomie jądra będzie trudne do zrozumienia bez znajomości tła, dlatego warto najpierw zapoznać się z podstawami systemu operacyjnego.

David Thornley
źródło
Myślę, że moim największym problemem jest to, że wiele z tych tematów będzie trudnych do zrozumienia, ponieważ nie mam doświadczenia. Potrzebuję, jak sądzę, mostu w tych obszarach.
fender1901
@ fender1901: To może być problem. Jądro Linux robi rzeczy, które wyglądałyby naprawdę dziwnie dla kogoś, kto nie rozumie, co robią systemy operacyjne. Emulator, o którym wspomniałeś, prawdopodobnie byłby najłatwiejszy do zrozumienia, a istnieją proste emulatory, często dla wczesnych mikrokomputerów.
David Thornley,
1

Musisz dowiedzieć się, czy możliwe jest wykonanie funkcji niskiego poziomu na używanej platformie / języku, czy nie:

  • przechowywanie bajtu w zmiennej,
  • odczyt / zapis plików według bajtów,
  • konfigurowanie tablicy bajtów, dostęp do elementów,
  • używać prawdziwych funkcji proceduralnych, OOP,
  • dostęp do ekranu, klawiatury, gniazd.

Hm, dźwięki, że wybór języka powinien być przypadkowy.

ern0
źródło
-2

Pytanie ma kilka odpowiedzi: 1. Java i C # to języki wysokiego poziomu, które zostały opracowane do tworzenia aplikacji w istniejącym systemie operacyjnym zarządzającym pamięcią (umożliwia to także tworzenie programów hybrydowych, które mogą działać na różnych systemach). 2. Obszary, w których potrzebne jest programowanie na niskim poziomie, to programowanie systemu operacyjnego, programowanie sterowników, tworzenie gier AAA itp. Zwykle programowanie na niskim poziomie nie odbywa się w Javie ani w języku C #, lecz jest realizowane przy użyciu C / C ++ i języka asemblera.

Tylko z tymi dwoma punktami możemy powiedzieć, że programowanie niskiego poziomu odbywa się osobno i nie ma potrzeby programowania niskiego poziomu w programowaniu wysokiego poziomu. Części, w których potrzebne jest niskie programowanie, takie jak We / Wy, są wykonywane przez interpretera, który sam jest napisany w języku niskiego poziomu (na przykład JVM Javy jest napisany w C).

Główną odpowiedzią na twoje pytanie jest to, że rzeczy nie są rozwijane przy użyciu Javy i C #, te rzeczy są wykonywane w C i Asemblera, więc zamiast znajdować sposoby na zrobienie tego w Javie i C # powinieneś zdobyć wiedzę na temat C i Asemblera, ponieważ są to najwięksi koledzy programowanie i tak wielką zaletą jest to, że program napisany na niskim poziomie jest mały i szybki.

mur2501
źródło
wydaje się, że nie oferuje to nic istotnego w porównaniu z punktami poczynionymi i wyjaśnionymi w poprzednich 6 odpowiedziach opublikowanych kilka lat temu
komnata