UNIX felsefesinde programlama İşlevsel programlama ile aynı mıdır?


30

UNIX Programlama Ortamı (klasik metin), UNIX'in programlama yaklaşımının daha karmaşık sorunları çözmek için birleştirilebilecek küçük, iyi tanımlanmış araçlar oluşturmak olduğunu belirtir. C ve Bash kabuğunu öğrenirken, bunu çok çeşitli programlama problemleriyle başa çıkmada kullanılabilecek güçlü bir kavram olarak buldum.

Sadece bir Linux platformu kullanarak, konsept oldukça açık ve her zaman kullanılmaktadır. Komut satırında G / Ç'yi yönlendiren, ls, grep, vb. Gibi sistem araçlarını birbirine bağlayan herhangi bir ifade, bu kavramın ne kadar güçlü olduğunu gösterir.

Kafamı karıştıran şey, bu programların birçoğunun zorunlu / prosedürel bir programlama stili kullanılarak C dilinde yazılması, ancak komut satırında bir arada kullanılma ve bir araya getirilme şekli, her bir programın olduğu gibi, bana işlevsel programlama gibi görünüyor. Birleştirilebilecek başka bir programın durumuna bağlı olmayan yalıtılmış bir işlev.

Bu doğru mu, UNIX programlama felsefesini anlamak, zorunlu bir programlama stili kullanılarak yapılmış olabilecek araçları kullanarak temelde işlevsel programlama mıdır?


5
Bu analojinin doğru olup olmadığının önemli olduğunu sanmıyorum. Asıl soru, bu sizin için yararlı bir benzetme midir? Bu anlamda düşünmek, programlar yazmanıza ve işlerinizi tamamlamanıza yardımcı oluyor mu?

Yanıtlar:


19

Orada bir noktaya değindin düşünüyorum, ama cp, rm, cdonlar gerçekten fonksiyonlar değildir bu yüzden başkalarının ve bir çok durumunu değiştirme. UNIX felsefesi, sadece bir şeyi yapmaktan başka bir şey yapmaktan ibaret değildir; genellikle iyi yapmak, işlevsel kullanıma izin vermek anlamına gelir, ancak her zaman değil.


9

Cevap Oleg Kiselyov'un "Monadic i / o ve UNIX kabuk programlaması" nda .

Bu, Philip Wadler'in "Bir Zorunlu Nasıl Bildirilir" adlı makalesinden ilham alan bir makaledir [ Wadler97 ]. Haskell'deki monadik g / ç ile borular ve yönlendirmelere dayalı UNIX filtre bileşimleri arasında esrarengiz benzerlikler göstereceğiz. UNIX boruları (semantik olarak geçici dosyalara yazma olarak kabul edilir) monadlara oldukça benzerdir. Ayrıca, UNIX programlama düzeyinde, tüm giriş / çıkış monadik olarak kabul edilebilir ...


6

Tüm yan etkiler konusunu görmezden gelirseniz, bu şekilde bir bakabilirsiniz. Unix komutları sık sık aynı girişlerle aynı veri setini her zaman döndürme konusunda işlevsel olarak işlemez. Ancak, bahsettiğiniz gibi, boru yönü, işlevsel programlamanın nasıl yapılabileceğine benzer.


1
Gerçekten bir uçağınız var mı? ;) (offtopic yorum için üzgünüm)
BlackBear

@BlackBear Benim kişisel olanım değil. Kollektif olarak yaklaşık 50imizin 4 uçağa sahip olduğu bir kulüpteyim. Bu şekilde biraz daha uygun. :-)
Brian Knoblauch

@Brian Knoblauch: Gelecekte bir uçağa sahip olmak istiyorum .. paraya izin vermek: P
BlackBear

5
İşlevsel programlama "yan etki yok" anlamına gelmez. Aynı işlevin daima aynı sonucu ürettiği kavram "boşuna durma" olarak adlandırılır ve bir programın işlevsel olması için gerekli bir koşul değildir. Bu aynı zamanda "saf işlevsel" olarak da bilinir.

2

