Slide with text: “Rust teams at Google are as productive as ones using Go, and more than twice as productive as teams using C++.”

In small print it says the data is collected over 2022 and 2023.

    • @FizzyOrange
      link
      63 months ago

      Without static type annotations you can only make best effort guesses that are sometimes right. Better than nothing but not remotely the same as actual static types. The LSP you linked works best when you use static type annotations.

      Also I would really recommend Pylance over that if you can - it’s much better but is also closed source unfortunately.

      • @[email protected]
        link
        fedilink
        23 months ago

        Why would it just be best effort? To find references for a specific thing, it still would parse an AST, find the current scope, see it’s imported from some module, find other imports of the module, etc.

        • @Buttons
          link
          English
          5
          edit-2
          3 months ago
          if random() > 0.5:
              x = 2
          else:
              x = "hello"
          

          Where is the definition of x? What is the type of x? If you can’t identify it, neither can the LSP.

          This kind of thing actually happens when implementing interfaces, inheritance, etc. Thus, LSPs in dynamic languages are best effort both theoretically and in practice.

          • @[email protected]
            link
            fedilink
            1
            edit-2
            3 months ago
            1. Look at entire file instead of snippet.
            2. If there is anything that could create a variable x before this area, then that’s where x originates. If not, and if it’s a language where you can create x without using a keyword like let or var, then x is created in the scope in your snippet.

            Types are not necessary at all.

            • @Buttons
              link
              English
              23 months ago

              then x is created in the scope in your snippet

              Saying “x is defined somewhere in the entire program” isn’t satisfactory to many users. Also, you didn’t tell me what type x has. Can I do x + 5?

              • @[email protected]
                link
                fedilink
                13 months ago
                1. That isn’t what I said at all. Reread?
                2. Find references / go to definition / rename has absolutely nothing to do with types.
                • @FizzyOrange
                  link
                  13 months ago

                  Find references / go to definition / rename has absolutely nothing to do with types.

                  It absolutely does. Without static types an IDE/LSP can’t reliably find all the references / definition and therefore can’t refactor reliably either.

                  Consider something like this:

                  class Foo:
                    bar: int
                  
                  class Baz:
                    bar: str
                  
                  def a(f: Foo) -> int:
                    return f.bar + 1
                  
                  def b(f: Baz) -> str:
                    return f.bar + "1"
                  

                  Now imagine you want to rename Foo.bar or find all references to it. Impossible without the type annotations.

        • @FizzyOrange
          link
          13 months ago
          def get_price(x):
             return x.prize
          

          Ok imagine you are a LSP. What type is x? Is prize a typo? What auto-complete options would you return for x.?

            • @FizzyOrange
              link
              23 months ago

              How are you going to find references to prize, go to its definition or rename it without knowing what type x is? It’s impossible without static types.