Meclis'te programlar neden daha sık yazılmıyor? [kapalı]


216

Montaj programlamasının C gibi üst düzey bir dilden daha uzun sürdüğü ve programlanmasının daha zor olduğu genel bir görüş gibi görünüyor. Bu nedenle, bu nedenlerden dolayı daha yüksek bir dilde yazmanın daha iyi olduğu varsayılıyor veya varsayılıyor gibi görünüyor. ve daha iyi taşınabilirlik nedeniyle.

Son zamanlarda x86 meclisinde yazıyorum ve belki de bu nedenlerin gerçekten doğru olmadığı, belki de taşınabilirlik dışında şaşkına döndüm. Belki de daha çok bir aşinalık ve montajı iyi yazmayı bilmek meselesidir. Ayrıca, derlemede programlamanın bir HLL'deki programlamadan oldukça farklı olduğunu fark ettim. Belki de iyi ve deneyimli bir montaj programcısı, C'de yazan deneyimli bir C programcısı kadar kolay ve hızlı programlar yazabilir.

Belki de montaj programlama HLL'lerden oldukça farklıdır ve bu yüzden farklı düşünme, yöntem ve yollar gerektirir, bu da tanıdık olmayanlar için programlamayı çok zorlaştırır ve böylece program yazmak için kötü adını verir.

Taşınabilirlik bir sorun değilse, gerçekten de C, NASM gibi iyi bir montajcıya göre ne olurdu?

Düzenleme: Sadece işaret etmek. Montajda yazarken, sadece komut kodlarında yazmak zorunda değilsiniz. Programları daha modüler, daha sürdürülebilir ve okunması daha kolay hale getirmek için çeşitli soyutlamalar yapmak için makroları ve prosedürleri ve kendi kurallarınızı kullanabilirsiniz. İyi montajın nasıl yazılacağı hakkında bilgi sahibi olunan yer burasıdır.


71
Yazmak ? Kod okumaya ne dersiniz? siz (ve diğerleri) kodu yazdığınızdan çok daha fazla okuyacaksınız
nos

81
Neden programım yeni bir platformda çalışacağı için neden yeni bir dil öğrenmek zorundayım? Programlarımı CPU'ların kaç kayıt olduğu ve onunla neler yapabileceğiniz fikrine uyacak şekilde yapılandırmam gerekiyor? Sorunları çözmeye çalışıyorum, bilgisayarları teklif etmiyorum.
Joachim Sauer

8
EDIT özeti: Bir C derleyicisi kullanılabilir.
Meinersbur

4
@Simon Belki o zaman benim yanlış yıl var, ama 2010 yılında ASM vs "C gibi üst düzey bir dil" tartışmak için şaşırdım. Özellikle C üst düzey bir dil örneği olan kısmı
matt b

11
@changelog: programming.reddit.com'u bu şekilde hecelemezsiniz.
BoltClock

Yanıtlar:


331

ASM'nin okunaksızlığı zayıftır ve üst düzey dillere kıyasla gerçekten sürdürülemez .

Ayrıca, C gibi diğer popüler dillerden daha az ASM geliştiricisi vardır .

Ayrıca, daha üst düzey bir dil kullanırsanız ve yeni ASM talimatları (örneğin SSE) kullanılabilir hale gelirse , derleyicinizi güncellemeniz yeterlidir ve eski kodunuz yeni talimatları kolayca kullanabilir.

Bir sonraki CPU'nun iki kat fazla kaydı varsa ne olur?

Bu sorunun tersi şöyle olacaktır: Derleyiciler hangi işlevleri sağlar?

ASM'nizi gcc -O3olabildiğince daha iyi bir şekilde optimize edebileceğiniz / isteyeceğiniz / şüphelendiğinizden şüpheliyim .


10
gcc optimizasyonda o kadar da iyi değil, ortalama bir insandan çok daha iyi, ancak optimizatörlerin iyi bir iş yapamadığı birçok yer var. Aksi halde sizinle aynı fikirde.
old_timer

4
@dwelch gcc (veya diğer birçok derleyici) derlenmiş C'yi uygun şekilde optimize edemez.
cortijon

@ Ben S: Başlangıçta "çok" yerine "çok" olarak düzenledim çünkü "çok" yalnızca tekil nesneler için kullanılıyor. "Çok" nesnesi çoğul (geliştiriciler) olduğundan, "çok" doğru seçenektir. Ama istediğin şey "çok" ise cevabını tekrar düzenlemeyeceğim.
Billy ONeal

1
Bir derleyicinin iyi optimize edemediği birçok durum vardır, ancak çoğu zaman optimize edicinin sınırlamalarının farkında olan bir geliştirici, C kodunu montaja başvurmadan optimize edebilir.
Qwertie

1
Günlük işimde FWIW ürünümüzü gcc -g -O0 ile derliyorum, çünkü canlı bir sisteme gdb'yi ekleyebilmek ve varlığından optimize edilen değişkenler nedeniyle çıldırmamak, çok daha fazla cehenneme değer Şirket, her gün 4 milyar CPU döngüsünü daha boşta bırakacaktır (toplam 3 trilyondan). Çarpıcı tamsayılar çok sıkışık bir engel değil.
Bernd Jendrissek

1930

Hell®, ben bir derleyiciyim.

