C'den üst düzey dillerde öğrenilemeyen hangi ilkeler öğrenilir? [kapalı]


11

C'nin programlama arkasındaki ilkeleri öğrenmek için iyi bir dil olduğuna inanıyorum. Ruby gibi üst düzey dillerden "büyülenmiş" alt düzey dillerde öğrenmeye ne dersiniz?


2
Büyüyü ya da bir kısmını öğreniyorsun zaten. C "metale daha yakın" olduğu için metal hakkında daha fazla bilgi edinebilirsiniz.
Robert Harvey

1
C ++ ile karşılaşana kadar referans kavramını tam olarak anlamadım.
user6245072

6
C size bir yığın taşmasının gerçekte ne olduğunu öğretecektir. Zor yol.
david25272

1
Keşke yeni programcılar iyi eski Pascal ve yapılandırılmış programlama öğrenerek başlasınlar. Kendinizi mantıklı ve yapılandırılmış olarak ifade etmeyi öğrenirsiniz.
Bent

2
Sadece C ve C ++ 'nın size öğrettiği bir şey, derleyicinin en kötü düşmanınız olmasıdır.
CodesInChaos

Yanıtlar:


9

Bilgisayar biliminin genel soyut anlamında, C'de bulunan ve üst düzey dillerde de bulunmayan ilkeler yoktur. Tüm bilgisayar bilimleri algoritmalara dayanır ve tüm algoritmalar C gibi Turing-complete olan herhangi bir dilde uygulanabilir.

C'nin üst düzey dillerden ayırdığı fark, makine kodunun C'den ayırdığı farka benzer: Makinenin kodla ilişkisi.

Kodu üst düzey dillerde yazarken, kodunuzun makine ile nasıl etkileşimde bulunduğu (genellikle) ile ilgilenmezsiniz. Dilin kendisi için tanımladığı sanal makine, kod yürütmenin bu yönlerinin çoğunu gizler.

C'de programınızın bellekle etkileşimi ön planda tutulur. Yığın kullanımınızı yönetmek zorunda olmanızdan daha fazlasıdır, kodunuzun yığınla etkileşimini ve kodunuzun sadece belleğe erişiminin kodunuzun davranışını ve performansını nasıl etkilediğini içerir - bellek erişim sırasını bile. dikkatinizi kaçmasına izin verilebilir, çünkü yanlış zamanda yanlış belleği okumak performansı etkili bir şekilde sakatlayabilir.

Üst düzey dillerde, bu şeyler açıkça o kadar açık değildir. Bellek, sizin bilginiz olmadan ve bazen de size sorulmadan tahsis edilir ve dağıtılır. Çoğu zaman, bu sadece kontrolünüz dışındadır. Bellek ayırma işlemlerinin çoğu, ne zaman, nerede, nasıl ve neden sizden gizlenir.

Benzer şekilde, diğer yönde, makine kodu veya montaj kodu yazmak, ön plana daha fazla ayrıntı getirir: Neredeyse hiçbir şey düşünmenizin dışında bırakılmaz ve kodunuz her tahsis, her kaynak, geçen her veri parçasının farkında olmalıdır. CPU'nun kayıtları aracılığıyla - yüksek seviye dillerden gizli olarak çıkarılacak bilgiler.


6
İnsanların neden bu tür tartışmalarda Turing-tamlığından bahsettiklerini tam olarak anlamadım. Turing-bütünlüğü bu bağlamda anlamlı değildir; C yüzden bir şeyi tartışırken zaman sadece zaman Turing-tamlığı alakalı hale gelir C 'ye geçiş yaparak Turing-tamlığı konusunda öğrenilmesi gereken bir şey yok, bu açıdan diğer programlama dilleri farklı değildir değil CSS veya HTML gibi Turing tamamlama, . Cehennem, eğer yeterince sert bir şekilde şaşıyorsan, o bile Turing tamamlandı . Daha anlamlı sorular kullanılabilirliğe
Robert Harvey

3
@RobertHarvey Demek istediğim, bir dilin makul bir hesaplama kapasitesi minimum olduğu sürece, onun "seviyesi", bu bağlamda önemli olan tek şey olan algoritmalar açısından önemsiz hale gelir.
greyfade

