Programcılar yüksek seviyeli dillerde düşük seviyeli yazılım geliştirme ile nasıl başa çıkıyor?


20

Programlamaya biraz yeniyim ve bu soruyu sormanın en iyi yolu bir örnek.

Java ve C # 'da temel şeyleri nasıl yapacağımı biliyorum. Küçük pencereler gibi şeyler uygulama oluşturur veya genel bir sınıf oluşturur. Temelde öğreniyordum ve henüz büyük bir şey yapmaya çalışmadım. Her neyse, her zaman "kaputun altında" işlerin nasıl yapıldığını merak ettim.

Her şeyin 1s ve 0s'a kadar kaynatıldığını ve montaj dillerinin temelde 1s ve 0s kalıplarına komutlar verdiğini biliyorum, ama oradan bir sıçrama var gibi görünüyor: bunun için bir kütüphane kullanın. Bana öyle geliyor ki tüm C # kitaplık olmadan yapabileceği gibi aritmetik ve ikili mantık. Girdi veya çıktı almak için kütüphaneler vb. Kullanırsınız.

Bu sorunun muhtemelen bazıları için çok açık olduğunu biliyorum ve öğrenecek çok şeyim olduğunu biliyorum, ancak böyle bir soru ile nereden başlayacağımı bile bilmiyorum. Teşekkür ederim.

İşte benim sorum bu:

Birisi sanal bir makine veya Playstation öykünücüsü veya işletim sistemi veya sürücü yapacaksa veya bir medya yürütücüye mp3 desteği ekleyecekse veya kendi dosya türünüzü vb. C # veya Java ile yapılması gereken yolu göremiyorum.

Başka bir deyişle, WROX tarafından Professional C # veya OReilly tarafından Programming C # gibi bir kitap okursam, bunları nasıl yapacağımı bilir miyim? Yoksa montaj dilini veya C ++ gibi daha düşük bir seviyeyi öğrenmek zorunda mısınız?


7
"Kaputun altında" neler olup bittiğini anlamanın bir hilesi, şeyleri kolay okunur ve anlaşılır hale getirmek için paragraflara odaklanmak ve kullanmaktır. Daha kolay okunabilmesi için lütfen bu soruyu düzenleyin .
S.Lott

1
İlgi alanınıza göre, Charles Petzold'un Kodunun: Bilgisayar Donanımı ve Yazılımının Gizli Dili'ni kopyalamak isteyebilirsiniz. İyi bir okuma. amazon.com/Code-Language-Computer-Hardware-Software/dp/…
DKnight

@ S.Lott Kurtarmak için :-)
Martin Wickman

@Martin Wickman: Çok güzel bir çalışma olsa da, @ fender1901'in düzenlenmesine veya odaklanmasına yardımcı oldu mu?
S.Lott

1
@Martin Wickman: Değişiklikleri geri almak önemli değil. Başkalarını yaparak öğrenmeye teşvik etmek benim açımdan. Açıkça biliyorsun. @ fender1901 yaparak öğrenmesi gerekiyor. Sorum şu: "@ fender1901'in düzenlenmesine veya odaklanmasına yardımcı oldu mu?" Ne düşünüyorsun?
S.Lott

Yanıtlar:


9

İlginç soru! Java ve C # gibi dillerin oldukça düşük seviyeli programlamayı desteklediğini göreceksiniz. Örneğin, Java için OpenJDK'daki bazı G / Ç kaynak koduna bakın. Daha yüksek seviye yöntemlerin daha düşük seviye soket teknolojileri, bayt dizileri ve bit döndürme ile uygulandığını göreceksiniz.

C # ve Java ile ilgili olarak, bu diller sanal bir makinede çıkarılan bayt koduna kadar derlenir. Aslında bayt kodunu oldukça mutlu bir şekilde görüntüleyebilir ve öğrenebilirsiniz (örneğin, Java'nın String nesnelerini birleştirmeyi nasıl gördüğünü görmek).

Geliştirdiğiniz ortam bu üst düzey VM'lerden birine (genellikle alan ve performans gereksinimleri nedeniyle) ev sahipliği yapmıyorsa, 'daha düşük düzey' bir dil kullanmanız gerekir.

Bellek yönetimi ve veri yapıları n. Dereceye kadar tweak yapabilirsiniz gibi C / C ++ hala düşük düzey sürücüler vb yazma alanında tünek kural inanıyorum.

Meclis bu günlerde oldukça uzmanlaşmıştır, bu seviyede neler olduğunu takdir etmek için en azından hızlı bir kurs almak iyidir. Boşaltılırken bir kaydı geri doldurmak için bir Montaj yazdığınızda, her programlama dili katmanının gitmesi gereken uzunlukları takdir etmeye başlarsınız.

