it-swarm.asia

Düşük seviyeli programlama - benim için ne var?

Yıllarca "düşük seviye" dillerini düşündüğümü araştırmayı düşündüm. Benim için bu C ve Meclis demek. Ancak bunun için henüz zamanım olmadı ve HİÇBİR GEREKLİ OLMADI.

Şimdi ortaya çıkan herhangi bir zorunluluk görmediğim için, konuyu inceleyeceğim ya da planı sonsuza dek bırakacağım zaman zaman ayırmam gerektiğini hissediyorum.

Pozisyonum

Son 4 yıldır değişebilecek olan "web teknolojileri" ne odaklandım ve değişmesi muhtemel olmayan bir uygulama geliştiricisiyim.

Uygulama geliştirmede kullanılabilirliğin en önemli şey olduğunu düşünüyorum. Kullanıcılar tarafından "tüketilecek" uygulamalar yazarsınız. Bu uygulamalar ne kadar kullanışlı olursa, o kadar çok değer üretmiş olursunuz.

İyi kullanılabilirlik sağlamak için aşağıdakilerin geçerli olduğuna inanıyorum

  • İyi tasarım: İyi düşünülmüş bir kullanıcı arayüzü ile erişilebilen iyi düşünülmüş özellikler.
  • Doğruluk: Doğru uygulanmazsa, en iyi tasarımın hiçbir değeri yoktur.
  • Esneklik: Bir uygulama sürekli olarak gelişmelidir, böylece kullanıcıları A'nın uygulayabileceği yeni özelliklere sahip farklı bir B uygulamasına geçmemelidir. Aynı sorunu ele alan uygulamalar özellikler açısından değil felsefede farklılık göstermelidir.
  • Performans: Performans iyi bir kullanıcı deneyimine katkıda bulunur. Bir uygulama ideal olarak her zaman yanıt verir ve görevlerini makul sıklıkta (sıklıklarına göre) gerçekleştirir. Performans optimizasyonunun kullanıcı tarafından farkedildiği noktanın ötesindeki değeri sorgulanabilir.

Düşük seviye programlama performans dışında bu konuda bana yardımcı olmayacak. Ancak performans uğruna düşük bir dilde tüm bir uygulamayı yazmak benim için erken optimizasyon.

Benim sorum

