“İşlev” ve “prosedür” arasındaki fark nedir?


204

Genel olarak konuşursak, hepimiz programlama dillerindeki işlevleri veya prosedürleri duyarız . Ancak, bu terimleri neredeyse birbirinin yerine kullandığımı öğrendim (muhtemelen çok yanlış).

Benim sorum şu:

İşlevleri, amaçları ve kullanımları arasındaki fark nedir?

Bir örnek takdir edilecektir.



6
Bence SICP bunu doğru yapıyor. Fonksiyonlar sadece matematikte bulunur ve bilginin ne olduğunu temsil eder . Prosedürler programlama dillerinde (fonksiyonel diller dahil) mevcuttur ve nasıl öğrenileceğini temsil eder . İşlev : sqrt (x) = y, y ^ 2 = x olacak şekilde. Prosedür : (define (sqrt x) (newtons-method (lambda (y) (- (square y) x)) 1.0)).
mk12

Yanıtlar:


297

Bir işlev bir değer döndürür ve bir prosedür sadece komutları yürütür.

Ad işlevi matematikten gelir. Girişe dayalı bir değer hesaplamak için kullanılır.

Yordam, sırayla yürütülebilen bir komut kümesidir.

Çoğu programlama dilinde, fonksiyonların bile bir dizi komutu olabilir. Dolayısıyla, fark sadece bir değer bölümü döndürmektir.

Ancak bir işlevi temiz tutmak istiyorsanız (sadece işlevsel dillere bakın), bir işlevin yan etkisi olmadığından emin olmanız gerekir.


Zorunlu (java, c) veya bildirici bir dilde (scala, şema) hiçbir yan etkiyi nasıl sağlayamazsınız?
orlybg

1
@orlybg, bildirim dillerinde tutarlılık, dilin uygulanmasından gelir. Kapsam kısıtlamaları yan etkilere sahip olmalarını önler. Diğer yandan, zorunlu diller yan etkilerinden açıkça yararlanmaktadır. Yan etkiler her zaman kötü değildir.
Tharindu Rusira

Aşağıdaki Ada öğreticisini ( goanna.cs.rmit.edu.au/~dale/ada/aln/8_subprograms.html ) okuyorum , bu sayfanın ikinci paragrafı "Ada'daki prosedürler Pascal'dakilere benzer Msgstr "Bir prosedür, iade ifadeleri içerebilir." Bu metinde bir hata mı var? Yoksa bunun iade ifadeleri olabileceği, ancak herhangi bir değer döndürmediği anlamına mı geliyor?
jviotti

3
Pascal'de, yordamların dönüş ifadeleri yoktur, yalnızca işlevler vardır. Metinde bir hata olmalı. Ancak, bir yordam bağımsız değişkenler olmadan bir "return" deyimi olarak işlev görebilen "return" deyimine sahip olabilir, bu da getiri değeri anlamına gelmez.
Eric Fortier

işlevi girdi alabilir ve yalnızca bir çıktı döndürebilir. yordam veya makro girdi alabilir ve herhangi bir veri döndürmez yalnızca ifade sayısını yürütür. ana fark prosedürü herhangi bir veri türü döndüremezsiniz.
EsmaeelE

42

Bu bağlama bağlıdır.

Pascal benzeri dillerde, işlevler ve yordamlar, bir değer döndürüp döndürmemelerinden farklı olan farklı varlıklardır. Farklı davranırlar. dil sözdizimi (ör. yordam form deyimlerini çağırır; bir ifade içinde yordam çağrısı kullanamazsınız; işlev çağrıları form ifadeleri oluşturmaz, bunları diğer ifadelerde kullanmalısınız). Bu nedenle, Pascal tarafından yetiştirilen programcılar bunlar arasında ayrım yapar.

C benzeri dillerde ve diğer birçok çağdaş dilde bu ayrım ortadan kalkmıştır; statik olarak yazılan dillerde, prosedürler sadece komik bir dönüş türüne sahip işlevlerdir. Muhtemelen bu yüzden birbirlerinin yerine kullanılırlar.

