Apa perbedaan antara "fungsi" dan "prosedur"?


203

Secara umum, kita semua mendengar tentang fungsi atau prosedur dalam bahasa pemrograman. Namun, saya baru tahu bahwa saya menggunakan istilah-istilah ini hampir secara bergantian (yang mungkin sangat salah).

Jadi, pertanyaan saya adalah:

Apa perbedaan dalam hal fungsi mereka, tujuan dan penggunaannya?

Sebuah contoh akan dihargai.



6
Saya pikir SICP mendapatkan ini dengan benar. Fungsi hanya ada dalam matematika, dan mereka mewakili apa itu pengetahuan. Prosedur ada dalam bahasa pemrograman (termasuk yang fungsional), dan mereka mewakili cara pengetahuan. Fungsi : sqrt (x) = y sedemikian rupa sehingga y ^ 2 = x. Prosedur : (define (sqrt x) (newtons-method (lambda (y) (- (square y) x)) 1.0)).
mk12

Jawaban:


295

Fungsi mengembalikan nilai dan prosedur hanya menjalankan perintah.

Fungsi nama berasal dari matematika. Ini digunakan untuk menghitung nilai berdasarkan input.

Prosedur adalah seperangkat perintah yang dapat dieksekusi secara berurutan.

Di sebagian besar bahasa pemrograman, bahkan fungsi dapat memiliki seperangkat perintah. Karenanya perbedaannya hanya pada pengembalian bagian nilai.

Tetapi jika Anda ingin menjaga fungsi tetap bersih, (lihat saja bahasa-bahasa fungsional), Anda perlu memastikan suatu fungsi tidak memiliki efek samping.


Bagaimana Anda bisa memastikan tidak ada efek samping baik dalam bahasa imperatif (java, c) atau deklaratif (scala, skema)?
orlybg

1
@orlybg, dalam bahasa deklaratif, konsistensi berasal dari implementasi bahasa. Batasan ruang lingkup mereka mencegah mereka dari memiliki efek samping. Di sisi lain, bahasa imperatif mengeksploitasi efek sampingnya secara eksplisit. Efek samping tidak selalu buruk.
Tharindu Rusira

Saya membaca tutorial Ada berikut ini ( goanna.cs.rmit.edu.au/~dale/ada/aln/8_subprograms.html ), di mana paragraf kedua dari halaman itu dimulai dengan "Prosedur di Ada mirip dengan yang ada di Pascal Msgstr "Suatu prosedur dapat berisi pernyataan kembali." Apakah ini kesalahan dalam teks? Atau apakah itu berarti ia dapat memiliki pernyataan pengembalian tetapi tidak mengembalikan nilai apa pun?
jviotti

3
Secara pascal, prosedur tidak memiliki pernyataan pengembalian, hanya fungsi yang melakukannya. Harus ada kesalahan dalam teks. Namun, prosedur dapat memiliki pernyataan "keluar", yang dapat bertindak sebagai pernyataan "kembali" tanpa argumen, yang berarti tidak ada nilai balik.
Eric Fortier

fungsi bisa mendapatkan input dan mengembalikan hanya output saja. prosedur atau makro bisa mendapatkan input dan tidak mengembalikan data apa pun hanya menjalankan sejumlah pernyataan. Perbedaan utama adalah prosedur tidak dapat mengembalikan tipe data apa pun.
EsmaeelE

42

Ini tergantung pada konteksnya.

Dalam bahasa seperti Pascal, fungsi dan prosedur adalah entitas yang berbeda, berbeda dalam apakah mereka menghasilkan atau tidak mengembalikan nilai. Mereka berperilaku berbeda wrt. sintaksis bahasa (mis. prosedur panggilan pernyataan formulir; Anda tidak dapat menggunakan panggilan prosedur di dalam ekspresi vs panggilan fungsi tidak membentuk pernyataan, Anda harus menggunakannya dalam pernyataan lain). Oleh karena itu, programmer Pascal-dibesarkan membedakan antara mereka.