HTH


Aslında ara dillerle programlayabilir misiniz yoksa sadece incelemek için oradalar mı?
fender1901

'Bayt kodu' kaynak kodu yazıp yazamayacağınızı mı soruyorsunuz?
Martijn Verburg

Bence. Java veya c # gibi sadece bytecode veya il kullanarak kodlamaya başlayabilir miyim merak ediyorum?
fender1901

Java veya C #, çok az kişi bayt kodunu manipüle ediyor, ancak daha büyük bir insan belirli üst düzey kodlarının hangi bayt koduna bağlı olduğuna bakıyor
Martijn Verburg

4

Çoğu "düşük seviye" programlama temel olarak İşletim Sistemi ile doğrudan arabirim oluşturur. Sanki bunu yapmanın "açık" bir yolu olmadığı gibi görünmemesinin nedeni, Java gibi daha yüksek seviyeli dillerin kullanım kolaylığı ve taşınabilirlik için çabalamasıdır. İşletim Sistemiyle doğrudan arabirim oluşturan kod, bir soyutlama ile sarılmadıkça genellikle üst düzey koddan çok daha az taşınabilirdir.

C ve C ++ gibi alt düzey dillerde, İşletim Sistemi API'sına doğrudan erişilebilir (büyük ölçüde çoğu İşletim Sisteminin C dilinde yazılması nedeniyle, bir API'yi C dili aracılığıyla ortaya çıkarır). Örneğin, UNIX sistemindeki C'de, ioctlbir aygıtla doğrudan arabirim oluşturmak için işlevi çağırabilirsiniz .

Tabii ki, Java ve C # gibi daha üst düzey diller de İşletim Sistemi ile konuşmalıdır. Her dosya açtığınızda veya bir ağ soketinden her okuduğunuzda işletim sistemi ile arabirim oluşturursunuz. Sadece Java ve C #, düşük seviyeli işletim sistemi sistem çağrılarını bir Socketnesne gibi daha üst düzey soyutlamalara sarıyor . Bu üst düzey yaklaşımın avantajı, aynı Java kodunun farklı platformlarda çalışmasıdır. Öte yandan, UNIX'te C'de bir yuva açma şekliniz, Windows'da yaptığınız yoldan oldukça farklıdır.

Genel olarak, dil ne kadar yüksek olursa, programınızın İşletim Sistemi ile nasıl etkileşimde bulunduğu konusunda daha az kontrole sahip olursunuz. Yani söz bir çok şey söyledi vardır daha yüksek bir seviyede dilde yapmak mümkün. Örneğin, Java veya C # 'da bir Sanal Makine yazamamanız için hiçbir neden yoktur.


2

İyi haber, bir edebilir Java veya C # ile yapılabilir. Bilmeniz gereken tek sorun nasıl yapılacağıdır . Temel olarak, Donanım Mimarisi hakkında bu güzel küçük şeyleri bilmeniz gerekir (gerekli PC değil, taklit etmek istiyorsanız Playstation). Korkarım Assembler ve Machine Language gibi derine inmeniz gerekecek.
Tüm ALU'lar, kayıtlar, MMU'lar ve öğeler soyutlanabilir ve üst düzey dille taklit edilebilir. Donanım desteği almak için düşük seviyeli işlevleri bile çağırabilirsiniz (örneğin PInvoke ve JNA hakkında bilgi edinin).

Ancak, yeni başladığınız için böyle muazzam bir görevle başlamayı tavsiye etmem. C / C ++, biraz Linux (veya diğer Unix benzeri işletim sistemleri, yani FreeBSD), Bilgisayar Mimarisi, sonra Assembler hakkında bilgi edinmenizi öneririm ... Birkaç yıl sürebilir, yani ...
Gerçekten ihtiyacınız olan şey motivasyon ve sabır.


2

Yaptığım şey, yüksek seviyeli bir dili (Java) öğrendikten sonra, sizin gibi, düşük seviyeli diller ve donanım hakkında daha fazla ilgilendi. En ilkel durumunda, bilgisayar elektroniktir. 1'ler ve 0'lar sadece elektrik yükleri için rakamlardır (açık ve kapalı). İşlemcilerin arkasındaki mantığı ve Aritmetik Mantık Birimi'nin içinde ne olduğunu anlamaya başladığımda, işler gerçekten yerine oturdu.
Bence çalışmalarına başlamalısınmantıksal mantık (AND, OR, XOR, vb.) Bundan sonra bazı montaj dillerini öğrenin ve derlemenin nasıl çalıştığını anlayacaksınız. Çok yakında yüksek seviyeli diller sıkıcı görünecek! :) Şaka yapıyorum. Yine de her şeyin nasıl gerçekleştiği çok güzel ve öğrenmesi eğlenceli olmalı. Merak yolunu izlemeye başladığınızda, işleri hemen alırsınız.