İşlevsel dillerde, genellikle bir prosedür diye bir şey yoktur - her şey bir işlevdir.


ve programlama dillerinin dokümantasyonu istediği gibi fonksiyon ve prosedürleri çağırabilir, çünkü insanlar bu isimlerin arkasındaki arka plan uzun zaman önce yıkandığı için herhangi bir ismi kabul edeceklerdir.
Arne Babenhauserheide

18

C ile Örnek:

// function
int square( int n ) {
   return n * n;
}

// procedure
void display( int n ) {
   printf( "The value is %d", n );
}

Her ne kadar C Standardının prosedürler hakkında konuşmadığına dikkat etmelisiniz, sadece işlevler.


4
... C Standardı prosedürlerden bahsetmiyor, sadece fonksiyonlardan bahsediyor. Çünkü sadece işlevleri vardır. Hiçbir şey döndürmeyen bir işlev bir void function. Kernighan & Ritchie Ch 1.7: "C'de bir işlev, Fortran'daki bir alt rutine veya işleve veya Pascal'daki bir yordama veya işleve eşdeğerdir." Başka bir deyişle ... bu cevap yanlış.
Mogsdad

8
Cevap yanlış değil ve saf işlevler ve prosedürler arasındaki farkın iyi bir örneğidir. K&R, her alt rutini işleri basit tutmak için bir "işlev" olarak adlandırdı, ancak yan etkileri olan bir alt rutin aslında bir "prosedür", matematiğin kanonik anlamında bir "işlev" değil. C, gerçek fonksiyonları prosedürlerden ayırırsa daha iyi bir dil olabilir, bu statik analiz, performans optimizasyonu ve paralelleştirmeye yardımcı olur.
Sam Watkins

12

Genel olarak, bir prosedür bir talimatlar dizisidir.
Bir işlev aynı olabilir, ancak genellikle bir sonuç döndürür.


11

Bir terim var altyordamı veya alt program farklı yerlerden çağrılabilir kod parametreli bir parça anlamına gelir.

Fonksiyonlar ve prosedürler bunların uygulamalarıdır. Genellikle işlevler dönüş değerleri ve prosedürler hiçbir şey döndürmez.


6

Temel Farklılıklar

  • Bir İşlev bir değer döndürmelidir, ancak Saklı Yordamlarda isteğe bağlıdır: bir yordam 0 veya n değerleri döndürebilir .
  • Fonksiyonlar sadece girdi parametrelerine sahipken, prosedürler girdi / çıktı parametrelerine sahip olabilir.
  • Bir İşlev için bir giriş parametresi almak zorunludur, ancak bir Saklı Yordam 0 ila n giriş parametresi alabilir.
  • Fonksiyonlar bir Prosedürden çağrılabilirken, Prosedürler bir Fonksiyondan çağrılamaz.

Gelişmiş Farklar

  • İstisnalar, bir Prosedürde try-catch blokları ile ele alınabilirken, bir Fonksiyonda try-catch bloğu kullanılamaz.
  • Bir İşlemde İşlem Yönetimi'ne gidebiliriz, oysa bir Fonksiyonda yapamayız.

SQL'de:

  • Bir Prosedürü verir SELECT(DML yanı sıra INSERT, UPDATE,DELETE Fonksiyon sadece verir, oysa o) ifadeleri SELECTiçinde deyimi.
  • Prosedürler bir SELECT deyimde , İşlevler bir SELECTdeyime gömülebilir .
  • Saklı Yordamlar SQL ifadelerinde bir WHERE(veya birHAVING veya a SELECT) bloğunun , İşlevler de kullanılabilir.
  • Tabloları döndüren işlevler başka bir Satır Kümesi olarak ele alınabilir. Bu birJOIN diğer tablolarla birlikte blokta .
  • Satır İçi İşlevler parametre alan görünümler olarak düşünülebilir ve JOINbloklarda ve diğer Satır Kümesi işlemlerinde kullanılabilir.

3
Bu soru dile özgüdür, ancak soru dile bağlı değildir. Buradaki ifadelerin hepsi genel durumda doğru değildir, ancak iddia ettiğiniz dili veya ortamı açıklığa kavuşturmak yararlı olacaktır.
Mogsdad

