Üst düzey bir geliştiricinin montaj okumaya zaman harcaması akıllıca mı? [kapalı]


33

Çalışmalarımızda düşük seviyeli malzeme bilgisinin çok önemli olduğu açıktır.

Ancak, zaten yüksek seviyede ticari yazılım geliştirdiğiniz ve zaten seçilen bir yönünüz olduğu ancak herhangi bir montaj beceriniz olmadığı bir durumda, kendi yönünüzle ilgili şeyleri incelemeye odaklanmak daha mantıklı değil mi? Yoksa yine de düşük seviyeli temelleri öğrenmek için zaman harcamanız için bir neden var mı?

Ne zaman çok geç, ne zaman değil? Ve eğer çok geç değilse , o zaman kişi nasıl optimal bir şekilde öğrenmeye devam eder (biraz derinlik ve anlayış için fazla zaman harcamak değil anlamında)?


Bir gönderide pek çok soru var :)
Shamim Hafiz

Assembly Language’i Adım Adım keyif aldım. İlk başta noobie-ish programlaması çok, ancak yazar çok eğlenceli. Genel bir fikre sahip olmanın faydalı olduğunu ve öncelikle JavaScript yazdığımı gördüm.
Erik,

İlk (öğrettiğim) dilin meclis lehçesiydi. Bunun nasıl faydalı olacağını görebiliyorum (başkalarının işaret ettiği yollarla) ve ekibin geri kalanı için farklı girdiler sağlamanıza yardımcı olur.
Jamie Taylor

Yanıtlar:


43

Hiç kimsenin hata ayıklamadan bahsetmediğine inanamıyorum ...

Ben değil yazılı Uzun yıllardır içinde montaj kod satırını. Ancak makul sıklıkla okudum . Kaynak ve sembol bilgisine sahip olduğunuzda üst düzey hata ayıklama işlemi harikadır, ancak süslü kütüphaneniz müşteri makinelerinde işlenmeyen bir istisna atarken, lisansa dahil edilmesini istemek için çok geç ...

Ama hala demonte ediciyi açabilirim ve üst düzey mantığınızın nihayetinde ne yaptığını görebilirim , kötü verileri kökenine kadar izleyebilir, FPU kontrol kaydını kimin değiştirdiğini bulabilirim ...

Bu, pastırmamı düşündüğümden daha sık kurtardı. Ve öğrenmek için asla geç değildir - 'Net'te çok sayıda harika referanslar ve öğreticiler vardır ve makinenizde çalışan herhangi bir program uygulamalı bir ortam sağlayabilir.


10
+1, ve eğer yapabilseydim daha fazla büyütürdüm. Her ciddi geliştiricinin, bunun için ASM'yi başka bir sebep olmadan okuyabilmesi gerekir.
Mason Wheeler

3
Bunun neticesi optimizasyondur. Complier'ın kodunuzu montaja nasıl çevirdiğini bilmek, onu çok daha hızlı hale getirmenize yardımcı olabilir!
lambacck

3
+1 Montaj, bir işlemcinin gerçekte nasıl çalıştığını anlamanızı sağlayan tek dillerden biridir. Gelişiminizde üst seviye bir dil ile size yardımcı olur. Okumalısınız: blogs.msdn.com/b/ericlippert/archive/2010/09/30/…

Altta yatan bilgisayarı bilmek, hata ayıklama, optimizasyon ya da tamamen merak için BİRLİKTE faydalıdır. Cidden, en az bir ya da iki montaj dili ailesini okumayı öğren. Öğrendikten sonra asla okumamış veya yazmamış olsanız bile, gelecekteki şeyleri anlama şeklinizi etkileyecektir. Şimdi, başka bir dilde
yazmamayı tercih ederseniz

1
@Mason: "Her ciddi geliştirici" nin ASM'yi okuyabilmesi gerekip gerekmediğini bilmiyorum. JavaScript yazıyorsanız veya kalın bir çerçevenin (.NET veya Java gibi) üzerine kurulu bir programlama dili kullanıyorsanız, ASM'yi ciddi bir geliştirici olmak için gerekli olarak okuyamayacağım. Bununla birlikte, bilgisayarın talimatları çok düşük bir seviyede nasıl yürüttüğünü anlayabilmek, üst düzey programlama dillerinde ve ortamlarında bile oldukça yardımcı olabilir.
Scott Mitchell

15

Assembly dilini öğrenmek zorunda değilsin, sadece nasıl çalıştığını anlaman gerekiyor. XOR'un ne olduğunu bilmeniz ve uykunuzda ikili olarak saymanız gerekir. Vb.

Söylediğiniz gibi, düşük seviyeli malzemelerin bilgisi önemlidir, ancak montajdaki pratik bilgiler değildir.