Bu cümleyi okurken binlerce satır kod taradım. Yıllarca harcayacağınız çok sayıda akademik araştırmaya dayanan yüzlerce farklı optimizasyon tekniğini kullanarak tek bir satırınızı optimize etme milyonlarca olasılığına göz attım. Üç satırlık bir döngüyü sadece daha hızlı hale getirmek için binlerce talimata dönüştürdüğümde utanç duymayacağım, hafif bir rahatsızlık bile hissetmeyeceğim. Optimizasyonun büyük uzunluklarına gitmek ya da en pis numaralar yapmaktan utanmam. Ve benden istemiyorsan, belki bir iki günlüğüne, davranacağım ve istediğin gibi yapacağım. Kodunuzun tek bir satırını bile değiştirmeden istediğim zaman kullandığım yöntemleri dönüştürebilirim. Kodunuzun montajda nasıl görüneceğini bile gösterebilirim, farklı işlemci mimarileri ve farklı işletim sistemlerinde ve isterseniz farklı montaj kurallarında. Evet, saniyeler içinde. Çünkü biliyorsunuz, yapabilirim; ve bilirsin, yapamazsın.

PS Oh, bu arada yazdığınız kodun yarısını kullanmıyordunuz. Sana bir iyilik yaptım ve fırlattım.


99

6502, Z80, 6809 ve 8086 yongaları için montaj yükleri yazdım. Konuştuğum platformlar için C derleyicileri kullanılabilir olur olmaz bunu hemen bıraktım ve hemen en az 10 kat daha üretken hale geldi. Çoğu iyi programcı rasyonel nedenlerle kullandıkları araçları kullanır.


72

Montaj dilinde programlamayı seviyorum, ancak yüksek düzeyde bir dil ile aynı şeyi yapmak için daha fazla kod gerekiyor ve kod satırları ve hatalar arasında doğrudan bir ilişki var. (Bu, onlarca yıl önce Efsanevi Adam Ayında açıklanmıştır .)

C'yi 'üst düzey montaj' olarak düşünmek mümkündür, ancak bunun üzerinde birkaç adım atın ve farklı bir dünyadasınız. C # 'da bunu yazma hakkında iki kez düşünmüyorsunuz:

foreach (string s in listOfStrings) { /* do stuff */ }

Bu düzinelerce, belki de montajda yüzlerce satır kod olacaktı, onu uygulayan her programcı farklı bir yaklaşım alacaktı ve bir sonraki kişi bunu çözecekti. Dolayısıyla, programların esas olarak diğer insanların okuması için yazıldığına inanıyorsanız (montajlar), derleme tipik HLL'den daha az okunabilir.

Düzenleme: Ortak görevler için kullanılan kişisel bir kod kütüphanesi ve C benzeri kontrol yapılarını uygulamak için makrolar birikmiş. Ama GUI'lerin norm haline geldiği 90'lı yıllarda duvara çarptım. Rutin şeyler için çok fazla zaman harcanıyordu.

ASM'nin gerekli olduğu son görev birkaç yıl önce kötü amaçlı yazılımlarla mücadele için kod yazmaktı. Kullanıcı arayüzü yok, bu yüzden şişmeden tüm eğlenceli parçalardı.


Bundan emin misin? Kod Tamamlandı okuma hatırlıyorum bu durum böyle değildi ...
jcolebrand

1
'Daha az satır' avantajının 'erken optimizasyon' dezavantajı tarafından yenildiği bir nokta olduğuna eminim. Ama Code Complete çağında
bakmadım

6
Montaj için bir argüman olarak "erken optimizasyon" kullanmak için biraz ironik ... (Muhtemelen olsa yanlış yorumluyorum. Hala komik olduğunu düşünüyorum.)
Bernd Jendrissek

Montajcıda hala işlevi çağırabilirsiniz, bu yüzden bir foreach-döngüsünün düzinelerce ila yüzlerce satır aldığından şüpheliyim. Ya da neyi özlüyorum?
Sebastian Mach

@phresnel: foreachbundan çok daha fazla iş yapar for- türe özgü bir yineleyici başlatır ve kullanır.
egrunin

15

Diğer insanların okunabilirlik, sürdürülebilirlik, daha kısa kod ve dolayısıyla daha az hata ve daha kolay cevaplarına ek olarak, ek bir neden ekleyeceğim:

program hızı.

Evet, montajda, kodunuzu her son döngüden yararlanmak ve fiziksel olarak olabildiğince hızlı hale getirmek için elle ayarlayabilirsiniz. Ancak kimin vakti var? Tamamen aptal olmayan bir C programı yazarsanız, derleyici sizin için optimizasyon yapmak için gerçekten iyi bir iş çıkarır. Muhtemelen herhangi bir şeyi takip etmek konusunda endişelenmenize gerek kalmadan elle yapacağınız optimizasyonların en az% 95'ini yapmak. Burada kesinlikle 90/10 türü bir kural var, burada optimizasyonların son% 5'i zamanınızın% 95'ini alacak. Ne gereği var?


4
+1. Montajcı kodu yazmak ve hızlı montajcı kodu yazmak iki farklı şeydir. İyi bir derleyici kullanırsanız, hızlı montajcı kodunu ücretsiz olarak alırsınız.
Niki

hızlı derleyici kodunu sadece derleyiciyi nasıl kullanacağınızı biliyorsanız, çoğu optimizasyonu kullanmazsanız, çoğu insan hata ayıklama seçenekleriyle derler ve sonuç olarak kötü yapılmış yavaş montajcı ile sonuçlanır. Evet, dokunmamanız gereken zamanın% 99'undan fazlası, derleyici düğmelerine dokunun ve çıkışı doğrudan ayarlamayın.
old_timer

optimizasyonları önemsiyorsanız, bunu derleyiciden yapmalısınız ... Optimizasyonları umursamıyorsanız, ancak hala montaj kullanıyorsanız, o zaman aptalsınız demektir.
Brian Postow

@dwelch: Sanırım araçların nasıl kullanıldığını bulmak için uğraşmayan bazı senaryolar var. Ama onlar gibi insanların hızlı montajcı kodu yazabileceklerinden şüpheliyim.
Niki

13

Ortalama bir üretim programı 100 bin satırlık kod söylüyorsa ve her satır yaklaşık 8-12 montajcı talimatı ise, bu 1 milyon montajcı talimatı olacaktır.

