Veri olarak işleme , bir rutin bir veri varlık işleme kapsüller kodu (bir dizinin bir kısmını talimatları programın geri kalan nispeten bağımsız iyi tanımlanmış bir özel işleme (köle, görev, hesaplama, vs.) işlemini gerçekleştirmek) ve aynı programda veya başka bir programda yeniden kullanılabilir. Bu durumda, rutin, uygulamasının bütünlüğünü korurken, diğer programlama projeleri için kullanılabilir hale getirmek için genellikle bir kitaplıkta saklanır .
Rutinler, yürütülecek programı, üretilmesi, kullanılması, yönetilmesi ve bakımı daha kolay olan kod parçalarına bölerek bir sorunu bölmenize olanak tanır. Rutini gerçekleştiren talimatlar içinde kapsüllenmiştir ve programcı bunun dahili detayları hakkında endişelenmeden rutini çağırabilir; rutin, onu kullanan rutinlerde bir kara kutu rolü oynar .
Gelen bilgisayar programlama , iki ana formda rutinleri bulmak:
prosedür | Herhangi bir değer döndürmeyen bir rutin , kullanımı geçici bir talimat rolünü oynayan iyi tanımlanmış bir işlem (görev) gerçekleştirir . |
fonksiyon | Uygun bir rutin bu döner bir ve yalnızca tek bir değer, matematiksel tanımı ve fonksiyonu . |
Bir rutin, yalnızca çağıran rutine en az bir değer döndürdüğünde veya (dahil) çevresi üzerinde bir etkisi varsa (bir sensör okuma , bir aktüatöre yazma , global bir değişkenin değiştirilmesi vb.) etkilidir .
önceden tanımlanmış rutin | Bildirimini ve rolünü biliyorsak, tanımlamaya gerek kalmadan kullanılabilen, çoğunlukla bir kitaplıkta sağlanan bir rutin . |
kukla rutin | Program geliştirme sırasında geçici olarak hiçbir şey yapmayan bir rutin (rutin gövdesi boştur). |
Yöntem | Bir sınıfın üyesi olan bir rutin ( nesne yönelimli programlamada ) |
Çoğu programlama dilinde , bir rutinin bildirimi (ve dolayısıyla tanımı) genellikle şunları içerir:
Bir işlev durumunda, bir rutinin bildirimi ayrıca şunları içerir:
Buna izin veren bazı programlama dillerinde (2016), her bir parametreyle ilişkili değişim modu belirtilir:
Tüm bu öğeler, tüm programlama dillerinde mutlaka görülmez .
Bir rutinin imzası (profili) veya isim süslemesi, çevirmenin ( derleyici , yorumlayıcı , vb.) rutinin beyanıyla tutarlı bir şekilde kullanıldığını doğrulamasını sağlar. Ayrıca, bağlayıcının (bağlayıcının) ilgili rutinle bağlantı kurmasını sağlar.
İmza genellikle şunları kullanır:
Programlama dillerinin mevcut (2013) uygulamalarında , çağıran rutinin gerçek değişkenleri üzerinde çalışmak yerine çağrılan rutinin (çağrılan rutin) parametrelerinde çağıran rutinden argümanların bir kopyası alınır , ki bu her zaman böyle değildir. 1960'larda doğrudur (örneğin, FORTRAN IV'te).
Yine de, bunlar “küresel” olarak bildirilmişse, gerçek değişkenler üzerinde çalışmak her zaman mümkündür, ancak bu bir tehlike kaynağıdır ve “taşınabilir” değildir. Bu daha sonra bir kenar etkisi olarak adlandırılır .
Bununla birlikte, rutinler genellikle çağrılan rutin değişkenlerin (argümanların) değerlerinden ziyade bellek adresini ister. Bu mekanizma, bir kullanan işaretçi (ya da bir referans olarak, C ++ , Perl ve PHP ). Normalde, modülerlik adına bir rutin, çağıran rutinin (argümanlar) değişkenlerini değiştirerek bir değer döndürmez. Örneğin, Fortran'da bu, dil özellikleri tarafından kesinlikle yasaklanmıştır ve derleyiciler tarafından algılanır. Bir işlev, dönüş değeriyle tek bir sonuç döndürebilir. Bu sonuç, diğer şeylerin yanı sıra şunlar olabilir:
Rutinin gövdesi şunları içerir:
Ya artan sırada üç sayı yazarak, örneğin:
kodlanmış | açıklama |
---|---|
programme p1; | |
// Variables globales au programme. réel r1, r2, r3 ;
|
|
//********************************************
fonction min(réel a, b) : réel;
début
// Déterminer la valeur minimale.
si a < b alors
min := a ;
sinon
min := b ;
fin min;
|
Matematikte olduğu gibi kullanıldığında, burada tanımlanan min ve max işlevleri :
Maksimum rutin :
|
//********************************************
action classeETsort(réel a, b, c)
// Variables locales à la procédure.
réel inf, sup ;
début
// inf reçoit la plus petite valeur.
inf:= min(a, min(b, c));
// sup reçoit la plus grande valeur.
sup:= max(a, max(b, c));
// Afficher le triplet ordonné.
écrire (inf, a+b+c-inf-sup, sup) ;
fin classeETsort;
|
classETsort prosedürü (veya eylemi) :
|
//******************************************** début // Lire les 3 valeurs à trier. lire(r1); lire(r2); lire(r3 ); // Trier les 3 valeurs et les afficher // en utilisant la procédure classeETsort. classeETsort(r1, r2, r3); fin p1.
|
Programın ana rutini:
Okuma (ana program içinde) ve yazma (içinde classETsort rutin ) rutinleri önceden tanımlanması gereken varsayılır; |
int max ( int a, int b ) { return a > b ? a : b; } | Fonksiyonun maxparametreleri ave btamsayı ( int) vardır ve bir tamsayı değeri ( int) döndürür .
Parantezler {ve }unsurun gövdesini sınırlar. İşlevin adı ( max) gerçekleştirdiği işlemi tanımlar; ave arasındaki maksimum değeri döndürür b. Bu, dilin bir zorunluluğu değildir, ancak iyi bir programlama pratiği oluşturur: işlevin adı yalnızca anımsatıcı öneme sahiptir, davranışı yalnızca gövdesindeki talimatlara bağlıdır. Bazı dillerde, işlevin adı özellikle önemlidir. Örneğin, C++ 'da yapıcılar ve yıkıcılar, karşılık gelen sınıftan sonra adlandırılmalıdır. |
int main ( int argc, char *argv[] ) { //... printf ( "La valeur maximum est %i.\n", max(123,456) ); //... return 0; } | Ana işlev ( main), maxişlev bağımsız değişkeninde işlevi ("işlev çağrısı" olarak adlandırılır ) kullanır printf : max(123, 456). |
Tüm programlama dilleri her iki yordam biçimini de uygulamaz. İki yordam biçimini uygulayan diller, bildirimleri sırasında onları ayırt etmek için bir anahtar kelime saklar.
Dil | prosedür | fonksiyon |
---|---|---|
Lisp | Özel durum işlevi | defun |
C , C++ | Özel işlev durumu: özel dönüş türü void | Anahtar kelime yok |
paskal | PROCEDURE | FUNCTION |
Fortran | subroutine | function |
Algol | procedure | Özel prosedür durumu |
Bazı programlama dillerinde , iki kavram birbirine yakındır, ayrım yalnızca bir değerin döndürülmesi veya döndürülmemesi veya bir prosedürün birden çok sonuçla işlevin yerini alması veya bir işlevin giriş işlemlerini gerçekleştirmesi durumunda yapılır. /exit.
Öte yandan, prosedürlerin yanı sıra yalnızca saf işlevleri kabul eden diller söz konusu olduğunda , iki kavram çok farklıdır.
Örneğin, C / C++ veya Lisp'de tüm rutinler birer fonksiyondur; bu nedenle dil belgeleri yalnızca işlevden bahseder. Öte yandan, prosedürün eşdeğerine sahip olmak ve prosedürleri olan dillerde yazılmış programları kolayca dönüştürmek için C / C++ dil dili , voidhiçbir şey döndürmeyen bir işlev bildirmeyi mümkün kılan türü sağlar , bu sayede bir işlem yapar.
Olarak Cı- / C ++ , gibi bazı fonksiyonları, dönüş değeri printf()(stdout çıkış akışı için yazma) ya da scanf()bunların yerine bildirir (Stdin giriş akımına okuyun), daha sık kullanım o ki rutin tarafından gözardı olduğu; bu nedenle esasen bir prosedür gibi bir soruşturma rolü oynarlar.
Gelen Algol W , herhangi bir rutin C dili yaklaşımına benzer kullandığımız veya bir değeri, döner.
PL / I bir prosedürü sadece sonucu hafızaya alınmayan, aynı zamanda C dili yaklaşımına benzeyen bir fonksiyon olarak kabul eder.Öte yandan Fortran , Algol 60 , BASIC , Pascal , Modula 2 gibi diller anahtar kelimeler kullanarak her iki kavramı da net bir şekilde ayırt eder. .
beyanname | Tanım | |
---|---|---|
fonksiyon | int somme(int var1, int var2); | int somme(int var1, int var2) { return var1 + var2; } |
prosedür | void afficher(int var); | void afficher (int var) { printf ("Valeur = %i\n", var) ; return; } |
Wirth N., Algoritmalar ve veri yapıları , Eyrolles, 1980, trad. de Algoritmalar + Veri Yapıları = Programlar , 1976, Otomatik Hesaplamada Prentice-Hall Serisi.