1
Ben ikinci. İyi bir yaşam programlaması kazanabilir ve ASM'yi okumak / yazmak zorunda kalmazsınız . Bunu gerektiren bazı pozisyonlar var. Kodunuzdaki yarış koşullarından sonra bir çöplüğü okumak süreci düşürdü. Veya çok yoğun programlar kullanıyorsanız (GPU paralelleştirme / OpenCL gibi). Bu görevleri gerçekleştirmek için gerekli olacak dev işlerin yüzdesi çok küçüktür.
yzorg

11

Eğer gerçekten hiçbir alt düzey programlama bilgisi varsa, ben ederim çok boş zamanlarında bazı öğrenme önerilir. Bu konuda uzman olmanıza gerek yok; sadece bir yeterlilik düzeyine ulaş. Sizin için yapacak derleyiciye veya kütüphanelere bağlı kalmak yerine, matematik işinin çoğunu kendiniz yapmanız gerekir. Çoğu montaj talimatı bir işlemci talimatına karşılık geldiğinden programlamada okunabilirliği anlamanıza yardımcı olacaktır. Karmaşıklığı biraz daha büyük programlarda kendiniz gibi şeylerin yararına olmadan yönetmek zorundasınız if...else. Bu, daha basit yüksek seviye programlar yazmanıza yardımcı olacaktır, çünkü montaj deneyimi size okumayı ne kadar kolay olduğunu öğretti.

Ayrıca, derlemenin bir dil olmadığını hatırlayın! Genel bir terimdir, bu temelde sembolik bir dile soyutlanmış bir işlemcinin komut seti anlamına gelir. Farklı işlemciler farklı komut kümelerine ve dolayısıyla farklı montaj dillerine sahiptir. 'Montajı' öğrenirken, bir dil değil, bir süreç öğrenirsiniz.


8

Her zaman kapakların altında zirve yapmaktan ve üzerinde durduğunuz soyutlamanın altında neyin oturduğunu biraz daha fazla anlamaktan faydalanacaksınız. Bir üniversite profesörünün bir keresinde "Tüm iyi programcılar donanımı anlıyor" - devreleri yaratmanız ve manipüle etmeniz gerekmiyor, fakat aşağıda neler olup bittiğini anlayabilmelisiniz - sadece orada olacak daha iyisin.

Bilgisayar Organizasyonu ve Tasarımını Deneyin


1

Evet - Sürekli, yaşam boyu öğrenme, Yazılım geliştirmede bir kariyerin önemli bir bileşenidir. Programlama ve zanaatınızı nasıl geliştireceğinizi öğrenmeye devam etmekle ilgileniyorsanız, evet, bir noktada montajı tamamen yeni bir dile ve kod yazma biçimine maruz bırakacağınız için öğrenmelisiniz. Aynı sebepten, Ruby / Python (dinamik dil), Haskell / F # (saf fonksiyonel dil), Lisp / Scheme (fonksiyonel dil), vb. Gibi birçok dil / programlama stilini denemenizi öneririm.

Programlama sanatı hakkında daha fazla bilgi edinmek istemiyorsanız, bunun çok geç olduğunu söyleyebilirim. Örneğin, kariyerinizde yakında programlamadan Yönetim, Sistem Mühendisliği, Satış / Pazarlama, vb. Gibi başka bir alana geçebileceğiniz bir noktaya eriştiyseniz, sonraki birkaç yıl, programlama zanaat yerine, o alanda geliştirmek için gereken becerilere daha fazla odaklanacağım.


1

Ne olduğunu ve bilgisayarın ne yaptığını bilmelisin. Knuth's MIX gibi bir şey öğrenmek size yardımcı olacaktır. Çoğunlukla kodunuzun verimliliğini değerlendirebilmek. Git Bilgisayar Programcılığı Sanatını bul ve oku. Seni daha akıllı bir programcı yapacak.


1

Yönünüzle ilgili şeyleri araştırmaya odaklanmak daha mantıklı değil mi? Yoksa yine de düşük seviyeli temelleri öğrenmek için zaman harcamanız için bir neden var mı?

Cevap:

  1. Eğer yönünüzü gömülü sisteme yönlendirmek için yönünüzü değiştirmeyi planlamıyorsanız, eşleştirmeyi öğrenmeniz için hiçbir neden yoktur. Derlemenin CPU'ya bağlı olduğu düşünüldüğünde bile bazı temel bilgileri öğrenebilirsiniz, ancak bilginiz CPU mimarisine ve bu CPU için belirlenen talimatlara dayanacaktır.
  2. Windows için kod yazalım. Size şu anki yönünüzden faydalanabilecek yüksek seviyeli dilden daha düşük düzeyde öğrenmek istiyorsanız, derinlemesine Windows I, Windows API, Windows bellek yönetimi vb. Öğrenmenizi öneririm.
  3. Hafıza yönetimi, çöp toplama vb. Gibi mevcut yüksek seviyedeki dil becerilerinizi geliştirin.

