সুইফ্ট সংকলক ত্রুটি: একটি স্ট্রিং কনটেন্টেশনে "এক্সপ্রেশন খুব জটিল"


143

আমি এটি যেকোন কিছুর চেয়ে মজাদার মনে করি। আমি এটি স্থির করেছি, তবে কারণ সম্পর্কে আমি ভাবছি। এখানে ত্রুটি: DataManager.swift:51:90: Expression was too complex to be solved in reasonable time; consider breaking up the expression into distinct sub-expressions। কেন অভিযোগ করছে? এটি সম্ভবত সবচেয়ে সহজ এক্সপ্রেশনগুলির মতো মনে হয়।

সংকলক columns + ");";বিভাগটি নির্দেশ করে

func tableName() -> String { return("users"); } 

func createTableStatement(schema: [String]) -> String {

    var schema = schema;

    schema.append("id string");
    schema.append("created integer");
    schema.append("updated integer");
    schema.append("model blob");

    var columns: String = ",".join(schema);

    var statement = "create table if not exists " + self.tableName() + "(" + columns + ");";

    return(statement);
}

ফিক্সটি হ'ল:

var statement = "create table if not exists " + self.tableName();
statement += "(" + columns + ");";

এটিও (@ বিস্ময়কর মাধ্যমে) কাজ করে তবে আমি এটি এতটা পছন্দ করি না কারণ আমি মনে করি এটি (হারিয়ে গেছে:

var statement = "create table if not exists \(self.tableName()) (\(columns))"


10
আপনি দেখেছেন যদি এই কাজ করে: var statement = "create table if not exists \(self.tableName()) (\(columns))"?
efischency

5
@ ফিশচেন্সি দ্বারা প্রস্তাবিত স্ট্রিং ইন্টারপোলেশন সাধারণত ম্যানুয়াল কনটেনটেশন এর চেয়ে ভাল বিকল্প +
ম্যাট্যাট

5
অবশ্যই, কিন্তু এটি বিন্দু নয়। এটি "প্রস্তাবিত" উপায়ে বা না থাকায় আমি কিছুই চিন্তা করি না, আমি কেবল এটি জানতে চাই যে সংকলক এটি কেন চট করে okes আমার একটি সমাধান রয়েছে যা কাজ করে, এটি ত্রুটি সংশোধন করার নয়, এটি ত্রুটি বোঝার বিষয়ে।
কেন্দ্রিক টেলর 21

2
আমি যা শুনেছি তা থেকে, সুইফ্ট সংকলক এখনও অনেক বেশি কাজ চলছে। দলটি এটি সম্পর্কে একটি বাগ রিপোর্ট প্রশংসা করতে পারে।
molbdnilo

6.3.1 দিয়ে এটি সংকলন করার কোনও সমস্যা আমার ছিল না। অতীতেও আমার একই রকম হাস্যকর বার্তা ছিল। সুইফ্ট তার আলফা অবস্থা ছেড়ে না আসা পর্যন্ত আমাদের অপেক্ষা করতে হবে।
কিওয়ার্টি_সো

উত্তর:


183

আমি সংকলকগুলির বিশেষজ্ঞ নই - আমি জানি না যে এই উত্তরটি "আপনি কীভাবে অর্থবহ উপায়ে ভাবেন তা পরিবর্তন করে দেবে", তবে সমস্যাটি সম্পর্কে আমার বোঝার বিষয়টি হ'ল:

এটি টাইপ অনুমিতি সঙ্গে করতে হবে। প্রতিবার আপনি +অপারেটরটি ব্যবহার করার সময় , +সুইফ্টকে +আপনার কোনও সংস্করণ ব্যবহার করছে তার জন্য সম্ভাব্য সমস্ত ওভারলোডগুলির সন্ধান করতে হবে। +অপারেটরের জন্য আমি কেবল 30 ওভারলোডের নিচে গণনা করেছি । এটি অনেক সম্ভাবনা এবং আপনি যখন 4 বা 5 +ক্রিয়াকলাপকে এক সাথে শৃঙ্খলাবদ্ধ করেন এবং সংকলককে সমস্ত যুক্তি উপস্থাপন করতে বলেন, আপনি প্রথম নজরে উপস্থিত হওয়ার চেয়ে আরও অনেক কিছু জিজ্ঞাসা করছেন।

এই অনুমান জটিল হয়ে যেতে পারে - উদাহরণস্বরূপ, আপনি যদি একটি UInt8এবং একটি Intব্যবহার যুক্ত করেন +তবে আউটপুটটি হবে একটিInt হয়ে উঠতে তবে অপারেটরগুলির সাথে মিশ্রিতকরণের নিয়মগুলি মূল্যায়নের ক্ষেত্রে এমন কিছু কাজ রয়েছে।

এবং আপনি যখন Stringউদাহরণস্বরূপ Stringআক্ষরিক ব্যবহার করছেন, কম্পাইলারটি আক্ষরিককে একটিতে রূপান্তরিত Stringকরার কাজটি করছে এবং তারপরে +অপারেটরের পক্ষে যুক্তি এবং রিটার্নের ধরণের কাজগুলি সম্পাদন করার কাজ করছে etc.

যদি কোনও অভিব্যক্তি পর্যাপ্ত জটিল হয় - যেমন, এটির জন্য আর্গুমেন্ট এবং অপারেটরগুলি সম্পর্কে অনেকগুলি অনুমান করার জন্য সংকলকটির প্রয়োজন হয় - এটি প্রস্থান করে এবং আপনাকে বলে যে এটি প্রস্থান করে।

সংক্ষেপণটি জটিলতার একটি নির্দিষ্ট স্তরে পৌঁছে একবার সংকলকটি প্রস্থান করা ইচ্ছাকৃত। বিকল্পটি হ'ল সংকলকটি চেষ্টা করে দেখুন এবং এটি করা যায় কিনা তা দেখুন, তবে এটি ঝুঁকিপূর্ণ - সংকলকটি চিরকালের জন্য চেষ্টা করে যেতে পারে, জালিয়াতি করতে পারে বা কেবল ক্র্যাশ করতে পারে। সুতরাং আমার বোধগম্যতা হল যে কোনও অভিব্যক্তির জটিলতার জন্য একটি স্থিতিশীল থ্রেশহোল্ড রয়েছে যা সংকলকটি অতিক্রম করবে না।

আমার বোঝাটি হ'ল সুইফট টিম সংকলক অপ্টিমাইজেশনে কাজ করছে যা এই ত্রুটিগুলি কম সাধারণ করে তুলবে। আপনি এই লিঙ্কটিতে ক্লিক করে অ্যাপল বিকাশকারী ফোরামে এটি সম্পর্কে কিছুটা শিখতে পারেন

দেব ফোরামে ক্রিস ল্যাটনার এই ত্রুটিগুলি রাডার রিপোর্ট হিসাবে ফাইল করার জন্য বলেছেন, কারণ তারা সক্রিয়ভাবে এগুলি সমাধানের জন্য কাজ করছেন।

এখানে এবং এটি সম্পর্কে দেব ফোরামে বেশ কয়েকটি পোস্ট পড়ার পরে আমি এটিই বুঝতে পারি, তবে সংকলকগুলির সম্পর্কে আমার উপলব্ধি নিষ্প্রভ, এবং আমি আশা করছি যে তারা এই কাজগুলি কীভাবে পরিচালনা করছেন তার গভীর জ্ঞান সহকারীর কেউ আমার কী প্রসারিত হবে তা প্রসারিত হবে on এখানে লিখেছেন।


আমি সে প্রভাবটির জন্য কিছু অনুভব করেছি, তবে এটি একটি সহায়ক উত্তর ছিল কম। উত্তর করার জন্য ধন্যবাদ. আপনি কি হাতে + অপারেটরগুলির সংখ্যা গণনা করেছেন বা এমন কোনও সরল উপায় যা আমি অবগত নই?
কেন্দ্রিক টেলর

আমি কেবল এটি সুইফটডোক.আরগ এ দেখুন এবং তাদের হাতে হাতে গণনা করেছি। এই সেই পৃষ্ঠাটি সম্পর্কেই আমি কথা বলছি: swiftdoc.org/operator/pls
অ্যারন রাসমুসেন

28
তারা এটি কল করবে কিনা তা বিবেচনা না করেই এটি একটি বাগ। অন্যান্য ভাষার সংকলকগুলির পোস্টের মতো কোডের সাথে কোনও সমস্যা নেই। শেষ ব্যবহারকারীকে পরামর্শ দেওয়া উচিত এটি নির্বোধ fix
জন

7
অনুমান টাইপ করুন? এই বিভ্রান্তিকর পরিস্থিতিতে সুইফ্টের মতো শক্তিশালী-টাইপিত ভাষা থাকার (যার মধ্যে আপনি স্ট্রিং + ইনটকেও কন্ট্রোল না করেই ইন্টিস্ট্রেট করতে পারবেন না) কী লাভ? আবারও, সুইফ্ট সমস্যাগুলির সমাধান করার চেষ্টা করে যা সবার আগে ছিল না।
আজুরলাকে

10
@ জন কোনও বাগ নয়, আমাকে জিজ্ঞাসা করলে কেবল খারাপ ভাষার নকশা! সুইফট কেবল আলাদা হওয়ার চেষ্টা করে অনেক দূরে চলে যায়।
টি। রেক্স

31

এটি গৃহীত উত্তর হিসাবে প্রায় একই তবে কিছু যুক্ত সংলাপের সাথে (আমার রব নেপিয়ার, তার অন্যান্য উত্তর এবং ম্যাট, অলিভার, স্ল্যাক থেকে ডেভিড) এবং লিঙ্কগুলি ছিল।

এই আলোচনায় মন্তব্য দেখুন । এর সারাংশটি হ'ল:

+ ভারী ভারী হয়েছে (অ্যাপল কিছু ক্ষেত্রে এটি স্থির করেছে বলে মনে হচ্ছে)

+অপারেটর প্রচন্ডভাবে ওভারলোড হয়ে গেছে, এখন যেমন 27 বিভিন্ন ফাংশন তাই যদি আপনি concatenating 4 স্ট্রিং অর্থাৎ হয়েছে আপনি 3 আছে +অপারেটার কম্পাইলার আছে পরীক্ষা 27 অপারেটার প্রতিটি সময় মধ্যে, যাতে 27 ^ 3 বার আছে। তবে তা নয়।

এখানে একটা হল চেক কিনা তা দেখতে lhsএবং rhsএর +ফাংশন উভয় বৈধ যদি তারা এটি কোর মাধ্যমে কল হয় appendবলা হয়। সেখানে আপনি দেখতে পাচ্ছেন কিছুটা নিবিড় চেক রয়েছে যা ঘটতে পারে। যদি স্ট্রিংটি অ-স্বচ্ছভাবে সংরক্ষণ করা হয়, তবে আপনি যদি স্ট্রিংটি ব্যবহার করছেন সে স্ট্রিংটি এনএসএসআরটিংয়ের সাথে আসলে সেতুবন্ধিত হয় তবে কেসটি প্রদর্শিত হবে। তারপরে সুইফ্টকে সমস্ত বাইট অ্যারে বাফারগুলিকে একটি একক সঙ্গতিপূর্ণ বাফারে পুনরায় একত্রিত করতে হবে এবং যার জন্য নতুন বফার তৈরি করতে হবে। এবং তারপরে আপনি শেষ পর্যন্ত একটি বাফার পাবেন যার মধ্যে স্ট্রিং রয়েছে যা আপনি একসাথে একত্রিত করার চেষ্টা করছেন।

সংক্ষেপে 3 টি ক্লাস্টার সংকলক চেক রয়েছে যা আপনাকে ধীর করে দেবে অর্থাত্ প্রতিটি উপ-এক্সপ্রেশনটি ফিরে আসতে পারে এমন সমস্ত কিছুর আলোকে পুনর্বিবেচনা করতে হবে । ফলস্বরূপ সংক্ষিপ্তকরণের স্ট্রিংগুলি ইন্টারপোলেশন সহ অর্থাত্ ব্যবহার " My fullName is \(firstName) \(LastName)"করা অনেক ভাল কারণ "My firstName is" + firstName + LastNameযেহেতু ইন্টারপোলেশনের কোনও ওভারলোডিং নেই using

সুইফট 3 করেছেন কিছু উন্নতি করা হয়েছে। আরও তথ্যের জন্য পড়ুন কীভাবে সংকলকটি ধীর না করে একাধিক অ্যারে মার্জ করবেন? । তবুও +অপারেটরটি এখনও ওভারলোডেড এবং দীর্ঘ স্ট্রিংগুলির জন্য স্ট্রিং ইন্টারপোলেশন ব্যবহার করা ভাল


বিকল্পগুলির ব্যবহার (চলমান সমস্যা - সমাধান উপলব্ধ)

এই খুব সাধারণ প্রকল্পে:

import UIKit

class ViewController: UIViewController {

    let p = Person()
    let p2 = Person2()

    func concatenatedOptionals() -> String {
        return (p2.firstName ?? "") + "" + (p2.lastName ?? "") + (p2.status ?? "")
    }

    func interpolationOptionals() -> String {
        return "\(p2.firstName ?? "") \(p2.lastName ?? "")\(p2.status ?? "")"
    }

    func concatenatedNonOptionals() -> String {
        return (p.firstName) + "" + (p.lastName) + (p.status)
    }

    func interpolatedNonOptionals() -> String {
        return "\(p.firstName) \(p.lastName)\(p.status)"
    }
}


struct Person {
    var firstName = "Swift"
    var lastName = "Honey"
    var status = "Married"
}

struct Person2 {
    var firstName: String? = "Swift"
    var lastName: String? = "Honey"
    var status: String? = "Married"
}

ফাংশনগুলির জন্য সংকলনের সময়টি হ'ল:

21664.28ms  /Users/Honey/Documents/Learning/Foundational/CompileTime/CompileTime/ViewController.swift:16:10 instance method concatenatedOptionals()
2.31ms  /Users/Honey/Documents/Learning/Foundational/CompileTime/CompileTime/ViewController.swift:20:10 instance method interpolationOptionals()
0.96ms  /Users/Honey/Documents/Learning/Foundational/CompileTime/CompileTime/ViewController.swift:24:10 instance method concatenatedNonOptionals()
0.82ms  /Users/Honey/Documents/Learning/Foundational/CompileTime/CompileTime/ViewController.swift:28:10 instance method interpolatedNonOptionals()

সংকলনের সময়কাল কতটা ক্রেজি তা লক্ষ্য করুন concatenatedOptionals

এটি করে সমাধান করা যেতে পারে:

let emptyString: String = ""
func concatenatedOptionals() -> String {
    return (p2.firstName ?? emptyString) + emptyString + (p2.lastName ?? emptyString) + (p2.status ?? emptyString)
}

যা সংকলন করে 88ms

সমস্যার মূল কারণ হ'ল সংকলকটি ""হিসাবে হিসাবে চিহ্নিত করে না String। এটা আসলেExpressibleByStringLiteral

সংকলকটি দেখতে পাবে ??এবং এই প্রোটোকলের সাথে সংযুক্ত সমস্ত প্রকারের মধ্যে লুপ করতে হবে , যতক্ষণ না এটি কোনও ডিফল্ট হতে পারে এমন কোনও সন্ধান করে StringemptyStringযা হার্ডকোডযুক্ত তা ব্যবহার করে String, সংকলকটির আর সব ধরণের মেশানো ধরণের মাধ্যমে লুপ করার প্রয়োজন নেইExpressibleByStringLiteral

সংকলনের সময় লগ কিভাবে করবেন তা শিখতে এখানে বা এখানে দেখুন


রব নেপিয়ারের অন্যান্য অনুরূপ উত্তর এসও তে:

স্ট্রিং সংযোজনটি কেন এত দীর্ঘ সময় নেয়?

সংকলকটি ধীর না করে একাধিক অ্যারে কীভাবে মার্জ করবেন?

সুইফ্ট অ্যারেটিতে ফাংশনটি বিল্ড সময়কে দীর্ঘ করে তোলে


19

আপনি যা বলেন না কেন এটি বেশ হাস্যকর! :)

এখানে চিত্র বর্ণনা লিখুন

তবে এটি সহজেই পাস হয়ে যায়

return "\(year) \(month) \(dayString) \(hour) \(min) \(weekDay)"

2

আমার একই সমস্যা ছিল:

expression was too complex to be solved in reasonable time; consider breaking up the expression into distinct sub-expressions

এক্সকোডে 9.3 লাইনটি এভাবে চলে:

let media = entities.filter { (entity) -> Bool in

এটি এ জাতীয় কিছুতে পরিবর্তন করার পরে:

let media = entities.filter { (entity: Entity) -> Bool in

সবকিছু কাজ করে।

চারপাশের কোড থেকে ডেটা ধরণের অনুমানের চেষ্টা করার সাথে সাথে সম্ভবত এটির কিছু আছে সুইফট সংকলকটির সাথে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.