Tüm bunları elle iyi bir hızda yazabilseniz bile (unutmayın, yazmanız gereken 8 kat daha fazla kod), bazı işlevleri değiştirmek isterseniz ne olur? Bu 1 milyon talimatdan birkaç hafta önce yazdığınız bir şeyi anlamak bir kabus! Modül yok, sınıf yok, nesne odaklı tasarım yok, çerçeve yok, hiçbir şey yok. Ve en basit şeyler için bile yazmanız gereken benzer görünümlü kod miktarı en iyi ürkütücüdür.

Ayrıca, kodunuzu neredeyse üst düzey bir dil kadar optimize edemezsiniz. Örneğin C'nin sadece kodunuzu değil amacınızı tanımladığınız için çılgınca optimizasyon gerçekleştirdiği durumlarda , yalnızca kod yazacağınız montajcıda, montajcı kodunuzda gerçekten değerli bir optimizasyon gerçekleştiremez. Yazdıklarınız, elde ettiğiniz ve bana güvendiğiniz, yazarken yama ve yama yaptığınız 1 milyon talimatı güvenilir bir şekilde optimize edemezsiniz.


8

"Eski günlerde" çok fazla derleme yazıyorum ve yüksek düzeyde bir dilde programlar yazarken çok daha üretken olduğumu garanti edebilirim.


8
"Meclis Latince".
Adriano Varoli Piazza

4
@Adriano: çok, çok farklı lehçeler hariç ve hiçbiri birbirine benzemiyor.
Joachim Sauer

1
Elbette, ama herhangi birinde programlamayı öğrenmenin, size daha yüksek seviyelerde yardımcı olan bir makinenin mimarisi hakkında bir fikir verdiğini kastetmiştim. Disk belleği ile uğraşmazsanız, bu durumda yaralanmış olursunuz. Catullus'tan Carmen 16'yı okumak gibi.
Adriano Varoli Piazza

5
@ Adriano "montaj latin", hiçbir asm mağara adamı homurdanıyor. Geyik için kaya için 2 grunt, ateş için 3 grunt - basit şeyler için iyi ama bir imparatorluğu çalıştırmak zor.
Martin Beckett

1
@Martin: Hiç Romen rakamlarıyla karmaşık aritmetik yapmaya çalıştınız mı?
Adriano Varoli Piazza

6

Makul düzeyde bir montajcı yeterliliği yararlı bir beceridir, özellikle de herhangi bir sistem düzeyinde veya gömülü programlamada çalışıyorsanız, o kadar çok montajcı yazmak zorunda olduğunuz için değil, çünkü bazen kutunun gerçekten ne yaptığını anlamak önemlidir. . Montajcı kavramları ve sorunları hakkında düşük düzeyde bir anlayışa sahip değilseniz, bu çok zor olabilir.

Ancak, aslında montajcıda çok kod yazarken, çok fazla yapılmaması için birkaç neden vardır.

  • Sadece (neredeyse) ihtiyaç yoktur. Çok erken sistem başlatma ve belki de C fonksiyonlarında veya makrolarında gizlenmiş birkaç montajcı parçası gibi bir şey dışında, bir zamanlar montajcıda yazılmış olabilecek çok düşük seviyeli kodlar zorlanmadan C veya C ++ ile yazılabilir.

  • Daha üst düzey dillerdeki kod (C ve C ++ bile) işlevselliği çok daha az satıra yoğunlaştırır ve hata sayısının kaynak kodu satır sayısıyla ilişkili olduğunu gösteren önemli araştırmalar vardır. Yani, aynı sorun, montajcı ve C'de çözüldü, montajcıda daha uzun hatalara sahip olacak, çünkü daha uzun. Aynı argüman Perl, Python gibi daha üst düzey dillere geçişi motive eder.

  • Montajcıda yazarken, ayrıntılı bellek düzeni, talimat seçimi, algoritma seçenekleri, yığın yönetimi, vb. Gibi sorunun her yönüyle uğraşmanız gerekir. Daha yüksek seviyeli diller tüm bunları sizden alır, bu yüzden çok daha yoğun LOC şartları.

Esasen, yukarıdakilerin tümü, montajcıda C veya başka bir dile karşı kullanabileceğiniz soyutlama düzeyiyle ilgilidir. Assembler, sizi kendi soyutlamalarınızı yapmaya ve onları C gibi herhangi bir orta seviye dilin ve özellikle daha üst düzey dillerin kutudan çıktığı soyutlamaların yanı sıra kendi öz disiplininiz aracılığıyla sürdürmeye zorlar. nispeten kolayca yenilerini oluşturma yeteneği.


6

Zamanının çoğunu gömülü programlama dünyasında geçiren bir geliştirici olarak, derlemenin ölü / eski bir dilden çok uzak olduğunu iddia ediyorum. Bazen daha üst düzey bir dilde doğru veya verimli olarak ifade edilemeyen metale yakın belirli bir kodlama seviyesi (örneğin, sürücülerde) vardır. Hemen hemen tüm donanım arayüzü rutinlerini montajcıya yazıyoruz.