Düşük seviyeli programlama bana ne öğretebilir, başka hangi diller bana öğretmez? Bir şey kaçırıyor muyum yoksa uygulama geliştirme için çok az kullanılan bir beceri mi? Lütfen anlayın, C ve Meclisin değerini sorgulamadığım. Sadece günlük yaşamımda, o dünyanın tüm karmaşıklıklarının soyutlanmasından ve benim için yönetilmesinden oldukça mutluyum (çoğunlukla C/C++ ve Assembly'nin kendisinde yazılan katmanlar tarafından). Benim için yeni olabilecek herhangi bir kavram görmüyorum, sadece kafamı doldurmam gereken detaylar. Peki benim için ne var?

Kanımca

Yanıtları için herkese teşekkürler. Söylemeliyim ki, kimse beni gerçekten şaşırtmadı, ama en azından şimdi herhangi bir ihtiyaç ortaya çıkana kadar bu ilgi alanını bırakacağımdan eminim.
Anladığım kadarıyla, günümüzün CPU'larında kullanılan işlemciler için Meclis'i bu gün yazmak sadece gereksiz derecede karmaşık olmakla kalmıyor, aynı zamanda bir C muadilinden daha zayıf çalışma zamanı performansı ile sonuçlanma riskleri de var. Bir derleyicinin otomatik olarak yapabileceği her türlü optimizasyonu almazken, OOE sayesinde elle optimizasyon neredeyse imkansızdır. Ayrıca, kod ya taşınabilirdir, çünkü mevcut komutların küçük bir alt kümesini kullanır ya da optimize edilmiştir, ancak muhtemelen sadece bir mimari üzerinde çalışır.
C yazmak artık geçmişte olduğu gibi neredeyse gerekli değil. C'de bir uygulama yazacak olsaydım, test edilmiş ve kurulmuş kütüphaneler ve çerçeveler de kullanırdım, bu da bana dize kopya rutinleri, sıralama algoritmaları ve üniversitede egzersiz olarak hizmet eden diğer şeyleri uygulamadan kurtarırdı. Kendi kodum tür güvenliği pahasına daha hızlı çalışır. Ne normal uygulama geliştirme sırasında tekerleği yeniden icat etmeye ne de çekirdek dökümlere bakarak hata ayıklamaya çalışıyorum: D
Şu anda diller ve çevirmenlerle denemeler yapıyorum, bu yüzden yayınlamak istediğim bir şey varsa, sanırım C++ hile yapabilir, ancak C'ye bir çalışma konsepti taşıyacağım.
Tekrar, cevaplarınız ve görüşleriniz için herkese teşekkürler.

32
back2dos

Düşük seviyeli programlama, normal masaüstü bilgisayarlarda hemen mevcut olmayan bir gereksinimin olduğu köşe durumlar içindir. Bu bir hız darboğaz, bir bellek darboğaz veya tamamen farklı bir şey olabilir ve bu gereksinimler göz önüne alındığında neler yapılabileceğini görmek çok sık ilginçtir.

Bunu, kısıtlamaların ilginç kıldığı Haikus veya Limericks olarak düşünün.

Bugün imkansız görünen şeyde neyin mümkün olabileceği hakkında bir fikir vermek için, işte şimdiye kadarki en büyük hacklerden biri. 1 Kb RAM! http://users.ox.ac.uk/~uzdm0006/scans/1kchess/ içinde satranç

9
user1249

Son zamanlarda bunu düşünüyordum. Şu anda kendimi C # geliştiricisi olarak görüyordum - bu da kariyerim için gayet iyi.

Ancak, çoğu zaman gerçekten düşük seviyedeki şeyleri kaçırıyorum (C'de montajcı veya aygıt sürücüleri yaparak 'aslında ellerimi kirletiyorum'). Sadece programlamayı özlüyorum. Bunun kariyerimde bana çok yardımcı olmasını beklemiyorum. Aygıt sürücüleri veya gömülü sistemler sizin işinizse, çok yardımcı olabilir.

Soyutlanan dillerde ne kadar çok program yaparsam, ilk etapta beni bilgisayarlara neyin getirdiğini o kadar özlüyorum: bilgisayarın etrafında dolaşmak ve hangi seğirmeleri görmek. Assembler ve C alay için çok uygundur :)

Eski dilleri kullanarak, hemen hemen her şeyi kendiniz yapmaya zorlandığınızı düşünüyorum. C # 'da myArray.SortBy(x=>x.Name) gibi bir şey yapabilirim. Bunu C.'de yapamazdım, dilin benim için en iyi sıralama yapacağını kabul ediyorum. Eğer C'de yapsaydım, üniversite modüllerimin günlerine dönüp farklı sıralama ve arama algoritmalarımı gözden geçirebilirdim.

Bu yüzden, daha düşük seviyeli diller, soyutlanan uzun unutulmuş bitlerden herhangi birini gözden geçirmenize yardımcı olacaktır. Kişisel bir meydan okuma ilerleyen bir kariyer daha.

29
Jonathon

Benim önerim, entelektüel bir merak olarak C ile oynamaktır. Buna değer olmadığı için ağır bir zaman yatırımı yapmayın.

Önerilen hedefler:

  • temel veri yapıları ve algoritmalar. Hakkında belleğinizi yenileyin.
    • Cebir ve geometri gibi bilmek iyi bir şeydir.
    • C bazı üniversite ders kitabı egzersizleri veya program bulmacalar yapmaya çalışın.
  • CPU önbelleğinden okyanus ötesi ağ gecikmesine kadar bellek (bant genişliği) hiyerarşisi daha iyi bir değer. Bu, her düzeyde uygulama geliştirme becerilerinize yardımcı olacaktır.
    • En önemlisi, a küçük üst düzey kodun göze çarpmayan yeniden düzenlenmesi dramatik hız artışı ile sonuçlanabilir.
      • Bazen bunun nedeni sadece bellek hiyerarşisi bağlamında düşük düzeyli uygulamada anlaşılabilir.
      • Bu olasılığın doğal nedenini anlamamak cehalet, kork ve nihayetinde inkar 'a yol açarak üst düzey geliştiriciler için yanlış olduğunu düşünüyor bu tür bir optimizasyondan faydalanabilirsiniz. Gerçekte bunda yanlış bir şey yok.
  • C/C++/Assembly'de geliştirilen düşük seviyeli bileşenlerin yüksek seviyeli sistemler tarafından kullanılmasını sağlayan bileşen tabanlı yazılım sistemlerinin estetiği değerini takdir edin.
    • Estetik, yazılım kullanılabilirliği ile tamamen aynıdır:
      • İyi tasarım (güçlü, kullanımı kolay, iyi düşünülmüş)
      • Doğruluk
      • Esneklik (her biri açıkça tanımlanmış bir amacı olan mevcut parçaların bileşimi yoluyla uzantılar ve yeni davranışlar)
      • Performans (kullanılabilirliği zorlaştırmadan)
    • Kendi düşük seviyeli bileşenlerinizi tasarlayamasanız da, anlayışınız üst düzey projelerinizde kullanmak için iyi bileşenleri değerlendirmenize ve seçmenize yardımcı olacaktır.
  • Son olarak, düşük seviyeli bileşenlerin neredeyse her zaman ygulamalarında daha karmaşık, sadece arayüze bakarak küflenmekten uzak olduğunu takdir edin.
    • Düşük seviye her zaman karmaşıktır. İyi bir kütüphane, karmaşıklığını gücünü azaltmadan gizler.
    • Bileşen geliştiriciler tarafından yazılan ve üst düzey bileşen kullanıcılarına bileşenlerden en iyi şekilde nasıl yararlanılacağına dair öneriler olan "teknik notları" okumayı öğrenin.
15
rwong

makine işlevinin nasıl çalıştığını anlamak istiyorsanız ve yalnızca üst düzey dilinizin bağlı olduğu sanal makine değil, Meclis bunu size öğretecektir

eğer bakım için bir nedeniniz yoksa - ve çoğu programcı bugünlerde gerçekten yok - o zaman endişelenmeyin.

temelinizi geliştirir, ancak muhtemelen web uygulamalarınızı geliştirmez

8
Steven A. Lowe

Her programlama dili, genel olarak programlama hakkında nasıl düşündüğünüz konusunda biraz değişir. Size verebileceğim somut bir örnek, haskell öğrenmeye başladığım ve aniden javascript, Ruby ve python) çok daha mantıklıydı. önce benim kod herhangi katlanmış ama haskell sonra ben hemen hemen her yerde gördüğüm diziler görüyorum.Bu yüzden biraz C öğrenirseniz, en sevdiğiniz dil çeşitli yapıların göreceli performans karakteristiklerinin çok daha fazla farkında olacak. Birkaç dakika önce hızlı ve optimize edilmiş javascript yazma hakkında bir konuşmayı dinliyordum ve konuşmacı "C'de yapmak zorsa javascriptte gerçekten yavaş olacak" dedi. Amacı, javascript'in yorumlanmış bir dil ve yorumlayıcı olması. C ya da C++ ile yazılmıştır, çünkü çok az C deneyimim var ve C'de neyin zor ya da kolay olduğu hakkında hiçbir fikrim yok.