3
Çünkü OP'nin sorusuyla tamamen alakasız bir noktaya değiniyorsunuz. Programcılar bunu her zaman yapar; "Turing-complete" ifadesini, aslında pratikte bazı anlamlı kullanımları olduğu gibi atıyorlar. Önemli olmadığını belirtmek dışında önemli değil.
Robert Harvey

2
<irony> Biyoloji, parçacık fiziğinin özel bir örneği olan özel bir kimya örneğidir. Parçacık fiziğini biliyorsanız biyolojiden öğrenebileceğiniz hiçbir şey yoktur. </irony>
Florian F

3
C'nin sadece tahsisleri ve anlaşmaların açık olmasını gerektirdiğini belirtmek gerekir, ancak yine de "daha üst düzey" dillerde olduğu gibi soyut bir makineyle ilgilidirler - fiziksel (örneğin) x86 makinesi hala C'nin kapsamı dışındadır. C kodunu yorumlayan ancak fiziksel makinenin bellek ayırmaları üzerinde hiçbir kontrolü olmayan mükemmel bir korumalı sanal makine yapabilir ve yine de% 100 uyumlu bir uygulama olabilir.
Theodoros Chatzigiannakis

13

C'nin programlama arkasındaki ilkeleri öğrenmek için iyi bir dil olduğunu biliyorum.

Katılmıyorum. C, programlamanın ardındaki ilkeleri öğrenmek için çok fazla özellik yoktur. C'nin soyutlamalar yaratma özellikleri korkunçtur ve soyutlama, programlamanın ardındaki temel ilkelerden biridir.

Donanımın nasıl çalıştığını ve dolayısıyla makine için bazı mekanik sempati duymayı öğrenmek istiyorsanız, makine kodunu, yani talimat seti mimarisini öğrenmeli ve ayrıca modern CPU'ların önbellek yapısını incelemelisiniz. Montaj dilini önermediğimi unutmayın, sadece donanım talimatlarını anlayın, böylece bir derleyicinin ne ürettiğini anlarsınız.

Programlama ilkelerini öğrenmek istiyorsanız, Java, C # veya Swift gibi modern bir dil veya Rust gibi düzinelerce dilden birini kullanın. Ayrıca, fonksiyonel de dahil olmak üzere farklı programlama paradigmalarını inceleyin.


12
C soyutlamalar yaratmada gayet iyi. C'de yöntemler yazabilir ve verileri C'de yapılar olarak paketleyebilirsiniz. Tüm işletim sistemleri C kullanılarak oluşturulmuştur. C'nin iyi olmadığı şey, herkesin nesne yöneliminin neye benzemesi gerektiği hakkındaki "modern" fikrini tatmin etmektir. sevmek.
Robert Harvey

4
Pek değil. C, ASM'den biraz daha yüksek bir seviyedir. Çok eğimli iseniz, sınıfları kullanmayı beklemeyin, ancak bunu yapmanın yolları vardır .
Robert Harvey

4
Yorumunuzda "montajcı" yerine "Brainfuck" yazın ve yine de doğru olmalıdır. Ama bu yakın zamanda Brainfuck kullanacağım anlamına gelmiyor.
Robert Harvey

6
C'nin özellikleriyle ilgili argümanınız gerçekten sadece sınıfların (ve çöp toplama vb.) Yeni bir programcı (ki bilmiyorum) öğretmenin gerekli bir unsuru olduğuna inanıyorsanız haklıdır. Burada hiç kimse sınıfları sınıfsız bir dilde kullanmayı denemiyor.
Robert Harvey

5
@Robert, benim argümanım, C'nin daha düşük bir dil olduğu ve bu nedenle, montajcı hakkında da söyleyebileceğimiz programlama ilkelerini anlamak için en iyi dil olmadığı ve sadece daha düşük seviyeli diller oldukları anlamına gelmiyor. programlamanın "gerçek" ilkelerine bir şekilde daha yakınlar. Bu diller, donanım ve işletim sistemlerinin nasıl çalıştığını anlamakta daha iyidir ve eğer ilgi bu ise, eğitim seti mimarisini ve makine dilini öğrenme konusunda en düşük seviyeye atlamayı öneririm. Aksi takdirde, aralarından seçim yapabileceğiniz birçok dil vardır.
Erik Eidt

8

C ve (Soyut) Makine

