Montajda pratik problemleri yapmaya çalışmalı mıyım? [kapalı]


9

Project Euler Problem 48'e bakıyordum :

Seri, 1 1 + 2 2 + 3 3 + ... + 10 10 = 10405071317.

Serinin son on basamağını bulun, 1 1 + 2 2 + 3 3 + ... + 1000 1000 .

Python'da bunu tek bir satırla yapabilirim:

sum((x**x for x in xrange(1,1001))

Ancak bunun montaj eşdeğeri 100 satır ve gerçek bir meydan okuma olacaktır.

Bu bulmacalardan bazılarını, düşük seviyeli programlamayla ilgili bilgi edinmek ve bilgisayarın gerçekte nasıl çalıştığını anlamak için yapmalıyım?


2
Belleğin nasıl çalıştığını bilmiyorsanız, işaretçiler gibi konularla nasıl başa çıkmanız beklenebilir? Bir bilgisayarın ve işletim sisteminin nasıl çalıştığını anlamıyorsanız, bir uygulamayı nasıl programlayabilirsiniz?
Ramhound

Ramhound'a bir sürü soyutlama yapabilirim, bu yüzden sana bunu sordum. Göstericilerin tam olarak asılmasının, işaretçilerin başka bir veri türünün bellek konumunu sakladığını varsaydığınızda mantıklı bir anlam ifade eden işaretçilerde hala bir şeyler yapamayabilirim. konuları okumalıyım? Meclis Dili ve biraz COA iyi olurdu?
Nishant

Eğer tam bir işaretçi alamazsanız, bazı yerlerde ciddi bir dezavantaj olduğunu göreceksiniz.
David Thornley

3
Ya Python satırınız 1..1000'de x için x ^ 2 hesaplar (1..1000'de x için x ^ x yerine) ya da python düşündüğümden daha büyülü. :)
Ingo

*Python'da "gücüne yükseltme" işlevi var mı?

Yanıtlar:


1

Öğrenim derlemesinin ötesinde, C gibi düşük seviyeli bir dilin nasıl derlendiğini öğrenmenin çok değerli olduğuna inanıyorum. Yani cevabım evet, ama yine de muhtemelen yanlıyım çünkü düşük seviyeli programlamanın tadını çıkarıyorum.

Örneğin, basit ifadelerin nasıl derlendiğini anlamak. Aşağıdaki fonksiyon,

int func(int val)
{
  int num = val * 5;
  return num;
}

... olur (en azından ilginç kısım):

movl    %edi, -20(%rbp)
movl    -20(%rbp), %edx
movl    %edx, %eax
sall    $2, %eax
addl    %edx, %eax

Bu kod, bağımsız değişkeni yığından alır (val, func parametresi), 2 sola kaydırır (2 ^ 2 veya 4 ile çarp) ve sonra sonuca orijinal değeri ekler. Sonuç, 5 ile çarpmadır. Bunun gibi bir örnek, derleyici optimizasyonları gibi dikkat edilmesi gereken birkaç şeyi gösterir. Doğrudan 5 ile çarpmak için bir talimat çağırmak yerine, iki yeri 4 ile çarpacak şekilde kaydırır ve sonra orijinal değeri ekler. Olayları daha düşük bir seviyede anlamamı büyük ölçüde iyileştirmek için böyle örnekler buldum.

Bu -Sseçenek ile gcc'den derleyici çıktısı oluşturun . Ancak, sonuçların derleyici ve optimizasyon düzeyine göre değişeceğini unutmayın.

Her neyse, derleme dili programcısı olmanın derlemeyi anlamakla aynı şey olduğunu düşünmüyorum . Yine, C gibi bir dilde programlamanın ve makine koduna nasıl konulduğunu bilmenin değerli bir uygulama olduğunu hissediyorum.


11

Muhtemelen montajcı yazabilmek için gerekli değildir (çoğu sisteminiz için başlatma ve çağırma kuralının ayrıntılarını içerir).

Kaynaksız bir şeyi hata ayıklamaya çalışıyorsanız, bazılarını anlamaya değer.

AMA makineyi en azından 'C' ve işaretçiler (esas olarak yüksek seviyeli bir montajcı) seviyesinde anlamaya değer, böylece bir ipi bir döngüde milyonlarca kez sonuçlandırmanın neden kötü olduğunu bilirsiniz.