8
davidk01

Sadece eğlence için yapmazsanız, geeksler donanımları üzerinde tam kontrole sahip olmayı gerçekten seviyorlar, en azından bir programın, örneğin Java yerine C ile yazıldığında ne kadar hızlı olabileceğini daha iyi hissedebilirsiniz. Çöp toplama gibi daha üst düzey dillerin özelliklerini gerçekten takdir etmeyi de öğrenebilirsiniz.

7
user281377

Merak için Yaşasın!

Kişinin günlük görevleri için bilmeye mantıklı bir ihtiyaç olmasa bile, karmaşık bir sistemin en alt seviyelerinde neler olup bittiğine dair bir fikre sahip olmak çok iyidir. Bir şeyleri bit düzeyinde bulmanın en iyi yolu kendi CPU'nuzu oluşturmaktır. Makine dili düzeyindeki opcodları düşünmelisiniz, dikey komut setlerinin neden bu kadar iyi olduğunu, kesme işleminin komplikasyonlarını, karmaşık devreler ile mikrokod arasında (örneğin çarpma ünitelerinde) dengesizlikleri ve çok daha eğlenceli olduğunu anlamalısınız!

Ama bu, açık bir şekilde, elektronik bilgi birikimi gerektiriyor ve zaman alıcı, bu yüzden bir sonraki en iyi şey antika tarzı 8 bit CPU ile oyuncak. 8051 gibi mikrodenetleyiciler hala yaygın olarak kullanılmaktadır ve hobiler tarafından kullanılabilir. Bu, elektronik sürülerek ve LED'lerin sigara içmeden parlamasını sağlamak için hala biraz bilgi gerektirir ve elektronik için donanımlı değilseniz $$ maliyeti vardır.

Bundan sonraki en iyi şey: bir CPU simülatöründe oyuncak (emülatör? Bu terimleri karıştırıyorum) - bunlar Z80, 6502, 8086 ... tüm eski 8-bitterler için var. Bu havya hangi ucunu tutmak bilmiyorum bir uygulama programcısı için en eğitici ve eğlenceli olabilir (biri oldukça hızlı öğrenir :) Metin video belleğe nasıl yazılır, Montaj kodu hileler performans ile nasıl yardımcı olur. .. Bu seviyede keşfedilecek birçok eğlenceli şey var.