2

C # veya Java ile (veya diğer birçok dilde) düşük düzeyli şeyler yapabilirsiniz, ancak çoğu kişi bunu yapmaz. Bu nedenle, ikisinden de aldığınız makul derecede popüler herhangi bir kitap, düşük seviyeli şeyleri dışarıda bırakacaktır. İhtiyacınız olan dil özelliklerini kapsaması muhtemeldir, ancak merak ettiğiniz şekilde uygulamazlar. Benzer şekilde, düşük seviyeli şeylerle ilgili kitaplar muhtemelen C'de olacak, belki de küçük bir montaj dili olacak.

İşaretçi manipülasyonunun yanı sıra C öğrenmenin kendisi bir C # programcısı için zor olmayacak, ancak içinde bir şeyler yapmayı öğrenmek daha uzun sürecektir. C, C # 'dan daha az etkileyici bir dil olduğundan, C #' da nasıl verimli bir şekilde yapılacağını bildiğiniz bazı şeylerin C'de çok farklı ve genellikle daha karmaşık bir şekilde yapılması gerekir.

Bundan sonra araman gereken şey, öğrenmek istediğin alt seviyedeki kitapların kitapları. Örneğin, Linux çekirdeğinde kitaplar var, ancak çekirdek düzeyinde programlamanın arka planı olmadan kavraması zor olacak, bu yüzden önce işletim sistemi temellerini incelemek isteyebilirsiniz.


Sanırım şu anki en büyük sorunum bu konuların birçoğunun kavramasının zor olacağı çünkü arka planım yok. Sanırım bu bölgelere bir köprü gerekiyor.
fender1901

@ fender1901: Bu bir sorun olabilir. Linux çekirdeği, işletim sistemlerinin ne yaptığını anlamayan birine gerçekten tuhaf görünecek bazı şeyler yapar. Bahsettiğiniz şeylerin öykünücüsü, muhtemelen en kolayı olacaktır ve genellikle erken mikrobilgisayarlar için basit emülatörler vardır.
David Thornley

1

Öğrenmelisiniz, düşük platform işlevini kullanılan platform / dil ile yapmak mümkün değil mi:

  • bir baytın bir değişkene depolanması,
  • dosyaları bayt olarak okuma / yazma,
  • bir bayt dizisi oluşturma, öğelere erişme,
  • gerçek prosedür özelliklerini kullanır, OOP,
  • ekran, klavye, prizlere erişme.

Hm, bir dil seçmenin rastgele olması gerektiğini söylüyor.


-2

Sorunun birkaç cevabı vardır: 1. Java ve C #, belleği yöneten mevcut bir İşletim sisteminde uygulama geliştirme için geliştirilmiş üst düzey dillerdir (bu aynı zamanda farklı sistemlerde çalışabilen hibrit programların yapılmasını da mümkün kılar). 2. Düşük seviyeli programlamanın gerekli olduğu alanlar OS geliştirme, Sürücü geliştirme, AAA oyun geliştirme vb. Dir. Normalde düşük seviyeli programlama Java veya C # ile yapılmaz. C / C ++ ve Assembly dili kullanılarak gerçekleştirilir.

Sadece bu iki nokta ile düşük seviyeli programlamanın ayrı ayrı yapıldığını söyleyebiliriz ve yüksek seviyeli programlamada düşük seviyeli programlamaya gerek yoktur. G / Ç gibi düşük programlama gerektiren parçalar, kendisi düşük seviyeli bir dilde yazılmış tercüman tarafından gerçekleştirilir (örneğin, java'nın JVM'si C ile yazılır).

Sorunuzun ana cevabı, bu şeylerin Java ve C # kullanılarak geliştirilmemesidir. Bu şeyler C ve Assembly'de yapılır, bu yüzden Java ve C # 'da yapmanın yollarını bulmak yerine, C ve Assembly'yi öğrenmenin en büyük erkekleri olduğu için programlama ve evet büyük avantajı düşük seviyede yazılmış program küçük ve hızlı olmasıdır.


Bu, birkaç yıl önce gönderilen önceki 6 cevapta yapılan ve açıklanan puanlar üzerinde önemli bir şey sunmuyor gibi görünüyor
gnat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.