Carita ngeunaan hiji proyék leutik panjangna dua belas taun (ngeunaan BIRMA.NET pikeun kahiji kalina sareng terus terang heula)

Lahirna proyék ieu bisa dianggap gagasan leutik nu sumping ka kuring wae di ahir 2007, nu ieu Linggarjati pikeun manggihan bentuk ahir na ngan 12 taun engké (dina titik ieu waktos - tangtosna, sanajan palaksanaan ayeuna, nurutkeun ka pangarang, nyugemakeun pisan).

Éta sadayana dimimitian nalika, dina prosés ngalaksanakeun tugas resmi kuring di perpustakaan, kuring narik perhatian kanyataan yén prosés ngasupkeun data tina téks scan tina tabel eusi buku (sareng musik) publikasi kana database anu aya, Tétéla, bisa nyata disederhanakeun jeung ngajadikeun otomatis, ngamangpaatkeun sipat orderliness na repeatability sadaya data diperlukeun pikeun input, kayaning ngaran panulis artikel (lamun urang ngobrol ngeunaan kumpulan artikel), judul artikel (atanapi subjudul anu ditingali dina daptar eusi) sareng nomer halaman tina daptar eusi ayeuna. Mimitina, kuring sacara praktis yakin yén sistem anu cocog pikeun ngalaksanakeun tugas ieu tiasa gampang dipendakan dina Internét. Nalika sababaraha kejutan disababkeun ku kanyataan yén kuring henteu mendakan proyék sapertos kitu, kuring mutuskeun pikeun nyobian ngalaksanakeunana nyalira.

Saatos waktos anu cukup pondok, prototipe munggaran mimiti damel, anu kuring langsung dianggo dina kagiatan sapopoé, sakaligus debugging dina sadaya conto anu sumping ka panangan kuring. Untungna, di tempat kerja kuring anu biasa, dimana kuring sanés programmer, kuring teras-terasan tetep ngajauhan "downtime" anu katingali dina padamelan kuring, nalika kuring sacara intensif debugging poko-poko kuring - hiji hal anu ampir teu kapikiran dina realitas ayeuna, anu hartosna laporan poéan dina karya dipigawé salila poé. Prosés polishing program nyandak jumlahna teu kurang ti sataun, tapi malah sanggeus éta hasilna boro bisa disebut sagemblengna suksés - loba teuing konsep béda mimitina diteundeun handap nu teu sagemblengna jelas pikeun palaksanaan: elemen pilihan nu bisa dilewatan; nempoan maju tina elemen (pikeun kaperluan substituting elemen saméméhna kana hasil teangan); malah usaha urang sorangan pikeun nerapkeun hal kawas ungkapan biasa (anu boga sintaksis unik). Kuring kudu nyebutkeun yén saméméh ieu kuring geus nyerah programming rada (kira-kira 8 taun, lamun teu leuwih), jadi kasempetan anyar pikeun nerapkeun kaahlian abdi kana hiji tugas metot jeung diperlukeun lengkep direbut perhatian kuring. Henteu heran yén kode sumber anu dihasilkeun - dina henteuna pendekatan anu jelas pikeun desainna di pihak kuring - rada gancang janten mishmash anu teu kabayang tina potongan-potongan anu béda dina basa C sareng sababaraha unsur C ++ sareng aspék pemrograman visual (mimitina éta. mutuskeun pikeun ngagunakeun sistem desain sapertos Borland C ++ Pangwangun - "ampir Delphi, tapi dina C"). Nanging, sadayana ieu pamustunganana ngahasilkeun hasil pikeun ngajadikeun otomatis kagiatan sapopoé perpustakaan urang.