C CPU'yu içsel işleyişle ilgili ilk anlayışa sahip olmadan başka bir dil olarak öğrenmekten pek emin değilim. CPU kayıtları arasında bitlerin nasıl gönderildiğini ve belleğe nasıl erişildiğini bilmek, gerçekten işaretçiler ve diğer C dili kavramları elde etmede çok yardımcı olur.

5
DarenW

Tek kelimeyle eğlenceli. Birleştirici ile oynadığımda (VB C++, C vb.) Çalıştıktan sonra, işlemcinin bir bölümünden diğerine veri taşımak harika bir şeydi. Bilmeniz hissi tam olarak CPU'nun içinde olup bitenler hakkında, bilmediğinizin altında neler olup bittiğinden endişe duymayın.Ayrıca büyük bir özgürlük hissi - hemen hemen her şeyi yapabilirsiniz, çünkü üst düzey dillerde bulduğunuz dahili sınırlamalar yoktur.

Ayrıca, başka herhangi bir dilde programlanmış olan herkese dönüp 'yeterince sert değilseniz ...' çocuksu, çocukça eğlenceliydi.

4
Dan O

Düşük seviyeli programlamayı öğrenmek/uygulamak için iyi bir neden var mı? Bağlama bağlı olarak kendime çeşitli cevaplarım var.

Birincisi, C programlamayı (ama aynı zamanda OCaml ve Java) da öğretiyorum, öğrenciyi programlamayı zor taraftan öğrenmeye motive etmek muhtemelen görevin en zor kısmı. Şimdiye kadar bulduğum en iyi argüman "anlamak" tır: daha üst düzey diller bir çok altta yatan mekanizmayı gizler ve bazen iyi değil, aynı zamanda bazı düşük seviye hileler gerçekten yararlı olsa bile sizi daha yüksek seviyede kalmaya iterler ( performans için, çoğu zaman.) Ne kullandığınızı anlamak, onu daha iyi kullanmanıza yardımcı olabilir. Öğretmenlik deneyimim, daha düşük seviyeli programlamayı (ve kullanıcı odaklı olmayan, bu tür derleyicileri) öğrenen öğrencilerin daha uyarlanabilir olduklarını ve daha hızlı yeni üst düzey kavramları veya araçları öğrendiklerini kanıtlıyor.

İkincisi, belirttiğiniz gibi, performans kullanıcı deneyiminin bir parçasıdır. Çoğu zaman, performans karmaşık ve makine kodunun yakınında yazma meselesi olarak görülür. Bu her zaman böyle değildir, performans daha çok algoritmalar ve veri yapıları değil, aynı zamanda algo ve veri arasındaki etkileşim meselesidir. Konuyla ilgili özel bir proje kullanıyorum, temelde basit bir yol bulma, ancak asıl mesele verinin boyutudur: grafik sonsuzdur. İniş performansları elde etmenin ve belleğe sığmanın tek yolu, özel bir bellek ayırıcısı yazmaktır (aslında iki, bir havuz ayırıcısı ve geri dönüşüm ayırıcısıdır.) Bu, daha üst düzey dillerde yapamayacağınız bir şeydir. Aslında, çöp toplanan dillerin çoğunda performans ve bellek sorunları olacaktır.

Muhtemelen daha düşük seviyeli dillerin "hype" olanlara karşı istikrarı (tarih ve uzun ömür anlamında) gibi çok daha fazla argüman vardır (programlama için gelecekteki referans olarak kabul edilecek bir dilin birkaç yıl içinde ortadan kalkabilmesi uzun bir süredir) hikaye, kişi yeni bir şeyin ömrünü tahmin edemez, ancak bu argüman eski diller için geçerli kalır ...), elbette bir tat meselesi de vardır veya çoğu üst düzey dilde yapılabilecekler de olabilir daha düşük seviyeli dillerde yapılır, ancak tam tersi değil

