Düşük seviyeli programlamada şifreli kısa tanımlayıcılar neden hala bu kadar yaygın?


64

Orada kullanılan çok / talimat tutmak için iyi nedenler kısa adları. Bu nedenler artık geçerli değil, ancak kısa şifreli isimler düşük seviyeli programlamada hala çok yaygın.

Bu neden? Eski alışkanlıkların kırılması zor olduğu için mi yoksa daha iyi sebepler mi var?

Örneğin:

  • Atmel ATMEGA32U2 (2010?): TIFR1( Yerine TimerCounter1InterruptFlag), ICR1H(yerine InputCapture1High), DDRB(yerine DataDirectionPortB), vb.
  • .NET CLR komut seti (2002): bge.s(yerine branch-if-greater-or-equal.short) vb.

Uzun, şifreli olmayan isimlerle çalışmak daha kolay değil mi?


Cevap verirken ve oy verirken, lütfen aşağıdakileri göz önünde bulundurun. Burada önerilen olası açıklamaların birçoğu, yüksek seviyeli programlama için aynı derecede geçerlidir ve yine de fikir birliği, bir veya iki kelimeden oluşan şifreli olmayan isimler kullanmaktır (genel olarak hariç tutulan kısaltmalar).

Ayrıca, ana argümanınız bir kağıt diyagramdaki fiziksel alanla ilgiliyse , lütfen bunun kesinlikle meclis dili veya CIL için geçerli olmadığını göz önünde bulundurun; . Fabless yarı iletken bir şirketteki kişisel deneyimden, okunabilir adlar gayet iyi ve daha okunaklı diyagramlarla sonuçlanır.

Düşük seviyeli programlama ile ilgili farklı olan temel şey nedir? Yüksek seviyeli dillerin aksine , kısa kripti isimlerini düşük seviyeli fakat istenmeyen şekilde programlamada istenen kılan özellik nedir?


82
Cevap: Düşük seviyeli bir dilde programlama yaptığınızı hissetmek için.
Thomas Eding

5
Kriptik görecelidir. JSRtemsil ettiği opcode'dan üç kat daha uzundur ( $206502'de) ve bir bakışta anlaşılması oldukça kolaydır.
Blrfl

4
Biraz hayal kırıklığına uğradım, çünkü doğru cevap orada, ama kesinlikle kabul edilmedi. Devre şemaları ve bu kesintiler genellikle ilişkilendirildikleri hatlardan sonra adlandırılır ve ayrıntılı istememek istediğiniz bir devre şemasında iyi bir uygulama veya pratik değildir. İkincisi, cevapları beğenmediğiniz için doğru olmadıkları anlamına gelmez.
Jeff Langemeier,

4
@gnat: Deneyin set Accumulator32 to BaseIndex32? Geleneksel kısaltmaları basitçe genişletmek, daha okunaklı bir şey yapmanın tek yolu değildir.
Timwi

1
"Ana argümanınız bir kağıt diyagramdaki fiziksel alanla ilgiliyse", hayır, iyi adlandırmaların adın açıklığından başka şeyleri de dikkate alması gerçeğiyle ilgili değil (cevabımda bazılarını verdim, diyagramları çizdim) Bir karatahta - bunlardan sadece bir tanesidir) ve bu açıklık göreceli bir şeydir (aşinalık örneğin seçim ne olursa olsun netliğe yardımcı olma eğilimindedir).
AProgrammer

Yanıtlar:


106

Yazılımın bu adları kullanmasının nedeni, veri sayfalarının bu adları kullanmasıdır. Zaten bu seviyedeki kodun veri sayfası olmadan anlaşılması çok zor olduğu için, arama yapamayacağınız değişken isimleri yapmak son derece yararsızdır.

Bu, veri sayfalarının neden kısa isimler kullandığı sorusunu gündeme getirmektedir. Bunun nedeni muhtemelen 25 karakterli tanımlayıcılara yeriniz olmadığı için isimleri bu gibi tablolarda sunmanız gerektiğidir:

Veri sayfasından TIFR1 tablosu

Ayrıca, şematik, pim diyagramları ve PCB serigrafi gibi şeyler genellikle alan için çok sıkışıktır.


7
Ayrıca, bu cevap gerçekten de saf yazılım tarafına hitap etmiyor, örneğin CLR, JVM, x86, vs. :)
Timwi

12
@romkyns: Bu veri sayfalarını okuduğunuzda neden bu kısa isimleri kullandıkları biraz daha açık. Elimde olan bir mikrodenetleyici için veri sayfaları , kısa isimleri kullanırken bile yaklaşık 500 sayfadır . Daha uzun isimler kullanıyorsak, tabloların genişliği birkaç sayfayı / ekranı kapsayacak ve referans olarak kullanılmaları çok elverişli olacaktır.
silico'da