Çoğu programlama dili soyut makineler olarak tanımlanmaktadır. Daha sonra, derleyiciler, bağlayıcılar, montajcılar, tercümanlar, statik analizörler, ara diller ve donanım gibi, bir program tarafından gözlemlendiği gibi, soyut makinenin en azından beklenen tüm davranışlarını onurlandıran bir sonuç üretecek araçlar kümesi kullanılarak uygulanır. .

C, yukarıdaki kuralın bir istisnası değildir. Gerçek donanımınız hakkında hiçbir fikri olmayan soyut bir makine olarak tanımlanmıştır.

Bu nedenle, insanlar C'nin size bilgisayarınızın gerçekte nasıl çalıştığını öğrettiğini söylediklerinde, genellikle bunun anlamı C'nin C'nin nasıl çalıştığını öğretmesidir. Ancak C, sistem programlamasında çok yaygın olduğu için, birçok insanın bilgisayarı kendisiyle karıştırmaya başlaması anlaşılabilir. Ve kişisel olarak, C'nin nasıl çalıştığını bilmek, bilgisayarın nasıl çalıştığını bilmekten daha önemli olduğunu söyleyebilirim.

Ama yine de, C ve bilgisayar olan farklı şeyler. Gerçek donanım aslında karmaşıktır - C özelliklerinin bir çocuk kitabı gibi okunmasını sağlayan şekillerde. Donanımınızın nasıl çalıştığıyla ilgileniyorsanız, her zaman bir kılavuz arayabilir ve bir montajcıya kod yazmaya başlayabilirsiniz. Veya dijital devreleri öğrenmeye her zaman başlayabilirsiniz, böylece bazı donanımları kendi başınıza tasarlayabilirsiniz. (En azından, C seviyesinin ne kadar yüksek olduğunu takdir edeceksiniz.)

Nasıl öğrendin? Ve nasıl yok sen öğrenmek?

Tamam, aslında donanımı öğrenmek C'den başka şeyler içeriyor. Fakat C bugün programcılara başka bir şey öğretebilir mi?

Sanırım buna bağlı.

  • Bir kavramı , onu sunan ve onu teşvik eden bir ortamda çalışarak, genellikle birden çok şekilde daha iyi öğrenebileceğinizi söyleyenler var .
  • Bir kavramı , onu sunmayan bir ortamda çalışarak daha iyi öğrenebileceğinizi ve bunun yerine kendiniz inşa etmeniz gerektiğini söyleyenler var.

Bu olasılıklardan birini seçmek için çok hızlı olmayın. Uzun yıllardır kod yazıyorum ve hangisinin doğru cevap olduğu ya da doğru cevabın sadece ikisinden biri olup olmadığı ya da bu konuda doğru cevap diye bir şey olup olmadığı hakkında hala bir fikrim yok.

Her iki seçeneği de muhtemelen onları tanımladığım sıraya göre gevşek bir şekilde uygulamanız gerektiğine inanmaya meyilliyim. Her insan önemli ölçüde farklı şekillerde öğreniyor gibi görünüyor.

Sadece C

Yukarıdaki soruyu en azından önerdiğim ikinci seçeneği dahil ederek cevapladıysanız, kemerinizin altında zaten birkaç cevabınız var: daha yüksek seviyeli dillerde öğrenilebilecek her şey, C veya en az, karışıma C ilave edilerek genişletilir.