Kendimi her iki dünyada da tuzağa düşürüyorum (oldukça farklı), teorik programlama kavramı, tip sistemleri tasarımı ve kanıtı üzerinde çalışarak birkaç yıl geçirdim ve bunu yaparak sadece çok yüksek seviyeli dilleri (çoğunlukla işlevsel olan, aynı zamanda saf nesne yönelimli.) Son zamanlarda diğer tarafa (çoğunlukla sistem ve çekirdek programlama) geri dönüyorum ve bu alanda kendimi oldukça rahat buldum Çok eğlendim! Benim için bir sonraki adım ortak noktayı bulmaktır: daha düşük seviye programlama için daha üst seviye dil özellikleri! Yani, bunun için bir dil yok (belki de google'ın kullanıcı sistemi programlaması için gitmesi) ve kendi dilimi oluşturma fikrini düşünüyorum, ama bu başka bir hikaye.

2
Marwan Burelle

Alan adınızda fazla bir neden olmadığını söyleyebilirim, ancak yüksek performanslı bilgi işlem (örneğin, Oyun, Bilim, vb.).

1
Darknight

Günümüzde düşük ve yüksek seviyeli programlamanın birbirinden tamamen ayrılabileceğini düşünüyorum. Temel olarak bu, C ve montajcıyı hiç bilmeden tüm profesyonel hayatınızı yaşayabileceğiniz anlamına gelir. Bununla birlikte, C programlama dili size programlama ve tasarım açısından çok fazla şey öğretemez.

Sadece meraktan, işlerin nasıl daha düşük bir seviyede çalıştığını öğrenebilirsiniz. Örneğin, üniversitedeyken, C++ 'dan derleyici kodu oluşturmak için gcc kullanmaktan keyif aldım. Polimorfizmin ve istisnanın nasıl uygulandığını anlamak faydalı oldu. Ama bunun dışında günümüzde C'den öğrenebileceğiniz tek şey:

1) kirli bellek hileleri. C, programcılar deliliğinde aşağıdan aşağı olmadığını anlamanın en iyi yoludur :)

2) GOTO'lar aslında hataları geri almak için kullanılır (ve yararlıdır)

3) bellek ayırmanın nasıl çalıştığını daha iyi öğrenin (yığın ve yığın yığını arasındaki fark?).

Temel olarak benim tezim: Eğer üniversiteyi bitirmişseniz ve hala C'ye ihtiyacınız yoksa, öğrenmekten çok :)

1
Emiliano

Düşük seviyeli dilleri anlamanız gerekmez, ancak seçtiğiniz yüksek seviyeli dilin kapaklarının altında neler olduğunu anlamalısınız. Düşük seviyeli bir dil kullanmak size bunu öğretecektir, ancak tek yol bu değildir.

Aşağıda, üst düzey dilleri etkileyebilecek düşük düzeyli kavramlara bazı örnekler verilmiştir.

İşaretçiler:

List<object> listOne = new List<object>();
List<object> listTwo = listOne;

listTwo.Add(new object());

Debug.WriteLine(listOne.Count); //do you know what this will be?

Teller:

string initial = "initial";
string another = initial;

another = "changed!";
Debug.WriteLine(initial); //what about this?

Listeler:

Bir listeyi bağlantılı listeye karşı ne zaman kullanırsınız? (Bir listenin nasıl çalıştığını oldukça düşük bir seviyede anlamadan bunu bilmek neredeyse imkansızdır)

-

Bütün bunları bilmek gerekli mi? Hayır, ancak bunun bir etkisi olabilir ve üst düzey bir dilin ustası olmak istiyorsanız, iç çalışmalar hakkında oldukça iyi bir fikre sahip olmanız gerekir.

1
Alistair

Düşük seviyeli programlama bana ne öğretebilir, başka hangi diller bana öğretmez?

En önemlisi, bilgisayarların gerçekte nasıl çalıştığını size öğretecektir. Bunu öğrenmenin düşük seviyeli programlamadan başka bir yolu yoktur. Ne tür uygulamalar programlasanız da, bu her zaman yardımcı olacaktır. Aslında tüm bu web şeylerinin altında neler olup bittiğini anlayacaksınız. Windows ile çalışıyorsanız, tüm API C dilinde yazılır, bu nedenle dilinizin bilinmesi, mevcut dillerinizin ve kitaplıklarının eksik olduğu bir özelliği kullanmanız gerektiğinde doğrudan işletim sistemi ile iletişim kurmanızı mümkün kılacaktır.

Elbette düşük seviyeli programlama, asm/C/C++ 'nin bir zorunluluk olduğu gömülü programlama ve gerçek zamanlı programlama gibi tamamen farklı şeylerle çalışmanızı sağlayacaktır. Bu tür uygulamalara ilgi duymuyorsanız, asm/C/C++ öğrenmeye pek gerek yoktur.

Ayrıca, bitleri ve baytları öğreneceksiniz. Bit manipülasyonları, onaltılık vb. Bu şeyler, web/masaüstü programlama yaparken bile zaman zaman karşılaşabilirsiniz. Şifreleme algoritmaları kullanıldığı bir örnektir.

1
user29079