27
@romkyns: Daha uzun adlar eşit olarak aranabilir, ancak bunlar "yerel" değildir. Gömülü mühendisleri dinlerseniz, aslında "zamanlayıcı sıfırın kesme bayrağı" değil "sıfır tiffer" derler. Web geliştiricilerinin HTTP, HTML veya JSON’u da kendi yöntem adlarında genişlettiğinden şüpheliyim.
TMN

6
@KarlBielefeldt er, ne? :) Belli ki kısa ismin yerine geçtikleri için mevcut veri sayfasında bulamayacağım. Bu, kısa isimlerin en hafif şekilde aranabilir olduğu iddiasını desteklemez ...
Roman Starkov

5
Sadece alan kısıtlaması olan veri sayfaları değil, şemalar. Tüm bu mantıksal bileşenlerin, diğer bileşenlere bağlanması gereken kablo uçları vardır. "TimerCounter1InteruptFlag.clear", neredeyse "TCIF.C" gibi minik bir tel gösteriminin üstüne de uymuyor
AShelly

60

Zipf Yasası

Bu metne bakarak, kelime uzunluğunun ve kullanım sıklığının genel olarak ters ilişkili olduğunu gözlemleyebilirsiniz. Gibi çok sık kullanılan kelimeler it, a, but, you, ve anddaha az sıklıkta kullanılan kelimeler gibi süre çok kısadır observe, comprehensionve verbositydaha uzun. Sıklık ve uzunluk arasındaki bu gözlenen ilişkiye Zipf Yasası denir .

Belirli bir mikroişlemci için verilen talimattaki talimatların sayısı genellikle düzinelerce veya yüzlercedir. Örneğin, Atmel AVR komut seti yüzlerce farklı talimat içeriyor gibi görünüyor (saymadım), fakat bunların çoğu ortak bir temadaki varyasyonlar ve çok benzer anımsatıcılara sahipler. Örneğin, çarpma talimatları arasında MUL, MULS, MULSU, FMUL, FMULS ve FMULSU bulunur. "BR" ile başlayan talimatların dallar, "LD" ile başlayan talimatların yükler, vs. olduğu genel fikrini almadan önce talimatlar listesine çok uzun süre bakmanız gerekmez. Aynı şey değişkenler için de geçerlidir: karmaşık işlemciler bile değerleri saklamak için yalnızca sınırlı sayıda yer sağlar: durum kayıtları, genel amaçlı kayıtlar, vb.

Çok az talimat olduğundan ve uzun isimlerin okunması daha uzun sürdüğü için, onlara kısa isimler verilmesi mantıklıdır. Buna karşılık, daha yüksek seviyedeki diller, programcıların çok sayıda işlev, yöntem, sınıf, değişken vb. Oluşturmasına izin verir. Bunların her biri çoğu montaj talimatından çok daha az kullanılacaktır ve daha uzun, daha açıklayıcı isimler, okuyuculara (ve yazarlara) ne olduklarını ve ne yaptıklarını anlamaları için yeterli bilgi vermek için giderek daha önemlidir.

Ek olarak, farklı işlemciler için komut setleri genellikle benzer işlemler için benzer adları kullanır. Komut kümelerinin çoğu ADD, MUL, SUB, LD, ST, BR, NOP işlemlerini içerir ve eğer bu kesin isimleri kullanmazlarsa genellikle çok yakın isimler kullanırlar. Bir talimat setinin hatırlatıcılarını öğrendikten sonra, diğer cihazların talimat setlerine adapte olmak uzun sürmez. Size "şifreli" görünebilir isimler gibi kelimeler gibi yaklaşık olarak tanıdık Yani and, orve notdüşük seviyeli programlama alanında uzman olan programcılar için. Montaj düzeyinde çalışan çoğu kişinin size kodu okumayı öğrenmenin düşük seviyeli programlamadaki en büyük zorluklardan biri olmadığını söyleyeceğini düşünüyorum.


2
teşekkürler Caleb! Bana göre, bu mükemmel cevap, bir şekilde tek bir başlıkta dört değer yargısı toplamayı başardığı bir soruyu kurtardı : "kriptik", "kısa", "hala", "çok yaygın"
gnat

1
Hem yorumunuz hem de cömert ikramiyeniz için teşekkür ederiz
Caleb

37

Genel olarak

Adlandırma kalitesi yalnızca tanımlayıcı adlara sahip olmakla ilgili değildir, aynı zamanda diğer hususları da göz önünde bulundurmalıdır ve bu da aşağıdaki gibi tavsiyelere yol açar:

  • kapsam ne kadar global olursa, ad o kadar açıklayıcı olmalıdır
  • ne kadar sık ​​kullanılırsa, isim o kadar kısa olmalıdır
  • Aynı ad, tüm bağlamlarda aynı şey için kullanılmalıdır.
  • bağlam farklı olsa bile farklı şeyler farklı adlara sahip olmalıdır
  • varyasyonlar kolayca tespit edilmelidir
  • ...

Bu önerilerin çelişkili olduğuna dikkat edin.

Öğretim hatırlatıcıları