0

Kariyeriniz ilerledikçe azalan bir dönüş noktasına ulaştığınızı düşünüyorum. Yani, derleme dilini erken öğrenmelisiniz, çünkü bundan sonra gelen her şeyi daha iyi temel bir anlayışa götürür. Bununla birlikte, zaten işgücündeyseniz ve birkaç yıllık deneyime sahipseniz, işlerin nasıl yürüdüğüne dair bir fikir edinmiş olursunuz, bu nedenle gerçek somun ve civata ayrıntılarını öğrenmek size bu kadar fikir vermeyebilir. .


0

Derleme çalışma ne kadar kullanılacağını bilmiyorum. Ancak en azından C gibi bir dilde bazı programlar yapmak faydalı olacaktır. Son zamanlarda C'de bazı programlama yapmak zorunda kaldım ve bunu aydınlatıcı buldum. C, yüksek seviyeli dillerde mevcut olan soyutlamanın çoğunu kaldırır. Bu soyutlamalar ücretsizdir. C'deki düşük seviye detayların çoğunu yönetmelisiniz, burada yüksek seviye bir dilde olduğu gibi bu detaylar sizin için yönetiliyor. C de biraz programlama yaparak bu detayların farkında olmalısınız. Böylece günlük dilinize geri döndüğünüzde, hala bu farkındalığa sahip olacak ve gerçekte neler olduğunu daha iyi anlayacaksınız. Bu, daha iyi bir programcı olmanıza yardımcı olacaktır.


0

Öğretmenlik mesleğinde, en azından Birleşik Krallık'ta, öğretmenler öğrettiklerinden çok daha fazla nitelikli olmalıdır. Ortaokul (Lise) öğretmeni öğrettikleri konuda bir dereceye sahip olacak ve İlkokul (İlköğretim) öğretmenlerinin de dereceleri olacak ve iyi bir GCSE seviyesine (lise kadar) tüm ana konularda yetkin olmalıdır çıkış sınavları?, ABD çapında gerçek bir eşdeğer).

Niye ya? Çünkü bir şeyi iyi öğretmek veya gerçekten de bir şeyi iyi kullanmak için onu anlamak zorundasınız. Bu, üzerinde çalıştığınız olandan önceki karar zincirinin altında yatan yapının anlaşılmasını gerektirir. Yüksek seviye kodu doğru bir şekilde anlamak için üzerine kurulduğu katmanı, nasıl çalıştığını, güçlü ve zayıf yönlerinin nerede olduğunu anlamalısınız. Bu özyinelemelidir, altındaki katmanı anlamak için altındaki katmanı da anlamalısınız.

Sonuçta, bu yüzden Computing'deki nezih üniversite / kolej kursları, her şeyden önce iyi bir matematik yeteneği ister, çünkü etkili bir şekilde en alt basamaktır.

Maths -> Physics                ->
      -> Chemistry -> Materials -> Hardware Design -> Microcode      -> Assembler
                                                   -> Bus Interfaces -> Peripherals

... Assembler    -> Low Level      -> High Level   ->
... OS / Drivers -> API Level      -> Applications -> User

Bu alanlarda bilginiz yoksa, anlayışınız onun altında tehlikeye girer. Başka bir katmanı çalıştırdığınız seviyeye ne kadar yakınsa, topraklaması da o kadar önemlidir.

Yani: assembler'ı üst seviye kodlayıcı olarak bilmeniz mi gerekiyor?  Yardımı olacaktır.


0

Bir süper bilgisayar gurusu olarak önceki hayatımda çok önemli olmuştu. O zamanlar, en az birkaç yüz tane montajcı satırı yazana ve performansı sıkıştırmaya çalışan bir makineyle ilgilenmediğinizi hissettim. Çok az sayıda programcı bu derinliğe gitmek istediğinden, beni gerçekten vazgeçilmez kıldı. Ve hala HW tasarımcı tipleri ile konuşurken ortak bir dilim var.

Ancak, bunun için gerçekten ihtiyaç / fayda, birkaç on yıl öncesine dayanıyor. Derleyici gelişmeler arasında ve sıra dışı idam yürütme HW arasında, daha fazla assembler yazarak kahramanı oynayabilecek çok az yer vardır. Her ne kadar işlerin nasıl yürüdüğünü anlamak faydalı olsa da. Çocuklarıma (birinci sınıf CS uzmanları) basit bir sanal makinede çok basitleştirilmiş bir montajcı programlamayı öğretmeyi planlıyorum; Umarım, unroll, yazılım boru hatları, önbellek ve ön delme, alt yükleme vb. Gibi şeylerle oynayabiliriz. Yani en azından bu seviyenin devam ettiğini bilecekler.

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.