Dina waktos anu sami, kuring mutuskeun, bisi waé, nyandak kursus pikeun ngalatih pamekar parangkat lunak profésional. Kuring henteu terang naha éta leres-leres tiasa diajar "janten programmer" ti mimiti didinya, tapi ningal kaahlian anu kuring parantos aya dina waktos éta, kuring tiasa rada ngawasa téknologi anu langkung relevan dina waktos éta, sapertos kitu. sakumaha C #, Visual Studio pikeun ngembangkeun handapeun .NET, kitu ogé sababaraha téknologi patali Java, HTML jeung SQL. Sakabéh palatihan nyandak total dua taun, sarta dilayanan salaku titik awal pikeun proyék séjén milik, nu pamustunganana stretched leuwih sababaraha taun - tapi ieu topik pikeun publikasi misah. Di dieu eta ngan bakal luyu pikeun dicatet yén kuring nyieun usaha pikeun adaptasi kamajuan Kuring geus kungsi dina proyék dijelaskeun pikeun nyieun aplikasi jandela full-fledged dina C# jeung WinForms nu implements pungsionalitas diperlukeun, sarta ngagunakeun eta salaku dadasar pikeun. proyék diploma upcoming.
Kana waktu, gagasan ieu mimiti sigana kuring pantes keur bersuara dina konferensi taunan misalna kalawan partisipasi wawakil rupa perpustakaan salaku "LIBKOM" jeung "CRIMEA". Ide, enya, tapi henteu palaksanaan kuring dina waktos éta. Teras kuring ogé ngarep-arep yén batur bakal nyerat deui nganggo pendekatan anu langkung kompeten. Hiji cara atanapi anu sanés, ku 2013 kuring mutuskeun pikeun nyerat laporan ngeunaan padamelan awal kuring sareng ngirimkeunana ka Panitia Pangatur Konférénsi kalayan aplikasi pikeun hibah pikeun ilubiung dina konperénsi éta. Pikeun rada reuwas kuring, aplikasi kuring disatujuan, sarta kuring mimiti nyieun sababaraha perbaikan proyék pikeun nyiapkeun eta pikeun presentasi dina konferensi.

Dina waktos éta, proyék éta parantos nampi nami énggal BIRMA, ngagaduhan sababaraha kamampuan tambahan (henteu seueur dilaksanakeun, tapi dianggap) - sagala rinci bisa kapanggih dina laporan abdi.

Jujur, éta hésé nelepon BIRMA 2013 hal lengkep; Terus terang diomongkeun, éta karajinan pisan hacky dijieun dina rurusuhan. Dina watesan kode, praktis teu aya inovasi husus, iwal hiji usaha rada daya teu upaya pikeun nyieun sababaraha jenis sintaksis ngahiji pikeun parser, dina penampilan reminiscent tina basa pormat IRBIS 64 (jeung kanyataanna, ogé sistem ISIS -). kalayan kurung salaku struktur siklik; naha Dina waktos éta kuring panginten katingalina saé). Parser hopelessly stumbled on bunderan ieu kurung tipe luyu (saprak kurung ogé dipigawé peran séjén, nyaéta, aranjeunna ditandaan struktur pilihan salila parsing nu bisa skipped). Kuring deui ngarujuk ka dulur anu hoyong wawuh sareng anu teras hese dibayangkeun, sintaksis BIRMA anu teu leres sacara langkung jéntré kana laporan kuring waktos éta.

Sacara umum, sajaba ti berjuang jeung parser kuring sorangan, kuring teu boga nanaon deui ngomong ngeunaan kode versi ieu - iwal konversi sabalikna tina sumber aya kana C ++ bari preserving sababaraha fitur has kode NET (jujur, éta. hese ngarti , naon kahayang ngajurung kuring pikeun mindahkeun sagalana deui - meureun sababaraha sieun bodo pikeun ngajaga kode sumber abdi rusiah, saolah-olah éta hal sarua jeung resep rusiah Coca-Cola).

Panginten kaputusan bodo ieu ogé mangrupikeun alesan pikeun kasusah dina nyapasangkeun perpustakaan DLL anu hasilna sareng antarmuka anu aya tina workstation buatan bumi pikeun ngalebetkeun data kana katalog éléktronik (enya, kuring henteu nyarios kanyataan penting anu sanés: ti ayeuna, sadayana. kode "mesin" BIRMA éta saperti nu diharapkeun, éta dipisahkeun tina bagian panganteur na rangkep dina DLL luyu). Naha perlu nulis workstation misah pikeun tujuan ieu, nu atoh, dina penampilan sarta metoda interaksi jeung pamaké, shamelessly nyalin workstation sarua "Catalogizer" tina sistem IRBIS 64 - ieu patarosan misah. Pondokna: eta masihan solidity diperlukeun pikeun kuring lajeng kamajuan pikeun proyék wisuda kuring (disebutkeun mesin parser indigestible nyalira éta kumaha bae teu cukup). Sajaba ti éta, kuring lajeng encountered sababaraha kasusah dina ngalaksanakeun panganteur tina workstation Cataloger kalawan modul kuring sorangan, dilaksanakeun dina duanana C ++ jeung C #, sarta langsung ngakses mesin kuring.