Bir derleme dil programcısı olarak kullanan short-branch-if-greater-or-equaliçin bge.sbir Algol programcı, hesaplamalı geometri yapıyor gibi beni görünce daha aynı izlenimi verir SUBSTRACT THE-HORIZONTAL-COORDINATE-OF-THE-FIRST-POINT TO THE-HORIZONTAL-COORDINATE-OF-THE-SECOND-POINT GIVING THE-DIFFERENCES-OF-THE-COORDINATE-OF-THE-TWO-POINTSyerine dx := p2.x - p1.x. İlgilendiğim bağlamlarda ilkinin daha okunaklı olduğu konusunda hemfikirim.

Kayıt isimleri

Resmi adı belgelerden seçersiniz. Dokümantasyon, tasarımdan adı seçer. Tasarım, uzun isimlerin yeterli olmadığı ve tasarım ekibinin yıllarca olmasa da bu isimlerle aylarca yaşayacağı çok sayıda grafik formatı kullanır. Her iki sebepten dolayı, "İlk sayaç sayacının kesme bayrağını" kullanmayacaklar, konuşmalarıyla ve şemalarında kısaltmaları bekleniyor. Bunu biliyorlar ve TIFR1daha az karışıklık olması için sistematik kısaltmalar kullanıyorlar . Buradaki bir nokta, TIFR1rastgele bir kısaltma değil, bir adlandırma düzeninin sonucudur.


4
TIFR1Gerçekten olduğundan daha iyi bir isimlendirme şeması mı InterruptFlag1, yoksa IptFlag1gerçekten kısa olmak zorunda mısın?
Timwi

4
@Timwi, InterruptFlagve IptFlagdaha iyidir IFaynı şekilde ki EnumerableInterfaceve ItfcEnumerabledaha iyidir IEnumerable.
AProgrammer

@AProgrammer: Cevabınızı ve yorumunuzu en iyi değerlendiririm ve eğer yapabilirsem kabul edilmiş olarak işaretlerim. Sadece fiziksel sınırların kısa isimleri dikte ettiğine inananlar yanlış. Bu tartışma sizin için ilginç olacaktır: 37signals.com/svn/posts/…
alpav

5
@alpav Bağlantınızın, bu cevabın söylediklerinin tersini savunduğunu biliyor musunuz? Bir şey varsa InterruptFlag1, daha iyi netlik nedenleriyle tamamen desteklenir .
Roman Starkov

24

“Eski alışkanlıklar” nedenleri dışında, 30 yıl önce yazılmış ve halen kullanımda olan eski kod çok yaygındır. Daha az deneyimli kişilerin ne düşündüğüne rağmen, bu sistemleri yeniden güzelleştirmek, böylece güzel görünmeleri, küçük bir kazanç için çok yüksek bir maliyetle gelir ve ticari olarak uygulanabilir değildir.

Donanıma yakın ve kayıtlara erişen gömülü sistemler, Donanım veri sayfalarında kullanılan etiketlerle aynı veya benzer etiketleri, çok iyi nedenlerle kullanma eğilimindedir. Donanım veri sayfalarında kayıt XYZZY1 olarak adlandırılırsa, muhtemelen XYZZY1 olduğunu temsil eden Değişkeni veya programlayıcının iyi bir gün geçirdiğini varsayarsak RegXYZZY1 anlamına gelir.

Bu kadarıyla bge.s, assembler'a benzer - daha uzun isimleri bilmesi gereken az sayıda kişiye isimleri daha az okunabilir. Sizi başınızdan çıkaramazsanız bge.sve branch-if-greater-or-equal.shortbir fark yaratacağını düşünüyorsanız - sadece CLR ile oynuyorsunuz ve bilmiyorsunuz.

Kısa değişken isimleri görmenizin bir diğer nedeni de, yazılımın hedeflediği etki alanındaki kısaltmaların bize yayılmasıdır.

Özetle - endüstri normları ve donanım veri sayfaları gibi bir Dış etkiyi yansıtan kısa kısaltılmış değişken isimleri beklenmektedir. Yazılımın içinde bulunan kısa kısaltılmış değişken isimleri normal olarak daha az arzu edilir.


Eğer "bge.s" yi savunmak için kullandığınız argümanı anladıysam, bilmesi gerekenlere göre TIFR1daha okunaklı olur TimerCounter1InterruptFlagmu?
Roman Starkov

2
@romkyns: Kesinlikle - bu durumda daha az daha fazla .... "Sayaç", "Kontrol", "Güzergah İzleyemez", vb.
mattnz

“Eğer seni bge.s etrafında doyamazsan ve şube-eğer-daha büyük-ya da eşit.short'un bir fark yaratacağını düşünüyorsan - sadece CLR ile oynuyorsun ve bunu bilmiyorsun.” Bunu bilmiyorum. X86 montajını çok iyi anlıyorum, ancak ne zaman bir döngü yazsam, tüm j?talimatların ne anlama geldiğine bakmalıyım . Daha açık bir şekilde adlandırılmış bir talimatın olması kesinlikle bana yardımcı olacaktır. Ama belki kuraldan ziyade istisna benim. Önemsiz ayrıntıları hatırlamakta zorlanıyorum.
Cody Gray,