5

Daha doğrusu, f işlevi x = y ise f (x) = f (y) özelliğine uyar, yani aynı argümanla her çağrıldığında aynı sonucu (ve böylece sistemi.)

Böylece, rand () veya print ("Merhaba"), vb. Fonksiyonlar değil prosedürlerdir. Sqrt (2.0) bir işlev olsa da: ne kadar sık ​​çağırırsa görsün gözlemlenebilir bir etki ya da durum değişikliği yoktur ve her zaman 1,41 ve bazılarını döndürür.


3
Bu kullanım "fonksiyonel" programlama bağlamında geçerlidir. Alt programlarına "işlev" adını veren birçok (genellikle zorunlu) dilin bu özelliği gerektirmediğini unutmayın.
dmckee --- ex-moderatör kedi yavrusu

1
Programlama dillerinin bu özelliği gerektirdiğini söylemedim. Her neyse, herhangi bir dilde sıkı işlevler yazabilirim ve temiz işlevlerde mümkün olduğunca programlamanın iyi bir alışkanlık olduğunu hissediyorum, ardından parçaları bazı ana prosedürlerle yapıştırın.
Ingo

4

Burada dil bilincimiz yoksa prosedür genellikle güvenilir ve kasıtsız olarak belirli bir sonuç elde etmek için gereken bir dizi eylemi belirtir. Yani, bir prosedür temel olarak bir algoritmadır.

Öte yandan işlevler, daha büyük bir programda bir şekilde bağımsız bir kod parçasıdır. Başka bir deyişle, fonksiyon bir prosedürün uygulanmasıdır.


4

Bu iyi bilinen eski bir soru, ancak modern programlama dili araştırması ve tasarımı hakkında daha fazla bilgi paylaşmak istiyorum.

Temel cevap

Geleneksel olarak ( yapılandırılmış programlama anlamında ) ve gayri resmi olarak, bir prosedür "girdi" ye sahip olmak ve programlanabilir bir şey yapmak için yeniden kullanılabilir bir yapısal yapıdır. Bir yordam içinde bir şey yapılması gerektiğinde , kaynak kodda kodlanmış bir yordam çağrısında yordama (gerçek) bağımsız değişkenler (genellikle bir tür ifadede) ve yordamlar gövdesinde kodlanmış eylemler (sağlanan prosedürün tanımında) argümanların (resmi) parametrelere ikame edilmesi ile yürütülecektir. vücutta kullanılan .

Bir işlev bir yordamdan daha fazlasıdır, çünkü dönüş değerleri ayrıca gövdede "çıktı" olarak da belirtilebilir. İşlev çağrıları, işlev çağrılarının sonucunu sözdizimsel olarak da (genellikle başka bir ifadenin alt ifadesi olarak) kullanabilmeniz dışında, yordam çağrılarıyla aşağı yukarı aynıdır.

Geleneksel olarak, hiçbir çağrı ilgilenmemesi gerektiğini belirtmek için prosedür çağrıları (fonksiyon çağrıları yerine) kullanılır ve çağrının opsiyonsuz olmasını önlemek için yan etkiler olması gerekir , böylece zorunlu programlama paradigması vurgulanır . Pascal gibi birçok geleneksel programlama dili, bu kasıtlı stil farkını ayırt etmek için hem "prosedürler" hem de "fonksiyonlar" sağlar.

(Açıkça belirtmek gerekirse, yukarıda belirtilen "girdi" ve "çıktı" işlevlerin sözdizimsel özelliklerine dayanan basitleştirilmiş kavramlardır. Birçok dil, çağrılar sırasında bağımsız değişkenlerle kodlanan bilgileri taşıyan kullanıcıların izin vermesi için ek olarak referans / paylaşım yoluyla parametrelere geçişi destekler. Bu tür bir parametre sadece "giriş / çıkış parametresi" olarak da adlandırılabilir. Bu özellik, çağrılarda iletilen nesnelerin doğasına dayanır ve bu işlem / işlev özelliğinin özelliklerine diktir.)

