Sistem jenis

Dalam sains komputer, **sistem jenis** ialah sistem yang digunakan bersama-sama bahasa pengaturcaraan bagi membantu mengurangkan pepijat dalam sesebuah atur cara komputer. Sistem jenis digunakan sebagai sebahagian daripada antara muka penakrif antara bahagian-bahagian berlainan dalam sesebuah atur cara, kemudian memastikan bahawa bahagian-bahagian itu disambungkan secara konsisten. Ini dicapai dengan mengembangkan sintaks bahasa pengaturcaraan terbabit supaya menyertakan *[[jenis (sains komputer)|jenis]]* yang dikaitkan dengan nilai primitif bahasa itu, beserta proses untuk menggunakan jenis-jenis tersebut bagi memastikan bahawa bahagian-bahagian terbabit disambungkan secara konsisten. Pemeriksaan boleh berlaku ketika pelbagai fasa kitar hayat atur cara seperti semasa dikompil atau semasa dijalankan, atau gabungan.

## Pemeriksaan jenis
### Penjenisan statik
Pemeriksaan jenis dilakukan semasa pengkompilan seperti yang digunakan dalam C dan C++.

Contoh dalam C

```c
int angka = 1; //pemboleh ubah angka diisytiharkan sebagai berjenis int, iaitu integer
```


### Penjenisan dinamik
Dalam penjenisan dinamik, sesuatu pemboleh ubah tidak semestinya kekal sebagai jenis yang ia mula-mula diisytiharkan, sebaliknya boleh bertukar-tukar sedang atur cara dijalankan. Ini kerana pemeriksaan jenis dilakukan semasa atur cara dijalankan oleh pelaksanaan bahasa berkenaan. Penjenisan sebegini biasanya diguna oleh bahasa-bahasa tafsiran seperti Python dan JavaScript.

Pelaksanaan bahasa berjenis dinamik secara umum mengkaitkan objek-objek masa jalanan dengan "tag" yang mengandungi maklumat jenis bagi objek-objek tersebut. Pengelasan masa jalanan ini kemudian diguna untuk melaksanakan pemeriksaan jenis dan menempatkan fungsi-fungsi banyak takrifan (*overload function*), tapi juga membolehkan penggunaan merata bagi serahan dinamik, ikatan lewat serta ungkapan serupa yang menjadi rumit lagi tidak cekap terutamanya dalam bahasa yang berjenis statik, di mana jenis varian atau ciri sepertinya perlu diguna.

Contoh penjenisan dinamik dalam Python:

```python
angka = 1 #diisytiharkan sebagai integer
angka = "Tukar kepada rentetan" #ditukar secara dinamik menjadi rentetan
```


### Gabungan penjenisan dinamik dan statik
Adanya penjenisan statik dalam sesebuah bahasa pengaturcaraan tidak semestinya bermaksud tiada langsung mekanisme penjenisan dinamik. Sebagai contoh, Java dan beberapa bahasa yang kononnya dijeniskan secara statik menyokong *[[downcasting]]* di samping pengendalian jenis lain yang bergantung kepada pemeriksaan ketika jalanan, suatu bentuk penjenisan dinamik.

### Pemeriksaan jenis statik dan dinamik secara praktikal
### Penjenisan kuat dan lemah: Takrifan Liskov

Pada 1974, Liskov dan Zilles memerihalkan bahasa berjenis kuat sebagai "bila saja sesuatu objek dihulurkan daripada fungsi pemanggil kepada fungsi yang dipanggil, jenisnya mesti serasi dengan jenis yang diisytiharkan dalam fungsi yang dipanggil."
Jackson menulis, "Dalam bahasa berjenis kuat, setiap kawasan data akan mempunyai jenis tertentu dan setiap proses akan menyatakan kehendak komunikasinya dalam sebutan jenis-jenis ini."

### Penjenisan kuat dan lemah
Sesebuah sistem jenis dikata menampilkan penjenisan kuat jika ia menyatakan satu atau lebih kekangan terhadap bagaimana operasi yang melibatkan nilai-nilai dengan jenis data yang berbeza boleh dicampuradukkan. Bahasa komputer yang melaksanakan pejenisan kuat akan mengelakkan pengendalian dilakukan dengan jayanya walaupun jenis argumen yang diberi adalah salah.

*Penjenisan lemah* bermakna bahawa sesebuah bahasa menukar (atau memeran) jenis secara tersirat apabila diguna. Lihat contoh berikut:

 **var** x := 5;    *// (1)*  (x ialah integer)
 **var** y := "37"; *// (2)*  (y ialah rentetan)
 x + y;         *// (3)*  (?)

Dalam bahasa yang penjenisannya lemah, hasil operasi ini bergantung kepada peraturan bahasa tertentu. Visual Basic akan menukar rentetan "37" kepada angka 37, membuat penambahan, dan menghasilkan angka 42. JavaScript akan menukar angka 5 kepada rentetan "5", membuat penjeraitan rentetan, lalu menghasilkan rentetan "537". Dalam JavaScript, penukaran kepada rentetan dipakai tanpa mengira turutan kendalian (*operand*) (misalnya, y + x menjadi "375") sementara dalam AppleScript, kendalian paling kiri yang akan menentukan jenis hasil, supaya x + y hasilnya angka 42 tetapi y + x ialah rentetan "375".

### Sistem dijeniskan secara selamat dan tak selamat
### Pemeriksaan jenis berlainan tahap
Sesetengah bahasa membenarkan pemeriksaan berlainan tahap untuk dipakai pada kawasan berlainan dalam kod. Contohnya:-
* Arahan (*directive*) `use strict` dalam JavaScript dan Perl memakai pemeriksaan yang lebih kukuh.
* Pengendali `@` dalam PHP mengabaikan sesetengah pesanan ralat.
* Option Strict On dalam VB.NET membenarkan pengkompil mengkehendaki perbualan antara objek.

Alatan tambahan seperti lint dan IBM Rational Purify juga boleh diguna untuk mencapai ketegasan bertahap lebih tinggi.

### Sistem jenis tak wajib
Gilad Bracha mengetuai pengusulan untuk membuatkan sistem jenis boleh dipilih tanpa bergantung kepada bahasa yang digunakan; di mana sistem jenis ialah modul yang boleh di "pasang" pada sesuatu bahasa jika perlu. Beliau percaya bahawa ini mendatangkan faedah kerana apa yang digelarnya sistem jenis wajib membuatkan bahasa tertentu menjadi kurang ekspresif dan kod menjadi lebih rapuh. Keperluan supaya jenis tidak memberi kesan ke atas semantik bahasa adalah sukar untuk dicapai: contohnya, warisan berasaskan kelas menjadi mustahil.

## Rujukan