11

Burada çok farklı fikirler var. Ben gibi mevcut cevapları hiçbirini kabul edemez cevap: birincisi, bu katkı olasılıkla birçok faktör vardır, ve ikinci olarak, ben belki de en önemli biridir hangisinin bilemez.

Yani burada başkaları tarafından gönderilen cevapların bir özeti burada. Bunu CW olarak gönderiyorum ve niyetim sonunda kabul ettiğini işaretlemek. Lütfen bir şeyi kaçırdıysam düzenleyin. Her fikrini kesin ve net bir şekilde ifade etmek için yeniden ifade etmeye çalıştım.

Öyleyse, düşük seviyeli programlamada şifreli kısa tanımlayıcılar neden bu kadar yaygın?

  • Çünkü birçoğu, ilgili alanda çok kısa bir isim almak için yeterince yaygındır. Bu, öğrenme eğrisini daha da kötüleştirir, ancak kullanım sıklığı verilen değerli bir değişimdir.
  • Çünkü genellikle sabit olan küçük bir olasılıklar kümesi vardır (programlayıcı sete eklenemez).
  • Çünkü okunabilirlik alışkanlık ve pratik meselesidir. branch-if-greater-than-or-equal.shortolduğu başlangıçta daha okunabilir bge.s, ancak bazı uygulama ile durum tersine olur.
  • Çünkü çoğu zaman tam olarak elle yazılmış olmaları gerekir, çünkü düşük seviyeli diller genellikle iyi bir otomatik tamamlama özelliğine sahip güçlü IDE'lerle gelmez veya a / c güvenilir değildir.
  • Çünkü tanımlayıcıya çok fazla bilgi paketlenmesi istenir ve okunabilir bir isim üst düzey standartlarda bile kabul edilemez derecede uzun olacaktır.
  • Çünkü düşük seviyeli ortamlar tarihsel olarak böyle görünüyordu. Alışkanlığı ortadan kaldırmak bilinçli bir çaba gerektirir, eski yollardan hoşlananları rahatsız etme riski taşır ve buna değer olarak haklı gösterilmelidir. Belirlenen yolla sadık kalmak "varsayılan" dır.
  • Çünkü birçoğu şematik ve veri sayfaları gibi başka bir yerden kaynaklanıyor. Bunlar da uzay kısıtlamalarından etkilenir.
  • Çünkü bir şeyleri isimlendirmekten sorumlu insanlar okunabilirliği hiç düşünmemiş, hatta bir sorun yarattıklarını veya tembel olduklarını anlamadılar.
  • Çünkü bazı durumlarda isimler , meclis dilinin bazı derleyiciler tarafından ara temsil olarak kullanılması gibi verilerin değiş tokuşuna yönelik bir protokolün parçası haline gelmiştir .
  • Çünkü bu stil anında düşük seviye olarak tanınır ve bu nedenle ineklere iyi gelir.

Kişisel olarak, bunlardan bazılarının aslında yeni geliştirilen bir sistemin bu adlandırma stilini seçmesinin nedenlerine katkıda bulunmadığını hissediyorum, ancak bu tür cevaplarda bazı fikirleri filtrelemenin yanlış olacağını düşündüm.


10

Şapkamı bu pisliğe atacağım.

Yüksek seviyeli kodlama kuralları ve standartları, düşük seviyeli kodlama standartları ve uygulamalarıyla aynı değildir. Ne yazık ki, bunların çoğu eski kodlardan ve eski düşünce süreçlerinden gelenler.

Ancak bazıları bir amaca hizmet ediyor. Tabii BranchGreaterThan çok daha okunabilir daha olurdu BGT , ancak bir kongre bir talimat var ve bu şekilde bir standart olarak kullanılmak son 30 yılda çekiş bazı bit kazanmıştır, şimdi orada var. Neden onunla başladılar, muhtemelen talimatlar, değişkenler ve diğerleri için bazı keyfi karakter genişliği limitleri; neden tutuyorlar, bu bir standart. Bu standart bir tanımlayıcı olarak int kullanmakla aynıdır , her durumda Integer'ı kullanmak daha okunaklı olur , ancak birkaç haftadan daha fazla programlama yapanlar için gerekli ... hayır. Neden? Çünkü bu standart bir uygulamadır.

İkincisi, yorumumda dediğim gibi, kesintilerin birçoğu INTG1 ve diğer şifreli isimler olarak adlandırılıyor, bunlar da bir amaca hizmet ediyor. Devre şemalarında , hatlarınızı adlandırmak iyi bir kural değildir ve bu kadar ayrıntılı bir şekilde şemayı tutar ve okunaklılığa zarar verir. Tüm detaylar dokümantasyonda ele alınmaktadır. Ve tüm kablo / devre şemaları, kesme hatları için bu kısa isimlere sahip olduğu için, kesintilerin kendisi, gömülü tasarımcı için devre planlamasından program kodunu sonuna kadar tutarken aynı adı alır.

