*Untuk bahasa pengaturcaraan "E" yang tidak berkait, dicipta oleh Wouter van Oortmerssen in 1991, lihat AmigaE.*
*Untuk bahasa pengesahan "e" yang tidak berkait dicipta oleh Verisity (kini Cadence), lihat bahasa pengesahan e.*

**E** merupakan bahasa pengaturcaraan berorentasikan objek bagi keselamatan komputer tersebar, dicipta oleh Mark S. Miller, Dan Bornstein, dan yang lain di Electric Communities pada 1997. E kebanyakannya berasal dari bahasa komputer Joule serentak dan daripada Original-E, set tambahan kepada Java bagi pengaturcaraan tersebar selamat (*secure distributed programming*). E menggabungkan pengiraan berasaskan pesanan dengan sintak bahasa pengaturcaraan Java. Model concurrency model berasaskan pengaturcaraan berasaskan peristiwa (*event-driven*) dan pengaturcaraan janji memastikan (*deadlock*) tidak mungkin berlaku.

Falsafah
--------

Keseluruhan bahasa ini direka dengan perancangan keselamatan komputer; ini dicapai kebanyakannya melalui kepatuhan kepada model penkomputeran berasaskan objek, yang dalam bentuk tulinnya mempunyai ciri-ciri yang menyokong pengkomputeraan selamat. Bahasa pengaturcaraan E dan perpustakaan piawaiannya menggunakan falsafah rekabentuk keselamatan berasaskan keupayaan sepenuhnya agar dapat membantu pengaturcaraan membina aturcara selamat dan membolehkan komponen aturcara bekerjasama sungguhpun ia saling tidak mempercayai sesama sendiri sepenuhnya. Bagi E, rujukan objek bertindak sebagai keupayaan, dengan itu keupayaan tidak menambah kepada kos asas pengkomputeran atau konsep. Sintak bahasa direka bagi memudahkan orang mengaudit bagi kecacatan keselamatan. Sebagai contoh, bidang lexical menghadkan jumlah kod yang perlu diperiksa bagi kesan pada pembolehubah yang tertentu. Sebagai contoh lain, bahasa ini menggunakan operator **==** bagi perbandingan dan operator **:=** bagi tugasan; bagi mengelakkan kekeliruan, tidak terdapat operator **=**.

Model pengiraan
---------------

Dalam E, kesemua nilai adalah objek dan pengiraan dilakukan dengan menghantar pesanan kepada objek. Setiap objek dimiliki *tangki vat* (sama dengan proses pengiraan (*computing process*). Setiap *tangki vat* memiliki satu benang perlaksanaan, rangka susunan, dan satu barisan peristiwa. Pengaturcaraan diagihkan hanyalah penghantaran pesanan-pesanan kepada objek jauh (objek dalam tangki vat lain). Semua hubungan dengan pihak jauh adalah dienkod dengan sukar oleh perlaksanaan E. Pesanan yang bari tiba diletakkan dalam barisan peristiwa tangki; pemprosesan kitar peristiwa tangki yang memproses pesanan satu demi satu menurut masa ketibaan.

E mempunyai dua cara menghantar pesanan: *panggilan segera* dan *hantar akhirnya*. Panggilan segera adalah sama seperti fungsi biasa atau kaedah panggilan dalam bahasa tidak serentak: penghantar menunggu sehingga penerima selesai dan memulangkan nilai. Hantar akhirnya menghantar pesanan sementara mencipta pemegang bagi keputusan dikenali sebagai *janji*. Penghantar segera memproses menggunakan janji. Kemudian apabila penerima selesai dan menghasilkan keputusan, janji menyelesaikan keputusan. Oleh kerana hanya hantar akhirnya dibenarkan apabila berhubungan dengan objek jauh, deadlock tidak boleh berlaku. Dalam sistem teragih, mekanisma janji turut menimumkan kelewatan disebabkan kelesuan jaringan.

Sintak dan contoh
-----------------

Sintak E menyerupai bahasa pengaturcaraan Java, sungguhpun ia turut menyerupai bahasa pengaturcaraan Python dan bahasa pengaturcaraan Pascal. Pembolehubah adalah jenisdata dan skop lexically. Bagaimanapun, tidak sebagaimana Java atau Python, E terbentuk sepenuhnya dari pengaturcaraan gambaran. Disini adalah contoh aturcara E mudah.

```
println("Hello, Dunia!")
```

Ini adalah fungsi rekursif bagi mengira faktoria bagi nombor, ditulis menggunakan E. Fungsi ditakrifkan menggunakan kata kunci **def**.

```
def factorial(n :int) :int {
  if (n == 0) {
    return 1
  } else if (n > 0) {
    return n * factorial(n-1)
  } else {
    throw("invalid argument to factorial: "+n)
  }
}
```

Dalam baris pertama, **:int** merupakan *pengawal* yang menghadkan *argument* dan hasil fungsi tersebut. Pengawal tidak sama dengan pengistiharan jenis; pengawal merupakan pilihan dan boleh menyatakan kekangan. **:int** pertama memastikan badan fungsi hanya baoleh mengendalikan kenyataan integer. Tanpa **:int** kedua di atas, fungsi ini tidak mampu memulangkan nilai. Kemampuan melihat dibahagian awal bahawa maklumat yang keluar dari fungsi memudahkan pengauditan keselamatan.

Pautan luar
-----------

* ERights.org

Kategori:Bahasa pengaturcaraan Kurungan Curly]]