Sacara umum, cukup aneh, ieu prototipe rada kagok BIRMA.NET kahareup anu ditakdirkeun pikeun jadi "workhorse" kuring pikeun opat taun ka hareup. Teu tiasa nyarios yén salami ieu kuring henteu sahenteuna nyobian milarian cara pikeun palaksanaan énggal anu langkung lengkep tina ide anu parantos lami. Diantara inovasi anu sanés, kedahna parantos aya urutan siklik anu disarangkeun anu tiasa kalebet unsur-unsur pilihan - ieu kumaha kuring badé ngahirupkeun ideu témplat universal pikeun déskripsi bibliografi ngeunaan publikasi sareng sagala rupa hal anu pikaresepeun. Nanging, dina kagiatan praktis kuring dina waktos éta, sadayana ieu sakedik dibutuhkeun, sareng palaksanaan anu kuring parantos dina waktos éta cekap pikeun ngalebetkeun daptar eusi. Sajaba ti éta, vektor ngembangkeun perpustakaan urang mimiti nyimpang beuki loba nuju digitalisasi arsip musium, ngalaporkeun jeung kagiatan séjén saeutik dipikaresep ku kuring, nu tungtungna kapaksa kuring ninggalkeun eta, mere jalan ka jalma anu bakal. janten langkung gumbira sareng sadayana ieu.

Paradoks, saatos kajadian dramatis ieu, proyék BIRMA, anu dina waktos éta parantos ngagaduhan sagala ciri khas tina proyék konstruksi jangka panjang, sigana mimiti nyandak kahirupan anyar anu ditunggu-tunggu! Kuring ngagaduhan langkung waktos luang pikeun pamikiran anu dianggurkeun, kuring deui mimiti nyisiran World Wide Web dina milarian anu sami (untungna, ayeuna kuring parantos tiasa nebak milarian sadayana ieu sanés ngan di mana waé, tapi dina GitHub), sareng dimana waé di At the Awal taun ieu, kuring tungtungna mendakan produk anu cocog ti perusahaan Salesforce anu terkenal kalayan nami anu teu penting. Gorp. Ku nyalira, éta tiasa ngalakukeun ampir sadayana anu kuring peryogikeun tina mesin parser sapertos kitu - nyaéta, sacara cerdas ngasingkeun fragmen individu tina téks anu sawenang-wenang, tapi terstruktur jelas, bari gaduh antarmuka anu cukup ramah pikeun pangguna akhir, kalebet ésens anu kaharti, sapertos. pola a, template jeung lumangsungna, sarta dina waktos anu sareng ngagunakeun sintaksis akrab tina éksprési biasa, nu janten incomparably leuwih dibaca alatan division kana grup semantis ditunjuk pikeun parsing.

Sacara umum, kuring mutuskeun yén ieu téh hiji Gorp (Kuring heran naon hartina ngaran ieu? Sugan sababaraha jenis "parser biasa berorientasi umum"?) - kahayang Kuring geus pilari lila. Leres, palaksanaan langsung na pikeun kaperluan kuring sorangan ngagaduhan masalah sapertos mesin ieu peryogi adherence ketat teuing kana sekuen struktural téks sumber. Kanggo sababaraha laporan sapertos file log (nyaéta, aranjeunna ditempatkeun ku pamekar salaku conto anu jelas ngeunaan ngagunakeun proyék), éta cocog pisan, tapi pikeun téks anu sami tina tabel eusi anu diimbas, éta henteu mungkin. Barina ogé, halaman anu sami sareng daptar eusi tiasa dimimitian ku kecap "Daftar Eusi", "Eusi" sareng déskripsi awal sanés anu urang henteu kedah nempatkeun dina hasil analisa anu dimaksud (sareng motong aranjeunna sacara manual. unggal waktu oge teu merenah). Sajaba ti éta, antara elemen repeating individu, kayaning ngaran pangarang, judul jeung nomer kaca, kaca bisa ngandung jumlah nu tangtu sampah (contona, gambar, sarta ngan karakter acak), nu eta oge bakal hade mun bisa. dipotong. Sanajan kitu, aspék panungtungan éta teu acan jadi signifikan, tapi alatan kahiji, palaksanaan aya teu bisa ngamimitian néangan struktur diperlukeun dina téks ti tempat nu tangtu, tapi ngan saukur ngolah eta ti mimiti, teu manggihan pola dieusian aya na ... réngsé pakasaban abdi. Jelas, sababaraha tweaking diperlukeun pikeun sahenteuna ngidinan sababaraha spasi antara struktur repeating, sarta yén kuring balik deui ka pagawean.