Bir tasarımcı bunun üzerinde bir kontrol sahibidir, ancak herhangi bir alan / yeni dil gibi, donanımdan donanıma kadar uzanan sözleşmeler de vardır ve bu nedenle her bir derleme dili arasında benzer kalması gerekir. Ben düzeneğinin pasajı bakıp bir kongre, sopa çünkü şimdiye kadar bu komut setini kullanmadan kod özünü elde edebilmek için LDA ya da ona bazı ilişki muhtemelen kayıt yükleniyor OG muhtemelen bir yere bir şey hareket ediyor başka bir yerde, ne düşündüğünüzle ilgili değil ya da yüksek düzeyde bir pratiktir, kendine özgü bir dildir ve kendi standartlarına sahiptir ve tasarımcının izlemesi gereken anlamına gelir, bunlar genellikle neredeyse hiç keyfi değildir. görünüyorlar.

Sizi bununla bırakacağım: Katıştırılmış topluluğa ayrıntılı yüksek seviye uygulamaları kullanmalarını istemek, kimyagerlerden her zaman kimyasal bileşikler yazmalarını istemek gibidir. Kimyager, kendileri için kısa yazarlar ve alandaki herhangi biri bunu anlayacaktır, ancak uyum sağlaması biraz zaman alabilir.


1
Bunu hissediyorsunuz "diye alt düzey programlama gibi hissettiren ne çünkü biz şifreli isimler kullanacağız" ve "o düşük seviyeli programlama için kongre çünkü biz şifreli isimler kullanacağız" hemen hemen aynıdır, bu nedenle 1 benden ve bunu başlangıçta kabul ettiğimden daha az inflamatuvar bir değişken olarak kabul etmeyi düşüneceğim .
Roman Starkov,

6
Kimyacılar için + 1, programlamanın farklı alanlarına iyi bir benzetme oluşturduğundan referansta bulunuyor.

4
1 Ben de çok daha okunabilir "DiHydrogenOxyde" varsa insanlar "su" gibi kısa, şifreli adları kullanmak neden hiç anlamadım
Ingo

6

Şifreli kısa tanımlayıcıları kullanmasının bir nedeni, geliştiriciler için şifreli olmadıklarıdır. Her gün onunla çalıştıklarını ve bu isimlerin gerçekten etki alanı isimleri olduğunu anlamalısınız. Böylece tam olarak TIFR1'in ne anlama geldiğini yürekten bilirler.

Eğer takıma yeni bir geliştirici gelirse, veri sayfalarını okumak zorunda kalacak (@KarlBielefeldt tarafından açıklandığı gibi) bu yüzden onlarla rahat olacaklar.

Sorunuzun kötü bir örnek kullandığına inanıyorum, çünkü bu tür kaynak kodlarında gerçekten etki alanı dışı şeyler için pek çok gereksiz kripto tanımlayıcısı görüyorsunuz.

Derleyiciler yazdığınız her şeyi otomatik olarak tamamlamadığında ortaya çıkan kötü alışkanlıklar nedeniyle bunu çoğunlukla yaparlar derdim.


5

özet

İlkçilik, birçok teknik ve teknik olmayan çevrede yaygın bir fenomendir. Bu nedenle düşük seviyeli programlama ile sınırlı değildir. Genel tartışma için, Kısaltma hakkındaki Wikipedia makalesine bakın . Cevabım düşük seviyeli programlamaya özgü.

Şifreli isimlerin nedenleri:

  1. Düşük seviyeli talimatlar kesin olarak yazılmıştır
  2. Düşük düzeyli bir talimatın adına çok fazla tür bilgi paketlemeniz gerekir
  3. Tarihsel olarak, tek karakterli kodlar tür bilgisini paketlemek için tercih edilir.

Çözümler ve sakıncaları:

  1. Tarihsel olanlardan daha tutarlı modern düşük seviyeli adlandırma şemaları var.
    • LLVM
  2. Bununla birlikte, birçok tür bilginin paketlenmesi ihtiyacı hala mevcuttur.
    • Böylece, şifreli kısaltmalar hala her yerde bulunabilir.
  3. İyileştirilmiş hattan okunabilirlik, acemi bir düşük seviye programcısının dili daha hızlı öğrenmesine yardımcı olacak, ancak büyük miktarda düşük düzey kodları anlamada yardımcı olmayacaktır.

Tam cevap

(A) Daha uzun isimler mümkündür. Örneğin, C ++ SSE2 intrinics'in adları, montaj anımsatıcısındaki 7 karaktere kıyasla ortalama 12 karakterdir. http://msdn.microsoft.com/en-us/library/c8c5hx3b(v=vs.80).aspx

(B) Soru daha sonra şöyle devam eder: Kriptik olmayan / düşük seviyeli talimatlardan ne kadar süre geçmesi gerekir?