Dalam bahasa seperti C, dan banyak bahasa kontemporer lainnya, perbedaan ini hilang; dalam bahasa yang diketik secara statis, prosedur hanya berfungsi dengan tipe pengembalian yang lucu. Ini mungkin mengapa mereka digunakan secara bergantian.

Dalam bahasa fungsional, biasanya tidak ada yang namanya prosedur - semuanya adalah fungsi.


dan dokumentasi bahasa pemrograman dapat memanggil fungsi dan prosedur apa pun yang diinginkannya, karena orang akan menerima nama apa pun karena latar belakang di balik nama-nama itu telah dihapus sejak lama.
Arne Babenhauserheide

18

Contoh dalam C:

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

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

Meskipun Anda harus mencatat bahwa Standar C tidak berbicara tentang prosedur, hanya berfungsi.


4
... Standar C tidak berbicara tentang prosedur, hanya fungsi. Itu karena hanya memiliki fungsi. Fungsi yang tidak mengembalikan apa pun adalah a void function. Kernighan & Ritchie Ch 1.7: "Dalam C, fungsi setara dengan subrutin atau fungsi dalam Fortran, atau prosedur atau fungsi dalam Pascal." Dengan kata lain ... jawaban ini salah.
Mogsdad

8
Jawabannya tidak salah, dan ini adalah contoh yang baik dari perbedaan antara fungsi dan prosedur murni. K&R menyebut setiap subrutin sebagai "fungsi" untuk menjaga hal-hal sederhana, tetapi subrutin dengan efek samping sebenarnya adalah "prosedur", bukan "fungsi" dalam pengertian kanonik dari matematika. C mungkin bahasa yang lebih baik jika membedakan fungsi nyata dari prosedur, ini akan membantu dengan analisis statis, optimalisasi kinerja, dan paralelisasi.
Sam Watkins

12

Secara umum, prosedur adalah urutan instruksi.
Suatu fungsi bisa sama, tetapi biasanya mengembalikan hasil.


11

Ada istilah subrutin atau subprogram yang merupakan kepingan kode parameter yang dapat dipanggil dari tempat yang berbeda.

Fungsi dan prosedur adalah implementasi dari itu. Biasanya fungsi mengembalikan nilai dan prosedur tidak mengembalikan apa pun.


6

Perbedaan Dasar

  • Fungsi harus mengembalikan nilai tetapi dalam Prosedur Tersimpan itu opsional: prosedur dapat mengembalikan 0 atau n .
  • Fungsi hanya dapat memiliki parameter input untuknya, sedangkan prosedur dapat memiliki parameter input / output.
  • Untuk suatu Fungsi, wajib mengambil satu parameter input, tetapi Prosedur yang Disimpan mungkin membutuhkan 0 hingga n parameter input.
  • Fungsi dapat dipanggil dari suatu Prosedur sedangkan Prosedur tidak dapat dipanggil dari suatu Fungsi.

Perbedaan Tingkat Lanjut

  • Pengecualian dapat ditangani oleh blok try-catch dalam Prosedur, sedangkan blok try-catch tidak dapat digunakan dalam suatu Fungsi.
  • Kita bisa pergi untuk Manajemen Transaksi dalam Prosedur, sedangkan dalam Fungsi kita tidak bisa.

Dalam SQL:

  • Sebuah Prosedur memungkinkan SELECTserta DML ( INSERT, UPDATE, DELETE) pernyataan di dalamnya, sedangkan Fungsi memungkinkan hanyaSELECT pernyataan di dalamnya.
  • Prosedur tidak dapat digunakan dalam SELECTpernyataan, sedangkan Fungsi dapat tertanam dalam aSELECT pernyataan.
  • Prosedur Tersimpan tidak dapat digunakan dalam pernyataan SQL di mana saja dalam WHERE(atau a HAVINGatau aSELECT blok ), sedangkan Fungsi bisa.
  • Fungsi yang mengembalikan tabel dapat diperlakukan sebagai Rowset lain. Ini dapat digunakan dalamJOIN blok dengan tabel lain.
  • Fungsi Inline dapat dianggap sebagai tampilan yang mengambil parameter dan dapat digunakan dalam JOINblok dan operasi Rowset lainnya.