masalah sejen éta proyék sorangan dilaksanakeun di Java, sarta lamun kuring rencanana di mangsa nu bakal datang pikeun nerapkeun sababaraha cara interfacing téhnologi ieu kalawan aplikasi akrab pikeun ngasupkeun data kana database aya (kayaning Irbis urang "Cataloguer"), lajeng sahenteuna sahenteuna. ngalakukeun ieu dina C # jeung .NET. Éta sanés yén Java sorangan mangrupikeun basa anu goréng - kuring kantos dianggo pikeun nerapkeun aplikasi jandela anu pikaresepeun anu ngalaksanakeun fungsionalitas kalkulator anu tiasa diprogram domestik (salaku bagian tina proyek kursus). Sareng tina segi sintaksis éta sami sareng C-seukeut anu sami. Nya, ieu ngan ukur tambah: langkung gampang pikeun kuring pikeun ngabéréskeun proyék anu tos aya. Nanging, kuring henteu hoyong terjun deui kana dunya anu rada luar biasa tina téknologi Java (atanapi langkung tepatna, desktop) téknologi Java - barina ogé, basana sorangan henteu "disesuaikeun" pikeun panggunaan sapertos kitu, sareng kuring henteu pisan ngabutuhkeun pengulangan. pangalaman saméméhna. Panginten éta kusabab C # sareng WinForms langkung caket kana Delphi, dimana seueur urang sakali ngamimitian. Untungna, leyuran diperlukeun kapanggih rada gancang - dina bentuk proyék IKVM.NET, anu matak ngagampangkeun pikeun narjamahkeun program Java anu aya kana kode .NET anu dikelola. Leres, proyék éta sorangan parantos ditinggalkeun ku pangarang dina waktos éta, tapi palaksanaan pang anyarna ngamungkinkeun kuring cukup suksés ngalaksanakeun tindakan anu dipikabutuh pikeun téks sumber. Gorp.

Ku kituna kuring dijieun sagala parobahan diperlukeun tur dirakit kabeh kana DLL tina tipe luyu, nu bisa kalayan gampang "dipulut" ku sagala proyék pikeun .NET Framework dijieun dina Visual Studio. Samentawis waktos, kuring nyiptakeun lapisan anu sanés pikeun presentasi hasil anu dipulangkeun Gorp, dina wangun struktur data saluyu anu bakal merenah pikeun diolah dina tampilan tabel (nyokot salaku dadasar boh baris jeung kolom; boh konci kamus jeung indéks numerik). Nya, utilitas anu dipikabutuh pikeun ngolah sareng nampilkeun hasilna ditulis gancang pisan.

Ogé, prosés adaptasi témplat pikeun mesin énggal pikeun ngajar éta pikeun ngungkabkeun conto téks anu discan tina daptar eusi henteu nyababkeun komplikasi khusus. Nyatana, kuring henteu kedah ngarujuk kana témplat kuring samemehna: Kuring ngan saukur nyiptakeun sadaya témplat anu diperyogikeun ti mimiti. Sumawona, upami témplat anu dirancang pikeun dianggo sareng versi sateuacana tina sistem nyetél kerangka anu cukup heureut pikeun téks anu leres tiasa diuraikan kalayan bantosanana, mesin énggal parantos ngamungkinkeun pikeun ngembangkeun témplat anu cukup universal anu cocog pikeun sababaraha jinis markup dina. sakali. Kuring malah diusahakeun nulis sababaraha jenis template komprehensif pikeun sagala tabel wenang eusi téks, sanajan, tangtosna, sanajan kalawan sagala kemungkinan anyar muka up pikeun kuring, kaasup, hususna, kamampuhan kawates pikeun nerapkeun urutan repeating nested sarua ( kayaning, contona, ngaran kulawarga jeung inisial sababaraha pangarang dina urutan), ieu tétéla utopia a.

Panginten ka hareupna bakal tiasa nerapkeun konsép meta-témplat anu tangtu, anu bakal tiasa pariksa téks sumber pikeun sasuai sareng sababaraha témplat anu sayogi sakaligus, teras, saluyu sareng hasil anu dicandak, pilih nu paling merenah, ngagunakeun sababaraha jenis algoritma calakan. Tapi ayeuna kuring langkung prihatin kana patarosan anu sanés. A parser kawas Gorp, Sanajan sagala versatility sarta modifikasi I dijieun, éta masih inherently henteu mampuh ngalakukeun hiji hal sahingga bisa hirup kalawan basajan nu parser timer ditulis kuring bisa ngalakukeun ti versi pisan munggaran. Nyaéta: anjeunna gaduh kamampuan milarian sareng nimba tina téks sumber sadaya fragmen anu cocog sareng topéng anu dijelaskeun dina template anu dianggo dina tempat anu leres, bari henteu kabetot kana naon anu aya dina téks anu dipasihkeun dina rohangan antara fragmen ieu. Sajauh ieu, kuring ngan ukur ningkatkeun mesin énggal, anu ngamungkinkeun anjeun milarian sadaya pangulangan énggal anu mungkin tina sekuen masker sapertos kitu tina posisi ayeuna, nyésakeun kamungkinan ayana dina téks susunan karakter sawenang anu lengkep. unaccounted keur di parsing nu, enclosed antara struktur repeating kauninga. Nanging, ieu henteu ngamungkinkeun pikeun nyetél topéng salajengna henteu paduli hasil milarian sempalan sateuacana nganggo topéng anu saluyu: ketatna struktur téks anu dijelaskeun masih henteu ngantepkeun rohangan pikeun inklusi sawenang tina karakter anu henteu teratur.