(C) Şimdi bu tür isimlendirme şemalarının kompozisyonunu analiz ediyoruz. Aşağıdakiler aynı düşük seviye talimatı için iki adlandırma şemasıdır :

  • Adlandırma şeması # 1: CVTSI2SD
  • Adlandırma şeması # 2: __m128d _mm_cvtsi32_sd (__m128d a, int b);

(C.1) Düşük seviyeli talimatlar her zaman kesinlikle yazılır. Belirsizlik, tür çıkarımı, otomatik tür dönüşümü veya aşırı yüklenme olamaz (benzer ancak eşdeğer olmayan işlemler için komut adının yeniden kullanılması).

(C.2) Her düşük seviye talimatı, birçok tip bilgiyi isminde kodlamalıdır. Bilgi örnekleri:

  • Mimarlık Ailesi
  • Operasyon
  • Bağımsız Değişkenler (Girişler) ve Çıktılar
  • Türler (İşaretli Tam Sayı, İmzasız Tam Sayı, Kayan Nokta)
  • Hassasiyet (Bit Genişliği)

(C.3) Eğer her bir bilgi parçası hecelenirse, program daha ayrıntılı olacaktır.

(C.4) Çeşitli satıcılar tarafından kullanılan tip kodlama şemalarının uzun tarihi kökleri vardı. Örnek olarak, x86 komut kümesinde:

  • B, bayt (8 bit) anlamına gelir
  • W kelime (16 bit) anlamına gelir
  • D, "çift kelime" dword (32 bit) anlamına gelir
  • Q, "dört kelimeli" kelimesini ifade eder (64-bit)
  • DQ, "çift dört kelimeli" dqword (128-bit) anlamına gelir

Bu tarihsel referansların hiçbir şekilde modern bir anlamı yoktu, ama yine de birbirine yapışıyor. Daha tutarlı bir şema, bit genişliği değerini (8, 16, 32, 64, 128) isme koyardı.

Aksine, LLVM düşük seviyeli talimatlarda tutarlılık yönünde doğru bir adımdır: http://llvm.org/docs/LangRef.html#functions

(D) Talimat adlandırma şemasına bakılmaksızın, düşük seviyeli programlar zaten ayrıntılı ve anlaşılması zordur çünkü yürütmenin dakika detaylarına odaklanırlar. Talimat adlandırma düzenini değiştirmek, bir hattan satıra okunabilirliği artıracak, ancak büyük bir kod parçasının işlemlerini anlama zorluğunu ortadan kaldırmayacaktır.


1
İyileştirilmiş hatlar arası okunabilirliğin mutlaka her şeyi anlama üzerinde bir etkisi olacaktır, ancak tek başına adlandırma elbette önemsiz olamaz.
Roman Starkov,

3
Ayrıca, tür konu-off fakat CVTSI2SDdaha başka bilgi taşımaz ConvertDword2Doubleya ConvInt32ToFloat64, ancak daha uzun süre, ikincisi eski ... deşifre edilmelidir, oysa, anında tanınabilir
Roma Starkov

2

İnsanlar sadece zaman zaman meclis okur ve yazarlar ve çoğu zaman sadece bir iletişim protokolüdür. Yani, en sık derleyici ve assembler arasında bir ara serileştirilmiş metin tabanlı gösterimi olarak kullanılır. Bu gösterimi ne kadar ayrıntılı ise, bu protokolde o kadar gereksiz ek yük olur.

Opcodes ve register isimlerinde, uzun isimler aslında okunabilirliğe zarar verir. Kısa anımsatıcılar bir iletişim protokolü için (derleyici ile assember arasında) daha iyidir ve assembly dili çoğu zaman bir iletişim protokolüdür. Derleyici kodunu okumak daha kolay olduğundan, kısa hatırlatıcılar programcılar için daha iyidir.


Yerden tasarruf etmeniz gerekiyorsa, onu gzipleyin! ... Tepegöze ihtiyacınız yoksa, bunun yerine ikili bir format kullanın! Metin kullanıyorsanız, okunabilirliği hedefliyorsunuz - o zaman neden tüm yol boyunca gidip düzgün okunabilir hale getirmiyorsunuz?
Roman Starkov

2
@ yerel, iki yerel işlem arasında bir metin tabanlı iletişim protokolünü sıkıştırarak? Bu yeni bir şey. İkili protokoller daha az sağlamdır. Bu unix bir yol - metin tabanlı protokoller arada sırada okunabilirlik için orada . Sadece yeterince okunabilirler.
SK-mantığı

Sağ. Sizin öncülünüz, bu kayıtların isimlerini veya CIL talimatlarını, genel giderler için yeterince küçük olanları okuyup yazmamdır. Fakat bir düşünün; Programlama yaparken başka bir programlama dilinde tuhaf bir yöntem veya değişken adı kadar sık ​​kullanılırlar . Ekstra birkaç bayt önemli olan bu kadar nadir mi?
Roman Starkov