3
Jawaban ini sangat spesifik bahasa, sedangkan pertanyaannya adalah bahasa-agnostik. Pernyataan di sini tidak semuanya benar dalam kasus umum, tetapi akan sangat membantu jika Anda mengklarifikasi bahasa atau lingkungan tempat Anda menegaskannya.
Mogsdad

5

Lebih tepatnya, fungsi f mematuhi properti yang f (x) = f (y) jika x = y, yaitu menghitung hasil yang sama setiap kali dipanggil dengan argumen yang sama (dan dengan demikian ia tidak mengubah status dari sistem.)

Dengan demikian, rand () atau cetak ("Halo"), dll. Bukan merupakan fungsi melainkan prosedur. Sementara sqrt (2.0) harus menjadi fungsi: tidak ada efek yang dapat diamati atau perubahan status tidak peduli seberapa sering seseorang memanggilnya dan ia mengembalikan selalu 1,41 dan beberapa.


3
Penggunaan ini relavent dalam konteks pemrograman "fungsional". Ketahuilah bahwa banyak (seringkali keharusan) bahasa yang menyebut subprogram mereka "fungsi" tidak memerlukan properti ini.
dmckee --- ex-moderator kitten

1
Saya tidak menyarankan bahwa bahasa pemrograman memerlukan properti ini. Bagaimanapun, seseorang dapat menulis fungsi yang ketat dalam bahasa apa pun, dan saya merasa itu adalah kebiasaan yang baik untuk memprogram sebanyak mungkin dalam fungsi bersih, kemudian menempelkan potongan-potongan itu bersama-sama dengan beberapa prosedur utama.
Ingo

4

Jika kita agnostik bahasa di sini, prosedur biasanya menentukan serangkaian tindakan yang diperlukan untuk secara andal dan idempoten mencapai hasil tertentu. Artinya, prosedur pada dasarnya adalah algoritma.

Fungsi, di sisi lain, adalah bagian kode yang agak independen dalam program yang lebih besar. Dengan kata lain, fungsi adalah implementasi dari suatu prosedur.


4

Ini adalah pertanyaan lama yang terkenal, tetapi saya ingin berbagi lebih banyak wawasan tentang penelitian dan desain bahasa pemrograman modern.

Jawaban dasar

Secara tradisional (dalam arti pemrograman terstruktur ) dan secara informal, prosedur adalah konstruksi struktural yang dapat digunakan kembali untuk memiliki "input" dan untuk melakukan sesuatu yang dapat diprogram. Ketika sesuatu perlu dilakukan dalam suatu prosedur, Anda dapat memberikan argumen (aktual) ke prosedur dalam panggilan prosedur yang dikodekan dalam kode sumber (biasanya dalam semacam ekspresi), dan tindakan yang dikodekan dalam tubuh prosedur (disediakan dalam definisi prosedur) akan dieksekusi dengan substitusi argumen menjadi parameter (formal) yang digunakan dalam tubuh.

Sebuah fungsi lebih dari prosedur karena kembali nilai-nilai juga dapat ditentukan sebagai "output" dalam tubuh. Panggilan fungsi kurang lebih sama dengan panggilan prosedur, kecuali bahwa Anda juga dapat menggunakan hasil panggilan fungsi, secara sintaksis (biasanya sebagai subekspresi dari beberapa ekspresi lain).

Secara tradisional, pemanggilan prosedur (daripada pemanggilan fungsi) digunakan untuk menunjukkan bahwa tidak ada output yang harus tertarik, dan harus ada efek samping untuk menghindari panggilan menjadi no-ops, karenanya menekankan paradigma pemrograman imperatif . Banyak bahasa pemrograman tradisional seperti Pascal menyediakan "prosedur" dan "fungsi" untuk membedakan perbedaan gaya yang disengaja ini.

