Rust and Swift3番目、4番目、5番目、6番目の郚分

著者がRustずSwiftを䞊行しお研究し、それらを互いに比范するサむクルを翻蚳し続けたす。 むントロダクションず最初の2぀のパヌトの翻蚳は、 ここにありたす 。 このパヌトでは、挔算子のオヌバヌロヌド、文字列操䜜、およびコレクションに焊点を圓おたす。


挔算子、その過負荷および簡朔さの考え


Swiftのオペレヌタヌに連絡したした。 最初の質問挔算子は特別な構文ですか、それずもプロトコルの砂糖ですか 私が䜿甚しおいる、たたはこれたでに䜿甚したすべおの珟代蚀語Python、Ruby、Io、Elixir、Rust-さたざたな時代ずスタむルのいく぀かの䟋は、他の蚀語構成の砂糖ずしお単玔に実装しおいたす。

敎理しおみるず、挔算子は十分に定矩された関数であるこずがわかりたした グロヌバルスペヌス Swiftモゞュヌル。 説明がこれであるため、「良い」の代わりに「倧䞈倫」ず蚀いたす。これは、既存の型の間で挔算子をバむナリ挔算子のように動䜜させる唯䞀の方法です。 この堎合、理由は蚀語の構造にあるずいう事実を芋逃しおいたす。 プロトコルはここに完党に収たるように芋えたすが、おそらく、Rustの特城ずは異なり、問題に十分に察凊できないでしょうか これは未解決の質問であり、どのように答えればよいかわかりたせん。

興味深いこずに、Rustのオペレヌタヌの数は、前の投皿で蚀及したものを陀いおも、Swiftよりもわずかに少ないです。 RustはPythonず同様に、他のより簡単な方法で同じ結果を埗るこずができるため、プレフィックス挔算子ずポストフィックス挔算子を完党に欠いおいたす。 Swiftでは、これらのステヌトメントは郚分的に保存されおいたす。間違いなく、ObjectiveCを扱ったほずんどのプログラマヌはそれらずそのむディオムに粟通しおいるからです。
翻蚳者のメモSwift 2.2では、元々Rustになかったむンクリメント/デクリメント挔算子が削陀されたした。 䞀方、Swiftでは、独自のステヌトメントを䜜成できたす。

たた、Rustの挔算子に぀いお䜕か新しいこずを孊びたした。ブヌル挔算子|| および&&はビットずは異なりたす| and挔算子は、最初のグルヌプが短いスキヌムに埓っお蚈算を実装するずいう事実だけでなく、 もちろん、2番目のグルヌプの助けを借りお、ビット操䜜を実行するこずもできたすが、マニュアルでは蚈算方匏の違いを匷調しおいたす。 これは完党に正圓化されたすが、私はそれに぀いお前に考えたこずがありたせんでした。
翻蚳者泚正盎なずころ、私は著者が䜕を蚀いたかったのか理解できたせんでした。

Rustには、3項挔算子がありたせん。これは、蚀語が匏ずステヌトメントを凊理する方法に関連しおいたす。 Swiftではそうです。 蚀語蚭蚈の違いに関する興味深い考え ifブロックは匏であり、したがっお冗長であり、蚀語の䜜成者は䞍芁な機胜を削陀しようずしたため、Rustはこの挔算子を削陀したした。 䞉項挔算子の攟棄に関する議論ず、Brendan Ikeからの興味深いJavaScriptのメモはこちらをご芧ください 。 私はこれがSwiftに察する批刀ではなく、単なる発蚀であるこずに留保したすが、匏を䜿甚したRustのアプロヌチは本圓に奜きです。

䞀方、私は本圓に挔算子が奜きではありたせん?? 合䜓挔算子なし。 収瞮のために収瞮のように芋えたすが、䞀郚はオプションの型の簡朔さを求めるSwiftの欲求によるものです。 簡朔にするず、明瞭さが倱われるこずがありたす。 過床の略語は蚀語を耇雑にし、各行を読むずきに速床を萜ずすこずを匷制したす。

比范された蚀語のブヌル挔算子にも違いはなく、驚くこずでもありたせん。

Swiftに関する本で「短い」ずいう蚀葉たたはその同矩語が䜕回䜿われおいるのだろうか。 簡朔さがこの蚀語の䞻な目暙の1぀であるこずをより明確に理解しおいたす。 たぶんそれはそのように思えたすが、それでも少し奇劙です。 簡朔さは良いですが、読みやすさははるかに優れおいたす。


文字列操䜜を䜿甚した蚀語構造のトレヌドオフ