Sareng upami conto-conto daptar eusi anu kuring mendakan masalah ieu henteu acan sigana serius, teras nalika nyobian nerapkeun mékanisme parsing énggal kana tugas anu sami pikeun nga-parsing eusi halaman wéb (nyaéta parsing anu sami), éta. watesan aya didieu aranjeunna mucunghul kalawan sagala obviousness maranéhna. Barina ogé, cukup gampang pikeun nyetél masker anu dipikabutuh pikeun serpihan markup wéb, antara anu data anu urang milarian (anu kedah diekstrak) kedah aya, tapi kumaha urang tiasa maksakeun parser pikeun langsung ngaléngkah ka hareup. sempalan sarupa, sanajan sagala tag mungkin jeung atribut HTML nu bisa ditempatkeun dina spasi antara aranjeunna?

Saatos mikir sakedik, kuring mutuskeun pikeun ngenalkeun sababaraha pola jasa (%all_before) и (%all_after), Ngalayanan tujuan anu jelas pikeun mastikeun yén sadaya anu aya dina téks sumber dilewati sateuacan pola (topeng) anu nuturkeunana. Leuwih ti éta, lamun (%all_before) ngan saukur dipaliré sagala inclusions sawenang ieu, lajeng (%all_after), Sabalikna, diwenangkeun aranjeunna ditambahkeun kana sempalan nu dipikahoyong sanggeus pindah ti sempalan saméméhna. Keur disada cukup basajan, tapi pikeun nerapkeun konsep ieu kuring kungsi nyisiran ngaliwatan sumber gorp deui nyieun modifikasi diperlukeun ku kituna teu megatkeun logika geus dilaksanakeun. Tungtungna, urang junun ngalakukeun ieu (sanajan pisan, pisan munggaran, sanajan pisan buggy, palaksanaan parser kuring ditulis, komo leuwih gancang - dina sababaraha minggu). Ti ayeuna, sistem nyandak bentuk anu leres-leres universal - henteu kirang ti 12 taun saatos usaha munggaran pikeun ngajantenkeun fungsina.

Tangtosna, ieu sanés tungtung impian urang. Anjeun oge bisa lengkep nulis balik parser template gorp dina C #, ngagunakeun salah sahiji perpustakaan sadia pikeun nerapkeun grammar bébas. Jigana kode nu kudu nyata disederhanakeun, sarta ieu bakal ngidinan urang meunang leupas tina warisan dina bentuk aya sumber Java. Tapi kalayan jinis mesin anu tos aya, éta ogé mungkin pikeun ngalakukeun sababaraha hal anu pikaresepeun, kalebet usaha pikeun nerapkeun témplat meta anu parantos disebatkeun ku kuring, teu kedah ngémutan rupa-rupa data tina sababaraha situs wéb (tapi, kuring henteu ngaluarkeun. yén alat parangkat lunak khusus anu tos aya langkung cocog pikeun ieu - kuring ngan teu acan gaduh pangalaman anu pas pikeun ngagunakeunana).

Ku jalan kitu, usum panas ieu kuring parantos nampi uleman ku email ti perusahaan anu nganggo téknologi Salesforce (pamekar asli Gorp), lulus wawancara pikeun karya saterusna di Riga. Hanjakalna, ayeuna kuring henteu siap pikeun redeployments sapertos kitu.

Upami bahan ieu ngahudangkeun sababaraha minat, maka dina bagian kadua kuring bakal nyobian ngajelaskeun sacara langkung rinci ngeunaan téknologi pikeun nyusun sareng teras nga-parsing témplat nganggo conto palaksanaan anu dianggo dina Salesforce. Gorp (tambahan kuring sorangan, iwal sababaraha kecap fungsi anu geus dijelaskeun, nyieun ampir euweuh parobahan dina sintaksis template sorangan, jadi ampir sakabéh dokuméntasi pikeun sistem aslina. Gorp Cocog sareng versi kuring ogé).

sumber: www.habr.com

Tambahkeun komentar