(Agar lebih jelas, "input" dan "output" yang disebutkan di atas adalah gagasan yang disederhanakan berdasarkan pada sifat sintaksis fungsi. Banyak bahasa juga mendukung lewat argumen ke parameter dengan referensi / berbagi, untuk memungkinkan pengguna mengirim informasi yang dikodekan dalam argumen selama panggilan berlangsung) Parameter tersebut bahkan dapat disebut sebagai "parameter masuk / keluar". Fitur ini didasarkan pada sifat objek yang dilewatkan dalam panggilan, yang ortogonal dengan sifat-sifat fitur prosedur / fungsi.)

Namun, jika hasil dari panggilan fungsi tidak diperlukan, itu bisa saja (setidaknya secara logis) diabaikan, dan definisi fungsi / panggilan fungsi harus konsisten dengan definisi prosedur / panggilan prosedur dengan cara ini. Bahasa seperti ALGOL seperti C, C ++ dan Java, semua menyediakan fitur "fungsi" dengan cara ini: dengan menyandikan tipe hasil voidsebagai kasus khusus fungsi yang tampak seperti prosedur tradisional, tidak perlu menyediakan fitur "prosedur" " terpisah. Ini mencegah beberapa mengasapi dalam desain bahasa.

Sejak SICP disebutkan, itu juga diperhatikan bahwa dalam bahasa Skema yang ditentukan oleh R n RS , prosedur mungkin atau mungkin tidak harus kembali hasil perhitungan. Ini adalah gabungan dari "fungsi" tradisional (mengembalikan hasilnya) dan "prosedur" (mengembalikan apa-apa), pada dasarnya sama dengan konsep "fungsi" dari banyak bahasa seperti ALGOL (dan sebenarnya berbagi lebih banyak jaminan seperti evaluasi aplikatif dari operan sebelum panggilan). Namun, perbedaan mode lama masih terjadi bahkan dalam dokumen normatif seperti SRFI-96 .

Saya tidak tahu banyak tentang alasan pasti di balik perbedaan itu, tetapi seperti yang saya alami, tampaknya perancang bahasa akan lebih bahagia tanpa spesifikasi mengasapi saat ini. Artinya, "prosedur" sebagai fitur mandiri tidak perlu. voidJenis teknik sudah cukup untuk menandai penggunaan di mana efek samping harus ditekankan. Ini juga lebih alami bagi pengguna yang memiliki pengalaman pada bahasa mirip-C, yang populer lebih dari beberapa dekade. Selain itu, ia menghindari rasa malu dalam kasus-kasus seperti R n RS di mana "prosedur" sebenarnya "fungsi" dalam arti yang lebih luas.