SwiftずRustは、セキュリティずメモリ管理の問題を解決したすが、アプロヌチは異なりたす。自動参照カりントによるSwiftず、所有暩の抂念によるRustです。 毎日の䜜業では、SwiftアプロヌチはPythonやRubyず同じ理由でより有利に思えたす。誰もがあなたのためにそれを行うず䟿利です。 Rustは倚くの機䌚を提䟛したすが、同時に所有暩に぀いお垞に考えさせたす。

぀たり、すべおの蚀語にトレヌドオフがありたす。 私はこれたでSwiftよりRustの方が奜きですが、Swiftをより良くする倚くのポむントを芋぀けるこずは間違いないでしょう。 すべおを手に入れるこずはできたせん。

文字列たたは倀によっお枡される他の型の操䜜は、RustよりもSwiftの方がはるかに簡単であるため、このこずに泚意を向けたした。 結果は実質的に同じですが、Swiftではすべおの行が倀によっお枡され、参照によっお枡されるこずはないため、倉曎される内容に぀いお考える必芁はありたせん。

もちろん、この目的のためにRustにはコピヌ特性がありたす-私は、Swiftが少し「人間工孊的」であるこずを意味したす。

Swiftの文字列補間は非垞に䟿利です。 これがRustで芋逃しおいる唯䞀のものです。 文字列をフォヌマットするためのPythonスタむルのマクロは優れおいたすが、倀 strings with \(variables)たたはembedded expressions like \(2 + 4) strings with \(variables)補間は非垞に優れおいたす。

䞀般に、文字列に察するSwiftのアプロヌチはよく考えられおおり、詳现に十分な泚意を払っおいたす。これにより、耇雑な蚀語たたは非西掋蚀語での䜜業が倧幅に促進されたす。 私は、印刷に倢䞭なので、本圓に感謝しおいたす。

同時に、Swift文字列はUnicodeの同様の境界ケヌスをすべお凊理するため、文字列にアクセスするためのいく぀かの暙準パタヌンが倱われ、文字列の内郚構造を理解するこずが困難たたは䞍可胜になりたす。 状況に応じお、これは利点ず欠点の䞡方になりたす。 私が蚀ったように、劥協はどこにでもありたす。

実際、さらに読み進めおみるず、SwiftはUnicode文字列を非垞に゚レガントに凊理し、さたざたな実装に個別のメ゜ッドを䜿甚しおプロセスを理解できるこずがわかりたした。 特に、 String型を操䜜し、「コヌドポむント」ぞの盎接アクセスを取埗できるこずを感謝したす。いずれかではなく、UTF8、UTF16、たたはUTF32のいずれかにアクセスできたす。 Appleの経隓を信頌しおください。テキストに非垞に泚意する必芁がありたす。

Rustの文字列は悪くありたせんが、それほど耇雑ではありたせんおそらく、これはメモリ内の文字列の衚珟を単玔化するために行われたず思われたす。 この蚀語では、 Stringたたはstr垞にUTF8バむトのシヌケンスずしお゚ンコヌドされたスカラヌUnicode倀UTF32で構成されたす。 Swiftずは異なり、他の実装を取埗するための䟿利な方法はありたせん。 同時に、日垞のプログラミングでは、これはめったに発生しないか、おそらくたったく発生しないず考えおいたす。 重芁なこずは、䞡方の蚀語がスカラヌ倀を栌玍するこずです。

これは、RustのSwiftに察する明確な優䜍性を感じなかった最初の郚分です。 これらの蚀語の構造におけるトレヌドオフのいく぀かはここでより明確になり、Swiftの「人間工孊」がそれらの䞭にあるこずを感謝しおいたす。


䞊列蚀語孊習の利点および問題点


私は数週間Swiftを勉匷しおいたしたが、その前に1か月間Rustの深みに飛び蟌みたした。 このアプロヌチ-2぀の蚀語をほが同時に孊習する-は私にずっおたったく新しいものであり、それには十分な理由がありたす。 プログラミング蚀語を習埗するのは簡単ではありたせん。新しい知識を理解するには、倚くのこずを孊ぶ必芁がありたす。

これは必芁に応じお行いたす。 Rust蚀語の非垞に機胜的で効率的なクロスプラットフォヌムベヌスでアプリケヌションを開発できるこずを願っおいたすが、OS Xのネむティブアプリケヌションは、完成したずきにのみリリヌスする予定です。 アプリケヌションコアをポヌタブルにしたいずいう私の願いは、すぐにSwiftの䜿甚を排陀したす。 正盎なずころ、これはAppleの蚀語であるずいう事実によっおも促進されたす。私は圌らのプラットフォヌムでAppleツヌルを䜿うこずを楜しんでいたすが、この䌚瀟の決定に垞に䟝存したくありたせん。 さらに、Rustの経隓は他の倚くの堎合に圹立ちたす。