Ancak, bir işlev çağrısının sonucu gerekli değilse, sadece (en azından mantıksal olarak) göz ardı edilebilir ve işlev tanımları / işlev çağrıları bu şekilde prosedür tanımları / prosedür çağrılarıyla tutarlı olmalıdır. C, C ++ ve Java gibi ALGOL benzeri diller, hepsi "işlev" özelliğini şu şekilde sağlar: sonuç türünü kodlayarakvoid geleneksel prosedürlere benzeyen özel bir işlev durumu olarak "yordamlar" özelliğini sağlamaya gerek yoktur " ayrı ayrı. Bu, dil tasarımında bazı şişkinlikleri önler.

SICP'den bahsedildiği için, R n RS tarafından belirtilen Şema dilinde , bir prosedürün hesaplamanın sonucunu döndürmesi gerekebileceği veya gerekmeyebileceği de belirtilmelidir. Bu, geleneksel "işlev" (sonucu döndüren) ve "prosedür" (hiçbir şey döndürmeyen), temelde birçok ALGOL benzeri dilin "işlev" kavramı ile aynıdır (ve aslında, çağrıdan önce işlenenler). Bununla birlikte, SRFI-96 gibi normatif belgelerde bile eski moda farklılıkları devam etmektedir .

Diverjansın arkasındaki kesin nedenler hakkında fazla bir şey bilmiyorum, ancak yaşadığım gibi, dil tasarımcıları günümüzde şartname kabarcığı olmadan daha mutlu olacak gibi görünüyor. Yani, bağımsız bir özellik olarak "prosedür" gereksizdir. voidTip gibi teknikler , yan etkilerin vurgulanması gereken yerleri işaretlemek için zaten yeterlidir. Bu, birkaç on yıldan fazla popüler olan C benzeri diller hakkında deneyimleri olan kullanıcılar için de daha doğaldır. Dahası, R n gibi durumlarda utanmayı önler "prosedürleri" aslında geniş anlamıyla "işlevleri" olan RS.