1
İsimlerin ne kadar sürmesi gerektiğine dair farklı bir tada sahip olma hakkınıza saygı duyuyorum, ancak derleyicilerinizdeki yöntemleri ve yerlileri gerçekten kriptik şeyler olarak adlandırıyor TIFRmusunuz ya da tam kelimeler içerme eğilimindeler mi?
Roman Starkov

1
Okunabilir ve kısa değiş tokuş ile ilgili hiçbir fark görmüyorum. Bunları farklı olarak görüyorum, tabii ki, tıpkı değişkenler gibi, türlerden farklı işlevlerden farklı. Sadece neden opcodes ve register adlarının , ne yaptığına dair herhangi bir ipucu bulmadan önce yeni karşılaşılan her biri için dokümantasyona başvurma noktasına çok kısa olmaktan fayda sağladığını anlamıyorum . Şimdiye kadarki tek argüman, yanılmıyorsam etkin depolamadır. Gerçekten mi demek istiyorsun? ... Yoksa başka sebeplerin var mı?
Roman Starkov,

1

Çoğunlukla aptalca. @TMN'nin dediği gibi, tıpkı Python'da import JavaScriptObjectNotationya import HypertextTransferProtocolLibraryda Python'da yazmadığın gibi Timer1LowerHalf = 0xFFFF, C'de de yazmazsın . Bilmesi gereken herkes zaten biliyor.

Değişime direnç, kısmen, gömülü sistemler için bazı C derleyici satıcılarının gömülü programlamaya daha kullanışlı özellikler uygulamak için dil standardı ve sözdiziminden sapması gerçeğinden kaynaklanabilir. Bu, düşük seviyeli kod yazarken her zaman favori IDE'nizin veya metin düzenleyicinizin otomatik tamamlama özelliğini kullanamayacağınız anlamına gelir, çünkü bu özelleştirmeler kod analiz etme yeteneklerini ortadan kaldırır. Bu nedenle kısa kayıt adlarının, makroların ve sabitlerin faydası.

Örneğin, HiTech'in C derleyicisi bellekte kullanıcı tarafından belirlenmiş bir konuma sahip olması gereken değişkenler için özel bir sözdizimi içeriyordu. Beyan edebilirsiniz:

volatile char MAGIC_REGISTER @ 0x7FFFABCD;

Şimdi bunu çözümleyecek varolan IDE, HiTech'in kendi IDE'sidir ( HiTide ). Başka bir düzenleyicide, her seferinde bellekten, elle yazmanız gerekir. Bu çok hızlı yaşlanır.

Ayrıca, kayıtları incelemek için geliştirme araçlarını kullanırken, çoğu zaman birkaç sütunla görüntülenen bir tablonuzun (kayıt adı, hex cinsinden değer, ikili değerdeki değer, hex cinsinden son değer, vb.) Olacağı da bir gerçektir. Uzun isimler, iki yazmaç arasındaki farkı görmek için ad sütununu 13 karaktere genişletmeniz ve düzinelerce tekrarlanan kelime satırının karşısına "farkı" oynamanız gerektiği anlamına gelir.

Bunlar saçma sapan sesler gibi gelebilir, ancak göz yorgunluğunu azaltmak, gereksiz yazmayı azaltmak veya milyonlarca diğer küçük şikayetlerden herhangi birini ele almak için tasarlanan her kodlama kuralı değil mi?


2
Tüm argümanların bir anlamı var. Bütün bu noktaları tamamen anlıyorum. Ancak aynı şeyin üst seviye kod için de geçerli olduğunu düşünmüyor musunuz? Ayrıca bir C # işlevinde bir yerel tablo görmeniz gerekir. Bağlam özneldir ve File.ReadAllBytesayrıca alışkın biri için gülünç derecede uzun görünebilir fread. Öyleyse ... neden yüksek seviye ve düşük seviye kodu farklı şekilde ele alıyorsunuz ?
Roman Starkov,

@romkyns - Ben senin fikrini anlıyorum ama aslında yüksek seviye kodları çok farklı ele almadığımızı sanmıyorum . Kısaltmalar birçok üst düzey bağlamda iyidir, biz sadece fark etmiyoruz çünkü kısaltmaya daha çok alışıyoruz ya da ona göre olan şema. Gerçekten fonksiyon yazarken veya düşük seviyeli kodda değişkenler oluşturduğumda hoş tanımlayıcı isimler kullanıyorum. Ancak bir sicile başvurduğumda, bir harf ve sayı karmakarışıklığına göz atabildiğim ve hızlı bir şekilde "T = zamanlayıcı, IF = kesme bayrağı, 1 = ilk kayıt" olarak düşünebildiğim için memnunum. Neredeyse bu açıdan organik kimya gibi: P
detly