Ancak, cevabınıza bakılmaksızın, neredeyse sadece C'den (ve belki de bir avuç diğer dilde) öğrenebileceğiniz birkaç şey var.

  • C tarihsel olarak önemlidir. Bu, nereden geldiğimizi değerlendirip takdir edebileceğiniz ve nereye gittiğimiz hakkında belki biraz daha fazla bağlam elde edebileceğiniz bir kilometre taşıdır. Belirli sınırlamaların neden var olduğunu ve bazı sınırlamaların kaldırıldığını takdir edebilirsiniz.

  • C size güvenli olmayan ortamlarda çalışmayı öğretebilir. Başka bir deyişle, dil (herhangi bir dil) sizin için, herhangi bir nedenle yapamadığında veya yapmayacağınızda sırtınızı izlemeniz için sizi eğitebilir. Bu, güvenli ortamlarda bile sizi daha iyi bir programcı yapabilir, çünkü kendi başınıza daha az hata üreteceksiniz ve aksi takdirde güvenli programınızdan biraz daha fazla hız almak için güvenliği geçici olarak kapatabileceğiniz için (örn. İşaretçilerin kullanımı) C #), güvenliğin bir çalışma zamanı maliyeti ile geldiği durumlarda.

  • C, her nesnenin depolama gereksinimlerine, bir bellek düzenine, belleğe sınırlı bir adres alanı üzerinden erişilebileceği gerçeğine sahip olduğunu öğretebilir. Diğer dillerin bu konularda dikkatinize ihtiyacı olmasa da, edinilmiş bazı sezgilerin daha bilinçli kararlar vermenize yardımcı olabileceği birkaç durum vardır.

  • C, bağlantı sistemi ile bağlantı ve nesne dosyaları ve diğer karmaşıklıkların ayrıntılarını size öğretebilir. Bu, yerel olarak derlenmiş bir programın genellikle kaynak koddan yürütmeye nasıl geçtiğine dair kullanışlı bir pratik anlayış sağlayabilir.

  • C, tanımlanmamış davranış kavramı ile zihninizi yeni şekillerde düşünmeye zorlayabilir. Tanımsız davranış, yazılım geliştirmedeki en sevdiğim kavramlardan biridir, çünkü klasik olmayan derleyiciler üzerindeki etkilerinin incelenmesi, diğer dillerden tam olarak alamadığınız benzersiz bir zihinsel egzersizdir. Ancak, deneme yanılma özelliğini reddetmeniz ve bu yönü tam olarak takdir edebilmeniz için dili dikkatli ve kasıtlı bir şekilde incelemeye başlamanız gerekir.

  • Ancak belki de C'nin size küçük bir dil olarak verebileceği en önemli fark, tüm programlamanın veri ve işlemlerle sınırlı olduğu fikridir . Şeylere hiyerarşili modüler sınıflar ve sanal gönderimli arayüzler veya saf matematiksel işlevler kullanılarak işletilen zarif değişmez değerler olarak bakmak isteyebilirsiniz. Her şey yolunda - ama C size her şeyin sadece veri + işlemler olduğunu hatırlatacak . Yararlı bir zihniyet, çünkü birkaç zihinsel engeli azaltmanıza izin veriyor.


5

C'nin öğrenme için iyi olmasının nedeni, herhangi bir prensibi öğretmesi değildir . Size, işlerin nasıl çalıştığını öğretir .

C, sadece sürmek için inşa edilmiş 70 veya 80'lerin eski arabalarından biriyle karşılaştırılabilir. Onları parçalayabilir, vidalayarak vidalayabilir ve her parçanın nasıl çalıştığını ve bakmak için ellerinizde alabileceğiniz diğer parçalarla nasıl çalıştığını anlayabilirsiniz. Tüm parçaları anladıktan sonra, bütünün nasıl çalıştığını çok net bir şekilde görebilirsiniz.

Modern diller, motorun temelde bir kara kutu olduğu modern bir araba gibidir, ortalama bir araba sahibi tarafından anlaşılamayacak kadar karmaşıktır. Bu arabalar çok şey yapabilir, heck, bu günlerde aktif olarak kendi başlarına sürmeyi öğreniyorlar. Bu karmaşıklık ve rahatlıkla, kullanıcı arayüzü motorda olup bitenden çok daha uzağa taşındı.

C'de programlamayı öğrendiğinizde, bir bilgisayarın yapıldığı birçok vida ve somunla temas edersiniz. Bu, makinenin kendisini anlamanıza olanak tanır. Örneğin, böyle uzun bir dize oluşturmanın neden iyi bir fikir olmadığını anlamanıza izin verir:

java.lang.String result = "";
for(int i = 0; i < components.size; i++) {
     result = result + components[i];
};

(Umarım, bu doğru Java, bir süredir kullanmadı ...) Bu kod örneğinden, döngü neden ikinci dereceden karmaşıklığı olduğu açık değildir. Ancak durum böyledir ve birleştirilecek birkaç milyon küçük bileşene sahip olduğunuzda bu kodun öğütme durmasına neden olmasının nedeni budur. Deneyimli C programcısı sorunun nerede olduğunu anında bilir ve büyük olasılıkla bu kodu ilk etapta yazmaktan kaçınır.