だから、私は䞡方の蚀語を孊ぶ必芁がありたす。

そしお、通垞の状況ではお勧めしたせんが、ただいく぀かの蚀語の十分なプログラミング経隓ず知​​識がない堎合は、そのような方法の䜿甚を公然ず思いずどたらせたす-それは信じられないほど有甚であるように思えたす。 これらの蚀語はほが同時に䜜成され、同じ゜ヌスからむンスピレヌションを匕き出したした。察象者ず目暙は郚分的に重耇しおいたす。 同時に、このシリヌズで既に瀺したように、倚くの点でかなり異なりたす。

2぀の蚀語を䞊行しお研究するこずで、それぞれの蚀語が劥協したものを確認し、それらの違いの原因を考えるこずができたした。 特に、私はこれらの蚀語の舞台裏で䜕が起こっおいるかをよりよく理解し、それらに䜕を期埅するかを知っおいるず思いたす。 これは、蚀語の孊習速床に倧きな圱響を䞎えたした。 もちろん、ここで私はいく぀かの蚀語を知っおおり、最近芖野を広げたずいう事実にも圹割を果たしたした。Haskell、JavaScriptの機胜パタヌンなどに぀いお読みたした。

もちろん、䞡方の蚀語で私はただ長い道のりを持っおいたす。 倜や週末に本を読んだり、それぞれで少し遊んだりするこずは、歯でプロゞェクトに固執しお痛みを感じるこずず同じではありたせん。 しかし、これらの蚀語を同時に孊んでいるこずは本圓にうれしいです。 チャレンゞを受け入れる準備ができおいる堎合は、詊すこずもできたす。 どれだけ孊ぶこずができるかに驚くでしょう。


コレクションのタむプず、構文ずセマンティクスの区別


次の文は、Swiftの蚀語蚭蚈を倚くの点で特城づけおいるず思いたす。


2぀の圢匏は機胜的には同じですが、より短い圢匏が掚奚され、このマニュアルではデヌタ配列のタむプを参照するために䜿甚されたす。 —Swiftプログラミング蚀語Swift 2プレリリヌス

Rust std::collectionsモゞュヌルのさたざたなタむプのドキュメントは、興味深く有甚です。 匷くお勧めしたす。

Swiftマニュアルのこの章を読んでいるず、Rustには名前付きパラメヌタヌはありたせんが、Swiftにはありたす。 どちらの堎合も、この決定は合理的ですが、これはRustでほずんど自慢しない詳现の1぀であるように思われたす。 Pythonは私を甘やかしたした。
翻蚳者泚名前付きパラメヌタヌをRustに远加するためのRFCがありたす。

SwiftのArray型は、RustのVec型通垞はvecマクロによっお䜜成されたすに䌌おいたす。 Rustの配列は静的なサむズを持ち、スタック䞊に䜜成されたすが、䞡方のコンテナヌはヒヌプ䞊の芁玠を動的にサむズ倉曎および栌玍できたす。 䞡方の蚀語で配列を䜜成する構文は非垞に䌌おいたすただし、結果は異なりたす。


 let an_array: [Int] = [1, 2, 3] //    var an_array = [1, 2, 3] //    

 let an_array: [i32, 3] = [1, 2, 3]; //  let a_vector: Vec<i32> = vec![1, 2, 3]; //  

どちらの蚀語でも入力できるため、これは短く曞くこずができたす。そのため、そのように曞く必芁はほずんどありたせん。 より銎染みのあるオプションは次のずおりです。


 let an_array = [1, 2, 3] var an_array = [1, 2, 3] 

 let an_array = [1, 2, 3]; let a_vector = vec![1, 2, 3]; 

Rustは、配列の䞀郚ぞのアクセスを提䟛し、配列ぞのポむンタずサむズ芁玠の数を衚す「スラむス」の抂念も远加したす。

Swiftの配列操䜜は非垞に論理的で、驚くほど芖芚的です。 それらは良い意味で、Pythonでのリスト操䜜を思い出させたす。

RustのVecコンテナヌには豊富なAPIがあり、それは悪くありたせん。 芁玠をトラバヌスするメ゜ッドがないこずに少し驚きたしたが、Iteratorトレむトが実装された同じモゞュヌルのIntoIter構造に存圚するこずがわかりたした。 その結果、察応するメ゜ッドはEnumerate構造䜓のむンスタンスを返したす。 Swiftの配列はIterableプロトコルを実装しおいるだけで、これはRustのアプロヌチにいくらか䌌おいるずIterableたす。

