Algoritme
cara yang terstruktur untuk menggambarkan algoritme yang mencegah banyaknya kerancuan pada pernyataan-pernyataan bahasa alamiah. Bahasa pemrograman ditujukan untuk mengekspresikan algoritme dalam sebuah bentuk yang dapat dieksekusi oleh komputer, tetapi sering kali digunakan sebagai suatu cara untuk menentukan atau mendokumentasikan algoritme.
Ada banyak macam kemungkinan representasi dan seseorang dapat mengekspresikan sebuah program mesin Turing sebagai urutan dari tabel-tabel mesin (lihat lebih lanjut di mesin kondisi-terbatas, tabel transisi kondisi dan tabel kontrol), sebagai diagram alur dan bagan drakon (lihat lebih lanjut di diagram kondisi), atau sebagai bentuk kode mesin atau kode assembly dasar yang dikenal "kumpulan lipat empat" (lihat lebih lanjut di mesin Turing).
1 Deskripsi tingkat-tinggi "... ditujukan untuk menjelaskan algoritme, menghiraukan rincian implementasi. Pada tingkat ini kita tidak perlu menyebutkan bagaimana mesin mengatur perangkat pita atau kepala pita rekam." 2 Deskripsi implementasi "... digunakan untuk menjelaskan cara mesin Turing menggunakan kepalanya dan cara menyimpan data. Pada tingkat ini kita tidak memberikan secara rinci kondisi atau fungsi transisi." 3 Deskripsi formal Lebih rinci, "tingkat paling rendah", menjelaskan "tabel kondisi" dari mesin Turing.
Sebagai contoh dari algoritme sederhana "Penjumlahan m+n" dijelaskan dalam tiga tingkatan tersebut lihat contoh algoritme.
Kebanyakan algoritme ditujukan untuk diimplementasikan sebagai program komputer. Namun, algoritme juga diimplementasikan dengan tujuan lain, seperti dalam jaringan saraf biologis (sebagai contohnya, otak manusia yang mengimplementasikan aritmetika atau sebuah serangga yang melihat makanan), dalam sirkuit elektris, atau dalam sebuah perangkat mekanis.
Dalam sistem komputer, sebuah algoritme pada dasarnya adalah instansi dari logika ditulis dalam perangkat lunak oleh pengembang perangkat lunak supaya efektif untuk komputer yang "ditargetkan" untuk mesin tertentu untuk menghasilkan keluaran dari masukan yang diberikan (kemungkinan nul).
Program yang "elegan" (padat), program yang "baik" (cepat): Pernyataan dari "sederhana dan elegan" muncul secara informal dalam buku Knuth dan dalam Chaitin:
Knuth: "... kita menginginkan algoritme yang baik dalam definisi estetika sederhana. Salah satu kriterianya... adalah waktu yang dibutuhkan untuk berjalannya algoritme... Kriteria yang lain adalah adaptasi dari algoritme ke komputer, kesederhanaan dan elegan, dll"
Chaitin: "... sebuah program adalah 'elegan, maksud saya adalah ia merupakan program terkecil untuk menghasilkan keluaran."
Chaitin membuka definisinya dengan: "Saya akan perlihatkan bahwa anda tidak dapat membuktikan sebuah program adalah 'elegan'"-bukti tersebut akan menyelesaikan permasalahan perhentian (ibid).
Algoritme terhadap fungsi yang dapat dihitung oleh algoritme: Untuk sebuah fungsi bisa ada beberapa algoritme. Hal ini benar, bahkan tanpa mengembangkan kumpulan instruksi yang ada bagi programmer. Rogers mengamati bahwa "Sangat... penting untuk membedakan antara pengertian algoritme, misalnya prosedur dan pernyataan fungsi yang dihitung oleh algoritme, misalnya pemetaan hasil dari prosedur. Fungsi yang sama bisa memiliki beberapa algoritme berbeda".
Sayangnya ada pertukaran antara kebaikan (kecepatan) dan elegan (kepadatan)-- sebuah program yang elegan bisa melakukan lebih banyak langkah untuk menyelesaikan sebuah komputasi daripada yang kurang elegan. Sebuah contoh yang menggunakan algoritme Euclid bisa dilihat di bawah.
Komputer (dan komputor), model dari komputasi: Sebuah komputer (atau manusia "komputor") adalah tipe terbatas dari mesin, sebuah "perangkat mekanis deterministik diskrit" yang secara buta mengikuti instruksinya. Model primitif dari Melzak dan Lambek mereduksi pemikiran tersebut menjadi empat elemen: (i) diskrit, lokasi yang bisa dibedakan, (ii) diskrit, penghitung yang tak bisa dibedakan
(iii) sebuah agen, dan (iv) sebuah daftar instruksi yang efektif relatif terhadap kemampuan dari agen.
Minsky menjelaskan variasi yang lebih sesuai dari model "abacus"-nya Lambek dalam "Basis Komputabilitas Paling Sederhana". Mesin Minsky memproses secara berurutan lewat lima (atau enam tergantung bagaimana seseorang menghitungnya) instruksi kecuali baik sebuah kondisi IF-THEN GOTO atau GOTO tak bersyarat mengubah alur program keluar dari urutan. Selain HALT, mesin Minsky mengikutkan
tiga operasi penetapan (penggantian, substitusi): ZERO (misalnya, isi dari lokasi diganti oleh 0: L  0), SUCCESSOR (misalnya, L  L+1), dan DECREMENT (misalnya, L  L-1). Jarang seorang programer harus menulis "kode" dengan kumpulan instruksi terbatas. Tapi Minsky memperlihatkan (sebagaimana Melzak dan Lambek) bahwa mesinnya adalah Turing komplet dengan
hanya empat tipe instruksi utama: GOTO kondisional, GOTO tak bersyarat, penetapan/penggantian/substitusi, dan HALT.
Simulasi dari sebuah algoritme: bahasa komputer (komputor): Knuth menganjurkan pembaca bahwa "cara terbaik untuk belajar algoritme dalah mencobanya... langsung ambil pulpen dan kertas dan bekerja lewat contoh". Lalu bagaimana dengan simulasi atau eksekusi yang sebenarnya? Programmer harus menerjemahkan algoritme ke dalam bahasa yang mana simulator/komputer/komputor dapat mengeksekusi
secara efektif. Stone memberikan contoh dari hal ini: saat menghitung akar dari persamaan kuadrat si komputor harus tahu bagaimana mendapatkan akar kuadrat. Jika tidak maka supaya algoritme dapat efektif ia harus menyediakan sejumlah aturan untuk mengekstrak akar kuadrat.
Hal ini berarti programer harus tahu sebuah "bahasa" yang efektif relatif terhadap target pada agen komputasi (komputer/komputor).
Lalu model apa yang seharusnya digunakan untuk simulasi? Van Emde Boas mengamati "bahkan bila kita mendasari teori kompleksitas dengan mesin abstrak bukannya mesin kongkrit, kesembarangan dari pemilihan model masih tetap ada. Pada titik itulah mulainya pemikiran simulasi". Bila kecepatan yang dihitung, jumlah instruksi berpengaruh. Sebagai contohnya, subprogram dalam
algoritme Euclid untuk menghitung sisa akan berjalan lebih cepat jika programmer memiliki instruksi "modulus" (sisa pembagian) bukannya dengan pengurangan (atau lebih parah: hanya "penurunan").
Pemrograman terstuktur, struktur kanonikal: Menurut Tesis Church-Turing setiap algoritme bisa dihitung dengan sebuah model yang dikenal Turing komplet, dan menurut demonstrasi Minsky kekomplitan Turing membutuhkan hanya empat tipe instruksi-GOTO bersyarat, GOTO tak bersyarat, penetapan, HALT. Kemeny dan Kurtz mengamati bahwa saat penggunaan GOTO tak bersyarat yang "tak disiplin" dan IF-THEN
GOTO bersyarat bisa menghasilkan "kode spageti" seorang programer bisa menulis program terstruktur menggunakan instruksi tersebut; di lain sisi "juga memungkinkan, dan tidak begitu sulit, untuk menulis sebuah program terstruktur yang buruk dalam sebuah bahasa terstruktur". Tausworthe menambahkan tiga struktur kanon Bohm-Jacopini: SEQUENCE, IF-THEN-ELSE, dan WHILE-DO, dengan dua lagi: DO-WHILE dan
CASE. Keuntungan dari program terstruktur adalah ia cocok dengan pembuktian kebenaran menggunakan induksi matematika.
Simbol diagram alur: Pembantu grafik yang disebut diagram alur memberikan suatu cara untuk menjelaskan dan mendokumentasikan sebuah algoritme (dan program komputer). Seperti alur program dari mesin Minsky, sebuah diagram alur selalu mulai dari atas dan terus ke bawah. Simbol utamanya hanya 4: arah panah memperlihatkan alur program, segi empat (SEQUENCE, GOTO), wajik (IF-THEN-ELSE), dan titik (OR). Struktur kanonikal
Bohm-Jacopini dibuat dari bentuk-bentuk primitif tersebut. Sub-struktur bisa "bersarang" dalam segi empat hanya jika jalan keluar tunggal terjadi pada super-struktur. Simbol dan penggunaannya untuk membangun struktur kanonikal diperlihatkan dalam diagram.