Bununla birlikte, bu montaj kodu, C kodundan çağrılabilecek ve bir kütüphane gibi işlenecek şekilde sarılmıştır. Birçok nedenden dolayı programın tamamını mecliste yazmıyoruz. İlk ve en önemlisi taşınabilirliktir; kod tabanımız farklı mimariler kullanan birçok üründe kullanılmaktadır ve aralarında paylaşılabilecek kod miktarını en üst düzeye çıkarmak istiyoruz. İkincisi, geliştirici aşinalıktır. Basitçe söylemek gerekirse, okullar eskiden olduğu gibi montaj öğretmiyor ve geliştiricilerimiz C'de montajdan çok daha üretken. Ayrıca, C dilimiz için montaj dili kodu için mevcut olmayan çok çeşitli "ekstralar" (kütüphaneler, hata ayıklayıcılar, statik analiz araçları vb.) Mevcuttur. Saf bir montaj programı yazmak istesek bile, birkaç kritik donanım kütüphanesi sadece C kütüphanesi olarak mevcut olduğu için bunu yapamayız. Bir anlamda tavuk / yumurta problemi. İnsanlar derleme işleminden uzaklaştırılıyor çünkü kütüphane ve geliştirme / hata ayıklama araçları mevcut değil, ancak kütüphaneler / araçlar mevcut değil çünkü yeterli sayıda insan onları oluşturma çabasını garanti etmek için meclisi kullanmıyor.

Sonunda, hemen hemen her dil için bir zaman ve bir yer var. İnsanlar en tanıdık ve üretken olduklarını kullanırlar. Muhtemelen bir programcının montaj repertuarında her zaman bir yer olacaktır, ancak çoğu programcı, kodları çok daha kısa sürede neredeyse daha verimli olan daha üst düzey bir dilde yazabileceklerini görecektir.


6

Montajda yazarken, sadece komut kodlarında yazmak zorunda değilsiniz. Programları daha modüler, daha sürdürülebilir ve okunması daha kolay hale getirmek için çeşitli soyutlamalar yapmak için makroları ve prosedürleri ve kendi kurallarınızı kullanabilirsiniz.

Yani temel olarak söylediğiniz şey, sofistike bir montajcının yetenekli kullanımı ile, ASM kodunuzu C'ye (veya yine de kendi buluşunuzun düşük-ish seviyesi başka bir dilini) daha da yakınlaştırabilirsiniz. C programcısı kadar verimli.

sorunuza cevap veriyor mu? ;-)

Bunu boşta demiyorum: Tam olarak böyle bir montajcı ve sistem kullanarak programladım. Daha da iyisi, montajcı sanal bir işlemciyi hedefleyebilir ve ayrı bir çevirmen, bir hedef platform için montajcının çıktısını derledi. LLVM'nin IF'sinde olduğu gibi, ancak ilk formlarında yaklaşık 10 yıl öncesine tarihleniyor. Dolayısıyla, taşınabilirlik ve verimlilik için gerektiğinde belirli bir hedef birleştirici için rutin yazma yeteneği vardı.

Bu birleştiriciyi kullanarak yazmak yaklaşık C kadar verimliydi ve GCC-3 ile karşılaştırıldığım zaman (dahil olduğum zamana kadar), birleştirici / çevirmen kabaca hızlı ve genellikle daha küçük olan kod üretti. Büyüklüğü gerçekten önemliydi ve şirketin birkaç programcısı vardı ve yeni işe alımlara faydalı bir şey yapmadan önce yeni bir dil öğretmeye istekliydi. Ve montajcıyı bilmeyen insanların (örneğin müşteriler) C'yi yazıp aynı sanal işlemci için, aynı çağrı kuralını vb. Kullanarak derleyebilmelerini sağladık, böylece düzgün bir şekilde arayüz oluşturdu. Bu yüzden marjinal bir kazanç gibi geldi.

Montajcı teknolojisini, kütüphaneleri vb.Geliştiren torbada çok uzun yıllar çalışıyordu. Kuşkusuz ki çoğu taşınabilir hale geldi, sadece bir mimariyi hedeflemiş olsaydı, şarkı söyleyen tüm dans eden montajcı çok daha kolay olurdu.

Özetle: C'yi sevmeyebilirsiniz, ancak C'yi kullanma çabasının daha iyi bir şey bulma çabasından daha büyük olduğu anlamına gelmez.


5

Montaj farklı mikroişlemciler arasında taşınabilir değildir.


Modern işlemciler ve montajcı programları için bu tam olarak doğru değildir, tıpkı C'de olduğu gibi farklı işlemcileri hedefleyebilirsiniz. Elbette bu durumda talimatların tamamını kullanamayacaksınız, ancak daha sonra yazarsanız da yapamazsınız. Taşınabilirlik birincil endişe değildir.
Blindy

6
Belki mimariyi kastediyorsunuzdur .
Ben S

2
@Blindy - x86 ailesi içinde farklı işlemcileri hedefleyebilirsiniz, ancak montaj talimatlarında x86 varyantı ile ARM işlemcisi veya Z80 veya 8051 arasında kesinlikle bir ortaklık yoktur.
semaj

Doğru, ama o zaman c'de z80 programlayamazsınız. Sanırım hepimiz burada normal x86 / x64 işlemcilerden bahsediyoruz.
Blindy

1
Bütün dünya x86 değildir. "Farklı mikroişlemciler" hakkında hiçbir şey hepsinin aynı komut setini yürüttüğünü göstermez.
Bernd Jendrissek

5

Aynı sebeple artık dışarıdaki tuvalete gitmiyoruz ya da neden Latince ya da Aramice konuşmuyoruz.

Teknoloji ortaya çıkıyor ve işleri daha kolay ve daha erişilebilir hale getiriyor.

EDIT - İnsanları rahatsız etmek için bazı kelimeleri kaldırdım.


4
Hala Luddites'i şu kelimeyle rahatsız ediyorsunuzTechnology
SeanJA

1
"Biz" Latince konuşmuyor muyuz?
dank