これは私がよく話しおいるこずの䟋です。Rustは必ずしもすべおを1぀のオブゞェクトに入れるのではなく、いく぀かの関連する構造、関連付け、たたは特性に機胜を分散したす。 これは本圓に匷力なアプロヌチですが、倚少の習慣が必芁です。 この点で、Swiftの構造ずセマンティクスは、私が慣れおいる蚀語に非垞に䌌おいたすが、プロトコルを䜿甚するず柔軟性が高たりたす。

構文ではなくセマンティクスに぀いお話しおいたこずに泚意しおください。 SwiftずRustは、非垞に類䌌した構文がセマンティクスの違いをどのように隠すこずができるかを瀺す玠晎らしい䟋です。 別の䟋JavaScriptずJavaの構文ずセマンティクスを比范したす-䞀芋、構文は䌌おいたすが、セマンティクスには倧きなギャップがありたす。

SwiftのSetず、RustのHashSetに察応するHashSet察応の䞡方に、Pythonのinキヌワヌドに非垞に類䌌したcontainsメ゜ッドがありたす。 䞡方のタむプが同じメ゜ッドの倚くを実装しおいるこずは驚くこずではありたせん。 セットが暙準的な数孊的抂念であるずいう事実を考えるず、おそらくこれは予想されるべきです。

タむピングがより厳密なため、RustずSwiftの䞡方で、連想配列RustのHashMapずSwiftのDictionary で䜿甚される型を指定する必芁がありたすが、もちろん䞡方の蚀語は特定の堎合に型を出力できたす。 Pythonで蚱可されおいるように異なる皮類のキヌの䜿甚を混圚させるこずはできたせんが、実際には、これは2぀の理由で気にしないはずです。


  1. 原則ずしお、異なるタむプのキヌを䜿甚するこずは掚奚されたせん。 私の堎合、これは倚くの堎合、䜿甚するタむプずデヌタ構造に぀いお慎重に怜蚎する必芁があるこずを瀺しおいたす。
  2. たれに、必芁に応じお、RustたたはSwiftでゞェネリック型を䜿甚できるかどうか疑問に思っおいたす。 この問題は埌で明らかにする予定です

SwiftがPythonのような構文 {'': ''} を䜿甚しお連想配列を初期化するのは玠晎らしいこずです。 しかし、なぜこれが䞍可胜なのか理解しおいたす䞭括匧はすでにブロックで占められおいたすが、Pythonではむンデントを䜿甚するため、そのような問題はありたせん。 しかし、それは本圓に䟿利です。

Swiftデザむナヌが括匧 [...] を䜿甚しおシヌケンスを初期化した理由を理解しおいたす。これにより、解析が倧幅に簡玠化されたす。 その結果、䞀芋するず、あなたが䜕を扱っおいるのか理解するのは困難です。 配列、セット、たたは連想配列にするこずができたす。

これは、プログラミング蚀語の蚭蚈の過小評䟡されおいる偎面-可読性を匷調しおいたす。 プログラマがコヌドを曞きたくないのず同じくらい、実際には、ほずんどの堎合、それを読むのに倚くの時間を費やしおいたす。 したがっお、蚘述の容易さに泚意を払う必芁がありたすが、コヌドの読みやすさに぀いおも考える䟡倀がありたす。 蚀語で採甚されおいる構文ず芏則は、この倧郚分を圢成したす。

SwiftのDictionary型は、いく぀かのメ゜ッドの名前が䞀臎するたで、PythonのDictionary型に非垞に䌌おいたす。 これは、RustのHashMapにも圓おはたりたす。 これはたったく悪くありたせん。


翻蚳者からのあずがき


この䞀連の蚘事の翻蚳を行うのは良い考えだず疑い始めたす。 著者には、Swiftに぀いおさらに孊ぶように促した興味深い考えがありたす。 䞀方、圌は衚面的な刀断が倚すぎるため、自分で情報を怜玢する必芁がありたす。 私が定期的にやろうずしおいるように、あなたがメモで翻蚳を補うなら、それらはほずんど各アむテムに曞かれなければならないでしょう。 最終結果は翻蚳ではありたせんが、悪魔は䜕を知っおいたす。 だから私はおそらくこれらの郚分にこだわるでしょう。

Source: https://habr.com/ru/post/J280902/


All Articles