NeuraLegion 與 Crystal
這是一篇來自 NeuraLegion 團隊的客座文章,講述他們在生產環境中使用 Crystal 的故事。 我們要感謝他們抽出時間分享他們的經驗,並邀請任何其他在生產環境中使用 Crystal 的公司或個人也分享他們的經驗 - 如果您想分享,請聯繫我們!
在 NeuraLegion,我們已經使用 Crystal 一段時間了。 我們想在這篇簡短的文章中分享我們的經驗,從我們如何發現 Crystal,愛上它,以及為什麼我們決定將 Crystal 作為我們選擇的語言開始。
關於我們
在我們開始關於 Crystal 的故事之前,先讓我們自我介紹一下。 我們是一家新的新創公司,熱衷於透過機器學習和人工智慧使世界變得更美好。 我們目前專注於網路安全領域,這是我們日常生活中日益重要的一部分。
我們的第一個產品 NexPloit(即將發布)將透過人工智慧的力量重新定義軟體滲透測試。
為什麼選擇 Crystal?
撇開誇大的陳述不談,當我們開始開發我們的第一個產品時,我們已經是 Ruby 的長期粉絲。 我們喜歡 Ruby,因為它預設是物件導向的,易於使用,用途廣泛,並且擁有社群開發的大量函式庫。 此外,我們認為 Ruby 是一種優美且成熟的程式語言。
但是,當我們開始捲起袖子並開始構建 NexPloit 時,Ruby 的一些固有特性並未滿足我們的特定需求。 列舉幾個例子:
- Ruby 不提供顯式類型。 這會產生一些影響,包括推斷資料類型、效能和大小懲罰以及資料必須經歷的不必要操作。 就我們的目的而言,效率是一個非常重要的問題。
- 為了解決之前的問題,通常使用 C 綁定。 但是,它們的實作可能非常棘手。 正如我們已經提到的,Ruby 沒有顯式類型。 另一方面,C 是一種強型別語言,但有意識地知道在任何給定時間要傳遞的確切類型可能有點令人生畏,並且可能需要嘗試幾次才能使其正常工作。
undefined method for nil:NilClass
。 如果您以前使用過 Ruby,則不需要任何解釋。 如果沒有,您可能會在其他動態、非編譯語言中識別出此錯誤,在這些語言中,您嘗試對您認為會是物件的東西呼叫方法 - 但在執行時由於某種原因變成nil
。 缺點是,如果在編譯類型(或其他評估階段)期間未執行檢查,則只能在執行時完全偵錯程式。- 當執行我們用 Ruby 編寫的程式時,效能相當有限。
由於我們提到的原因和其他一些原因,我們需要一種具有 Ruby 所有優點但沒有缺點的程式語言。 那時我們發現了 Crystal,幾乎立即愛上了它 ❤️。 Crystal 流暢的編碼體驗、易於進行低階函式庫綁定、在編譯時的型別安全性(甚至無需執行程式),以及最終的閃電般快速的執行時效能,為我們提供了真正啟動鍵盤所需的一切! 我們可以誠實地說,Crystal 為我們提供了優雅而高效地將 NexPloit 從一個想法變成現實的工具。
如何使 Crystal 更上一層樓
現在讓我們公平一點 - 我們熱愛 Crystal,但總是有改進的空間。 我們在 Crystal 中遇到的挑戰之一是缺乏用於機器學習和科學工具的 shards(Crystal 的「gems」)。 但是,期望其他人添加 shards 是不公平的,因此我們決定為 Crystal-FANN 創建一個 shard 作為我們需求的基礎(並且我們將其發布在我們的 Github 頁面上,供任何可能需要它的人使用)。 目前,Crystal-FANN 看起來對我們來說很合適,但如果我們得出結論,認為 FANN 本身不夠用,我們仍在考慮添加 Torch 或 TensorFlow。
總結
您應該嘗試 Crystal 嗎? 當然! Crystal 是一種很棒的語言,它真的很容易使用,並且可以產生很棒的結果。 我們絕對推薦 Crystal,試試看,您一定會喜歡的!
Crystal 與 Ruby - 免責聲明
我們想指出,本文僅是我們個人關於為什麼我們決定使用 Crystal 的經驗和看法。 我們仍然喜歡 Ruby,並且會強烈推薦給任何可能擁有其他需求的人。 Ruby 非常成熟,並且擁有一個很棒的支援社群,這對於程式設計初學者特別有用。 我們相信 Ruby 未來還有更多美好的發展。
以下是一些對我們來說很重要的參數之間的比較
Ruby | Crystal |
---|---|
動態類型 | 靜態類型 |
執行時的 Nil 參考錯誤 | 編譯時的 Nil 參考錯誤檢查 |
大量現有的函式庫 | 相對少量現有的函式庫 |
有限的執行時效能 | 快速的執行時效能 |
在虛擬機器中執行 | 已編譯的原生程式碼 |