Ne Latince ne de Aramice ortadan kalkmadı çünkü daha iyi teknoloji ile değiştirildi (yani daha kolay bir dil öğrenmesi / alması). Aslında, Latin hala Avrupa'nın her yerinde bizimle birlikte. Tüm Roma dilleri Latince tabanlıdır. Modern (neo) Aramice bugün neredeyse yarım milyon kişi tarafından konuşuluyor. Bu dillerin artık yaygın olmamasının nedenleri teknolojik değil tarihseldir (jeopolitik, daha kesin olmak gerekirse). Aynı neden İngilizce, çağımızın bilim ve yönetici sınıflarının lingua franca'sıdır - son imparatorluğun insanları, İngilizler (ve şimdi ABD'li Amerikalılar) bunu konuşur.
Ritz

4

Neden? Basit.

Bunu karşılaştırın:

        for (var i = 1; i <= 100; i++)
        {
            if (i % 3 == 0)
                Console.Write("Fizz");
            if (i % 5 == 0)
                Console.Write("Buzz");
            if (i % 3 != 0 && i % 5 != 0)
                Console.Write(i);
            Console.WriteLine();
        }

ile

.locals init (
    [0] int32 i)
L_0000: ldc.i4.1 
L_0001: stloc.0 
L_0002: br.s L_003b
L_0004: ldloc.0 
L_0005: ldc.i4.3 
L_0006: rem 
L_0007: brtrue.s L_0013
L_0009: ldstr "Fizz"
L_000e: call void [mscorlib]System.Console::Write(string)
L_0013: ldloc.0 
L_0014: ldc.i4.5 
L_0015: rem 
L_0016: brtrue.s L_0022
L_0018: ldstr "Buzz"
L_001d: call void [mscorlib]System.Console::Write(string)
L_0022: ldloc.0 
L_0023: ldc.i4.3 
L_0024: rem 
L_0025: brfalse.s L_0032
L_0027: ldloc.0 
L_0028: ldc.i4.5 
L_0029: rem 
L_002a: brfalse.s L_0032
L_002c: ldloc.0 
L_002d: call void [mscorlib]System.Console::Write(int32)
L_0032: call void [mscorlib]System.Console::WriteLine()
L_0037: ldloc.0 
L_0038: ldc.i4.1 
L_0039: add 
L_003a: stloc.0 
L_003b: ldloc.0 
L_003c: ldc.i4.s 100
L_003e: ble.s L_0004
L_0040: ret 

Bunlar aynı özellik bakımından. İkincisi bile montajcı değil. NET IL (Aracı Dil, Java bayt koduna benzer). İkinci derleme IL'yi doğal koda (yani neredeyse birleştirici) dönüştürerek daha da şifreli yapar.


3

Ben x86 (_64) bile ASM bir derleyici için optimize etmek zor olan talimatları kullanarak çok kazandığınız durumlarda mantıklı olurdu. Örneğin x264 kodlaması için çok fazla alan kullanır ve hız kazançları çok büyüktür.


2

Eminim birçok neden vardır, ama düşünebileceğim iki hızlı neden

  1. Montaj kodunun okunması kesinlikle daha zor
  2. Bir ürün üzerinde çalışan büyük bir geliştirici ekibiniz olduğunda, kodunuzun mantıksal bloklara bölünmesi ve arabirimler tarafından korunması yararlı olur.

1
Montajı mantıksal bloklara da ayırabileceğinizi unutmayın.
Paul Williams

2

İlk keşiflerden biri (bunu 1960'lı yılların deneyiminden kaynaklanan Brooks'un Efsanevi Adam Ayında bulacaksınız ), insanların bir dilde, her gün hata ayıklanmış kod satırlarında az çok üretken olmalarıydı. Bu açıkça evrensel olarak doğru değildir ve çok ileri itildiğinde kırılabilir, ancak genellikle Brooks'un zamanının üst düzey dilleri için doğruydu.

Bu nedenle, üretkenliği elde etmenin en hızlı yolu, tek bir kod satırının daha fazlasını yaptığı dilleri kullanmak ve aslında bu en azından FORTRAN ve COBOL gibi karmaşıklık dilleri için veya daha modern bir örnek C vermek olacaktır.


2

Taşınabilirlik her zaman bir sorundur - şimdi değilse, en azından sonunda. Programlama endüstrisi her yıl milyarlarca dolar harcadığı eski yazılımı taşımak için harcıyor.


2
"Başka bir mimariye yönelmek zorunda kalmayacak" gibi görünüyor kulaklarıma çok "Kulağa iki basamaktan fazla ihtiyaç duymayacak."
David Thornley

Ya da Windows önümüzdeki yıl olmayabilir çünkü C # kullanamazsınız?
Martin Beckett

Örneğin Apple'ın Motorola MC68000 serisi işlemcileri, PowerPC (IBM ve tümü) ve şimdi Intel'in x86 (IA-32 (e)) işlemcilerini temel alan MacIntosh bilgisayarları. Bu yüzden evet, taşınabilirlik yeterince uzun süre kullanılan herhangi bir sistem için bir sorundur ve kodları beklenenden daha uzun süren ısırılmamış herhangi bir programcı henüz deneyimlenmemiştir.
mctylr

@Martin: Yirmi yıl sonra, insanların çalıştırmak istediği birçok C # programı olacak ve bu yüzden C # programlarını derlemenin ve çalıştırmanın bir yolu olacak. C # hakkında doğal olarak sabitlenmiş bir şey yok, ancak yirmi yıl içinde hala olduğu kadar popüler olsaydı şaşırırdım. Ancak, yirmi yıl içinde CPU'larımız önemli ölçüde farklı olacaktır. 1990'da yazılmış bir montaj programı günümüzde iyi çalışabilir, ancak en uygun olmayacağından emin olun ve derlenmiş C'den daha yavaş çalışacaktır.
David Thornley

Demek istediğim bu - çok daha fazla bağlantı sorunum var, çünkü üst düzey bir çerçeve 6 ay önce benden daha değişti çünkü bir x86'daki talimatlar değişti - özellikle el kodlu asm en basit yöntemlere bağlı kalma eğiliminde olduğundan.
Martin Beckett

2

Derleme daha az yaygın hale geldikçe kısır bir döngü vardı: daha üst düzey diller olgunlaştıkça, derleme dili yönerge setleri programcının rahatlığı için daha az ve derleyicilerin rahatlığı için daha fazla inşa edildi.

Dolayısıyla, gerçekçi olarak, hangi kayıtları kullanmanız gerektiği veya hangi talimatların biraz daha verimli olduğu konusunda doğru kararlar vermek çok zor olabilir. Derleyiciler, hangi dengesinin en iyi getiriyi elde edeceğini anlamak için buluşsal yöntemler kullanabilir. Muhtemelen daha küçük problemleri düşünebilir ve şu anda oldukça sofistike derleyicilerimizi yenebilecek yerel optimizasyonlar bulabiliriz, ancak olasılıklar, ortalama bir durumda, iyi bir derleyicinin ilk denemede muhtemelen iyi bir programcıya göre daha iyi bir iş yapacağıdır. Sonunda, John Henry gibi, makineyi yenebiliriz, ama oraya vardığımızda kendimizi ciddi şekilde yakabiliriz.

Sorunlarımız artık oldukça farklı. 1986'da, birkaç yüz pikseli ekrana koymayı içeren küçük programlardan nasıl biraz daha hızlı yararlanacağımı anlamaya çalışıyordum; Animasyonun daha az sarsıntılı olmasını istedim. Montaj dili için adil bir durum. Şimdi ipotek için sözleşme dili ve hizmetçi politikası etrafındaki soyutlamaların nasıl temsil edileceğini anlamaya çalışıyorum ve iş dünyasının konuştuğu dile yakın görünen bir şey okumayı tercih ediyorum. LISP makrolarının aksine, Montaj makroları kurallar açısından çok fazla zorlamamaktadır, bu nedenle iyi bir montajcıda bir DSL'ye makul bir şekilde yakın bir şey elde edebilmenize rağmen, kazanan her türlü tuhaflığa eğilimli olacaktır. Ruby, Boo, Lisp, C # ve hatta F # ile aynı kodu yazarsam bana sorun çıkarmaz.

Sorunlarınız verimli montaj dilinde kolayca ifade edilebilirse, size daha fazla güç.


2

Diğerlerinin söylediklerinin çoğunu.

C'nin icat edilmesinden önceki eski güzel günlerde, sadece üst düzey diller COBOL ve FORTRAN gibi şeyler olduğunda, montajcıya başvurmadan yapılması mümkün olmayan birçok şey vardı. Tam esneklik elde etmenin, tüm cihazlara vb. Erişebilmenin tek yolu buydu. Ama sonra C icat edildi ve C'de montajda mümkün olan her şey mümkün oldu. C'de çok az montaj yazdım. sonra.

Bununla birlikte, yeni programcıların montajcıda yazmayı öğrenmelerinin çok yararlı bir egzersiz olduğunu düşünüyorum. Aslında çok fazla kullanacakları için değil, ama o zaman bilgisayarın içinde gerçekten neler olduğunu anladığınız için. Bitlerle, baytlarla ve kayıtlarla gerçekten ne olduğunu açıkça bilmeyen programcılardan çok sayıda programlama hatası ve verimsiz kod gördüm.


Evet, dikkat et. Yıllar önce IBM ana bilgisayarlarındaki Fortran Disk ve Tape I / O işe yaramazdı, bu yüzden 370 / Assembler'da kendi I / O rutinlerimizi yazdık ve Fortan IV kodundan çağırdık. Ve montaj kodu yazmak temel mimariyi gerçekten anlamamı sağladı. Birkaç yıldır hiçbir meclis kodu yazmadım ve birlikte çalıştığım tüm genç insanlar hiç yazmamışlardı - ama keşke yapsalardı, bu çok eğitici.
Simon Knights

2

Yaklaşık bir aydır mecliste programlama yapıyorum. Sık sık C'ye bir parça kod yazıyorum ve bana yardımcı olmak için derlemeye derliyorum. Belki de C derleyicisinin tam optimizasyon gücünü kullanmıyorum ama C asm kaynağımın gereksiz işlemler içerdiği anlaşılıyor. Bu yüzden, iyi bir montaj kodlayıcısından daha iyi performans gösteren iyi bir C derleyicisinin konuşmasının her zaman doğru olmadığını görmeye başlıyorum.

Her neyse, montaj programlarım çok hızlı. Ve montajı ne kadar çok kullanırsam kodumu yazmam o kadar az zaman alır çünkü gerçekten o kadar zor değil. Ayrıca okunabilirliği zayıf olan meclis hakkındaki yorum da doğru değildir. Programlarınızı doğru bir şekilde etiketlerseniz ve ek ayrıntılandırma gerektiğinde yorum yaparsanız, her şeyin ayarlanmış olması gerekir. Aslında, montaj, programcı için daha açıktır, çünkü işlemci seviyesinde neler olduğunu görüyorlar. Diğer programcılar hakkında bir fikrim yok ama benim için, bir tür kara kutuda olmaktan çok, neler olduğunu bilmek hoşuma gidiyor.

Bununla birlikte, derleyicilerin gerçek avantajı, bir derleyicinin desenleri ve ilişkileri anlayabilmesi ve daha sonra otomatik olarak kaynaktaki uygun yerlerde kodlayabilmesidir. Popüler bir örnek, derleyicinin işlev işaretleyicilerini en iyi şekilde eşleştirmesini gerektiren C ++ sanal işlevleridir. Ancak bir derleyici, derleyicinin yapıcısının yapmasına izin verdiği şeyi yapmakla sınırlıdır. Bu, programcıların bazen kodlarıyla tuhaf şeyler yapmaya başvurmak zorunda kalmasına yol açar, kodlama zamanı ekler, montajla önemsiz bir şekilde yapılabilirdi.

Şahsen ben pazarın yüksek seviyeli dilleri desteklediğini düşünüyorum. Eğer meclis dili bugün var olan tek dil olsaydı, programlanmaları yaklaşık% 70 daha az olurdu ve muhtemelen 90'lı yıllarda dünyamızın nerede olacağını kim bilebilirdi. Daha yüksek seviyeli diller daha geniş kitlelere hitap eder. Bu, dünyamızın gerekli altyapısını oluşturmak için daha yüksek bir programcı arzı sağlar. Çin ve Hindistan gibi gelişmekte olan ülkeler Java gibi dillerden büyük oranda faydalanmaktadır. Bu ülkeler BT altyapılarını hızla geliştirecek ve insanlar birbirleriyle daha bağlantılı olacaklar. Benim açımdan, üst düzey diller, üstün kod ürettikleri için değil, dünya pazarlarındaki talebi karşılamaya yardımcı oldukları için popülerdir.


Kara kutu şey için +1. Evet, siyah kutular kullanıyoruz ve onlara göz atmanın bir yolu yok (çok kolay). C # foreach gerçekten nasıl çalışır? Kim bilir. Microsoft, mükemmel olduğunu söyledi. O zaman olmalı.
ern0

Ayrıca, 'yüksek seviyeli bir dil' ile gerçek dünyada önemli olan başka şeyler de geldiğini unutmayın. C, standart kütüphaneler (matematik, string işleme, I / O vb.) İle birlikte gelir ve Java gibi ağır ağırlıklar, bağlantı, görüntü işleme, veri işleme, web geliştirme vb.Için bir sürü paket ve kütüphaneyle birlikte gelir. zamanınızı tek bir platformda yüksek performans gösteren 1 ayrıntılı göreve (böylece montaj kullanarak) odaklanmak için kullanmanın yanı sıra, aynı anda en az hata ile birden fazla platformda çalışan çok daha büyük bir görev elde etmek .
jbx

1

Şu anda comp org'de montaj öğreniyorum ve ilginç olsa da, yazmak da çok verimsiz. İşleri çalıştırmak için kafanızda çok daha fazla ayrıntı tutmanız gerekiyor ve aynı şeyleri yazmak daha yavaş . Örneğin, C ++ 'da döngü için basit bir 6 satır, 18 satır veya daha fazla montaja eşit olabilir.

Kişisel olarak, şeylerin donanım seviyesinde nasıl çalıştığını öğrenmek çok eğlenceli ve bilgi işlemin nasıl çalıştığı konusunda bana daha fazla takdir veriyor.


1

C'nin iyi bir makro birleştirici üzerinde sahip olduğu şey C dilidir. Tip denetimi. Döngü yapıları. Otomatik yığın yönetimi. (Neredeyse) otomatik değişken yönetimi. Montajcıdaki dinamik bellek teknikleri popoda büyük bir ağrıdır. Bağlantılı bir listenin düzgün bir şekilde yapılması C ya da daha iyisi için foo.insert () ile karşılaştırıldığında sağ korkutucu. Hata ayıklama - hata ayıklamanın daha kolay olduğu konusunda herhangi bir yarışma yoktur. HLL'ler orada eller kazanır.

Montajcımdaki kariyerimin neredeyse yarısını kodladım, bu da assmebler'da düşünmeyi çok kolaylaştırdı. C derleyicisinin ne yaptığını görmeme yardımcı oluyor, bu da C derleyicisinin verimli bir şekilde işleyebileceği kodu yazmama yardımcı oluyor. C ile yazılmış iyi düşünülmüş bir rutin, montajcıda küçük bir çalışma ile tam olarak ne istediğinizi çıktılamak için yazılabilir - ve taşınabilir! Çapraz platform nedenleriyle birkaç eski asm rutini tekrar C'ye yazmak zorunda kaldım ve eğlenceli değil.

Hayır, C'ye bağlı kalacağım ve HLL ile kazandığım üretkenlik zamanına karşı performansta zaman zaman hafif bir yavaşlama ile ilgileneceğim.


1

Sadece kişisel olarak mecliste programları daha sık yazmamaya cevap verebilirim ve asıl nedeni bunun daha sıkıcı olması. Ayrıca, hemen fark etmeden işlerin yanlış anlaşılmasının daha kolay olduğunu düşünüyorum . Örneğin, bir kaydı bir rutinde kullanma şeklinizi değiştirebilir, ancak bunu tek bir yerde değiştirmeyi unutabilirsiniz. İyi bir araya gelecek ve daha sonraya kadar fark etmeyebilirsiniz.

Bununla birlikte, montaj için hala geçerli kullanımlar olduğunu düşünüyorum. Örneğin, SIMD kullanarak ve paranoyak "her bit kutsaldır" [alıntı V.Stob] yaklaşım takip büyük miktarda veri işleme için oldukça optimize edilmiş montaj rutinleri bir dizi var. (Ancak naif montaj uygulamalarının genellikle bir derleyicinin sizin için ürettiğinden çok daha kötü olduğunu unutmayın.)


1

C bir makro birleştiricidir! Ve bu en iyisi!

Montajın neredeyse her şeyi yapabilir, taşınabilir olabilir ve nadir durumlarda çoğu durumda gömülü montaj kodunu kullanabileceğiniz bir şey yapamaz. Bu, derlemede kesinlikle yazmanız gereken programların yalnızca küçük bir kısmını bırakır ve derlemeden başka bir şey bırakmaz.

Ve daha yüksek seviyeli soyutlamalar ve taşınabilirlik, çoğu insanın C'de sistem yazılımı yazmasını daha değerli hale getirir. Ve bir program yazmak için çok fazla zaman ve para yatırırsanız, şimdi taşınabilirliğe ihtiyacınız olmayabilir, ancak kendinizi sınırlamak istemeyebilirsiniz. gelecekte kullanabileceğiniz şeylerde.


1

İnsanlar başka bir yönün de olduğunu unutuyor gibi görünüyor.

İlk etapta neden Assembler'da yazıyorsunuz? Programı neden gerçekten düşük bir dilde yazmıyorsunuz?

Onun yerine

mov eax, 0x123
add eax, 0x456
push eax
call printInt

sen de yazabilirsin

B823010000
0556040000
50 
FF15.....

Bu çok fazla avantaja sahip, programınızın tam boyutunu biliyorsunuz, talimatların değerini diğer talimatlar için girdi olarak tekrar kullanabilirsiniz ve yazmak için bir montajcıya bile ihtiyacınız yok, herhangi bir metin editörü kullanabilirsiniz ...

Ve bu konuda hala Assembler'ı tercih etmenizin nedeni, diğer insanların C'yi tercih etmesinin nedeni ...


0

Çünkü her zaman böyle: zaman geçiyor ve iyi şeyler de geçiyor :(

Ancak asm kodunu yazdığınızda, daha az üretken olduğunu bildiğiniz halde, yüksek seviyeli dilleri kodladığınızdan tamamen farklı bir duygu. Sanki bir ressam gibisiniz: Kesinlikle hiçbir kısıtlama olmadan istediğiniz şekilde çizmekte özgürsünüz (sadece CPU özelliklerine göre) ... Bu yüzden seviyorum. Bu dilin kaybolması üzücü. Ama birileri hala hatırlıyor ve kodluyor olsa da, asla ölmeyecek!


Doğru. Öte yandan, kasiyer ve süpermarket çekinizi nakit para ödemeyi reddettiğinde, "Oh, DÜŞÜK SEVİYE dilinde programlıyorsunuz" diyerek yaşadığınız aşağılama vardır.
Jay

0

$$$

Bir şirket kodu $$$'e çevirmek için bir geliştirici işe alır. Daha hızlı olduğunu kullanışlı kod üretilebilir, daha hızlı şirket $$$ bu kodu açabilirsiniz.

Daha yüksek seviyeli diller genellikle daha fazla sayıda yararlı kodun yayılmasında daha iyidir. Bu, meclisin yeri olmadığı anlamına gelmez, çünkü başka hiçbir şeyin yapmayacağı zamanlar ve yerler vardır.


0

Montajı C'den daha yüksek bir dille, örneğin Java veya Python veya Ruby ile karşılaştırdığınızda HLL'lerin avantajı daha da fazladır. Örneğin, bu diller çöp toplama özelliğine sahiptir: bellek yığınını ne zaman boşaltacağınız konusunda endişelenmenize gerek yoktur ve çok erken boşaltma nedeniyle bellek sızıntısı veya hata yoktur.


0

Daha önce de belirtildiği gibi, herhangi bir aracın var olmasının nedeni, ne kadar verimli çalışabileceğidir. HLL'ler birçok asm kodu satırı ile aynı işleri başarabildiğinden, montajın diğer diller tarafından yerini alması doğaldır. Ve donanıma yakın işleyiş için - C ve dile göre diğer varyantlarda satır içi montaj var. Paul Carter PC Meclisi Dili diyor

"... bilgisayarların Pascal gibi programlama dillerinden daha düşük seviyede nasıl çalıştığını daha iyi anlamak. Bilgisayarların nasıl çalıştığını daha iyi anlayarak, okuyucu genellikle C gibi daha üst düzey dillerde çok daha üretken geliştirme yazılımı olabilir. ve C ++. Montaj dilinde programlamayı öğrenmek bu hedefe ulaşmak için mükemmel bir yoldur. "

Üniversite kurslarımda toplanma ile tanıştık. Kavramları temizlemeye yardımcı olacaktır. Ancak herhangi birimizin mecliste kodun% 90'ını yazacağından şüpheliyim. Derinlemesine montaj bilgisi bugün ne kadar alakalı?


-2

Bu cevapları çevirerek, yanıtlayanların 9/10'inin hiçbir zaman meclisle çalışmadığına bahse girerim.

Bu, çok sık ortaya çıkan eski bir sorudur ve aynı, çoğunlukla yanlış bilgilendirilmiş cevaplar alırsınız. Taşınabilirlik olmasaydı, yine de montajdaki her şeyi kendim yaparım. O zaman bile, C derlemesini neredeyse montajda yaptığım gibi kodlarım.


1
+1 deneyimi olmayan insanlardan bahsederken +1 ve "C de asm gibi kodlama" için başka bir +1 olmalıdır. Gömülü için C ++ (evet, CPP değil C) uygulamaları yazarken, asm gibi kodluyorum, örneğin yeni / malloc () kullanmıyorum.
ern0

Yani char buf [MAX_PATH] gibi bir sürü şey kullanıyorsunuz. ;)
paulm

1
@paulm - Yani C'nin yaptığı gibi mi?
Rob

1
Umarım montajcı yazarları malloc () kullanımından kaçınmazlar. Evet, gömülü olarak bellek kısıtlamalısınız. Ancak bunu Unix veya başka bir masaüstünde (hatta çoğu mobil işletim sisteminde) yapın ve kendinizi ve kullanıcılarınızı gereksiz yere kısıtlıyorsunuz. Ayrıca: Ne kadar az LOC yazarsanız, hata olasılığı o kadar düşük olur, bu da daha yüksek seviyeli kodun daha düşük hatalara sahip olması anlamına gelir.
uliwitness

1
Sadece baktım çünkü şüpheliydim ve evet, elbette reddörleri ve HNers'ın burada olduğunu söyleyebilirim.
Rob
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.