@romkyns - Ayrıca, tamamen pratik anlamda, ben C # bazı mikroişlemcinin IDE ve uygulama geliştirme kayıtları bir tablo arasındaki fark olduğunu düşünüyorum bu: uP kayıtları bir tablo gibi görünebilir: Timer1InterruptFlag, Timer2InterruptFlag, ..., Timer9InterruptFlag, IOPortAToggleMask, IOPortBToggleMask, vb x100. Daha yüksek bir dilde, çok daha farklı değişkenler kullanırsınız ... ya da daha fazla yapı kullanırsınız. Timer1InterruptFlagile karşılaştırıldığında% 75 gereksiz bir gürültü T1IF. C # 'da böyle farklı bir değişkenler listesi oluşturacağınızı zannetmiyorum.
saat

1
@romkyns - Ne farkında olmayabilir oradaki gerçektir etti sen ne tarif doğru bir değişim olmuştur. Microchip'in yeni derleyicileri, örneğin sadece kayıt defterlerinden çok daha ayrıntılı ve açıklayıcı olan kütüphanelerle birlikte gelir. UARTEnable(UART1, BITS_8, PARITY_N, STOP_1, BAUD_115200). Ama hala inanılmaz derecede beceriksizler ve çok fazla dolaylı ve verimsiz. Onları mümkün olan yerlerde kullanmaya çalışıyorum, ancak çoğu zaman, kayıt manipülasyonunu kendi işlevlerime sarıyorum ve üst düzey mantıktan çağırıyorum.
saat

@detly: CCS derleyicisinin böyle yöntemleri vardı ve diğer bazı işlemcilerde bunu yaptı. Genelde onlardan hoşlanmam. Register spec, kayıtları kullanan bir kod yazmak için yeterlidir ve bu kayıtları ne yaptığını görmek için kayıtları kullanan bir kişinin kod okumasını sağlamak için yeterlidir. Bir donanım önyargısına N değeri yazma eylemi dönemi N + 1 (oldukça yaygın) olarak ayarlarsa, bunun anlamı IMHO'nun set_prescalar(TMR4,13);olacağından çok daha az açık olması demektir TMR4->PSREG=12;. İlk kodun ne yaptığını bulmak için derleyici kılavuzuna
bakılsa

1

Kimsenin tembellikten bahsetmediğinden ve diğer bilimlerin tartışılmadığından şaşırdım. Programcı olarak günlük çalışmam bana programdaki herhangi bir değişken için adlandırma kurallarının üç farklı yönden etkilendiğini gösteriyor:

  1. Programcının bilimsel geçmişi.
  2. Programcının programlama becerileri.
  3. Programcının çevresi.

Düşük seviyeli veya yüksek seviyeli programlama hakkında konuşmanın faydası olmadığını düşünüyorum. En sonda, her zaman önceki üç yönü ile sabitlenebilir.


İlk yönün açıklaması: Çoğu "programcı" ilk sırada programcı değildir. Onlar matematikçiler, fizikçiler, biyologlar ve hatta psikologlar veya ekonomistlerdir, ancak çoğu bilgisayar bilimcisi değildir. Bunların çoğu, "sözleşmeler" adlarında görebileceğiniz, kendi alanlarına özgü anahtar kelimelere ve kısaltmalara sahiptir. Genellikle kendi alanlarında mahsur kalırlar ve bilinen kısaltmaları okunabilirlik veya kodlama rehberlerini düşünmeden kullanırlar.

İkinci yönün açıklaması: Programcıların çoğu bilgisayar bilimcisi olmadığından programlama yetenekleri sınırlıdır. Bu nedenle, kodlama sözleşmelerine sık sık önem vermezler, ancak ilk yön olarak belirtilen alana özgü sözleşmelere daha fazla dikkat ederler. Ayrıca, bir programcının becerilerine sahip değilseniz, kodlama kuralları hakkında bir fikriniz yoktur. Bence çoğu anlaşılabilir bir kod yazmak için acil bir ihtiyaç görmüyor. Ateşi ve unut gibiydi.

Üçüncü yönün bir açıklaması: Çevrenizin desteklemesi gereken eski kodlar, şirketinizin kodlama standartlarını (kodlamayı umursamayan ekonomistler tarafından yönetilen) veya ait olduğunuz alanla ilgili kurallara uymamak olası değildir. Birisi şifreli adları kullanmaya başladıysa ve onu veya kodunu desteklemeniz gerekiyorsa, şifreli adları değiştiremezsiniz. Şirketinizde kodlama standartları yoksa, bahse girerim hemen hemen her programcının kendi standardını yazması gerekir. Ve son olarak, etki alanı kullanıcıları tarafından kuşatılmışsanız, kullandıklarından başka bir dil yazısı yazmaya başlamazsınız.


kimse tembellikten bahsetmedi - belki de bunun nedeni bu değil. Ve diğer bilimler tartışılmadı oh bu kolay: tartışma için değil bu site . Bu içindir soru ve cevap
tatarcık

Tembellik yasal bir sebep. Neredeyse tüm programcılar tembel insanlardır (aksi halde her şeyi elle yaparız!).
Thomas Eding,
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.