Tamamen katılıyorum. C size işlerin nasıl çalıştığı hakkında çok şey öğretecek, bu da a) daha yüksek seviyeli dillerin neden yazıldığını (örn. Soyutlamak istedikleri) ve b) bu ​​yüksek seviyeli dillerin perde arkasında nasıl çalıştığını, kesinlikle iyi bilgiye sahip olmak. İlkeleri öğretmez ve o kadar kolay olmayabilir, ancak ona saygı duyulur, bilgisayarlar ve sonuç olarak daha üst düzey dilleri daha iyi anlarsınız. Ayrıca Joel Spolsky
jleach

1
Cevabınız kesinlikle iyi, ancak for(int i = 0; i < strlen(s); i++)C'de yazarsanız , döngü de ikinci dereceden karmaşıklığa sahip olacak ve Java örneğinizdeki kadar açık değil ;-)
Doc Brown

Emin değilim, ama bunu
optimize

Deneyimli Java programcısı da sorunun nerede olduğunu anında bilir ve muhtemelen bu kodu ilk etapta yazmaktan kaçınır. Bu özel konu temel Java derslerinde tartışılmıştır. Yani bu kesinlikle C'den öğrenilebilecek bir şey değil, Java'dan öğrenilemez.
Peter Taylor

@PeterTaylor C'yi bilen bir Java eğitmeniniz varsa, evet. Fakat C'yi bilen insanlar öldükten sonra bu tür bilgilerin etrafta kalacağından şüpheliyim. C programcısı için, kod örneğimin etkili olamayacağını söyleyen bir C-dizesinin ne olduğunun tam tanımıdır. Java programcısı için, kullandıkları soyutlamalar hakkında derin, gizli ve az kullanılan bilgilerdir, bu da onlara bu tür kodlardan kaçınmalarını söyler. Tamam, burada biraz abartıyorum, ama fikri anlıyorsunuz: C programcısı bunu bilmeli, Java programcısı bilmeden kurtulabilir.
cmaster - eski haline monica

2

"Programlamanın ardındaki ilkeleri", özellikle teorik ilkeleri öğrenmek için C'den daha iyi diller vardır, ancak C, el işi ile ilgili bazı pratik, önemli şeyleri öğrenmek için iyi olabilir. greyfade'ın cevabı kesinlikle doğrudur, ancak IMHO, C'den öğrenebileceğiniz, hafızayı kendiniz nasıl yöneteceğinizden daha fazlasını öğrenebilirsiniz. Örneğin,

  • istisnalar olmadan tam bir hata işleme ile programlar nasıl oluşturulur

  • nesne yönelimi için herhangi bir dil desteğine sahip olmadan bir programda yapı nasıl oluşturulur

  • dinamik büyük boyutlu listeler, sözlükler veya faydalı bir dize soyutlaması gibi veri yapılarının yokluğunda verilerle nasıl başa çıkılacağı

  • derleyici veya çalışma süresi ortamı sizi otomatik olarak uyarmasa bile dizi taşmaları gibi yaygın hatalardan nasıl kaçınılır

  • şablonlar veya jenerikler için dil desteği olmadan jenerik çözümler nasıl oluşturulur?

  • ve tabii ki hafızayı kendiniz nasıl yöneteceğinizi öğrenebileceğinizden bahsetmiş miydim? ;-)

Dahası, C öğrenerek, C ++, Java, C #, Objective C'nin sözdizimsel ortaklıklarının nereden geldiğini öğreneceksiniz.

2005 yılında Joel Spolsky, daha yüksek seviyedeki herhangi bir dilden önce C öğrenmek için bir tavsiye yazdı . Argümanları

  • "hiçbir zaman üst düzey dillerde etkin kod oluşturamazsınız."

  • "En iyi programlama işlerinden bazıları olan derleyiciler ve işletim sistemleri üzerinde asla çalışamayacaksınız."

  • "Büyük ölçekli projeler için mimariler oluşturmaya asla güvenilmeyeceksiniz"

  • " while(*s++ = *t++);bir dizeyi neden kopyaladığını açıklayamıyorsanız ya da bu size dünyadaki en doğal şey değilse, batıl inanca dayalı olarak programlıyorsunuz