Teoride, sonucun özel olduğunu göstermek için fonksiyon çağrısı sonucunun türü olarak, belirtilen birim tipinde bir fonksiyon belirtilebilir. Bu, geleneksel prosedürleri (bir çağrının sonucunun ilgisiz olduğu durumlarda) diğerlerinden ayırır. Bir dilin tasarımında farklı stiller vardır:

  • R n'de olduğu gibi RS'de olduğu gibi, sadece ilgisiz sonuçları "belirtilmemiş" değer olarak işaretlemek (dilin belirtilmesi gerekiyorsa belirtilmemiş tipte) ve göz ardı edilmesi yeterlidir.
  • Özel bir birim türü değeri olarak ilgisiz sonucu belirtme (örneğin Kernel 'ın#inert ) da çalışır.
  • Bu tür başka bir alt tür olduğunda , (umarım) statik olarak doğrulanabilir ve bir ifade türü olarak kullanılması önlenebilir. voidALGOL benzeri dillerde tipi tam olarak bu tekniğin bir örneğidir. ISO C11'ler _Noreturnbenzer ancak daha incelikli.

daha fazla okuma

Matematikten elde edilen geleneksel kavram olarak, çoğu insanın bilmediği tonlarca kara büyü var . Kesin olarak, matematik kitaplarınıza göre her şeyi netleştirmeyeceksiniz. CS kitapları da pek yardımcı olmayabilir.

Programlama dilleri ile ilgili olarak, birkaç uyarı vardır:

  • Matematiğin farklı dallarındaki fonksiyonlar her zaman aynı anlamlara sahip olarak tanımlanmamıştır. Farklı programlama paradigmalarındaki işlevler de oldukça farklı olabilir (hatta bazen işlev çağrısının sözdizimleri benzer görünür). Bazen farklılıklara neden olan sebepler aynıdır, ancak bazen değildir.
    • Matematiksel fonksiyonları tarafından hesaplama modeli ve ardından deyimseldir uygulamak yatan programlama dilleri de hesaplama. Ne hakkında konuşulduğunu bilmiyorsanız, bunları bire bir eşlemekten kaçının.
  • Modeli modellenen varlık ile karıştırmayın.
    • İkincisi sadece biridir uygulanmasına eski için. Bağlamlara bağlı olarak birden fazla seçenek olabilir (örneğin, ilgilenen matematik dalları).
    • Özellikle, "fonksiyonlar" ı "eşlemeler" veya Kartezyen ürünlerin alt kümeleri gibi davranmak ,{{{}}, {}} bazı sınırlı bağlamların yanı sıra, sıra sayılarının Von-Neumann kodlaması (bir grup ... gibi) gibi davranmak gibi aşağı yukarı saçmadır. .
  • Matematiksel olarak, işlevler kısmi veya toplam olabilir . Burada farklı programlama dillerinin farklı uygulamaları vardır.
    • Bazı işlevsel diller , işlev çağrıları içindeki hesaplamanın her zaman sonlu adımlarla sona erdiğini garanti etmek için işlevlerin tamamını onurlandırabilir . Bununla birlikte, bu aslında Turing-tamamlanmamıştır, bu nedenle daha zayıf hesaplama ifadesi değildir ve genel amaçlı dillerde, daktilo semantiğinin (toplam olması beklenen) yanı sıra çok fazla görülmez.
    • Prosedürler ve fonksiyonlar arasındaki fark önemliyse, "toplam prosedürler" olmalı mı? Hmm ...
  • Programlama dillerinin genel hesaplamasını ve anlambilimini modellemek için kullanılan kalkülindeki fonksiyonlara benzer yapılar (örn. Lambda kalkülüsünde lambda soyutlamaları ) işlenenler üzerinde farklı değerlendirme stratejileri olabilir .
    • Geleneksel olarak, saf hesabındaki azalmalar ve saf fonksiyonel dillerdeki ifadelerin değerlendirilmesi olarak, hesaplamaların sonuçlarını değiştiren hiçbir yan etkisi yoktur. Sonuç olarak, işlenenlerin işlevlere benzer yapıların gövdesinden önce değerlendirilmesi gerekmez (çünkü "aynı sonuçları" tanımlamak için değişmeyen, Church-Rosser özelliği tarafından garanti edilen β- denkliği gibi özellikler tarafından tutulur ).
    • Bununla birlikte, ifadelerin değerlendirilmesi sırasında birçok programlama dilinin yan etkileri olabilir. Yani, uygulamalı değerlendirme gibi katı değerlendirme stratejileri, ihtiyaç duyulduğunda çağrı gibi katı olmayan değerlendirme stratejileri ile aynı değildir . Bu önemlidir, çünkü ayrım olmadan, işlev benzeri (yani bağımsız değişkenlerle kullanılır) makroları (geleneksel) işlevlerden ayırmaya gerek yoktur. Ancak teorilerin lezzetine bağlı olarak, bu hala bir eser olabilir. Bununla birlikte, daha geniş anlamda, fonksiyonel benzeri makrolar (özellikle hijyenik olanlar) , bazı gereksiz sınırlamalara (sözdizimsel aşamalar) sahip matematiksel işlevlerdir. Sınırlamalar olmaksızın, işlev benzeri makrolara (birinci sınıf) prosedür olarak davranmak mantıklı olabilir ...
    • Bu konuyla ilgilenen okuyucular için bazı modern soyutlamaları düşünün .
  • Prosedürler genellikle geleneksel matematik kapsamı dışındadır. Bununla birlikte, hesaplama ve programlama dili anlambiliminin yanı sıra çağdaş programlama dili tasarımlarının hesaplanmasında, "çağrılabilir" doğayı paylaşan ilgili kavramların oldukça büyük bir ailesi olabilir. Bazıları prosedürleri / işlevleri uygulamak / genişletmek / değiştirmek için kullanılır. Daha da ince ayrımlar var.
    • İlgili bazı anahtar kelimeler şunlardır: altyordamlar / (yığınsız / yığınlayıcı) coroutines / (sınırlandırılmamış sınırlandırılmış) devamlar ... ve hatta (denetlenmeyen) istisnalar .

3

Çoğu bağlamda: bir işlem bir değer döndürürken bir yordam döndürmez. Her ikisi de aynı şeyi yapmak için birlikte gruplandırılmış kod parçalarıdır.

İşlevsel programlama bağlamında (tüm işlevlerin değer döndürdüğü yerlerde), işlev soyut bir nesnedir:

f(x)=(1+x)
g(x)=.5*(2+x/2)

Burada f, g ile aynı işlevdir, ancak farklı bir yordamdır.


3

İç prosedürde DML (Ekle / Güncelle / Sil) ifadelerini kullanabiliriz, ancak İç fonksiyonda DML ifadelerini kullanamayız.

Yordamın her iki giriş \ çıkış parametresi olabilir, ancak İşlev yalnızca giriş parametresine sahip olabilir.

Saklı Yordamda Try-Catch Block'u kullanabiliriz, ancak İşlevde Try-Catch bloğunu kullanamayız.

Saklı Yordam'ı Select deyiminde kullanamayız, ancak İşlevde Select deyiminde kullanabiliriz.

Saklı Yordam 0 veya n değeri döndürebilir (en fazla 1024), ancak İşlev zorunlu olan yalnızca 1 değer döndürebilir.

Saklı Yordam İşlevden çağrılamaz, ancak Saklı Yordamdan işlevi çağırabiliriz.

İşlemi Saklı Yordamda kullanabiliriz, ancak işlevde işlemi kullanamayız.

Sql deyiminde Saklı Yordam'ı Nerede / Sahip / Seç bölümünün hiçbir yerinde kullanamayız, Ama işlevinde kullanabiliriz.

Saklı Yordam'a katılamıyoruz, ancak işleve katılabiliriz.

daha fazlası için .. buraya tıklayın ... http://dotnet-developers-cafe.blogspot.in/2013/08/difference-between-stored-procedure-and.html


2
Bu soru dile özgüdür, ancak soru dile bağlı değildir. Buradaki ifadelerin hepsi genel durumda doğru değildir, ancak iddia ettiğiniz dili veya ortamı açıklığa kavuşturmak yararlı olacaktır.
Mogsdad

Bu cevap programlama dillerinin büyük çoğunluğu için tamamen yanlıştır. Prosedürlerin yalnızca giriş parametreleri vardır ve işlevlerin hem giriş hem de çıkışı vardır.
AStopher

2

Bir işlev bir değer döndürür ve bir prosedür sadece komutları yürütür.

Ad işlevi matematikten gelir. Girişe dayalı bir değer hesaplamak için kullanılır.

Yordam, sırayla yürütülebilen bir komut kümesidir.

Çoğu programlama dilinde, fonksiyonların bile bir dizi komutu olabilir. Dolayısıyla, fark sadece bir değer bölümü döndürmektir.

Ancak bir işlevi temiz tutmak istiyorsanız (sadece işlevsel dillere bakın), bir işlevin yan etkisi olmadığından emin olmanız gerekir.


1

İşlev sql deyimi içinde kullanılabilirken, prosedür sql deyimi içinde kullanılamaz.

Insert, Update ve Create deyimleri işleve dahil edilemez, ancak bir yordamda bu deyimler bulunabilir.

Yordam işlemleri destekler, ancak işlevler işlemleri desteklemez.

İşlev bir ve yalnızca bir değer döndürmelidir (diğeri OUT değişkeni ile döndürülebilir), ancak yordam birçok veri kümesi ve dönüş değeri döndürür.

Hem işlevlerin hem de işlemlerin yürütme planları önbelleğe alınır, bu nedenle performans her iki durumda da aynıdır.


1

Bu cevapların çoğunda sürekli olarak görmeye devam ettiğim bir şeyle itiraz ediyorum, bir işlevi bir işlev yapan şeyin bir değer döndürmesidir.

Bir işlev yalnızca bir değer döndüren eski bir yöntem değildir. Öyle değil: Bir yöntemin gerçek bir işlev olması için, her zaman belirli bir girdi verildiğinde aynı değeri döndürmesi gerekir. İşlev olmayan bir yönteme örnek olarakrandom çoğu dilde yöntemdir, çünkü bir değer döndürmesine rağmen değer her zaman aynı değildir.

Bu nedenle bir işlev bir haritaya daha yakındır (örneğin, x -> x'tek boyutlu bir işlev için nerede ). Bu, normal yöntemler ve işlevler arasında çok önemli bir ayrımdır, çünkü gerçek işlevlerle uğraşırken zamanlama ve değerlendirilme sırası hiçbir zaman önemli değildir, çünkü bu her zaman işlevsiz durumlarda böyle değildir.

Burada, işlev olmayan ancak yine de bir değer döndürecek bir yöntemin başka bir örneği verilmiştir.

// The following is pseudo code:
g(x) = {
  if (morning()) {
     g = 2 * x;
  }
  else {
   g = x;
  }
  return g;
}

Ayrıca prosedürlerin değerleri döndürmediği fikrine itiraz ediyorum. Yordam yalnızca bir işlev veya yöntem hakkında konuşmanın özel bir yoludur. Bu, prosedürünüzün tanımladığı veya uyguladığı temel yöntem bir değer döndürüyorsa, o prosedürün bir değer döndürdüğünü tahmin edin. Örneğin, SICP'den aşağıdaki kod parçacığını ele alalım :

// We can immediately translate this definition into a recursive procedure 
// for computing Fibonacci numbers:

(define (fib n)
  (cond ((= n 0) 0)
        ((= n 1) 1)
        (else (+ (fib (- n 1))
                 (fib (- n 2))))))

Son zamanlarda tekrarlayan prosedürleri duydunuz mu? Özyinelemeli bir işlevden (gerçek bir işlev) bahsediyorlar ve bir değer döndürüyorlar ve "yordam" sözcüğünü kullanıyorlar. Peki fark ne?

Bir işlevi (yukarıda belirtilen anlamın yanı sıra) düşünmenin başka bir yolu, 1 rakamı gibi bir idealin soyut bir temsilidir. Bir prosedür, o şeyin gerçek uygulamasıdır. Ben şahsen değiştirilebilir olduklarını düşünüyorum.

(Not: Eğer sağladığım bağlantıdan o bölümü okursanız, kavramak için daha zor bir kavramın bir işlev ve bir prosedür değil, bir süreç ve bir prosedür arasındaki fark olduğunu görebilirsiniz. Özyinelemeli bir prosedürün yinelemeli süreç?)

Prosedürler için bir analog tariflerdir. Örneğin; adlı bir makine olduğunu varsayalım make-piesbu makine malzemelerle alır (fruit, milk, flower, eggs, sugar, heat)ve bu makine bir döner pie.

Bu makinenin bir temsili

make-pies (fruit, milk, flower, eggs, sugar, heat) = {
   return (heat (add fruit (mix eggs flower milk)))
}

Tabii ki turta yapmanın tek yolu bu değil.

Bu durumda şunu görebiliriz:

A       function     is to a     machine
as a    procedure    is to a     recipe
as      attributes   are to      ingredients
as      output       is to       product

Bu benzetme tamam ama bir bilgisayar programı ile uğraşırken her şeyin bir soyutlama olduğunu dikkate aldığınızda bozulur. Yani bir makinenin tarifinden farklı olarak, soyutlama olan iki şeyi karşılaştırıyoruz; aynı şey olabilecek iki şey. Ve onların (her niyet ve amaç için) aynı şey olduklarına inanıyorum.


2
Verilen bağımsız değişkenler için her zaman aynı değeri döndüren bir işleve bazen "salt işlev" denir. Prosedürler ve fonksiyonlar arasında ayrım yapan çoğu dilde, fonksiyonların saf olması gerekmez ve "fonksiyon" terimi, yan etkileri olabilen ve aynı argümanlarla art arda yapılan aramalarda farklı sonuçlar döndürebilen alt rutinleri belirtmek için doğru şekilde kullanılır. (Ve C benzeri dillerde, değer döndürmeyen altyordamlara bile "işlevler" denir.)
Keith Thompson

Kabul ediyorum, bu yüzden kelimelerin birbirinin yerine geçebileceğini söyleyerek bitiriyorum.
dkinzer

1
Evet, ancak "Bir işlev yalnızca değer döndüren herhangi bir eski yöntem değildir" diyerek başlarken , birçok dilde tam olarak bir işlev budur.
Keith Thompson

0

Db bağlamında : Saklı yordam, fonksiyonların olmadığı yerlerde önceden derlenmiş yürütme planıdır.


0

С # / Java açısından, işlev belirli bir değer döndüren kod bloğudur, ancak yordam void (hiçbir şey) döndürmeyen kod bloğudur . C # / Java'da işlevler ve yordamlar daha çok adil yöntemler olarak adlandırılır .

    //This is a function
    public DateTime GetCurrentDate()
    {
        return DateTime.Now.Date;
    }

    //This is a procedure(always return void)
    public void LogMessage()
    {
        Console.WriteLine("Just an example message.");
    }

-3

Prosedürler: 1. Prosedürler , parametreli hesaplamaları tanımlayan ifadeler koleksiyonudur. Prosedürler değerleri döndüremez.

3.İşlemler işlevden çağrılamaz.

Fonksiyonlar 1.Fonksiyonlar yapısal olarak prosedürlere benzemektedir, ancak matematiksel fonksiyonlar üzerinde anlamsal olarak modellenmiştir. 2. değerleri döndürebilir 3. fonksiyon prosedürlerden çağrılabilir.


3.İşlemler işlevden çağrılamaz. Bu hangi dilde doğru? Hiçbir deneyimim bu kısıtlama var.
Mogsdad

Bu doğru. Bir işlevden bir yordamı çağırırsanız, bu bir işlev değildir. Hangi dilin bunu uyguladığı konusunda, bu cevabı bilmediğim iyi bir soru. İşlevsel olabilir, ancak o zaman bile emin değilim: saf liste işlevseldir (set yoktur: yan etki yok), ancak lambdas olduğu için set uygulamak mümkündür. Kümeyi kullanmayan bir derleyici yazabilir misiniz, kümenin tüm uygulamalarını algılaması gerekir. Lambdasları dilden kaldırabilirsiniz, ancak bu daha kötü olurdu.
ctrl-alt-delor

Ohh Sadece bir dil C ++ düşündüm: bir const yöntemi const değil yöntemi çağıramaz (doğru derleyici kontrollerini açmanız gerekecek ve etrafta dolaşmaya çalışmayacaksınız.)
ctrl-alt-delor

-7

Prosedürler ve fonksiyonlar her ikisi de alt rutindir, aralarındaki tek fark, bir prosedürün birden fazla (veya en azından yapabilir) değer döndürmesidir, oysa bir fonksiyon sadece bir değer döndürebilir (bu yüzden matematikte fonksiyon gösterimi kullanılır, çünkü genellikle sadece bir değer bulunur bazı programlama dilleri bu kurallara uymasa da, bu onların gerçek tanımlarıdır


Um, hayır. Bir prosedürreturn hiçbir şey . Her ikisiyle de mümkün olan yan etkilerden bahsediyorsunuz (dilin izin verdiği takdirde).
Mogsdad

Bir prosedür herhangi bir miktarda değer döndürebilir, bu miktar sıfır olabilir
user2766296

Yan etki, a'nın bir dizi olması ve en büyük değeri bulan bir işlev veya yordama geçirmesi, dizi referans olarak geçirilmesi ve alt rutin çalıştırıldıktan sonra dizinin sıralanması, sıralanmış bir yan etkidir, döndürülen değer dizideki en büyük değerdir
sorted

Bu yanıtı seviyorum ve aynı zamanda birkaç aşağı oyu olanları da seviyorum, çünkü bir şekilde doğru, paradoksal olarak, SO'da çok popüler hale getirmek için bir aşağı oy vereceğim. SQL Server'da Saklı Yordam bir sonuç kümesi döndürür ("birden çok değer" olarak adlandırdığınız), ancak bir işlev yalnızca bir değer döndürebilir (bu da Tablo Değerli Bir İşlev oluşturabileceğiniz için çok doğru değildir).
Ivanzinho
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.