
Baru-baru ini, sejumlah besar bahasa pemrograman baru telah muncul di pasaran: Go, Swift, Rust, Dart, Julia, Kotlin, Hack, Bosque - dan ini hanya salah satu yang didengar.
Nilai dari apa yang dibawa bahasa-bahasa ini ke dunia pemrograman sulit ditaksir terlalu tinggi, tetapi seperti yang Y Combinator
catat tahun lalu ketika berbicara tentang alat pengembangan:
Kerangka kerja semakin baik, bahasa sedikit lebih pintar, tetapi pada dasarnya kami melakukan hal yang sama.
Artikel ini akan berbicara tentang bahasa yang dibangun berdasarkan pendekatan yang secara fundamental berbeda dari pendekatan yang digunakan dalam semua bahasa yang ada, termasuk yang tercantum di atas. Secara umum, bahasa ini dapat dianggap sebagai bahasa tujuan umum, meskipun beberapa kemampuannya dan implementasi platform saat ini dibangun di atasnya, namun demikian, mungkin membatasi aplikasinya ke area yang sedikit lebih sempit - pengembangan sistem informasi.
Saya akan segera melakukan reservasi, ini bukan tentang ide, prototipe, atau bahkan MVP, tetapi tentang bahasa siap-produksi lengkap dengan semua bahasa infrastruktur yang diperlukan - dari lingkungan pengembangan (dengan debugger) hingga dukungan otomatis dari beberapa versi bahasa (dengan perbaikan gabungan bug otomatis di antaranya , release-note, dll). Selain itu, dengan menggunakan bahasa ini, beberapa lusin proyek kompleksitas tingkat ERP telah diimplementasikan, dengan ratusan pengguna simultan, basis data terabyte, "tenggat waktu kemarin", anggaran terbatas dan pengembang tanpa pengalaman di bidang TI. Dan semua ini pada saat bersamaan. Yah, tentu saja, harus dicatat bahwa sekarang bukan tahun 2000, dan semua proyek ini dilaksanakan di atas sistem yang ada (yang tidak ada di sana), yang berarti bahwa pada awalnya perlu untuk melakukan apa itu, tanpa menghentikan bisnis, dan kemudian, juga secara bertahap, lakukan sebagaimana mestinya. Secara umum, ini adalah cara menjual mobil listrik pertama bukan ke hipsters kaya di California, tetapi ke layanan taksi murah di suatu tempat di Omsk.
Platform yang dibangun dalam bahasa ini dirilis di bawah lisensi LGPL v3. Sejujurnya, saya tidak ingin menulisnya dengan benar di bagian pendahuluan, karena ini jauh dari keuntungan yang paling penting darinya, tetapi, berbicara dengan orang yang bekerja di salah satu pasar potensial utamanya - platform ERP, saya melihat satu fitur: semua orang tanpa kecuali mengatakan bahwa bahkan jika Anda melakukan hal yang sama yang sudah ada di pasaran, tetapi gratis, maka itu akan sangat keren. Jadi tinggalkan di sini.
Sedikit teori
Mari kita mulai dengan teori untuk menyoroti perbedaan dalam pendekatan mendasar yang digunakan dalam bahasa modern ini dan lainnya.
Penafian kecil, alasan lebih jauh sampai batas tertentu adalah upaya untuk menarik burung hantu ke dunia, tetapi dengan teori dasar dalam pemrograman, pada prinsipnya, katakan terus terang, tidak juga, jadi Anda harus menggunakan apa yang Anda miliki.
Salah satu tugas pertama dan utama yang diselesaikan oleh pemrograman adalah masalah menghitung nilai fungsi. Dari sudut pandang teori komputasi, ada dua pendekatan yang berbeda secara mendasar untuk memecahkan masalah ini.
Pendekatan pertama semacam itu adalah berbagai mesin (yang paling terkenal adalah mesin Turing) - model yang terdiri dari kondisi saat ini (memori) dan mesin (prosesor), yang pada setiap langkah mengubah keadaan saat ini dengan satu atau lain cara. Pendekatan ini juga disebut arsitektur Von Neumann, dan dialah yang mendasari semua komputer modern dan 99 persen bahasa yang ada.
Pendekatan kedua didasarkan pada penggunaan operator, digunakan oleh apa yang disebut
fungsi rekursif sebagian (selanjutnya disebut CHRF). Selain itu, perbedaan paling penting antara pendekatan ini adalah tidak dalam penggunaan operator seperti itu (operator, misalnya, juga dalam pemrograman struktural menggunakan pendekatan pertama), tetapi dalam kemungkinan iterasi semua nilai fungsi (lihat operator meminimalkan argumen) dan dalam ketiadaan negara dalam proses perhitungan.
Seperti mesin Turing, sebagian fungsi rekursif Turing selesai, yaitu, mereka dapat digunakan untuk menentukan perhitungan apa pun yang mungkin. Di sini, kami segera mengklarifikasi bahwa baik mesin Turing dan CRF hanya basis minimal, dan kemudian kami akan fokus pada mereka sebagai pendekatan, yaitu, pada model dengan memori prosesor dan pada model dengan operator tanpa menggunakan variabel dan kemungkinan iterasi semua nilai. fungsi masing-masing.
CRF sebagai pendekatan memiliki tiga keunggulan utama:
- Ini jauh lebih baik dioptimalkan. Ini berlaku baik secara langsung pada optimalisasi proses perhitungan nilai, dan kemungkinan paralelisme dari perhitungan semacam itu. Dalam pendekatan pertama, efek sampingnya, sebaliknya, menimbulkan kompleksitas yang sangat besar ke dalam proses-proses ini.
- Itu jauh lebih baik bertambah, yaitu, untuk fungsi yang dibangun, itu bisa jauh lebih efisien untuk menentukan bagaimana nilai-nilainya akan berubah ketika nilai-nilai fungsi yang dibangun menggunakan perubahan. Sebenarnya, keunggulan ini adalah kasus khusus dari yang pertama, tetapi justru inilah yang memberikan sejumlah besar kemungkinan, yang pada dasarnya tidak bisa dalam pendekatan pertama, oleh karena itu disorot sebagai item terpisah.
- Jauh lebih mudah dipahami. Artinya, secara kasar, deskripsi fungsi menghitung jumlah satu indikator dalam konteks dua indikator lainnya jauh lebih mudah dipahami daripada jika hal yang sama dijelaskan dalam pendekatan pertama. Namun, dalam masalah yang rumit secara algoritmik, situasinya berlawanan secara diametris, tetapi perlu dicatat bahwa masalah yang rumit secara algoritmik di sebagian besar wilayah baik jika 5%. Secara umum, untuk meringkas sedikit, CRF adalah matematika, dan mesin Turing adalah ilmu komputer. Dengan demikian, matematika dipelajari hampir di TK, dan ilmu komputer adalah opsional dan dari sekolah menengah. Perbandingan begitu-begitu, tentu saja, tetapi masih memberikan semacam metrik dalam hal ini.
Mesin Turing setidaknya memiliki dua keunggulan:
- Telah disebutkan penerapan terbaik dalam masalah algoritmik kompleks
- Semua komputer modern dibangun berdasarkan pendekatan ini.
Plus, dalam perbandingan ini kita hanya berbicara tentang tugas perhitungan data, dalam masalah mengubah data tanpa mesin Turing, Anda masih tidak bisa melakukannya.
Setelah membaca di tempat ini, setiap pembaca yang penuh perhatian akan mengajukan pertanyaan yang masuk akal: "Jika pendekatan CRF begitu baik, mengapa itu tidak digunakan dalam bahasa modern umum apa pun?" Jadi, pada kenyataannya, ini tidak begitu, itu digunakan, apalagi, dalam bahasa yang digunakan di sebagian besar sistem informasi yang ada. Seperti yang Anda duga, bahasa ini adalah SQL. Di sini, tentu saja, pembaca penuh perhatian yang sama akan keberatan bahwa SQL adalah bahasa aljabar relasional (yaitu, bekerja dengan tabel, bukan fungsi), dan itu akan benar. Secara formal. Bahkan, kita dapat mengingat bahwa tabel dalam DBMS biasanya dalam bentuk normal ketiga, yaitu, mereka memiliki kolom kunci, yang berarti bahwa setiap kolom yang tersisa dari tabel ini dapat dianggap sebagai fungsi dari kolom kunci. Tidak jelas, terus terang. Dan mengapa SQL belum berkembang dari bahasa aljabar relasional menjadi bahasa pemrograman yang lengkap (yaitu, bekerja dengan fungsi) adalah pertanyaan besar. Menurut pendapat saya, ada banyak alasan untuk ini, yang paling penting adalah "orang Rusia (sebenarnya siapa saja) tidak dapat bekerja dengan perut kosong, tetapi tidak ingin bekerja dengan makan yang cukup," dalam arti bahwa, seperti yang diperlihatkan oleh praktik, pekerjaan yang diperlukan untuk ini itu benar-benar raksasa dan membawa terlalu banyak risiko untuk perusahaan kecil, dan untuk perusahaan besar, pertama, semuanya baik-baik saja, dan kedua, tidak mungkin memaksakan pekerjaan ini dengan uang - kualitas penting di sini, bukan kuantitas. Sebenarnya, ilustrasi yang paling jelas tentang apa yang terjadi ketika orang mencoba untuk
menyelesaikan masalah dengan
kuantitas daripada kualitas adalah Oracle, yang bahkan berhasil mengimplementasikan bahkan aplikasi paling dasar dari inkrementalitas - representasi terwujud yang diperbarui sehingga mekanisme ini memiliki sejumlah
pembatasan beberapa halaman (keadilan) untuk itu, Microsoft masih
lebih buruk ). Namun, ini adalah cerita yang terpisah, mungkin akan ada artikel terpisah tentang itu.
Pada saat yang sama, bukan berarti SQL itu buruk. Tidak. Pada tingkat abstraksi, ia melakukan fungsinya dengan sempurna, dan implementasi platform saat ini menggunakannya sedikit kurang dari sepenuhnya (dalam hal apapun, jauh lebih banyak daripada semua platform lainnya). Hal lain adalah bahwa segera setelah kelahirannya, SQL sebenarnya berhenti dalam pengembangan dan tidak menjadi seperti apa, yaitu, bahasa yang akan dibahas sekarang.
Tapi cukup teori, sudah waktunya untuk langsung ke bahasa.
Jadi kita
bertemu :
Secara khusus, artikel ini akan menjadi bagian pertama dari tiga (karena masih ada terlalu banyak bahan, bahkan untuk dua artikel), dan itu hanya akan berbicara tentang model logis - yaitu, hanya tentang apa yang berhubungan langsung dengan fungsi sistem dan tidak ada hubungannya dengan proses pengembangan dan implementasi (optimalisasi kinerja). Selain itu, kami hanya akan berbicara tentang salah satu dari dua bagian model logis - logika area subjek. Logika ini menentukan informasi apa yang disimpan sistem dan apa yang dapat Anda lakukan dengan informasi ini (ketika mengembangkan aplikasi bisnis, itu juga sering disebut logika bisnis).
Secara grafis, semua konsep logika domain di lsFusion dapat diwakili oleh gambar berikut:
Panah dalam gambar ini menunjukkan arah penggunaan oleh konsep satu sama lain, dengan demikian, konsep membentuk semacam tumpukan, dan, sesuai dengan urutan tumpukan inilah saya akan membicarakannya.
Daftar isi- Sifat-sifat
- Properti Utama (DATA)
- Komposisi (BERGABUNG), Constant, Arithmetic (+, -, /, *), Logical (AND, OR), String (+, CONCAT), Perbandingan (>, <, =), Pilihan (KASUS, JIKA), Milik kelas (IS)
- Pengelompokan (GROUP)
- Partisi / Pengorganisasian (PARTITION ... ORDER)
- Rekursi (RECURSION)
- Tindakan
- Loop (UNTUK), Loop Rekursif (SAAT)
- Call (EXEC), Sequence ({...}), Branching (CASE, IF), Interrupt (BREAK), Exit (RETURN)
- Perubahan Properti (PERUBAHAN)
- Menambahkan Objek (BARU)
- Menghapus Objek (HAPUS)
- Ubah Sesi
- Membuat Sesi (NEWSESSION, NESTEDSESSION)
- Terapkan Perubahan (BERLAKU), Batalkan Perubahan (BATAL)
- Ubah Operator (PREV, CHANGED, SET, DROPPED)
- Acara
- Keterbatasan
- Kelas
- Agregasi
Sifat-sifat
Properti adalah abstraksi yang mengambil satu atau lebih objek sebagai parameter dan sebagai hasilnya, mengembalikan beberapa objek. Properti tidak memiliki efek samping, dan, pada kenyataannya, adalah fungsi murni, namun, tidak seperti yang kedua, properti tidak hanya dapat menghitung nilai, tetapi juga menyimpannya. Sebenarnya, nama "properti" itu sendiri dipinjam dari bahasa pemrograman modern lainnya, di mana ia digunakan untuk tujuan yang hampir sama, tetapi dipaku untuk enkapsulasi dan, oleh karena itu, didukung hanya untuk fungsi dengan satu parameter. Nah, fakta bahwa kata "properti" ini lebih pendek dari "fungsi murni", ditambah tidak memiliki asosiasi yang tidak perlu, dimainkan menggunakan istilah khusus ini.
Properti diatur secara rekursif menggunakan seperangkat operator yang telah ditentukan. Ada banyak operator ini, oleh karena itu, kami hanya mempertimbangkan yang utama (operator ini mencakup 95% dari proyek rata-rata statis).
Properti Utama (DATA)
Properti utama adalah properti yang nilainya disimpan dalam database dan dapat diubah sebagai akibat dari tindakan yang sesuai (tentang hal itu nanti). Secara default, nilai setiap properti tersebut untuk setiap set parameter sama dengan nilai NULL khusus.
, ( ), .
. :
class X {
Y y;
Map<Y, Z> f;
Map<Y, Map<M, Z>> m;
List<Y> n;
LinkedHashSet<Y> l; //
static Set<Y> s;
}
:
(JOIN), , (+,-,/,*), (AND, OR), (+, CONCAT), (>,<,=), (CASE, IF), (IS)
- , . , , , :
- , . , ( NULL). , lsFusion β , , , β TRUE ( FALSE NULL), 3-stateβ.
- NULL: (+), (-), CONCAT . :
- : NULL 0, β , 0 NULL ( 5 (+) NULL = 5, 5 (-) 5 = NULL, 5 + NULL = NULL 5 β 5 = 0).
- : NULL ( CONCAT β β, βJohnβ,βSmithβ = βJohn Smithβ, CONCAT β β, βJohnβ, NULL = βJohnβ, βJohnβ + β β + NULL = NULL).
- (IF) ( ) : f(a) IF g(a), f(a) g(a) NULL, NULL β .
(GROUP)
β . (, ) .
:
- :
, ( i sk). , , - : - SQL-:
( , , )
, ( ), β ( ). , , , ( , , SQL β ). , ( BY), - :
, , , , , .
:
/ (PARTITION β¦ ORDER)
( , ) , . , ( , ). / .
, , , , , , .
SQL ( , ) (OVER PARTITION BY⦠ORDER BY).
(RECURSION)
β , . , , .
. , ( ):
- (result) ( ) :
- result(0, o1, o2, ..., oN) = initial(o1, ..., oN), initial β
- result(i+1, o1, o2, ..., oN) = step(o1, ..., oN, $o1, $o2, ..., $oN) IF result(i, $o1, $o2, ..., $oN), step β .
- , ( o1, o2, β¦, oN). , .
, , , , :
, / , , , .
, , , , , lsFusion β .
SQL CTE, , , . , Postgres GROUP BY , , , , , , . , , WHILEβ .
. , , .
β , , , , ( , , ). , , ββ, , -, , , -, , ββ.
, β lsFusion. , β . , β ( , , , ). , β . .
, . / , , , , , . 3 97, lsFusion β 60 40.
, , . , -, ( , ), .
, :
(FOR), (WHILE)
, lsFusion , , NULL ( ).
, :
, , (IF).
(WHILE) , :
(EXEC), ({β¦}), (CASE, IF), (BREAK), (RETURN)
- . , , .
(CHANGE)
. , , , , NULL. :
, :
, , , ( , , , , selected discount β ), . , , .
(NEW)
( , , , , ). , , .
:
, , β NEW (FOR), ( ):
, FOR :
β , , , .
(DELETE)
β :
, «» .
, , .
, , . , , . .
, . , β / .
, , . , ( ), .
, , . , :
: (APPLY) (CANCEL). , , , . , , , . β , , , , . β .
(NEWSESSION, NESTEDSESSION)
(, , http- ..). , , . , , , «», «» ( , ). NEWSESSION, ( ). :
, , , . , :
, , ( ). NESTED, , , , . , ( , NESTED). :
. :
- , , , < β
- , , : < β
- , : < β .
, (, ), , . , , - , , , , , :
(APPLY), (CANCEL)
β , . , . , :
- . , , , NESTED ( ).
- , . , - , , , . , (update conflict), , , . , :
PS: Authentication, , , ( ) ( ). , , lsFusion , (, ).
β , , , , ( ).
(PREV, CHANGED, SET, DROPPED)
: (PREV), (CHANGED), NULL NULL (SET) .. ( ), , , :
. , , , , .
β ?β, β ?β. , , .
, , . , . .
:
, , :
, , , .
:
:
- , Β« Β». , , , ( , , 5-10 , ).
- , ( ), , , , .
:
:
( , ), .
, , , , βSomething changedβ (!) ( , ). , , - , (CHANGED, SET, DROPPED ..). , - , -, -. β :
, β , . , :
, , / , , .
SQL ( ) . , , , ( ) , .
, :
- β , ( )
- β , . , , «» .
, , . , , NULL:
, β , NULL (SET) , β NULL . β , , , / , .
, β ( ), , , ( ), , .
. , , , β . , :
, f NULL , A. :
, , β . ( , , «»), , , , : - , .
, lsFusion . , lsFusion . , . lsFusion , , - :
lsFusion , :
, β .
lsFusion β . , , :
/ , :
( ):
, , ( ), . ABSTRACT :
, .
, , :
, , ( ). , , .
, , . () : , , . , , , , , . NULL , , :
( ) β , . , , , :
, .
enumβ, , .
( lsFusion, ) :
.
() , NULL . , , , , , .
:
, , ( ):
, (, ), ( ) , . ,
ERP 1100 . , , , . , ( 50 ), , 1100 300 .
, , , , . , , β , β , , , Β« - Β», , , .
, lsFusion . , , , , , , , , , ( , , ). , lsFusion ( ACID), , SQL-, . , DSL lsFusion , , β β . , SQL , , lsFusion . , , β , github ( , ), (IDE, , VCS, ), slack telegram- , (linux maven, - ), , , , , lsFusion , SQL, ABAP 1 β .
, , lsFusion, , ( ), : ERP-, SQL- , ORM-, RAD-, . , , .
, :
- SQL- β - β , , .
- ERP- β - β , , ..
- ORM- β - (, ), .
- RAD β - , , , IT-.
- β , RAD, , - , , Excel (, , , β ).
, lsFusion ERP, RAD SQL , lsFusion ( ). , SQL, , , , , , Fortran C ( , ). ORM- , β . , , - .
SME ( , ), ( ). , 1 , .
, , , , , ( 12 ), .
UPD:
.