Aslında, bazı göreceli akıllı uygulamalar for i in range(1000000): s = s + '.'yeniden kullandığım "optimize edilmiş" sürümlerden daha kötü olamaz s. Benzer şekilde, diğer bazı gelişmeler de C bilgisi ile makul bir varsayımı geçersiz kılar ve naif bir uygulama varsayar. Ancak genel olarak zararlıdan daha yararlıdır. Dil uygulamalarının bazen sizden daha akıllı olduğunu unutmayın;)

2
@delnan -Java / C # 'da zararsız görünen bir şeyin silikonda çok pahalı olabileceğine dair kısa bir örneğe ihtiyacım vardı. Özellikle büyük bir bellek ayırma ve kopyanın anında olduğunu düşünen birçok insanla karşılaştım.
Martin Beckett

Bu delnan :-) inanmaktan nefret ediyorum
Nishant

5

İyi soru. Öğrenim Meclisi kesinlikle iyi ve çabaya değer.

  1. Böyle düşük seviyeli anlayış, gömülü yazılım geliştirmede yararlı olacaktır
  2. Düşük seviyede yeniden düzenleme
  3. Hata ayıklayıcıyı etkili bir şekilde kullanmanıza yardımcı olacaktır
  4. Kod mağaraları gibi şeylere yardımcı olmak için demonte kod hakkında bilgi verin

2
Kodekleri aramak zorunda kaldım. Bunları çok kullanıyorum ama şimdi onlara "Detours" diyoruz. research.microsoft.com/en-us/projects/detours
ProdigySim

1

Evet ve hayır.

Kodunuzun ne yaptığını ve bazı şeylerin neden çaba hakkında düşünmeniz gereken kötü bir fikir olduğunu daha iyi anlayacağınız doğru olsa da.

Öğrenen toplayıcı bir hafta sonu projesi değil, çok zaman alacak ve bu zamanın daha iyi harcanıp harcanmayacağını düşünmeniz gerekiyor.

Eğer optimize edilmiş kod içine değil, o zaman muhtemelen hiç çaba koymak eşit faydaları görmezsiniz.


1

Gençken çok fazla montajcı yaptım ve montajcı dışında bir şey anlamaya yardımcı olduğunu düşünmüyorum. Eğer modern montajcıya bir göz atarsanız, bunların hepsi zaten makro dildir. Genellikle analojilerden nefret ederim, ama yine de işte gidiyor: Bir arabanın motorunun nasıl çalıştığını bilmek sizi daha iyi bir sürücü yapıyor mu?


Bir arabanın motorunun nasıl çalıştığını bilmek sizi daha iyi bir sürücü yapar mı? Hayır, ama bu sizi daha iyi bir araç sahibi yapar, çünkü motor bozulursa düzeltebilirsiniz.
Cameron Martin

Kabul etti, ama bu seni daha iyi bir sürücü yapmıyor, ki bu benim kullandığım benzetme. Motoru kendiniz tamir ederek mekanik kullanarak daha geniş ekonomiyi desteklemiyorsunuz, ... Analojiler sınırlarla geliyor. Genel olarak, birisinin ilgileniyorsa bir şey öğrenmek istememesinden asla vazgeçmem, ancak bence onu daha yüksek seviyeli dillere kullanışlı bir şekilde uygulayabilmek için tavşan deliğinin derinliklerine inmeniz gerekiyor. Bir başlangıç ​​için, derlenmişse belirli bir dil tarafından kullanılan derleme optimizasyonlarını, yorumlayıcıyı veya titremeyi anlamanız gerekir. Büyük bir alan.
Ian

1

Montajcıyı anlamak için çalıştığım yol, daha yüksek seviyeli dillerde programlar yazmak, ardından parçaları (en azından umarım) işlevsel olarak eşleştirilmiş birleştirilmiş kod parçalarıyla değiştirmektir. Bu, HLL'leri üst düzey problemleri düzenlemek ve çözmek için iyi oldukları şey için kullanacağım anlamına geliyor ve metali vurmak için asm kullanıyorum.

(Bir HLL'de yazılan ana bilgisayar programı hakkında konuştuğumda, x86_64 asm ve Z80, 6502 ve 6809 asm üzerinde çalışırken BASIC öğrenmeye çalıştığımda C veya ObjC demek istiyorum).

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.