Bir ölçüde bunu söyleyebilirsin. Ancak bu mutlaka doğru değil. Basit bir tasarım anlayışı ile bunu 'daha fazlasını elde etme yeteneği' olarak okumalısınız. Basit olmak için, görevi kolayca anlaşılabilir ve montajı kolay parçalara bölmek zorunda kalacaksınız. Sizinle dürüst olmak gerekirse UNIX felsefesi aşağıdaki örnekle açıklanabilir.

Tüm programlama bir çeşit veri manipülasyonudur! Bazı durumlarda programlama da program manipülasyonunun kendisidir (Meta programlama). Şimdi UNIX felsefesinin işleyiş şekli, metin işlediğini düşünün. Metin nedir Metin sonuçta bir tür veridir. Organize tanımla birleştiğinde Metin ayrıca XML ve JSON'lara dönüşür. Metin ayrıca bir sayı listesi olabilir, Metin ayrıca csv, tsv ve de olabilir! Diğer Metin veya dizgiler, programlama bağlamının gerçekten büyük bir alanını temsil edebilir, çünkü içeriği bükülebilir ve istediklerimize dönüştürebilir!

Tüm programlama bir tür veri organizasyonu gerektirir. Düzenlemek aranıyor ...

a. Orada, sadece 'grep', 'fgrep' ve ailesi ile birlikte gidersiniz.

Bir kez arama yaptığınızda, bazı sıralama yapmanız gerekir.

b. Şimdi bunu yapmak için 'sort' komutumuz var.

İki dosyayı daha yeni sıraladınız, şimdi karşılaştırmak istiyorsunuz.

c. Şimdi bunu yapmak için 'fark', 'cmp' ve diğerleri var.

Az önce dosyalar arasında fark olmadığını farkettiniz. Artık daha fazla organize veriye ihtiyacınız var.

d. Bir dosyaya yazmak için 'kedi', borular ve yönlendirme operatörleri var.

Daha özel bir ayrıştırmaya ihtiyacınız var ..

e. Başın, kuyruğun, daha çok, daha az ...

Bunların hepsi '|' kullanarak dikin Hiç bir kod yazmadan zaman zaman gerçekten güçlü şeyler üretmek. Daha fazla arama ve dikiş için ..

f. awk, kabuk ve sed.

awk, shell ve sed, metin üzerinde size kesilenden daha fazla kontrol sağlar, diff et al. Hiç bu komutu merak ettiniz mi | komut2 | command3 ... series bir tür iş akışı mekanizmasıdır. If ile birleştirildiğinde bu daha güçlü hale gelir.

Şimdi daha eğlenceli geliyor.

'Perl' adında bir yardımcı programı daha önce hiç duydunuz mu , bu şey o kadar güçlüdür ki neredeyse hayal edebileceğiniz kadar az işle elinizde herhangi bir işi yapabilirsiniz. DBM gibi bir yardımcı programla birlikte dikildiğinde, uygulamanız için küçük zaman kalıcılığı taleplerini bile yapabilirsiniz. Unutmayın, metin dünyasından bile çıkmadık ama bir programlama ortamının birçok yönünü ele almayı başardık.

Bu yüzden UNIX'in bir işletim sisteminden daha fazlası olduğunu düşünüyorum. Sorunları en basit şekilde çözmek için tasarlanmış bir araç ve ortam koleksiyonudur. Basit bir yol, çözümün uygulanmasının basitliğini gerektirmez. Fakat sadeliğin kendisi sizi fazla uzağa götürmez.

Bunu bazı yerlerde redditte okudum.

"Tek tasarım hedefiniz sadelik ise, Plan9 kadar kullanıcı kazanacaksınız"


1

Komut satırında bir araya gelme ve birbirleriyle etkileşim kurma biçimleri çok işlevseldir. Bununla birlikte, bunun kabuğun tasarımıyla daha fazla, temel programların zorunlu olarak mı yoksa işlevsel olarak mı yazıldığından daha az ilgisi olduğunu söyleyebilirim. En iyi işlevsel diller, genel tasarımları işlevsel programlamaya katkıda bulunmasına rağmen, zorunlu / prosedürel kavramları desteklemektedir. Evet, UNIX kabuğunun özelliklerinin birçoğu, işlevsel kavramları kullanır, ancak yine de bunun nedeni, kabuğun tasarımı nedeniyle, temel programların belirli bir uygulamasından daha fazladır.

Bu yardımcı olur umarım,

-tjw

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.