Secara teori, suatu fungsi dapat ditentukan dengan tipe unit yang ditentukan sebagai tipe dari hasil pemanggilan fungsi untuk menunjukkan bahwa hasilnya adalah spesial. Ini membedakan prosedur tradisional (di mana hasil panggilan tidak tertarik) dari yang lain. Ada berbagai gaya dalam desain bahasa:

  • Seperti dalam RS n , hanya menandai hasil yang tidak tertarik sebagai nilai "tidak ditentukan" (dari jenis yang tidak ditentukan, jika bahasa harus menyebutkannya) dan itu cukup untuk diabaikan.
  • Menentukan hasil tertarik sebagai nilai dari jenis unit khusus (misalnya Kernel 's #inert) juga bekerja.
  • Ketika tipe itu adalah tipe bottom selanjutnya , ia dapat (mudah-mudahan) diverifikasi secara statis dan dicegah digunakan sebagai tipe ekspresi. The voidketik bahasa ALGOL-seperti persis contoh dari teknik ini. ISO C11 _Noreturnadalah yang serupa tetapi lebih halus dalam jenis ini.

Bacaan lebih lanjut

Sebagai konsep tradisional yang berasal dari matematika, ada banyak ilmu hitam yang kebanyakan orang tidak mau tahu. Sebenarnya, Anda tidak akan mendapatkan semuanya jelas sesuai dengan buku matematika Anda. Buku CS mungkin juga tidak banyak membantu.

Dengan memperhatikan bahasa pemrograman, ada beberapa peringatan:

  • Fungsi di berbagai cabang matematika tidak selalu didefinisikan memiliki arti yang sama. Fungsi dalam paradigma pemrograman yang berbeda mungkin juga sangat berbeda (bahkan terkadang sintaks pemanggilan fungsi terlihat serupa). Terkadang alasan untuk menyebabkan perbedaan itu sama, tetapi kadang-kadang tidak.
    • Hal ini idiomatik untuk model perhitungan dengan fungsi matematika dan kemudian menerapkan yang mendasari perhitungan di bahasa pemrograman. Berhati-hatilah untuk tidak memetakannya satu per satu kecuali Anda tahu apa yang sedang dibicarakan.
  • Jangan bingung model dengan entitas dimodelkan.
    • Yang terakhir hanya salah satu implementasi ke yang sebelumnya. Mungkin ada lebih dari satu pilihan, tergantung pada konteksnya (cabang-cabang matematika yang tertarik, misalnya).
    • Secara khusus, kurang lebih sama tidak masuk akal untuk memperlakukan "fungsi" sebagai "pemetaan" atau himpunan bagian dari produk Cartesian seperti memperlakukan bilangan asli sebagai penyandian ordinan Von-Neumann (tampak seperti sekelompok {{{}}, {}}...) selain beberapa konteks terbatas .
  • Secara matematis, fungsi bisa parsial atau total . Bahasa pemrograman yang berbeda memiliki perlakuan yang berbeda di sini.
    • Beberapa bahasa fungsional dapat menghormati totalitas fungsi untuk menjamin perhitungan dalam panggilan fungsi selalu berakhir dalam langkah-langkah terbatas. Namun, ini pada dasarnya bukan Turing-complete, karena itu lebih ekspresif komputasional, dan tidak banyak terlihat dalam bahasa tujuan umum selain semantik pemeriksaan ketik (yang diharapkan menjadi total).
    • Jika perbedaan antara prosedur dan fungsi signifikan, haruskah ada "prosedur total"? Hmm ...
  • Konstruksinya mirip dengan fungsi dalam kalkulus yang digunakan untuk memodelkan perhitungan umum dan semantik bahasa pemrograman (misalnya abstraksi lambda dalam kalkulus lambda ) dapat memiliki strategi evaluasi yang berbeda pada operan.
    • Secara tradisional pengurangan dalam kalkulus murni serta sebagai evaluasi ekspresi dalam bahasa fungsional murni , tidak ada efek samping mengubah hasil perhitungan. Akibatnya, operan tidak perlu dievaluasi sebelum badan konstruksi seperti fungsi (karena invarian untuk mendefinisikan "hasil yang sama" disimpan oleh properti seperti β- equivalence yang dijamin oleh properti Church-Rosser ).
    • Namun, banyak bahasa pemrograman mungkin memiliki efek samping selama evaluasi ekspresi. Itu berarti, strategi evaluasi yang ketat seperti evaluasi aplikatif tidak sama dengan evaluasi yang tidak ketat seperti panggilan-oleh-kebutuhan . Ini penting, karena tanpa perbedaan, tidak perlu membedakan fungsi-fungsi seperti (yaitu digunakan dengan argumen) makro dari fungsi (tradisional). Tetapi tergantung pada aroma teori, ini masih bisa menjadi artefak. Yang mengatakan, dalam arti yang lebih luas, makro seperti fungsional (terutama yang higienis ) adalah fungsi matematika dengan beberapa batasan yang tidak perlu (fase sintaksis). Tanpa batasan, mungkin waras untuk memperlakukan makro fungsi-seperti (kelas satu) sebagai prosedur ...
    • Untuk pembaca yang tertarik dengan topik ini, pertimbangkan beberapa abstraksi modern .
  • Prosedur biasanya dianggap di luar lingkup matematika tradisional. Namun, dalam pemodelan kalkulus semantik bahasa komputasi dan pemrograman, serta desain bahasa pemrograman kontemporer, mungkin ada keluarga besar konsep terkait yang berbagi sifat "callable". Beberapa dari mereka digunakan untuk mengimplementasikan / memperluas / mengganti prosedur / fungsi. Bahkan ada perbedaan yang lebih halus.

3

Dalam sebagian besar konteks: fungsi mengembalikan nilai, sedangkan prosedur tidak. Keduanya adalah potongan kode yang dikelompokkan bersama untuk melakukan hal yang sama.

Dalam konteks pemrograman fungsional (di mana semua fungsi mengembalikan nilai), fungsi adalah objek abstrak:

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

Di sini, f adalah fungsi yang sama dengan g, tetapi merupakan prosedur yang berbeda.


3

Prosedur di dalam kita dapat menggunakan pernyataan DML (Sisipkan / Perbarui / Hapus), tetapi fungsi Di dalam kita tidak dapat menggunakan pernyataan DML.

Prosedur dapat memiliki parameter input \ output, tetapi Function hanya memiliki parameter input.

Kita dapat menggunakan Try-Catch Block dalam Stored Procedure, Tapi Berfungsi Kita tidak bisa menggunakan Try-Catch block.

Kita tidak bisa menggunakan Prosedur Tersimpan dalam pernyataan Pilih, Tapi Dalam Fungsi Kita bisa menggunakan dalam pernyataan Pilih.

Prosedur Tersimpan dapat mengembalikan nilai 0 atau n (maks 1024), Tetapi Fungsi hanya dapat mengembalikan 1 nilai yang wajib.

Stored Procedure tidak bisa dipanggil dari Function, Tapi Kita bisa memanggil function dari Stored Procedure.

Kita bisa menggunakan transaksi dalam Stored Procedure, Tapi dalam fungsi kita tidak bisa menggunakan transaksi.

Kita tidak dapat menggunakan Prosedur Tersimpan dalam pernyataan Sql di bagian mana saja / Di mana / Memiliki / pilih, Tapi dalam fungsi kita dapat menggunakan.

Kami tidak dapat bergabung dengan Prosedur Tersimpan, tetapi kami dapat bergabung dengan fungsi.

untuk lebih lanjut .. klik di sini ... http://dotnet-developers-cafe.blogspot.in/2013/08/difference-between-stored-procedure-and.html


2
Jawaban ini sangat spesifik bahasa, sedangkan pertanyaannya adalah bahasa-agnostik. Pernyataan di sini tidak semuanya benar dalam kasus umum, tetapi akan sangat membantu jika Anda mengklarifikasi bahasa atau lingkungan tempat Anda menegaskannya.
Mogsdad

Jawaban ini sepenuhnya salah untuk sebagian besar bahasa pemrograman. Prosedur hanya memiliki parameter input, dan fungsinya memiliki input dan output.
AStopher

2

Fungsi mengembalikan nilai dan prosedur hanya menjalankan perintah.

Fungsi nama berasal dari matematika. Ini digunakan untuk menghitung nilai berdasarkan input.

Prosedur adalah seperangkat perintah yang dapat dieksekusi secara berurutan.

Di sebagian besar bahasa pemrograman, bahkan fungsi dapat memiliki seperangkat perintah. Karenanya perbedaannya hanya pada pengembalian bagian nilai.

Tetapi jika Anda ingin menjaga fungsi tetap bersih, (lihat saja bahasa-bahasa fungsional), Anda perlu memastikan suatu fungsi tidak memiliki efek samping.


1

Fungsi dapat digunakan dalam pernyataan sql sedangkan prosedur tidak dapat digunakan dalam pernyataan sql.

Sisipkan, Perbarui dan Buat pernyataan tidak dapat dimasukkan dalam fungsi tetapi prosedur dapat memiliki pernyataan ini.

Prosedur mendukung transaksi tetapi fungsi tidak mendukung transaksi.

Fungsi harus mengembalikan satu dan hanya satu nilai (yang lain dapat dikembalikan oleh variabel OUT) tetapi prosedur mengembalikan sebanyak set data dan nilai kembali.

Rencana pelaksanaan dari kedua fungsi dan prosedur di-cache, sehingga kinerjanya sama dalam kedua kasus.


1

Saya keberatan dengan sesuatu yang terus saya lihat berulang-ulang di sebagian besar jawaban ini, bahwa apa yang membuat fungsi berfungsi adalah mengembalikan nilai.

Fungsi bukan sembarang metode lama yang mengembalikan nilai. Tidak demikian: Agar suatu metode menjadi fungsi nyata, ia harus mengembalikan nilai yang sama selalu diberikan input tertentu. Contoh dari metode yang bukan fungsi adalahrandom metode di sebagian besar bahasa, karena meskipun mengembalikan nilai, nilainya tidak selalu sama.

Oleh karena itu fungsi lebih mirip dengan peta (misalnya di mana x -> x'untuk fungsi satu dimensi). Ini adalah perbedaan yang sangat penting antara metode dan fungsi reguler karena ketika berhadapan dengan fungsi nyata waktu dan urutan di mana mereka dievaluasi seharusnya tidak pernah menjadi masalah di mana karena ini tidak selalu terjadi dengan non fungsi.

Berikut adalah contoh lain dari metode yang bukan fungsi tetapi akan tetap mengembalikan nilai.

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

Saya lebih jauh menolak gagasan bahwa prosedur tidak mengembalikan nilai. Suatu prosedur hanyalah cara spesifik untuk membicarakan suatu fungsi atau metode. Jadi itu berarti jika metode yang mendasari bahwa prosedur Anda mendefinisikan atau mengimplementasikan mengembalikan nilai, coba tebak apa prosedur yang mengembalikan nilai. Ambil contoh cuplikan berikut dari SICP :

// 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))))))

Pernahkah Anda mendengar tentang prosedur rekursif akhir-akhir ini? Mereka berbicara tentang fungsi rekursif (fungsi nyata) dan mengembalikan nilai dan mereka menggunakan kata "prosedur". Jadi apa bedanya, kalau begitu?

Nah cara lain untuk memikirkan suatu fungsi (selain makna yang disebutkan di atas) adalah sebagai representasi abstrak dari cita-cita seperti angka 1. Suatu prosedur adalah implementasi aktual dari hal itu. Saya pribadi berpikir mereka dapat dipertukarkan.

(Catatan, jika Anda membaca bab itu dari tautan yang saya berikan, Anda mungkin menemukan bahwa konsep yang lebih sulit untuk dipahami bukan perbedaan antara fungsi dan prosedur, tetapi proses dan prosedur. Apakah Anda tahu bahwa prosedur rekursif dapat memiliki proses berulang?)

Analog untuk prosedur adalah resep. Sebagai contoh; misalkan Anda memiliki mesin bernama mesin make-piesini mengambil bahan (fruit, milk, flower, eggs, sugar, heat)dan mesin ini mengembalikan a pie.

Representasi mesin ini mungkin terlihat seperti

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

Tentu saja itu bukan satu-satunya cara untuk membuat kue.

Dalam hal ini kita dapat melihat bahwa:

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

Analogi itu baik-baik saja tetapi rusak ketika Anda mempertimbangkan bahwa ketika Anda berurusan dengan program komputer semuanya adalah abstraksi. Jadi tidak seperti dalam hal resep untuk mesin kami membandingkan dua hal yang merupakan abstraksi sendiri; dua hal yang mungkin juga merupakan hal yang sama. Dan saya berpendapat bahwa mereka (untuk semua maksud dan tujuan) adalah hal yang sama.


2
Fungsi yang selalu mengembalikan nilai yang sama untuk argumen yang diberikan kadang-kadang disebut "fungsi murni". Dalam sebagian besar bahasa yang membedakan antara prosedur dan fungsi, fungsi tidak harus murni, dan istilah "fungsi" digunakan dengan benar untuk merujuk ke subrutin yang dapat memiliki efek samping dan yang dapat mengembalikan hasil berbeda pada panggilan berturut-turut dengan argumen yang sama. (Dan dalam bahasa mirip-C, bahkan subrutin yang tidak mengembalikan nilai dengan tepat disebut "fungsi".)
Keith Thompson

Setuju, itulah sebabnya saya akhirnya mengatakan kata-kata itu dapat dipertukarkan.
dkinzer

1
Ya, tetapi Anda mulai dengan mengatakan bahwa "Fungsi bukan sembarang metode lama yang mengembalikan nilai", sedangkan dalam banyak bahasa itulah fungsi sebenarnya.
Keith Thompson

0

Dalam konteks db : Prosedur tersimpan adalah rencana eksekusi yang dikompilasi di mana fungsinya tidak.


0

Dalam hal С # / Java, fungsi adalah blok kode, yang mengembalikan nilai tertentu, tetapi prosedur adalah blok kode yang mengembalikan batal (tidak ada). Dalam C # / Java kedua fungsi dan prosedur lebih sering disebut metode saja .

    //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

Prosedur: 1. Prosedur adalah kumpulan pernyataan yang mendefinisikan perhitungan parameter. 2. Prosedur tidak dapat mengembalikan nilai.

3. Prosedur tidak dapat dipanggil dari fungsi.

Fungsi 1.Fungsi secara struktural menyerupai prosedur tetapi secara semantik dimodelkan pada fungsi matematika. 2.Ini dapat mengembalikan nilai 3.Fungsi dapat dipanggil dari prosedur.


3. Prosedur tidak dapat dipanggil dari fungsi. Dalam bahasa apa ini benar? Tidak ada yang saya punya pengalaman dalam pembatasan ini.
Mogsdad

Itu benar. Jika Anda memanggil suatu prosedur dari suatu fungsi, maka itu bukan suatu fungsi. Mengenai bahasa apa yang memberlakukan hal ini, itu adalah pertanyaan yang bagus, yang saya tidak tahu jawabannya. Mungkin yang fungsional, tetapi meskipun begitu saya tidak yakin: daftar murni fungsional (tidak ada set: tidak ada sisi yang mempengaruhi), tetapi karena memiliki lambdas adalah mungkin untuk mengimplementasikan set. Bisakah Anda menulis kompiler yang memberlakukan tidak menggunakan set, itu harus mendeteksi semua implementasi itu. Anda bisa menghapus lambdas dari bahasa, tetapi itu akan lebih buruk.
ctrl-alt-delor

Ohh Saya baru saja memikirkan bahasa C ++: metode const tidak bisa memanggil metode bukan const (meskipun Anda akan memerlukan pemeriksaan kompiler yang benar dihidupkan, dan tidak berusaha keras untuk menyiasatinya.)
ctrl-alt-delor

-7

Prosedur dan fungsi sama-sama subrutin satu - satunya perbedaan di antara mereka adalah bahwa prosedur mengembalikan beberapa (atau setidaknya bisa melakukan) nilai sedangkan fungsi hanya dapat mengembalikan satu nilai (inilah sebabnya notasi fungsi digunakan dalam matematika karena biasanya hanya satu nilai yang ditemukan pada satu waktu tertentu) walaupun beberapa bahasa pemrograman tidak mengikuti aturan ini ini adalah definisi sebenarnya


Um, tidak. Prosedur tidak returnapa - apa. Anda sedang berbicara tentang efek samping, yang dimungkinkan dengan keduanya (jika diizinkan oleh bahasa).
Mogsdad

Sebuah prosedur dapat mengembalikan jumlah nilai apa pun, jumlah itu mungkin nol
user2766296

Efek samping adalah jika memiliki array dan meneruskannya ke fungsi atau prosedur yang menemukan nilai terbesar, array akan diteruskan oleh referensi dan setelah sub-rutin menjalankan array diurutkan, fakta bahwa itu adalah diurutkan adalah efek samping, nilai yang dikembalikan adalah nilai terbesar dalam array
user2766296

Saya suka jawaban ini, dan juga suka dengan beberapa downvotes karena dalam beberapa hal agak benar begitu, secara paradoks, untuk membuatnya sangat populer di SO saya akan memberikannya downvote. Prosedur Tersimpan dalam SQL Server mengembalikan resultset (apa yang Anda sebut sebagai "beberapa nilai") sedangkan fungsi hanya dapat mengembalikan satu nilai (yang tidak terlalu akurat karena Anda juga dapat membuat Fungsi Table-Valued).
Ivanzinho
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.