Elbette, yazdığı şey kesinlikle tartışmalıdır, ancak IMHO'nun birçok argümanı bugün hala geçerlidir.


1
C, "C'nin desteklemediğini düşündüğünüz daha üst düzey şeyleri" öğrenmeden önce öğrenmek için çok iyi bir dildir, çünkü bu şeylerin gerçekte nasıl çalıştığını (ve ne kadar pahalı olduklarını) anlamanıza yardımcı olur.
Brendan

@Brendan: Yorumunuzun amacının bir anlaşmayı, bir anlaşmazlığı mı yoksa cevabımın bir sidenotunu mu ifade edeceğinden emin değilim.
Doc Brown

Profesyoneller tarafından yazılan C programları, arabellek taşmaları ve sert çökmelerle yayımlanır. Dolayısıyla, disiplinli bir programcı bunları öğrenmeyi seçse de, C dili yalnızca yoksullaşarak öğretmez . Örneğin, istisnasız hata işleme ve nesneler olmadan yapı oluşturma için birçok kötü yol vardır (ve daha kötüsü, birden fazla tutarsız yolu karıştırmak).
Erik Eidt

@ErikEidt: gerçekten, ama özellikle C ekosisteminde, bu konularla ilgilenecek birçok kitap, öğretici ve diğer materyaller var. Örneğin, Steve Maguire tarafından yazılan "Katı Kod Yazma" Elbette, birisi dil sözdizimini öğrenmek için K & R'nin ilk baskısını seçerse, muhtemelen daha iyi bir programcı olmayacaktır.
Doc Brown

1

Hesaplamanın iki temel soyutlaması Turing makineleri ve Lambda hesabıdır ve C Turing makinesi hesaplama görünümü ile denemenin bir yoludur: çoğunlukla istenen bir sonuç ortaya çıkaran düşük seviyeli eylemlerin ardışıklığı. Ancak, C'nin kendi hesaplama modeliyle geldiğini unutmamalısınız. Böylece, C öğrenmek size gerçek mimarilerden oldukça farklılaşan C soyut makinenin düşük seviyeli ayrıntılarını öğretecektir. C'de öğretilen ilk şeylerden biri, derlemeyi "zeki" numaralar uygulayarak zekice yüceltmemekti ve trendin derleyicilerdeki gittikçe daha fazla optimizasyon yönünde olduğu anlaşılıyor. Diğer yüksek seviyeli dillerde olduğu gibi, C dilinde yazdığınızda, derleyiciler soyut C makinesinde ne yapmayı beklediğinizi anlar ve bunu gerçek donanımda gerçekleştirir,

Demek istediğim, C öğrenmenin, aslında donanımda gerçekte ne olduğunun iyi bir resmini vermeyeceği. "C makineye yakındır", "çoğu üst düzey dilden daha yakın" olarak anlaşılmalıdır. Eğer "nasıl çalıştığını" daha doğru bir şekilde görmek istiyorsanız, yazılım mimarisini doğrudan öğrenmek daha faydalı olacaktır.

Öte yandan, C öğrenimi sistem programlaması, düşük seviye türleri, işaretçiler ve özellikle de bellek tahsisi hakkında bilgi verebilir. Öğrenme algoritmalarına ve veri yapısına gelince, onları diğer dillerde değil de C'de öğrenmenin bir avantajı yok.


1
Peki, C size daha üst düzey dillerin yapamayacağını nasıl öğretebilir?
Philip Kendall

2
Bence örtük cevap: " Hiçbir şey , en azından savunucuların iddia ettikleri şeyler değil". Zaten cevabı böyle anlıyorum.
Jörg W Mittag

-3

Çok açık uçlu bir soru, kesin bir cevap veremezsiniz. Dil çerçevesinin iç kısımlarını anlamanız koşuluyla her dilde hemen hemen her şeyi öğrenebilirsiniz. C sizi daha düşük ayrıntıları anlamaya zorlar, çünkü öncelikle bir işletim sistemi yazmak için tasarlanmıştır. Yıllar sonra bile, öncelikle gömülü sistemler ve açık kaynak projeleri sayesinde hala en çok kullanılan dillerden biri. Peki, soru ne öğrenmek istiyorsun? Peki hangi alanda?

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.